gcm.F90

路径

LMDZ.COMMON-6.3\LMDZ.COMMON\libf\dyn3d\gcm.F90

所属目录/模块

LMDZ.COMMON\libf\dyn3d

文件定位

gcm.F90 定义串行 PROGRAM gcm,负责完整串行 GCM 的启动序列:检查 run.def,读取运行配置,初始化 tracer、初始状态、动力常量、几何、耗散、物理接口、restart/history 输出,最后调用 leapfrog 进入时间推进。

Mars 运行参与度

条件经过:COMMON 串行完整 GCM 入口。Mars 源码树中主要可见 phymars/nogcm.F90 同类入口;本文件是否作为 Mars 生产入口需结合构建配置确认。

定义的符号

符号 类型 行号 作用
gcm program 6 串行 GCM 启动入口。

依赖的模块

use 模块 only 列表 用途 待确认
IOIPSLioipsl_getincom - getin、日历和 IOIPSL 配置。 取决于 CPP_IOIPSL
wxios - XIOS 初始化。 只在 CPP_XIOS
filtreg_mod - 滤波相关状态和例程。 -
infotrac - tracer 数量 nqtot 和初始化。 -
control_mod planet_type, nday, day_step, iperiod, iphysiq, raz_date, anneeref, starttime, dayref, ok_dyn_ins, ok_dyn_ave, iecri, periodav, less1day, fractday, ndynstep, nsplit_phys, ecritstart 主运行控制变量。 -
mod_const_mpi COMM_LMDZ 传给物理初始化的通信器。 串行占位含义需查模块页。
cpdet_mod ini_cpdet 初始化 Cp(T) Venus 相关表。 Mars 是否启用 cpofT 由配置决定。
temps_mod calend, start_time, annee_ref, day_ref, itau_dyn, itau_phy, day_ini, jD_ref, jH_ref, day_end 日期、时间步和 Julian day 状态。 -
iniphysiq_mod iniphysiq 物理初始化。 只在 CPP_PHYS
comconst_mod daysec, dtvr, dtphys, rad, g, r, cpp 常量和时间步。 -
logic_mod read_start, iflag_phys, ok_guide, ecripar 主流程开关。 -

调用的关键例程

被调用例程 所在模块/文件 调用位置 作用
abort_gcm dyn3d/abort_gcm.F 160, 164, 169, 214, 219, 222, 292, 298, 318 缺文件、配置错误或未实现日历时退出。
conf_gcm dyn3d/conf_gcm.F90 163 读取 run.def 配置并写共享控制变量。
getin IOIPSL/getin 167 读取 use_filtre_fft
wxios_init wxios 177 初始化 XIOS。
ini_cpdet cpdet_mod 192 初始化温度相关热容转换。
ioconf_calendar, ioconf_startdate IOIPSL 202-208, 375 设置 IOIPSL 日历和起始日期。
infotrac_init infotrac.F90 239 读取 tracer 配置。
iniacademic dyn3d_common/iniacademic.F90 253, 272 构造理想化初态或补初始化常量。
dynetat0 dynetat0 256 start.nc 读取动力初态。
relaxetat0 dyn3d_common/relaxetat0.F 264 读取 generic guide relaxation 字段。
iniconst dyn3d_common/iniconst.F90 408 初始化动力常量。
inigeom inigeom 412 初始化动力几何。
inifilr filtrez/inifgn.F 或相关滤波路径 416 初始化滤波。
inidissip dyn3d_common/inidissip.F90 423 初始化耗散参数。
iniphysiq 行星物理模块 469 初始化物理接口。
dynredem0 dyn3d_common/dynredem.F90 488, 490, 493 写初始/目标 restart。
inithist, initdynav dyn3d_common 504, 512 初始化瞬时和平均动力输出。
leapfrog dyn3d/leapfrog.F 538 进入主时间推进。

输入

输入 来源 类型/维度 单位 含义
run.def 当前运行目录 文本配置 - conf_gcmgetin 使用的运行参数。
start.nc 当前运行目录 NetCDF - read_start=.true. 时的动力初态。
relax.nc 当前运行目录 NetCDF - planet_type=="generic"ok_guide 时的 relaxation 字段。
traceur.def tracer 初始化路径 文本配置 - infotrac_init 读取 tracer 数量和名称。

输出

输出 去向 类型/维度 单位 含义
restart.nc 当前运行目录 NetCDF - 初始写出的动力 restart,Mars 可按 ecritstart 使用 day_ini
dyn_hist.nc, dyn_hist_ave.nc 当前运行目录 NetCDF - 动力瞬时和平均输出,受 ok_dyn_ins/ok_dyn_ave 控制。
ucov/vcov/teta/q/masse/ps/phis 内存数组 2D/3D/4D 多种 传入 leapfrog 的动力状态。

共享状态与副作用

程序写入或依赖 control_modtemps_modlogic_modcomconst_modinfotraccomgeom.h/comgeom2.h 中的全局状态;会打开或写出 restart.nc、history 文件、XIOS 状态;会因配置不一致调用 abort_gcmSTOP

核心逻辑

  1. 初始化本地状态和默认输出文件名。
  2. INQUIRE 确认 run.def 存在;缺失则 abort。
  3. 调用 conf_gcm(99,.TRUE.) 读取控制参数,并检查 iphysiqiperiod 的倍数。
  4. 禁止串行 use_filtre_fft,按编译宏初始化 XIOS。
  5. 初始化 Cp(T)、日历和 tracer,分配 q
  6. 如果 read_start,可先用 iniacademic 补 SW/Newtonian 常量,再用 dynetat0("start.nc",...) 读初态;否则直接 iniacademic
  7. 检查 day_stepiperiod/iphysiq 的整除关系,重算 dtvr
  8. 处理 raz_date 和 restart 日期差异,设置 Julian day。
  9. iflag_phys==1,调用 iniconstinigeominifilr
  10. 调用 inidissip、计算 day_end,初始化物理、restart 和 history 输出。
  11. 设置 offline 存储频率,调用 leapfrog

伪代码

require run.def
conf_gcm()
reject invalid periods and serial FFT filter
initialize optional XIOS, Cp(T), calendar, tracers
allocate q from nqtot
if read_start:
    maybe initialize academic constants
    read start.nc through dynetat0
    maybe read relax.nc
else:
    build academic initial state
validate day_step, dates, and dtvr
if physics enabled:
    initialize constants, geometry, filter, physics
initialize dissipation, restart, history outputs
leapfrog(state, time_0)

参与的主题流程

主题 参与方式
dynamics-time-integration 完整串行入口,最终调度 leapfrog
restart-io 读取 start.nc,写 restart.nc,初始化 history。
dynphys-interface 传入动力几何和常量调用 iniphysiq

写法特点

该文件是自由格式 Fortran 90,但仍通过 include 使用固定格式时代的公共头文件。大量控制流由预处理宏 CPP_IOIPSLCPP_XIOSCPP_PHYS 决定。

复现要点

待确认

相关页面