aeropacity_mod.F
路径
LMDZ.MARS\libf\phymars\aeropacity_mod.F
所属目录/模块
libf\phymars
文件定位
该文件定义气溶胶不透明度(光学厚度)计算模块 aeropacity_mod,是辐射传输与尘埃/水冰/CO2 云之间的关键桥梁。模块导出一个例程 aeropacity,由辐射调用入口 callradite(行 430)在每个辐射时间步调用。
aeropacity 完成三件事:
- 按配置开关
iaervar 得到参考气压 odpref(610 Pa)处的“规定”尘埃柱可见光柱光学厚度 tau_pref_scenario(常数、Viking、MGS、Escalier 解析场景,或调用 read_dust_scenario 读取观测同化/合成场景)。
- 对每一种气溶胶(background dust、submicron dust、stormdust、topdust、水冰、CO2 冰)逐层计算可见光光学厚度
aerosol(ngrid,nlayer,naerkind),并产出 density-scaled opacity 诊断 dsodust/dsords/dsotop。
- 调用
compute_dustscaling 得到把 GCM 尘埃缩放到场景的系数 tauscaling/dust_rad_adjust,并在 freedust 模式下由尘埃 tracer 反算 GCM 实际柱光学厚度 tau_pref_gcm。
模块层还持有两个描述强制尘埃垂直分布的 SAVE 标量 iddist 和 topdustref,由 conf_phys 读取配置后写入。
定义的符号
| 符号 |
类型 |
行号 |
作用 |
aeropacity_mod |
module |
1 |
气溶胶光学厚度计算模块 |
iddist |
integer module variable (SAVE 语义) |
5 |
强制尘埃垂直分布类型标志:0=Pollack90,1=由 topdustref 设定顶高,2=Viking 场景,3=MGS 场景 |
topdustref |
real module variable |
8 |
尘埃层顶高度(km),仅当 iddist=1 时使用 |
aeropacity |
subroutine |
11 |
逐格点、逐层、逐气溶胶种类计算可见光光学厚度并产出 dso 诊断与缩放系数 |
依赖的模块
| use 模块 |
only 列表 |
用途 |
待确认 |
ioipsl_getin_p_mod |
getin_p |
从 callphys.def 读取 tauvis(firstcall),以及 DUSTSTORM 块的局地风暴参数 |
否 |
tracer_mod |
noms, igcm_h2o_ice, igcm_dust_mass, igcm_dust_submicron, rho_dust, rho_ice, nqdust, igcm_stormdust_mass, igcm_topdust_mass, igcm_co2_ice |
tracer 名称、关键 tracer 索引、尘埃/冰密度常数、尘埃 tracer 计数 |
否 |
geometry_mod |
latitude(DUSTSTORM 下额外 longitude) |
格点纬度(rad),用于 MGS/Viking 顶高公式与场景纬度分布 |
否 |
comgeomfi_h |
sinlat |
格点纬度正弦,用于 Viking 顶高 topdust0 公式 |
否 |
comcstfi_h |
g, pi |
重力加速度(柱质量→光学厚度)与圆周率(度↔︎弧度换算) |
否 |
dimradmars_mod |
naerkind, name_iaer, iaerdust, tauvis, iaer_dust_conrath, iaer_dust_doubleq, iaer_dust_submicron, iaer_h2o_ice, iaer_stormdust_doubleq, iaer_topdust_doubleq |
气溶胶种类数、名称、尘埃散射体索引表、默认可见光厚度、各气溶胶种类索引常数 |
否 |
dust_param_mod |
odpref, freedust, reff_driven_IRtoVIS_scenario |
参考气压 610 Pa、自由尘埃模式开关、reff 驱动 IR→VIS 系数开关 |
否 |
dust_scaling_mod |
compute_dustscaling |
计算并应用尘埃缩放系数 tauscaling/dust_rad_adjust |
否 |
density_co2_ice_mod |
density_co2_ice |
按温度计算 CO2 冰密度(CO2 冰云光学厚度分母) |
否 |
surfdat_h |
alpha_hmons, contains_mons |
山顶尘流亚格点面积分数与“是否含山体”掩膜(topdust 路径) |
否 |
read_dust_scenario_mod |
read_dust_scenario |
读取观测同化/合成尘埃场景的 tau_pref_scenario 与 IRtoVIScoef |
否 |
callkeys_mod |
co2clouds, activeco2ice, water, activice, CLFvarying, CLFvaryingCO2, iaervar, rdstorm, topflows |
物理开关:CO2 云、活性 CO2 冰、水循环、活性水冰、亚格点云分数、尘暴场景选择、stormdust、topflows |
否 |
tracer_mod(DUSTSTORM) |
r3n_q, ref_r0, igcm_dust_number |
仅在编译宏 DUSTSTORM 下用于局地尘暴扰动 |
否 |
调用的关键例程
| 被调用例程 |
所在模块/文件 |
调用位置 |
作用 |
getin_p |
ioipsl_getin_p_mod |
行 255(tauvis);DUSTSTORM 块行 745–780 |
读取配置键 |
read_dust_scenario |
read_dust_scenario_mod |
行 314/318/323(section 1)和行 709/713/718(section 3 重算) |
由场景文件得到 tau_pref_scenario 和 IRtoVIScoef |
density_co2_ice |
density_co2_ice_mod |
行 568(CO2 冰云分支,逐格点逐层) |
温度依赖 CO2 冰密度 |
compute_dustscaling |
dust_scaling_mod |
行 865 |
计算缩放系数并调整 aerosol |
abort_physic |
(phymars 公共中止例程) |
行 327(非法 iaervar)、行 925(freedust 下 tau_pref_gcm>50) |
致命错误中止 |
输入
| 输入 |
来源 |
类型/维度 |
单位 |
含义 |
ngrid, nlayer, nq |
callradite |
integer scalar |
- |
水平格点数、垂直层数、tracer 数 |
zday |
callradite |
real scalar |
sol |
自 Ls=0 起的火星日期(传给 read_dust_scenario) |
pplay(ngrid,nlayer) |
callradite |
real |
Pa |
层中点气压 |
pplev(ngrid,nlayer+1) |
callradite |
real |
Pa |
层界面气压(柱质量 (pplev_l - pplev_l+1)/g) |
ls |
callradite |
real scalar |
rad |
太阳经度(场景纬度/季节分布) |
pq(ngrid,nlayer,nq) |
callradite |
real |
kg/kg |
tracer 质量混合比(读取各尘埃/冰 tracer 分量) |
pt(ngrid,nlayer) |
callradite |
real |
K |
温度(CO2 冰密度) |
QREFvis3d/QREFir3d(ngrid,nlayer,naerkind) |
callradite |
real |
- |
可见光/红外参考波长消光系数 Qext |
omegaREFir3d(ngrid,nlayer,naerkind) |
callradite |
real |
- |
红外参考波长单次散射反照率 |
reffrad(ngrid,nlayer,naerkind) |
callradite |
real (INOUT) |
m |
气溶胶有效半径(光学厚度分母;DUSTSTORM 下可被改写) |
totstormfract(ngrid) |
callradite |
real |
- |
火箭尘暴亚格点面积分数(section 5 stormdust 归一化) |
totcloudfrac(ngrid) |
callradite |
real |
- |
总水冰云分数(CLFvarying 路径) |
clearatm, nohmons, clearsky |
callradite |
logical |
- |
分别控制是否排除 stormdust、topdust、水/CO2 冰云,用于多次调用拆分网格内/外贡献 |
输出
| 输出 |
去向 |
类型/维度 |
单位 |
含义 |
tau_pref_scenario(ngrid) |
callradite→缩放与诊断 |
real (OUT) |
- |
场景规定的 odpref 处尘埃柱可见光厚度 |
tau_pref_gcm(ngrid) |
callradite→诊断 |
real (OUT) |
- |
GCM 实际尘埃柱可见光厚度(freedust 下由 tracer 反算,否则等于场景值) |
tau(ngrid,naerkind) |
callradite |
real (OUT) |
- |
每种气溶胶的柱总可见光光学厚度 |
taucloudtes(ngrid) |
callradite |
real (OUT) |
- |
水冰云在红外参考波长用 Qabs 计算的不透明度(对标 TES) |
aerosol(ngrid,nlayer,naerkind) |
callradite(辐射传输输入) |
real (OUT) |
- |
每层每种气溶胶可见光光学厚度 |
dsodust/dsords/dsotop(ngrid,nlayer) |
诊断输出 |
real (OUT) |
m²/kg 级 |
background dust / stormdust / topdust 的 density-scaled opacity(红外,对标观测) |
tauscaling(ngrid) |
callradite→后续物理 |
real (OUT) |
- |
qdust/Ndust 缩放系数 |
dust_rad_adjust(ngrid) |
callradite |
real (INOUT) |
- |
尘埃辐射调整系数 |
IRtoVIScoef(ngrid) |
callradite/read_dust_scenario |
real (INOUT) |
- |
场景 IR(9.3µm) CDOD 到可见光的换算系数 |
共享状态与副作用
- 模块级
SAVE 标量 iddist、topdustref 由 conf_phys(use aeropacity_mod, only: iddist, topdustref)写入,本例程只读。
- 例程内
SAVE + THREADPRIVATE 变量(行 174–189):cstdustlevel、firstcall、i_ice、i_co2ice、naerdust。firstcall 时一次性识别尘埃散射体/尘埃 tracer、设定 i_ice/i_co2ice、读取 tauvis、按 freedust.or.rdstorm 决定 cstdustlevel。
- 标准输出副作用:firstcall 打印各气溶胶
Qext(vis)/Qext(IR) 与 Qext(IR)/Qabs(IR) 典型廓线,以及 i_ice/i_co2ice 值。
compute_dustscaling 会就地修改 aerosol(缩放后)。
- 致命中止:非法
iaervar,或 freedust 下未做场景缩放时 tau_pref_gcm>50 触发 abort_physic。
- 编译宏
DUSTSTORM 控制是否编入局地尘暴扰动块;该块还会就地修改 pq(:,:,igcm_dust_mass/igcm_dust_number) 和 reffrad,并改变 firstcall 关闭时机(见“写法特点”)。
核心逻辑
- 初始化:
tau(1:ngrid,1:naerkind)=0。
- firstcall(行 197–268):扫描
name_iaer,把名字以 dust/storm/top 开头的归为尘埃散射体(填 naerdust、iaerdust);扫描 noms 把名字以 dust 开头的 tracer 填入 nqdust;若 water.and.activice 设 i_ice=igcm_h2o_ice;若 co2clouds.and.activeco2ice 设 i_co2ice=igcm_co2_ice;打印诊断廓线;getin_p("tauvis");按 freedust.or.rdstorm 把 cstdustlevel 设为 1,否则设为 cstdustlevel0=7。非 DUSTSTORM 编译下此处即关闭 firstcall。
- Section 1 — 场景柱厚度(行 270–328):按
iaervar 分支得到 tau_pref_scenario:
=1 常数 max(tauvis,1e-9);
=2 Viking 余弦季节循环;
=3 MGS 纬度+季节 tanh 分布;
=5 Escalier 阶梯(Ls 30°–150° 间降到 0.2);
6–8、24–37、4/124–126 调 read_dust_scenario;
- 否则
abort_physic。
- Section 2 — 逐种气溶胶逐层光学厚度(行 330–701):
SELECT CASE(name_iaer(iaer)):
dust_conrath:按 iddist 选顶高(const/Viking/MGS),用指数垂直缩放函数(iddist>=1)或 Pollack90 分布(iddist=0)填 aerosol。
dust_doubleq:两矩方案。l<=cstdustlevel 时用 cstdustlevel 层值“冻结”避免近地虚高;公式 0.75*Qvis/(rho_dust*reffrad)*pq(dust_mass)*Δp/g;同时算红外 dsodust;若 reff_driven_IRtoVIS_scenario 且 clearatm.and.nohmons,累加 IR 吸收/VIS 消光柱量算 IRtoVIScoef=tauVISext/tauIRabs。
dust_submicron:用 igcm_dust_submicron,同样的冻结层处理,仅 VIS。
h2o_ice:clearsky 时填 1e-9;否则用 rho_ice 与 i_ice 计算,累加 taucloudvis/taucloudtes;CLFvarying 时按 max(totcloudfrac,0.01) 还原亚格点云。
co2_ice:逐点调 density_co2_ice(pt) 得密度,用 i_co2ice 计算并累加 taucloudco2vis/tes;CLFvaryingCO2 时按 totcloudco2frac 还原。
stormdust_doubleq:clearatm 时填 1e-25(网格内无风暴部分),否则用 igcm_stormdust_mass 计算并产出 dsords。
topdust_doubleq:nohmons 时填 1e-25,否则用 igcm_topdust_mass 计算并产出 dsotop。
- Section 3 重算(行 703–721):若
reff_driven_IRtoVIS_scenario,在 IRtoVIScoef 更新后对 iaervar 6–8/24–36/4,124–126 再次调用 read_dust_scenario。
- DUSTSTORM 块(行 723–860,仅宏开启):firstcall 下汇总参考
tau_pref_gcm,交互读取局地尘暴参数,按 Spiga et al. 2013 公式逐层加尘埃扰动到 pq 并可改 reffrad,最后把 tau_pref_gcm 清零。
- 3.1 缩放(行 865):
compute_dustscaling(...) 计算 tauscaling/dust_rad_adjust 并就地缩放 aerosol。
- 3.2 GCM 柱厚度(行 872–932):
freedust 时清零后只对 dust_doubleq/stormdust_doubleq/topdust_doubleq 累加各自 tracer 贡献,乘 odpref/pplev(:,1);若 max(tau_pref_gcm)>50 则 abort_physic;非 freedust 时 tau_pref_gcm=tau_pref_scenario。
- Section 4(行 937–943):对每种气溶胶逐层累加得柱总
tau。
- Section 5(行 957–983):
rdstorm 时把 aerosol(stormdust) 除以 totstormfract(折算到风暴面积内浓度);topflows 时对 contains_mons 的格点把 aerosol(topdust) 除以 alpha_hmons。
伪代码
tau = 0
if firstcall:
识别尘埃散射体 iaerdust / 尘埃 tracer nqdust
设 i_ice, i_co2ice(依 water/activice, co2clouds/activeco2ice)
打印典型 Qext 廓线; getin tauvis
cstdustlevel = 1 if (freedust or rdstorm) else 7
(非 DUSTSTORM 编译) firstcall = false
# 1. 场景柱光学厚度
select iaervar:
1 -> 常数; 2 -> Viking; 3 -> MGS; 5 -> Escalier
6-8/24-37/4,124-126 -> read_dust_scenario
else -> abort_physic
# 2. 每种气溶胶逐层光学厚度
for iaer in 1..naerkind:
select name_iaer(iaer):
dust_conrath -> 按 iddist 顶高 + 指数/Pollack 垂直分布
dust_doubleq -> 0.75*Qvis/(rho_dust*reff)*pq(dust_mass)*Δp/g
冻结 l<=cstdustlevel; 算 dsodust; (可选) IRtoVIScoef
dust_submicron -> 同上, 用 dust_submicron
h2o_ice -> clearsky?1e-9 : 用 rho_ice,i_ice; 累加 taucloudtes; CLFvarying 还原
co2_ice -> clearsky?1e-9 : density_co2_ice(pt); 累加 taucloudco2tes; CLFvaryingCO2 还原
stormdust -> clearatm?1e-25 : 用 stormdust_mass; 算 dsords
topdust -> nohmons?1e-25 : 用 topdust_mass; 算 dsotop
# 3. reff 驱动场景重算(可选) + DUSTSTORM 扰动(宏)
# 3.1 compute_dustscaling 缩放 aerosol
# 3.2 freedust? 由 tracer 反算 tau_pref_gcm(>50 则 abort) : = tau_pref_scenario
# 4. tau = 逐层累加 aerosol
# 5. rdstorm? aerosol(storm)/totstormfract; topflows? aerosol(top)/alpha_hmons
参与的主题流程
| 主题 |
参与方式 |
| 辐射 |
为长短波辐射传输提供逐层每种气溶胶的可见光光学厚度 aerosol 与柱厚度 tau、taucloudtes |
| 尘埃循环 |
实现尘埃场景柱厚度、两矩尘埃/stormdust/topdust 光学厚度、density-scaled opacity 诊断,并经 compute_dustscaling 反馈缩放系数 |
| 水循环 |
计算活性水冰云的光学厚度与 taucloudtes(CLFvarying 亚格点云还原) |
| CO2 循环 |
计算活性 CO2 冰云光学厚度(温度依赖密度 + CLFvaryingCO2 还原) |
写法特点
- 固定格式 Fortran(
.F,第 6 列续行)。
firstcall、cstdustlevel、i_ice、i_co2ice、naerdust 为 SAVE+THREADPRIVATE。
- 多处硬编码常数:参考波长几何因子
0.75、cstdustlevel0=7、Viking/MGS 顶高与季节系数、Escalier 阈值、CLF 下限 0.01、stormdust/topdust 占位值 1e-25、tau_pref_gcm>50 健全性阈值。
- 数值保护:
max(...,1e-9)、max(...,1e-3)、max(1E-20,...) 等下限钳制。
clearatm/nohmons/clearsky 三个开关使本例程在 callradite 内可被多次调用,分别累计网格内/外、含/不含云的贡献。
iddist/topdustref 是模块级 SAVE,由 conf_phys 配置写入而非本例程内部设定。
复现要点
- 参考气压
odpref=610 Pa(来自 dust_param_mod);柱质量恒用 (pplev(l)-pplev(l+1))/g。
- 光学厚度核心公式(两矩尘埃/冰):
0.75 * Qref / (rho * reffrad) * mmr * Δp / g。
cstdustlevel:freedust 或 rdstorm 为 1(不冻结),否则为 7(前 7 层用第 7 层值冻结)。
freedust=.true. 时 tau_pref_gcm 由 tracer 反算且设 50 的健全性上限;=.false. 时直接等于场景值。
iaervar 决定场景来源;6–8/24–37/4/124–126 走 read_dust_scenario,需配套场景数据文件。
- stormdust/topdust 的最终
aerosol 在 section 5 分别除以 totstormfract/alpha_hmons,复现辐射传输输入时必须包含该折算。
待确认
dust_conrath 的 iddist=0(Pollack90)分支写的是 aerosol(ig,l,1)(硬编码索引 1)而非 aerosol(ig,l,iaer)(行 392)。推断:dust_conrath 在 name_iaer 中通常为第 1 种气溶胶,故 iaer=1;但此处与其它分支用 iaer 的写法不一致,复现非默认气溶胶排序时需留意。待确认:iaer 是否恒为 1。
IRtoVIScoef 仅在 clearatm.and.nohmons(即首次 RT 调用)时更新;其它调用沿用上次值。推断该设计是为只在一次调用里算系数,未在源码注释外进一步说明。
相关页面