chemistrydata.F90
路径
LMDZ.MARS\libf\aeronomars\chemistrydata.F90
所属目录/模块
libf\aeronomars
文件定位
chemistrydata.F90 定义 chemistrydata_mod,是光化学离线光解的查找表数据模块。它用编译期参数声明光解查找表的六个维度(物种、高度、臭氧、太阳天顶角、温度、尘埃不透明度),保存三个 SAVE/PROTECTED/THREADPRIVATE 数据数组(光解速率表 jphot、空气柱剖面 colairtab、臭氧柱网格 table_ozo)以及两张参数表(szatab、tautab),并提供读取例程 read_phototable。
read_phototable 在 calchim_mod 的 firstcall 中、photochem .and. .not. jonline(离线光解)条件下被调用一次,从 datadir 读取默认名为 jmars.20140930 的查找表文件(可由 phototable 配置键覆盖),master 读取后广播到所有核。表数据随后由 photolysis.F90 的 photolysis 例程做多维插值,得到光解速率 v_phot,再由 photochemistry_mod 组装反应矩阵并积分化学物种。
作者:Franck Lefevre,VERSION 8/10/2014(源码第 48、50 行)。
定义的符号
| 符号 |
类型 |
行号 |
作用 |
chemistrydata_mod |
module |
1(END MODULE 138) |
光解查找表数据模块 |
read_phototable |
subroutine |
39(END SUBROUTINE 136) |
从 datadir 读取光解查找表并广播到所有核 |
jphot |
protected save THREADPRIVATE array |
30 |
光解速率查找表,维度 (ntemp,nsza,nz,nozo,ntau,nd) |
colairtab |
protected save THREADPRIVATE array |
32 |
空气柱剖面 (nz),作为高度/柱坐标 |
table_ozo |
protected save THREADPRIVATE array |
34 |
臭氧柱网格 (nozo) |
szatab |
parameter array |
20 |
表列太阳天顶角 (nsza),0°–95° |
tautab |
parameter array |
27 |
表列尘埃不透明度 (ntau),0–4 |
nd/nz/nozo/nsza/ntemp/ntau |
integer parameters |
10–15 |
查找表维度:物种 13 / 高度 143 / 臭氧 7 / SZA 27 / 温度 4 / 尘埃 8 |
依赖的模块
read_phototable 内:
| use 模块 |
only 列表 |
用途 |
待确认 |
ioipsl_getin_p_mod |
getin_p |
读取 phototable 文件名配置键 |
- |
datafile_mod |
datadir |
数据目录路径,拼接查找表文件全名 |
- |
mod_phys_lmdz_para |
is_master |
仅 master 打开/读取文件 |
- |
mod_phys_lmdz_transfert_para |
bcast |
把 colairtab/table_ozo/jphot 广播到所有核 |
- |
调用的关键例程
| 被调用例程 |
所在模块/文件 |
调用位置 |
作用 |
getin_p |
ioipsl_getin_p_mod |
81 |
读取 phototable 配置键,覆盖默认文件名 |
abort_physic |
LMDZ 物理工具(本例程 use 列表未显式声明其模块) |
99 |
文件缺失时中止运行 |
bcast |
mod_phys_lmdz_transfert_para |
132–134 |
广播 colairtab、table_ozo、jphot |
open / read / close |
Fortran intrinsic |
87 / 113–114 / 127 |
读取格式化查找表文件 |
输入
read_phototable 无哑元参数,输入来自配置与文件:
| 输入 |
来源 |
类型 |
含义 |
phototable 配置键 |
callphys.def 经 getin_p |
character |
查找表文件名,默认 jmars.20140930 |
datadir |
datafile_mod |
character |
数据目录路径 |
| 查找表文件 |
datadir/phototable |
formatted ASCII |
光解速率表,按固定嵌套顺序排列 |
输出
| 输出 |
去向 |
类型/维度 |
含义 |
jphot |
photolysis.F90::photolysis |
real (ntemp,nsza,nz,nozo,ntau,nd) |
光解速率查找表,供多维插值 |
colairtab |
photolysis.F90::photolysis |
real (nz) |
空气柱剖面,插值的高度坐标 |
table_ozo |
photolysis.F90::photolysis |
real (nozo) |
臭氧柱网格,插值的臭氧坐标 |
共享状态与副作用
jphot、colairtab、table_ozo 为 SAVE, PROTECTED 模块变量,并用 !$OMP THREADPRIVATE 声明(第 31、33、35 行);模块外只读,仅由 read_phototable(master)写入并经 bcast 分发。
szatab、tautab 与六个维度参数为 PARAMETER,编译期固定。
- 文件 I/O 仅在 master 进程执行;非 master 进程的数组值由
bcast 获得。
- 文件单位
fic=81 硬编码(第 83 行);若其他例程同时使用单位 81 可能冲突。
- 读取前向标准输出打印文件名,读取后打印
lookup table...ok。
- 文件缺失时打印诊断信息并调用
abort_physic 中止。
核心逻辑
- 文件名:
phototable="jmars.20140930"(默认),call getin_p("phototable",phototable) 允许 def 文件覆盖(第 77–81 行)。
- master 打开:
open(fic,...,file=trim(datadir)//"/"//trim(phototable),iostat=ierr);ierr/=0 时打印帮助信息(提示用 datadir=/phototable= 配置)并 abort_physic(第 85–100 行)。
- 嵌套读取(第 108–124 行):
itau(1..ntau) × itemp(1..ntemp) × iozo(1..nozo) × isza(1..nsza) × iz(nz..1,-1),每次迭代:
- 自由格式读一行
colairtab(iz), xsza, table_ozo(iozo)(第 113 行);
- 按
(7e11.4) 格式读 nd=13 个 jphot(itemp,isza,iz,iozo,itau,ij)(第 114 行);
- 把等于
1.e-30 的哨兵值置 0.(第 115–119 行)。
- 关闭:
close(fic)(第 127 行)。
- 广播:
bcast(colairtab)、bcast(table_ozo)、bcast(jphot)(第 132–134 行)。
伪代码
read_phototable():
phototable = "jmars.20140930"
call getin_p("phototable", phototable)
fic = 81
if is_master:
open fic, file=datadir//"/"//phototable, iostat=ierr
if ierr /= 0:
print help; call abort_physic(...)
for itau=1..ntau:
for itemp=1..ntemp:
for iozo=1..nozo:
for isza=1..nsza:
for iz=nz..1 (step -1):
read fic: colairtab(iz), xsza, table_ozo(iozo)
read fic (7e11.4): jphot(itemp,isza,iz,iozo,itau, 1..nd)
for ij=1..nd:
if jphot(...)==1.e-30: jphot(...)=0.
close fic
call bcast(colairtab); call bcast(table_ozo); call bcast(jphot)
参与的主题流程
| 主题 |
参与方式 |
| 光化学 / 光解 |
离线光解路径下,calchim_mod firstcall 调 read_phototable 载入表;photolysis 用表插值得光解速率 v_phot 供化学反应 |
| 高层大气初始化 |
与 init_photolysis(在线光解,jonline=true)二选一,由 calchim_mod firstcall 分支决定 |
写法特点
- 自由格式
.F90 模块,PROTECTED 防止模块外写共享数组。
- 查找表维度用
PARAMETER 固定,便于下游 use 同一维度做插值循环。
- 每行文件含一个
xsza(该行对应的太阳天顶角),但代码读入后未使用——SZA 网格实际用参数 szatab,xsza 为丢弃式读取。
1.e-30 作为表内哨兵值,读入时归零。
- 文件单位
81 与默认文件名 jmars.20140930 均硬编码。
复现要点
- 需要
datadir 中存在查找表文件(默认 jmars.20140930),否则 abort_physic 中止;可用 callphys.def 的 datadir= 和 phototable= 覆盖。
- 表仅在
photochem=true 且 jonline=false(离线光解)时载入;jonline=true 走 init_photolysis 在线路径,不读本表。
- master-only 读取 +
bcast:并行复现依赖广播正确分发;非 master 进程不得在 read_phototable 返回前读取 jphot。
- 文件格式固定:每个
(itau,itemp,iozo,isza,iz) 块为一行自由格式(柱、sza、ozo)+ 一行 (7e11.4) 的 13 个速率;iz 自顶向下(nz→1)读取。
jphot 约 1124 万个实数(4×27×143×7×8×13),内存与文件规模较大。
待确认
abort_physic 的宿主模块未在本例程 use 列表显式声明,可能经 mod_phys_lmdz_para 间接可用;待确认。
jphot(:,:,:,:,:,:,ij) 中 ij=1..nd=13 各维度对应的具体光解反应/物种,由 photolysis 的下游映射和 photochemistry_mod 的 v_phot 消费路径决定;本文件不含该映射。
- 文件每行的
xsza 被丢弃而改用 szatab,是否意味着文件内 SZA 必须与 szatab 严格一致,否则静默错位;待确认文件生成约定。
相关页面