lwu.F
路径
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 和散射光学厚度非零;源码本身没有保护。
相关页面