sigma网格中水平压力梯度误差及其修正
1.水平梯度误差产生
sigma坐标系下,笛卡尔坐标内水平梯度项对应形式为
\left. \frac{\partial }{\partial x} \right|_z = \left. \frac{\partial }{\partial x} \right|_{\sigma} + \frac{\partial }{\partial \sigma} \frac{\partial \sigma}{\partial x}
\end{equation}\]
当采用数值格式对等式右端进行离散时,产生的截断误差远远大于等式左端。一些情况下,水平压力梯度(horizontal pressure gradient)误差无法随 \(\sigma\) 分层加密而减小,即静压不连续(hydrostatic inconsistency)情形。下面通过两个算例演示水平梯度误差产生原因,并介绍目前已有的主要修正方法。
1.1.示例1
在 Beckmann(1992)文章中,采用如下 \(\sigma\) 变换方程
\sigma = 2 \frac{z}{h} + 1
\end{equation}\]
对应的水平梯度算子为
\left. \nabla \right|_z = \left. \nabla \right|_{\sigma} + (1 - \sigma)\frac{\nabla h}{h} \frac{\partial }{\partial \sigma}
\end{equation}\]
在此 \(\sigma\) 坐标下,原始压力梯度(OPG)为
OPG = h \left[\frac{\partial \phi}{\partial x} + (1 - \sigma)\frac{\partial }{\partial \sigma}\left(\frac{\phi}{h}\right) \frac{\partial h}{\partial x} \right]
\end{equation}\]
采用有限差分格式对其离散得
OPG(FD) = \frac{\bar{h}}{\Delta x}\times \left[(\phi_i - \phi_{i-1}) + (1 - \sigma)\frac{1}{2}\frac{\partial }{\partial \sigma}\left(\frac{\phi_i}{h_i} + \frac{\phi_{i-1}}{h_{i-1}} \right)\Delta h \right]
\end{equation}\]
这里 \(\bar{h} = \frac{1}{2}(h_i + h_{i-1})\),\(\Delta h = (h_i - h_{i-1})\),i 为节点水平编号。
假设标量 \(\phi\) 只沿垂向变化,其分布函数为
\phi(x) = \sum_{k = 1}^{K} \phi_k \left( \frac{2z}{H_0} \right)^k
\end{equation}\]
由于 \(\phi\) 与 x 无关,因此其水平梯度为0。将上式代入水平梯度差分形式表达式 ( OPG(FD) )中,得
ERROR(OPG) = \sum_{k = 1}^{K} \phi_k (\sigma - 1)^k \frac{\bar{h}}{H_0^k \Delta x}\times \left[ (h_i^k - h_{i-1}^k) - \frac{k}{2}\Delta h (h_i^{k-1} - h_{i-1}^{k-1}) \right]
\end{equation}\]
通过上述误差公式可知,当标量 \(\phi(z)\) 只包含 \(k = 0,1,2\) 三项时误差为0。对于更高阶多项式 \(\phi(z)\) 则具有误差表达式
ERROR(OPG) = \sum_{k = 1}^{K} \phi_k (\sigma - 1)^k \frac{\bar{h}}{H_0^k \Delta x} R_1
\end{equation}\]
其中
R_1 = {(1 + r)^k - (1-r)^k - rk[(1+r)^{k-1} + (1-r)^{k-1}]} \quad \text{with} \quad r = \frac{\Delta h}{2\bar{h}} = \frac{h_i - h_{i-1}}{h_i + h_{i-1}}
\end{equation}\]
1.2.示例2
Haney (1991) 与 Mellor (1993) 先后给出了静压连续条件表达形式
\left| \frac{\sigma}{H} \frac{\delta_x H}{\delta \sigma} \right| < 1
\end{equation}\]
其中 \(\sigma = \frac{z}{H} \in [-1, 0]\)。在此 \(\sigma\) 网格内,水平梯度表达形式为
\left. \frac{\partial \phi}{\partial x} \right|_z = \left. \frac{\partial \phi}{\partial x} \right|_{\sigma} - \frac{\sigma}{H} \frac{\partial H}{\partial x} \frac{\partial \phi}{\partial \sigma}
\end{equation}\]
与 Beckmann 采用方法相同,Mellor 也采用差分格式(FDM)对 \(\sigma\) 坐标内水平梯度进行离散。与其不同的是,Mellor 将标量 \(\phi(z)\) 在节点 \(z_0 = \bar{\sigma} \bar{H}\) 处进行泰勒展开
\phi(z) = \phi_0 + \left( \frac{\partial b}{\partial z} \right)_0 [\sigma H(x) - z_0] + \left( \frac{\partial^2 b}{\partial z^2} \right)_0 \frac{[\sigma H(x) - z_0]^2}{2} + \cdots
\end{equation}\]
并将展开式代入水平梯度离散方程中
\left. \frac{\delta b}{\delta x} \right|_z = \frac{b_{i,k} + b_{i,k-1} - b_{i-1,k} - b_{i-1,k-1}}{2\delta x} - \frac{\bar{\sigma} \delta_x H}{\bar{H} \delta x} \frac{b_{i,k-1} + b_{i-1,k-1} - b_{i,k} - b_{i-1,k}}{2 \delta \sigma}
\end{equation}\]
得
E\left( \left. \frac{\delta b}{\delta x} \right|_z \right) = \frac{H}{4} \frac{\delta_x H}{\delta x} \left[ \left( \frac{\partial^2 b }{\partial z^2} \right) + \frac{\sigma H}{3}\left(\frac{\partial^3 b}{\partial z^3} \right) + \cdots \right] \times \left( (\delta \sigma)^2 - \sigma^2 \left( \frac{\delta_x H}{H} \right)^2 \right)
\end{equation}\]
其中,\(\delta_x H = H_i - H_{i-1}\),\(\delta \sigma = \sigma_{k-1} - \sigma_k\)。
由 Mellor 给出的误差公式可以看出,当 \(\left| (\sigma \delta_x H)/(H \delta \sigma) \right| = 1\) 时,右端离散项误差为0。但是当 \(\left| (\sigma \delta_x H)/(H \delta \sigma) \right| > 1\) 时,对于给定的 \(\left| \delta_x H/H \right|\),当 \(\delta \sigma/\sigma\) 减小时(垂向加密),误差反而增大,即所谓的“静压不连续”(hydrostatic inconsistent)现象。
1.3.使用z坐标的 FEM 或 DGM 亦不能幸免
可以看出,在 \(\sigma\) 网格中水平压力误差产生的主要原因,是梯度项对应的离散格式截断误差不能相消使其无法收敛导致,所以只要不采用 \(\sigma\) 坐标或避免梯度分裂为两项就可避免此种误差。遗憾的是,即使采用 z 坐标的 FEM 或 DGM 格式也不能避免此种误差。采用一个简单的示例来说明,海洋模型中常用的三棱柱单元,如下图所示

在实际计算过程中,物理单元通过 Jacobian 变换到标准单元,所有算子(微分,积分)在标准单元上进行计算,随后将计算结果通过逆变换获得物理单元计算结果。其中映射关系如下
x = x(r,s,t) \quad
y = y(r,s,t) \quad
z = z(r,s,t)
\end{equation}\]
在计算三棱柱内水平梯度时,根据链式法则
\left. \frac{\partial }{\partial x} \right|_{\Omega_i} = \frac{\partial r}{\partial x} \left. \frac{\partial }{\partial r} \right|_{\Omega_{st}} + \frac{\partial s}{\partial x} \left. \frac{\partial }{\partial s} \right|_{\Omega_{st}} + \frac{\partial t}{\partial x} \left. \frac{\partial }{\partial t} \right|_{\Omega_{st}}
\end{equation}\]
可以看出,在FEM或DGM方法中,水平梯度的求解同样会引入与 \(\sigma\) 网格变换类似的误差。
2.修正方法
为了减小水平压力梯度误差,众学者提出多种方法,Shchepetkin (2003) 主要将其分为以下两种。
2.1.Pressure Jacobian
在垂向坐标中使用交错网格形式,其中压力 \(P_{k+1/2}\) 位于密度节点中间,对于相邻两层水体,计算时将 \(P_{k+1/2}\) 插值到一个合适的计算层上,随后得到压力梯度。这种方法在大气科学中广泛采用,主要不同形式是插值方式,一般以线性插值或二次插值为主,也有三次插值。
2.2.Density Jacobian
此方法由 Blumberg 和 Mellor (1987) 与 Song (1998) 等提出。此种方法特点是将积分与微分互换位置。首先根据静压假定有
\frac{\partial }{\partial z} \left( \frac{\partial P}{\partial x} \right) = - g \frac{\partial \rho}{\partial x}
\end{equation}\]
将上式在垂向上进行积分,并将表层压力梯度表达式代入,得
-\left. \frac{\partial P}{\partial x} \right|_z = -\left. \frac{\partial P}{\partial x} \right|_{z = \xi} - g \int_z^{\xi} \left. \frac{\partial \rho}{\partial x} \right|_z d\sigma = -g\rho(\xi) \frac{\partial \xi}{\partial x} - \int_z^{\xi} \left. \frac{\partial \rho}{\partial x} \right|_z d\sigma
\end{equation}\]
这种方法通过将微分与积分交换位置,使得仅采用线性插值与积分也可以较为准确的计算压力梯度,可有效减小误差。
2.3.Other vertical grids
上述方法都是讨论如何尽量较小误差,并没有将误差完全消除。更为直接的方法就是避免采用如 \(\sigma\) 网格形式,而直接采用 z 坐标方法。在底部地形变化较大地区,将 z 坐标与 Shaved Cell 方法结合,也可以获得较为准确的考虑底部地形变化的模拟结果。
附录A.
1.图片代码(Matlab)
clear all; close all
r = [-1, 1, -1, -1, 1, -1];
s = [-1, -1, 1, -1, -1, 1];
t = [-1, -1, -1, 1, 1, 1];
LToV = [1,2; 2,3; 3,1; 4,5; 5,6; 6,4; 1,4; 2,5; 3,6];
figure('Color', 'w');
plot3(r(LToV'), s(LToV'), t(LToV'), 'ob-'); hold on;
t_h = text(r(3), s(3), mean(t)+ 2 ,'Standard Element \Omega_{st}');
set(t_h, 'FontSize', 18)
x = [-1, 1, -1, -1, 1, -1]+5;
y = [-1, -1, 1, -1, -1, 1];
z = [-1.5, -1.2, -2, 1.2, 1.5, 1.5];
plot3(x(LToV'), y(LToV'), z(LToV'), 'or-');
t_h = text(x(3), y(3), mean(t)+ 2 ,'Physical Element \Omega_{i}');
set(t_h, 'FontSize', 18)
axis equal;
grid on;
axis off
sigma网格中水平压力梯度误差及其修正的更多相关文章
- VMware 设备VMnet0 上的网桥暂时关闭。此虚拟机无法与主机或网格中的其他计算机通信【转】
今天克隆了一个win7的虚拟机,移动到我的本地.打开时发现虚拟机网格连接图标出现X断开连接,于是网上收了一堆答案无一个可用的,决定自己解决这个问题,解决过程如下: 1.报错图如下:设备VMnet0 上 ...
- csuoj 1117: 网格中的三角形
http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1117 1117: 网格中的三角形 Time Limit: 3 Sec Memory Limit: ...
- FMS 4中multicast脚本的小修正
FMS 4中multicast脚本的小修正 http://help.adobe.com/en_US/flashmediaserver/devguide/WS7812b00092aae0dc-2829d ...
- CSS实现图片在div a标签中水平垂直居中
CSS实现图片在div a标签中水平垂直居中 <div class="demo"> <a href="#"> <img src=& ...
- 文字在div中水平和垂直居中的的css样式
文字在div中水平和垂直居中的的css样式 text-align:center; /*水平居中*/ line-height: 20px; /*行距设为与div高度一致*/ 示例如下: HTML元素 & ...
- 一个div在另一个div中水平垂直的方法
html <div id="main"> <div id="box"> 一个div在另一个div中垂直居中实现方法 </div&g ...
- 网格中的BFS,逆向(POJ2049)
题目链接:http://poj.org/problem?id=2049 解题报告: 网格中的BFS,最主要的是边界问题. 1.这里在左右,上下两个方向上,分别判断墙,和门,细节是,向上有t个墙,for ...
- 搜索(BFS)---计算在网格中从原点到特定点的最短路径长度
计算在网格中从原点到特定点的最短路径长度 [[1,1,0,1], [1,0,1,0], [1,1,1,1], [1,0,1,1]] 题目描述: 1表示可以经过某个地方,求解从(0,0)位置到(tr,t ...
- P2295 MICE 网格中的DP
题目描述 分析 很好的一道网格中的\(DP\)题 我们设\(f[x][y]\)为小象到达坐标为\((x,y)\)的点时看到的最少的老鼠的数量 但是这样定义是不好转移的,因为小象可能从上面的格子转移下来 ...
随机推荐
- FastAPI 学习之路(二十八)使用密码和 Bearer 的简单 OAuth2
OAuth2 规定在使用(我们打算用的)「password 流程」时,客户端/用户必须将 username 和 password 字段作为表单数据发送.我们看下在我们应该去如何实现呢. 我们写一个登录 ...
- 大神教零基础入门如何快速高效的学习c语言开发
零基础如果更快更好的入门C语言,如何在枯燥的学习中找到属于自己的兴趣,如果把学习当成一种事务性的那以后的学习将会很难有更深入的进步,如果带着乐趣来完成学习那将越学越有意思这样才会让你有想要更深入学习的 ...
- 利用Ambari平台安装与部署Hadoop
* 本篇是利用Ambari平台安装与部署Hadoop,如果需要原生部署Hadoop,请点击以下地址: https://www.cnblogs.com/live41/p/15467263.html 一. ...
- dhcpd 启动失败No subnet declaration for wlan0
今天在调试机器的WIFI热点,好不容易把dhcp编译打包进去,服务启动出现报错No subnet declaration for wlan0,详细信息如下: Internet Systems Cons ...
- 数组中只出现过一次的数字 牛客网 剑指Offer
数组中只出现过一次的数字 牛客网 剑指Offer 题目描述 一个整型数组里除了两个数字之外,其他的数字都出现了偶数次.请写程序找出这两个只出现一次的数字. def FindNumsAppearOnce ...
- Python Linux Ubuntu apt安装PyCharm
PyCharm一个是Python集成开发环境,它既提供收费的专业版,也提供免费的社区版本.PyCharm带有一整套可以帮助用户在使用Python语言开发时提高其效率的工具,比如调试.语法高亮.Proj ...
- HTML 罗盘式时钟
代码块: 1 <!DOCTYPE html> 2 <html lang="zh-hans"> 3 <head> 4 <meta chars ...
- adb 安装与使用(一)
一.ADB简介 1. 什么是adb? adb(Android Debug Bridage)是Android sdk的一个工具: adb 是用来连接安卓手机和PC端的桥梁,要有adb作为二者之间的维系, ...
- Intellij IDEA 内存设置的问题 及解决
在IDEA上运行较大项目时,编译量很大,可能会报出 Error:java: java.lang.OutOfMemoryError: Java heap space 的错误,解决方法如下:java.la ...
- 基于hadoop_yarn的资源隔离配置
目录 yarn的基本概念 scheduler 集群整体的资源定义 fair scheduler简介 配置demo 队列的资源限制 基于具体资源限制 基于权重资源限制 队列运行状态限制 基于用户和分组限 ...