aerave.F
快速理解
它做什么: 把气溶胶高分辨率光谱光学性质按普朗克函数加权平均到 GCM 辐射带。被 suaer 调用。
基本过程: 光谱切成 nir 个带 → 黑体辐射函数加权积分原始数据 → 输出各带平均光学性质。
关键结果: 各带平均的 epir/omegir/gir,供辐射传输预处理使用(longir 是输入而非输出)。
路径
LMDZ.MARS\libf\phymars\aerave.F
所属目录/模块
libf/phymars
文件定位
气溶胶辐射性质带平均化工具。将气溶胶的光学性质(消光系数、单次散射反照率、不对称因子)从高分辨率光谱数据通过普朗克函数加权平均到 GCM 的辐射带。用于辐射传输计算前的气溶胶光学性质预处理。
定义的符号
| 符号 | 类型 | 行号 | 作用 |
|---|---|---|---|
aerave_mod |
module | 1 | 气溶胶带平均模块 |
aerave |
subroutine | 7 | 主例程:计算带平均光学性质 |
blackl |
subroutine | 203 | 普朗克黑体辐射函数 |
依赖的模块
| use 模块 | only 列表 | 用途 | 待确认 |
|---|---|---|---|
| (无) | — | 自包含模块,无外部依赖 | — |
调用的关键例程
| 被调用例程 | 所在模块/文件 | 调用位置 | 作用 |
|---|---|---|---|
blackl |
本文件(aerave_mod) | 行 134 | 计算普朗克黑体辐射强度(W/m²/sr/m) |
输入
| 输入 | 来源 | 类型/维度 | 单位 | 含义 |
|---|---|---|---|---|
ndata |
调用方 | integer | — | 光谱数据点数量 |
longdata(ndata) |
调用方 | real array | 米 | 光谱数据波长 |
epdata(ndata) |
调用方 | real array | — | 消光系数(归一化或绝对值) |
omegdata(ndata) |
调用方 | real array | — | 单次散射反照率 |
gdata(ndata) |
调用方 | real array | — | 不对称因子 |
longref |
调用方 | real | 米 | 参考波长(光学厚度已知处) |
epref |
调用方 | real | — | 参考波长处的光学厚度 |
temp |
调用方 | real | K | 温度(用于普朗克加权) |
nir |
调用方 | integer | — | 辐射带数量 |
longir(nir+1) |
调用方 | real array | 米 | 辐射带边界波长 |
输出
| 输出 | 去向 | 类型/维度 | 单位 | 含义 |
|---|---|---|---|---|
epir(nir) |
调用方 | real array | — | 各辐射带平均光学厚度 |
omegir(nir) |
调用方 | real array | — | 各带平均单次散射反照率 |
gir(nir) |
调用方 | real array | — | 各带平均不对称因子 |
qref |
调用方 | real | — | 参考波长处的消光系数 |
omegaref |
调用方 | real | — | 参考波长处的单次散射反照率 |
共享状态与副作用
- 无 module 级变量读写
- 无文件 I/O
- 无诊断输出(诊断代码已注释,行 187-195)
- 局部参数
nirmx=100、nbande=1000硬编码
核心逻辑
参考波长插值(行 87-113):在
longdata中定位longref,线性插值得到qref和omegaref。计算校正因子factep = qref/epref,将epdata转换为qextcorrdata = epdata/factep(使参考波长处的值与输入epref一致)。带循环(行 117-181):对每个辐射带
iir:- 将带宽细分为
nbande=1000个子带(行 121) - 对每个子带
ibande(行 129-171):- 计算子带中心波长
long - 调用
blackl计算普朗克辐射强度emit - 在
longdata中线性插值得到qextcorr、omeg、g - 累加:
totalemit += deltalong*emit,epir += deltalong*emit*qextcorr,omegir += deltalong*emit*omeg*qextcorr,gir += deltalong*emit*omeg*qextcorr*g
- 计算子带中心波长
- 将带宽细分为
带平均计算(行 175-177):
gir(iir) = gir(iir) / omegir(iir)(不对称因子加权平均)omegir(iir) = omegir(iir) / epir(iir)(单次散射反照率加权平均)epir(iir) = epir(iir) / totalemit(iir)(光学厚度加权平均)
blackl 子程序(行 203-223):普朗克函数实现:
B(λ,T) = 2πc₁/λ⁵ / (exp(c₂/λT) - 1)其中
c₁ = hc²,c₂ = hc/k,折射率rind=1(真空)。
伪代码
! 参考波长插值
在 longdata 中定位 longref
线性插值计算 qref, omegaref
factep = qref / epref
qextcorrdata = epdata / factep
! 对每个辐射带
DO iir = 1, nir
deltalong = (longir(iir+1) - longir(iir)) / nbande
初始化 totalemit, epir, omegir, gir 为 0
! 对每个子带
DO ibande = 1, nbande
long = longir(iir) + (ibande - 0.5) * deltalong
emit = blackl(long, temp) ! 普朗克函数
! 插值气溶胶性质
在 longdata 中定位 long
线性插值计算 qextcorr, omeg, g
! 累加(普朗克加权)
totalemit += deltalong * emit
epir += deltalong * emit * qextcorr
omegir += deltalong * emit * omeg * qextcorr
gir += deltalong * emit * omeg * qextcorr * g
END DO
! 计算带平均
gir = gir / omegir
omegir = omegir / epir
epir = epir / totalemit
END DO
参与的主题流程
| 主题 | 参与方式 |
|---|---|
| 辐射计算 | 气溶胶光学性质预处理,为辐射传输提供带平均参数 |
已确认调用链
| 调用方 | 位置 | 作用 |
|---|---|---|
suaer.F90 |
行 25:use aerave_mod, only: aerave |
读入并准备 aerosol 光学数据后调用带平均例程 |
suaer.F90 |
行 422:CALL aerave(...) |
对太阳短波波段计算 epir、omegir、gir |
suaer.F90 |
行 480:CALL aerave(...) |
对红外长波波段计算 epir、omegir、gir |
写法特点
- 固定格式 Fortran(列格式)
- 硬编码参数:
nirmx=100(最大带数)、nbande=1000(每带细分数) blackl使用DOUBLE PRECISION精度- 诊断代码(行 187-195)已注释,用于验证全光谱积分是否接近 σT⁴
- 插值逻辑重复出现两次(参考波长和子带内),未抽取为独立函数
复现要点
- 输入波长
longdata必须为米单位 epref是参考波长处的光学厚度,不是消光系数temp用于普朗克加权,影响带平均结果nbande=1000是固定的细分精度,不可调- 如果
omegir为零(无散射),gir除法会产生 NaN/Inf
待确认
epdata的物理单位和归一化方式(是否已除以某参考值)nirmx=100是否足够(当前 GCM 辐射带数量)- 诊断代码(行 187-195)是否应在生产中启用