callradite_mod.F
路径
LMDZ.MARS\libf\phymars\callradite_mod.F
所属目录 / 模块
libf/phymars
MODULE callradite_mod
文件定位
callradite_mod.F 是 phymars 辐射传输的主调度入口。它不直接实现长波或短波辐射主算法,而是在每个辐射时间步完成以下工作:识别当前配置启用的气溶胶 scatterer,首次调用时加载光学查找表;把 tracer/微物理状态转成辐射需要的粒径和三维光学参数;计算每层气溶胶光学厚度;按 ndomainsz 把水平网格切成子域;在 LTE 有效层 nlaylte 内调用 lwmain 和 swmain;最后把长波/短波加热率和地表/顶层通量写回全局输出数组。
它的上游主要是 physiq_mod.F 的 callrad 分支;rocketduststorm_mod.F90 和 topmons_mod.F90 也会进行二次辐射调用,用来估算 stormdust 或 topdust 带来的额外辐射加热。它的下游是 updatereffrad、aeroptproperties、aeropacity、lwmain 和 swmain。
定义的符号
| 符号 | 类型 | 行号 | 作用 |
|---|---|---|---|
callradite_mod |
module | 1 | 辐射调用入口模块 |
callradite |
subroutine | 7-616 | 辐射调度例程;准备气溶胶光学输入,分块调用长波/短波主程序,输出加热率和通量 |
firstcall |
LOGICAL,SAVE, THREADPRIVATE |
291-292 | 首次调用时识别 scatterer、写 gcp 并调用 SUAER;后续调用跳过这些初始化 |
本文件没有 common block,没有其他 SAVE 局部状态。
依赖的模块
| use 模块 | only 列表 | 用途 | 待确认 |
|---|---|---|---|
aeropacity_mod |
aeropacity |
根据 tracer、粒径和光学参数计算逐层/柱气溶胶光学厚度 | |
updatereffrad_mod |
updatereffrad |
从 dust/H2O/CO2 tracer 和微物理状态更新 reffrad/nueffrad |
|
aeroptproperties_mod |
aeroptproperties |
按 reffrad/nueffrad 对查找表做尺寸分布积分,输出 VIS/IR 三维散射参数 |
|
dimradmars_mod |
ndomainsz, nflev, nsun, nir, naerkind, name_iaer, iaer_*, flux_1AU |
辐射维度、scatterer 名称/索引、太阳常数和光学表共享状态 | |
yomlw_h |
gcp, nlaylte |
gcp=g/cpp 由本文件首次写入;nlaylte 限定 LTE 辐射计算层数 |
|
comcstfi_h |
g, cpp |
计算 gcp,并作为辐射链物理常数上下文 |
|
time_phylmdz_mod |
daysec |
仅用于注释掉的调试输出 | |
lwmain_mod |
lwmain |
长波热红外辐射主程序 | |
swmain_mod |
swmain |
短波太阳辐射主程序 | |
suaer_mod |
suaer |
首次调用时加载离散气溶胶光学查找表 | |
dust_param_mod |
doubleq, active, submicron |
决定 dust scatterer 名称和索引匹配路径 | |
callkeys_mod |
water, activice, rdstorm, topflows, co2clouds, activeco2ice |
决定 H2O ice、CO2 ice、stormdust、topdust scatterer 是否应存在 |
调用的关键例程
| 被调用例程 | 所在模块 / 文件 | 调用位置 | 作用 |
|---|---|---|---|
abort_physic |
公共物理错误处理 | 393 | scatterer 数量/名称与 naerkind 不一致时终止 |
SUAER / suaer |
suaer.F90 |
408 | 首次调用时加载 VIS/IR 气溶胶光学查找表 |
updatereffrad |
updatereffrad_mod.F |
418-421 | 更新 dust/stormdust/topdust/H2O ice/CO2 ice 的辐射有效半径和方差 |
aeroptproperties |
aeroptproperties.F |
424-428 | 由粒径分布积分得到 QVISsQREF3d/omegaVIS3d/gVIS3d 和 IR 对应场 |
aeropacity |
aeropacity_mod.F |
430-436 | 计算 aerosol、tau、taucloudtes、dsodust/dsords/dsotop 和尘埃缩放相关输出 |
lwmain |
lwmain_mod.F |
533-539 | 在当前子域上计算长波加热率、地表/顶层长波通量和长波净辐射 |
swmain |
swmain_mod.F |
547-551 | 在当前子域上计算短波加热率和上下行短波通量 |
直接调用方
| 调用方 | 位置 | 调用目的 |
|---|---|---|
physiq_mod.F::physiq |
1097-1107 | 主辐射调用,clearsky=.false.,计算含云/背景状态的 zdtlw/zdtsw 和辐射通量 |
physiq_mod.F::physiq |
1121-1134 | CLFvarying 时的 clear-sky 二次调用,随后按 totcloudfrac 混合 clear/cloudy 通量和加热率 |
rocketduststorm_mod.F90 |
259-267 | stormdust 二次辐射试算,获得尘暴额外加热 |
topmons_mod.F90 |
291-299 | topdust 二次辐射试算,获得山顶尘流额外加热并推导辐射驱动垂直速度 |
输入
| 输入 | 来源 | 类型 / 维度 | 单位 | 含义 |
|---|---|---|---|---|
icount |
physiq 或二次辐射调用方 |
integer | - | 物理步计数;传给 lwmain |
ngrid, nlayer, nq |
调用方 | integer | - | 水平格点、垂直层和 tracer 数 |
zday, ls |
轨道/季节状态 | real | sol, rad | 自 Ls=0 起日期和太阳经度;aeropacity 用于尘埃场景 |
pq(ngrid,nlayer,nq) |
物理 tracer 状态 | real | kg/kg 或 tracer 自身单位 | dust、water ice、CO2 ice、stormdust/topdust 等光学厚度和粒径输入 |
albedo(ngrid,2) |
地表状态 | real | - | 两个短波太阳波段地表反照率 |
emis(ngrid) |
地表状态 | real | - | 热红外发射率 |
mu0(ngrid), fract(ngrid) |
太阳几何 | real | - | 太阳天顶角余弦和当前步日照分数 |
pplev, pplay |
大气网格 | real | Pa | 层界面和层中心压力 |
pt, tsurf |
热力状态 | real | K | 大气层温度和地表温度 |
dist_sol |
轨道状态 | real | AU | 日火距离;短波太阳常数按 1/dist_sol^2 缩放 |
co2ice(ngrid) |
地表 CO2 冰 | real | kg/m2 | 传给长波主程序用于 CO2 ice 相关边界 |
totstormfract, clearatm |
stormdust 调用上下文 | real/logical | - | stormdust 亚格点面积分数;是否计算不含 stormdust 的背景大气 |
nohmons |
topdust 调用上下文 | logical | - | 是否计算不含 topdust/hmons 的背景大气 |
clearsky, totcloudfrac |
水冰云分数路径 | logical/real | - | CLFvarying 下是否排除云,以及总云分数 |
输出
| 输出 | 去向 | 类型 / 维度 | 单位 | 含义 |
|---|---|---|---|---|
dtlw, dtsw |
调用方温度倾向 | real (ngrid,nlayer) |
K/s | 长波和短波辐射加热率;nlaylte+1:nlayer 被置零 |
fluxsurf_lw, fluxtop_lw |
地表能量/诊断 | real (ngrid) |
W/m2 | 地表向下长波通量、顶层向上长波通量 |
fluxsurf_dn_sw, fluxsurf_up_sw |
地表能量/诊断 | real (ngrid,2) |
W/m2 | 两个太阳波段的地表下行/上行短波通量 |
fluxtop_dn_sw, fluxtop_up_sw |
诊断/能量收支 | real (ngrid,2) |
W/m2 | 大气顶下行/上行短波通量 |
tau_pref_scenario, tau_pref_gcm |
尘埃缩放/诊断 | real (ngrid) |
- | 场景规定和 GCM 计算的参考压力处尘埃柱光学厚度 |
tau(ngrid,naerkind) |
诊断/后续粒径更新 | real | - | 每类气溶胶柱总可见光光学厚度 |
aerosol(ngrid,nlayer,naerkind) |
lwmain/swmain 输入和诊断 |
real | - | 每层每类气溶胶可见光光学厚度 |
dsodust, dsords, dsotop |
尘埃过程 | real (ngrid,nlayer) |
- | density-scaled opacity,分别用于背景尘埃、stormdust 和 topdust |
tauscaling, dust_rad_adjust, IRtoVIScoef |
尘埃缩放共享状态 | real (ngrid) |
- | aeropacity 更新的尘埃/场景缩放系数 |
rdust, rstormdust, rtopdust, rice, nuice, riceco2, nuiceco2 |
诊断/下游 | real arrays | m 或 - | 各类气溶胶粒径和方差 |
taucloudtes |
云诊断 | real (ngrid) |
- | 用 IR 吸收效率计算的水冰云 TES 对比不透明度 |
共享状态与副作用
- 首次调用会写
dimradmars_mod中的iaer_dust_conrath、iaer_dust_doubleq、iaer_dust_submicron、iaer_h2o_ice、iaer_co2_ice、iaer_stormdust_doubleq、iaer_topdust_doubleq。这些索引由name_iaer和开关组合决定。 - 首次调用会写
yomlw_h::gcp = g/cpp,供长波/短波链使用。 - 首次调用会调用
suaer,后者读取外部光学表并写入dimradmars_mod的共享查找表。 - 每次调用都会通过
updatereffrad写入粒径输出数组,并可能更新dimradmars_mod::nueffdust。 - 每次调用都会通过
aeropacity更新tauscaling、dust_rad_adjust、IRtoVIScoef、tau、aerosol、dsodust/dsords/dsotop等输出。 - 本文件自身没有
write_output调用;尾部调试打印全部被注释。
初始化 / firstcall / restart / diagnostic 行为
- 行 301-304 每次调用都重新计算
ndomain=(ngrid-1)/ndomainsz+1。注释说明该逻辑被移出firstcall,用于支持 nesting 或演化网格。 - 行 306-413 只在
firstcall执行:打印子域切分信息;按物理开关和name_iaer匹配 scatterer;若aer_count != naerkind,打印已识别项并abort_physic;成功后写gcp并调用SUAER。 - 本文件不读写 restart;它依赖上游在辐射调用前准备
nlaylte。physiq_mod.F在每 sol 开头调用nlthermeq更新nlaylte。 - 尾部行 597-613 保留了调试打印模板,可打印辐射输入和每层
dtsw/dtlw,但当前全部注释,不产生运行时诊断输出。
核心流程
1. Scatterer 识别和光学表加载
首次调用时,源码先把所有 iaer_* 置零,再按开关识别应出现的气溶胶名称:
(.NOT.active)要求dust_conrath。doubleq.AND.active要求dust_doubleq。submicron.AND.active要求dust_submicron。water.AND.activice要求h2o_ice。co2clouds.AND.activeco2ice要求co2_ice。rdstorm.AND.active要求stormdust_doubleq。topflows.AND.active要求topdust_doubleq。
每匹配一个名称就写对应 iaer_* 索引并递增 aer_count。aer_count 必须等于 naerkind,否则说明 callphys.def 中的气溶胶数量、名称或开关不一致,程序终止。通过校验后,SUAER 读取外部光学属性表。
2. 气溶胶粒径、光学属性和光学厚度准备
每次调用都按固定顺序执行三段:
updatereffrad:从pq、tauscaling、已有tau、pplay和pt推导rdust/rice/riceco2/...,并填reffrad/nueffrad。aeroptproperties:用suaer预加载的离散光学表和reffrad/nueffrad,生成每个格点/层/气溶胶的 VIS 与 IR 散射参数。aeropacity:计算aerosol、tau、taucloudtes、dsodust/dsords/dsotop,并处理场景尘埃、stormdust/topdust、clear-sky 等开关。
这三段的顺序不能调换:aeroptproperties 依赖粒径,aeropacity 依赖参考波长的 QREF* 和粒径。
3. 子域切分
行 445-451 按 ndomainsz 切分水平网格。每个子域起点 ig0=(jd-1)*ndomainsz,最后一个子域大小 nd=ngrid-ig0,其余为 ndomainsz。这是为高分辨率/LES 节省辐射工作数组内存。
子域内行 456-507 复制 nlaylte 层以内的 VIS/IR 光学参数、压力、温度、气溶胶光学厚度和反照率。nlaylte 以上不传给 lwmain/swmain。
4. 层界温度构造
行 509-528 构造 zztlev:
- 第一个界面用第一、第二层温度按压力外推到地表上方界面;
- 中间界面用相邻层温度平均;
- 顶部界面取第
nlaylte层温度。
同时 zdt0=tsurf-zztlev(:,1) 作为地表和最低层界面温度差传给长波链。
5. 长波和短波调用
行 533-539 调 lwmain。输入包括子域层厚 zdp、地表温度差 zdt0、发射率、界面压力/温度、层温、气溶胶光学厚度、IR 光学参数和 co2ice。输出 zzdtlw、fluxsurf_lw、fluxtop_lw 和 znetrad。
行 543-551 调 swmain。先用 cste_mars=flux_1AU/(dist_sol*dist_sol) 计算当前日火距离下的太阳常数,再传入 albedo、mu0、层厚、界面压力、aerosol、fract 和 VIS 光学参数,输出 zzdtsw 与短波上下行通量。
6. 合并输出和 LTE 层之外置零
行 556-584 把子域 zzdtlw/zzdtsw 和短波 flux 拷回全局数组。fluxsurf_lw/fluxtop_lw 已由 lwmain 直接写到全局切片 ig0+1 起始位置。行 588-596 对 nlaylte+1:nlayer 的 dtlw/dtsw 置零,符合文件头注释“只在 LTE 有效层计算辐射倾向”的设计。
伪代码
callradite:
ndomain = ceil(ngrid / ndomainsz)
if firstcall:
reset iaer_* indices
for each enabled physical aerosol branch:
find matching name_iaer entry and set iaer_* index
if aer_count != naerkind:
abort with scatterer consistency error
gcp = g / cpp
call suaer to load optical lookup tables
firstcall = false
call updatereffrad to compute reffrad/nueffrad
call aeroptproperties to compute VIS/IR 3D optical properties
call aeropacity to compute aerosol optical depth and dust/cloud diagnostics
for each horizontal subdomain jd:
copy nlaylte layers of optical fields, pressure, temperature, aerosol, albedo
build interface temperatures zztlev and surface temperature jump zdt0
call lwmain for thermal IR heating and LW fluxes
cste_mars = flux_1AU / dist_sol^2
call swmain for solar heating and SW fluxes
copy subdomain heating rates and fluxes back to global outputs
if nlayer > nlaylte:
dtlw(:, nlaylte+1:nlayer) = 0
dtsw(:, nlaylte+1:nlayer) = 0
参与的主题流程
| 主题 | 参与方式 |
|---|---|
| 辐射 | 主入口,调度 LTE 长波、短波、气溶胶光学准备和 flux/heating 输出 |
| 尘埃循环 | 读取 dust/stormdust/topdust tracer,计算粒径、光学厚度和 density-scaled opacity,并支持背景/风暴/山顶尘流的多次辐射试算 |
| 水循环 | water.AND.activice 时要求 h2o_ice scatterer;CLFvarying 时支持 clear/cloudy 辐射混合 |
| CO2 循环 | co2clouds.AND.activeco2ice 时要求 co2_ice scatterer;传入地表 co2ice 给长波链 |
| 热层 / LTE-NLTE | 只计算 nlaylte 以内的 LTE 辐射倾向;nlaylte 由 nlthermeq 根据当前大气剖面更新 |
| 地表能量收支 | 输出地表长波、短波上下行通量,供地表温度/能量平衡路径使用 |
写法特点
- 固定格式 Fortran 模块;主例程是调度器,真正长波/短波和气溶胶公式分散在被调用例程中。
firstcall为SAVE THREADPRIVATE,但它只保护一次性 scatterer 识别和光学表加载;每步的ndomain会重新计算。- 多次辐射调用通过
clearatm/nohmons/clearsky这三个逻辑开关复用同一接口,分别排除 stormdust、topdust 或云。 - 只复制
nlaylte层到子域工作数组,最后显式把更高层加热率置零;NLTE/NIR CO2 处理在physiq的其他路径中完成,不在本文件内。 gVIS3d在调用aeroptproperties前被清零,子域zgVIS3d/zflux*也会清零,避免沿用上次调用工作数组。
复现要点
name_iaer、naerkind和物理开关必须一致;否则首次调用会中止。新增气溶胶时必须同步conf_phys/callphys.def名称、本文件识别分支、suaer光学表和aeropacity光学厚度公式。- 必须保持
SUAER -> updatereffrad -> aeroptproperties -> aeropacity -> lwmain/swmain的数据顺序。 nlaylte由physiq侧调用nlthermeq更新;本文件只读取它。复现高层加热率时不要把callradite的零值误解成 NLTE 冷却。CLFvarying的 clear/cloudy 混合不在本文件内完成,而在physiq调两次callradite后按totcloudfrac混合。fluxsurf_lw和fluxtop_lw由lwmain直接写入传入的全局切片;短波通量则先存于子域zfluxd_sw/zfluxu_sw,再由本文件拷回。dist_sol必须是 AU;短波太阳常数按flux_1AU/(dist_sol^2)缩放。
待确认
- 首次调用的 scatterer 校验只比较
aer_count与naerkind,且打印已识别名称时循环到aer_count而不是遍历实际匹配到的iaer_*索引;若名称顺序异常但数量相等,是否会被完全捕获需结合conf_phys初始化确认。 igout和daysec只出现在注释掉的调试输出中;是否仍需要保留在接口中待确认。- 文件头仍提到
SULW,但源码行 410 注释说明该步骤已移到ini_yomlw_h;长波初始化生命周期以yomlw_h页面为准。 nflev作为子域数组维度传给lwmain/swmain,实际循环限制使用nlaylte;nflev与nlaylte的约束关系由dimradmars_mod/nlthermeq保证,本文未进一步验证。
相关页面
- radiation - 辐射主题流程。
- physiq_mod - 主调用方和 clear/cloudy 混合位置。
- lwmain_mod.F - 长波主程序:Planck/吸收量/交换率/通量/半隐式冷却率调度。
- swmain_mod.F - 短波主程序:两太阳谱段、Fouquart/Toon 分支、通量缩放和短波加热率。
- updatereffrad_mod - 粒径/方差更新。
- aeroptproperties - 三维散射参数计算。
- aeropacity_mod - 气溶胶光学厚度和尘埃缩放。
- suaer - 光学查找表加载。
- dimradmars_mod - 辐射维度和 scatterer 共享状态。
- yomlw_h -
gcp、nlaylte和长波共享表。 - nlthermeq - 更新 LTE 计算层数。
- rocketduststorm_mod, topmons_mod