rocketduststorm_mod.F90

路径

LMDZ.MARS\libf\phymars\rocketduststorm_mod.F90

所属目录/模块

libf/phymars

文件定位

源码依据(第 12-20 行注释及整体结构):实现"火箭式尘暴"(Rocket Dust Storm, RDS)参数化方案,用于模拟火星尘暴季节中分离尘埃层(detached dust layers)的形成机制。

核心物理思想(第 188-194 行注释):

该模块是尘埃循环主题页中处理尘暴期间垂直输运的专用机制,与背景尘埃的重力沉降(callsedim_mod.F)形成互补。

定义的符号

符号 类型 行号 作用
rocketduststorm_mod module 1 容器模块
dustliftday real(allocatable), SAVE 5 尘埃抬升率(s⁻¹),模块级变量,被 compute_dtau_mod.F90 填充,供 physiq_mod.F 消费
rocketduststorm subroutine 22 主例程:辐射加热计算 → 垂直速度 → Van Leer 输运 → 脱轨
van_leer subroutine 546 本地 Van Leer 平流格式(从 vlz_fi.F 复制,源码第 544 行注释明确说明)
ini_rocketduststorm_mod subroutine 700 初始化:分配 dustliftday(ngrid)
end_rocketduststorm_mod subroutine 710 清理:释放 dustliftday

依赖的模块

use 模块 only 列表 用途 待确认
tracer_mod igcm_stormdust_mass/number, igcm_dust_mass/number, rho_dust 尘埃/风暴尘埃示踪物索引与密度(第 38-40 行)
comcstfi_h r, g, cpp, rcp 比气体常数、重力加速度、定压比热(第 41 行)
dimradmars_mod naerkind 气溶胶种类数(第 42 行)
comsaison_h dist_sol, mu0, fract 太阳距离、天顶角余弦、日照分数(第 43 行)
surfdat_h zmea, zstd, zsig, hmons 地形数据(平均、标准差、坡度、山顶地形,第 44 行) hmons 在本文件中未直接使用,推断为接口兼容
callradite_mod callradite 辐射传输计算(第 45 行)
write_output_mod write_output 诊断输出(第 46 行)
callkeys_mod coeff_detrainment 脱轨系数(运行时参数,默认 0.02,第 47 行)

调用的关键例程

被调用例程 所在模块/文件 调用位置 作用
callradite callradite_mod 第 259 行 计算含风暴尘埃的辐射加热率(SW+LW)
van_leer 本模块 第 400-403 行 垂直输运:stormdust_massstormdust_number 的 Van Leer 平流
write_output write_output_mod 第 530 行 输出 rds_lapserate 诊断场

输入

输入 来源 类型/维度 单位 含义
ngrid 调用者 integer(in) 水平格点数
nlayer 调用者 integer(in) 垂直层数
nq 调用者 integer(in) 示踪物数
ptime 调用者 real(in) s 当前时间
ptimestep 调用者 real(in) s 物理时间步
pq 调用者 real(ngrid,nlayer,nq)(in) kg/kg 示踪物混合比
pdqfi 调用者 real(ngrid,nlayer,nq)(in) kg/kg/s 上游倾向(本例程未使用)
pt 调用者 real(ngrid,nlayer)(in) K 层中点温度
pdtfi 调用者 real(ngrid,nlayer)(in) K/s 上游温度倾向(本例程未使用)
pplev 调用者 real(ngrid,nlayer+1)(in) Pa 层间界面气压
pplay 调用者 real(ngrid,nlayer)(in) Pa 层中点气压
pzlev 调用者 real(ngrid,nlayer+1)(in) m 层间界面高度
pzlay 调用者 real(ngrid,nlayer)(in) m 层中点高度
pdtsw 调用者 real(ngrid,nlayer)(in) K/s 短波辐射加热倾向(背景尘埃)
pdtlw 调用者 real(ngrid,nlayer)(in) K/s 长波辐射加热倾向(背景尘埃)
clearatm 调用者 logical(in) 清空大气标志
icount 调用者 integer(inout) 辐射计数器
zday, zls 调用者 real(in) day, ° 太阳日、太阳经度
tsurf 调用者 real(ngrid)(in) K 地表温度
co2ice 调用者 real(ngrid)(in) kg/m² 地表 CO2 冰
igout 调用者 integer(in) 输出格点索引
totstormfract 调用者 real(ngrid)(in) 风暴占据格点的面积分数
tauscaling 调用者 real(ngrid)(inout) 尘埃→光学厚度标定因子
dust_rad_adjust 调用者 real(ngrid)(inout) 尘埃辐射调整因子
IRtoVIScoef 调用者 real(ngrid)(inout) 红外→可见光系数(本例程未修改,推断为接口兼容)
albedo 调用者 real(ngrid,2)(in) 地表反照率(VIS/NIR)
emis 调用者 real(ngrid)(in) 地表发射率
clearsky 调用者 logical(in) 清空标志
totcloudfrac 调用者 real(ngrid)(in) 总云量
nohmons 调用者 logical(in) 无山顶地形标志

输出

输出 去向 类型/维度 单位 含义
pdqrds out,调用者回收 real(ngrid,nlayer,nq)(out) kg/kg/s 火箭式尘暴产生的示踪物倾向(仅 stormdust_mass/numberdust_mass/number 非零)
wrad out,调用者使用 real(ngrid,nlayer+1)(out) m/s 风暴区域内的垂直速度剖面
dsodust out,调用者使用 real(ngrid,nlayer)(out) 背景尘埃的密度标度不透明度
dsords out,调用者使用 real(ngrid,nlayer)(out) 风暴尘埃的密度标度不透明度
dsotop out,调用者使用 real(ngrid,nlayer)(out) 山顶地形尘埃的密度标度不透明度
tau_pref_scenario out,调用者使用 real(ngrid)(out) 预设尘埃柱可见光不透明度(场景)
tau_pref_gcm out,调用者使用 real(ngrid)(out) GCM 计算的尘埃柱可见光不透明度

共享状态与副作用

核心逻辑

按执行顺序(行号为源码行号):

阶段 0:初始化与风暴检测(第 208-253 行)

  1. 初始化(第 208-228 行):将所有输出数组和中间变量清零,detrain(:,:) = 1.(默认完全脱轨)。
  2. 提取示踪物(第 232-239 行):从 pq 复制出 zq_dust_mass/numberzq_stormdust_mass/number
  3. 风暴检测(第 244-253 行):对每列 ig,逐层检查 if (stormdust_mass > dust_mass * 1e-4) 若任一层满足,标记 storm(ig) = .true.,否则跳过该列。

阶段 1:辐射传输计算(第 259-267 行)

调用 callradite 计算含风暴尘埃的辐射加热率 zdtlw1(长波)和 zdtsw1(短波)。同时输出 dsodustdsordsdsotoptau_pref_scenariotau_pref_gcm 等诊断量。

阶段 2:垂直速度计算(第 272-343 行)

对每列 ig,若 storm(ig) 为真:

  1. 加热率插值到界面(第 292-318 行):对风暴尘埃和背景尘埃分别计算层间界面的加热率 zdtlw1_lev(l+1)zdtsw1_lev(l+1)(风暴)和 zdtlw_lev(l+1)zdtsw_lev(l+1)(背景)。 使用线性插值:val_lev = (val_l * (zlay_l+1 - zlev_l+1) + val_l+1 * (zlev_l+1 - zlay_l)) / (zlay_l+1 - zlay_l)

  2. 环境温度递减率(第 322-326 行): zdtvert(l+1) = (T_lev(l+1) - T_lev(l)) / (zlay_l+1 - zlay_l)

  3. 额外加热 vs 绝热冷却平衡(第 332-340 行):

    • 额外加热:deltahr(l) = (zdtlw1_lev + zdtsw1_lev) - (zdtlw_lev + zdtsw_lev)
    • 垂直速度:wrad(l) = -deltahr(l) / (g/cpp + max(zdtvert(l), -0.99*g/cpp)) 分母中 g/cpp 为干绝热递减率,max 防止环境递减率接近绝热时除零。
    • 限幅wrad(l) = max(-wmax, min(wmax, wrad(l))),即 |wrad| ≤ 10 m/s。

阶段 3:垂直输运(第 349-446 行)

对每列 ig,若 storm(ig) 为真:

  1. 浓度混合比(第 352-359 行):将风暴 fraction 内的示踪物浓度转换:

    mr_stormdust_mass(l) = dust_mass(l) + stormdust_mass(l) / totstormfract(ig)

    推断:totstormfract 为风暴占据的面积分数,此步将风暴区域内的浓度从平均浓度反推为风暴内部浓度。

  2. 子步时间步(第 367-378 行):

    • 计算最大允许时间步 dtmaxdtmax = min over layers of (Δzlev / (secu * |wrad|)),限制每子步穿越 ≤ 1 层。
    • 子步数:nsubtimestep = int(ptimestep / dtmax)
    • 子步长:subtimestep = ptimestep / nsubtimestep
  3. 空气质量通量(第 380-383 行):

    w(l) = wrad(l) * pplev(l) / (r * ztlev(l)) * subtimestep

    即静力学下 w = ρ * v * Δt = (P / (rT)) * v * Δt

  4. Van Leer 平流(第 396-404 行):

    • mr_stormdust_massmr_stormdust_number 分别调用本地 van_leer 子例程。
    • 循环 nsubtimestep 次。
  5. 混合比反解(第 411-431 行):

    • 常规情形mr_stormdust ≥ mr_dust,第 416-420 行):
      stormdust = totstormfract * (mr_stormdust - mr_dust)
      dust = mr_dust
    • 异常情形mr_stormdust < mr_dust,第 422-427 行):
      dust = (1 - totstormfract) * mr_dust + totstormfract * mr_stormdust
      stormdust = 0
      推断:输运后风暴浓度低于背景,说明风暴"耗尽",将风暴质量按比例合并回背景。
  6. 倾向计算(第 435-446 行):

    dqvl_stormdust = (zq_stormdust - pq_stormdust) / ptimestep
    dqvl_dust = (zq_dust - pq_dust) / ptimestep

阶段 4:脱轨(第 449-482 行)

  1. 脱轨系数(第 453-471 行):

    • |wrad| < wmin(0.25 m/s)或 dust_mass > 10000 * stormdust_massdetrain = 1.(完全脱轨)
    • wmin ≤ |wrad| ≤ wmax:二次多项式
      detrain = coeff_detrainment * ((1-coefmin)/(wmin-wmax)² * (|wrad|-wmax)² + coefmin)
    • |wrad| > wmaxdetrain = coefmin(最小脱轨,保持高速上升)
  2. 脱轨倾向(第 475-482 行):

    dqdet_stormdust = -detrain * stormdust_mass / ptimestep

阶段 5:最终倾向(第 484-498 行)

对每列每层:

pdqrds(stormdust) = dqdet_stormdust + dqvl_stormdust
pdqrds(dust) = -dqdet_stormdust + dqvl_dust

stormdust 减少(脱轨 + 输运),dust 增加(脱轨贡献,输运也可能改变背景)。

伪代码

subroutine rocketduststorm(..., pq, pdqrds, wrad, ...):

  #--- 阶段 0: 初始化与风暴检测 ---
  storm(:) = false
  for ig=1..ngrid:
    for l=1..nlayer:
      if stormdust_mass(ig,l) > dust_mass(ig,l) * 1e-4:
        storm(ig) = true; break

  #--- 阶段 1: 辐射传输 ---
  call callradite(..., pq, ..., zdtlw1, zdtsw1, dsodust, dsords, dsotop, ...)

  #--- 阶段 2: 垂直速度 ---
  for ig where storm(ig):
    for l=1..nlayer:
      插值加热率到界面:zdtlw1_lev, zdtsw1_lev(风暴);zdtlw_lev, zdtsw_lev(背景)
      deltahr(l) = (zdtlw1_lev + zdtsw1_lev) - (zdtlw_lev + zdtsw_lev)
      wrad(l) = -deltahr(l) / (g/cpp + max(zdtvert(l), -0.99*g/cpp))
      wrad(l) = clamp(wrad, -wmax, wmax)

  #--- 阶段 3: 垂直输运 ---
  for ig where storm(ig):
    mr_stormdust = dust + stormdust / totstormfract    # 风暴内部浓度
    dtmax = min over layers of (Δz / (secu * |wrad|))  # 限制穿越层数
    nsubtimestep = int(ptimestep / dtmax)
    subtimestep = ptimestep / nsubtimestep
    for tsub=1..nsubtimestep:
      w(l) = wrad(l) * pplev(l) / (r * ztlev(l)) * subtimestep  # 空气质量通量
      call van_leer(stormdust_mass, w, wq)
      call van_leer(stormdust_number, w, wq)
    # 反解混合比
    if mr_stormdust ≥ mr_dust:
      stormdust = totstormfract * (mr_stormdust - mr_dust)
    else:
      dust = (1-totstormfract)*mr_dust + totstormfract*mr_stormdust; stormdust=0
    dqvl = (zq_after - pq_before) / ptimestep

  #--- 阶段 4: 脱轨 ---
  for ig, l:
    if |wrad| < wmin or dust > 10000*stormdust:
      detrain = 1
    elif |wrad| ∈ [wmin, wmax]:
      detrain = coeff_detrainment * ((|wrad|-wmax)² * (1-coefmin)/(wmin-wmax)² + coefmin)
    else:
      detrain = coefmin
    dqdet_stormdust = -detrain * stormdust / ptimestep

  #--- 阶段 5: 最终倾向 ---
  pdqrds(stormdust) = dqdet_stormdust + dqvl_stormdust
  pdqrds(dust) = -dqdet_stormdust + dqvl_dust

参与的主题流程

主题 参与方式
尘埃循环 physiq_mod.F:1379 直接调用;产生的 pdqrds 倾向被加到主倾向 pdq 上(第 1397-1410 行),影响尘埃/风暴尘埃的质量与数浓度

写法特点

复现要点

待确认

相关页面