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 * iradia,semit = semi * deltat。 |
否 |
调用的关键例程
| 被调用例程 |
所在模块 / 文件 |
调用位置 |
作用 |
| 无 |
- |
- |
lwi 只做本地数组计算,不调用其他用户例程。 |
输入
| 输入 |
来源 |
类型/维度 |
单位 |
含义 |
ig0 |
lwmain |
integer |
grid index offset |
当前向量块在全局物理网格中的起始偏移,用于访问 xi(ig0+jl,...)。 |
kdlon |
lwmain |
integer |
column |
当前向量化处理的水平列数,循环范围为 1:kdlon。 |
kflev |
lwmain |
integer |
layer |
调用方传入的垂直层数;形参数组按它声明,核心循环使用共享的 nlaylte。 |
psi |
lwmain 从 netrad 传入 |
real(ndlo2,kflev) |
W/m2 |
每层净辐射收支,来自 lwflux 的 netrad。 |
zdblay |
lwmain 从 dblay 传入 |
real(ndlo2,nir,kflev) |
Planck 函数值 / K |
lwb 计算的层中心谱带 Planck 函数温度导数;lwi 只读取谱带 1 和 2。 |
pdp |
lwmain 从 dp 传入 |
real(ndlo2,kflev) |
Pa |
层压强厚度,用于把辐射收支和温度导数转换为冷却率线性化系数。 |
输出
| 输出 |
去向 |
类型/维度 |
单位 |
含义 |
newpcolc |
lwmain 的 newcoolrate |
real(ndlo2,kflev) |
K/s |
半隐式格式修正后的长波冷却率;lwmain 第 200 行把它覆盖回 coolrate。 |
共享状态与副作用
lwi.F 不定义保存型模块变量,不读写文件,也没有启用的诊断输出。源码中有若干 print* 调试语句,但全部被注释。它读取 yomlw_h 的 xi、gcp、nlaylte,读取 comcstfi_h 的 g/cpp,读取 time_phylmdz_mod 与 callkeys_mod 的时间步和半隐式控制量;副作用只限于写入调用方传入的 newpcolc 数组。
核心逻辑
- 计算辐射时间间隔
deltat = dtphys * iradia,再乘以半隐式权重得到 semit = semi * deltat。
- 对
i=1:nlaylte-1 组装三对角主对角 di:系数包含本层到太空、上一层和下一层的 xi,并乘以本层 zdblay(:,1:2,i)。
- 对最顶层
nlaylte 单独组装 di,源码注释说明这里移除 i,i+1 项,避免把 cooling2space 计算两次。
- 组装上对角
hi,使用本层到上一索引方向相邻层 i+1 的 xi 和相邻层的 zdblay(:,1:2,i+1)。
- 组装下对角
bi,使用本层到 i-1 的 xi 和下方相邻层的 zdblay(:,1:2,i-1);第 1 层强制 bi(:,1)=0,源码注释说明这是因为尚无干净的 zdblay(0) 来处理地表温度不连续。
- 从顶层开始计算消元系数
ci/ai,其中右端项是 gcp * psi / pdp,随后从 nlaylte-1 向 1 做反向消元。
- 从第 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 的长波辐射辅助文件。 |
写法特点
- 固定格式 Fortran 文件,模块内只有一个子例程。
- 形参数组按
kflev 声明,但所有主要垂直循环使用 nlaylte;复现时需要保证调用链中二者覆盖同一 LTE 长波层范围。
- 局部工作数组
di/hi/bi/ci/ai 按 ndlon,nflev 声明,而输入输出按 ndlo2,kflev 声明;循环只访问 1:kdlon 和 1:nlaylte。
zdblay 的红外谱带维度是 nir,但半隐式线性化只显式读取谱带 1 和 2,对应 CO2 15 微米带内净交换率 xi。
semi 控制格式权重:源码注释给出 0 为显式、0.5 为半隐式、1 为隐式。
复现要点
xi(ig0+jl,1:2,*,*) 必须已由 lwxd/lwxn/lwxb 等长波交换率步骤更新;否则 lwi 的三对角系数会使用旧交换率。
lwb 必须先生成 dblay,且 dblay(:,1:2,:) 的温度导数单位要与 xi 和 pdp 的换算关系一致。
pdp(:,i) 不能为零或异常小;di/hi/bi 和右端项都含 g / pdp / cpp 或 gcp * psi / pdp。
semi 和 iradia 直接改变隐式修正强度;当 semi=0 时,semit=0,线性化系数退化为显式冷却率换算。
- 复现风险:第 1 层下对角被硬置零,源代码注释指出这是地表温度不连续处理尚未干净解决的近似;若修改地表边界线性化,必须重新审查这一边界条件。
待确认
gcp 与 g/cpp 同时参与换算:gcp 用于右端冷却率,g/cpp 用于系数线性化。二者的精确定义来源在 yomlw_h 初始化链中,本页只确认当前文件的读取和使用方式。
zdblay 只读谱带 1 和 2;这与 lwflux 把 CO2 15 微米带内贡献合并到工作谱带的写法一致,但谱带编号的物理标签需结合长波系数表继续确认。
相关页面