datafile_mod.F90
路径
LMDZ.MARS\libf\phymars\datafile_mod.F90
所属目录 / 模块
libf/phymars
文件定位
datafile_mod.F90 是运行时外部数据目录的共享状态模块。源码只定义 datafile_mod 模块和一个 SAVE 字符变量 datadir,默认值为 /u/lmdz/WWW/planets/mars/datadir,并把该变量声明为 OpenMP THREADPRIVATE。它本身不打开文件、不读写 NetCDF,也不定义例程;实际文件访问发生在导入 datadir 的下游模块中。
这个模块是辐射、CO2 云、极冠反照率、尘埃场景、NLTE、近红外修正、化学/光化学表、动力-物理初始化读表等流程的统一目录入口。conf_phys.F 会通过 getin_p("datadir", datadir) 读取 callphys.def 中的路径覆盖默认值;dynphy_lonlat/phymars/datareadnc.F 也会先把 datadir 设回同一默认路径,再用 getin("datadir", datadir) 覆盖后读取 surface.nc。
定义的符号
| 符号 |
类型 |
行号 |
作用 |
datafile_mod |
module |
2 |
保存运行时数据目录路径的共享模块 |
datadir |
module variable, character(len=300), save |
8 |
运行时数据目录根路径,默认 /u/lmdz/WWW/planets/mars/datadir |
datadir threadprivate 声明 |
OpenMP directive |
10 |
让每个 OpenMP 线程持有自己的 datadir 副本 |
依赖的模块
| use 模块 |
only 列表 |
用途 |
待确认 |
| 无 |
- |
本文件没有 use 依赖 |
否 |
调用的关键例程
| 被调用例程 |
所在模块 / 文件 |
调用位置 |
作用 |
| 无 |
- |
- |
本文件不定义可执行过程,也不调用例程 |
输入
| 输入 |
来源 |
类型/维度 |
单位 |
含义 |
datadir 默认字符串 |
datafile_mod.F90 |
character(len=300) |
- |
未被配置覆盖时的外部数据目录 |
datadir 配置项 |
callphys.def.* / conf_phys.F::getin_p |
字符串 |
- |
GCM 物理配置读取的运行时数据目录 |
datadir 配置项 |
datareadnc.F::getin |
字符串 |
- |
surface.nc 读取路径的运行时覆盖入口 |
输出
| 输出 |
去向 |
类型/维度 |
单位 |
含义 |
datadir |
所有 use datafile_mod, only: datadir 的源码 |
character(len=300) |
- |
下游拼接 trim(datadir)//"/..." 形成外部表文件路径 |
共享状态与副作用
datadir 是 SAVE 模块变量,默认随模块加载存在,并在 OpenMP 下按线程保存。
conf_phys.F 读取 callphys.def 的 datadir 后会修改该模块变量,并打印最终路径。
datareadnc.F 对同一模块变量再次赋默认值并调用 getin("datadir", datadir),因此复现 surface.nc 路径时要注意调用顺序。
- 本模块自身没有 I/O 副作用;下游模块负责
open、nf90_open、inquire 或错误中止。
- 源码仓库中的
datadir/README 只指向在线 datadir.tar.gz,实际运行所需数据包不等同于仓库内已完整提供。
核心逻辑
- 进入模块后启用
implicit none。
- 定义
character(len=300), save :: datadir="/u/lmdz/WWW/planets/mars/datadir"。
- 通过
!$OMP THREADPRIVATE(datadir) 声明 OpenMP 线程私有副本。
- 下游配置读取流程可覆盖
datadir。
- 下游物理、化学、辐射和初始化模块把
datadir 作为运行时数据根目录拼接具体文件名。
伪代码
module datafile_mod
datadir = "/u/lmdz/WWW/planets/mars/datadir"
make datadir threadprivate
end module
read optional config key "datadir" into datafile_mod.datadir
path = trim(datadir) // "/" // required_runtime_filename
open or inquire path
参与的主题流程
| 主题 |
参与方式 |
| CO2 循环 |
为 co2cloud_mod 的 optprop_co2ice_1mic.dat 和 improvedco2clouds_mod 的 Meteo_flux_Plane.dat 提供目录根 |
| 辐射 |
为气溶胶光学属性表、近红外修正和 NLTE 数据提供目录根 |
| 尘埃循环 |
为 read_dust_scenario_mod 读取 dust_*.nc 场景提供目录根 |
| 配置系统 |
callphys.def 的 datadir 配置项会覆盖默认路径 |
写法特点
- 自由格式 Fortran 90,文件仅 13 行。
- 共享配置容器,只保存路径变量,不实现业务逻辑。
SAVE + THREADPRIVATE,说明并行运行时每个线程保留自己的 datadir。
- 硬编码默认路径,默认指向 LMD 在线 Mars datadir 位置;本仓库配置样例中既有绝对路径,也有
./datadir。
复现要点
datadir 必须指向包含外部表文件的数据包目录;仓库内 datadir/README 指向在线数据包下载地址,不代表所有数据文件已存在。
conf_phys.F 的 getin_p("datadir", datadir) 是主物理配置覆盖入口;若未覆盖,使用源码默认路径。
- 典型下游文件包括
albedocaps.F90、co2cloud_mod.F90、improvedco2clouds_mod.F90、read_dust_scenario_mod.F90、suaer.F90、nirdata.F90、nlte_setup.F、photolysis_mod.F90、chemistrydata.F90、param_read.F、param_read_e107.F、inichim_newstart.F90、datareadnc.F 和 newstart.F。
- 路径拼接通常使用
trim(datadir)//"/filename";配置值末尾是否带 / 不应依赖猜测,复现时按源码拼接点检查。
待确认
datareadnc.F 重新给 datadir 赋默认值再读配置,是否可能覆盖此前 conf_phys.F 读取到的值,取决于实际调用顺序;本页只记录源码字面行为。
- OpenMP
THREADPRIVATE(datadir) 在配置读取后是否总能让所有线程获得一致路径,需要结合并行初始化路径确认。
相关页面