suaer.F90
路径
LMDZ.MARS\libf\phymars\suaer.F90
所属目录 / 模块
libf\phymars
文件定位
suaer.F90 定义 suaer_mod 模块(第 1 行)和唯一导出的初始化例程 suaer(第 7 行)。它是辐射链路的气溶胶光学查找表加载器:在 callradite 的首次调用阶段被 CALL SUAER 触发(callradite_mod.F 第 408 行),按 dimradmars_mod::name_iaer 中的气溶胶类型选择外部 ASCII 光学属性文件,读取波长轴、粒径轴、消光效率、单次散射反照率和不对称因子,然后调用 aerave 把高分辨率光谱平均到 GCM 的可见光 nsun=2 波段和红外 nir=4 波段。
本文件不直接计算三维网格内的光学厚度。它填充 dimradmars_mod 中的离散查找表:file_id、longrefvis/longrefir、radiustab、nsize、QVISsQREF、omegavis、gvis、QIRsQREF、omegaIR、gIR、QREFvis/QREFir 和 omegaREFvis/omegaREFir。这些表随后由 aeroptproperties 按实际粒径分布插值/卷积,再由 aeropacity_mod 用于计算各气溶胶光学厚度。
定义的符号
| 符号 |
类型 |
行号 |
作用 |
suaer_mod |
module |
1 |
封装气溶胶光学查找表初始化例程 |
suaer |
subroutine |
7 |
选择并读取每类气溶胶的 VIS/IR ASCII 光学属性表,平均到 GCM 辐射波段,并写入 dimradmars_mod 共享表 |
wvl |
saved allocatable local array |
61 |
当前光学属性文件的波长轴 |
radiusdyn |
saved allocatable local array |
63 |
当前光学属性文件的粒径轴 |
ep |
saved allocatable local array |
66 |
当前文件中每个波长和粒径的消光系数/效率 Qext |
omeg |
saved allocatable local array |
67 |
当前文件中每个波长和粒径的单次散射反照率 |
gfactor |
saved allocatable local array |
68 |
当前文件中每个波长和粒径的不对称因子 |
wvl/radiusdyn/ep/omeg/gfactor threadprivate |
OpenMP directive |
70 |
让临时读表数组在 OpenMP 线程中各自私有 |
依赖的模块
| use 模块 |
only 列表 |
用途 |
待确认 |
dimradmars_mod |
longrefvis, longrefir, nsizemax, long1vis, long2vis, long3vis, long1ir, long2ir, long1co2, long2co2, nsun, nir, naerkind, name_iaer, iaer_*, file_id, radiustab, gvis, omegavis, QVISsQREF, gIR, omegaIR, QIRsQREF, QREFvis, QREFir, omegaREFvis, omegaREFir, nsize |
读取辐射维度、气溶胶名称和输出表;本例程主要写入这些共享表 |
否 |
datafile_mod |
datadir |
拼接 trim(datadir)//"/"//trim(file_id(...)) 外部光学属性文件路径 |
否 |
mod_phys_lmdz_transfert_para |
bcast |
非 MESOSCALE 编译路径下把 master 读好的查找表广播给其他并行进程 |
否 |
callkeys_mod |
dustrefir |
作为尘埃、stormdust、topdust 红外参考波长 longrefir |
否 |
aerave_mod |
aerave |
把高分辨率光学属性按普朗克权重平均到可见/红外 GCM 通道 |
否 |
调用的关键例程
| 被调用例程 |
所在模块 / 文件 |
调用位置 |
作用 |
aerave |
aerave_mod / aerave.F |
第 422 行、第 480 行 |
分别对可见光和红外谱段做带平均,返回 epav/omegav/gav 以及参考波长处的 QREF/omegaREF |
bcast |
mod_phys_lmdz_transfert_para |
第 564-577 行 |
广播 longref*、radiustab、Q*、omega*、g*、nsize 等查找表 |
abort_physic |
物理包公共错误终止例程 |
第 258、275、290、302、309、376、409 行 |
光学文件缺失、读表失败、表格式异常或 nsizemax 不足时终止运行 |
输入
| 输入 |
来源 |
类型/维度 |
单位 |
含义 |
name_iaer(1:naerkind) |
dimradmars_mod,由上游配置/初始化填充 |
character array |
- |
当前运行启用的气溶胶类型名称,驱动 SELECT CASE 选择文件和参考波长 |
naerkind |
dimradmars_mod |
integer scalar |
- |
气溶胶种类数,决定主循环长度 |
datadir |
datafile_mod |
character |
- |
外部光学属性表所在目录 |
dustrefir |
callkeys_mod |
real scalar |
m |
尘埃类气溶胶的红外参考波长 |
nsun/nir |
dimradmars_mod |
integer parameters |
- |
可见光和红外辐射通道数;当前分别为 2 和 4 |
long1vis/long2vis/long3vis |
dimradmars_mod |
real parameters |
m |
两个太阳短波通道的边界 |
long1ir/long1co2/long2co2/long2ir |
dimradmars_mod |
real parameters |
m |
三个红外积分区间边界,之后映射到四个 nir 通道 |
optprop_*.dat |
datadir 运行时目录 |
ASCII tables |
混合 |
每个文件依次提供 nwvl、nsize、wvl、radiusdyn、ep、omeg、gfactor |
输出
| 输出 |
去向 |
类型/维度 |
单位 |
含义 |
file_id(naerkind,2) |
dimradmars_mod |
character array |
- |
每类气溶胶的 VIS/IR 光学属性文件名 |
longrefvis(naerkind) |
dimradmars_mod |
real array |
m |
可见光参考波长;尘埃、水冰和 CO2 冰当前均写入 0.67e-6 |
longrefir(naerkind) |
dimradmars_mod |
real array |
m |
红外参考波长;尘埃类取 dustrefir,水冰取 12.1e-6,CO2 冰取 4.26e-6 |
nsize(naerkind,2) |
dimradmars_mod |
integer array |
- |
每类气溶胶、每个谱段的离散粒径数 |
radiustab(naerkind,2,nsizemax) |
dimradmars_mod |
real array |
m |
离散粒径表,供后续粒径插值/卷积使用 |
QVISsQREF(nsun,naerkind,nsizemax) |
dimradmars_mod |
real array |
- |
可见光各波段 <Qext>/Qext(longrefvis) |
omegavis/gvis |
dimradmars_mod |
real arrays |
- |
可见光各波段单次散射反照率和不对称因子 |
QIRsQREF(nir,naerkind,nsizemax) |
dimradmars_mod |
real array |
- |
红外各通道 Qext/Qext(longrefvis);第 1、2 通道共用 CO2 15 um 带结果 |
omegaIR/gIR |
dimradmars_mod |
real arrays |
- |
红外各通道单次散射反照率和不对称因子 |
QREFvis/QREFir |
dimradmars_mod |
real arrays |
- |
可见/红外参考波长处的消光效率 |
omegaREFvis/omegaREFir |
dimradmars_mod |
real arrays |
- |
可见/红外参考波长处的单次散射反照率 |
共享状态与副作用
- 本例程在
OMP MASTER 区段内读文件、分配临时数组、调用 aerave 并填充全局查找表;非 MESOSCALE 路径随后用 bcast 分发结果。
- 它会清零并重写
dimradmars_mod 中的查找表:第 215-228 行先把 radiustab、QVISsQREF、QIRsQREF、QREF*、omega*、g* 初始化为 0。
- 每个
iaer,idomain 文件会临时分配 wvl/radiusdyn/ep/omeg/gfactor,处理完成后在第 550-554 行释放。
- 找不到文件时会打印
datadir、建议的 callfis.def/datadir 修改方法和在线数据包位置,然后调用 abort_physic。
- 源码树当前
LMDZ.MARS\datadir 未包含 optprop_* 文件;复现运行需要外部 Mars datadir 数据包或用户配置的 datadir。
核心逻辑
- 按气溶胶类型选择文件和参考波长:对
iaer=1..naerkind 循环,按 name_iaer(iaer) 匹配 dust_conrath、dust_doubleq、dust_submicron、h2o_ice、co2_ice、stormdust_doubleq、topdust_doubleq,写入对应 file_id(iaer,1:2) 和 longrefvis/longrefir。
- 清零共享查找表:在读表前把 VIS/IR 的
Q、omega、g、QREF 和 radiustab 表归零,避免残留值污染未覆盖条目。
- 逐气溶胶、逐谱段打开 ASCII 文件:检查
datadir/file_id 是否存在,不存在即终止;存在则打开格式化文本文件。
- 扫描头部并分配临时数组:跳过以
# 或空格开头的行,先读 nwvl 和 nsize(iaer,idomain),再分配 wvl(nwvl)、radiusdyn(nsize)、ep(nwvl,nsize)、omeg(nwvl,nsize)、gfactor(nwvl,nsize)。
- 读取表主体:继续跳过注释/空白行,依次读入波长轴、粒径轴、每个粒径的
ep、omeg 和 gfactor。
- 可见光带平均:对每个粒径,设置太阳温度
tsun=6000,用 long1vis/long2vis/long3vis 构造两个短波通道,调用 aerave,再把 epav/omegav/gav 写入 QVISsQREF/omegavis/gvis。
- 红外带平均并换参考波长:对每个粒径,设置
tsol=215 和三个红外积分区间,调用 aerave 得到相对 longrefir 的 epav;随后乘 QREFir/QREFvis,把红外消光效率统一转为相对 longrefvis 的 QIRsQREF。
- 映射红外通道:
QIRsQREF(1) 和 (2) 使用 CO2 中心带结果 epav(2),(3) 使用 9 um 区间 epav(1),(4) 使用远红外区间 epav(3);omegaIR/gIR 同样映射。
- 释放临时表并广播:当前
iaer,idomain 处理完成后释放临时数组;所有循环结束后在非 MESOSCALE 路径广播共享表。
伪代码
for iaer in 1..naerkind:
select name_iaer(iaer):
set file_id(iaer,VIS), file_id(iaer,IR)
set longrefvis(iaer), longrefir(iaer)
zero radiustab, QVISsQREF, omegavis, gvis, QIRsQREF, omegaIR, gIR, QREF*, omegaREF*
for iaer in 1..naerkind:
for idomain in [VIS, IR]:
path = datadir + "/" + file_id(iaer,idomain)
require path exists
read nwvl and nsize, skipping comments/blank-leading lines
allocate wvl, radiusdyn, ep, omeg, gfactor
read wvl, radiusdyn, ep(:,isize), omeg(:,isize), gfactor(:,isize)
if VIS:
longsun = [long1vis, long2vis, long3vis]
for isize:
require isize <= nsizemax
radiustab(iaer,VIS,isize) = radiusdyn(isize)
aerave(..., longrefvis(iaer), tsun=6000, nsun, longsun, ...)
QVISsQREF(:,iaer,isize) = epav(:)
omegavis(:,iaer,isize) = omegav(:)
gvis(:,iaer,isize) = gav(:)
else:
longir = [long1ir, long1co2, long2co2, long2ir]
for isize:
radiustab(iaer,IR,isize) = radiusdyn(isize)
aerave(..., longrefir(iaer), tsol=215, nir-1, longir, ...)
epav = epav * QREFir(iaer,isize) / QREFvis(iaer,isize)
map epav(2), epav(2), epav(1), epav(3) into QIRsQREF(1:4)
deallocate temporary file arrays
if not MESOSCALE:
bcast all shared optical property tables
参与的主题流程
| 主题 |
参与方式 |
| 辐射 |
在 callradite 首次调用时加载气溶胶光学查找表,是 aeroptproperties、aeropacity、lwmain 和 swmain 的上游数据准备步骤 |
| 尘埃循环 |
为 dust_conrath、dust_doubleq、dust_submicron、stormdust_doubleq 和 topdust_doubleq 提供尘埃光学属性表及参考波长 |
| 水冰/CO2 云辐射 |
为 h2o_ice 和 co2_ice 气溶胶提供 VIS/IR 光学属性表,供云粒径光学参数化使用 |
写法特点
- 自由格式 Fortran 90 模块,但大量延续了历史注释和固定格式风格的分段结构。
- 外部表格式由手写扫描器解析:只跳过首字符为
# 或空格的行;其他非空数据行按固定顺序读取。
file_unit=60 为局部固定文件单元号,文件在每个 iaer,idomain 处理后关闭。
- 红外
QIRsQREF 的命名要按 dimradmars_mod 注释理解:最终相对的是可见光参考波长 longrefvis,不是红外参考波长。
nsizemax=60 是 dimradmars_mod 的编译期上限;若外部表粒径数超过此上限,源码只在 VIS 分支显式 abort。
复现要点
datadir 必须指向包含 optprop_dustvis_TM.dat、optprop_dustir_TM.dat、optprop_dustvis_TM_n50.dat、optprop_dustir_n50.dat、optprop_dustvis_01um_TM.dat、optprop_dustir_01um_TM.dat、optprop_icevis_n30.dat、optprop_iceir_n30.dat、optprop_co2ice_vis_n50.dat、optprop_co2ice_ir_n50.dat 等文件的目录;当前源码树内 datadir 不保证提供这些表。
name_iaer 必须只包含本文件 SELECT CASE 已支持的名称,否则该 iaer 的 file_id/参考波长不会被设置,后续读表会失败或读取未定义路径。
- 外部 ASCII 表必须按源码期望顺序组织:
nwvl、nsize、wvl、radiusdyn、逐粒径 ep、逐粒径 omeg、逐粒径 gfactor。
- 如果外部表粒径数大于
nsizemax,VIS 分支会报错要求提高 dimradmars_mod 中的 nsizemax;IR 分支没有独立的同类显式检查,但共享表第三维仍由 nsizemax 限定。
- 并行复现时要保留
OMP MASTER 加载和非 MESOSCALE bcast 路径,否则非 master 进程可能看不到一致的查找表。
callradite 必须先完成气溶胶名称和索引识别,再调用 suaer;aeroptproperties 依赖 suaer 写入的 radiustab/QVISsQREF/... 表。
待确认
abort_physic 在本文件中被直接调用但没有显式 use;推断依赖工程构建环境中的全局接口或包含路径,复现编译时应保留原工程上下文。
- IR 分支没有像 VIS 分支一样在写
radiustab(iaer,2,isize) 前检查 isize.gt.nsizemax;若某个 IR 光学表粒径数超过上限,实际运行行为需结合 Fortran 边界检查设置确认。
- 外部光学属性表的
ep 是绝对消光效率还是已按某参考值归一化,需要以数据文件说明为准;本例程按 aerave 的 epref=1 路径处理。
相关页面