yamada4.F
路径
LMDZ.MARS\libf\phymars\yamada4.F
所属目录 / 模块
libf/phymars
文件定位
yamada4.F 定义 Mars 版本的 Mellor-Yamada 湍流闭合模块 yamada4_mod。主例程 yamada4 在 vdifc_mod 的 callyamada4 分支中调用,用风切变、位温梯度、层界面高度、地表拖曳系数和上一时步 q2 更新湍流动能尺度 q2、动量扩散系数 km、标量扩散系数 kn 和 TKE 扩散系数 kq。这些系数随后供垂直扩散求解使用。
源码注释说明该文件由 Earth 版本改成 Mars 版本,并按 iflag_pbl 选择 MY 2.0、MY 2.0 Fournier、MY 2.5、以及带 TKE 垂直扩散的 MY 2.5 分支。模块还包含 vdif_q2 和 vdif_q2e 两个 TKE 垂直扩散辅助例程;当前主例程只在 iflag_pbl==9 时调用隐式 vdif_q2,vdif_q2e 未在本文件内被调用。
定义的符号
| 符号 |
类型 |
行号 |
作用 |
yamada4_mod |
module |
1 |
Mars 版 Mellor-Yamada 湍流闭合模块。 |
yamada4 |
subroutine |
16 |
更新 q2/km/kn/kq 的主闭合例程。 |
vdif_q2 |
subroutine |
623 |
对 q2 做压力坐标隐式垂直扩散。 |
vdif_q2e |
subroutine |
700 |
对 q2 做显式垂直扩散;当前主例程未调用。 |
frif, falpha, fsm |
statement functions |
117-119 |
由 Richardson 数/flux Richardson 数计算闭合函数。 |
fl |
statement function |
120-122 |
计算混合长度,结合 l0、高度、q2 和稳定度限制。 |
q2min/q2max/knmin/kmmin |
saved real |
126-130 |
Mars 数值上下限;knmin/kmmin 当前未见实际使用。 |
依赖的模块
| use 模块 |
only 列表 |
用途 |
待确认 |
tracer_mod |
noms |
首次调用时扫描 tracer 名称,寻找 co2 并准备分子量修正系数。 |
CO2 修正计算当前被注释掉,实际 teta=phc。 |
turb_mod |
l0 |
读写混合长度积分尺度 l0。 |
- |
调用的关键例程
| 被调用例程 |
所在模块 / 文件 |
调用位置 |
作用 |
vdif_q2 |
本文件 |
iflag_pbl==9 分支 |
对 q2 做隐式垂直扩散。 |
abort_physic |
外部错误处理 |
iflag_pbl 非 6..10 |
配置不一致时中止。 |
sqrt, max, min, ceiling |
Fortran intrinsic |
多处 |
计算稳定度函数、上下限和内部子步数。 |
输入
| 输入 |
来源 |
类型 / 维度 |
单位 |
含义 |
ngrid, nlay, nq |
vdifc 调用方 |
integer |
- |
网格点数、垂直层数、tracer 数。 |
dt |
调用方 |
real |
s |
物理时间步。 |
g, rconst |
调用方 |
real |
SI |
重力加速度和气体常数。 |
plev(ngrid,nlay+1) |
调用方 |
real |
Pa |
层界面压力,供 vdif_q2 使用。 |
temp(ngrid,nlay) |
调用方 |
real |
K |
温度,供 vdif_q2 压力坐标扩散使用。 |
zlev(ngrid,nlay+1), zlay(ngrid,nlay) |
调用方 |
real |
m |
层界面和层中心高度。 |
u, v |
调用方 |
real (ngrid,nlay) |
m s-1 |
层中心水平风。 |
phc |
调用方 |
real (ngrid,nlay) |
K-like |
位温或热力变量,当前直接用于稳定度。 |
pq(ngrid,nlay,nq) |
调用方 |
real |
mixing ratio |
tracer 场;CO2 分子量修正代码当前注释。 |
cd(ngrid) |
调用方 |
real |
- |
地表拖曳系数。 |
q2(ngrid,nlay+1) |
调用方 |
real inout |
m2 s-2 |
湍流速度尺度平方。 |
ustar(ngrid) |
调用方 |
real |
m s-1 |
摩擦速度,用于稳定层最小扩散约束。 |
iflag_pbl |
配置/调用方 |
integer |
- |
选择 MY 方案分支,源码允许 6..10。 |
输出
| 输出 |
去向 |
类型 / 维度 |
单位 |
含义 |
q2 |
调用方 / turb_mod 状态链 |
real (ngrid,nlay+1) |
m2 s-2 |
更新后的湍流速度尺度平方。 |
km |
调用方 |
real (ngrid,nlay+1) |
m2 s-1 |
动量湍流扩散系数。 |
kn |
调用方 |
real (ngrid,nlay+1) |
m2 s-1 |
标量湍流扩散系数。 |
kq |
调用方 |
real (ngrid,nlay+1) |
m2 s-1 |
q2 垂直扩散系数。 |
l0 |
turb_mod |
module array |
m |
混合长度积分尺度,被本例程迭代更新。 |
共享状态与副作用
first、ipas、ric/rifc/b1/kap、firstcall、q2min/q2max/knmin/kmmin、ico2/A/B 均为 SAVE / THREADPRIVATE 状态。
firstcall 只在首次调用扫描 tracer_mod:noms 查找 co2,并计算 CO2 分子量修正系数;但实际修正 teta=phc*(A*pq+B) 代码被注释,当前总是 teta=phc。
l0 来自 turb_mod,本例程会按 sqrt(q2) 加权高度积分更新它。
- 当
iflag_pbl 不在 6..10 时,例程调用 abort_physic 中止。
核心逻辑
- 首次调用扫描 tracer 名称,若存在
co2 则准备 A/B 分子量系数;当前实际稳定度变量直接取 teta=phc。
- 用
ndt=ceiling(3840./(3699.*24./dt)) 计算 MY 2.5 分支的内部子步数。
- 校验
iflag_pbl 在 6..10。
- 计算层厚倒数、层中心间距、风切变平方
m2、位温梯度、Brunt-Vaisala 频率平方 n2、Richardson 数 ri、rif/alpha/sm 和 zz。
- 初始或
iflag_pbl==6 时迭代 10 次估计混合长度 l、q2 和积分尺度 l0。
- 每次调用根据当前
q2 更新 l0,再计算界面混合长度 l。
iflag_pbl==6:MY 2.0,直接令 q2=l**2*zz。
iflag_pbl==7:Fournier 分支,用前一步 km/mpre 估计准静态风切变并更新 q2。
iflag_pbl>=8:MY 2.5 分支,在 ndt 个内部子步中半隐式更新 q2;iflag_pbl==9 时额外调用 vdif_q2 做 TKE 垂直扩散。
- 对非
iflag_pbl==9 分支,根据 km=l*sqrt(q2)*sm、kn=km*alpha、kq=l*sqrt(q2)*0.2 计算扩散系数并设置顶/底边界。
- 最后对稳定边界层施加 Holtslag-Boville 风格的最小扩散约束,并据此回写
q2/km/kn/kq。
伪代码
yamada4(...):
on first call:
find CO2 tracer index and prepare molecular-mass coefficients
teta = phc
require 6 <= iflag_pbl <= 10
compute vertical differences, shear m2, stability n2
compute rif, alpha, sm, zz
if first or iflag_pbl == 6:
initialize l0, iterate l and q2 10 times
update l0 from sqrt(q2)-weighted height
compute l at interfaces
if iflag_pbl == 6:
q2 = l**2 * zz
else if iflag_pbl == 7:
update q2 from Fournier quasi-static branch
else if iflag_pbl >= 8:
for each internal substep:
update q2 with MY 2.5 formula
clamp q2 to q2min/q2max
if iflag_pbl == 9:
compute km/kn/kq and call vdif_q2()
if iflag_pbl != 9:
compute km/kn/kq from l, sqrt(q2), sm, alpha
apply stable-layer minimum K constraint
参与的主题流程
| 主题 |
参与方式 |
| 垂直湍流扩散 |
为 vdifc 提供动量和标量扩散系数。 |
| PBL / TKE 演化 |
读写 q2 和 l0,按 MY 分支更新湍流速度尺度。 |
| 热羽流耦合约束 |
conf_phys 中 calltherm 开启时会建议搭配 callyamada4 和 callrichsl。 |
| CO2 大气热力 |
源码保留 CO2 tracer 分子量修正准备逻辑,但实际修正路径被注释。 |
写法特点
- 文件为固定格式 Fortran 风格,使用 statement functions
frif/falpha/fsm/fl。
fl 形式上有参数,但实际表达式直接使用外层 ig/k 和 zlev/q2/n2/l0,阅读时应按内联函数理解。
iflag_pbl=10 通过合法性检查,并进入 iflag_pbl>=8 分支;但垂直扩散只在 iflag_pbl==9 执行,注释也只说明到 9。
- 诊断数组
rino/smyam/styam/... 位于 if(1.eq.0) 块内,当前不会执行。
复现要点
iflag_pbl 必须在 6..10;不同值对应不同 q2 时间推进方式。
zlev/zlay 必须严格单调并避免零层厚;源码直接用差值取倒数。
q2 会被夹在 q2min=1e-10 与 q2max=1e2 之间,影响强不稳定或数值爆发场景。
iflag_pbl==9 会对子步后的 q2 调用 vdif_q2;其他分支不会执行该隐式扩散。
- 稳定层最小扩散约束依赖
ustar 和 ngrid:1D 用 kminfact=0.3,3D 用 0.45。
待确认
iflag_pbl=10 的预期物理含义需确认:它通过检查并走 >=8 的 q2 更新,但不触发 ==9 的 vdif_q2 垂直扩散。
- CO2 分子量修正代码被注释后,
pq 和首次扫描出的 ico2/A/B 对当前计算没有实际影响;是否为有意停用需结合版本历史确认。
knmin/kmmin 定义了 Mars 下限但当前未见用于最终夹值。
相关页面