nogcm.F90

路径

LMDZ.MARS\libf\dynphy_lonlat\phymars\nogcm.F90

所属目录/模块

libf/dynphy_lonlat/phymars

文件定位

nogcm.F90 定义 PROGRAM nogcm,是 lon-lat 动力目录中的“无 GCM 动力核心”独立物理模式入口。它仍然读取 run.def/gcm.def、tracer 配置和可选 start.nc,初始化动力几何、物理网格、IOIPSL/XIOS 输出环境,然后调用 leapfrog_nogcm 执行时间积分。与完整 GCM 不同,它不调用标准动力核心,而把后续演化交给 leapfrog_nogcm 中的牛顿松弛、水平混合和物理倾向。

定义的符号

符号 类型 行号 作用
nogcm program 6 独立物理模式主程序;初始化运行状态并调用 leapfrog_nogcm

依赖的模块

use 模块 only 列表 用途 待确认
IOIPSLioipsl_getincom 条件编译 IOIPSL 可用时使用完整接口,否则至少使用本地 getin
wxios 条件编译 CPP_XIOS 下初始化 XIOS
filtreg_mod 全模块 初始化滤波器
infotrac 全模块 infotrac_init 读取 tracer 数量和名称
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 运行控制、日历、输出频率和物理调用频率
mod_const_mpi COMM_LMDZ iniphysiq 物理初始化通信器实参
cpdet_mod ini_cpdet Venus/通用 Cp(T) 初始化
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 控制是否读 start.nc、是否启用物理和 relaxation

INCLUDE 头文件dimensions.hparamet.hcomdissnew.hcomgeom.hiniprint.htracstoke.h

调用的关键例程

被调用例程 所在模块/文件 调用位置 作用
conf_gcm 外部配置例程 155 读取 GCM/nogcm 运行参数
getin IOIPSL/getin 160 读取 use_filtre_fft
abort_gcm 外部 156, 161, 206, 211, 214, 284, 309 配置不合法或未实现路径时中止
wxios_init wxios 169 CPP_XIOS 下初始化 XIOS
ini_cpdet cpdet_mod 184 初始化 Cp(T) 支持
ioconf_calendar IOIPSL 194-200 设置 Earth 日历;Titan/Venus 分支尚未实现
infotrac_init infotrac 231 读取 tracer 数量/名称并设置 nqtot
iniacademic 外部 245, 272 不读 start 或非物理模式时构造理想初始场
dynetat0 动力 restart 读取 248 start.nc 读取动力状态
relaxetat0 外部 255 generic planet + nudging 时读取 relax.nc
ymds2ju / ju2ymds IOIPSL 362, 371, 440, 442 Earth 日历日期转换
iniconst / inigeom / inifilr 动力初始化例程 398, 403, 408 物理模式路径下初始化常数、几何和滤波
iniphysiq iniphysiq_mod.F90 460 初始化物理网格与共享状态
dynredem0 动力 restart 写出 471, 473 restart.nc 的头部/静态状态
inithist / initdynav IOIPSL 484, 492 初始化瞬时和平均动力输出
leapfrog_nogcm leapfrog_nogcm.F 518 执行独立物理模式时间积分

输入

输入 来源 类型/维度 单位 含义
run.def / gcm.def conf_gcm 配置 时间步、输出、物理频率、日期和运行长度
traceur.def / tracer.def infotrac_init 配置 tracer 数量和名称
start.nc 当前目录 NetCDF 混合 logic_mod::read_start 为真时读取动力初始场
relax.nc 当前目录 NetCDF 混合 planet_type=="generic"ok_guide 为真时读取 nudging/relaxation 场
use_filtre_fft getin 配置键 logical 若为真会中止,因为顺序动力版本不支持 FFT filter

输出

输出 去向 类型/维度 单位 含义
restart.nc 当前目录 NetCDF 混合 程序启动时间先由 dynredem0 写头,后续由 leapfrog_nogcm 写最终动力状态
dyn_hist.nc 当前目录 NetCDF 混合 CPP_IOIPSLok_dyn_ins 时的瞬时动力输出
dyn_hist_ave.nc 当前目录 NetCDF 混合 CPP_IOIPSLok_dyn_ave 时的平均动力输出
q(ip1jmp1,llm,nqtot) 传给 leapfrog_nogcm real allocatable tracer 单位 平流 tracer 初始场

共享状态与副作用

核心逻辑

  1. 读取运行配置conf_gcm(99,.TRUE.) 后校验 iphysiq 必须是 iperiod 的倍数;若 use_filtre_fft=true,顺序动力版本直接中止。
  2. 初始化输出和 Cp(T)CPP_XIOS 下调用 wxios_init("LMDZ");随后 ini_cpdet 初始化温度相关热容支持。
  3. 设置日历CPP_IOIPSL 下仅完整支持 Earth 360/365/366 天日历;Titan/Venus 分支打印未实现并中止。非 IOIPSL 时把 jD_ref/jH_ref 置零。
  4. 读取 tracer 配置并分配数组infotrac_init 得到 nqtot,分配 q
  5. 构造初始动力状态
    • read_start=.true. 时,若 iflag_phys.ne.1 先跑 iniacademic 初始化常数/场,再调用 dynetat0("start.nc",...)
    • generic planet 且 ok_guide 时读取 relax.nc
    • read_start=.false. 时直接调用 iniacademic 构造理想初始场。
  6. 校验和调整时间:检查 day_stepiperiod;按 start_time/starttimeraz_dateanneeref/dayref 决定是否重置日期或中止。
  7. 初始化动力/物理iflag_phys==1 时设置 dtvr,调用 iniconst/inigeom/inifilriflag_phys==1>=100 时在 CPP_PHYS 下调用 iniphysiq
  8. 确定运行终止日和输出:根据 ndayless1dayndynstep 计算 day_end;IOIPSL 下初始化 dyn_hist.ncdyn_hist_ave.nc
  9. 写初始 restart 头并进入积分:Mars 使用 day_inidynredem0("restart.nc",...),其他行星用 day_end;最后调用 leapfrog_nogcm(ucov,vcov,teta,ps,masse,phis,q,time_0)

伪代码

conf_gcm()
assert iphysiq is multiple of iperiod
read use_filtre_fft; abort if true
optional wxios_init
ini_cpdet
configure IOIPSL calendar if compiled

infotrac_init
allocate q(ip1jmp1,llm,nqtot)

if read_start:
    if iflag_phys != 1:
        iniacademic(...)
    dynetat0("start.nc", ...)
    if planet_type == "generic" and ok_guide:
        relaxetat0("relax.nc")
else:
    iniacademic(...)

check day_step and start date consistency
if raz_date == 1:
    reset day/time counters from run.def values

if iflag_phys == 1:
    dtvr = daysec/day_step
    iniconst; inigeom; inifilr

if iflag_phys == 1 or iflag_phys >= 100:
    iniphysiq(..., dtphys/nsplit_phys, ...)

compute day_end
dynredem0("restart.nc", Mars ? day_ini : day_end, phis)
optional inithist/initdynav
set offline storage frequencies
leapfrog_nogcm(...)

参与的主题流程

主题 参与方式
独立物理模式 主程序入口;初始化后调用 leapfrog_nogcm
初始场/restart 读取 start.nc 或构造 idealized 初始场,并写 restart.nc 头部
输出初始化 可初始化 IOIPSL 动力历史和平均文件,也可初始化 XIOS

写法特点

复现要点

待确认

相关页面