yamada4.F

路径

LMDZ.MARS\libf\phymars\yamada4.F

所属目录 / 模块

libf/phymars

文件定位

yamada4.F 定义 Mars 版本的 Mellor-Yamada 湍流闭合模块 yamada4_mod。主例程 yamada4vdifc_modcallyamada4 分支中调用,用风切变、位温梯度、层界面高度、地表拖曳系数和上一时步 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_q2vdif_q2e 两个 TKE 垂直扩散辅助例程;当前主例程只在 iflag_pbl==9 时调用隐式 vdif_q2vdif_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 混合长度积分尺度,被本例程迭代更新。

共享状态与副作用

核心逻辑

  1. 首次调用扫描 tracer 名称,若存在 co2 则准备 A/B 分子量系数;当前实际稳定度变量直接取 teta=phc
  2. ndt=ceiling(3840./(3699.*24./dt)) 计算 MY 2.5 分支的内部子步数。
  3. 校验 iflag_pbl 在 6..10。
  4. 计算层厚倒数、层中心间距、风切变平方 m2、位温梯度、Brunt-Vaisala 频率平方 n2、Richardson 数 ririf/alpha/smzz
  5. 初始或 iflag_pbl==6 时迭代 10 次估计混合长度 lq2 和积分尺度 l0
  6. 每次调用根据当前 q2 更新 l0,再计算界面混合长度 l
  7. iflag_pbl==6:MY 2.0,直接令 q2=l**2*zz
  8. iflag_pbl==7:Fournier 分支,用前一步 km/mpre 估计准静态风切变并更新 q2
  9. iflag_pbl>=8:MY 2.5 分支,在 ndt 个内部子步中半隐式更新 q2iflag_pbl==9 时额外调用 vdif_q2 做 TKE 垂直扩散。
  10. 对非 iflag_pbl==9 分支,根据 km=l*sqrt(q2)*smkn=km*alphakq=l*sqrt(q2)*0.2 计算扩散系数并设置顶/底边界。
  11. 最后对稳定边界层施加 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 演化 读写 q2l0,按 MY 分支更新湍流速度尺度。
热羽流耦合约束 conf_physcalltherm 开启时会建议搭配 callyamada4callrichsl
CO2 大气热力 源码保留 CO2 tracer 分子量修正准备逻辑,但实际修正路径被注释。

写法特点

复现要点

待确认

相关页面