vdifc_mod.F

路径

LMDZ.MARS\libf\phymars\vdifc_mod.F

所属目录 / 模块

libf/phymars
MODULE vdifc_mod

文件定位

vdifc_mod.Fphymars 物理包的垂直扩散主模块。主例程 vdifcphysiq_mod.F 中由 calldifv 分支调用,接收当前累计的动力、热力和 tracer 物理倾向,把它们先加到工作态,再用隐式垂直扩散求解动量、热量和 tracer 的新增倾向。

这个文件不是单纯的湍流 K 系数例程。它把地表层交换系数、PBL K 系数方案、地表能量平衡、CO2 凝结质量变化、尘埃地表注入、H2O 地表/地下交换、HDO 同位素通量、坡面投影和诊断输出放在同一条时间步流程里。因此它是边界层、地表、尘埃循环和水循环之间的强耦合入口。

定义的符号

符号 类型 行号 作用
vdifc_mod module 1 垂直扩散主模块
vdifc subroutine 7-1441 计算 U/V/位温或焓/tracer 的垂直扩散倾向,更新地表温度倾向、地表 tracer 通量和若干诊断
make_tsub subroutine 1445-1479 根据地表温度倾向和地表冰量为水汽交换选择自适应子时间步数
compute_Tice subroutine 1484-1529 按地下冰深度在土壤温度剖面中线性插值得到地下冰温度

SAVE / THREADPRIVATE 状态

符号 类型 行号 用途
firstcall LOGICAL,SAVE, THREADPRIVATE 139-141 控制首次进入 vdifc 时初始化 CO2 凝结常数和 CO2 tracer 索引
acond, bcond REAL,SAVE, THREADPRIVATE 148-150 CO2 凝结温度公式常数
ccond REAL,SAVE, THREADPRIVATE 202-204 CO2 质量变化方案中温度倾向到凝结质量的系数
ico2 INTEGER,SAVE, THREADPRIVATE 209-215 noms(iq)=="co2" 时记录 CO2 gas tracer 索引
m_co2, m_noco2, A, B REAL,SAVE, THREADPRIVATE 211-215 CO2 和非凝结气体平均分子量换算常数

本文件没有定义 common block。除上述 SAVE 状态外,主要共享状态来自 use 的模块变量,例如 ustar/tstarzdqsdif_ssi_tot 和 tracer 索引。

依赖的模块

use 模块 only 列表 用途 待确认
tracer_mod noms, igcm_*, alpha_lift 查找 CO2 tracer;索引 dust/H2O/HDO/stormdust tracer;按 alpha_lift 生成尘埃注入通量
surfdat_h watercaptag, frost_albedo_threshold, dryness, old_wsublimation_scheme 水冰地表交换、永久冰盖、水汽导度干度缩放和旧升华方案开关
comcstfi_h cpp, r, rcp, g, pi 热容、气体常数、重力、坡面投影等公式
watersat_mod watersat H2O/HDO 路径计算饱和混合比
turb_mod turb_resolved, ustar, tstar 判断是否跳过 CO2 凝结迭代;写出近地层摩擦速度和温度尺度
compute_dtau_mod ti_injection_sol, tf_injection_sol dustinjection=1 时限制尘埃注入的本地时窗口
hdo_surfex_mod hdo_surfex HDO 地表-大气通量计算
dust_param_mod doubleq, submicron, lifting 控制尘埃 tracer 组合和是否启用风起尘/注入
write_output_mod write_output 写出水潜热和地下冰交换诊断
comslope_mod nslope, def_slope_mean, subslope_dist, major_slope, iflat 坡面数量、坡面投影、坡面权重和主坡面选择
microphys_h To 水冰潜热公式和有冰地表温度封顶
paleoclimate_mod coef_ssdif, h2oice_depth, lag_layer, zdqsdif_ssi_tot lag-layer 地下冰交换、地下冰深度和诊断缓存
comsoil_h layer, mlayer, adsorption_soil 地下层网格和是否调用 soilwatercompute_Tice 使用 mlayer
vdif_cd_mod vdif_cd 地表层 Cd/Ch 交换系数
vdif_kc_mod vdif_kc fallback PBL K 系数方案
yamada4_mod yamada4 callyamada4 路径的 Mellor-Yamada K 系数方案
lmdz_call_atke call_atke callatke 路径的 ATKE K 系数方案
dust_windstress_lift_mod dust_windstress_lift 默认风应力起尘通量计算
callkeys_mod callcond, callrichsl, callyamada4, callatke, tke_heat_flux, water, hdo, co2clouds, rdstorm, dustinjection, latentheat_surfwater 控制 CO2 凝结、地表层、PBL、热通量、水循环、HDO、尘埃注入和水潜热路径

调用的关键例程

被调用例程 所在模块 / 文件 调用位置 作用
vdif_cd vdif_cd_mod.F90 416-419, 579-582 先用原始风算地表交换系数和 ustar/tstar,再用摩擦后风重算起尘/升华使用的 Cd/Ch
yamada4 yamada4.F 462-464 callyamada4=.true. 时计算 zkv/zkh/zkq
call_atke lmdz_call_atke.F90 467-470 callatke=.true. 时计算 ATKE 的 zkv/zkh
vdif_kc vdif_kc.F 475-477 非 Yamada4、非 ATKE 时计算 fallback zkv/zkh
dust_windstress_lift dust_windstress_lift.F90 881-883 默认风应力起尘,返回 pdqsdif_tmp
make_tsub 本文件 977-979 为 H2O 地表交换分配子时间步
watersat watersat_mod.F90 1018, 1118, 1180, 1347 计算地表/地下冰温度下的 H2O 饱和混合比
soilwater soilwater.F90 1052-1060 adsorption_soil 时求解地下水汽、吸附水和地下冰交换
compute_Tice 本文件 1113-1116, 1175-1178 对 lag-layer 地下冰温度插值
hdo_surfex hdo_surfex_mod.F 1350-1355 基于 H2O 通量和分馏公式计算 HDO 地表通量
write_output write_output_mod.F90 1388-1407 写出 surf_h2o_lh、SSI 通量和坡面 SSI 通量
abort_physic 外部物理错误处理 1515-1516 compute_Tice 发现地下冰低于最后土壤层时中止

输入

输入 来源 类型 / 维度 单位 含义
ngrid, nlay, nsoil, nq, nqsoil 调用方 physiq integer - 水平格点、垂直层、土壤层、大气 tracer 和土壤 tracer 数
ptimestep physiq real s 当前物理时间步
pplay, pplev 大气网格 real (ngrid,nlay/nlay+1) Pa 层中心和层界面压力
pzlay, pzlev 大气网格 real (ngrid,nlay/nlay+1) m 层中心和层界面高度
pu, pv, ph, pq 当前物理态 real m/s, K 或 J-like, kg/kg 风、热力变量和 tracer 混合比
pdufi, pdvfi, pdhfi, pdqfi 前序物理过程 real 每秒倾向 进入垂直扩散前已经累计的物理倾向
ptsrf, ptsoil, pemis, pcapcal, pfluxsrf 地表/土壤/辐射-土壤耦合 real K, W/m2 等 地表温度、土壤温度、发射率、热容量和地表通量
pqsurf, qsoil, watercap 地表和地下 tracer 储库 real kg/m2 或 soil tracer 单位 地表 tracer、地下水相关 tracer 和永久冰盖储量
ppopsk 热力换算 real (ngrid,nlay) - Exner 因子,用于位温/温度换算
pcondicea_co2microp CO2 云微物理 real (ngrid,nlay) kg/kg/s CO2 微物理凝结倾向;当前 co2clouds 分支中被置零路径覆盖
pz0 地表参数 real (ngrid) m 粗糙度长度
wstar, hfmax 边界层/热羽流上下文 real (ngrid) m/s 等 子网格 gustiness/对流速度尺度;hfmax 在本文件中未见实际使用
dustliftday, local_time 尘埃注入调度 real (ngrid) kg/m2/s 或 sol fraction dustinjection=1 时的日注入量和本地时间窗判断

输出

输出 去向 类型 / 维度 单位 含义
pdudif, pdvdif physiq 累加到全局倾向 real (ngrid,nlay) m/s2 垂直扩散导致的 U/V 倾向
pdhdif physiq real (ngrid,nlay) 热力变量每秒倾向 热力变量垂直扩散倾向,含 CO2 凝结质量变化修正
pdtsrf physiq / 地表更新 real (ngrid,nslope) K/s 地表温度倾向,水潜热路径可再次修正
pdqdif physiq real (ngrid,nlay,nq) kg/kg/s 大气 tracer 垂直扩散倾向
pdqsdif physiq / 地表 tracer 更新 real (ngrid,nq,nslope) kg/m2/s 地表 tracer 通量/储量倾向;尘埃、H2O ice、HDO ice 等在此输出
pq2 湍流共享状态 real (ngrid,nlay+1) m2/s2 PBL 方案更新后的 TKE 速度尺度平方
sensibFlux physiq/诊断 real (ngrid) W/m2 大气到地表的感热通量
pore_icefraction 地下水路径 real (ngrid,nsoil,nslope) - soilwater 返回的孔隙冰饱和度
dwatercap_dif physiq / watercap 更新 real (ngrid,nslope) kg/m2/s 永久水冰盖储量变化倾向

共享状态与副作用

初始化 / firstcall / restart / diagnostic 行为

  1. firstcall 段在行 255-283 执行一次:设置 CO2 凝结公式常数,打印参数,扫描 tracer 名称并为 CO2 gas 建立平均分子量换算系数。
  2. 每个时间步行 296-317 清零所有输出倾向和水/地下冰诊断缓存,避免沿用上一步工作数组。
  3. 行 350-388 根据 callcondico2 计算 CO2 体积分数与凝结温度;未启用或无 CO2 tracer 时采用 vmr_co2=0.95
  4. 本文件没有直接 restart 读写,但会修改 pq2qsoilzdqsdif_ssi_tot 等可能由其他模块初始化或诊断的共享状态。
  5. 诊断输出集中在行 1388-1407,只输出水潜热和地下冰交换相关字段;HDO flux 诊断在源码中保留为注释。

核心流程

1. 准备主坡面状态和隐式系数

行 285-288 从 major_slope(ig) 取主坡面的 ptsrf_tmppqsurf_tmp,供大气主列扩散、起尘和 K 系数路径使用。行 324-344 构造两类隐式系数:za=(pplev(l)-pplev(l+1))/g 表示层空气质量,zb0 是后续把 K 系数或地表导度转为隐式三对角系数的基量。地表层 zb0(:,1)=ptimestep*pplev(:,1)/(r*ptsrf_tmp)

2. 把前序物理倾向加入工作态

行 395-405 计算

zu = pu + pdufi*dt
zv = pv + pdvfi*dt
zh = ph + pdhfi*dt
zq = pq + pdqfi*dt

后面求出的 pd*dif 都是相对于这个“已含前序物理过程”的工作态再增加的垂直扩散倾向。

3. 地表交换系数和 PBL K 系数

第一次 vdif_cd 在行 416-419 用原始风 pu/pv 计算各坡面 zcdv_true/zcdh_true。随后行 423-456 根据 callrichsl 是否包含 gustiness 修正,得到实际地表动量/热量导度 zcdv/zcdh,并写 ustar/tstar

行 461-479 三选一计算垂直 K 系数:

行 480-488 是 1D doubleq 保护:ngrid==1 时内部层 zkh/zkv 下限设为 80

4. 动量 U/V 隐式扩散

行 503-529 解 U,行 544-567 解 V。两者都使用同一 Thomas 算法样式:先从顶层向下递推 zc/zd,再从地表向上回代。地表边界使用 zb(:,1)=zcdv_tmp*zb0(:,1),内部层使用 zb(:,2:nlay)=zkv(:,2:nlay)*zb0(:,2:nlay)。求解后 zu/zv 已包含摩擦后的风廓线。

行 579-619 随后用摩擦后的 zu/zv 第二次调用 vdif_cd。源码注释说明这套风用于起尘和升华,因此尘埃和水汽通量使用的是已经受地表摩擦影响的近地风背景。

5. 热力变量、地表能量平衡和 CO2 凝结

行 637-777 用 zkh/zcdh 对热力变量做隐式扩散,并把大气第一层和地表能量平衡联立。地表温度解包括:

如果 callcond 且非 turb_resolved,行 666-681 会判断是否有层低于 CO2 凝结位温,必要时把 llnt(ig) 设为 300。行 698-771 在收敛循环中更新 zhs/zt,并在 co2clouds=.false. 时根据 zt<ztcond 计算 pdtc/zcondicea/dmice。若 co2clouds=.true.,源码当前把 zcondicea/dmice/pdtc 置零。

多坡面情况下,行 779-801 对非主坡面只重算地表温度倾向 pdtsrf(ig,islope),大气热力廓线仍来自主坡面隐式解。

6. 尘埃和普通 tracer

行 808-889 先计算近地密度 rho=zb0(:,1)/ptimestep,再按 lifting/doubleq/submicron/dustinjection/rdstorm 选择地表尘埃通量:

行 900-957 对“非水汽”tracer 做隐式垂直混合。普通 tracer 在地表层加入 (-pdqsdif_tmp)*ptimestep,并把 pdqsdif_tmp*cos(slope) 写入每个坡面的 pdqsdifh2o_icehdo_ice 在这里走无地表注入的特例;真正的 H2O 地表冰增减由后面的 h2o_vap 专段覆盖。

7. H2O 地表、地下和坡面交换

行 959-1315 是 H2O 水汽专段,已有更细的 section 页:vdifc-water-surface-exchange。主文件页保留复现主线:

  1. 每个坡面先把 pqsurf(h2o_ice)watercap 除以 cos(slope),转成真实坡面面积上的储量。
  2. make_tsub 根据 pdtsrf、地表冰量、watercaptagdtmax=0.5 K 选择子时间步数。
  3. 每个子步用 zcdvzcdh 作为地表导度,并乘 dryness,对水汽做隐式扩散,地表边界拉向 watersat(ztsrf,pplev(:,1))qsat
  4. adsorption_soil 时调用 soilwater,把地下水汽、吸附水、地下冰与大气边界条件耦合;否则在 lag_layerh2oice_depth>0 时走地下冰-大气或地下冰-霜通量。
  5. latentheat_surfwater 时用源码中的水冰升华潜热公式修正 pdtsrf;有冰时温度上升被封顶到 To
  6. 子步结束后写 pdqsdif(h2o_ice,islope)dwatercap_difzdqsdif_ssi_atm_tot/frost_tot/ssi_tot,再把坡面水汽廓线按 subslope_dist 平均回大气主列。

这个段落是地表/水循环核心耦合点:它同时改变地表水冰、永久水冰盖、地下水相关 tracer、近地水汽、地表温度倾向和地下冰诊断通量。

8. HDO 地表交换

行 1317-1380 在 hdoiq==igcm_hdo_vap 时执行。它先对 HDO vapor 建立与普通 tracer 类似的垂直混合系数,再逐坡面调用 hdo_surfex。调用输入包括 H2O 专段保存的 saved_h2o_vap、更新后地表温度的 qsat_tmp、H2O/HDO 地表通量数组以及 dwatercap_difhdo_surfex 返回坡面 hdoflux,随后按 subslope_dist 平均成 hdoflux_meshavg 并作为地表通量边界条件更新 HDO vapor 廓线。

9. 诊断和最终倾向

行 1388-1407 写水潜热和地下冰交换诊断。行 1424-1439 把工作态差分成输出倾向:

pdudif = (zu - (pu+pdufi*dt))/dt
pdvdif = (zv - (pv+pdvfi*dt))/dt
pdhdif = (zhs - (ph+pdhfi*dt + latcond*dmice/cpp/ppopsk))/dt
pdqdif = (zq - (pq+pdqfi*dt))/dt

physiq_mod.F 的调用点随后把这些倾向累加到全局物理倾向,并把 dwatercap_dif 加到 dwatercap

伪代码

vdifc:
  if firstcall:
    initialize CO2 condensation constants
    find co2 tracer index in noms(:)

  select major-slope surface state
  zero all output tendencies and water/SSI diagnostics
  build za and zb0 implicit-diffusion coefficients
  compute CO2 vmr and condensation temperature if callcond

  zu,zv,zh,zq = state + incoming physical tendencies * dt

  call vdif_cd with original pu,pv
  derive zcdv/zcdh, ustar/tstar on major slope
  choose PBL K path:
    if callyamada4: call yamada4
    else if callatke: call call_atke
    else: call vdif_kc
  if doubleq and 1D: enforce zkv/zkh >= 80 inside the column

  solve implicit U diffusion using zkv and surface zcdv
  solve implicit V diffusion using zkv and surface zcdv

  call vdif_cd again with friction-modified zu,zv
  recompute conductances for lifting and sublimation

  solve implicit thermal diffusion plus surface energy balance
  if callcond: iterate CO2 condensation mass correction unless co2clouds path zeros it
  solve non-major slope surface temperature tendencies

  if lifting:
    compute dust/stormdust/submicron surface flux by configured branch
  else:
    dust flux = 0

  for each tracer:
    if normal tracer branch:
      solve implicit tracer diffusion
      apply dust-like surface source except h2o_ice/hdo_ice special cases
      write pdqsdif across slopes

    if water and tracer is h2o_vap:
      for each slope and grid point:
        choose H2O subtimestep count with make_tsub
        for each subtimestep:
          solve vapor diffusion with qsat surface boundary
          optionally call soilwater
          optionally compute lag-layer SSI atmosphere/frost fluxes
          apply latent-heat surface temperature feedback
          update vapor profile, surface ice and SSI diagnostics
        integrate pdtsrf, pdqsdif(h2o_ice), dwatercap_dif
      average slope vapor profiles back to grid-cell atmosphere

    if hdo and tracer is hdo_vap:
      call hdo_surfex per slope
      solve HDO vapor diffusion with mesh-averaged HDO surface flux

  write water/SSI diagnostics
  convert final zu,zv,zhs,zq work states to pdudif,pdvdif,pdhdif,pdqdif

参与的主题流程

主题 参与方式
边界层 / 湍流扩散 调用 vdif_cdyamada4call_atkevdif_kc,并用隐式三对角解更新风、热力和 tracer 垂直廓线
地表能量收支 联立第一层大气热通量、地表热容量、辐射线性化和土壤/地表通量,输出 pdtsrfsensibFlux
尘埃循环 根据 lifting/dustinjection/rdstorm/doubleq/submicron 和 CO2 冰覆盖条件生成 dust/stormdust/submicron 地表注入通量
水循环 处理 H2O vapor 与地表霜、永久冰盖、地下吸附水、地下冰和坡面之间的交换,并输出地表水冰和 watercap 倾向
HDO 同位素循环 在 H2O 通量之后调用 hdo_surfex,把同位素分馏后的 HDO 地表通量并入垂直扩散
CO2 循环 计算 CO2 凝结温度和热力质量变化项;当前 co2clouds 分支中凝结质量项被置零
坡面物理 使用 major_slope 作为大气主列耦合坡面,水冰通量逐坡面计算并通过 subslope_dist 平均回主列

写法特点

复现要点

待确认

相关页面