当前位置: 首页 > news >正文

【浅水模型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. ↩︎

相关文章:

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

【浅水模型MATLAB】尝试复刻SCI论文中的溃坝流算例 前言问题描述控制方程及数值方法浅水方程及其数值计算方法边界条件的实现 代码框架与关键代码模拟结果 更新于2024年9月17日 前言 这篇博客算是学习浅水方程&#xff0c;并利用MATLAB复刻Liang (2004)1中溃坝流算例的一个记录…...

探索云计算:IT行业的未来趋势

探索云计算&#xff1a;IT行业的未来趋势 在当今快速发展的科技世界&#xff0c;云计算已成为IT行业的核心趋势之一。无论是大企业还是初创公司&#xff0c;越来越多的组织正在转向云计算&#xff0c;以实现更高效的运营和更快的创新。在这篇博文中&#xff0c;我们将探讨云计算…...

[PICO VR眼镜]眼动追踪串流Unity开发与使用方法,眼动追踪打包报错问题解决(Eye Tracking/手势跟踪)

前言 最近在做一个工作需要用到PICO4 Enterprise VR头盔里的眼动追踪功能&#xff0c;但是遇到了如下问题&#xff1a; 在Unity里面没法串流调试眼动追踪功能&#xff0c;根本获取不到Device&#xff0c;只能将整个场景build成APK&#xff0c;安装到头盔里&#xff0c;才能在…...

一周热门|比GPT-4强100倍,OpenAI有望年底发布GPT-Next;1个GPU,1分钟,16K图像

大模型周报将从【企业动态】【技术前瞻】【政策法规】【专家观点】四部分&#xff0c;带你快速跟进大模型行业热门动态。 01 企业动态 Ilya 新公司 SSI 官宣融资 10 亿美元 据路透社报道&#xff0c;由 OpenAI 联合创始人、前首席科学家 Ilya Sutskever 在 2 个多月前共同创…...

软考流水线计算

某计算机系统输入/输出采用双缓冲工作方式&#xff0c;其工作过程如下图所示&#xff0c;假设磁盘块与缓冲区大小相同&#xff0c;每个盘块读入缓冲区的时间T为10μs&#xff0c;由缓冲区送至用户区的时间M为6μs&#xff0c;系统对每个磁盘块数据的处理时间C为2μs。若用户需要…...

1份可以派上用场丢失数据恢复的应用程序列表

无论如何&#xff0c;丢失您的宝贵数据是可怕的。您的 Android 或 iOS 设备可能由于事故、硬件损坏、存储卡问题等而丢失了数据。这就是为什么我们编制了一份可以派上用场以恢复丢失数据的应用程序列表。 如果您四处走动&#xff0c;您大多会随身携带手机或其他移动设备。这些…...

MySQL Workbench 超详细安装教程(一步一图解,保姆级安装)

前言&#xff1a; MySQL Workbench 是一款强大的数据库设计和管理工具&#xff0c;它提供了图形化界面&#xff0c;使得数据库的设计、管理、查询等操作变得更加直观和便捷。本文将详细介绍如何在 Windows 系统上安装 MySQL Workbench。相信读者看这篇文章前一定安装了MySQL数…...

深度学习常见面试题及答案(16~20)

算法学习、4对1辅导、论文辅导或核心期刊以及其他学习资源可以通过公众号滴滴我 文章目录 16. 简述深度学习中的批量归一化&#xff08;Batch Normalization&#xff09;的目的和工作原理。一、批量归一化的目的1. 加速训练收敛&#xff1a;2. 提高模型泛化能力&#xff1a;3. …...

Packet Tracer - IPv4 ACL 的实施挑战(完美解析)

目标 在路由器上配置命名的标准ACL。 在路由器上配置命名的扩展ACL。 在路由器上配置扩展ACL来满足特定的 通信需求。 配置ACL来控制对网络设备终端线路的 访问。 在适当的路由器接口上&#xff0c;在适当的方向上 配置ACL。…...

Langchain-chatchat源码部署及测试实验

一年多前接触到Langchain-chatchat的0.2版本,对0.2版本进行了本地部署和大量更新,但0.2版本对最新的大模型支持不够好,部署框架支持也不好且不太稳定,特别是多模态大模型,因此本次主要介绍0.3版本的源码部署,希望对大家有所帮助。Langchain-chatchat从0.3版本开始,支持更…...

【Linux】线程(第十六篇)

目录 线程 1.线程基本概述&#xff1a; 2.线程类型&#xff1a; 3.线程间的共享资源与非共享资源 4.线程原语 1.线程创建函数 2.获取当前线程id的函数 3.回收线程资源 4.将线程设置为分离态 5.结束线程 6.退出线程 线程 1.线程基本概述&#xff1a; 是操作系统能够…...

2024华为杯研赛E题保姆级教程思路分析

E题题目&#xff1a;高速公路应急车道紧急启用模型 今年的E题设计到图像/视频处理&#xff0c;实际上&#xff0c;E题的难度相对来说较低&#xff0c;大家不用畏惧视频的处理&#xff0c;被这个吓到。实际上&#xff0c;这个不难&#xff0c;解决了视频的处理问题&#xff0c;…...

国内可以使用的ChatGPT服务【9月持续更新】

首先基础知识还是要介绍得~ 一、模型知识&#xff1a; GPT-4o&#xff1a;最新的版本模型&#xff0c;支持视觉等多模态&#xff0c;OpenAI 文档中已经更新了 GPT-4o 的介绍&#xff1a;128k 上下文&#xff0c;训练截止 2023 年 10 月&#xff08;作为对比&#xff0c;GPT-4…...

Linux环境Docker安装Mongodb

Linux环境Docker安装Mongodb 环境要求拉取指定版本镜像创建映射目录&#xff08;相当于数据存放于容器外&#xff0c;容器被删除不会影响数据&#xff09;启动容器 进入mongo命令行为指定db创建新用户查看mongodb的容器id进入命令行查看所有db切换db为指定db创建新用户使用新账…...

PyTorch 池化层详解

在深度学习中&#xff0c;池化层&#xff08;Pooling Layer&#xff09;是卷积神经网络&#xff08;CNN&#xff09;中的关键组成部分。池化层的主要功能是对特征图进行降维和减少计算量&#xff0c;同时增强模型的鲁棒性。本文将详细介绍池化层的作用、种类、实现方法&#xf…...

Intel架构的基本知识

1.字节序 CPU的字节序分为LittleEndian和BigEndian。 所谓Endian,就是多字节数据在内存中的排列方式。 例如,假设有一个整数0x11223344: LittleEndian的排列方式是,从内存的低地址开始,依次存放 0x44 0x33 0x22 0x11; BigEndian的排列方式是,从内存的低地址开始,依…...

Element Plus 中Input输入框

通过鼠标或键盘输入字符 input为受控组件&#xff0c;他总会显示Vue绑定值&#xff0c;正常情况下&#xff0c;input的输入事件会正常被响应&#xff0c;他的处理程序应该更新组件的绑定值&#xff08;或使用v-model&#xff09;。否则&#xff0c;输入框的值将不会改变 不支…...

大模型中常见 loss 函数

loss 函数 首先&#xff0c;Loss 是允许不降到 0 的&#xff0c;模型计算的 loss 最终结果可以接近 0。 可以成为 loss 函数的条件## 常用 loss 以下函数调用基于 Pytorch&#xff0c;头文件导入&#xff1a; import torch.nn as nn 均方差&#xff08;MSE&#xff09; nn.…...

(十六)Ubuntu 20.04 下搭建PX4+MATLAB 仿真环境(HITL)

在文章&#xff08;十五&#xff09;Ubuntu 20.04 下搭建PX4MATLAB 仿真环境我们学习了如何配置仿真环境&#xff0c;在本节&#xff0c;主要进行HITL的仿真环境搭建。 根据&#xff08;十五&#xff09;Ubuntu 20.04 下搭建PX4MATLAB 仿真环境完成配置到如下界面&#xff1a;…...

Matlab simulink建模与仿真 第十七章(补充离散库和补充数学库)

参考视频&#xff1a;simulink1.1simulink简介_哔哩哔哩_bilibili 一、补充离散库和补充数学库中的模块概览 1、补充离散库 注&#xff1a;每个版本的补充离散库不一定相同&#xff0c;也不是每个版本的库都有如上所有模块。 2、补充数学库 二、离散直接传递函数Ⅱ模块 1、…...

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…...

国防科技大学计算机基础课程笔记02信息编码

1.机内码和国标码 国标码就是我们非常熟悉的这个GB2312,但是因为都是16进制&#xff0c;因此这个了16进制的数据既可以翻译成为这个机器码&#xff0c;也可以翻译成为这个国标码&#xff0c;所以这个时候很容易会出现这个歧义的情况&#xff1b; 因此&#xff0c;我们的这个国…...

C++:std::is_convertible

C++标志库中提供is_convertible,可以测试一种类型是否可以转换为另一只类型: template <class From, class To> struct is_convertible; 使用举例: #include <iostream> #include <string>using namespace std;struct A { }; struct B : A { };int main…...

Xshell远程连接Kali(默认 | 私钥)Note版

前言:xshell远程连接&#xff0c;私钥连接和常规默认连接 任务一 开启ssh服务 service ssh status //查看ssh服务状态 service ssh start //开启ssh服务 update-rc.d ssh enable //开启自启动ssh服务 任务二 修改配置文件 vi /etc/ssh/ssh_config //第一…...

在HarmonyOS ArkTS ArkUI-X 5.0及以上版本中,手势开发全攻略:

在 HarmonyOS 应用开发中&#xff0c;手势交互是连接用户与设备的核心纽带。ArkTS 框架提供了丰富的手势处理能力&#xff0c;既支持点击、长按、拖拽等基础单一手势的精细控制&#xff0c;也能通过多种绑定策略解决父子组件的手势竞争问题。本文将结合官方开发文档&#xff0c…...

【Redis技术进阶之路】「原理分析系列开篇」分析客户端和服务端网络诵信交互实现(服务端执行命令请求的过程 - 初始化服务器)

服务端执行命令请求的过程 【专栏简介】【技术大纲】【专栏目标】【目标人群】1. Redis爱好者与社区成员2. 后端开发和系统架构师3. 计算机专业的本科生及研究生 初始化服务器1. 初始化服务器状态结构初始化RedisServer变量 2. 加载相关系统配置和用户配置参数定制化配置参数案…...

《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》

在注意力分散、内容高度同质化的时代&#xff0c;情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现&#xff0c;消费者对内容的“有感”程度&#xff0c;正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中&#xff0…...

新能源汽车智慧充电桩管理方案:新能源充电桩散热问题及消防安全监管方案

随着新能源汽车的快速普及&#xff0c;充电桩作为核心配套设施&#xff0c;其安全性与可靠性备受关注。然而&#xff0c;在高温、高负荷运行环境下&#xff0c;充电桩的散热问题与消防安全隐患日益凸显&#xff0c;成为制约行业发展的关键瓶颈。 如何通过智慧化管理手段优化散…...

【Zephyr 系列 10】实战项目:打造一个蓝牙传感器终端 + 网关系统(完整架构与全栈实现)

🧠关键词:Zephyr、BLE、终端、网关、广播、连接、传感器、数据采集、低功耗、系统集成 📌目标读者:希望基于 Zephyr 构建 BLE 系统架构、实现终端与网关协作、具备产品交付能力的开发者 📊篇幅字数:约 5200 字 ✨ 项目总览 在物联网实际项目中,**“终端 + 网关”**是…...

WEB3全栈开发——面试专业技能点P2智能合约开发(Solidity)

一、Solidity合约开发 下面是 Solidity 合约开发 的概念、代码示例及讲解&#xff0c;适合用作学习或写简历项目背景说明。 &#x1f9e0; 一、概念简介&#xff1a;Solidity 合约开发 Solidity 是一种专门为 以太坊&#xff08;Ethereum&#xff09;平台编写智能合约的高级编…...