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 列表 |
用途 |
待确认 |
IOIPSL 或 ioipsl_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_gcm 和 getin 使用的运行参数。 |
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_mod、temps_mod、logic_mod、comconst_mod、infotrac、comgeom.h/comgeom2.h 中的全局状态;会打开或写出 restart.nc、history 文件、XIOS 状态;会因配置不一致调用 abort_gcm 或 STOP。
核心逻辑
- 初始化本地状态和默认输出文件名。
- 用
INQUIRE 确认 run.def 存在;缺失则 abort。
- 调用
conf_gcm(99,.TRUE.) 读取控制参数,并检查 iphysiq 是 iperiod 的倍数。
- 禁止串行
use_filtre_fft,按编译宏初始化 XIOS。
- 初始化 Cp(T)、日历和 tracer,分配
q。
- 如果
read_start,可先用 iniacademic 补 SW/Newtonian 常量,再用 dynetat0("start.nc",...) 读初态;否则直接 iniacademic。
- 检查
day_step 与 iperiod/iphysiq 的整除关系,重算 dtvr。
- 处理
raz_date 和 restart 日期差异,设置 Julian day。
- 若
iflag_phys==1,调用 iniconst、inigeom、inifilr。
- 调用
inidissip、计算 day_end,初始化物理、restart 和 history 输出。
- 设置 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_IOIPSL、CPP_XIOS、CPP_PHYS 决定。
复现要点
ecritstart>0 且 planet_type=="mars" 时,初始 dynredem0 使用 day_ini,否则使用 day_end。
nday<0 表示运行 -nday 个动力步,ndynstep>0 又可覆盖结束日计算。
read_start=.false. 会走 iniacademic,这会改变几何/常量初始化来源。
待确认
- COMMON
gcm.F90 对 Mars 当前标准构建的直接参与度需要 build 层证据确认。
inifilr 的实际链接来源需在滤波页面中确认。
相关页面