lwb.F
路径
LMDZ.MARS\libf\phymars\lwb.F
所属目录 / 模块
libf\phymars
文件定位
lwb.F 定义 lwb_mod 模块,提供长波辐射主流程中的谱带 Planck 函数预处理例程 lwb。它不直接计算辐射通量,而是在 lwmain_mod.F 的长波 LTE 计算流程开头被调用,根据层温 tlay、层界温度 tlev 和地表温度跳变 dt0,为每个长波红外谱带生成地表、顶层、层中心、层界的 Planck 函数表,以及层温导数和半层差分量。
这些输出随后由 lwflux 使用,用于长波冷却率、地面下行通量、顶层出射长波辐射和净辐射收支计算。源码注释明确说明,本例程使用 Planck 函数的多项式展开;多项式系数来自 yomlw_h 中的 xp(:,jnu),温度归一化基准为 tstand。
定义的符号
| 符号 |
类型 |
行号 |
作用 |
lwb_mod |
module |
1 |
封装长波 Planck 函数和梯度预处理例程。 |
lwb |
subroutine |
7 |
对每个红外谱带、水平列和 LTE 长波层计算 bsurf/btop/blev/blay/dblay/dbsublay。 |
依赖的模块
| use 模块 |
only 列表 |
用途 |
待确认 |
dimradmars_mod |
ndlon, ndlo2, nir |
提供辐射向量列数和红外谱带数,约束输入输出数组形状。 |
否 |
yomlw_h |
nlaylte, xi, tstand, xp |
提供 LTE 长波层数、Planck 多项式基准温度和谱带多项式系数;xi 被 use 但在本例程中未使用。 |
xi 的 use 是否为历史遗留未在本文件内确认 |
调用的关键例程
| 被调用例程 |
所在模块 / 文件 |
调用位置 |
作用 |
| 无 |
- |
- |
本例程只做数组循环和多项式计算,不调用其他用户例程。 |
输入
| 输入 |
来源 |
类型/维度 |
单位 |
含义 |
kdlon |
lwmain |
integer |
column |
本次向量化处理的水平列数,循环范围为 1:kdlon。 |
kflev |
lwmain |
integer |
layer |
调用方传入的垂直层数;输出数组按该维度声明,但实际循环使用 nlaylte。 |
tlev |
lwmain |
real(ndlo2,kflev+1) |
K |
层界温度;用于层界 Planck 函数、顶层 Planck 函数和地表温度基准。 |
tlay |
lwmain |
real(ndlo2,kflev) |
K |
层中心温度;用于层中心 Planck 函数和温度导数。 |
dt0 |
lwmain |
real(ndlo2) |
K |
地表温度相对第一层界温度的跳变;地表 Planck 函数使用 tlev(:,1)+dt0。 |
输出
| 输出 |
去向 |
类型/维度 |
单位 |
含义 |
bsurf |
lwmain -> lwflux |
real(ndlo2,nir) |
Planck 函数值 |
地表谱带 Planck 函数。 |
btop |
lwmain -> lwflux |
real(ndlo2,nir) |
Planck 函数值 |
大气顶层谱带 Planck 函数,等于 blev(:,jnu,nlaylte+1)。 |
blev |
lwmain -> lwflux |
real(ndlo2,nir,kflev+1) |
Planck 函数值 |
各层界的谱带 Planck 函数。 |
blay |
lwmain -> lwflux |
real(ndlo2,nir,kflev) |
Planck 函数值 |
各层中心的谱带 Planck 函数。 |
dblay |
lwmain -> lwi |
real(ndlo2,nir,kflev) |
Planck 函数值 / K |
层中心 Planck 多项式对温度的导数。 |
dbsublay |
lwmain -> lwflux |
real(ndlo2,nir,2*kflev) |
Planck 函数差值 |
每层拆成上下两个半层后,层中心与层界之间的 Planck 差分。 |
共享状态与副作用
lwb.F 不定义保存型模块变量,不读写文件,不打印诊断,也不读取运行时配置。它读取 dimradmars_mod 和 yomlw_h 中的共享常数/表,副作用只限于写入调用方传入的输出数组。临时数组 ztlay、ztlev 为局部数组。
核心逻辑
- 对每个红外谱带
jnu=1:nir 循环。
- 对
jk=1:nlaylte 的层中心和层界循环,把温度归一化为 (T-tstand)/tstand。
- 用
xp(1:6,jnu) 进行五次嵌套多项式求值,分别得到 blev(:,jnu,jk) 和 blay(:,jnu,jk)。
- 对层中心温度计算同一多项式的温度导数,形式为
xp(2)+2*xp(3)*z+...+5*xp(6)*z**4,再除以 tstand 写入 dblay。
- 对大气顶
nlaylte+1 单独计算 blev,并复制到 btop。
- 对地表使用
tlev(:,1)+dt0 计算 bsurf,因此地表 Planck 函数可以不同于第一层界值。
- 对每个层
jk 生成两个半层差分:dbsublay(:,jnu,2*jk-1)=blay-blev(jk),dbsublay(:,jnu,2*jk)=blev(jk+1)-blay。
伪代码
for each infrared band jnu:
for each LTE layer jk:
z_level = (tlev(:,jk) - tstand) / tstand
blev(:,jnu,jk) = polynomial_xp(jnu, z_level)
z_layer = (tlay(:,jk) - tstand) / tstand
blay(:,jnu,jk) = polynomial_xp(jnu, z_layer)
dblay(:,jnu,jk) = derivative_polynomial_xp(jnu, z_layer) / tstand
z_top = (tlev(:,nlaylte+1) - tstand) / tstand
btop(:,jnu) = polynomial_xp(jnu, z_top)
z_surface = (tlev(:,1) + dt0 - tstand) / tstand
bsurf(:,jnu) = polynomial_xp(jnu, z_surface)
for each LTE layer jk:
dbsublay(:,jnu,2*jk-1) = blay(:,jnu,jk) - blev(:,jnu,jk)
dbsublay(:,jnu,2*jk) = blev(:,jnu,jk+1) - blay(:,jnu,jk)
参与的主题流程
| 主题 |
参与方式 |
| 辐射计算 |
lwmain 长波 LTE 流程中的 Planck 函数预处理步骤,位于吸收量、交换系数和通量计算之前。 |
| phymars 核心物理模块目录 |
属于 libf\phymars 的长波辐射辅助文件。 |
写法特点
- 固定格式 Fortran 文件,模块内只有一个子例程。
- 多项式使用 Horner 形式展开,避免显式构造高次幂。
kflev 用于形参维度声明,但实际计算循环使用共享的 nlaylte;复现实验必须保证两者在调用链中一致。
xi 从 yomlw_h 引入但未在本例程使用,可能是长波模块模板化 use 列表的历史遗留。
复现要点
yomlw_h 必须已经初始化 nlaylte、tstand 和 xp(1:6,1:nir),否则本例程只会传播未初始化表值。
kdlon 不应超过 ndlo2/ndlon 所能容纳的向量列数。
kflev 的数组维度必须覆盖 nlaylte+1 层界和 nlaylte 层中心;源码循环不使用 kflev 作为上界。
dt0 会直接改变 bsurf,因此地表温度跳变必须与 lwmain 上游地表能量状态一致。
- 复现风险:
dblay 是对归一化多项式求导后除以 tstand,如果替换 xp 表或 tstand,必须同时检查导数单位和 lwi 的半隐式冷却率使用方式。
待确认
xi 在 lwb.F 中未使用;是否应从 use 列表中移除属于源码维护问题,本页不建议修改源码。
xp 多项式系数的生成来源和适用温度范围不在本文件内说明,需要查 yomlw_h.F90 初始化链或数据表。
相关页面