turb_mod.F90
路径
LMDZ.MARS\libf\phymars\turb_mod.F90
所属目录 / 模块
libf/phymars
文件定位
turb_mod.F90 是 phymars 中湍流、边界层和热羽流路径共享的状态数组模块。它本身不计算湍流闭合,也不读取配置文件;它只声明并按当前 ngrid/nlayer 分配 TKE、混合长度、摩擦速度、自由对流速度、热通量诊断和 sensible heat flux 等数组,供 phys_state_var_init_mod.F90 统一初始化,再由 restart、1D 初始化、垂直扩散、Yamada4、热羽流接口和 surface-layer/PBL 诊断路径读写。
复现时应把本文件视为“共享缓存和生命周期入口”,而不是湍流主求解器。实际 TKE 或交换系数演化在 vdif_kc.F、yamada4.F、vdifc_mod.F、calltherm_interface_mod.F90、pbl_parameters_mod.F90 和 vdif_cd_mod.F90 等文件中完成;turb_mod 负责保证这些过程在相同维度下访问同一批 module-level 数组。
定义的符号
| 符号 |
类型 |
行号 |
作用 |
turb_mod |
module |
1 |
保存湍流和 PBL 共享状态数组,并提供分配/释放例程。 |
q2 |
saved allocatable real array |
4 |
界面层 TKE,维度为 (ngrid,nlayer+1)。 |
l0 |
saved allocatable real array |
5 |
每列混合长度/湍流长度尺度缓存,维度为 (ngrid)。 |
ustar |
saved allocatable real array |
6 |
每列摩擦速度缓存,维度为 (ngrid)。 |
wstar |
saved allocatable real array |
7 |
每列自由对流速度尺度,主要由热羽流/边界层路径反馈。 |
tstar |
saved allocatable real array |
8 |
每列温度尺度缓存。 |
hfmax_th |
saved allocatable real array |
9 |
热羽流/扩散合成后的最大热通量诊断缓存。 |
zmax_th |
saved allocatable real array |
10 |
热羽流最大高度诊断缓存。 |
sensibFlux |
saved allocatable real array |
11 |
surface-layer sensible heat flux 缓存。 |
turb_resolved |
logical module variable |
12 |
显式解析湍流标志;源码注释说明主要供 LES 使用,GCM/mesoscale 默认 .false.。 |
ini_turb_mod |
subroutine |
20 |
按 ngrid,nlayer 分配全部共享数组。 |
end_turb_mod |
subroutine |
35 |
若数组已分配,则逐个释放。 |
依赖的模块
| use 模块 |
only 列表 |
用途 |
待确认 |
| 无 |
- |
本文件没有 use 语句。 |
- |
调用的关键例程
| 被调用例程 |
所在模块 / 文件 |
调用位置 |
作用 |
| 无 |
- |
- |
ini_turb_mod 和 end_turb_mod 只执行 allocate/deallocate。 |
被调用位置
| 调用方 |
文件 |
调用位置 |
作用 |
phys_state_var_init |
phys_state_var_init_mod.F90 |
通过 use turb_mod, only: ini_turb_mod,end_turb_mod 并在共享数组初始化序列中调用 |
在物理初始化阶段释放旧湍流数组并按当前网格重新分配。 |
init_testphys1d |
dyn1d/init_testphys1d_mod.F90 |
use turb_mod, only: q2 |
1D 初始化路径把 q2 置零。 |
testphys1d |
dyn1d/testphys1d.F90 |
use turb_mod, only: q2 |
1D 主循环把 TKE 状态传入 physiq。 |
phyetat0 |
phyetat0_mod.F90 |
restart 读取路径 |
从 startfi.nc 恢复 q2,并按可选字段恢复 wstar。 |
physdem1 |
phyredem.F90 |
restart 写出路径 |
写出 q2,并在 calltherm 开启时写出 wstar。 |
vdifc / vdif_kc / yamada4 |
vdifc_mod.F、vdif_kc.F、yamada4.F |
垂直扩散和湍流闭合路径 |
读写 q2、l0、ustar、wstar、sensibFlux 等湍流/PBL 状态。 |
calltherm_interface |
calltherm_interface_mod.F90 |
热羽流接口 |
读取 q2/sensibFlux,更新或反馈 wstar/hfmax_th/zmax_th 相关诊断。 |
pbl_parameters / vdif_cd |
pbl_parameters_mod.F90、vdif_cd_mod.F90 |
surface-layer 与 PBL 参数路径 |
使用 turb_resolved 或 wstar 相关量判断/修正近地层参数。 |
输入
| 输入 |
来源 |
类型 / 维度 |
单位 |
含义 |
ngrid |
phys_state_var_init |
integer scalar |
- |
当前物理列数。 |
nlayer |
phys_state_var_init |
integer scalar |
- |
当前大气垂直层数。 |
输出
| 输出 |
去向 |
类型 / 维度 |
单位 |
含义 |
q2 |
湍流闭合、restart、1D/3D physiq 路径 |
real (ngrid,nlayer+1) |
model units |
界面层 TKE 状态,垂直维度比层中心多 1。 |
l0 |
Yamada4/混合长度路径 |
real (ngrid) |
m 或方案内部尺度 |
每列混合长度缓存。 |
ustar, tstar |
surface-layer/PBL 路径 |
real (ngrid) |
m/s, K-like |
摩擦速度和温度尺度缓存。 |
wstar |
热羽流、surface-layer、restart |
real (ngrid) |
m/s |
自由对流速度尺度,常带有一步反馈含义。 |
hfmax_th, zmax_th |
热羽流/PBL 诊断 |
real (ngrid) |
mixed |
最大热通量与热羽流高度诊断缓存。 |
sensibFlux |
surface-layer 与热羽流接口 |
real (ngrid) |
W/m2 |
地表感热通量缓存。 |
turb_resolved |
PBL/LES 条件判断 |
logical scalar |
- |
标记湍流是否已显式解析。 |
共享状态与副作用
q2/l0/ustar/wstar/tstar/hfmax_th/zmax_th/sensibFlux 都是 SAVE, ALLOCATABLE module arrays,并在源码中声明为 OpenMP THREADPRIVATE。
turb_resolved 默认 .false.,源码注释说明它主要供 LES 使用;它没有出现在本文件的 THREADPRIVATE 声明中。
ini_turb_mod 只分配数组,不写初值。q2、wstar 等值必须由 restart 读取、1D 初始化、缺省路径或后续物理方案填充。
end_turb_mod 对每个数组先检查 allocated(...) 再释放,可被初始化编排例程重复调用。
核心逻辑
- 接收当前物理网格列数
ngrid 和大气层数 nlayer。
- 分配
q2(ngrid,nlayer+1),保留界面层 TKE 的 nlayer+1 维度。
- 分配
l0/ustar/wstar/tstar/hfmax_th/zmax_th/sensibFlux(ngrid)。
- 释放阶段逐个检查数组是否已分配,并释放对应缓存。
- 不设置任何数组默认值,也不触发实际湍流、热羽流或 surface-layer 计算。
伪代码
ini_turb_mod(ngrid, nlayer)
allocate q2(ngrid, nlayer + 1)
allocate l0(ngrid), wstar(ngrid), ustar(ngrid), tstar(ngrid)
allocate hfmax_th(ngrid), zmax_th(ngrid), sensibFlux(ngrid)
end_turb_mod()
for each turb_mod array:
if allocated(array):
deallocate(array)
参与的主题流程
| 主题 |
参与方式 |
| 物理状态初始化 |
phys_state_var_init_mod 调用 end_turb_mod/ini_turb_mod,把湍流共享数组纳入统一生命周期。 |
| 垂直扩散与 TKE |
vdifc、vdif_kc、yamada4 等路径读写 q2、l0 和 near-surface 湍流量。 |
| 热羽流反馈 |
calltherm_interface_mod 使用 q2/sensibFlux 并更新 wstar/hfmax_th/zmax_th 相关诊断。 |
| restart 兼容 |
phyetat0_mod 恢复 q2/wstar,phyredem 写出 q2/wstar,使 PBL/TKE 状态跨运行延续。 |
| 1D 测试物理 |
dyn1d 初始化路径显式设置 q2=0.,随后把它传入 physiq。 |
写法特点
- 文件很短,只有一个 module、两个生命周期例程和一组共享数组。
q2 使用 (ngrid,nlayer+1),与层界面而非层中心对齐;这是复现和重写接口时最容易错配的维度。
ini_turb_mod 不清零数组。新运行或无 restart 路径必须在其他初始化层保证后续读取前已赋值。
- 数组是
THREADPRIVATE,但 turb_resolved 不是;并行路径下不要假定所有本模块变量具有相同线程副本语义。
复现要点
- 不要把
turb_mod.F90 误认作湍流闭合主程序;它只提供共享状态和分配释放入口。
q2 必须按 nlayer+1 分配和传递,否则会破坏界面层 TKE 与层中心变量之间的对应关系。
- 如果绕过
phys_state_var_init 单独调用下游方案,需要先调用 ini_turb_mod 并填充必要数组。
- 使用 OpenMP 时要确认
THREADPRIVATE 数组在正确的并行上下文中分配、初始化和读取。
wstar/hfmax_th/zmax_th/sensibFlux 带有跨过程反馈含义,尤其 wstar 会影响后续 surface-layer gustiness 相关计算。
待确认
turb_resolved 未出现在 THREADPRIVATE 声明中;并行 LES 或 mesoscale 路径是否需要统一广播/同步该标志,需要结合调用方并行上下文继续确认。
- 无 restart 且非 1D 显式置零路径下,
q2/wstar/sensibFlux 等数组的第一次数值来源需要结合 phyetat0_mod、physiq_mod.F 和配置路径继续核对。
相关页面