【CFD小工坊】浅水方程的离散及求解方法

news2024/11/27 3:47:16

【CFD小工坊】浅水方程的离散及求解方法

  • 前言
  • 基于有限体积法的方程离散
  • 界面通量与源项计算
  • 干-湿网格的处理
  • 数值离散的稳定性条件
  • 参考文献

前言

我们模型的控制方程,即浅水方程组的表达式如下:
∂ U ∂ t + ∂ E ( U ) ∂ x + ∂ G ( U ) ∂ y = S ( U ) U = ( h h u h v ) , E ( U ) = ( h u h u 2 + g h 2 2 h u v ) , G ( U ) = ( h v h u v h v 2 + g h 2 2 ) , S ( U ) = ( 0 g h ( S 0 x − S f x ) g h ( S 0 y − S f y ) ) S 0 x = − ∂ z b ∂ x , S 0 y = − ∂ z b ∂ y S f x = n 2 u u 2 + v 2 h − 4 / 3 , S f y = n 2 v u 2 + v 2 h − 4 / 3 \dfrac{\partial \bold{U}}{\partial t} + \dfrac{\partial \bold{E(U)}}{\partial x} + \dfrac{\partial \bold{G(U)}}{\partial y} = \bold{S(U)} \\[6pt] \bold{U} = \left( \begin{matrix} h \\ hu \\ hv \end{matrix} \right), \bold{E(U)} = \left( \begin{matrix} hu \\ hu^2+\dfrac{gh^2}{2} \\ huv \end{matrix} \right), \bold{G(U)} = \left( \begin{matrix} hv \\ huv \\ hv^2+\dfrac{gh^2}{2} \end{matrix} \right), \\[6pt] \bold{S(U)} = \left( \begin{matrix} 0 \\ gh(S_{0x} - S_{fx}) \\ gh(S_{0y} - S_{fy}) \end{matrix} \right) \\[6pt] S_{0x} = -\dfrac{\partial z_b}{\partial x}, S_{0y} = -\dfrac{\partial z_b}{\partial y} \\[6pt] S_{fx} = n^2 u \sqrt{u^2+v^2} h^{-4/3}, S_{fy} = n^2 v \sqrt{u^2+v^2} h^{-4/3} tU+xE(U)+yG(U)=S(U)U= hhuhv ,E(U)= huhu2+2gh2huv ,G(U)= hvhuvhv2+2gh2 ,S(U)= 0gh(S0xSfx)gh(S0ySfy) S0x=xzb,S0y=yzbSfx=n2uu2+v2 h4/3,Sfy=n2vu2+v2 h4/3
对此,我们首先将式中物理量离散于三角形网格中,后采用有限体积法将浅水方程改写成其离散形式。在离散的浅水方程中,水位、流速等物理量的计算可转化为对网格界面的通量项和网格内源项的计算。对于离散方程中的通量项,本模型将会采用基于Riemann近似解的Roe格式数值求解界面通量。

基于有限体积法的方程离散

对于我们的浅水模型,水深、流速等物理量被定义在网格中心,如下图所示。对于网格i与j,它们间的质量、动量传输是通过其网格边界Ei,j发生的(下图中加粗的网格边)。网格i和j之间边界的外法相量定义为n=(nx, ny)。
在这里插入图片描述
之后,对于控制体网格i,我们采用高斯散度定理将浅水方程沿着边界Ei,j线积分,得到:
∬ Ω ∂ U ∂ t d Ω = − ∫ S [ E ( U ) n x + G ( U ) n y ] d s + ∬ Ω S ( U ) d Ω \iint_{\Omega} \dfrac{\partial \bold{U}}{\partial t} d\Omega = -\int_{S} [\bold{E(U)}n_x + \bold{G(U)}n_y] ds + \iint_{\Omega} \bold{S(U)} d\Omega ΩtUdΩ=S[E(U)nx+G(U)ny]ds+ΩS(U)dΩ
式中,Ω表示网格i所对应的控制体,S表示边界Ei,j;dΩ和ds分别表示面积分和线积分的微元。

在我们的模型中,各个水力要素在网格体内被假定是均匀分布的。在对上式的时间导数项采用前差格式离散,得到数值解为:
U i n + 1 = U i n − Δ t Ω i ∑ j = 1 3 F n j L j + Δ t S ˉ F n = E ( U ) n x + G ( U ) n y \bold{U}_{i}^{n+1} = \bold{U}_{i}^{n} - \dfrac{\Delta t}{\Omega_i} \sum_{j=1}^{3} \bold{F}_{nj}L_j + \Delta t \bar{S} \\[6pt] \bold{F_n} = \bold{E(U)}n_x + \bold{G(U)}n_y Uin+1=UinΩiΔtj=13FnjLj+ΔtSˉFn=E(U)nx+G(U)ny
其中,Δt为时间步长,Ωi表示网格单元i的面积,Fnj表示网格i中第j条边的外通量,Lj表示网格i中第j条边的长度;S表示源项, S ˉ \bar{S} Sˉ表示源项S在网格i的体积分值。

注意,上式就是模型求解过程中最核心的表达式。它完成了从该时间步水力变量到下一步水力变量的更新计算。

界面通量与源项计算

接下来要解决的问题是通量项 F n \bold{F_n} Fn的计算。首先,我们将网格边通量计算转化为一个Riemann近似解问题。采用Roe格式来求解这个近似黎曼解:
F n = 1 2 ( E ( U ~ L ) + G ( U ~ R ) ) − ∑ k = 1 3 α ~ k ∣ λ k ∣ γ k ) \bold{F_n} = \dfrac{1}{2} (\bold{E(\tilde{U}_L)} + \bold{G(\tilde{U}_R))} - \sum_{k=1}^{3} \tilde{\alpha}^k |\lambda^k| \gamma^k) Fn=21(E(U~L)+G(U~R))k=13α~kλkγk)
式中, λ k \lambda^k λk为基于 Roe 平均的雅克比矩阵 J J J的特征值, γ k \gamma^k γk为特征值对应的特征向量; α k \alpha^k αk表示特征强度。各项表达如下:
{ λ 1 = u ~ − c ~ λ 2 = u ~ λ 3 = u ~ + c ~ , { γ 1 = ( 1 , u − c ~ , v ~ ) T γ 2 = ( 0 , 0 , 1 ) T γ 3 = ( 1 , u + c ~ , v ~ ) T , { α ~ 1 = 1 2 [ h R − h L − h ~ c ~ ( u R − u L ) ] α ~ 2 = h ~ ( v R − v L ) α ~ 3 = 1 2 [ h R − h L + h ~ c ~ ( u R − u L ) ] \left\{ \begin{aligned} \lambda^1 & = \tilde u-\tilde{c} \\ \lambda^2 & = \tilde u \\ \lambda^3 & = \tilde u+\tilde{c} \end{aligned} \right. , \left\{ \begin{aligned} \gamma^1 & = (1, u-\tilde{c}, \tilde{v})^T \\ \gamma^2 & = (0,0,1)^T \\ \gamma^3 & = (1, u+\tilde{c}, \tilde{v})^T \end{aligned} \right. , \left\{ \begin{aligned} \tilde \alpha^1 & = \dfrac{1}{2}[h_R - h_L - \dfrac{\tilde h}{\tilde{c}}(u_R- u_L)] \\ \tilde \alpha^2 & = \tilde h (v_R - v_L) \\ \tilde \alpha^3 & = \dfrac{1}{2}[h_R - h_L + \dfrac{\tilde h}{\tilde{c}}(u_R- u_L)] \end{aligned} \right. λ1λ2λ3=u~c~=u~=u~+c~, γ1γ2γ3=(1,uc~,v~)T=(0,0,1)T=(1,u+c~,v~)T, α~1α~2α~3=21[hRhLc~h~(uRuL)]=h~(vRvL)=21[hRhL+c~h~(uRuL)]
上述变量中下标L和R分别表示该变量是边界内、外侧网格上的值(如上图所示); u ~ \tilde u u~ v ~ \tilde v v~ c ~ \tilde{c} c~ h ~ \tilde h h~都是Roe平均变量,定义如下:
u ~ = u L h L + u R h R h L + h R , v ~ = v L h L + v R h R h L + h R , c ~ = g ( h L + h R ) 2 , h = h L h R \tilde{u} = \dfrac{u_L \sqrt{h_L} + u_R \sqrt{h_R}}{\sqrt{h_L} + \sqrt{h_R}}, \tilde{v} = \dfrac{v_L \sqrt{h_L} + v_R \sqrt{h_R}}{\sqrt{h_L} + \sqrt{h_R}}, \\[6pt] \tilde c = \sqrt{\dfrac{g(h_L + h_R)}{2}}, h=\sqrt{h_L h_R} u~=hL +hR uLhL +uRhR ,v~=hL +hR vLhL +vRhR ,c~=2g(hL+hR) ,h=hLhR
注意,此处下标含L和R的速度 u ~ \tilde u u~均是垂直于网格边(与外法向n同向)的速度分量,且波速c的方向也与外法向n同向。同理,下标含L和R的 v ~ \tilde v v~则是与法相量n相垂直。

此外,对源项S中的底坡和摩阻项的处理将直接关系到模型的计算精度和稳定性。为了获得和谐、守恒的结果,对底坡源项进行特征分解和迎风处理以适应Riemann求解格式。首先,对底坡源项在控制体Ω内积分得到 S ˉ 0 \bar{S}_0 Sˉ0
S ˉ 0 = ∑ j = 0 3 ∑ k = 0 3 [ 1 2 ( 1 − s i g n ( λ k ˉ ) ) ( β k r k ˉ ) L j ] j ( β 1 , β 2 , β 3 ) = ( − 1 2 c ~ Δ z b , 0 , 1 2 c ~ Δ z b ) , Δ z b = ( z b ) L − ( z b ) R r 1 ˉ = ( 1 u ~ + c ~ v ~ ) , r 2 ˉ = ( 0 0 c ~ ) , r 3 ˉ = ( 1 u ~ − c ~ v ~ ) , \bar{S}_0 = \sum_{j=0}^{3} \sum_{k=0}^{3} [\dfrac{1}{2} (1-sign(\bar{\lambda^k})) ({\beta^k} \bar{r^k}) L_{j}]^j \\[6pt] (\beta^1,\beta^2,\beta^3)= (-\dfrac{1}{2}\tilde{c}\Delta{z_b}, 0 , \dfrac{1}{2}\tilde{c}\Delta{z_b}), \Delta{z_b} = (z_b)_L - (z_b)_R \\[6pt] \bar{r^1}= \left( \begin{matrix} 1 \\ \tilde{u} + \tilde{c} \\ \tilde{v} \end{matrix} \right), \bar{r^2}= \left( \begin{matrix} 0 \\ 0 \\ \tilde{c} \end{matrix} \right), \bar{r^3}= \left( \begin{matrix} 1 \\ \tilde{u} - \tilde{c} \\ \tilde{v} \end{matrix} \right), Sˉ0=j=03k=03[21(1sign(λkˉ))(βkrkˉ)Lj]j(β1,β2,β3)=(21c~Δzb,0,21c~Δzb),Δzb=(zb)L(zb)Rr1ˉ= 1u~+c~v~ ,r2ˉ= 00c~ ,r3ˉ= 1u~c~v~ ,
式中,sign( )为符号函数。

为增加格式的稳定性,对摩阻源项进行半隐式离散,其表达式为:
S f = ( 1 − θ ) S f n + θ S f n + 1 = S f n + θ ∂ S f ∂ U ∂ U ∂ t Δ t \bold{S}_f = (1-\theta) \bold{S}_f^{n} + \theta \bold{S}_f^{n+1} = \bold{S}_f^{n} + \theta \dfrac{\partial \bold{S}_f}{\partial \bold{U}} \dfrac{\partial \bold{U}}{\partial t} \Delta t Sf=(1θ)Sfn+θSfn+1=Sfn+θUSftUΔt
θ=0时意味着完全显式,θ=1时意味着完全隐式;令 Q f = ∂ S f ∂ U \bold{Q}_f = \dfrac{\partial \bold{S}_f}{\partial \bold{U}} Qf=USf,离散后的动量方程通量表达式为:
Δ U = U n + 1 − U n = [ I − Δ t θ Q f n ] − 1 [ Δ t Ω i ∑ j = 1 3 ( F n j + ∑ k = 0 3 [ 1 2 ( 1 − s i g n ( λ k ˉ ) ) ( β k r k ˉ ) ) L j + Δ t S f ] \Delta \bold{U} = \bold{U}^{n+1} - \bold{U}^{n} = [\bold{I}- \Delta t \theta \bold{Q}_f ^{n}]^{-1} [\dfrac{\Delta t}{\Omega_i} \sum_{j=1}^{3} (\bold{F}_{nj} +\sum_{k=0}^{3} [\dfrac{1}{2} (1-sign(\bar{\lambda^k})) ({\beta^k} \bar{r^k}) )L_j + \Delta t \bold{S}_f] ΔU=Un+1Un=[IΔQfn]1[ΩiΔtj=13(Fnj+k=03[21(1sign(λkˉ))(βkrkˉ))Lj+ΔtSf]

干-湿网格的处理

对于复杂的地形,计算区域内的实际模拟范围和计算边界变化频繁。网格上可能出现淹没-干底-再淹没的过程,这对模型的计算提出较高的稳定性要求。为避免水深较小时网格=出现流速过大的非物理现象,本模型采用限制水深法来准确、稳定地模拟网格淹没、干底这一过程。
首先,设置两个临界水深 h d r y h_{dry} hdry h w e t h_{wet} hwet(且 h d r y < h w e t h_{dry}<h_{wet} hdry<hwet),再将网格分为三类:

  1. 当水深大于 h w e t h_{wet} hwet,该网格为“湿网格”,参与正常的模拟计算,同时求解质量和动量通量;
  2. 当水深小于 h d r y h_{dry} hdry,该网格为“干网格”,不参与当前时间步的计算;
  3. 当水深在 h d r y h_{dry} hdry h w e t h_{wet} hwet之间,该网格为“半干网格”,仅计算该时间步的质量通量,而没有计算动量通量。

数值离散的稳定性条件

本模型基于Riemann显式方法,即当前时刻的网格变量可直接由上一时刻的计算结果得到,无需经过迭代计算。但显式求解法受到CFL条件的限制,实际计算过程中的最大时间步长通常不为定值。
本模型将采用动态时间步长方法得到模拟的时间步长;同时需要用户输入一个可允许的最大步长 Δ t m a x \Delta t_{max} Δtmax,以及一个允许的最大Courant数 C m a x C_{max} Cmax( 0 < C < 1.0 0< C <1.0 0<C<1.0)。模型的时间步长按下式确定:
Δ t = m i n ( Δ t m a x , C m a x m i n ( R i u i 2 + v i 2 + g h i ) ) , i = 1 , 2 , 3 , . . . , N c \Delta t = min(\Delta t_{max}, C_{max} min(\dfrac{R_i}{\sqrt{u^2_i + v^2_i} + \sqrt{gh_i}})), i=1,2,3,...,N_c Δt=min(Δtmax,Cmaxmin(ui2+vi2 +ghi Ri)),i=1,2,3,...,Nc

参考文献

  1. 刘臻,史宏达,黄燕.一种基于Roe格式的有限体积法在二维溃坝问题中的应用[J].中国海洋大学学报:自然科学版, 2007, 37(2):5.
  2. [王志力,耿艳芬,金生.具有复杂计算域和地形的二维浅水流动数值模拟[J].水利学报, 2005, 36(4):6.

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

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

相关文章

十五、异常(4)

本章概要 Java 标志异常 特例&#xff1a;RuntimeException 使用 finally 进行清理 finally 用来做什么&#xff1f;在 return 中使用 finally缺憾&#xff1a;异常丢失 Java 标准异常 Throwable 这个 Java 类被用来表示任何可以作为异常被抛出的类。Throwable 对象可分为两…

JUC——并发编程—第二部分

集合类不安全 list不安全 //报错 java.util.ConcurrentModificationException public class ListTest {public static void main(String[] args) {List<String> list new CopyOnWriteArrayList<>();//并发下Arrayist边读边写会不安全的/*** 解决方案&#xff1a…

国庆作业 9月30 消息队列实现进程间通信

01_write.c&#xff1a; #include <myhead.h> #define MAX 1024//x消息结构体 typedef struct {long msgtype; //消息类型char msg[MAX]; //消息正文 }Msg;#define SIZE sizeof(Msg)-sizeof(long) //正文大小int main(int argc, const char *argv[]) {//1:创建一个key…

机器学习之单层神经网络的训练:增量规则(Delta Rule)

文章目录 权重的调整单层神经网络使用delta规则的训练过程 神经网络以权值的形式存储信息,根据给定的信息来修改权值的系统方法称为学习规则。由于训练是神经网络系统地存储信息的唯一途径&#xff0c;因此学习规则是神经网络研究中的一个重要组成部分 权重的调整 &#xff08…

企业级磁盘阵列存储系统由硬到软全析

企业级磁盘阵列是由一组设备构成的存储系统,主要包括两种类型的设备,分别是控制器和扩展柜,其中控制器只有一台,扩展柜可以没有,也可以有多台。在EMC的Unity中分别称为DPE(Disk Processor Enclosure)和DAE(Disk Array Enclosure),在华为的OceanStor里面称为控制框和硬…

【网络模型】OSI七层网络模型、TCP/IP网络模型、键入网址到页面显示的过程、DNS是什么等重点知识汇总

目录 OSI 的七层模型 TCP/IP 网络模型 键入网址到网页显示发生了什么 你知道DNS是什么&#xff1f; OSI 的七层模型 简要概括 应用层&#xff1a;为用户的应用进程提供网络通信服务表示层&#xff1a;处理用户信息的表示问题&#xff0c;数据的编码&#xff0c;压缩和解压…

在枚举类中“优雅地”使用枚举处理器

使用枚举类的一大好处就是&#xff0c;代码易懂&#xff0c;方便自己或他人维护。如&#xff0c;枚举状态、异常等。 下面有两个类&#xff08;枚举类和实体类&#xff09;&#xff1a; package com.zhang.enums;import lombok.Getter;/*** Author lgz* Description* Date 202…

【生物信息学】基因差异分析Deg(数据读取、数据处理、差异分析、结果可视化)

目录 一、实验介绍 二、实验环境 1. 配置虚拟环境 2. 库版本介绍 3. IDE 三、实验内容 0. 导入必要的工具包 1. 定义一些阈值和参数 2. 读取数据 normal_data.csv部分展示 tumor_data.csv部分展示 3. 绘制箱型图 4. 删除表达量低于阈值的基因 5. 计算差异显著的基…

Git多账号管理通过ssh 公钥的方式,git,gitlab,gitee

按照目前国内访问git&#xff0c;如果不科学上网&#xff0c;我们很大可能访问会超时。基于这个&#xff0c;所以我现在的git 配置已经增加到了3个了 一个公司gitlab&#xff0c;一个git&#xff0c;一个gitee. 以下基于这个环境&#xff0c;我们来说明下如何创建配置ssh公钥。…

VBA技术资料MF63:遍历形状并改变颜色

【分享成果&#xff0c;随喜正能量】人生&#xff0c;一站有一站的风景&#xff0c;一岁有一岁的味道&#xff0c;你的年龄应该成为你生命的勋章而不是你伤感的理由。生活嘛&#xff0c;慢慢来&#xff0c;你又不差&#xff01;。 我给VBA的定义&#xff1a;VBA是个人小型自动…

【数据结构与算法】栈与队列相关算法的实现

目录 检查括号是否成对出现 反转字符串 循环队列的实现 使用队列实现栈 使用栈实现队列 检查括号是否成对出现 算法要求 给定一个只包括 (&#xff0c;)&#xff0c;{&#xff0c;}&#xff0c;[&#xff0c;] 的字符串&#xff0c;判断该字符串是否有效。 有效字符串需满…

树莓派基本配置(2)

安装motion $sudo apt-get update $sudo apt-get install motion配置motion sudo nano /etc/default/motionsudo nano /etc/motion/motion.conf主要改这些参数 //让Motion作为守护进程运行 daemon on ... //用这个端口号来读取数据 stream_port 8081 ... //网络上其它主机…

2023年上海市安全员B证证模拟考试题库及上海市安全员B证理论考试试题

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2023年上海市安全员B证证模拟考试题库及上海市安全员B证理论考试试题是由安全生产模拟考试一点通提供&#xff0c;上海市安全员B证证模拟考试题库是根据上海市安全员B证最新版教材&#xff0c;上海市安全员B证大纲整理…

正点原子嵌入式linux驱动开发——TF-A使用

上一篇笔记STM32MP157芯片的开发环境&#xff0c;之后就直接简写为MP1。为了保证安全ARM推出了 Arm Trusted Firmware的可信固件&#xff0c;简称 TF-A。它是一个开源的软件&#xff0c;最早是用在Armv8-A&#xff0c;ST也在MP1里面使用到了TF-A。它的作用就是隔离硬件&#xf…

递推+模拟---想好如何存储?

递推模拟 输入输出问题CCF-CSP考试历年真题题型分类分组输入——可能有多组测试数据&#xff0c;对于每组数据 递推---从前面已知态--->后续未知态AcWing 3777. 砖块AcWing 1208. 翻硬币AcWing 1211. 蚂蚁感冒AcWing 3433. 吃糖果AcWing 821. 跳台阶 模拟202212-2-csp-训练计…

C语言--atoi函数详解及模拟实现

本篇概要 本篇博客主要讲述atoi函数的定义&#xff0c;用法及模拟实现。 文章目录 本篇概要1.atoi函数简介2.atoi函数的原型及参数3.atoi函数的使用举例4.atoi函数的模拟实现 1.atoi函数简介 atoi() 是 C语言的一个标准库函数&#xff0c;定义在<stdlib.h>头文件中。 at…

【RocketMQ】基本使用:Java操作RocketMQ(rocketmq-client)

【RocketMQ】基本使用&#xff1a;Java操作RocketMQ&#xff08;rocketmq-client&#xff09; 1.引入依赖 <dependency><groupId>org.apache.rocketmq</groupId><artifactId>rocketmq-client</artifactId><version>4.3.2</version>…

公司知识库搭建步骤,知识库建设与运营的四个步骤分享

在知识管理方面&#xff0c;团队中的每一员&#xff0c;都像是一名独行侠&#xff0c;自己的知识&#xff0c;满足自己的需要&#xff0c;这其中&#xff0c;就造成了很多无意义的精力消耗。 公司知识库搭建必要性 比如&#xff0c;一名员工撰写一QA文档&#xff0c;并没有将它…

CDH 6.3.2升级Flink到1.17.1版本

CDH&#xff1a;6.3.2 原来的Flink&#xff1a;1.12 要升级的Flink&#xff1a;1.17.1 操作系统&#xff1a;CentOS Linux 7 一、Flink1.17编译 build.sh文件&#xff1a; #!/bin/bash set -x set -e set -vFLINK_URLsed /^FLINK_URL/!d;s/.*// flink-parcel.properties FLI…

【模板语法+数据绑定+el与data的两种写法+MVVM模型】

模板语法数据绑定el与data的两种写法MVVM模型 1 模板语法1.1 插值语法1.2 指令语法 2 数据绑定2.1 单向数据绑定2.2 双向数据绑定 3 el与data的两种写法4 MVVM模型 1 模板语法 1.1 插值语法 双大括号表达式功能&#xff1a;用于解析标签体内容语法&#xff1a;{{xxx}}&#x…