vdif_kc.F

路径

LMDZ.MARS\libf\phymars\vdif_kc.F

所属目录/模块

libf/phymars

文件定位

vdif_kc.Fvdifc_mod.F 在未启用 callyamada4 且未启用 callatke 时使用的垂直湍流扩散 K 系数方案。它根据层界面高度、层中心高度、风速、位温、地表拖曳系数和上一时步/输入的 q2,更新湍流速度尺度 q=sqrt(q2),并输出动量扩散系数 km 与标量扩散系数 kn。在 vdifc_mod.F 中,km/kn 对应后续隐式扩散使用的 zkv/zkh

该例程还会在首次调用时从 tracer_mod:noms 查找 "co2" tracer。如果存在 CO2 tracer,它用 CO2 质量混合比构造一个修正的稳定度变量 zhc,使 Brunt-Vaisala 型稳定度项包含平均分子量变化的影响。

定义的符号

符号 类型 行号 作用
vdif_kc_mod module 1 垂直湍流扩散 K 系数方案模块
vdif_kc subroutine 7 计算并更新 q2、动量扩散系数 km 和标量扩散系数 kn
ico2 saved local integer 215 首次调用时缓存 "co2" tracer 的索引;0 表示未找到
A, B saved local real 220 CO2 平均分子量修正中 1/Mair = A*qco2 + B 的系数
firstcall saved local logical 225 控制 CO2 tracer 查找只在每个 OpenMP 线程首次调用时执行

依赖的模块

use 模块 only 列表 用途 待确认
tracer_mod noms 首次调用时扫描 tracer 名称,查找 "co2" 的数组索引

调用的关键例程

被调用例程 所在模块/文件 调用位置 作用
无外部例程调用 只使用 sqrtamax1 等 Fortran 内建函数

上游调用点

调用方 源码位置 调用条件 传入/接收关系
vdifc_mod.F::vdifc vdifc_mod.F:40,475-477 callyamada4=.false.callatke=.false. 传入 pzlev/pzlay/pu/pv/ph/zcdv_true_tmp/pq2/zq;接收 pq2zkvzkh

输入

输入 来源 类型/维度 单位 含义
ngrid 调用方 vdifc integer 水平网格点数
nlay 调用方 vdifc integer 垂直层数
nq 调用方 vdifc integer tracer 数量
dt vdifc 传入 ptimestep real s 物理时间步长
g 物理常数 real m/s^2 重力加速度
zlev(ngrid,nlay+1) 垂直网格 real m 层界面高度;第 nlay+1 列是顶界面
zlay(ngrid,nlay) 垂直网格 real m 层中心高度
u(ngrid,nlay) / v(ngrid,nlay) 动力场 real m/s 层中心水平风速,输入为时间步开始值
teta(ngrid,nlay) 热力场 real K 层中心位温,输入为时间步开始值
cd(ngrid) vdif_cd/地表层交换 real 1 地表动量拖曳系数
zq(ngrid,nlay,nq) tracer 场 real kg/kg 只在存在 "co2" tracer 时读取 CO2 质量混合比
q2(ngrid,nlay+1) vdifc 的湍流状态 real, inout m^2/s^2(速度平方) 层界面上的 q^2,输入旧值,输出更新值

输出

输出 去向 类型/维度 单位 含义
q2(ngrid,nlay+1) vdifc 后续扩散流程 real, inout m^2/s^2 更新后的湍流速度尺度平方
km(ngrid,nlay+1) vdifc 中的 zkv real, out m^2/s 动量湍流扩散系数
kn(ngrid,nlay+1) vdifc 中的 zkh real, out m^2/s 标量/热量湍流扩散系数

共享状态与副作用

核心逻辑

  1. 首次 CO2 tracer 定位(行 236-255):若 firstcall 为真,遍历 noms(1:nq) 查找名称等于 "co2" 的 tracer。找到后设置 ico2,并用 m_co2=44.01e-3 kg/molm_noco2=33.37e-3 kg/mol 预计算 AB。之后 firstcall=.false.
  2. 构造稳定度用变量 zhc(行 270-279):若 ico2 非 0,则 zhc = teta * (A*zq(:,:,ico2)+B);否则 zhc=teta。后续 n2 使用 zhc 的层间差分而不是原始 teta
  3. 初始化 q2/q 与地表边界(行 285-297):所有界面 q2 至少为 q2min=1e-3;最底界面 q2(:,1)b1^(2/3) * cd * (u1^2+v1^2) 重新给定并同样裁剪下限。
  4. 计算垂直几何倒数(行 313-327)unsdz 是层厚倒数,unsdzdec 是相邻层中心或边界到层中心的距离倒数。源码注释特别提醒顶界面 zlev(:,nlev) 必须由调用方提供。
  5. 计算剪切与稳定度(行 331-380):底界面剪切由第一层风速除以近地距离得到;内部界面 n2g * dz^-1 * 2*(zhc_l-zhc_{l-1})/(zhc_l+zhc_{l-1}) 计算,若为负则置 0。内部剪切 m2 来自相邻层风速差,顶界面复制倒数第二个界面。
  6. Blackadar 混合长度与稳定度函数(行 387-449):混合长度 long = kappa*z/(1+z/long0),其中 kappa=0.4long0=160 mgn=-long^2*n2/q2 被限制到 [-10,0.0233],再计算 snsm;若 gn 被截断或导数项符号不合理,snq2/smq2 被置 0。
  7. 初始 kn/km(行 457-486):底界面取 knmin=kmmin=1e-5;内部界面按 long*q*snlong*q*sm 计算;顶界面复制倒数第二个界面。
  8. 内部界面稳态耦合求解(行 497-605):对 ilev=2:nlev-1,先把剪切生产、浮力项和耗散项拆成 qq^3q*m2q^3*m2 贡献;然后求一个使局地 q2 方程与速度梯度方程同时达到稳态的 m2cstat/qcstatilev=2 使用地表拖曳 cd 的特殊边界项,其余界面使用上下相邻界面的 kmpre/mpre
  9. 最终裁剪与重算扩散系数(行 584-605):若新 q2 小于 q2min,重置为下限;随后用新 q2 重新计算 gn/sn/sm 以及最终 kn/km
  10. 上下边界收尾(行 616-622):底界面 kn/km 再次设为最小值;顶界面 q2/q/kn/km 复制倒数第二个界面。

伪代码

vdif_kc:
  if firstcall:
    ico2 = index of "co2" in noms, or 0
    if ico2 exists:
      A = 1/m_co2 - 1/m_noco2
      B = 1/m_noco2
    firstcall = false

  if ico2 exists:
    zhc = teta * (A*zq(:,:,ico2) + B)
  else:
    zhc = teta

  q2 = max(q2, q2min)
  q = sqrt(q2)
  q2(:,1) = max(b1^(2/3) * cd * (u(:,1)^2 + v(:,1)^2), q2min)

  compute layer-thickness inverses unsdz and center-distance inverses unsdzdec
  compute shear m2/m and stable stratification n2
  if n2 < 0: n2 = 0

  for internal interfaces:
    long = Blackadar(kappa, long0, height_above_surface)
    gn = clamp(-long^2*n2/q2, gnmin, gnmax)
    sn, sm = stability_functions(gn)
    snq2, smq2 = Taylor q2 derivative terms, or 0 if clipped/sign mismatch
    kn = long*q*sn
    km = long*q*sm

  for internal interfaces:
    split q2 source terms into q, q^3, q*m2, q^3*m2
    solve stationary coupled q2/shear estimate:
      m2cstat = m2 - source_sum/(dt*2*km)
      mcstat = sqrt(m2cstat)
      if lowest internal interface:
        include surface-drag boundary term with cd
      else:
        use neighboring kmpre/mpre
      qcstat = (kmcstat / (sm/q2) / long)^(1/3)
    q2 = max(qcstat^2, q2min)
    recompute sn/sm and final kn/km

  bottom kn/km = minimum values
  top q2/q/kn/km = values from previous interface

参与的主题流程

主题 参与方式
边界层垂直扩散 vdifc 中为动量和标量隐式扩散提供 zkv/zkh
地表-大气耦合 通过 cd 把地表拖曳系数接入底界面 q2 和最低内部界面的稳态剪切求解
CO2 循环/大气组成 若 tracer 列表含 "co2",用 CO2 质量混合比修正稳定度变量 zhc
tracer 垂直混合 kn 作为标量扩散系数参与 vdifc 后续对热量和 tracer 的垂直扩散

写法特点

复现要点

待确认

相关页面