updatereffrad_mod.F

路径

LMDZ.MARS\libf\phymars\updatereffrad_mod.F

所属目录 / 模块

libf\phymars

文件定位

updatereffrad_mod.F 定义 updatereffrad_mod 模块(第 1 行)和唯一导出的 updatereffrad 例程(第 7 行)。它位于辐射调用链中 suaer 之后、aeroptproperties 之前:callradite_mod.F 第 418 行调用本例程,把动态场和微物理 tracer 中的尘埃、水冰、CO2 冰半径信息整理成辐射传输使用的 reffrad(ngrid,nlayer,naerkind)nueffrad(ngrid,nlayer,naerkind)

本文件不读取外部光学表,也不直接计算光学厚度。它负责把 pq 中的质量/数浓度 tracer、tauscalingtaupplaypt 和物理开关转换为每类气溶胶的有效半径与有效方差;随后 aeroptproperties 按这些半径去卷积 suaer 预先填充的离散光学表。

定义的符号

符号 类型 行号 作用
updatereffrad_mod module 1 封装辐射粒径更新例程。
updatereffrad subroutine 7 更新尘埃、水冰、CO2 冰等气溶胶的辐射有效半径 reffrad 和有效方差 nueffrad
threshold local parameter 89 CO2 冰和 CO2 CCN 数值下限,值为 1e-30
rhocloud local array 92 水冰微物理分支中 updaterice_micro 返回的云密度。
rhocloudco2 local array 94 CO2 冰微物理分支中 updaterice_microco2 返回的云密度。

依赖的模块

use 模块 only 列表 用途 待确认
updaterad updaterdust, updaterice_micro, updaterice_microco2, updaterice_typ 标量半径反演工具:由质量/数浓度或典型廓线计算尘埃、水冰、CO2 冰半径。
tracer_mod nqmx, igcm_*, radius, nuice*_ref, varian, ref_r0, rho_ice 提供 tracer 维度、tracer 索引、固定小尘埃半径、有效方差参考值和对数正态半径转换因子。
dimradmars_mod nueffdust, naerkind, name_iaer, iaer_* 提供辐射气溶胶种类循环、名称识别和尘埃有效方差共享表。
dust_param_mod doubleq, active 控制双矩尘埃分支是否由质量/数浓度更新。
callkeys_mod water, activice, microphys, rdstorm, topflows, co2clouds, activeco2ice, co2useh2o 控制水冰、CO2 冰、stormdust、topdust 和 H2O-CCN 混入 CO2 云的分支。

调用的关键例程

被调用例程 所在模块 / 文件 调用位置 作用
updaterdust updaterad / updaterad.F90 第 102、120、131 行 由尘埃、stormdust、topdust 的质量和数浓度 tracer 计算几何平均半径。
updaterice_micro updaterad / updaterad.F90 第 149 行 水冰微物理开启时,由水冰、CCN 质量和数浓度及 tauscaling 计算 rice
updaterice_typ updaterad / updaterad.F90 第 164 行 水冰微物理关闭时,用 tau=0.2 和层中高度 pplay 估算典型水冰半径。
updaterice_microco2 updaterad / updaterad.F90 第 199 行 CO2 冰微物理开启时,由 CO2 冰、CO2 CCN、可选 H2O CCN 和温度计算 riceco2

输入

输入 来源 类型/维度 单位 含义
ngrid, nlayer callradite integer scalar - 水平格点数和垂直层数。
pq(ngrid,nlayer,nqmx) callradite / 物理 tracer 状态 real kg/kg 或 kg^-1,按 tracer 定义 质量混合比和数浓度 tracer;由 igcm_* 索引读取尘埃、水冰、CCN、CO2 冰等分量。
tauscaling(ngrid) callradite real - 用于微物理 CCN 数/质量缩放;源码注释说明 first call 时可由 startfi 读入,缺省为 1。
tau(ngrid,naerkind) callradite real - 气溶胶光学厚度;非微物理水冰分支实际使用硬编码 0.2,不是本数组。
pplay(ngrid,nlayer) callradite real m 层中点高度;传给 updaterice_typ
pt(ngrid,nlayer) callradite real K 温度;传给 CO2 冰半径计算。
name_iaer(1:naerkind) dimradmars_mod character array - 当前辐射气溶胶种类名称,驱动第二阶段 SELECT CASE
doubleq, active, water, activice, microphys, rdstorm, topflows, co2clouds, activeco2ice, co2useh2o dust_param_mod / callkeys_mod logical - 控制各半径更新分支是否执行。

输出

输出 去向 类型/维度 单位 含义
rdust(ngrid,nlayer) callradite 局部状态 real m 常规尘埃几何平均半径。
rstormdust(ngrid,nlayer) callradite 局部状态 real m stormdust 几何平均半径。
rtopdust(ngrid,nlayer) callradite 局部状态 real m topdust 几何平均半径。
rice(ngrid,nlayer) callradite 局部状态 real m 水冰质量平均半径或由典型廓线估算的半径。
nuice(ngrid,nlayer) callradite 局部状态 real - 水冰有效方差;本例程写为 nuice_ref
riceco2(ngrid,nlayer) callradite 局部状态 double precision m CO2 冰半径。
nuiceco2(ngrid,nlayer) callradite 局部状态 real - CO2 冰有效方差;本例程写为 nuiceco2_ref
reffrad(ngrid,nlayer,naerkind) callradite -> aeroptproperties real m 每类辐射气溶胶的有效半径。
nueffrad(ngrid,nlayer,naerkind) callradite -> aeroptproperties real - 每类辐射气溶胶的有效方差。
nueffdust(ngrid,nlayer) dimradmars_mod real shared array - 尘埃有效方差;双矩尘埃、stormdust、topdust 分支会写入。

共享状态与副作用

核心逻辑

  1. 尘埃半径更新:如果 doubleq.AND.active,对每个 ig,l 调用 updaterdust(pq(dust_mass), pq(dust_number), rdust),并把 nueffdust=exp(varian**2)-1;否则 rdust=0.8e-6nueffdust=0.3
  2. stormdust/topdust 半径更新:如果 rdstorm.AND.activetopflows.AND.active,分别用 igcm_stormdust_*igcm_topdust_* tracer 调 updaterdust,并同样写 nueffdust=exp(varian**2)-1
  3. 水冰半径更新:如果 water.AND.activice,微物理开启时用 updaterice_micro(h2o_ice, ccn_mass, ccn_number, tauscaling);微物理关闭时用 updaterice_typ(h2o_ice, 0.2, pplay)。两条路径都把 nuice=nuice_ref
  4. CO2 冰半径更新:如果 co2clouds.AND.activeco2ice,先用 threshold=1e-30 限制 CO2 冰、CO2 CCN 质量和数浓度;若 co2useh2o,再从 CO2 CCN 中扣除 H2O CCN 分量,并在扣成非正值时重置为阈值;随后调用 updaterice_microco2(..., pt, tauscaling, riceco2, rhocloudco2),并写 nuiceco2=nuiceco2_ref
  5. 按辐射气溶胶名称写 reffrad/nueffrad:对 iaer=1..naerkind 循环,按 name_iaer(iaer) 选择公式:
    • dust_conrathreffrad = rdust * (1+nueffdust)**2.5nueffrad=nueffdust
    • dust_doubleqreffrad = rdust * ref_r0nueffrad=nueffdust
    • dust_submicronreffrad = radius(igcm_dust_submicron)nueffrad=0.03
    • h2o_icereffrad = rice * (1+nuice_ref)nueffrad=nuice_ref
    • co2_icereffrad = real(riceco2) * (1+nuiceco2_ref)nueffrad=nuiceco2_ref
    • stormdust_doubleq / topdust_doubleq:分别用 rstormdust / rtopdustref_r0,方差用 nueffdust

伪代码

if doubleq and active:
  for each layer/grid:
    updaterdust(dust_mass, dust_number, rdust)
    nueffdust = exp(varian^2) - 1
else:
  rdust = 0.8e-6
  nueffdust = 0.3

if rdstorm and active:
  updaterdust(stormdust_mass, stormdust_number, rstormdust)
  nueffdust = exp(varian^2) - 1

if topflows and active:
  updaterdust(topdust_mass, topdust_number, rtopdust)
  nueffdust = exp(varian^2) - 1

if water and activice:
  if microphys:
    updaterice_micro(h2o_ice, ccn_mass, ccn_number, tauscaling, rice)
  else:
    updaterice_typ(h2o_ice, tau=0.2, pplay, rice)
  nuice = nuice_ref

if co2clouds and activeco2ice:
  clamp CO2 ice and CCN tracers to threshold
  if co2useh2o:
    subtract H2O CCN mass/number from CO2 CCN pool
    clamp non-positive residuals to threshold
  updaterice_microco2(..., pt, tauscaling, riceco2)
  nuiceco2 = nuiceco2_ref

for iaer in 1..naerkind:
  select name_iaer(iaer):
    write reffrad(:,:,iaer) and nueffrad(:,:,iaer)

参与的主题流程

主题 参与方式
辐射 callradite 的辐射准备阶段把 tracer/微物理粒径转换为 aeroptproperties 使用的 reffrad/nueffrad
尘埃循环 读取常规尘埃、stormdust、topdust 的质量/数浓度 tracer,更新尘埃辐射粒径。
水循环 在水冰云开启时为 h2o_ice 气溶胶种类提供水冰辐射粒径。
CO2 循环 在 CO2 云开启时为 co2_ice 气溶胶种类提供 CO2 冰辐射粒径,并处理可选的 H2O CCN 混入。

写法特点

复现要点

待确认

相关页面