blendrad.F
路径
LMDZ.MARS\libf\phymars\blendrad.F
所属目录/模块
libf/phymars — Mars 物理参数化模块
文件定位
blendrad.F 将辐射传输的四路倾向(短波 LTE zdtsw、长波 LTE zdtlw、近红外 CO₂ zdtnirco2、非局域热平衡 NLTE zdtnlte)合并为单一净大气加热率 dtrad。核心工作是用一条以压力为自变量的平滑 sigmoid 函数(alpha)在 LTE 与 NLTE 贡献之间做连续过渡,避免在切换高度产生数值不连续。该文件仅在 callnlte=.true. 时被调用;当 NLTE 未启用时,调用方 physiq_mod 直接将四路相加。
定义的符号
| 符号 | 类型 | 行号 | 作用 |
|---|---|---|---|
blendrad_mod |
module | 1 | 包装模块,仅含 blendrad 子程序 |
blendrad |
subroutine | 7 | 合并 LTE/NLTE 辐射倾向的唯一入口 |
依赖的模块
| use 模块 | only 列表 | 用途 | 待确认 |
|---|---|---|---|
yomlw_h |
nlaylte |
LTE 计算层数上限(由 nlthermeq 计算并存储) |
|
nlteparams_h |
ptrans, zwi |
过渡中心压力 0.1 Pa;zwi = 2/zw = 4.0(zw=0.5 标高半宽) |
调用的关键例程
无。blendrad 是纯数值计算,不调用其他子程序。
输入
| 输入 | 来源 | 类型/维度 | 单位 | 含义 |
|---|---|---|---|---|
ngrid |
physiq_mod 调用参数 |
integer | — | 水平网格点数 |
nlayer |
physiq_mod 调用参数 |
integer | — | 垂直层数 |
pplay |
physiq_mod 局部变量 zplay |
real(ngrid, nlayer) | Pa | 各层气压 |
zdtsw |
callradite 输出 |
real(ngrid, nlayer) | K/s | 短波 LTE 加热率(仅前 nlaylte 层有效) |
zdtlw |
callradite 输出 |
real(ngrid, nlayer) | K/s | 长波 LTE 加热率(仅前 nlaylte 层有效) |
zdtnirco2 |
callradite 输出 |
real(ngrid, nlayer) | K/s | 近红外 CO₂ 吸收加热率(全层有效) |
zdtnlte |
callradite 输出 |
real(ngrid, nlayer) | K/s | NLTE 加热率(全层有效,低层可能为零) |
输出
| 输出 | 去向 | 类型/维度 | 单位 | 含义 |
|---|---|---|---|---|
dtrad |
physiq_mod 后续用于温度倾向积分 |
real(ngrid, nlayer) | K/s | 合并后的净大气辐射加热率 |
共享状态与副作用
无直接副作用。blendrad 是纯函数式子程序:输入 → 输出,不修改任何 module 变量、不写文件、不产生诊断输出。
间接依赖的共享状态:
nlaylte(yomlw_h,integer,save):由nlthermeq在辐射调用时计算,标识 LTE 计算的有效层数上限。ptrans、zwi(nlteparams_h,real,parameter):编译期常数,不可运行时修改。
核心逻辑
第一层循环(行 45–53):遍历
l = 1到nlaylte(LTE 有效层)。对每个网格点:- 计算过渡权重
alpha = 1 / (1 + (pplay/ptrans)^zwi)。这是以z = -ln(p)为自变量的 sigmoid0.5*(1+tanh((z-ztrans)/zw))的等价简化形式。 - 合并倾向:
dtrad = (1-alpha)*(zdtsw+zdtlw) + zdtnirco2 + alpha*zdtnlte。 - 低压(高海拔)处 alpha→1,LTE 贡献被抑制,NLTE 主导;高压(低海拔)处 alpha→0,LTE 主导。
- 计算过渡权重
第二层循环(行 56–60):遍历
l = nlaylte+1到nlayer(LTE 计算范围之外)。直接dtrad = zdtnirco2 + zdtnlte,无 LTE 贡献。
伪代码
for each layer l = 1 to nlaylte: # LTE 有效范围
for each grid point ig:
alpha = 1 / (1 + (pplay[ig,l] / 0.1)^4.0) # sigmoid 过渡
dtrad[ig,l] = (1 - alpha) * (zdtsw[ig,l] + zdtlw[ig,l]) # LTE 部分被 alpha 调制
+ zdtnirco2[ig,l] # CO2 近红外(始终保留)
+ alpha * zdtnlte[ig,l] # NLTE 部分由 alpha 加权
for each layer l = nlaylte+1 to nlayer: # LTE 范围之外
for each grid point ig:
dtrad[ig,l] = zdtnirco2[ig,l] + zdtnlte[ig,l] # 纯 NLTE
参与的主题流程
| 主题 | 参与方式 |
|---|---|
| radiation | 辐射倾向合并的最后一环;在 callradite 计算完四路倾向后由 physiq_mod 调用 |
写法特点
- 固定格式 Fortran:使用列 1 的
c注释和列 7 的续行符&,符合传统 F77 风格。 - 两循环拆分:注释说明是为了减少计算量(第二循环不计算 alpha),但也指出在向量机上合并为单循环可能更快。
- 编译期常数:
ptrans和zwi在nlteparams_h中用parameter声明,不可运行时调整。 nlaylte动态值:由nlthermeq根据大气状态计算,存储在yomlw_h的save变量中,每次辐射调用可能不同。
复现要点
- alpha 公式的物理含义:
z = -ln(p)是"标高高度",ptrans = 0.1 Pa(约 80 km)是过渡中心,zw = 0.5标高是过渡半宽。在p = ptrans处 alpha = 0.5;在p = ptrans * exp(2)≈ 0.74 Pa 处 alpha ≈ 0.12;在p = ptrans / exp(2)≈ 0.014 Pa 处 alpha ≈ 0.88。 nlaylte的值取决于大气温度廓线(由nlthermeq计算),不同模拟可能不同。- 当
callnlte = .false.时,blendrad 不被调用,dtrad = zdtsw + zdtlw + zdtnirco2(行 1310–1314)。
待确认
nlaylte的具体计算逻辑在nlthermeq中,该文件尚未有专页,当前由 radiation 主题页覆盖。
相关页面
- radiation — 辐射计算主题页
- nlthermeq
- file-index — 文件索引
- symbol-index — 符号索引