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.Fcalllott_nonoro 分支内、且 calljliu_gwimix 为真时额外调用的混合方案:根据当前温度、风、位温和 tracer 场构造离散重力波,计算 EP flux 随高度的耗散、临界层和饱和,再把得到的涡混合通量转成温度、纬向风、经向风和 tracer tendency。

源码中的实际输出有一个重要不对称:d_ud_td_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_maxsatrdisskmax/kminxlauncheff/eff1/vdl
abort_physic 外部物理错误处理 236, 239 检查 DTIME <= DELTATnlayer >= 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_nonorocalljliu_gwimix 为真时计算混合 tendency

输入

输入 来源 类型/维度 单位 含义
ngrid, nlayer, nq physiq integer scalar - 水平格点数、垂直层数和 tracer 数
DTIME physiqptimestep real scalar s 物理时间步
cpnew, rnew physiq 当前大气热力属性 real (ngrid,nlayer) J kg-1 K-1 / J kg-1 K-1 层内比热和气体常数,用于 Brunt-Vaisala 频率与密度
pp physiqzplay real (ngrid,nlayer) Pa 全层压力
zmax_therm physiqzmax_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 physiqzh 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) 平滑记忆,供下一步继续使用

共享状态与副作用

核心逻辑

  1. 首调用时读取调参键,设置默认 epflux_max=5.E-4sat=1.5rdiss=0.07kmax=1.E-4kmin=7.E-6xlaunch=0.6eff=0.1eff1=0.1vdl=1.5,并检查物理时间步和层数。
  2. 用传入状态加上已累积 tendency 得到背景 tt/uu/vv/zq/hh,再用 rho = pp/(rnew*tt) 计算密度。
  3. 在半层上构造压力、对数压力高度、半层风和 Brunt-Vaisala 频率;用 presnivsxlaunch 决定可复现的发射层 LAUNCH
  4. NW=NK*NP*NO=8 个离散重力波,用温度和风场派生的 MOD(...) 数值构造水平波数、方位角、相速、内禀频率和发射层 EP flux。
  5. LAUNCH 向上推进 EP flux:每层同时考虑守恒、耗散、临界层变号截断和饱和上限,得到 wwp_vertical_tot
  6. 对每个波和格点寻找饱和/破碎层 LLSATURATION,再计算饱和层上方和下方的涡混合系数 d_eddy_mix_p_lld_eddy_mix_m_ll
  7. 用涡混合系数乘以垂直梯度,形成 U、V、位温和 tracer 的混合通量;对所有波求和后得到半层通量。
  8. 在低层对 LAUNCH 以下的几层做通量补偿,使总混合通量闭合。
  9. 对通量做垂直差分得到 d_ud_hd_pq,再通过 DTIME/DELTAT/REAL(NW) 与上一时刻记忆项做 AR(1) 平滑。
  10. 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 physiqd_t_mix/d_u_mix/d_v_mix/zdq_mix 累加到 pdt/pdu/pdv/pdq
tracer 输运 / 混合 对所有 nq tracer 计算垂直混合通量并返回 d_pq
重启状态 多个 *_eddymix_* 记忆数组由 phyetat0_mod.F90 读取或清零

写法特点

复现要点

待确认

相关页面