lwdiff.F
路径
LMDZ.MARS\libf\phymars\lwdiff.F
所属目录/模块
libf\phymars
文件定位
lwdiff.F 定义 lwdiff_mod 模块,提供长波 LTE 辐射中 CO2 15 微米带外的红外散射通量汇总例程 lwdiff。源码注释把谱带分成两类:索引 1 和 2 的 CO2 15 微米带中,尘埃只作为灰色非散射介质参与;索引 3 到 nir 的带外谱段中,尘埃被当作灰色散射介质处理。
本例程只处理第二类带外谱段。它从 lwflux.F 接收地表/顶层 Planck 值、半层 Planck 差分、每层每谱带的总光学厚度、单次散射反照率和不对称因子;随后把每个 LTE 层拆成两个扩散子层,调用 flusv 计算向上/向下红外散射通量,并把所有 iir=3:nir 谱带的贡献累加回 PFLUC。lwflux.F 在第 201 行调用本例程,之后继续计算每层辐射收支。
定义的符号
| 符号 |
类型 |
行号 |
作用 |
lwdiff_mod |
module |
1 |
封装长波带外红外散射通量汇总例程。 |
lwdiff |
subroutine |
7 |
为 iir=3:nir 的长波带外谱段构造双倍扩散子层,调用 flusv 并输出层界散射通量。 |
依赖的模块
| use 模块 |
only 列表 |
用途 |
待确认 |
dimradmars_mod |
nir, npademx, nabsmx, nflev, ndlon, ndlo2 |
提供红外谱带数、辐射列维度和垂直层维度;数组声明直接使用 nir、nflev、ndlon、ndlo2。 |
npademx、nabsmx 在本文件内未见读取。 |
yomlw_h |
nlaylte |
提供 LTE 长波垂直层数;循环、NDD=nlaylte*2 和输出层界回填均使用它。 |
否 |
comcstfi_h |
pi |
把 Planck 通量量除以 pi,转换为传给 flusv 的黑体亮度量。 |
否 |
flusv_mod |
flusv |
对每个带外谱带求解双流红外散射通量。 |
否 |
调用的关键例程
| 被调用例程 |
所在模块/文件 |
调用位置 |
作用 |
flusv |
flusv_mod / flusv.F |
lwdiff.F 第 199 行 |
以 nsf=0、NDD=nlaylte*2 求解带外谱带的 hemispheric constant 双流通量。 |
输入
| 输入 |
来源 |
类型/维度 |
单位 |
含义 |
kdlon |
lwflux |
integer |
column |
本次向量化处理的水平列数,循环范围为 1:kdlon。 |
kflev |
lwflux |
integer |
layer |
调用方传入的垂直层数,参与 PDBSL 和 PFLUC 的形状声明;实际循环上界使用 nlaylte。 |
pbsur |
lwflux |
real(ndlo2,nir) |
Planck 通量量 |
每个红外谱带的地表 Planck 量;在本例程中按 pbsur/pi 传给 flusv 的 bsol。 |
pbtop |
lwflux |
real(ndlo2,nir) |
Planck 通量量 |
每个红外谱带的大气顶 Planck 量;用于构造扩散子层顶端亮度 ZZBHDD(:,1)。 |
pdbsl |
lwflux |
real(ndlo2,nir,kflev*2) |
Planck 差分量 |
每层拆成两个半层后的 Planck 差分;源码按反向索引 NDD-J1+2 从顶向下重建 ZZBHDD。 |
tautotal |
lwflux |
real(ndlon,nflev,nir) |
optical depth |
每层每红外谱带的总光学厚度;每层被拆成两个子层,各取 0.5*tautotal。 |
omegtotal |
lwflux |
real(ndlon,nflev,nir) |
- |
每层每红外谱带的单次散射反照率;两个子层复制同一层值。 |
gtotal |
lwflux |
real(ndlon,nflev,nir) |
- |
每层每红外谱带的散射不对称因子;两个子层复制同一层值。 |
pemis |
lwflux |
real(ndlo2) |
- |
地表发射率,原样传给 flusv。 |
输出
| 输出 |
去向 |
类型/维度 |
单位 |
含义 |
pfluc |
lwflux 的 fluxdiff |
real(ndlo2,2,kflev+1) |
flux |
带外散射通量贡献;第 1 分量累加向上通量,第 2 分量以负号写入向下通量,供 lwflux 后续辐射收支使用。 |
共享状态与副作用
lwdiff.F 不定义保存型 module 变量,不读写文件,不读取运行时配置,也不打印诊断。它读取 dimradmars_mod、yomlw_h、comcstfi_h 的共享常数/维度,并把结果写入调用方传入的 PFLUC 数组。所有中间亮度、光学性质和通量数组均为局部工作数组。
一个源码细节是 PFLUC 只在 jk=1:nlaylte 初始化为零,而最终回填循环写 J2=1:nlaylte+1。调用方 lwflux.F 在调用前已把 fluxdiff(:,1:2,nlaylte+1) 置零;复现或单独调用 lwdiff 时需要保留这个接口前提。
核心逻辑
- 对
jl=1:kdlon、jk=1:nlaylte 初始化 PFLUC(:,1:2,jk),并清零若干局部调整/扩散工作数组。
- 设置扩散子层数
NDD=nlaylte*2,清零累计的带外向上/向下通量数组 ZFAHDD 和 ZFDHDD。
- 对每个 CO2 15 微米带外红外谱带
iir=3:nir 循环。
- 以
PBTOP(:,iir)/pi 作为最顶端黑体亮度,沿 J1=2:NDD+1 用 PDBSL(:,iir,NDD-J1+2)/pi 反向差分重建每个扩散子层界面的 ZZBHDD;同时设置地表亮度 ZZBSDD=PBSUR(:,iir)/pi。
- 对每个 LTE 层把
tautotal 拆成两个相等光学厚度子层,并把 omegtotal、gtotal 复制到这两个子层。源码用 J2DD1/J2DD2 把物理层顺序反向映射到 flusv 的顶到底层序。
- 调用
flusv(KDLON,0,NDD,ZOMEGADD,ZGDD,ZTAUDD,PEMIS,ZZBHDD,ZZBSDD,ZZFAHDD,ZZFDHDD),使用 nsf=0 的直接 hemispheric constant 通量公式。
- 将该谱带返回的
ZZFAHDD/ZZFDHDD 累加到跨谱带累计数组 ZFAHDD/ZFDHDD。
- 谱带循环结束后,把扩散子层界面
J2DD=(nlaylte-J2+1)*2+1 映射回 LTE 层界面,并写入 PFLUC(:,1,J2)+=ZFAHDD(:,J2DD)、PFLUC(:,2,J2)-=ZFDHDD(:,J2DD)。
伪代码
initialize PFLUC(:, :, 1:nlaylte)
NDD = nlaylte * 2
zero accumulated upward/downward fluxes on NDD+1 interfaces
for infrared band iir from 3 to nir:
ZZBHDD(:,1) = PBTOP(:,iir) / pi
for sublayer interface J1 = 2..NDD+1:
ZZBHDD(:,J1) = ZZBHDD(:,J1-1) - PDBSL(:,iir,NDD-J1+2) / pi
ZZBSDD(:) = PBSUR(:,iir) / pi
for each LTE layer J2:
map the layer to two reversed diffusion sublayers
ZTAUDD(:,sub1:sub2) = tautotal(:,J2,iir) * 0.5
ZOMEGADD(:,sub1:sub2) = omegtotal(:,J2,iir)
ZGDD(:,sub1:sub2) = gtotal(:,J2,iir)
call flusv with nsf=0 on NDD diffusion sublayers
accumulate returned upward/downward fluxes over the band loop
for LTE interface J2 = 1..nlaylte+1:
map interface back to diffusion index J2DD
PFLUC(:,1,J2) += accumulated_upward_flux(:,J2DD)
PFLUC(:,2,J2) -= accumulated_downward_flux(:,J2DD)
参与的主题流程
| 主题 |
参与方式 |
| 辐射计算 |
lwflux 长波 LTE 通量流程中的带外散射计算阶段;位于 Planck 预处理和总光学性质准备之后、每层辐射收支计算之前。 |
| phymars 核心物理模块目录 |
属于 libf\phymars 的长波辐射辅助文件。 |
写法特点
- 固定格式 Fortran 文件,模块内只有一个子例程。
- 谱带循环显式跳过
iir=1:2,与源码注释中 CO2 15 微米带非散射处理相匹配。
- 每个物理层被拆成两个扩散子层,光学厚度对半分,
omega 和 g 直接复制。
flusv 的调用固定传入 nsf=0,因此当前路径不进入 flusv 的 8 点 source-function 积分分支。
- 局部变量
J2BOT/J2TOP 以及若干工作数组在当前源码中没有后续读取,可能是旧版算法或调试路径残留。
复现要点
nlaylte 必须与调用链中的 kflev 数组维度一致;源码循环使用 nlaylte,而形参数组用 kflev 声明。
kdlon 不应超过 ndlon/ndlo2 静态数组容量。
PDBSL 的半层顺序必须与 lwb.F 生成的 dbsublay 一致;lwdiff 使用 NDD-J1+2 反向读取它来重建自顶向下界面亮度。
tautotal、omegtotal、gtotal 在 iir=3:nir 上必须已经由上游气溶胶/气体光学流程填好;本例程不做缺测或范围保护。
- 复现风险:
PFLUC(:,:,nlaylte+1) 的初值依赖调用方预先清零;源码内只初始化到 nlaylte。
- 复现风险:
flusv 内部对 omega、g、tau 的数值奇异情况保护有限,带外光学性质若导致 gama2=0 或三对角分母接近零,风险会传递到本例程。
待确认
dimradmars_mod 中 npademx、nabsmx 在本文件内未使用,是否属于历史 use 列表残留需由源码维护者确认。
ZADJD/ZADJU/ZDISD/ZDISU/ZDBDT/ZFD/ZFDN/ZFU/ZFUP/ZGLAYD/ZGLAYU/ZBHDD/ZBSDD 等局部数组在当前例程主体中未参与最终计算;本页只记录现状,不建议修改源码。
相关页面