lwxd.F
路径
LMDZ.MARS\libf\phymars\lwxd.F
所属目录 / 模块
libf\phymars
文件定位
lwxd.F 定义 lwxd_mod 模块,提供长波 LTE 辐射中的远距离层间交换系数例程 lwxd。它位于 lwu 生成 co2_u/co2_up/aer_t 之后、lwflux 和 lwi 读取 yomlw_h::xi 之前,由 lwmain_mod.F 在 lwxb 和 lwxn 同一组长波交换系数阶段调用。
源码注释把本例程定位为 distant layers 的 transmission function 与 exchange coefficients。这里的“远距离”不是所有非边界项,而是 jk=1:nlaylte-2 与 jkk=jk+2:nlaylte 的非相邻真实大气层对。相邻层 jk,jk+1 由 lwxn.F 细分子层处理,地面/空间边界由 lwxb 处理。
lwxd 的核心工作是先对每一对层边界构造 CO2 与气溶胶总透过率,再用四个相邻界面透过率作二阶差分,写出远距离层间净交换率 xi。当 callkeys_mod::callemis 为真时,它还构造经地面反射的路径,并把该反射项按 (1-emis) 加到远距离 xi 中。
定义的符号
| 符号 |
类型 |
行号 |
作用 |
lwxd_mod |
module |
1 |
封装远距离长波层间交换系数构造例程。 |
lwxd |
subroutine |
7 |
计算远距离层对的 CO2/气溶胶透过率差分,并写入共享净交换率表 xi。 |
依赖的模块
| use 模块 |
only 列表 |
用途 |
待确认 |
dimradmars_mod |
ndlon, nuco2, nflev, ndlo2 |
提供水平、谱带和垂直维度上限,用于接口数组和局部工作数组形状。 |
否 |
yomlw_h |
nlaylte, xi, xi_emis |
读取 LTE 长波有效层数,并写入远距离 xi 与供 lwxn 读取的邻近反射缓存 xi_emis。 |
否 |
callkeys_mod |
callemis |
控制是否计算经地面反射的透过率路径 trans_emis。 |
否 |
lwtt_mod |
lwtt |
用 CO2 吸收路径 zu/zup 计算每个 CO2 谱带透过率。 |
否 |
调用的关键例程
| 被调用例程 |
所在模块 / 文件 |
调用位置 |
作用 |
lwtt |
lwtt_mod / lwtt.F |
102 |
对直接层间路径的 CO2 吸收量差值 zu/zup 求透过率。 |
lwtt |
lwtt_mod / lwtt.F |
155 |
对经地面反射路径的 CO2 吸收量组合求透过率。 |
输入
| 输入 |
来源 |
类型/维度 |
单位 |
含义 |
ig0 |
lwmain |
integer |
grid offset |
当前向量块在全局 xi 第一维中的偏移,写入时使用 ig0+jl。 |
kdlon |
lwmain |
integer |
column |
当前向量块内有效水平列数,循环范围为 1:kdlon。 |
kflev |
lwmain |
integer |
layer |
接口数组的垂直层数参数;主要层间循环使用 yomlw_h::nlaylte。 |
emis |
lwmain 传入的 emis_gaz |
real(ndlo2) |
- |
地表发射率。远距离层间的反射修正乘以 (1-emis)。 |
aer_t |
lwu |
real(ndlo2,nuco2,kflev+1) |
- |
CO2 谱带上的累计气溶胶吸收透过率。 |
co2_u |
lwu |
real(ndlo2,nuco2,kflev+1) |
吸收路径 |
自模型顶向下累计的 CO2 吸收量。 |
co2_up |
lwu |
real(ndlo2,nuco2,kflev+1) |
压力缩放吸收路径 |
带压力效应的累计 CO2 吸收量。 |
输出
| 输出 |
去向 |
类型/维度 |
单位 |
含义 |
xi(ig0+jl,ja,jk,jkk) 与互易项 |
yomlw_h,后续由 lwflux / lwi 读取 |
shared array |
- |
第 jk 与第 jkk 个非相邻真实大气层之间的 CO2 带净交换系数。 |
xi_emis(ig0+jl,ja,jk) |
yomlw_h,后续由 lwxn.F 读取 |
shared array |
- |
名义上保存邻近层反射交换项;按当前源码字面,邻近项公式被注释且 ksi_emis 初值为 0,因此这里写出的值为 0。 |
共享状态与副作用
lwxd 不读写文件,不分配内存,也没有启用的诊断打印。它的持久副作用限于写入 yomlw_h::xi 和 yomlw_h::xi_emis。远距离 xi 写入时显式补齐互易项:xi(...,jk,jkk) 与 xi(...,jkk,jk) 取同一数值。
源码中保留了若干已注释的范围检查和打印语句,包括 trans、trans_emis、ksi、ksi_emis 的负值或大于 1 检查;当前可执行路径不会钳制这些值。
核心逻辑
- 将
ksi_emis(:,:,:,:) 初始化为 0,随后只在远距离层对循环中写入 ksi_emis(jk,jkk)。
- 对所有边界对
jk=1:nlaylte+1、jkk=jk:nlaylte+1 构造直接路径:zu=co2_u(:,:,jk)-co2_u(:,:,jkk),zup=co2_up(:,:,jk)-co2_up(:,:,jkk),气溶胶透过率比值为 aer_t(:,:,jk)/aer_t(:,:,jkk);调用 lwtt 后得到 trans(jk,jkk),并补齐 trans(jkk,jk)。
- 如果
callemis 为真,构造经地面反射的路径:CO2 路径为 2*co2_u(:,:,1)-co2_u(:,:,jk)-co2_u(:,:,jkk),气溶胶路径为 aer_t(:,:,1)^2/aer_t(:,:,jk)/aer_t(:,:,jkk);否则把 trans_emis(jk,jkk) 设为 1。两种分支都会补齐 trans_emis(jkk,jk)。
- 对每个远距离真实层对
jk=1:nlaylte-2、jkk=jk+2:nlaylte,用四个界面透过率作二阶差分: ksi = trans(jk+1,jkk) - trans(jk,jkk) - trans(jk+1,jkk+1) + trans(jk,jkk+1)。
- 对同一远距离层对计算反射差分:
ksi_emis = trans_emis(jk,jkk) - trans_emis(jk+1,jkk) - trans_emis(jk,jkk+1) + trans_emis(jk+1,jkk+1)。
- 写入
xi = ksi + ksi_emis * (1-emis),再写入互易项。
- 循环结束后,源码尝试为相邻层保存
xi_emis(jk);但相邻层 ksi_emis(jk,jk+1) 的计算公式处于注释状态,且远距离循环不会覆盖该位置,因此当前实现写出的邻近反射缓存为 0。
伪代码
ksi_emis = 0
for jk = 1 to nlaylte+1:
for jkk = jk to nlaylte+1:
zu = co2_u(:,:,jk) - co2_u(:,:,jkk)
zup = co2_up(:,:,jk) - co2_up(:,:,jkk)
zt_aer = aer_t(:,:,jk) / aer_t(:,:,jkk)
zt_co2 = lwtt(zu, zup)
trans(jk,jkk) = zt_co2 * zt_aer
trans(jkk,jk) = trans(jk,jkk)
for jk = 1 to nlaylte+1:
for jkk = jk to nlaylte+1:
if callemis:
zu = 2*co2_u(:,:,1) - co2_u(:,:,jk) - co2_u(:,:,jkk)
zup = 2*co2_up(:,:,1) - co2_up(:,:,jk) - co2_up(:,:,jkk)
zt_aer = aer_t(:,:,1)^2 / aer_t(:,:,jk) / aer_t(:,:,jkk)
trans_emis(jk,jkk) = lwtt(zu, zup) * zt_aer
else:
trans_emis(jk,jkk) = 1
trans_emis(jkk,jk) = trans_emis(jk,jkk)
for jk = 1 to nlaylte-2:
for jkk = jk+2 to nlaylte:
ksi = trans(jk+1,jkk) - trans(jk,jkk)
- trans(jk+1,jkk+1) + trans(jk,jkk+1)
ksi_emis = trans_emis(jk,jkk) - trans_emis(jk+1,jkk)
- trans_emis(jk,jkk+1) + trans_emis(jk+1,jkk+1)
xi(jk,jkk) = ksi + ksi_emis * (1 - emis)
xi(jkk,jk) = xi(jk,jkk)
for jk = 1 to nlaylte-1:
xi_emis(jk) = ksi_emis(jk,jk+1) * (1 - emis)
参与的主题流程
写法特点
- 固定格式 Fortran 文件,模块内只有一个公开子例程。
kflev 用于接口数组形状,实际远距离交换循环由 yomlw_h::nlaylte 控制。
trans 和 trans_emis 使用 0:nflev+1 维度,但直接路径循环从 1 到 nlaylte+1;地面反射路径通过边界索引 1 的累计量表达,并不是写 trans(...,0,...)。
- 远距离层对从
jkk=jk+2 开始,刻意跳过相邻层;相邻层细分和地面特殊处理留给 lwxn。
callemis=.false. 时 trans_emis 被设为 1,远距离反射差分自然抵消为 0。
复现要点
- lwu 必须先生成单调一致的
co2_u/co2_up 和带下限保护的 aer_t;lwxd 直接对这些累计量做差和做比值。
aer_t(:,:,jkk)、aer_t(:,:,jk) 出现在除法分母中。当前上游 lwu 把 aer_t 钳制到 1e-30,复现时不能移除这一保护。
lwtt 对 sqrt(up) 和 u ** cst_voigt 没有本地保护;lwxd 构造的 zu/zup 依赖上游累计量物理一致,不能给出负路径增量。
callemis 会改变远距离层对的 xi:开启时加入地面反射差分,关闭时反射项抵消。
- 复现风险:
xi_emis 的邻近层公式在源码中被注释掉,当前写入 lwxn 的反射缓存为 0;如果下游结果预期包含邻近层表面反射修正,需要先确认这是否是有意行为。
emis 不在本例程中钳制。外部传入小于 0 或大于 1 的值时,反射修正会按源码字面通过 (1-emis) 缩放。
ig0+jl 必须落在全局 xi 与 xi_emis 第一维有效范围内,否则远距离交换率会写到错误网格列。
待确认
xi_emis 邻近层公式被注释后仍保留保存步骤,这一点可能是历史实现残留,也可能表示当前物理方案有意不把该反射项传给 lwxn;本页只记录源码字面行为。
- 源码保留了
trans 和 ksi 的范围检查注释;本页尚未确认这些检查被停用的数值稳定性原因。
相关页面