lwu.F
快速理解
它做什么: 把层压厚、层温和气溶胶光学性质整理成累积吸收量和气溶胶总光学性质。被 lwmain 调用。
基本过程: 计算 CO₂ 累积吸收量 co2_u/co2_up 和气溶胶透过率 aer_t → 合成总光学性质 tautotal/omegtotal/gtotal。
关键结果: 供 lwxd/lwxn/lwxb 分解路径和 lwdiff 带外散射通量计算。
路径
LMDZ.MARS\libf\phymars\lwu.F
所属目录 / 模块
libf\phymars
文件定位
lwu.F 定义 lwu_mod 模块,提供长波 LTE 辐射主流程中的吸收量预处理例程 lwu。它在 lwmain 调用 lwxb、lwxd、lwxn、lwdiff 和 lwflux 之前,把层压厚、层温、层界面压力和多类气溶胶光学性质整理成三组下游量:
- CO2 15 微米带的累积吸收量
co2_u。 - 带压力效应的累积吸收量
co2_up。 - 气溶胶吸收累计量对应的 CO2 带透过率
aer_t,以及所有 IR 带的总光学厚度、单次散射反照率和非对称因子tautotal/omegtotal/gtotal。
这些输出随后被 lwxb、lwxd、lwxn 分解成不同层对和边界交换路径,再交给 lwtt 计算 CO2 透过率;tautotal/omegtotal/gtotal 还会进入 lwdiff 的带外散射通量计算。
定义的符号
| 符号 | 类型 | 行号 | 作用 |
|---|---|---|---|
lwu_mod |
module | 1 | 封装长波吸收量和气溶胶光学预处理例程。 |
lwu |
subroutine | 7 | 计算 CO2 累积吸收量、压力缩放吸收量、气溶胶吸收透过率和 IR 带总单散射参数。 |
依赖的模块
| use 模块 | only 列表 | 用途 | 待确认 |
|---|---|---|---|
dimradmars_mod |
ndlo2, nir, nuco2, ndlon, nflev |
提供长波辐射数组的水平、垂直和谱带维度上限。 | 否 |
dimradmars_mod |
naerkind |
提供气溶胶光学性质类别数。 | 否 |
yomlw_h |
nlaylte, tref, at, bt, cst_voigt |
提供 LTE 长波层数、参考温度和 CO2 温度/Voigt 修正系数。 | 否 |
comcstfi_h |
g |
把压力厚度换算为质量路径时使用重力加速度。 | 否 |
调用的关键例程
| 被调用例程 | 所在模块 / 文件 | 调用位置 | 作用 |
|---|---|---|---|
| 无 | - | - | lwu 只做本地数组循环和指数/除法计算,不调用其他用户例程。 |
输入
| 输入 | 来源 | 类型/维度 | 单位 | 含义 |
|---|---|---|---|---|
kdlon |
lwmain |
integer |
column | 当前向量块内有效水平列数。 |
kflev |
lwmain |
integer |
layer | 调用接口传入的垂直层数;实际循环使用 yomlw_h::nlaylte。 |
dp |
lwmain |
real(ndlo2,kflev) |
Pa | 层压厚,用于 CO2 吸收量质量路径换算。 |
plev |
lwmain |
real(ndlo2,kflev+1) |
Pa | 层界面压力,用其平方差构造压力缩放吸收量。 |
tlay |
lwmain |
real(ndlo2,kflev) |
K | 层温,用于相对 tref 的温度修正。 |
aerosol |
lwmain |
real(ndlo2,kflev,naerkind) |
optical depth | 每类气溶胶在参考波长的层光学厚度。 |
QIRsQREF3d |
lwmain |
real(ndlo2,kflev,nir,naerkind) |
- | IR 谱带消光系数相对参考波长的比例。 |
omegaIR3d |
lwmain |
real(ndlo2,kflev,nir,naerkind) |
- | 每类气溶胶、每个 IR 谱带的单次散射反照率。 |
gIR3d |
lwmain |
real(ndlo2,kflev,nir,naerkind) |
- | 每类气溶胶、每个 IR 谱带的非对称因子。 |
输出
| 输出 | 去向 | 类型/维度 | 单位 | 含义 |
|---|---|---|---|---|
aer_t |
lwxb/lwxd/lwxn |
real(ndlo2,nuco2,kflev+1) |
- | CO2 谱带用的累积气溶胶吸收透过率,底部向上累积并以 1e-30 为下限。 |
co2_u |
lwxb/lwxd/lwxn |
real(ndlo2,nuco2,kflev+1) |
g cm-2 风格的吸收路径 | 经温度修正、pview 斜路径和 CO2 体积分数修正后的累积 CO2 吸收量。 |
co2_up |
lwxb/lwxd/lwxn |
real(ndlo2,nuco2,kflev+1) |
压力缩放吸收路径 | 使用界面压力平方差和 pref 缩放后的累积 CO2 吸收量。 |
tautotal |
lwdiff/lwflux |
real(ndlo2,kflev,nir) |
optical depth | 多类气溶胶按 QIRsQREF3d * aerosol 加权合并后的总 IR 光学厚度。 |
omegtotal |
lwdiff/lwflux |
real(ndlo2,kflev,nir) |
- | 多类气溶胶消光加权平均后的单次散射反照率。 |
gtotal |
lwdiff/lwflux |
real(ndlo2,kflev,nir) |
- | 多类气溶胶按散射光学厚度加权平均后的非对称因子。 |
共享状态与副作用
lwu.F 不定义保存型模块变量,不读写文件,也不打印诊断。它读取 dimradmars_mod、yomlw_h 和 comcstfi_h 中的共享常量/系数,副作用限于写入调用方提供的输出数组。
核心逻辑
- 设置硬编码常数:
pview=1.66、co2c=0.95、pref=101325.,并把每个层界面压力预先平方到plev2。 - 对每类气溶胶
n、每个 IR 谱带ja、每层jk、每列jl累加tautotal、omegtotal和gtotal。 - 把
gtotal除以散射光学厚度加权和omegtotal,再把omegtotal除以总光学厚度tautotal,得到有效非对称因子和单次散射反照率。 - 从模型顶层向下累积气溶胶吸收量
aer_a,每层贡献为tautotal * (1 - omegtotal)。 - 初始化顶界
co2_u/co2_up=0、aer_t=1。 - 从模型顶层向下遍历 CO2 谱带。温度偏差
tx被限制在[-70,70] K,用at/bt/cst_voigt生成phi和psi温度修正。 - 更新
co2_u += pview/(10*g) * phi * dp * co2c,以及co2_up += pview/(10*g*2*pref) * psi * (plev2(jkl)-plev2(jkl+1)) * co2c。 - 输出 CO2 带气溶胶透过率
aer_t=max(exp(-pview*aer_a),1e-30),避免很厚水冰云让透过率舍入到严格零并触发后续 NaN。
伪代码
pview = 1.66
co2c = 0.95
pref = 101325
for level boundary jk:
plev2(:,jk) = plev(:,jk)^2
tautotal = 0
omegtotal = 0
gtotal = 0
for aerosol kind n:
for IR band ja:
for layer jk:
for column jl:
tau_n = QIRsQREF3d(jl,jk,ja,n) * aerosol(jl,jk,n)
tautotal += tau_n
omegtotal += tau_n * omegaIR3d(jl,jk,ja,n)
gtotal += tau_n * omegaIR3d(jl,jk,ja,n) * gIR3d(jl,jk,ja,n)
gtotal = gtotal / omegtotal
omegtotal = omegtotal / tautotal
aer_a(top boundary) = 0
for layers from top to bottom:
aer_a(layer bottom) = aer_a(layer top) + tautotal * (1 - omegtotal)
co2_u(top boundary) = 0
co2_up(top boundary) = 0
aer_t(top boundary) = 1
for layers from top to bottom:
tx = clamp(tlay - tref, -70, 70)
phi = exp((at(1)*tx + bt(1)*tx^2) / cst_voigt(2))
psi = exp(2 * (at(2)*tx + bt(2)*tx^2))
co2_u += pview/(10*g) * phi * dp * co2c
co2_up += pview/(10*g*2*pref) * psi * pressure_square_difference * co2c
aer_t = max(exp(-pview*aer_a), 1e-30)
参与的主题流程
| 主题 | 参与方式 |
|---|---|
| 辐射计算 | 在长波 LTE 主流程中准备 CO2 吸收路径和气溶胶光学输入,支撑后续 CO2 净交换率、带外散射通量和冷却率计算。 |
| phymars 核心物理模块目录 | 属于 libf\phymars 长波辐射辅助文件组。 |
写法特点
- 固定格式 Fortran 文件,模块内只有一个公开子例程。
kflev是接口维度参数,但主要垂直循环边界来自yomlw_h::nlaylte;复现时二者必须与辐射维度初始化保持一致。pview、co2c、pref是例程内部硬编码常数,不从配置文件读取。- 源码注释明确
10*g用于把kg m-2转成g cm-2风格的路径量。 - 气溶胶透过率对下限做了
1e-30钳制;但gtotal/omegtotal和omegtotal/tautotal的归一化没有显式零保护。
复现要点
yomlw_h::ini_yomlw_h必须先初始化nlaylte、tref、at、bt和cst_voigt,否则 CO2 温度修正不可复现。dimradmars_mod的ndlo2/nir/nuco2/ndlon/nflev/naerkind必须与调用方数组形状一致。comcstfi_h::g必须已经由物理常数初始化路径赋值;co2_u/co2_up直接除以g。- 若某层某谱带
tautotal=0或散射加权和omegtotal=0,源码在第 134-135 行会直接除零;复现无气溶胶或全零光学厚度个例时需要按源码行为检查。 dp和plev应保持正压厚与自上而下单调关系;co2_up使用plev2(jkl)-plev2(jkl+1)。
待确认
pview=1.66和co2c=0.95在当前流程中是否仍代表所有长波调用场景;本页只记录源码硬编码事实。- 气溶胶总性质归一化是否依赖上游保证
tautotal和散射光学厚度非零;源码本身没有保护。
相关页面
- radiation
- phymars/index
- lwb
- lwdiff
- lwflux
- lwi
- lwtt
- lwmain_mod - 长波 LTE 主调度入口,直接调用本例程。
- lwxb
- lwxd
- lwxn
- yomlw_h.md:长波辐射共享参数。