sugwd.F90
路径
LMDZ.MARS\libf\phymars\sugwd.F90
所属目录/模块
libf/phymars
文件定位
sugwd.F90 定义 sugwd_mod 和 SUGWD,是 Lott/Miller 地形重力波拖曳链的参数初始化层。它不直接计算风温 tendency,而是在 calldrag_noro_mod.F90 首次进入地形 GW 分支时,根据半层 sigma 坐标表 sigtest 写入 yoegwd_h 中的调参常量和安全阈值,供后续 OROSETUP、GWSTRESS、GWPROFIL、ORODRAG 使用。
定义的符号
| 符号 |
类型 |
行号 |
作用 |
sugwd_mod |
module |
1 |
封装地形重力波参数初始化例程。 |
SUGWD |
subroutine |
7 |
根据垂直层数和半层 sigma 坐标初始化 yoegwd_h 中的地形 GW 调参常量。 |
依赖的模块
| use 模块 |
only 列表 |
用途 |
待确认 |
yoegwd_h |
GFRCRIT, GRCRIT, GVCRIT |
写入 Richardson 数、低层流和临界风速相关阈值。 |
- |
yoegwd_h |
GKDRAG, GKDRAGL, GHMAX |
写入地形 GW drag 强度、派生 drag 强度和最大地形高度阈值。 |
- |
yoegwd_h |
GRAHILO, GSIGCR, GSSEC |
写入高低层系数、低层流 sigma 阈值和稳定度安全下限。 |
- |
yoegwd_h |
GTSEC, GVSEC, GKWAKE |
写入 stress/地形各向异性、风速和 wake drag 安全或经验系数。 |
- |
yoegwd_h |
NKTOPG |
写入允许参与地形高度搜索的顶部层索引。 |
- |
调用的关键例程
| 被调用例程 |
所在模块/文件 |
调用位置 |
作用 |
WRITE(*,*) |
Fortran intrinsic I/O |
行 60 |
输出 NKTOPG 初始化结果到标准输出。 |
输入
| 输入 |
来源 |
类型/维度 |
单位 |
含义 |
nlayer |
calldrag_noro_mod.F90::calldrag_noro 行 96 |
integer, intent(in) |
层 |
模型全层数;循环使用 1:nlayer-1。 |
sigtest |
calldrag_noro_mod.F90::calldrag_noro 行 92-96 |
real, intent(in) :: sigtest(nlayer+1) |
无量纲 |
半层 sigma 坐标;调用方用 pplev(1,l)/pplev(1,1) 从首个格点压力构造。 |
输出
| 输出 |
去向 |
类型/维度 |
单位 |
含义 |
GHMAX |
yoegwd_h |
scalar real |
m,按注释语义 |
地形高度相关最大阈值,设为 10000.。 |
NKTOPG |
yoegwd_h |
scalar integer |
层索引 |
sigtest 中满足全层压力比例 >= 0.85 的最后一个扫描层。 |
GSIGCR |
yoegwd_h |
scalar real |
无量纲 sigma |
OROSETUP 查找低层流高度时使用的 sigma 阈值,设为 0.80。 |
GKDRAG, GKDRAGL |
yoegwd_h |
scalar real |
经验系数 |
地形 GW drag 系数;GKDRAG=0.1,GKDRAGL=4*GKDRAG。 |
GFRCRIT, GKWAKE, GRCRIT, GRAHILO, GVCRIT |
yoegwd_h |
scalar real |
经验阈值/系数 |
低层流、wake drag、Richardson 数和风速阈值相关参数。 |
GVSEC, GSSEC, GTSEC |
yoegwd_h |
scalar real |
保护阈值 |
风速、Brunt-Vaisala 频率平方和次网格地形各向异性的数值安全下限。 |
共享状态与副作用
本例程的主要副作用是写入 yoegwd_h 模块变量:GHMAX, NKTOPG, GSIGCR, GKDRAG, GFRCRIT, GKWAKE, GRCRIT, GKDRAGL, GRAHILO, GVCRIT, GVSEC, GSSEC, GTSEC。这些变量随后被地形 GW 链的预处理、应力初始化、应力廓线重算和阻塞层拖曳使用。
另一个副作用是行 60 的标准输出:
In sugwd NKTOPG= <value>
核心逻辑
- 设置地形高度上限
GHMAX=10000.,并把局部 sigma 阈值 ZSIGT 固定为 0.85、参考压力 ZPR 固定为 100000.。
- 在
JK=1,nlayer-1 上扫描相邻半层平均压力比例:ZPM1R=0.5*ZPR*(sigtest(JK)+sigtest(JK+1))。
- 若
(ZPM1R/ZPR) >= ZSIGT,把 NKTOPG 更新为当前 JK;因此最终结果是扫描范围内最后一个满足该阈值的层索引。
- 打印
NKTOPG,再写入 GSIGCR=0.80、GKDRAG=0.1、GFRCRIT=1.0、GKWAKE=1.0、GRCRIT=0.25、GKDRAGL=4*GKDRAG、GRAHILO=1.、GVCRIT=0.0。
- 写入安全阈值:
GVSEC=0.10、GSSEC=1.E-12、GTSEC=1.E-07。
伪代码
set GHMAX
set local top sigma threshold ZSIGT = 0.85
set local reference pressure ZPR = 100000
for JK from 1 to nlayer-1:
compute midpoint sigma as 0.5 * (sigtest(JK) + sigtest(JK+1))
if midpoint sigma >= 0.85:
NKTOPG = JK
print NKTOPG
write all remaining yoegwd_h tuning constants and safety thresholds
参与的主题流程
| 主题 |
参与方式 |
| 地形重力波 / 次网格地形拖曳 |
在 calldrag_noro 首调用时初始化 yoegwd_h,为 OROSETUP 的层索引和低层流判据、GWSTRESS/GWPROFIL 的 stress 阈值、ORODRAG 的 wake drag 系数提供共享参数。 |
写法特点
SUGWD 没有显式输出参数,所有有效输出都通过 yoegwd_h module 变量传递。
ZPR=100000. 在公式中与分子分母同时出现,NKTOPG 实际只依赖相邻 sigtest 的平均值和 ZSIGT=0.85。
NKTOPG 只在满足阈值时赋值;若异常垂直坐标让所有扫描层都不满足 >=0.85,NKTOPG 的既有值会保留。正常 Mars GCM 半层 sigma 坐标通常包含近地面层,调用方首列压力构造的 sigtest 会让低层满足该条件。
WRITE(*,*) 会在初始化时产生标准输出,批量运行日志中可据此确认本例程被触发。
复现要点
calldrag_noro 只在 firstcall 分支调用 sugwd;若垂直网格或首列压力结构改变,必须确保初始化发生在使用地形 GW 链之前。
sigtest 由 pplev(1,l)/pplev(1,1) 构造,只使用第一个水平格点的半层压力比例。
GKDRAGL 是 GKDRAG 的派生值;修改 GKDRAG 时需同步派生关系。
- 下游
OROSETUP/GWSTRESS/GWPROFIL/ORODRAG 对 yoegwd_h 的读取没有在本文件内做一致性检查。
待确认
GHMAX 的单位和下游使用位置需在 yoegwd_h.F90 及完整地形 GW 链中继续核验。
NKTOPG 无命中时保留旧值的行为是否为设计意图,需结合运行配置和历史 IFS 版本确认。
相关页面
- calldrag_noro_mod:本例程的直接调用方,构造
sigtest 并在首调用时初始化 GW 参数。
- drag_noro_mod:地形 GW 的
ORODRAG 包装层。
- orodrag_mod:地形 GW / 次网格地形拖曳核心,消费
GKWAKE 等参数。
- orosetup:读取
GFRCRIT, GRCRIT, GSIGCR, GSSEC, GTSEC, GVSEC, NKTOPG 等参数。
- gwstress_mod:读取
GKDRAG, GTSEC, GVCRIT 等参数计算底层应力。
- gwprofil_mod:读取
GKDRAG, GRCRIT, GSSEC, GTSEC 等参数重算应力廓线。
- yoegwd_h:记录这些共享变量的定义位置、
THREADPRIVATE 属性和下游读取关系。