lwb.F
快速理解
它做什么: 为每个 CO₂ 红外谱带生成 Planck 函数和温度导数预处理表。被 lwmain 调用。
基本过程: 用 yomlw_h::xp 多项式系数对层温/层界温度做 Planck 多项式展开。
关键结果: bsurf/btop/blay/blev/dblay,供 lwflux 在冷却率和通量计算中使用。
路径
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初始化链或数据表。
相关页面
- radiation
- phymars/index
- flusv
- lwmain_mod - 长波 LTE 主调度入口,直接调用本例程。
- lwdiff
- lwflux
- lwi
- lwu
- dimradmars_mod - 提供长波辐射维度常数和谱带定义。
- yomlw_h.md:长波辐射共享参数。