yomlw_h.F90
路径
LMDZ.MARS\libf\phymars\yomlw_h.F90
所属目录 / 模块
libf/phymars
文件定位
yomlw_h.F90 定义模块 yomlw_h,是长波 LTE 辐射链的共享状态和系数表模块。它不直接计算通量或冷却率,而是保存 Planck 多项式系数 xp、CO2 吸收温度依赖系数 at/bt、Padé 透过率系数 ga/gb、Voigt 修正常数 cst_voigt、LTE 计算层数 nlaylte,以及长波净交换率缓存 xi/xi_ground/xi_emis。
初始化由 phys_state_var_init_mod 调用 end_yomlw_h 后再调用 ini_yomlw_h(ngrid) 完成。ini_yomlw_h 依据 dimradmars_mod::nuco2/nflev 和传入的水平列数分配长波交换率数组,并把旧 sulw.F 中的固定系数移入 F90 模块状态。下游 lwb/lwu/lwtt/lwflux/lwi/lwxd/lwxn/lwxb 读取或写入这些表,短波和 NLTE 混合路径也读取 nlaylte 来限定 LTE 层范围。
定义的符号
| 符号 |
类型 |
行号 |
作用 |
yomlw_h |
module |
1 |
长波辐射共享状态与系数表模块。 |
at, bt |
saved real arrays |
6-7 |
CO2 吸收量温度依赖修正系数,供 lwu 使用。 |
tref |
saved real scalar |
8 |
吸收温度依赖参考温度,默认 200.0 K。 |
xp(6,nir) |
saved real array |
9 |
每个红外谱带的 Planck 函数五次多项式系数,供 lwb 使用。 |
tstand |
saved real scalar |
10 |
Planck 多项式的参考温度,默认 200.0 K。 |
ga, gb |
saved real arrays |
11-12 |
CO2 长波透过率 Padé 近似的分子/分母系数,供 lwtt 使用。 |
cst_voigt |
saved real array |
13 |
Voigt 等效吸收量修正常数,供 lwtt 使用。 |
gcp |
saved real scalar |
14 |
g/cpp,由 callradite 写入,供长波/短波辐射使用。 |
nlaylte |
saved integer scalar |
20 |
LTE 辐射计算层数,由 nlthermeq 写入。 |
xi |
saved allocatable real array |
22 |
CO2 15 微米带净交换率主缓存,维度为 (ngrid,nuco2,0:nflev+1,0:nflev+1)。 |
xi_ground |
saved allocatable real array |
23 |
地面相邻层交换修正缓存,维度为 (ngrid,nuco2)。 |
xi_emis |
saved allocatable real array |
24 |
发射/邻近层相关交换缓存,维度为 (ngrid,nuco2,nflev-1)。 |
ini_yomlw_h |
subroutine |
31 |
分配交换率数组并初始化 Planck、吸收、Padé 和 Voigt 系数。 |
end_yomlw_h |
subroutine |
85 |
释放 xi/xi_ground/xi_emis。 |
依赖的模块
| use 模块 |
only 列表 |
用途 |
待确认 |
dimradmars_mod |
nir, nabsmx, npademx |
模块声明阶段确定 xp/ga/gb/cst_voigt 的谱带和系数维度。 |
否 |
dimradmars_mod |
nuco2, nflev |
ini_yomlw_h 内分配 CO2 谱带交换率数组和垂直层范围。 |
否 |
调用的关键例程
| 被调用例程 |
所在模块 / 文件 |
调用位置 |
作用 |
| 无 |
- |
- |
本文件内部只做分配、释放和常数表赋值,不调用用户例程。 |
输入
| 输入 |
来源 |
类型/维度 |
单位 |
含义 |
ngrid |
phys_state_var_init_mod 调用 ini_yomlw_h 的实参 |
integer scalar |
grid columns |
当前物理网格水平列数,决定 xi、xi_ground 和 xi_emis 的第一维。 |
nir |
dimradmars_mod |
integer parameter |
spectral band count |
红外谱带数,决定 xp 第二维。 |
nuco2 |
dimradmars_mod |
integer parameter |
CO2 band count |
CO2 15 微米带计算的谱带数,决定 xi 系列数组第二维。 |
nflev |
dimradmars_mod |
integer saved scalar |
vertical layers |
辐射有效层数,决定 xi 系列数组垂直维度。 |
npademx, nabsmx |
dimradmars_mod |
integer parameters |
coefficient dimensions |
Padé/吸收系数表的最大维度。 |
输出
| 输出 |
去向 |
类型/维度 |
单位 |
含义 |
xp |
lwb |
real(6,nir) |
Planck polynomial units |
红外谱带 Planck 函数多项式系数。 |
at, bt, tref |
lwu |
real arrays/scalar |
mixed |
吸收量温度修正系数和参考温度。 |
ga, gb, cst_voigt |
lwtt |
real arrays |
mixed |
CO2 透过率 Padé 近似和 Voigt 等效吸收量常数。 |
xi |
lwxd/lwxn/lwxb 写入,lwflux/lwi/lwmain 读取 |
real(ngrid,nuco2,0:nflev+1,0:nflev+1) |
exchange-rate-like |
长波 CO2 净交换率矩阵缓存。 |
xi_ground |
lwxn 写入,lwflux/lwxn 路径读取 |
real(ngrid,nuco2) |
exchange-rate-like |
地面相邻层交换修正。 |
xi_emis |
lwxd 写入,lwxn 读取 |
real(ngrid,nuco2,nflev-1) |
exchange-rate-like |
近邻/发射相关交换修正缓存。 |
共享状态与副作用
- 本模块变量全部是
SAVE 状态,并用两条 !$OMP THREADPRIVATE 声明保护:at/bt/tref/xp/tstand/ga/gb/cst_voigt/gcp 在第 16 行,nlaylte/xi/xi_ground/xi_emis 在第 26 行。
ini_yomlw_h 会无条件 allocate 三个数组;源码自身不先检查是否已分配,因此当前调用链在 phys_state_var_init_mod 第 148-149 行先 end_yomlw_h 再 ini_yomlw_h(ngrid)。
ini_yomlw_h 只显式清零 xi,没有清零 xi_ground 和 xi_emis;后两者依赖下游长波例程在使用前写入。复现风险:若绕开标准 lwmain 调用顺序单独调用使用方,可能读到未定义值。
gcp 不在本模块初始化,而是在 callradite_mod.F 第 403 行设为 g/cpp。nlaylte 不在本模块计算,而是在 nlthermeq.F 第 53-57 行写入。
核心逻辑
ini_yomlw_h(ngrid) 从 dimradmars_mod 导入 nuco2/nflev。
- 按
(ngrid,nuco2,0:nflev+1,0:nflev+1) 分配 xi,按 (ngrid,nuco2) 分配 xi_ground,按 (ngrid,nuco2,nflev-1) 分配 xi_emis。
- 把
xi 全部置零。源码注释说明这一步过去在 lwmain 的 firstcall 初始化中完成。
- 用
reshape 填入 xp(6,nir),作为 lwb 的 Planck 函数多项式系数。
- 用
reshape 填入 at(2,2) 和 bt(2,2),作为 lwu 的吸收量温度依赖系数。
- 填入
ga(1:4,1:2) 和 gb(1:4,1:2),作为 lwtt 的 Padé 透过率系数。
- 用
reshape 填入 cst_voigt(2,2),作为 lwtt 的 Voigt 等效吸收量修正常数。
end_yomlw_h 分别检查三个可分配数组是否已分配,若已分配则释放。
伪代码
ini_yomlw_h(ngrid):
import nuco2, nflev from dimradmars_mod
allocate xi(ngrid, nuco2, 0:nflev+1, 0:nflev+1)
allocate xi_ground(ngrid, nuco2)
allocate xi_emis(ngrid, nuco2, nflev-1)
xi = 0
xp = fixed Planck polynomial table from old sulw path
at, bt = fixed absorber temperature-dependence tables
ga, gb = fixed Pade coefficient tables
cst_voigt = fixed Voigt correction table
end_yomlw_h:
deallocate xi, xi_ground, xi_emis if allocated
参与的主题流程
| 主题 |
参与方式 |
| 辐射计算 |
提供长波 LTE 链的共享系数和净交换率缓存;lwb/lwu/lwtt/lwflux/lwi/lwxd/lwxn/lwxb 直接依赖本模块状态。 |
| 高层大气 / NLTE |
nlaylte 由 nlthermeq 计算,用于 LTE 与 NLTE 辐射层范围衔接。 |
| 物理状态初始化 |
通过 end_yomlw_h + ini_yomlw_h(ngrid) 管理长波数组生命周期。 |
写法特点
- 这是 F90 状态模块,但保存的是旧长波辐射
sulw.F 路径中的固定表;注释标明来源为 Jean-Jacques Morcrette 的 ECMWF 例程并由 F. Forget 在 2000 年简化。
- 数组下标使用
0:nflev+1,覆盖真实层、地面/边界和大气顶哨兵位置;下游 lwxb/lwxd/lwxn 会按几何路径写入不同块。
ga/gb 只给当前两个 CO2 吸收带赋值;维度由 npademx/nabsmx 给出,但当前初始化只覆盖 1:4,1:2。
THREADPRIVATE 意味着 OpenMP 并行时每个线程持有独立副本;复现并行初始化时必须保证每个线程看到已初始化的表和已分配数组。
复现要点
- 必须先完成
dimradmars_mod 初始化,使 nflev/nuco2/nir/npademx/nabsmx 与当前运行一致,再调用 ini_yomlw_h。
- 标准初始化顺序应先释放后分配,避免重复
allocate 已分配数组。
- 若更改
nflev 或 ngrid,必须重新执行 end_yomlw_h 和 ini_yomlw_h,否则 xi 系列数组维度会与调用方不一致。
- 在运行长波链前,必须已经由
nlthermeq 写入 nlaylte,由 callradite 写入 gcp。
- 若单独测试
lwb/lwu/lwtt,需要确保 xp/at/bt/ga/gb/cst_voigt/tstand/tref 已由 ini_yomlw_h 填充。
待确认
xi_ground 和 xi_emis 在本初始化例程中未显式清零,是否完全依赖下游例程覆盖全部被读取元素,需要结合 lwxd/lwxn/lwflux 的调用顺序确认。
ga/gb/cst_voigt 的物理拟合来源只在旧例程注释中说明,本页只记录当前源码内硬编码值和使用位置。
相关页面