chemistrydata.F90
快速理解
它做什么: 离线光解查找表数据模块,声明 6 维表并提供读取例程。被 calchim_mod 在 firstcall 离线光解时调用。
基本过程: read_phototable 从 datadir 读 jmars.20140930 → master 读取 → 广播。
关键结果: jphot/colairtab/table_ozo/szatab/tautab 等表数组,供 photolysis 插值。
路径
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严格一致,否则静默错位;待确认文件生成约定。
相关页面
- aeronomars/index:
aeronomars目录总览,本文件在其“光化学”分类下。 - datafile_mod:提供
datadir数据目录路径。 - calchim_mod:调用方文件页,含
read_phototable调用点与photochem/jonline分支。 - photochemistry_mod:
photolysis得到的v_phot下游使用点,组装反应矩阵并积分化学物种。 - photolysis:
jphot多维插值和v_phot槽位映射方。 - photolysis_mod.F90 / photolysis_online.F:在线光解路径文件页。