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 谱带的贡献累加回 PFLUClwflux.F 在第 201 行调用本例程,之后继续计算每层辐射收支。

定义的符号

符号 类型 行号 作用
lwdiff_mod module 1 封装长波带外红外散射通量汇总例程。
lwdiff subroutine 7 iir=3:nir 的长波带外谱段构造双倍扩散子层,调用 flusv 并输出层界散射通量。

依赖的模块

use 模块 only 列表 用途 待确认
dimradmars_mod nir, npademx, nabsmx, nflev, ndlon, ndlo2 提供红外谱带数、辐射列维度和垂直层维度;数组声明直接使用 nirnflevndlonndlo2 npademxnabsmx 在本文件内未见读取。
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=0NDD=nlaylte*2 求解带外谱带的 hemispheric constant 双流通量。

输入

输入 来源 类型/维度 单位 含义
kdlon lwflux integer column 本次向量化处理的水平列数,循环范围为 1:kdlon
kflev lwflux integer layer 调用方传入的垂直层数,参与 PDBSLPFLUC 的形状声明;实际循环上界使用 nlaylte
pbsur lwflux real(ndlo2,nir) Planck 通量量 每个红外谱带的地表 Planck 量;在本例程中按 pbsur/pi 传给 flusvbsol
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 lwfluxfluxdiff real(ndlo2,2,kflev+1) flux 带外散射通量贡献;第 1 分量累加向上通量,第 2 分量以负号写入向下通量,供 lwflux 后续辐射收支使用。

共享状态与副作用

lwdiff.F 不定义保存型 module 变量,不读写文件,不读取运行时配置,也不打印诊断。它读取 dimradmars_modyomlw_hcomcstfi_h 的共享常数/维度,并把结果写入调用方传入的 PFLUC 数组。所有中间亮度、光学性质和通量数组均为局部工作数组。

一个源码细节是 PFLUC 只在 jk=1:nlaylte 初始化为零,而最终回填循环写 J2=1:nlaylte+1。调用方 lwflux.F 在调用前已把 fluxdiff(:,1:2,nlaylte+1) 置零;复现或单独调用 lwdiff 时需要保留这个接口前提。

核心逻辑

  1. jl=1:kdlonjk=1:nlaylte 初始化 PFLUC(:,1:2,jk),并清零若干局部调整/扩散工作数组。
  2. 设置扩散子层数 NDD=nlaylte*2,清零累计的带外向上/向下通量数组 ZFAHDDZFDHDD
  3. 对每个 CO2 15 微米带外红外谱带 iir=3:nir 循环。
  4. PBTOP(:,iir)/pi 作为最顶端黑体亮度,沿 J1=2:NDD+1PDBSL(:,iir,NDD-J1+2)/pi 反向差分重建每个扩散子层界面的 ZZBHDD;同时设置地表亮度 ZZBSDD=PBSUR(:,iir)/pi
  5. 对每个 LTE 层把 tautotal 拆成两个相等光学厚度子层,并把 omegtotalgtotal 复制到这两个子层。源码用 J2DD1/J2DD2 把物理层顺序反向映射到 flusv 的顶到底层序。
  6. 调用 flusv(KDLON,0,NDD,ZOMEGADD,ZGDD,ZTAUDD,PEMIS,ZZBHDD,ZZBSDD,ZZFAHDD,ZZFDHDD),使用 nsf=0 的直接 hemispheric constant 通量公式。
  7. 将该谱带返回的 ZZFAHDD/ZZFDHDD 累加到跨谱带累计数组 ZFAHDD/ZFDHDD
  8. 谱带循环结束后,把扩散子层界面 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 的长波辐射辅助文件。

写法特点

复现要点

待确认

相关页面