yoegwd_h.F90
路径
LMDZ.MARS\libf\phymars\yoegwd_h.F90
所属目录 / 模块
libf/phymars
文件定位
yoegwd_h.F90 定义 yoegwd_h 模块,是地形重力波拖曳链的共享调参状态容器。它本身不执行计算,也不读取配置文件;所有变量都在模块内以 save 或模块变量形式保存,并通过 OpenMP THREADPRIVATE 声明成为每个线程私有的地形 GW 参数副本。实际数值由 sugwd 在 calldrag_noro 首调用时写入,随后被 orosetup、gwstress_mod、gwprofil_mod 和 orodrag_mod 读取。
定义的符号
| 符号 |
类型 |
行号 |
作用 |
yoegwd_h |
module |
1 |
地形重力波拖曳参数共享模块。 |
GFRCRIT |
saved threadprivate real |
7, 10 |
低层流 / Froude 相关临界参数;由 SUGWD 写为 1.0,供 OROSETUP 判据读取。 |
GRCRIT |
saved threadprivate real |
8, 10 |
Richardson 数临界参数;由 SUGWD 写为 0.25,供 OROSETUP 和 GWPROFIL 使用。 |
GVCRIT |
saved threadprivate real |
9, 10 |
临界风速阈值;由 SUGWD 写为 0.0,在 GWSTRESS 中出现在当前注释掉的截断判据里。 |
GKDRAG |
saved threadprivate real |
11, 14 |
地形 GW 底层应力 drag 系数;由 SUGWD 写为 0.1。 |
GKDRAGL |
saved threadprivate real |
12, 14 |
GKDRAG 的派生系数;由 SUGWD 写为 4.*GKDRAG。 |
GHMAX |
saved threadprivate real |
13, 14 |
最大地形高度相关阈值;由 SUGWD 写为 10000.,本文件只声明。 |
GRAHILO |
saved threadprivate real |
15, 18 |
高低层相关经验系数;由 SUGWD 写为 1.。 |
GSIGCR |
saved threadprivate real |
16, 18 |
OROSETUP 查找低层流高度的 sigma 阈值;由 SUGWD 写为 0.80。 |
GSSEC |
saved threadprivate real |
17, 18 |
Brunt-Vaisala 频率平方的安全下限;由 SUGWD 写为 1.E-12。 |
GTSEC |
saved threadprivate real |
19, 22 |
stress / 次网格地形各向异性的安全阈值;由 SUGWD 写为 1.E-07。 |
GVSEC |
saved threadprivate real |
20, 22 |
风速范数和风切变计算的安全下限;由 SUGWD 写为 0.10。 |
GKWAKE |
saved threadprivate real |
21, 22 |
阻塞层 wake drag 经验系数;由 SUGWD 写为 1.0,由 ORODRAG 读取。 |
NKTOPG |
threadprivate integer |
23, 24 |
地形高度搜索允许到达的顶部层索引;由 SUGWD 扫描 sigtest 后写入。 |
依赖的模块
| use 模块 |
only 列表 |
用途 |
待确认 |
| 无 |
- |
本文件只声明共享变量,不 use 其他模块。 |
- |
调用的关键例程
| 被调用例程 |
所在模块 / 文件 |
调用位置 |
作用 |
| 无 |
- |
- |
本文件没有可执行语句。 |
输入
| 输入 |
来源 |
类型/维度 |
单位 |
含义 |
SUGWD 写入的参数值 |
sugwd.F90 行 45-76 |
scalar real / integer |
依变量而定 |
本模块变量的唯一已核验初始化来源。 |
输出
| 输出 |
去向 |
类型/维度 |
单位 |
含义 |
GFRCRIT, GRCRIT, GSIGCR, GSSEC, GTSEC, GVSEC, NKTOPG |
orosetup.F90 |
module variables |
阈值 / 层索引 |
低层流、稳定度、风速保护和地形搜索层限制。 |
GKDRAG, GTSEC, GVCRIT |
gwstress_mod.F90 |
module variables |
drag 系数 / 阈值 |
底层重力波应力公式和截断判据。 |
GKDRAG, GRCRIT, GSSEC, GTSEC |
gwprofil_mod.F90 |
module variables |
drag 系数 / 阈值 |
应力廓线重算、波 Richardson 数破碎判据和小 stress 保护。 |
GKWAKE |
orodrag_mod.F90 |
module variable |
经验系数 |
阻塞层 wake drag 方程的系数。 |
共享状态与副作用
yoegwd_h 的全部变量都是共享模块状态,且都带有 OpenMP THREADPRIVATE 语义。源码没有提供显式初始化例程或默认值;正常路径依赖 calldrag_noro_mod.F90 首调用时先调用 sugwd,再进入 ORODRAG/OROSETUP/GWSTRESS/GWPROFIL 链。复现时不能只检查本文件声明,还必须确认 SUGWD 已经在同一线程中执行过,否则这些 threadprivate 变量可能保留未定义或旧值。
核心逻辑
- 声明 12 个
real,save 地形 GW 参数,分成四组 THREADPRIVATE。
- 声明 1 个
integer 层索引 NKTOPG,同样设为 THREADPRIVATE;它不是 real,save 参数。
- 不执行任何计算;参数写入由
sugwd.F90::SUGWD 完成,下游例程直接 use yoegwd_h, only: ... 读取。
伪代码
module yoegwd_h:
declare saved real tuning constants for orographic GW drag
mark each group as OpenMP threadprivate
declare integer NKTOPG
mark NKTOPG as OpenMP threadprivate
runtime expectation:
SUGWD initializes these variables before the orographic GW chain reads them
参与的主题流程
| 主题 |
参与方式 |
| 地形重力波 / 次网格地形拖曳 |
保存 SUGWD 初始化的调参常量和安全阈值,供 OROSETUP 预处理、GWSTRESS 应力初始化、GWPROFIL 应力廓线重算和 ORODRAG wake drag 使用。 |
写法特点
- 这是 Fortran 90 “头文件式”共享状态模块,只有声明,没有
contains 区段。
- 所有 real 参数都带
save,保证模块状态跨调用保留;NKTOPG 是模块变量,本身也具有模块生命周期。
- 每组变量都用
!$OMP THREADPRIVATE(...) 标注。并行运行时,每个线程需要自己的初始化副本,不能假设 master 线程写入后自动覆盖其他线程副本。
- 本文件没有默认赋值;实际默认数值集中在
sugwd.F90 行 45-76。
复现要点
- 使用地形 GW 链前,必须确认
calldrag_noro 的 firstcall 路径已调用 SUGWD。
- 修改
GKDRAG 时要同步检查 GKDRAGL=4.*GKDRAG 的派生关系。
NKTOPG 的有效值依赖 SUGWD 对半层 sigma 坐标 sigtest 的扫描结果。
- OpenMP 运行中要关注 threadprivate 初始化顺序;本模块没有
COPYIN 或集中广播逻辑。
待确认
GHMAX 在当前地形 GW 链中的实际使用位置尚未找到;复现最大地形高度限制时,需要继续沿调用链核验。
THREADPRIVATE 变量在所有线程上的初始化时机需结合物理驱动的并行区边界确认;本页只记录源码声明和直接调用关系。
相关页面