lwi.F
快速理解
它做什么: 长波辐射流程末端的半隐式冷却率修正例程。被 lwmain 调用。
基本过程: 用 Planck 温度导数 dblay、层压强厚度和 xi 组装三对角系数 → 自顶向下消元 → 自底向上回代。
关键结果: 新冷却率 newcoolrate,由 lwmain 覆盖回 coolrate。
路径
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 微米带内贡献合并到工作谱带的写法一致,但谱带编号的物理标签需结合长波系数表继续确认。