dyn3dpar/conf_gcm.F90
路径
LMDZ.COMMON-6.3\LMDZ.COMMON\libf\dyn3dpar\conf_gcm.F90
所属目录/模块
LMDZ.COMMON\libf\dyn3dpar
文件定位
conf_gcm.F90 定义 SUBROUTINE conf_gcm(tapedef, etatinit),是并行动力入口的运行配置读取中心。它通过 getin 从 run.def 等配置源读取日期、时间步、physics/tracer、restart、输出、耗散、sponge、zoom 和并行专用开关,然后直接写入 control_mod、logic_mod、comconst_mod、serre_mod、sponge_mod_p、mod_filtre_fft、mod_hallo 等模块全局状态。
与串行 dyn3d/conf_gcm 相比,本文件主体同构,但额外处理 OpenMP adjust 限制、并行 FFT filter 开关、MPI 全局 buffer allocation 开关,并使用并行 sponge 模块 sponge_mod_p。串并行差异的横向对照见 conf_gcm 串并行配置差异。
Mars 运行参与度
条件经过:Mars 并行动力构建或并行入口测试经过 `dyn3dpar/gcm.F -> conf_gcm(99,.TRUE.)`。串行 Mars 3D 正常入口使用 `dyn3d/conf_gcm.F90`;MARS dyn1d 不是本文件直接入口。
定义的符号
| 符号 | 类型 | 行号 | 作用 |
|---|---|---|---|
conf_gcm |
subroutine | 6 | 读取并行动力运行配置,写 COMMON/parallel 模块全局状态。 |
依赖的模块和 include
| 依赖 | 用途 |
|---|---|
IOIPSL 或 ioipsl_getincom |
根据 CPP_IOIPSL 选择正式 IOIPSL 或本地 fallback getin。 |
misc_mod |
提供 lunout/prt_level/abort_gcm 等运行输出和错误终止基础。 |
mod_filtre_fft:use_filtre_fft |
并行 polar filter 是否使用 FFT。 |
mod_hallo:use_mpi_alloc |
halo/通信 buffer 是否使用 MPI_ALLOC_MEM 风格的全局内存。 |
control_mod |
写 planet_type/day_step/iphysiq/nday/ndynstep/ok_dyn* 等主控制状态。 |
infotrac:type_trac |
写 tracer 系统类型。 |
assert_m:assert |
校验 vert_prof_dissip 和 zoom 范围等。 |
sponge_mod_p |
写并行 sponge 配置 callsponge/mode_sponge/nsponge/tetasponge。 |
comconst_mod |
写耗散垂直剖面、top-bound sponge 和 ngroup 等。 |
logic_mod |
写 purmats/ok_guide/read_start/iflag_phys/iflag_trac/fxyhypb/ysinus 等逻辑门。 |
serre_mod |
写 zoom 中心、放大率、范围、陡峭度和 alphax/alphay。 |
temps_mod:calend |
写日历类型。 |
dimensions.h, paramet.h, comdissnew.h, iniprint.h |
提供网格维度、耗散控制和打印级别共享状态。 |
输入和输出
| 项 | 方向 | 说明 |
|---|---|---|
tapedef |
输入参数 | 历史配置单元号;当前实现主要通过 getin,本文件内未直接读取该单元。 |
etatinit |
输入参数 | .TRUE. 时初始化 zoom 状态;.FALSE. 时把 run.def zoom 参数与已读 start/control 状态比较。 |
run.def / include def 文件 |
输入 | getin 数据源;实际文件优先级见 IOIPSL getin 系统。 |
lmdz.out 或标准输出 |
输出 | lunout 不是 5/6 时打开 lmdz.out,并写完整配置摘要。 |
| module 全局变量 | 输出 | 后续 dyn3dpar/gcm.F、iniconst/inigeom/inidissip/iniphysiq、leapfrog_p、history/restart、bands/halo/filter 读取这些状态。 |
主要 getin 键
| 类别 | 键 | 写入状态 | 说明 |
|---|---|---|---|
| 输出和运行上限 | lunout, prt_level, itaumax |
misc_mod/control_mod |
设置日志输出和最大步数上限。 |
| 行星和日历 | planet_type, calend, dayref, anneeref |
control_mod, temps_mod |
Mars/generic/Earth 分支和日期基准。 |
| restart/日期重置 | raz_date, resetvarc, starttime, timestart, ecritstart |
control_mod |
决定初始时间、restart 重置和中途写 start/restart。 |
| 运行长度 | nday, ndynstep, less1day, fractday |
control_mod |
后续入口程序派生 itaufin。 |
| 调度 | day_step, nsplit_phys, iperiod, iphysiq, iapp_tracvl |
control_mod |
dyn3dpar/gcm.F 随后检查 iphysiq/iperiod 和 day_step 整除关系。 |
| tracer/守恒 | force_conserv_tracer, iconser, iflag_trac, type_trac, config_inca |
control_mod, logic_mod, infotrac |
影响 tracer 初始化、advection 和守恒诊断。 |
| 输出 | iecri, periodav, output_grads_dyn, ok_dynzon, ok_dyn_ins, ok_dyn_ave |
control_mod, logic_mod |
并行入口只在 mpi_rank==0 初始化 history/dynav。 |
| 耗散 | idissip, dissip_period, lstardis, nitergdiv, nitergrot, niterh, tetagdiv, tetagrot, tetatemp, coefdis |
control_mod, comdissnew.h |
idissip 是旧 Mars/Generic 键;dissip_period 存在时覆盖它。 |
| 垂直耗散剖面 | dissip_factz, dissip_deltaz, dissip_zref, dissip_fac_mid, dissip_fac_up, dissip_hdelta, dissip_pupstart, vert_prof_dissip |
comconst_mod, control_mod |
Earth strato 和 Mars/non-Earth 默认不同;Mars 默认 vert_prof_dissip=1。 |
| sponge/top-bound | iflag_top_bound, mode_top_bound, tau_top_bound, callsponge, nsponge, mode_sponge, tetasponge |
comconst_mod, sponge_mod_p |
iflag_top_bound>=1 与 callsponge=.true. 互斥。 |
| 网格/zoom | ngroup, clon, clat, grossismx, grossismy, fxyhypb, dzoomx, dzoomy, taux, tauy, ysinus |
comconst_mod, serre_mod, logic_mod |
etatinit 决定初始化或一致性校验,后续 inigeom 使用。 |
| 物理/guide/start | purmats, ok_guide, read_start, iflag_phys, cpofT, ip_ebil_dyn, ok_limit, ok_etat0, read_orop |
logic_mod, control_mod |
入口程序决定读取 start、idealized 初始化、physics 初始化和 guide 边界。 |
| 并行专用 | adjust, offline, use_filtre_fft, use_mpi_alloc |
control_mod, mod_filtre_fft, mod_hallo |
并行版新增或放宽的配置点,见下一节。 |
并行特有行为
| 行为 | 源码位置 | 影响 |
|---|---|---|
adjust OpenMP 限制 |
104-117 | CPP_OMP 下进入 OpenMP parallel 区检查线程数;若线程数大于 1 且 adjust=.true.,调用 abort_gcm。 |
offline .AND. adjust warning |
537-544 | 不停止运行,但提示 defstoke.nc/fluxstoke.nc/fluxstokev.nc 不会创建,只保留 phystoke.nc。 |
use_filtre_fft |
590-596 | 并行版只读入 mod_filtre_fft:use_filtre_fft;不像串行版直接拒绝 true。源码注释说明此时 grossismx 尚未定义,zoom/FFT 兼容检查被注释。 |
use_mpi_alloc |
607-615 | 写入 mod_hallo:use_mpi_alloc,由 halo 通信 buffer allocation 使用;细节见 mod_hallo。 |
sponge_mod_p |
20, 414-440 | 使用并行 sponge 状态模块,配置键与串行 sponge 语义相同。 |
conf_gcm 自身不建立 MPI decomposition。并行分布链在 dyn3dpar/gcm 中发生:conf_gcm 之后才调用 init_const_mpi -> init_parallel -> Read_Distrib -> set_bands -> SetDistrib -> Init_Mod_hallo。因此排查并行配置时要先看本页的 getin 写入,再看 gcm.F 的 MPI/bands/halo 初始化。
Zoom 分支
etatinit 控制 zoom 处理方式:
| 分支 | 行号 | 行为 |
|---|---|---|
.not.etatinit |
687-871 | 从 run.def 读 clon/clat/grossismx/grossismy/fxyhypb/dzoomx/dzoomy/taux/tauy/ysinus 到局部变量,并与当前 serre_mod/logic_mod 状态比较;差异超过 0.001 或布尔不一致时 STOP。 |
etatinit |
873-970 | 直接初始化 serre_mod/logic_mod zoom 状态;默认 grossism*=1、fxyhypb=.TRUE.、dzoom*=0.2、taux/tauy=3、ysinus=.TRUE.,并派生 alphax=1-1/grossismx、alphay=1-1/grossismy。 |
Mars utility 的 defrun_new 另有 Mars 专用门控,特别是 ysinus=.false.、无 zoom 强制 fxyhypb=.false.、有 zoom 要求双曲映射;几何使用链路见 inigeom zoom/map 几何约定。本页只记录 COMMON 并行 conf_gcm.F90 的源码行为,不把 Mars defrun_new 的默认值混入本文件。
核心流程
open lmdz.out if lunout is not 5/6
read adjust and validate OpenMP compatibility
read run length, date, restart, timestep, output and tracer controls
read dissipation, vertical profile, top-bound sponge and sponge_mod_p controls
read planet-specific defaults and physics/guide/start switches
read parallel-only use_filtre_fft and use_mpi_alloc
derive vert_prof_dissip default from planet_type/ok_strato
if etatinit:
initialize zoom state in serre_mod/logic_mod
else:
compare run.def zoom keys against already-loaded state
print effective configuration summary
调用方和使用方
| 方向 | 例程/页面 | 关系 |
|---|---|---|
| 调用方 | dyn3dpar/gcm | run.def 存在检查后调用 conf_gcm(99,.TRUE.);随后做 iphysiq/iperiod、day_step/iperiod、day_step/iphysiq 检查。 |
| 时间推进 | dynamics-control-logic-gates, leapfrog-p-time-scheduler | 使用 day_step/iperiod/iphysiq/forward/leapf/apphys/apdiss 等门控。 |
| 并行分布 | parallel_lmdz, bands, mod_hallo | conf_gcm 后建立 MPI/OMP/bands/halo;use_mpi_alloc 进入 mod_hallo。 |
| 几何和滤波 | dyn3d_common/inigeom, inigeom zoom/map 几何约定, filtrez 总览 | zoom 状态由 inigeom 使用;use_filtre_fft 影响后续滤波路径。 |
| 耗散和 sponge | dyn3d_common/inidissip, common-dissip-mars-chain | 耗散周期、迭代次数、垂直剖面和 sponge/top-bound 参数在后续初始化和时间推进中使用。 |
| 输出/restart | leapfrog-p-output-restart, history-field-registration | ok_dyn*, iecri, periodav, ecritstart 决定 root rank 输出和 restart 门控。 |
串并行差异要点
- 串行页 dyn3d/conf_gcm 记录相同主配置管线;并行页额外覆盖
adjust、use_filtre_fft、use_mpi_alloc和sponge_mod_p。 - 串行版会拒绝
use_filtre_fft=.true.;并行版只读取该开关,留给并行滤波链使用。 adjust在串行版不是关键路径;并行版在 OpenMP 多线程时直接 abort。- history 初始化不是本文件完成的:并行入口
gcm.F后续只在mpi_rank==0建立 history/dynav 文件。 ngroup是共享配置,不是并行专属;它约束极区经度分组,要求iim与2**ngroup兼容。
风险和待确认
tapedef参数仍保留在签名中,但当前源码主要通过getin;是否仍有外部旧式单元语义需结合更早版本或构建配置确认。use_filtre_fft与 zoom 的兼容检查在并行版被注释,源码注释称此时grossismx未定义;实际并行 FFT filter 与 zoom 同用时应通过运行测试或滤波页进一步确认。use_mpi_alloc的性能收益和平台兼容性不由本文件判断;这里只确认配置写入mod_hallo。adjust的数值/物理意图不在本文件附近解释;本页只记录 OpenMP 约束和 offline warning。- 并行 Mars 是否为某个生产脚本默认入口需结合
makelmdz_fcmtarget 和实验脚本确认;源码层面只确认条件可达。