lmdz_atke_turbulence_ini.F90
路径
LMDZ.MARS\libf\phymars\lmdz_atke_turbulence_ini.F90
所属目录 / 模块
libf/phymars
文件定位
lmdz_atke_turbulence_ini.F90 是 ATKE 湍流方案的初始化与参数共享模块。它定义 lmdz_atke_turbulence_ini 模块和唯一入口 atke_ini,从 physiq_mod.F 在 callatke 打开时调用,接收行星常数和分子黏性系数,再读取一组 atke_* / iflag_* 配置键,生成后续 ATKE 交换系数、TKE 演化、地表层稳定度函数和 PBL 诊断共用的模块变量。
该文件本身不计算扩散通量;它的职责是把 ATKE 方案的开关、经验常数、稳定度函数参数和分子黏性系数集中初始化,并通过 SAVE + !$OMP THREADPRIVATE 的模块状态供下游读取。
定义的符号
| 符号 |
类型 |
行号 |
作用 |
lmdz_atke_turbulence_ini |
module |
1 |
保存 ATKE 湍流方案的全局参数和初始化入口 |
atke_ini |
subroutine |
30 |
复制行星常数、读取 ATKE 配置键,并派生稳定度函数参数 |
iflag_atke |
module integer |
8 |
控制 atke_compute_km_kh 中 TKE 数值格式 |
iflag_num_atke |
module integer |
8 |
控制 ATKE 扩散系数计算的数值处理 |
iflag_atke_lmix |
module integer |
8 |
控制混合长度 l_exchange 的参数化路径 |
kappa |
module real |
10 |
Von Karman 常数,默认 0.4 |
l0, lmin |
module real |
14, 22 |
渐近混合长度和最小混合长度 |
ric, ri0, ri1 |
module real |
14 |
临界 Richardson 数和 ATKE 稳定度函数过渡尺度 |
cinf, cn, cepsilon, ctkes |
module real |
14 |
ATKE 稳定度函数、TKE 耗散和地表 TKE 常数 |
pr_slope, pr_asym, pr_neut |
module real |
14 |
湍流 Prandtl 数函数参数 |
clmix, clmixshear, smmin, cke |
module real |
14 |
混合长度、稳定度下限和 TKE 扩散系数调参 |
rg, rd, rpi, rcpd, rv |
module real |
18 |
行星/气体常数缓存 |
viscom, viscoh |
module real |
20 |
动量与热量的运动分子黏性系数 |
atke_ok_vdiff, atke_ok_virtual |
module logical |
25 |
TKE 垂直扩散开关与虚温/浮力修正开关 |
依赖的模块
| use 模块 |
only 列表 |
用途 |
待确认 |
ioipsl_getin_p_mod |
getin_p |
从 .def 配置读取 ATKE 开关和调参常数 |
|
调用的关键例程
| 被调用例程 |
所在模块 / 文件 |
调用位置 |
作用 |
getin_p |
ioipsl_getin_p_mod |
行 62, 66, 75, 80, 85, 91, 95, 100, 109, 124, 132, 137, 147, 151, 157, 163 |
用 .def 键覆盖本模块默认值 |
abort_physic |
待确认:未在本文件显式 use |
行 69, 112, 126, 139 |
配置组合或参数范围不满足方案假设时中止 |
输入
| 输入 |
来源 |
类型/维度 |
单位 |
含义 |
rg_in |
physiq_mod.F 行 815,传入 g |
real scalar |
m/s2 |
重力加速度 |
rd_in |
physiq_mod.F 行 815,传入 r |
real scalar |
J/kg/K |
干空气/背景气体气体常数 |
rpi_in |
physiq_mod.F 行 815,传入 pi |
real scalar |
1 |
圆周率 |
rcpd_in |
physiq_mod.F 行 815,传入 cpp |
real scalar |
J/kg/K |
定压比热 |
rv_in |
physiq_mod.F 行 815,传入 0. |
real scalar |
J/kg/K |
水汽气体常数;火星路径中当前传 0 |
viscom_in |
physiq_mod.F 行 813-815 |
real scalar |
m2/s |
动量分子黏性系数,当前调用处设为 0.001 |
viscoh_in |
physiq_mod.F 行 814-815 |
real scalar |
m2/s |
热量分子黏性系数,当前调用处设为 0.001 |
输出
| 输出 |
去向 |
类型/维度 |
单位 |
含义 |
iflag_atke, iflag_num_atke, iflag_atke_lmix |
lmdz_atke_exchange_coeff, lmdz_call_atke |
module integer |
1 |
ATKE 数值格式、扩散系数处理和混合长度路径 |
rg, rd, rpi, rcpd, rv |
lmdz_atke_exchange_coeff, lmdz_call_atke |
module real |
mixed |
下游 ATKE 计算需要的行星/气体常数 |
viscom, viscoh |
lmdz_atke_exchange_coeff |
module real |
m2/s |
Km/Kh 与 TKE 扩散中的分子黏性基值 |
ric, ri0, ri1, cinf, cn, cepsilon, pr_*, smmin |
lmdz_atke_exchange_coeff, vdif_cd_mod, pbl_parameters_mod |
module real |
mixed |
ATKE 稳定度函数与 Prandtl 数函数参数 |
l0, lmin, clmix, clmixshear, ctkes, cke |
lmdz_atke_exchange_coeff |
module real |
mixed |
混合长度、地表 TKE 和 TKE 垂直扩散调参 |
atke_ok_vdiff, atke_ok_virtual |
lmdz_atke_exchange_coeff |
module logical |
1 |
是否扩散 TKE、是否使用虚温/浮力修正 |
共享状态与副作用
- 模块状态:本文件所有 ATKE 参数均为
SAVE 模块变量,并声明为 !$OMP THREADPRIVATE。并行复现时要确认每个 OpenMP 线程都已经经过初始化或正确继承初始化值。
- 配置读取:
atke_ini 会读取 .def 键并覆盖默认值;这些值不会作为参数显式传给下游,而是由其他模块 use lmdz_atke_turbulence_ini, only: ... 读取。
- 中止路径:当
iflag_atke==0 且 iflag_atke_lmix>0、cinf<=cn、pr_slope<=1、pr_asym>=pr_neut 时调用 abort_physic 中止。
- 无文件 I/O:本文件不直接打开或写文件,也不输出诊断字段。
核心逻辑
- 复制调用方常数:
atke_ini 先把 rg_in/rd_in/rpi_in/rcpd_in/rv_in/viscom_in/viscoh_in 写入同名模块缓存,供 ATKE 下游模块读取。
- 读取方案开关:依次读取
iflag_atke、iflag_atke_lmix、atke_ok_vdiff、atke_ok_virtual、iflag_num_atke。其中 iflag_atke==0 表示 stationary TKE 路径;该路径不允许使用依赖 TKE 的混合长度公式。
- 读取长度与临界参数:读取
atke_l0、atke_ric 和 atke_cepsilon,并由 cepsilon 计算 cn。
- 构造 ATKE 稳定度函数常数:读取
atke_cinffac,计算 cinf=cinffac*cn,要求 cinf>cn;再计算 ctkes=cepsilon**(2./3.)。
- 读取 Prandtl 数函数参数:读取
atke_pr_slope、atke_pr_neut、atke_pr_asym,要求 pr_slope>1 且 pr_asym<pr_neut。
- 读取混合长度和 TKE 扩散调参:读取
atke_clmix、atke_clmixshear、atke_smmin、atke_cke。
- 派生过渡尺度:计算
ri0=2./rpi*(cinf-cn)*ric/cn 和 ri1=-2./rpi*(pr_asym-pr_neut),下游用它们在不稳定 Richardson 数区间平滑过渡。
伪代码
atke_ini(constants, molecular_viscosities):
保存 g, R, pi, cp, rv, viscom, viscoh 到 module 变量
iflag_atke = getin_p("iflag_atke", default=0)
iflag_atke_lmix = getin_p("iflag_atke_lmix", default=0)
if iflag_atke == 0 and iflag_atke_lmix > 0:
abort_physic(...)
atke_ok_vdiff = getin_p("atke_ok_vdiff", default=.false.)
atke_ok_virtual = getin_p("atke_ok_virtual", default=.false.)
iflag_num_atke = getin_p("iflag_num_atke", default=0)
读取 l0, ric, cepsilon
cn = (1 / sqrt(cepsilon)) ** (2/3)
读取 cinffac
cinf = cinffac * cn
if cinf <= cn: abort_physic(...)
ctkes = cepsilon ** (2/3)
读取 pr_slope, pr_neut, pr_asym
if pr_slope <= 1 or pr_asym >= pr_neut:
abort_physic(...)
读取 clmix, clmixshear, smmin, cke
ri0 = 2/pi * (cinf-cn) * ric / cn
ri1 = -2/pi * (pr_asym-pr_neut)
参与的主题流程
| 主题 |
参与方式 |
| 边界层与湍流 |
初始化 ATKE 1.5 阶湍流闭合方案所需的稳定度函数、TKE 耗散、混合长度和扩散参数 |
| 垂直扩散 |
lmdz_atke_exchange_coeff 用本模块参数计算 Km/Kh 和可选 TKE 垂直扩散 |
| PBL 诊断 / 地表层交换 |
pbl_parameters_mod 和 vdif_cd_mod 读取 ric/cinf/cn/ri0/ri1/pr_*,在 callatke 路径中复用 ATKE 稳定度函数 |
写法特点
- 集中式初始化模块:本文件只初始化和保存参数,下游模块通过
use ... only 读取,不通过显式参数链传递。
SAVE + THREADPRIVATE:所有关键状态均为线程私有,适合 OpenMP,但要求初始化路径在并行使用前完成。
- 配置键默认值写在源码中:例如
atke_l0=15.0、atke_ric=0.25、atke_cepsilon=5.87、atke_cinffac=2.0、atke_pr_neut=0.8。
- 参数合法性直接中止:范围检查只覆盖影响公式一致性的组合;其他数值如
clmix、smmin、cke 没有额外范围保护。
复现要点
- 只有
physiq_mod.F 中 callatke 为真时才调用 atke_ini;当前调用处把 viscom 和 viscoh 设为 0.001,并把 rv 传为 0.。
.def 中未提供键时使用源码默认值;复现实验必须记录 iflag_atke、iflag_atke_lmix、iflag_num_atke 和所有 atke_* 键。
iflag_atke==0 时不能设置 iflag_atke_lmix>0,否则初始化立即中止。
cinffac 必须让 cinf>cn;pr_slope 必须大于 1;pr_asym 必须小于 pr_neut。
atke_ok_vdiff 会打开 TKE 垂直扩散;atke_ok_virtual 会让下游 ATKE 计算考虑虚温/浮力修正。
待确认
abort_physic 在本文件中未显式 use,应由旧式隐式外部过程或构建环境提供;待确认具体接口来源。
- 行 105 的
cn=(1./sqrt(cepsilon))**(2/3) 中 2/3 在 Fortran 中可能按整数除法求值为 0;若如此,cn 会变为 1,而注释意图更像 2./3.。这是复现风险,需要用实际编译器/告警选项确认。
lunout 和 prt_level 在本模块声明并设为 THREADPRIVATE,但本文件未赋值也未使用;待确认是否为历史遗留接口。
- OpenMP 场景下
THREADPRIVATE 参数是否通过主线程初始化后复制到工作线程,取决于调用时序和编译运行设置。
相关页面