aerave.F
路径
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)是否应在生产中启用
相关页面