lwflux.F

路径

LMDZ.MARS\libf\phymars\lwflux.F

所属目录/模块

libf\phymars

文件定位

lwflux.F 定义 lwflux_mod 模块,提供长波 LTE 辐射主流程中的通量、冷却率和净辐射收支汇总例程 lwflux。它位于 lwmain_mod.F 的长波调用链后段:lwmain 先调用 lwb 生成谱带 Planck 函数和半层差分,再准备气体/气溶胶总光学性质,随后在第 160 行调用 lwflux

本例程把 CO2 15 微米带内的净交换率 xi 与带外散射通量 lwdiff 合并。源码先按层-层、地面-层、层-太空、地面-太空组合构造 ksidb,把谱带 1 和 2 的 CO2 贡献合并到索引 3;再调用 lwdiff 计算 iir=3:nir 的扩散散射通量;最后把两部分汇入 netrad,输出每层冷却率 coolrate、地表下行长波通量 fluxground 和大气顶出射长波通量 fluxtop

定义的符号

符号 类型 行号 作用
lwflux_mod module 1 封装长波 LTE 通量、冷却率和辐射收支汇总例程。
lwflux subroutine 7 合并 CO2 15 微米带内净交换率和带外扩散通量,输出 coolrate/fluxground/fluxtop/netrad

依赖的模块

use 模块 only 列表 用途 待确认
dimradmars_mod ndlo2, nir, ndlon, nuco2, nflev 提供辐射列数、红外谱带数、CO2 谱带数和垂直层维度;用于输入输出和局部工作数组声明。
yomlw_h nlaylte, xi, xi_ground, gcp 提供 LTE 长波层数、净交换率表、地面邻层修正系数和 g/cp 换算因子。
lwdiff_mod lwdiff 计算 CO2 15 微米带外 iir=3:nir 的红外散射通量贡献。

调用的关键例程

被调用例程 所在模块/文件 调用位置 作用
lwdiff lwdiff_mod / lwdiff.F lwflux.F 第 201 行 bsurf/btop/dbsublay 和总光学性质求带外散射通量,写入 fluxdiff

输入

输入 来源 类型/维度 单位 含义
ig0 lwmain integer grid index offset 当前批量列在全局物理网格中的起始偏移;访问 xi(ig0+jl,...)xi_ground(ig0+jl,...)
kdlon lwmain integer column 当前向量化处理的水平列数,循环范围为 1:kdlon
kflev lwmain integer layer 调用方传入的垂直层数;形参数组按它声明,核心循环用 nlaylte
dp lwmain real(ndlo2,kflev) Pa 层压强厚度;用于 coolrate = gcp * netrad / dp
bsurf lwb -> lwmain real(ndlo2,nir) Planck 函数值 地表谱带 Planck 函数;用于地面交换、地面到太空交换和 lwdiff
btop lwb -> lwmain real(ndlo2,nir) Planck 函数值 大气顶谱带 Planck 函数;传给 lwdiff 构造带外扩散顶边界。
blev lwb -> lwmain real(ndlo2,nir,kflev+1) Planck 函数值 层界谱带 Planck 函数;本例程只在地面邻层修正中读 blev(:,ja,1)
blay lwb -> lwmain real(ndlo2,nir,kflev) Planck 函数值 层中心谱带 Planck 函数;用于所有净交换率乘积。
dbsublay lwb -> lwmain real(ndlo2,nir,2*kflev) Planck 差分量 半层 Planck 差分;原样传给 lwdiff
tlay, tlev, dt0 lwmain real(...) K 注释说明用于 G2D 输出;当前 lwflux.F 主体未读取这些参数。
emis lwmain real(ndlo2) - 地表发射率;原样传给 lwdiff
tautotal, omegtotal, gtotal lwmain real(ndlo2,kflev,nir) optical depth / - 每层每红外谱带的总光学厚度、单次散射反照率和不对称因子;原样传给 lwdiff

输出

输出 去向 类型/维度 单位 含义
coolrate lwmain -> 下游加热率流程 real(ndlo2,kflev) K/s 每层长波冷却率,按 gcp * netrad / dp 从净辐射收支换算。
netrad lwmain -> lwi real(ndlo2,kflev) W/m2 每层净辐射收支,包含 CO2 带内净交换和 lwdiff 带外扩散通量散度。
fluxground lwmain real(ndlo2) W/m2 到达地面的下行长波通量;由层到地面交换项减去 fluxdiff(:,2,1) 得到。
fluxtop lwmain real(ndlo2) W/m2 大气顶出射长波通量;由到太空交换项加上 fluxdiff(:,1,nlaylte+1) 得到。

共享状态与副作用

lwflux.F 不定义保存型 module 变量,不读写文件,不读取运行时配置,也不打印诊断。它读取 yomlw_h 中的共享表 xixi_ground 和换算因子 gcp,并写入调用方传入的四个输出数组。

源码中有一个诊断分支 computeflux = .false.。当保持默认值时,flw_up/flw_dn/coefu/coefd 仅为局部未输出工作数组;如果源码维护者手动改成 .true.,该分支会计算各层宽带上下行通量,但当前没有对外输出或文件副作用。

核心逻辑

  1. 清零局部净交换率数组 ksidb
  2. i=1:nlayltej=i+1:nlaylteja=1:nuco2 构造层-层交换:xi(ig0+jl,ja,i,j) * (blay(j)-blay(i)),并写入反对称项 ksidb(j,i)=-ksidb(i,j)
  3. 构造地面-层交换:xi(...,0,i) * (bsurf-blay(i)),再用 xi_ground 对地面和第一层之间的邻层贡献做修正。
  4. 构造层-太空交换和地面-太空交换,太空端 Planck 值按源码写法等效为零。
  5. 把 CO2 15 微米带索引 1 和 2 的交换率相加到 ksidb(:,3,:,:)
  6. 先把 fluxdiff(:,1:2,nlaylte+1) 置零,再调用 lwdiff 计算带外散射通量。这个预清零是 lwdiff 回填顶层界面的接口前提。
  7. 对每层 i 汇总 ksidb(:,3,i,j) 得到带内 netrad,再叠加扩散通量散度:-fluxdiff(1,i+1)-fluxdiff(2,i+1)+fluxdiff(1,i)+fluxdiff(2,i)
  8. gcp * netrad / dp 得到冷却率。
  9. 对地面下行通量,累加所有层到地面的 xi * blay 贡献,再减去底界面向下扩散通量 fluxdiff(:,2,1)
  10. 对顶层出射通量,累加地面和各层到太空的净交换贡献,再加上顶界面向上扩散通量 fluxdiff(:,1,nlaylte+1)

伪代码

ksidb = 0

for each layer pair i < j and CO2 band ja:
  ksidb(i,j) = xi(i,j) * (blay(j) - blay(i))
  ksidb(j,i) = -ksidb(i,j)

for each layer i and CO2 band ja:
  ksidb(i,0) = xi(0,i) * (bsurf - blay(i))
  ksidb(0,i) = -ksidb(i,0)

adjust ground-first-layer exchange with xi_ground
build layer-space and ground-space exchange terms
ksidb(:,3,:,:) = ksidb(:,1,:,:) + ksidb(:,2,:,:)

zero fluxdiff at top interface
call lwdiff to fill diffusion flux interfaces

for each layer i:
  netrad(i) = sum_j ksidb(3,i,j)
  netrad(i) += diffusion_flux_divergence(i)
  coolrate(i) = gcp * netrad(i) / dp(i)

fluxground = layer_to_ground_exchange - bottom_downward_diffusion
fluxtop = exchange_to_space + top_upward_diffusion

参与的主题流程

主题 参与方式
辐射计算 长波 LTE 主流程的通量和冷却率汇总阶段;位于 lwb/lwu/lwxd/lwxn/lwxb 准备量之后,lwi 的温度导数/线性化步骤之前。
phymars 核心物理模块目录 属于 libf\phymars 的长波辐射辅助文件。

写法特点

复现要点

待确认

相关页面