nirdata.F90
路径
LMDZ.MARS\libf\phymars\nirdata.F90
所属目录 / 模块
libf\phymars
文件定位
nirdata.F90 定义 nirdata_mod,保存近红外 CO2 NLTE 修正表,并提供 NIR_leedat 例程从运行时数据目录读取 NIRcorrection_feb2011.dat。该表随后由 nirco2abs.F 在 nircorr=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 |
源表单位 |
修正混合指数。 |
共享状态与副作用
pres1d/corgcm/oco21d/alfa/p1999 是 save, protected 的 module 数组,且标记为 !$OMP THREADPRIVATE。
NIR_leedat 使用固定单元号 43 打开外部数据文件,读取完成后关闭。
- 非
MESOSCALE 路径下,只有 master 进程读文件,然后对五个数组逐一 bcast。
- 源码没有检查
open/read 的 iostat;缺失或格式不符的数据文件会沿 Fortran 运行时错误路径暴露。
核心逻辑
- 声明
npres=42,并为五列近红外修正表分配固定长度 module 数组。
NIR_leedat 进入后读取 datafile_mod::datadir。
- 非
MESOSCALE 编译时,先判断 is_master,只有 master 进入文件读取块。
- 用单元号
43 打开 trim(datadir)//'/NIRcorrection_feb2011.dat',要求文件状态为 old。
- 连续跳过前 9 行表头。
- 循环
ind=1,npres,每行依次读入 pres1d(ind), corgcm(ind), oco21d(ind), p1999(ind), alfa(ind)。
- 将
pres1d(ind) 乘以 100.,把表中压力转换为 Pa。
- 关闭文件;非
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 修正参数。 |
| 辐射初始化 |
physiq 在 callnirco2.and.nircorr.eq.1 时调用 NIR_leedat,确保后续 NIR 加热率计算已有表数据。 |
| 运行时数据依赖 |
依赖 datafile_mod::datadir 指向包含 NIRcorrection_feb2011.dat 的数据目录。 |
写法特点
- 自由格式
.F90 模块,但包含 #ifndef MESOSCALE 预处理分支。
- 表数组使用
save, protected,外部模块可读不可直接写。
- 表数组同时是 OpenMP
THREADPRIVATE,非 MESOSCALE 下广播后每个线程/并行上下文的数据可用性需遵循当前 LMDZ 并行运行约定。
p1999 被读取和广播,但当前 rg 只发现它在 nirdata.F90 内出现;nirco2abs.F 只 use 了 npres/alfa/corgcm/oco21d/pres1d。
复现要点
- 数据文件路径是
trim(datadir)//'/NIRcorrection_feb2011.dat',不是相对当前工作目录。
- 读表时必须跳过前 9 行,再读取 42 行、5 列。
- 第一列压力读入后立即乘以
100.;复现 nirco2abs 插值时应使用转换后的 Pa。
- 非
MESOSCALE 并行路径下,只能让 master 读文件,再广播五个数组;否则可能造成重复 I/O 或非 master 数据未初始化。
待确认
- 当前
LMDZ.MARS 树下未找到 NIRcorrection_feb2011.dat,LMDZ.MARS\datadir\NIRcorrection_feb2011.dat 也不存在;实际运行环境需确认 datadir 指向的外部数据位置。
- 源码注释只说明该表用于 2011 年新增 NLTE 修正;表中
corgcm/oco21d/p1999/alfa 各列的详细来源和单位需查数据文件或论文说明。
相关页面