lwi.F

路径

LMDZ.MARS\libf\phymars\lwi.F

所属目录 / 模块

libf\phymars

文件定位

lwi.F 定义 lwi_mod 模块,提供长波 LTE 辐射流程末端的半隐式冷却率修正例程 lwi。它在 lwmain_mod.F 中由 lwflux 输出 netrad 之后调用:lwflux 先给出显式净辐射收支和冷却率,lwi 再利用 lwb 预处理得到的谱带 Planck 温度导数 dblay、层压强厚度 dp、净交换率表 xi 和时间步设置,把净辐射收支转换为半隐式格式下的新冷却率 newcoolrate

本文件不重新计算长波通量,也不调用其他例程;它只组装垂直方向三对角线性化系数,并用一次自顶向下消元和自底向上回代得到每层冷却率。lwmain 随后把 newcoolrate(:,1:nlaylte) 覆盖回 coolrate

定义的符号

符号 类型 行号 作用
lwi_mod module 1 封装长波半隐式冷却率修正例程。
lwi subroutine 7 netrad、Planck 温度导数、层压强厚度和 xi 交换率表求解半隐式长波冷却率。

依赖的模块

use 模块 only 列表 用途 待确认
dimradmars_mod ndlo2, ndlon, nflev, nir 提供辐射列数、垂直层数和红外谱带数,用于形参和局部工作数组维度。
yomlw_h gcp, nlaylte, xi 提供 g/cp 换算因子、LTE 长波层数和 CO2 净交换率表。
comcstfi_h g, cpp 提供重力加速度和定压比热,构造半隐式线性化系数。
time_phylmdz_mod dtphys 提供物理时间步长。
callkeys_mod semi, iradia 提供半隐式权重和辐射调用间隔;deltat = dtphys * iradiasemit = semi * deltat

调用的关键例程

被调用例程 所在模块 / 文件 调用位置 作用
- - lwi 只做本地数组计算,不调用其他用户例程。

输入

输入 来源 类型/维度 单位 含义
ig0 lwmain integer grid index offset 当前向量块在全局物理网格中的起始偏移,用于访问 xi(ig0+jl,...)
kdlon lwmain integer column 当前向量化处理的水平列数,循环范围为 1:kdlon
kflev lwmain integer layer 调用方传入的垂直层数;形参数组按它声明,核心循环使用共享的 nlaylte
psi lwmainnetrad 传入 real(ndlo2,kflev) W/m2 每层净辐射收支,来自 lwfluxnetrad
zdblay lwmaindblay 传入 real(ndlo2,nir,kflev) Planck 函数值 / K lwb 计算的层中心谱带 Planck 函数温度导数;lwi 只读取谱带 1 和 2。
pdp lwmaindp 传入 real(ndlo2,kflev) Pa 层压强厚度,用于把辐射收支和温度导数转换为冷却率线性化系数。

输出

输出 去向 类型/维度 单位 含义
newpcolc lwmainnewcoolrate real(ndlo2,kflev) K/s 半隐式格式修正后的长波冷却率;lwmain 第 200 行把它覆盖回 coolrate

共享状态与副作用

lwi.F 不定义保存型模块变量,不读写文件,也没有启用的诊断输出。源码中有若干 print* 调试语句,但全部被注释。它读取 yomlw_hxigcpnlaylte,读取 comcstfi_hg/cpp,读取 time_phylmdz_modcallkeys_mod 的时间步和半隐式控制量;副作用只限于写入调用方传入的 newpcolc 数组。

核心逻辑

  1. 计算辐射时间间隔 deltat = dtphys * iradia,再乘以半隐式权重得到 semit = semi * deltat
  2. i=1:nlaylte-1 组装三对角主对角 di:系数包含本层到太空、上一层和下一层的 xi,并乘以本层 zdblay(:,1:2,i)
  3. 对最顶层 nlaylte 单独组装 di,源码注释说明这里移除 i,i+1 项,避免把 cooling2space 计算两次。
  4. 组装上对角 hi,使用本层到上一索引方向相邻层 i+1xi 和相邻层的 zdblay(:,1:2,i+1)
  5. 组装下对角 bi,使用本层到 i-1xi 和下方相邻层的 zdblay(:,1:2,i-1);第 1 层强制 bi(:,1)=0,源码注释说明这是因为尚无干净的 zdblay(0) 来处理地表温度不连续。
  6. 从顶层开始计算消元系数 ci/ai,其中右端项是 gcp * psi / pdp,随后从 nlaylte-1 向 1 做反向消元。
  7. 从第 1 层开始回代:newpcolc(:,1)=ci(:,1),再用 newpcolc(:,i)=ci(:,i)+ai(:,i)*newpcolc(:,i-1) 得到各层新冷却率。

伪代码

deltat = dtphys * iradia
semit = semi * deltat

for each layer i below top:
  di(i) = 1 + semit * g/(pdp(i)*cpp) *
          sum over CO2 bands 1:2 of
          (xi(i,space) + xi(i,i+1) + xi(i,i-1)) * zdblay(band,i)

for top layer:
  di(top) = same form, but without xi(top,top+1)

for i = 1 to top-1:
  hi(i) = -semit * g/(pdp(i)*cpp) *
          sum over bands of xi(i,i+1) * zdblay(band,i+1)

for i = 2 to top:
  bi(i) = -semit * g/(pdp(i)*cpp) *
          sum over bands of xi(i,i-1) * zdblay(band,i-1)
bi(1) = 0

ci(top) = (gcp * psi(top) / pdp(top)) / di(top)
ai(top) = -bi(top) / di(top)

for i = top-1 downto 1:
  denom = di(i) + hi(i) * ai(i+1)
  ci(i) = (gcp * psi(i) / pdp(i) - hi(i) * ci(i+1)) / denom
  ai(i) = -bi(i) / denom

newpcolc(1) = ci(1)
for i = 2 to top:
  newpcolc(i) = ci(i) + ai(i) * newpcolc(i-1)

参与的主题流程

主题 参与方式
辐射计算 长波 LTE 主流程的半隐式冷却率修正阶段;位于 lwflux 汇总净辐射收支之后,lwmain 覆盖输出 coolrate 之前。
phymars 核心物理模块目录 属于 libf\phymars 的长波辐射辅助文件。

写法特点

复现要点

待确认

相关页面