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、tauscaling、tau、pplay、pt 和物理开关转换为每类气溶胶的有效半径与有效方差;随后 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 分支会写入。 |
共享状态与副作用
- 本例程没有
SAVE 局部状态、没有文件 I/O、没有诊断输出。
- 主要副作用是写入
dimradmars_mod::nueffdust。注意 stormdust/topdust 分支也写同一个 nueffdust(ig,l),如果多个尘埃分支同时启用,最后执行的分支会覆盖前面的尘埃方差。
- 所有输出数组由调用方传入;本例程按分支条件写入。如果某类气溶胶名称出现在
name_iaer 中,但对应物理分支没有先更新半径数组,该类 reffrad/nueffrad 可能沿用调用方已有值或未定义值。
rhocloud 和 rhocloudco2 是局部临时数组,只接收 updaterad 子例程返回值,本文件没有继续使用它们。
核心逻辑
- 尘埃半径更新:如果
doubleq.AND.active,对每个 ig,l 调用 updaterdust(pq(dust_mass), pq(dust_number), rdust),并把 nueffdust=exp(varian**2)-1;否则 rdust=0.8e-6、nueffdust=0.3。
- stormdust/topdust 半径更新:如果
rdstorm.AND.active 或 topflows.AND.active,分别用 igcm_stormdust_* 或 igcm_topdust_* tracer 调 updaterdust,并同样写 nueffdust=exp(varian**2)-1。
- 水冰半径更新:如果
water.AND.activice,微物理开启时用 updaterice_micro(h2o_ice, ccn_mass, ccn_number, tauscaling);微物理关闭时用 updaterice_typ(h2o_ice, 0.2, pplay)。两条路径都把 nuice=nuice_ref。
- CO2 冰半径更新:如果
co2clouds.AND.activeco2ice,先用 threshold=1e-30 限制 CO2 冰、CO2 CCN 质量和数浓度;若 co2useh2o,再从 CO2 CCN 中扣除 H2O CCN 分量,并在扣成非正值时重置为阈值;随后调用 updaterice_microco2(..., pt, tauscaling, riceco2, rhocloudco2),并写 nuiceco2=nuiceco2_ref。
- 按辐射气溶胶名称写
reffrad/nueffrad:对 iaer=1..naerkind 循环,按 name_iaer(iaer) 选择公式:
dust_conrath:reffrad = rdust * (1+nueffdust)**2.5,nueffrad=nueffdust。
dust_doubleq:reffrad = rdust * ref_r0,nueffrad=nueffdust。
dust_submicron:reffrad = radius(igcm_dust_submicron),nueffrad=0.03。
h2o_ice:reffrad = rice * (1+nuice_ref),nueffrad=nuice_ref。
co2_ice:reffrad = real(riceco2) * (1+nuiceco2_ref),nueffrad=nuiceco2_ref。
stormdust_doubleq / topdust_doubleq:分别用 rstormdust / rtopdust 乘 ref_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 混入。 |
写法特点
- 固定格式 Fortran 源文件,但模块和
use 语句采用较新的模块化风格。
- 先按物理过程更新基础半径数组,再按
name_iaer 投影到辐射气溶胶维度;这使同一动态/微物理半径可以服务多个辐射气溶胶种类。
- 水冰非微物理分支把
tau 固定传为 0.2,虽然子例程接口中有 tau(ngrid,naerkind) 输入。
- CO2+H2O CCN 分支先扣除 H2O CCN 分量,再把 H2O 分量作为独立参数传给
updaterice_microco2。
复现要点
callradite 中调用顺序必须保持:suaer 首次加载离散光学表,updatereffrad 更新 reffrad/nueffrad,aeroptproperties 再按这些半径积分光学属性。
name_iaer 只能匹配本文件 SELECT CASE 中列出的名称;未匹配名称不会写对应 reffrad/nueffrad。
stormdust_doubleq 和 topdust_doubleq 的有效方差都复用共享 nueffdust,而不是独立方差数组。
dust_submicron 不从 pq 反演半径,直接使用 tracer_mod::radius(igcm_dust_submicron) 且固定 nueffrad=0.03。
- 非微物理水冰分支使用硬编码典型光学厚度
0.2 调 updaterice_typ;复现时不要误以为使用了输入数组 tau。
待确认
tau(ngrid,naerkind) 是接口输入,但当前文件内没有被实际传给任何计算分支;推断该参数保留自旧接口或供未来分支使用。
iaer_* 索引从 dimradmars_mod 导入但当前文件没有直接引用;当前逻辑完全依赖 name_iaer 字符串分支。
nueffdust 被 stormdust/topdust 分支覆盖是否符合多尘埃种类同时启用时的预期,需要结合 dimradmars_mod 和辐射方案设计确认。
相关页面