lwmain_mod.F
路径
LMDZ.MARS\libf\phymars\lwmain_mod.F
所属目录 / 模块
libf/phymars
MODULE lwmain_mod
文件定位
lwmain_mod.F 是 LTE 长波热红外辐射主程序模块。它由 callradite_mod 在每个辐射子域内调用,接收已经准备好的层压厚、界面压力/温度、层温、气溶胶 IR 光学性质、地表发射率和地表 CO2 冰量;随后按固定顺序组织长波链:
lwb -> lwu -> (lwxd/lwxn/lwxb, 按 ilw* 频率刷新) -> lwflux -> lwi
本文件本身不实现 Planck 多项式、CO2 透过率、交换系数或散射通量细节;这些细节分别在下游文件页说明。lwmain 的关键职责是把这些步骤按正确状态顺序串联起来,决定何时刷新 yomlw_h::xi 交换率缓存,并把 lwflux 给出的显式冷却率替换为 lwi 的半隐式修正冷却率。
本文件只在 1:nlaylte 的 LTE 有效层内工作。nlaylte 由 nlthermeq 写入 yomlw_h,callradite 负责只把这部分层的输入复制进子域工作数组,并在返回后把更高层 dtlw/dtsw 置零。
定义的符号
| 符号 | 类型 | 行号 | 作用 |
|---|---|---|---|
lwmain_mod |
module | 1 | 长波 LTE 辐射主调度模块。 |
lwmain |
subroutine | 7-206 | 组织 Planck 预处理、CO2/aerosol 吸收量、长波交换率刷新、通量/冷却率汇总和半隐式冷却率修正。 |
本文件没有 SAVE 变量、没有 THREADPRIVATE 声明、没有 common block。持久共享状态由被调用模块和 yomlw_h 承载。
依赖的模块
| use 模块 | only 列表 | 用途 | 待确认 |
|---|---|---|---|
dimradmars_mod |
ndlo2, nflev, nir, ndlon, nuco2, naerkind |
长波工作数组维度、红外谱带数、CO2 谱带数和气溶胶种类数。 | |
yomlw_h |
nlaylte, xi |
nlaylte 控制 LTE 层循环;xi 只出现在注释掉的调试检查中,实际可执行逻辑通过下游例程读写。 |
xi 直接 use 是否为历史调试遗留。 |
lwi_mod |
lwi |
半隐式长波冷却率修正。 | |
lwb_mod |
lwb |
计算地表/顶层/层界/层中心 Planck 函数、温度导数和半层差分。 | |
lwu_mod |
lwu |
计算 CO2 累积吸收量、压力缩放吸收量、CO2 带气溶胶透过率和 IR 总光学性质。 | |
lwxd_mod |
lwxd |
刷新远距离层间交换系数 xi。 |
|
lwxn_mod |
lwxn |
刷新相邻层交换系数 xi 和 xi_ground。 |
|
lwxb_mod |
lwxb |
刷新地面/空间边界交换系数 xi。 |
|
lwflux_mod |
lwflux |
汇总 CO2 带内净交换和带外扩散散射,输出显式冷却率、地表/顶层通量和 netrad。 |
|
callkeys_mod |
ilwb, ilwd, ilwn |
控制边界、远距离、相邻层交换系数的更新频率。 |
调用的关键例程
| 被调用例程 | 所在模块 / 文件 | 调用位置 | 作用 |
|---|---|---|---|
lwb |
lwb.F | 104-105 | 由 tlev/tlay/dt0 生成长波谱带 Planck 函数和导数。 |
lwu |
lwu.F | 112-117 | 由 dp/plev/tlay/aerosol/QIR/omegaIR/gIR 生成 CO2 吸收量和气溶胶总光学性质。 |
lwxd |
lwxd.F | 132-134 | 当 mod(icount-1,ilwd)==0 时刷新远距离层间 xi。 |
lwxn |
lwxn.F | 141-144 | 当 mod(icount-1,ilwn)==0 时刷新相邻层 xi 和 xi_ground。 |
lwxb |
lwxb.F | 151-153 | 当 mod(icount-1,ilwb)==0 时刷新地面/空间边界 xi。 |
lwflux |
lwflux.F | 160-167 | 由 xi、Planck 函数和带外散射光学性质计算显式冷却率、地面下行长波、顶层 OLR 和 netrad。 |
lwi |
lwi.F | 188-189 | 由 netrad/dblay/dp 和 xi 计算半隐式修正冷却率。 |
直接调用方
| 调用方 | 位置 | 调用目的 |
|---|---|---|
callradite_mod.F::callradite |
533-539 | 在当前 ndomainsz 子域上计算 LTE 长波冷却率、地表下行长波通量、顶层出射长波通量和每层净辐射收支。 |
physiq_mod.F、rocketduststorm_mod.F90 和 topmons_mod.F90 不直接调用 lwmain,而是通过 callradite_mod 间接触发长波链。
输入
| 输入 | 来源 | 类型 / 维度 | 单位 | 含义 |
|---|---|---|---|---|
ig0 |
callradite 子域循环 |
integer | grid offset | 当前子域在全局 xi 缓存第一维中的偏移;传给 lwxd/lwxn/lwxb/lwflux/lwi。 |
icount |
callradite 调用方 |
integer | step count | 物理步计数;与 ilwd/ilwn/ilwb 共同决定是否刷新交换系数。 |
kdlon, kflev |
callradite 子域 |
integer | columns/layers | 当前子域列数和垂直数组维度。 |
dp(ndlo2,kflev) |
callradite |
real | Pa | 层压强厚度,供 lwu/lwxn/lwflux/lwi 使用。 |
dt0(ndlo2) |
callradite |
real | K | 地表温度相对第一界面温度的跳变,供 lwb/lwflux 使用。 |
emis(ndlo2) |
callradite |
real | - | 地表热红外发射率;本文件还派生 emis_gaz 供气体交换系数使用。 |
plev(ndlo2,kflev+1) |
callradite |
real | Pa | 层界面压力,供 lwu 构造压力缩放吸收量。 |
tlev(ndlo2,kflev+1) |
callradite |
real | K | 层界面温度,供 lwb/lwflux 使用。 |
tlay(ndlo2,kflev) |
callradite |
real | K | 层中心温度,供 lwb/lwu/lwflux 使用。 |
aerosol(ndlo2,kflev,naerkind) |
aeropacity -> callradite |
real | optical depth | 各类气溶胶层光学厚度,供 lwu 合成 IR 光学量。 |
QIRsQREF3d, omegaIR3d, gIR3d |
aeroptproperties -> callradite |
real | - | IR 谱带气溶胶消光比、单次散射反照率和非对称因子。 |
co2ice(ndlo2) |
callradite |
real | kg/m2 | 地表 CO2 冰量;大于 20.e-3 时本文件把 emis_gaz 强制为 1。 |
输出
| 输出 | 去向 | 类型 / 维度 | 单位 | 含义 |
|---|---|---|---|---|
coolrate(ndlo2,kflev) |
callradite -> dtlw |
real | K/s | 长波冷却率。lwflux 先写显式值,随后本文件用 lwi 的 newcoolrate 覆盖 1:nlaylte。 |
fluxground(ndlo2) |
callradite -> fluxsurf_lw |
real | W/m2 | 到达地面的下行长波通量。 |
fluxtop(ndlo2) |
callradite -> fluxtop_lw |
real | W/m2 | 大气顶出射长波通量,也就是 OLR。 |
netrad(ndlo2,kflev) |
callradite 子域工作数组 |
real | W/m2 | 每层长波净辐射收支,来自 lwflux,也是 lwi 的输入。 |
共享状态与副作用
- 本文件不保存本地状态,不读写文件,不调用诊断输出 API。
lwxd/lwxn/lwxb会按icount和ilwd/ilwn/ilwb的频率门控写入 yomlw_h 的xi/xi_ground/xi_emis。如果本步没有触发某一类刷新,后续lwflux/lwi会继续使用上一次缓存的对应交换率。lwflux和lwi读取yomlw_h::xi/xi_ground/gcp。gcp由callradite首次调用时写为g/cpp。lwmain会把co2ice > 20.e-3的列设置为emis_gaz=1.,只影响传给交换系数例程的地表发射率;传给lwflux/lwdiff的仍是原始emis。- 文件尾部有
xi范围检查和新旧冷却率打印模板,但均被注释,不产生运行时诊断。
初始化 / firstcall / restart / diagnostic 行为
- 本文件没有
firstcall分支。旧版中xi初始化已移到 yomlw_h 的ini_yomlw_h。 - 本文件不读写 restart;它依赖
phys_state_var_init_mod初始化yomlw_h,依赖nlthermeq更新nlaylte,依赖callradite提供gcp和子域输入。 - 交换系数不是每次必定全量刷新:
lwxd/lwxn/lwxb分别受ilwd/ilwn/ilwb控制。icount=1时三者都会因mod(icount-1,ilw*)==0触发。 - 诊断分支均是注释代码;真正输出由上游
physiq/callradite的通量和 tendency 数组管理。
核心流程
1. CO2 冰覆盖列的气体发射率
行 88-95 构造 emis_gaz:
if co2ice(jl) > 20.e-3:
emis_gaz(jl) = 1.
else:
emis_gaz(jl) = emis(jl)
这个派生量只传给 lwxd/lwxb 的地面反射/边界交换路径。lwflux 仍接收原始 emis,因此地表通量/带外扩散仍按调用方给定发射率处理。
2. Planck 函数和半层差分
行 104-105 调用 lwb。输出包括:
bsurf/btop:地表和大气顶谱带 Planck 函数。blev/blay:层界和层中心谱带 Planck 函数。dblay:层中心 Planck 温度导数,后续给lwi。dbsublay:每层拆成上下两个半层的 Planck 差分,后续给lwdiff。
这些量必须在 lwflux/lwi 之前准备,因为交换率最终要乘 Planck 函数差,半隐式线性化要用温度导数。
3. CO2 吸收量与气溶胶 IR 总光学性质
行 112-117 调用 lwu。它把 dp/plev/tlay 转成 CO2 的 co2_u/co2_up 累积吸收路径,把多类气溶胶合成为:
tautotal(k,j,ir)
omegtotal(k,j,ir)
gtotal(k,j,ir)
同时为 CO2 带生成气溶胶吸收透过率 aer_t。这些数组分别供交换系数例程和 lwflux/lwdiff 使用。
4. 按频率刷新交换率缓存
行 128-155 是 lwmain 最重要的状态门控段:
if mod(icount-1, ilwd) == 0: call lwxd(...)
if mod(icount-1, ilwn) == 0: call lwxn(...)
if mod(icount-1, ilwb) == 0: call lwxb(...)
三类刷新覆盖不同 xi 区域:
lwxd:非相邻真实层之间的远距离交换。lwxn:相邻真实层交换和底层xi_ground。lwxb:地面/空间边界交换。
lwflux 和 lwi 不关心本步是否刷新过,只读取 yomlw_h 当前缓存。因此复现某一步的长波结果时,必须知道前序步是否已经按这些频率更新过交换率。
5. 显式通量、净辐射收支和冷却率
行 160-167 调 lwflux。该例程合并两部分:
- CO2 15 微米带内:读取
xi,乘bsurf/blay/btop的 Planck 函数差,得到净交换率贡献。 - CO2 带外 IR:调用
lwdiff,用tautotal/omegtotal/gtotal和dbsublay计算红外散射扩散通量。
输出 netrad 和显式 coolrate = gcp * netrad / dp,同时写 fluxground 与 fluxtop。
6. 半隐式冷却率修正
行 188-201 调 lwi 并覆盖 coolrate:
call lwi(..., netrad, dblay, dp, newcoolrate)
for jkk = 1:nlaylte:
coolrate(:,jkk) = newcoolrate(:,jkk)
这意味着 lwmain 的最终 coolrate 输出不是 lwflux 的显式冷却率,而是 lwi 根据 semi、dtphys*iradia、xi 和 dblay 求出的半隐式修正结果。netrad 不被 lwi 改写,仍表示 lwflux 计算的显式净辐射收支。
伪代码
lwmain:
for each column:
if co2ice > 20e-3:
emis_gaz = 1
else:
emis_gaz = emis
call lwb to compute Planck functions and gradients
call lwu to compute CO2/aerosol absorber amounts and IR optical properties
if mod(icount-1, ilwd) == 0:
call lwxd to update distant-layer xi
if mod(icount-1, ilwn) == 0:
call lwxn to update neighbouring-layer xi and xi_ground
if mod(icount-1, ilwb) == 0:
call lwxb to update ground/space boundary xi
call lwflux:
read xi/xi_ground
combine CO2 net exchange and non-CO2-band diffusion
output explicit coolrate, fluxground, fluxtop, netrad
call lwi:
read netrad, dblay, dp, xi and timestep controls
output newcoolrate
for each LTE layer:
coolrate = newcoolrate
参与的主题流程
| 主题 | 参与方式 |
|---|---|
| 辐射 | LTE 长波主程序;输出长波冷却率、地表下行长波、顶层 OLR 和层净辐射收支。 |
| 气溶胶辐射 | 消费 aerosol 与 QIRsQREF3d/omegaIR3d/gIR3d,经 lwu/lwdiff 影响长波吸收、散射通量和冷却率。 |
| CO2 循环 / 地表 CO2 冰 | co2ice > 20.e-3 时把气体交换系数路径中的 emis_gaz 设为 1;CO2 15 微米带吸收路径由 lwu/lwtt 处理。 |
| LTE/NLTE 边界 | 只覆盖 nlaylte 内的 LTE 长波层;高层 NLTE 冷却和 LTE/NLTE 混合由 physiq 其他路径处理。 |
| 地表能量收支 | fluxground 是地表下行长波通量;fluxtop 是大气顶出射长波通量,供诊断和能量收支使用。 |
写法特点
- 固定格式 Fortran 模块,
subroutine lwmain名称为小写,但调用方使用大小写不敏感的lwmain。 - 本文件是调度层,真正数值公式分散在 7 个被调用例程中;复现时不能只重写
lwmain,必须保留被调用例程的状态顺序。 kflev用于接口数组维度,实际物理循环主要由共享nlaylte控制。- 交换率缓存有时间复用:
ilwd/ilwn/ilwb允许某些步沿用旧xi,以降低长波计算成本。 coolrate会被写两次:lwflux写显式值,lwi计算后由lwmain覆盖为半隐式值。
复现要点
- 调用前必须完成
dimradmars_mod、yomlw_h和气溶胶光学表初始化;callradite必须已经设置gcp=g/cpp。 nlaylte必须已由nlthermeq更新,并且kflev/nflev数组维度要覆盖nlaylte+1层界。- 第一次辐射调用或任意需要重建交换率的调用必须让
icount与ilwd/ilwn/ilwb触发对应刷新;否则lwflux/lwi会读取旧xi。 co2ice阈值是20.e-3 kg.m-2;超过该值只改变emis_gaz,不是全局改写emis。lwu合成气溶胶光学性质时没有在本层做零保护,复现无气溶胶或极薄光学厚度情形要按源码检查除零风险。- 若只想得到显式长波冷却率,不能直接使用
lwmain最终coolrate,因为它已经被lwi覆盖;需要在lwflux调用之后、lwi覆盖之前截取。
待确认
yomlw_h::xi在本文件中只用于注释掉的检查块;当前use yomlw_h, only: nlaylte, xi中的xi是否仍有必要保留待源码维护者确认。- 局部变量
jk/ja只出现在注释掉的检查块或未使用路径中;是否为历史调试残留待确认。 emis_gaz=1.的 CO2 冰阈值物理依据不在本文件内说明;本页只记录源码字面行为。netrad在半隐式修正后不随coolrate更新,若下游同时诊断netrad和coolrate,两者对应的是显式收支与半隐式倾向的组合。
相关页面
- callradite_mod - 唯一直接调用方和气溶胶/子域准备入口。
- lwb - Planck 函数和温度导数预处理。
- lwu - CO2 吸收量和气溶胶 IR 总光学性质。
- lwxd, lwxn, lwxb - 长波交换率缓存的远层、相邻层和边界更新。
- lwflux - 长波通量、显式冷却率和净辐射收支汇总。
- lwi - 半隐式长波冷却率修正。
- lwdiff, flusv, lwtt - 带外扩散散射和 CO2 透过率辅助。
- yomlw_h -
nlaylte/gcp/xi等长波共享状态。 - dimradmars_mod, callkeys_mod
- radiation