nirco2abs.F
路径
LMDZ.MARS\libf\phymars\nirco2abs.F
所属目录/模块
libf/phymars
文件定位
近红外 CO2 吸收加热率计算模块。计算大气 CO2 在近红外波段吸收太阳辐射产生的加热率,包含非局域热平衡(NLTE)效应修正。用于辐射传输计算中的近红外 CO2 吸收参数化。
定义的符号
| 符号 | 类型 | 行号 | 作用 |
|---|---|---|---|
nirco2abs_mod |
module | 1 | 近红外 CO2 吸收模块 |
nirco2abs |
subroutine | 7 | 主例程:计算近红外 CO2 吸收加热率 |
interpnir |
subroutine | 260 | 压力坐标线性插值辅助函数 |
依赖的模块
| use 模块 | only 列表 | 用途 | 待确认 |
|---|---|---|---|
tracer_mod |
igcm_co2, igcm_o |
CO2 和 O 原子 tracer 索引 | — |
comgeomfi_h |
sinlon, coslon, sinlat, coslat |
经纬度三角函数(用于 solang) | — |
solang_mod |
solang |
太阳几何计算 | — |
comcstfi_h |
pi |
圆周率常数 | — |
time_phylmdz_mod |
daysec |
一天的秒数 | — |
nirdata_mod |
npres, alfa, corgcm, oco21d, pres1d |
NLTE 修正查找表 | — |
callkeys_mod |
diurnal, nircorr |
日周期和 NLTE 修正开关 | — |
调用的关键例程
| 被调用例程 | 所在模块/文件 | 调用位置 | 作用 |
|---|---|---|---|
solang |
solang_mod |
行 216-218 | 计算太阳天顶角和日照时长(diurnal=F 时) |
interpnir |
本文件(nirco2abs_mod) | 行 159-161, 226-228 | 压力坐标线性插值(NLTE 修正表) |
abort_physic |
外部 | 行 121, 127, 137 | 错误终止(tracer 缺失时) |
输入
| 输入 | 来源 | 类型/维度 | 单位 | 含义 |
|---|---|---|---|---|
ngrid |
调用方 | integer | — | 水平网格点数量 |
nlayer |
调用方 | integer | — | 大气层数量 |
pplay(ngrid,nlayer) |
调用方 | real array | Pa | 各层压力 |
dist_sol |
调用方 | real | AU | 日火距离 |
nq |
调用方 | integer | — | tracer 数量 |
pq(ngrid,nlayer,nq) |
调用方 | real array | kg/kg | tracer 混合比 |
mu0(ngrid) |
调用方 | real array | — | 太阳天顶角余弦 |
fract(ngrid) |
调用方 | real array | — | 时间步内白天比例 |
declin |
调用方 | real | rad | 太阳直射点纬度(赤纬) |
输出
| 输出 | 去向 | 类型/维度 | 单位 | 含义 |
|---|---|---|---|---|
pdtnirco2(ngrid,nlayer) |
调用方 | real array | K/s | 近红外 CO2 吸收加热率 |
共享状态与副作用
- SAVE 变量(
firstcall、ico2、io):首次调用时初始化 tracer 索引 - OpenMP:
firstcall、ico2、io使用!$OMP THREADPRIVATE - 副作用: 首次调用时检查 tracer 可用性,缺失时调用
abort_physic终止 - 配置一致性检查: 若 CO2 和 O tracer 都存在但
nircorr=0,源码行 137 调用abort_physic("nirco2abs","need nircorr=1",1)终止,要求启用 NLTE 修正
核心逻辑
初始化(行 114-141):
- 首次调用时检查
nircorr开关 nircorr=1:需要 CO2 和 O tracer,否则终止nircorr=0:如果 CO2 和 O tracer 都存在,说明有能力做 NLTE 修正但未启用,源码行 137 直接终止- 保存
ico2和io索引
- 首次调用时检查
基础加热率(行 145):
co2heat0 = n_a * (1.52/dist_sol)^2 / daysec- 700Pa 参考压力、零天顶角时的加热率
diurnal=T 模式(行 150-198):
- 对每个网格点计算
zmu = sqrt(1224*mu0^2 + 1) / 35(有效天顶角参数) - 若
nircorr=1:从nirdata_mod查表插值得到cor1、oldoco2、alfa2 - 对每层计算:
- 基础加热:
co2heat0 * sqrt(700*zmu/pplay) / (1 + n_p0/pplay)^n_b - NLTE 修正(
nircorr=1):cor0 = 1/(1 + n_p0/pplay)^n_boco2gcm = pq(ig,l,io) / pq(ig,l,co2)(O/CO2 比率)merge = 10^(log10(oco2gcm/oldoco2)*alfa2 + log10(cor0)*(1-alfa2))p2011 = sqrt(merge) * cor0
- 最终加热率 = 基础加热 *
cor1*p2011
- 基础加热:
- 对每个网格点计算
diurnal=F 模式(行 207-254):
- 将一天分为
nstep=20个时间步 - 对每个时间步调用
solang计算太阳几何和白天比例 - 累加热率的加权平均(权重 =
1/nstep) - NLTE 修正同 diurnal=T 模式
- 将一天分为
interpnir 子程序(行 260-292):
- 在压力坐标上做线性插值
- 超出范围(
p>1500或p<1e-13)时返回 0
伪代码
! 初始化(首次调用)
IF firstcall THEN
IF nircorr == 1 THEN
检查 CO2 和 O tracer 是否存在,否则终止
ELSE
IF CO2 和 O tracer 都存在 THEN
终止:要求 nircorr=1
END IF
END IF
保存 ico2, io 索引
firstcall = .false.
END IF
! 基础加热率
co2heat0 = n_a * (1.52/dist_sol)^2 / daysec
IF diurnal THEN
! 直接计算
DO ig = 1, ngrid
zmu = sqrt(1224*mu0^2 + 1) / 35
IF nircorr == 1 THEN
从 nirdata_mod 查表插值 cor1, oldoco2, alfa2
END IF
DO l = 1, nlayer
基础加热 = co2heat0 * sqrt(700*zmu/pplay) / (1 + n_p0/pplay)^n_b
IF nircorr == 1 THEN
cor0 = 1/(1 + n_p0/pplay)^n_b
oco2gcm = pq(io) / pq(co2)
merge = 10^(log10(oco2gcm/oldoco2)*alfa2 + log10(cor0)*(1-alfa2))
p2011 = sqrt(merge) * cor0
ELSE
p2011 = 1, cor1 = 1
END IF
pdtnirco2 = 基础加热 * cor1 * p2011
END DO
END DO
ELSE
! 日平均积分
pdtnirco2 = 0
DO n = 1, 20 ! 20 个时间步
计算当前时间步的太阳几何
DO ig = 1, ngrid
zmu = sqrt(1224*mu0_int^2 + 1) / 35
! NLTE 修正同上
pdtnirco2 += (1/20) * 基础加热 * cor1 * p2011
END DO
END DO
END IF
参与的主题流程
| 主题 | 参与方式 |
|---|---|
| 辐射计算 | 近红外 CO2 吸收加热率计算,为辐射传输提供 NIR 加热 |
| CO2 循环 | 依赖 CO2 和 O tracer 混合比(NLTE 修正时) |
写法特点
- 固定格式 Fortran(列格式)
- SAVE + THREADPRIVATE:
firstcall、ico2、io用于首次调用初始化 - NLTE 修正: 通过
nircorr开关控制,使用nirdata_mod查找表 - 日平均积分:
diurnal=F时用 20 步积分代替直接计算,处理非线性效应 - 硬编码参数:
n_a=1.1956475、n_p0=0.0015888279、n_b=1.9628251(CO2 加热拟合参数) - 诊断代码: 行 194-196 注释了旧方案(Forget et al. 1999)
复现要点
mu0是太阳天顶角的余弦(cos(zenith)),不是角度本身dist_sol单位为 AU,加热率与1/dist_sol^2成正比fract是白天比例(0-1),用于加权加热率declin是太阳赤纬(弧度),用于diurnal=F时的太阳几何计算- NLTE 修正需要 CO2 和 O tracer,且
nircorr=1 diurnal=F时使用 20 步积分,可能影响精度
待确认
nirdata_mod中查找表的来源和精度n_a、n_p0、n_b参数的物理含义和拟合来源interpnir中p>1500和p<1e-13阈值的选择依据diurnal=F时 20 步积分是否足够(非线性效应强度)zmu = sqrt(1224*mu0^2 + 1) / 35公式的物理来源
相关页面
- 辐射计算主题页:radiation
- CO2 循环主题页:co2-cycle
- nirdata_mod:NLTE 修正查找表模块
- solang.md:太阳几何计算模块。
- callkeys_mod:config-system