lwxd.F
快速理解
它做什么: 计算非相邻(远距离)大气层间的净交换系数 xi。被 lwmain 调用。
基本过程: 对非相邻层对用相邻界面透过率做二阶差分 → 可选 callemis 叠加地面反射路径。
关键结果: 远距离层间交换系数写入 yomlw_h::xi,供 lwflux/lwi 读取。
路径
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)
参与的主题流程
| 主题 | 参与方式 |
|---|---|
| 辐射计算 | 在长波 LTE 主流程中补全非相邻真实层之间的净交换率 xi,与 lwxb 的边界项和 lwxn 的相邻层项共同供后续通量/冷却率例程读取。 |
| phymars 核心物理模块目录 | 属于 libf\phymars 长波辐射辅助文件组。 |
写法特点
- 固定格式 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的范围检查注释;本页尚未确认这些检查被停用的数值稳定性原因。
相关页面
- radiation
- phymars/index
- lwu
- lwtt
- lwxb
- lwflux
- lwi
- lwmain_mod - 长波 LTE 主调度入口,按
ilwd调用本例程刷新远距离交换率。 - lwxn
- yomlw_h.md:长波辐射共享参数。