【浅水模型MATLAB】尝试复刻SCI论文中的溃坝流算例

【浅水模型MATLAB】尝试复刻SCI论文中的溃坝流算例

  • 前言
  • 问题描述
  • 控制方程及数值方法
    • 浅水方程及其数值计算方法
    • 边界条件的实现
  • 代码框架与关键代码
  • 模拟结果

更新于2024年9月17日

前言

这篇博客算是学习浅水方程,并利用MATLAB复刻Liang (2004)1中溃坝流算例的一个记录。
二维溃坝流(Dam Break)问题是浅水模型经典的一个测试算例,它测试了模型对急变流的模拟效果、以及对干-湿边界处理方法的有效性。相比于之前的模拟算例,本算例中需要重点处理的问题是:

  1. 模型的内边界的处理;
  2. 干-湿边界的处理。

本博客将着重解决第一个问题,而先不考虑第二个问题,即设置的模拟算例不含干-湿边界的处理。此外,本算例中涉及的控制方程与数值方法已经在《【浅水模型MATLAB】尝试完成一个数值模拟竞赛题》中介绍;不清楚的朋友可参考该博客内容。

如果你习惯用别的代码,也想做类似的建模尝试,十分欢迎一起交流!(最近有点想转python代码了,希望感兴趣的同志来一起交流)
如果各位朋友发现了文章或代码中的错误,亦或是改进之处,请不吝赐教,欢迎大家留言,一起改进模型!本博客文章将持续更新,上面也会标注提出改进建议的同志们。(不过,本人最近在忙活毕业论文,可能更新不及时)

同时,想要完整代码的朋友请联系我,我可无偿提供脚本文件。

希望同大家一起进步!

问题描述

本算例的计算区域为一个200m×200m的矩形平底水槽,水槽的四周都是垂直的固体壁面。如下图所示,计算域被分成x<100m和x>100m的左右两个部分;左侧初始水深为10m,右侧初始水深为5m。左右两个区域被两道平行于y方向的壁面阻隔,仅在95m<y<170m的区域联通。在模拟开始时,左侧水体会突然通过x=100m,95m<y<170m的区域向着右侧下泄,形成溃坝流。此外,模型中的所有壁面都是光滑的。
在这里插入图片描述

控制方程及数值方法

浅水方程及其数值计算方法

二维浅水方程的形式及其具体求解内容详见Liang的论文2和博客《【浅水模型MATLAB】尝试完成一个数值模拟竞赛题》。模型采用Godunov型有限体积法,通过一系列的处理,方程也保证了静水状态时压力与底坡源项的平衡。
此外,模型中的水力变量都定义在网格的中心位置。网格边界处的通量采用HLL求解器获得。

边界条件的实现

计算域的外边界均为无通量的free-slip闭合边界,边界处的法向速度和通量均被定义为0。在求解过程中,可将边界处的水力参数设置为其临近网格相同的物理量的值。
对于模型在x=100m处的内边界,模型需要定义其对应边界的通量为零。具体处理方式如下图所示。在对内边界左侧的相邻网格进行线性重构通量计算时,需要通过一个辅助计算的虚网格,该虚网格有着和左侧相邻网格i相同的水力变量值。同理,在对内边界右侧的相邻网格进行线性重构通量计算时,也需要通过一个辅助计算的虚网格,该虚网格有着和右侧 相邻网格i相同的水力变量值。由于本模型采用了Minmod的限制器,所以此种处理会使得内边界对应的左侧变量UL =Ui,而使右侧变量UR =Ui+1
在这里插入图片描述

代码框架与关键代码

我的模型代码主要分为参数设置、网格构建、初始化、主循环和其余函数等五个部分。

  1. 设置物理参数、网格参数、时间参数等。代码如下所示:
grav = 9.81;            % Gravitational acceleration
rho = 1000;             % Density
CFL = 0.5;              % Courant NumberLx = 200;             	% Length of the domain
Ly = 200;              	% Width of the domain
zb0 = 0.0;              % Bottom elevation
n = 0.00;               % Manning coefficient
h_dry = 0.02;           % wet-dry threshold valuedx = 1;                 % Grid spacing
dy = 1;                 % Grid spacing
dt = 0.05;               % Time spacing at the first step
dtmax = 0.1;            % allowed max time step (s)
tend = 10.0;            % End of the simulation time
plot_int = 0.5;      	% Time interval to next plot

我设置网格为边长1m的正方形,底高程为zb0=0.0。最大允许的Courant数设置为0.5,初始时间步为0.05s,之后的每一个时间步通过CFL条件计算得到。

  1. 网格构建:网格有两个要素需要定义,一是网格的四个节点(Xp和Yp),二是网格的中心点(Xc和Yc);网格中心点也即水力物理量定义的位置。代码略。
  2. 初始化:设置底高程zb=0,计算zb的梯度zbx和zby;设置左右区域的初始水位,之后再设置流速u、v为零。
  3. 主循环:(1)计算网格边界处的水位、水深、流速值;(2)设置内边界条件;(3)计算通量项FL、FR、GL和GR;(4)利用HLL求解通量F和G;(5)计算源项S;(6)计算新一个时间步的eta、h、u和v。除了上述步骤(2)和(3)其余计算过程与博客《【浅水模型MATLAB】尝试完成一个数值模拟竞赛题》中代码基本一致;涉及的关键代码如下:
while(t<tend)% estimate the dtdtx = dx./(abs(u)+sqrt(grav*h) + 1E-8);dty = dy./(abs(v)+sqrt(grav*h) + 1E-8);dt1 = min(min(dtx,[],"all"), min(dty,[],"all"));dt = min(dtmax, CFL*dt1);clear dt1 dtx dtyetan = eta;     hn = h;un = u;         vn = v;% 2rd-order Runge-Kutta Methodfor k = 1:2% 1. reconstruct the flow data% 1.1 x-direction reconstruction (Natural closed boundary)% 求解网格边界处的水位exL和exR,流速uxL、uxR、vxL和vxR;% ...% 1.2 y-direction reconstruction (Natural closed boundary)% 求解网格边界处的水位eyL和eyR,流速uyL、uyR、vyL和vyR;% ...% 2. inner boundary conditionsff = find((yc<=95) + (yc>=170));% 2.1 left cellsde = minmod((eta(:,Nx/2)-eta(:,Nx/2))/dx, ...(eta(:,Nx/2)-eta(:,Nx/2-1))/dx);du = minmod((u(:,Nx/2)-u(:,Nx/2))/dx, ...(u(:,Nx/2)-u(:,Nx/2-1))/dx);dv = minmod((v(:,Nx/2)-v(:,Nx/2))/dx, ...(v(:,Nx/2)-v(:,Nx/2-1))/dx);exR(ff,Nx/2) = eta(ff,Nx/2) - 0.5*dx*de(ff);exL(ff,Nx/2+1) = eta(ff,Nx/2) + 0.5*dx*de(ff);clear de du dv% 2.2 right cellsde = minmod((eta(:,Nx/2+2)-eta(:,Nx/2+1))/dx, ...(eta(:,Nx/2+1)-eta(:,Nx/2+1))/dx);du = minmod((u(:,Nx/2+2)-u(:,Nx/2+1))/dx, ...(u(:,Nx/2+1)-u(:,Nx/2+1))/dx);dv = minmod((v(:,Nx/2+2)-v(:,Nx/2+1))/dx, ...(v(:,Nx/2+1)-v(:,Nx/2+1))/dx);exR(ff,Nx/2+1) = eta(ff,Nx/2+1) - 0.5*dx*de(ff);exL(ff,Nx/2+2) = eta(ff,Nx/2+1) + 0.5*dx*de(ff);clear ff de du dv% 3. flux terms (F and G)F1L = hxL.*uxL;F2L = hxL.*uxL.*uxL + 0.5*grav*(exL.*exL - ...exL.*(zbp(1:end-1,:)+zbp(2:end,:)));F3L = hxL.*uxL.*vxL;F1R = hxR.*uxR;F2R = hxR.*uxR.*uxR + 0.5*grav*(exR.*exR - ...exR.*(zbp(1:end-1,:)+zbp(2:end,:)));F3R = hxR.*uxR.*vxR;G1L = hyL.*vyL;G2L = hyL.*uyL.*vyL;G3L = hyL.*vyL.*vyL + 0.5*grav*(eyL.*eyL - ...eyL.*(zbp(:,1:end-1)+zbp(:,2:end)));G1R = hyR.*vyR;G2R = hyR.*uyR.*vyR;G3R = hyR.*vyR.*vyR + 0.5*grav*(eyR.*eyR - ...eyR.*(zbp(:,1:end-1)+zbp(:,2:end)));% 4. calculate the flux by HLL[sxL sxR] = WaveSpeed(hxL, hxR, uxL, uxR);F1 = HLLSolver(F1L, F1R, sxL,sxR, exL,exR);F2 = HLLSolver(F2L, F2R, sxL,sxR, hxL.*uxL,hxR.*uxR);F3 = HLLSolver(F3L, F3R, sxL,sxR, hxL.*vxL,hxR.*vxR);[syL syR] = WaveSpeed(hyL, hyR, vyL, vyR);G1 = HLLSolver(G1L, G1R, syL,syR, eyL,eyR);G2 = HLLSolver(G2L, G2R, syL,syR, hyL.*uyL,hyR.*uyR);G3 = HLLSolver(G3L, G3R, syL,syR, hyL.*vyL,hyR.*vyR);clear sxL sxR syL syR F1L F1R F2L F2R F3L F3R G1L G1R G2L G2R G3L G3R% 4.1. west boundary% ...% 4.2. east boundary% ...% 4.3. south boundary% ...% 4.4. north boundary% ...% 4.5. inner boundaryff = find((yc<=95) + (yc>=170));F1(ff,Nx/2+1) = 0;  F3(ff,Nx/2+1) = 0;F2_L(ff,1) = 0.5*grav*(exL(ff,Nx/2+1).^2 - ...exL(ff,Nx/2+1).*(zbp(ff+1,Nx/2+1)+zbp(ff,Nx/2+1)));F2_R(ff,1) = 0.5*grav*(exR(ff,Nx/2+1).^2 - ...exR(ff,Nx/2+1).*(zbp(ff+1,Nx/2+1)+zbp(ff,Nx/2+1)));clear ff exL exR eyL eyR hxL hxR hyL hyR uxL uxR uyL uyR vxL vxR vyL vyR% 5. source terms% 计算S的三个分量S1、S2和S3% ...% 6. time stepping% 6.1 solve eta% ...% 6.2 solve h*u% ...%     for inner boundaryff = find((yc<=95) + (yc>=170));hu(ff,Nx/2) = h(ff,Nx/2).*u(ff,Nx/2)  ...- dt/dx*(F2_L(ff) - F2(ff,Nx/2)) ...- dt/dy*(G2(ff+1,Nx/2)-G2(ff,Nx/2)) + dt*S2(ff,Nx/2);hu(ff,Nx/2+1) = h(ff,Nx/2+1).*u(ff,Nx/2+1)  ...- dt/dx*(F2(ff,Nx/2+2) - F2_R(ff)) ...- dt/dy*(G2(ff+1,Nx/2+1)-G2(ff,Nx/2+1)) + dt*S2(ff,Nx/2+1);clear ff F2_L F2_R% 6.3 solve h*v% ...% ...end% 计算得到本时间步的h、u和v% 7. plot% ...end
end
  1. 其余子函数:包括minmod限制器、HLL求解器等。代码略。

模拟结果

1.水位结果
在这里插入图片描述
2.流速结果(颜色表示合速度的大小,箭头表示速度方向)
在这里插入图片描述
3. 三维水面图
在这里插入图片描述


  1. Liang, Q., Borthwick, A.G.L. and Stelling, G. (2004), Simulation of dam- and dyke-break hydrodynamics on dynamically adaptive quadtree grids. Int. J. Numer. Meth. Fluids, 46: 127-162. ↩︎

  2. Liang Q , Marche F .Numerical resolution of well-balanced shallow water equations with complex source terms[J].Advances in Water Resources, 2009, 32(6):873-884. ↩︎

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1537489.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

特殊文本文件日志技术重点笔记。

特殊文本文件&#xff0c;日志技术(黑马 一套入门 3h) 特殊文件 日志技术 把程序运行的信息&#xff0c;记录到文件中&#xff0c;方便程序员定位bug&#xff0c;并了解程序的执行情况等。 1.为什么要用这些特殊文件 1.1存储单个用户的: 用户名,密码 1.2存储多个用户的&…

数据清洗-缺失值填充-XGboost算法填充

目录 一、安装所需的python包二、采用XGboost算法进行缺失值填充2.1可直接运行代码2.2以某个缺失值数据进行实战2.2.1 代码运行过程截屏&#xff1a;2.2.2 填充后的数据截屏&#xff1a; 三、XGBoost算法原理介绍3.1 XGBoost 的定义3.2 XGBoost 的核心思想3.3 XGBoost 的特点3.…

2024 批量下载知乎回答/文章/想法/专栏/视频/收藏夹,导出 excel 和 pdf

之前分享过文章 2024批量下载知乎回答文章想法专栏收藏夹&#xff0c;公众号文章内容图片封面视频音频&#xff0c;微博内容图片视频评论转发数据&#xff0c;导出excel和pdf &#xff0c;今天再整理分享下知乎知乎回答/文章/想法/专栏/视频/收藏夹下载。 苏生不惑 这个账号已…

Jenkins基于tag的构建

文章目录 Jenkins参数化构建设置设置gitlab tag在工程中维护构建的版本按指定tag的版本启动服务 Jenkins参数化构建设置 选择参数化构建&#xff1a; 在gradle构建之前&#xff0c;增加执行shell的步骤&#xff1a; 把新增的shell框挪到gradle构建之前&#xff0c; 最后保存 …

驱动器磁盘未格式化难题:深度剖析与恢复实践

驱动器磁盘未格式化的深层探索 在数据存储与管理的日常中&#xff0c;驱动器作为我们数字生活的基石&#xff0c;其稳定性直接关系到数据的安全与可用性。然而&#xff0c;当屏幕上赫然出现“驱动器中的磁盘未被格式化”的提示时&#xff0c;许多用户往往感到手足无措&#xf…

Linux 文件与目录操作命令详解

文章目录 前言创建文件1. touch2. vim 文件内容显示3. cat4. more5. less6. head7. tail 文件&#xff08;目录&#xff09;复制、删除和移动8. cp9. rm10. mv 压缩文件与解压缩11. gzip12. zip 和 unzip 创建目录13. mkdir 删除目录14. rmdir 改变工作目录15. cd16. pwd 显示目…

【C语言】联合体枚举的讲解

目录 ✨声明&#xff01;&#xff01;&#xff01;&#xff1a; 联合体与结构体只有一个区别&#xff0c;那就是内存存储方式不同 &#x1f495;1.联合体的声明 &#x1f495;2.联合体内存的存储 &#x1f495;3.联合体字节大小的计算 例题2&#xff1a; ✨4.枚举的声明…

全面掌握 Jest:从零开始的测试指南(下篇)

在上一篇测试指南中&#xff0c;我们介绍了Jest 的背景、如何初始化项目、常用的匹配器语法以及钩子函数的使用。这一篇篇将继续深入探讨 Jest 的高级特性&#xff0c;包括 Mock 函数、异步请求的处理、Mock 请求的模拟、类的模拟以及定时器的模拟、snapshot 的使用。通过这些技…

list从0到1的突破

目录 前言 1.list的介绍 2.list的常见接口 2.1 构造函数&#xff08; (constructor)&#xff09; 接口说明 2.2 list iterator 的使用 2.3 list capacity 2.4 list element access 2.5 list modifiers 3.list的迭代器失效 附整套练习源码 结束语 前言 前面我们学习…

一款源码阅读的插件

文章目录 进度汇报功能预览添加高亮标记高亮风格设置笔记颜色设置数据概览高亮数据详情 结尾 进度汇报 之前提到最近有在开发一个源码阅读的IDEA插件&#xff0c;第一版已经开发完上传插件市场了&#xff0c;等官方审批通过就可以尝鲜了。插件名称&#xff1a;Mark source cod…

防火墙——NAT

目录 NAT NAT分类 旧分类 新分类 NAT配置 源NAT​编辑 配置源NAT地址池​编辑 关于源NAT环路问题 环境如下​编辑 防火墙nat​编辑​编辑 路由器要配置指向11.0.0.0 网段的静态路由​编辑 测试​编辑 如果此时有外网用户直接pingNAT地址&#xff0c;则环路出现。​…

PAT甲级-1016 Phone Bills

题目 题目大意 顾客打长途电话计费&#xff0c;输出每月的账单。输入一行给出一天24小时的计费钱数&#xff0c;注意单位是美分&#xff0c;还要乘以0.01。接下来给出n条记录&#xff0c;每条记录都包括客户名&#xff0c;时间&#xff0c;状态。“on-line”是开始打电话的时间…

专题四_位运算( >> , << , , | , ^ )_算法详细总结

目录 位运算 常见位运算总结 1.基础位运算 2.给一个数 n ,确定它的二进制表示中的第 x 位是 0 还是 1 3.运算符的优先级 4.将一个数 n 的二进制表示的第 x 位修改成 1 5.将一个数n的二进制表示的第x位修改成0 6.位图的思想 7.提取一个数&#xff08;n&#xff09;二进…

如何优雅地处理返回值

我们已经知道了如何优雅的校验传入的参数了&#xff0c;那么后端服务器如何实现把数据返回给前端呢&#xff1f; 返回格式 后端返回给前端我们一般用 JSON 体方式&#xff0c;定义如下&#xff1a; {#返回状态码code:string, #返回信息描述message:string,#返回值data…

算法设计与分析(线性时间选择算法

目录 线性时间选择算法&#xff08;QuickSelect&#xff09;实现注意事项有可能出现的特殊情况&#xff1a;小结&#xff1a; 线性时间选择算法&#xff08;QuickSelect&#xff09;实现 线性时间选择算法 是快速排序算法的一个变种&#xff0c;用于在未完全排序的数组中找到第…

Next-ViT: 下一代视觉Transformer,用于现实工业场景中的高效部署

摘要 由于复杂的注意力机制和模型设计&#xff0c;大多数现有的视觉Transformer&#xff08;ViTs&#xff09;在实际的工业部署场景中&#xff0c;如TensorRT和CoreML&#xff0c;无法像卷积神经网络&#xff08;CNNs&#xff09;那样高效运行。这提出了一个明显的挑战&#x…

[Redis] Redis中的set和zset类型

&#x1f338;个人主页:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 &#x1f3f5;️热门专栏: &#x1f9ca; Java基本语法(97平均质量分)https://blog.csdn.net/2301_80050796/category_12615970.html?spm1001.2014.3001.5482 &#x1f355; Collection与…

微信,手机文件管理,通过自己软件打开——手机平板电脑编程———未来之窗行业应用跨平台架构

一、手机平板IT人员编程编辑器 专为 IT 和运维人员设计的手机和平板编程编辑器&#xff0c;具有便携灵活、即时响应、适应多场景、触控便捷、资源丰富、成本较低、激发创意和数据同步方便等优点。 二、手机平板现状 目前手机和平板的现状是缺乏专门针对 IT 人员的编辑工具&a…

避免服务器安装多个mysql引起冲突的安装方法

最近工作中涉及到了数据迁移的工作. 需要升级mysql版本到8.4.2为了避免升级后服务出现异常, 因此需要保留原来的mysql,所以会出现一台服务器上运行两个mysql的情况 mysql并不陌生, 但是安装不当很容易引起服务配置文件的冲突,导致服务不可用, 今天就来介绍一种可以完美避免冲突…

COMDEL电源CX2500S RF13.56MHZ RF GENERATOR手侧

COMDEL电源CX2500S RF13.56MHZ RF GENERATOR手侧