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_modyomlw_h 中的共享常数/表,副作用只限于写入调用方传入的输出数组。临时数组 ztlayztlev 为局部数组。

核心逻辑

  1. 对每个红外谱带 jnu=1:nir 循环。
  2. jk=1:nlaylte 的层中心和层界循环,把温度归一化为 (T-tstand)/tstand
  3. xp(1:6,jnu) 进行五次嵌套多项式求值,分别得到 blev(:,jnu,jk)blay(:,jnu,jk)
  4. 对层中心温度计算同一多项式的温度导数,形式为 xp(2)+2*xp(3)*z+...+5*xp(6)*z**4,再除以 tstand 写入 dblay
  5. 对大气顶 nlaylte+1 单独计算 blev,并复制到 btop
  6. 对地表使用 tlev(:,1)+dt0 计算 bsurf,因此地表 Planck 函数可以不同于第一层界值。
  7. 对每个层 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 的长波辐射辅助文件。

写法特点

复现要点

待确认

相关页面