nonoro_gwd_mix_mod.F90
路径
LMDZ.MARS\libf\phymars\nonoro_gwd_mix_mod.F90
所属目录 / 模块
libf\phymars
文件定位
nonoro_gwd_mix_mod.F90 定义非地形重力波诱导混合模块 nonoro_gwd_mix_mod。它不是 nonoro_gwd_ran_mod.F90 中的 FLott 非地形重力波动量拖曳本体,而是在 physiq_mod.F 的 calllott_nonoro 分支内、且 calljliu_gwimix 为真时额外调用的混合方案:根据当前温度、风、位温和 tracer 场构造离散重力波,计算 EP flux 随高度的耗散、临界层和饱和,再把得到的涡混合通量转成温度、纬向风、经向风和 tracer tendency。
源码中的实际输出有一个重要不对称:d_u、d_t 和 d_pq 会经过 AR(1) 记忆项后返回调用方;d_v 在最终阶段被强制设为 0,相关 dv_eddymix_gwd 更新和诊断输出被注释掉。因此复现时不能仅根据接口名假设经向风混合 tendency 被启用。
定义的符号
| 符号 |
类型 |
行号 |
作用 |
nonoro_gwd_mix_mod |
module |
1 |
保存非地形重力波诱导混合开关、记忆数组和入口例程 |
du_eddymix_gwd |
allocatable save array |
5 |
纬向风混合 tendency 的跨步记忆项 |
dv_eddymix_gwd |
allocatable save array |
6 |
经向风混合 tendency 记忆数组;当前主例程不更新有效值 |
dh_eddymix_gwd |
allocatable save array |
7 |
位温混合 tendency 的跨步记忆项 |
dq_eddymix_gwd |
allocatable save array |
8 |
tracer 混合 tendency 的跨步记忆项 |
de_eddymix_rto |
allocatable save array |
9 |
总扩散系数 d_eddy_mix_tot 的 AR(1) 记忆项 |
df_eddymix_flx |
allocatable save array |
10 |
已分配并参与重启读取的通量记忆数组;当前文件未写入 |
calljliu_gwimix |
logical save |
11 |
控制是否在 physiq 中启用本混合方案 |
NONORO_GWD_MIX |
subroutine |
19 |
主计算入口,返回混合造成的温度、风和 tracer tendency |
ini_nonoro_gwd_mix |
subroutine |
772 |
按 ngrid/nlayer/nq 分配模块保存数组 |
end_nonoro_gwd_mix |
subroutine |
789 |
释放模块保存数组 |
依赖的模块
| use 模块 |
only 列表 |
用途 |
待确认 |
comcstfi_h |
g, pi, r, rcp |
重力加速度、圆周率、气体常数和 Exner 指数;参与高度、Brunt-Vaisala 频率、温度换算 |
- |
ioipsl_getin_p_mod |
getin_p |
首调用时读取 nonoro_gwd_* 和 nonoro_gwimixing_* 调参键 |
- |
vertical_layers_mod |
presnivs |
用参考半层压力决定可复现的发射层 LAUNCH |
- |
geometry_mod |
cell_area |
用格点面积限制最小可解析水平波数 kstar |
- |
write_output_mod |
write_output |
输出风切变、混合扩散系数、U/V 混合通量和 du_eddymix_gwd 诊断 |
- |
调用的关键例程
| 被调用例程 |
所在模块 / 文件 |
调用位置 |
作用 |
getin_p |
ioipsl_getin_p_mod |
206-230 |
读取 epflux_max、sat、rdiss、kmax/kmin、xlaunch、eff/eff1/vdl |
abort_physic |
外部物理错误处理 |
236, 239 |
检查 DTIME <= DELTAT 和 nlayer >= NW,失败时中止 |
write_output |
write_output_mod |
551, 665, 716-717, 749 |
写出诊断变量 |
ini_nonoro_gwd_mix |
本文件 |
phys_state_var_init_mod.F90:180-181 |
物理状态初始化时分配本模块数组 |
end_nonoro_gwd_mix |
本文件 |
phys_state_var_init_mod.F90:180 |
重新分配前释放旧数组 |
NONORO_GWD_MIX |
本文件 |
physiq_mod.F:1784-1793 |
在 calllott_nonoro 且 calljliu_gwimix 为真时计算混合 tendency |
输入
| 输入 |
来源 |
类型/维度 |
单位 |
含义 |
ngrid, nlayer, nq |
physiq |
integer scalar |
- |
水平格点数、垂直层数和 tracer 数 |
DTIME |
physiq 的 ptimestep |
real scalar |
s |
物理时间步 |
cpnew, rnew |
physiq 当前大气热力属性 |
real (ngrid,nlayer) |
J kg-1 K-1 / J kg-1 K-1 |
层内比热和气体常数,用于 Brunt-Vaisala 频率与密度 |
pp |
physiq 的 zplay |
real (ngrid,nlayer) |
Pa |
全层压力 |
zmax_therm |
physiq 的 zmax_th |
real (ngrid) |
m |
热羽最大高度;当前源码接口保留但未实际使用 |
pt, pu, pv |
physiq 状态 |
real (ngrid,nlayer) |
K, m/s, m/s |
当前温度、纬向风、经向风 |
pq |
physiq tracer 状态 |
real (ngrid,nlayer,nq) |
tracer 混合比 |
被混合的 tracer 场 |
pht |
physiq 的 zh |
real (ngrid,nlayer) |
源码按位温使用 |
位温或位温相关场 |
pdt, pdu, pdv, pdq, pdht |
physiq 已累积 tendency |
real arrays |
K/s, m/s2, tracer/s, 位温/s |
本方案用 state + DTIME*tendency 构造当前背景 |
输出
| 输出 |
去向 |
类型/维度 |
单位 |
含义 |
d_t |
physiq 中加到 pdt |
real (ngrid,nlayer) |
K/s |
重力波混合导致的温度 tendency,由位温 tendency 换算 |
d_u |
physiq 中加到 pdu |
real (ngrid,nlayer) |
m/s2 |
重力波混合导致的纬向风 tendency |
d_v |
physiq 中加到 pdv |
real (ngrid,nlayer) |
m/s2 |
接口返回经向风 tendency,但源码最终设为 0 |
d_pq |
physiq 中加到 pdq |
real (ngrid,nlayer,nq) |
tracer/s |
tracer 混合 tendency |
du_eddymix_gwd, dh_eddymix_gwd, dq_eddymix_gwd, de_eddymix_rto |
模块保存状态 |
allocatable save arrays |
同对应 tendency / m2 s-1 |
AR(1) 平滑记忆,供下一步继续使用 |
共享状态与副作用
calljliu_gwimix 由 conf_phys.F:371-373 通过 getin_p("calljliu_gwimix", calljliu_gwimix) 读取,默认 .false.。
ini_nonoro_gwd_mix 分配 du_eddymix_gwd/dv_eddymix_gwd/dh_eddymix_gwd/dq_eddymix_gwd/de_eddymix_rto/df_eddymix_flx;end_nonoro_gwd_mix 对应释放。
- 这些模块变量均声明为 OpenMP
THREADPRIVATE,包含开关、记忆数组和首调用调参变量。
- 首次进入
NONORO_GWD_MIX 会向标准输出打印激活信息和调参值,并读取多个 callphys.def 键。
- 诊断输出包括
zonal_shear、nonoro_d_mixing_tot、nonoro_u_mixing_tot、nonoro_v_mixing_tot 和 du_eddymix_gwd。
phyetat0_mod.F90 会尝试从 startphy_file 读取 du_eddymix_gwd、dh_eddymix_gwd、dv_eddymix_gwd、dq_eddymix_gwd、de_eddymix_rto 和 df_eddymix_flx;若没有重启文件字段则清零。
核心逻辑
- 首调用时读取调参键,设置默认
epflux_max=5.E-4、sat=1.5、rdiss=0.07、kmax=1.E-4、kmin=7.E-6、xlaunch=0.6、eff=0.1、eff1=0.1、vdl=1.5,并检查物理时间步和层数。
- 用传入状态加上已累积 tendency 得到背景
tt/uu/vv/zq/hh,再用 rho = pp/(rnew*tt) 计算密度。
- 在半层上构造压力、对数压力高度、半层风和 Brunt-Vaisala 频率;用
presnivs 和 xlaunch 决定可复现的发射层 LAUNCH。
- 对
NW=NK*NP*NO=8 个离散重力波,用温度和风场派生的 MOD(...) 数值构造水平波数、方位角、相速、内禀频率和发射层 EP flux。
- 从
LAUNCH 向上推进 EP flux:每层同时考虑守恒、耗散、临界层变号截断和饱和上限,得到 wwp_vertical_tot。
- 对每个波和格点寻找饱和/破碎层
LLSATURATION,再计算饱和层上方和下方的涡混合系数 d_eddy_mix_p_ll 与 d_eddy_mix_m_ll。
- 用涡混合系数乘以垂直梯度,形成 U、V、位温和 tracer 的混合通量;对所有波求和后得到半层通量。
- 在低层对
LAUNCH 以下的几层做通量补偿,使总混合通量闭合。
- 对通量做垂直差分得到
d_u、d_h 和 d_pq,再通过 DTIME/DELTAT/REAL(NW) 与上一时刻记忆项做 AR(1) 平滑。
- 将
d_h 转换为温度 tendency d_t;将 d_v 强制清零;更新模块记忆数组供下一步使用。
伪代码
if firstcall:
read nonoro_gwd_* and nonoro_gwimixing_* parameters
abort if DTIME > 24 h or nlayer < 8
background = current state + DTIME * accumulated tendencies
compute density, half-level pressure, log-pressure height, half-level wind, BV
LAUNCH = highest reference half-level satisfying HREF(level)/HREF(surface) > xlaunch
for each wave jw and grid column:
derive azimuth, wavenumber, phase speed and launch EP flux from background fields
for level from LAUNCH to nlayer-1:
update intrinsic frequency
limit EP flux by dissipation, critical-level sign change and saturation
find each wave's saturation/breaking layer
compute eddy diffusivity above and below the breaking layer
convert diffusivity times vertical gradients into U/V/H/tracer fluxes
close low-level flux below LAUNCH
d_u, d_h, d_pq = vertical divergence of fluxes
apply AR(1) smoothing using saved module arrays
d_t = d_h * (pressure / surface_half_pressure)**rcp
d_v = 0
save updated memory arrays
参与的主题流程
| 主题 |
参与方式 |
| 非地形重力波 |
在 calllott_nonoro 分支内、FLott 随机非地形 GW 方案之后追加 J. Liu GW-induced mixing tendency |
主物理时间步 physiq |
physiq 把 d_t_mix/d_u_mix/d_v_mix/zdq_mix 累加到 pdt/pdu/pdv/pdq |
| tracer 输运 / 混合 |
对所有 nq tracer 计算垂直混合通量并返回 d_pq |
| 重启状态 |
多个 *_eddymix_* 记忆数组由 phyetat0_mod.F90 读取或清零 |
写法特点
- 模块级保存数组和多个调参变量均为
THREADPRIVATE,并通过 ini_nonoro_gwd_mix 分配。
- 波参数的“随机性”来自当前背景场的
MOD(TT(...), 1.) 和 MOD(UU**2+VV**2, 1.),不是 Fortran 随机数发生器;注释说明这是为了可复现性。
DELTAT=24*3600 是方案生命周期时间尺度;输出 tendency 用 DTIME/DELTAT/REAL(NW) 缩放并混合旧记忆项。
cell_area 通过 kstar=pi/sqrt(cell_area) 限制最小水平波数,避免波长超过水平分辨率。
- 源码中存在多处遗留注释和拼写问题,如 “may be need to delet”、
df_eddymix_flx 分配但未在本文件写入;这些不影响本文按当前源码字面记录。
复现要点
- 必须同时开启上游
calllott_nonoro 和本方案 calljliu_gwimix;仅设置 calljliu_gwimix=.true. 不会越过 physiq 外层 IF (calllott_nonoro)。
calljliu_gwimix 默认 .false.,需要在运行配置中显式覆盖。
nonoro_gwd_epflux_max、nonoro_gwd_sat、nonoro_gwd_rdiss、nonoro_gwd_kmax、nonoro_gwd_kmin、nonoro_gwd_xlaunch、nonoro_gwimixing_eff、nonoro_gwimixing_eff1、nonoro_gwimixing_vdl 会改变波发射、耗散和混合强度。
nlayer 必须不少于 NW=8,物理时间步不能超过 24 小时,否则 abort_physic 中止。
- 重启可重复性依赖
du_eddymix_gwd/dh_eddymix_gwd/dq_eddymix_gwd/de_eddymix_rto 等记忆数组是否从 start 文件恢复;缺失时 phyetat0_mod.F90 会清零。
- 不要把
d_v 当作当前启用的经向风混合 tendency;源码在返回前设为 0。
待确认
df_eddymix_flx 在本文件中只分配/释放,并在 phyetat0_mod.F90 中尝试读取;未在本次源码核验中发现写入位置。
zmax_therm 接口参数当前未参与计算;是否为保留的热对流源高度接口需结合历史版本确认。
d_t 从 d_h 转换时使用 (PP(ii,:) / PH(ii,1))**rcp,其中 PH(ii,1) 是由底层全层压力外推得到的半层压力;该换算是否符合目标位温定义需结合 zh/zdh 上游定义进一步确认。
相关页面