nirdata.F90

路径

LMDZ.MARS\libf\phymars\nirdata.F90

所属目录 / 模块

libf\phymars

文件定位

nirdata.F90 定义 nirdata_mod,保存近红外 CO2 NLTE 修正表,并提供 NIR_leedat 例程从运行时数据目录读取 NIRcorrection_feb2011.dat。该表随后由 nirco2abs.Fnircorr=1 时按压力插值,得到 CO2 近红外吸收加热率的修正因子。

physiq_mod.F 在初始化阶段通过 use nirdata_mod, only: NIR_leedat 引入本例程,并在 callnirco2.and.nircorr.eq.1 时调用。非 MESOSCALE 编译路径下,只有 is_master 进程实际读文件,随后通过 bcast 把五个表数组广播到其他进程;MESOSCALE 路径下没有这些并行模块依赖,源码按字面直接读表。

定义的符号

符号 类型 行号 作用
nirdata_mod module 1 保存近红外 CO2 NLTE 修正表和读表例程。
npres integer parameter 6 修正表压力层数,固定为 42。
pres1d saved protected module array 8 表格压力坐标;读入后从 hPa 转为 Pa。
corgcm saved protected module array 9 nirco2abs 插值的 GCM 修正因子表。
oco21d saved protected module array 10 nirco2abs 插值的参考 O/CO2 比值表。
alfa saved protected module array 11 nirco2abs 插值的混合指数表。
p1999 saved protected module array 12 从文件读入的旧方案相关列;当前源码树内未见下游使用。
NIR_leedat subroutine 17 读取 NIRcorrection_feb2011.dat 并在非 MESOSCALE 路径广播表数组。

依赖的模块

use 模块 only 列表 用途 待确认
datafile_mod datadir 拼接运行时数据文件路径 trim(datadir)//'/NIRcorrection_feb2011.dat' -
mod_phys_lmdz_para is_master MESOSCALE 路径下只让 master 进程读取文件。 该依赖位于 #ifndef MESOSCALE 内。
mod_phys_lmdz_transfert_para bcast MESOSCALE 路径下广播读入的五个数组。 该依赖位于 #ifndef MESOSCALE 内。

调用的关键例程

被调用例程 所在模块 / 文件 调用位置 作用
bcast mod_phys_lmdz_transfert_para nirdata.F90:52-56 MESOSCALE 路径下广播 pres1d/corgcm/oco21d/p1999/alfa

上游调用点

调用方 源码位置 调用条件 传入 / 接收关系
physiq_mod.F physiq_mod.F:69, 775 callnirco2.and.nircorr.eq.1 无显式参数;调用后本模块的 protected 表数组被填充。
nirco2abs.F nirco2abs.F:15, 159-161, 226-228 近红外 CO2 加热率计算且 nircorr=1 读取 npres, alfa, corgcm, oco21d, pres1d,通过 interpnir 插值得到逐层修正量。

输入

输入 来源 类型 / 维度 单位 含义
datadir datafile_mod character path - 运行时数据目录。
NIRcorrection_feb2011.dat trim(datadir) 下的外部数据文件 文本表,跳过前 9 行后读 42 行 压力列读入后按 hPa 转 Pa 每行读入 pres1d, corgcm, oco21d, p1999, alfa 五列。
is_master mod_phys_lmdz_para logical - MESOSCALE 路径下控制是否由当前进程执行文件 I/O。

输出

输出 去向 类型 / 维度 单位 含义
pres1d(npres) nirdata_mod module state;nirco2abs 读取 real array, save, protected Pa 修正表压力坐标。
corgcm(npres) nirdata_mod module state;nirco2abs 读取 real array, save, protected 源表单位 GCM 修正因子。
oco21d(npres) nirdata_mod module state;nirco2abs 读取 real array, save, protected 源表单位 参考 O/CO2 比值。
p1999(npres) nirdata_mod module state real array, save, protected 源表单位 文件第四列;当前源码树内没有被 nirco2abs 引用。
alfa(npres) nirdata_mod module state;nirco2abs 读取 real array, save, protected 源表单位 修正混合指数。

共享状态与副作用

核心逻辑

  1. 声明 npres=42,并为五列近红外修正表分配固定长度 module 数组。
  2. NIR_leedat 进入后读取 datafile_mod::datadir
  3. MESOSCALE 编译时,先判断 is_master,只有 master 进入文件读取块。
  4. 用单元号 43 打开 trim(datadir)//'/NIRcorrection_feb2011.dat',要求文件状态为 old
  5. 连续跳过前 9 行表头。
  6. 循环 ind=1,npres,每行依次读入 pres1d(ind), corgcm(ind), oco21d(ind), p1999(ind), alfa(ind)
  7. pres1d(ind) 乘以 100.,把表中压力转换为 Pa。
  8. 关闭文件;非 MESOSCALE 路径下再广播 pres1d/corgcm/oco21d/p1999/alfa

伪代码

NIR_leedat:
    if not MESOSCALE:
        if is_master:
            read_table()
        broadcast pres1d, corgcm, oco21d, p1999, alfa
    else:
        read_table()

read_table:
    open unit 43 at datadir/NIRcorrection_feb2011.dat
    skip 9 header lines
    for ind = 1..42:
        read pressure, corgcm, oco21d, p1999, alfa
        pressure = pressure * 100
    close unit 43

参与的主题流程

主题 参与方式
近红外 CO2 吸收 nirco2abs 提供 nircorr=1 时使用的压力表和 NLTE 修正参数。
辐射初始化 physiqcallnirco2.and.nircorr.eq.1 时调用 NIR_leedat,确保后续 NIR 加热率计算已有表数据。
运行时数据依赖 依赖 datafile_mod::datadir 指向包含 NIRcorrection_feb2011.dat 的数据目录。

写法特点

复现要点

待确认

相关页面