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 吸收加热率

共享状态与副作用

核心逻辑

  1. 初始化(行 114-141):

    • 首次调用时检查 nircorr 开关
    • nircorr=1:需要 CO2 和 O tracer,否则终止
    • nircorr=0:如果 CO2 和 O tracer 都存在,说明有能力做 NLTE 修正但未启用,源码行 137 直接终止
    • 保存 ico2io 索引
  2. 基础加热率(行 145):

    • co2heat0 = n_a * (1.52/dist_sol)^2 / daysec
    • 700Pa 参考压力、零天顶角时的加热率
  3. diurnal=T 模式(行 150-198):

    • 对每个网格点计算 zmu = sqrt(1224*mu0^2 + 1) / 35(有效天顶角参数)
    • nircorr=1:从 nirdata_mod 查表插值得到 cor1oldoco2alfa2
    • 对每层计算:
      • 基础加热:co2heat0 * sqrt(700*zmu/pplay) / (1 + n_p0/pplay)^n_b
      • NLTE 修正(nircorr=1):
        • cor0 = 1/(1 + n_p0/pplay)^n_b
        • oco2gcm = 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
  4. diurnal=F 模式(行 207-254):

    • 将一天分为 nstep=20 个时间步
    • 对每个时间步调用 solang 计算太阳几何和白天比例
    • 累加热率的加权平均(权重 = 1/nstep
    • NLTE 修正同 diurnal=T 模式
  5. interpnir 子程序(行 260-292):

    • 在压力坐标上做线性插值
    • 超出范围(p>1500p<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 修正时)

写法特点

复现要点

待确认

相关页面