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 列表 |
用途 |
待确认 |
IOIPSL 或 ioipsl_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.h、paramet.h、comdissnew.h、comgeom.h、iniprint.h、tracstoke.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_IOIPSL 且 ok_dyn_ins 时的瞬时动力输出 |
dyn_hist_ave.nc |
当前目录 |
NetCDF |
混合 |
CPP_IOIPSL 且 ok_dyn_ave 时的平均动力输出 |
q(ip1jmp1,llm,nqtot) |
传给 leapfrog_nogcm |
real allocatable |
tracer 单位 |
平流 tracer 初始场 |
共享状态与副作用
- 写
temps_mod 日期状态:annee_ref/day_ref/day_ini/itau_dyn/itau_phy/start_time/day_end/jD_ref/jH_ref。
- 写
comconst_mod::dtvr/dtphys 等时间步状态,并在 iflag_phys==1 路径调用 iniconst/inigeom/inifilr。
- 写
logic_mod::ecripar=.TRUE.,允许并行/参数输出路径。
- 条件编译下初始化 IOIPSL calendar、历史文件、动力平均文件和 XIOS context。
- 分配
q(ip1jmp1,llm,nqtot),程序结束前未显式 deallocate,由进程退出释放。
核心逻辑
- 读取运行配置:
conf_gcm(99,.TRUE.) 后校验 iphysiq 必须是 iperiod 的倍数;若 use_filtre_fft=true,顺序动力版本直接中止。
- 初始化输出和 Cp(T):
CPP_XIOS 下调用 wxios_init("LMDZ");随后 ini_cpdet 初始化温度相关热容支持。
- 设置日历:
CPP_IOIPSL 下仅完整支持 Earth 360/365/366 天日历;Titan/Venus 分支打印未实现并中止。非 IOIPSL 时把 jD_ref/jH_ref 置零。
- 读取 tracer 配置并分配数组:
infotrac_init 得到 nqtot,分配 q。
- 构造初始动力状态:
read_start=.true. 时,若 iflag_phys.ne.1 先跑 iniacademic 初始化常数/场,再调用 dynetat0("start.nc",...)。
- generic planet 且
ok_guide 时读取 relax.nc。
read_start=.false. 时直接调用 iniacademic 构造理想初始场。
- 校验和调整时间:检查
day_step 与 iperiod;按 start_time/starttime、raz_date、anneeref/dayref 决定是否重置日期或中止。
- 初始化动力/物理:
iflag_phys==1 时设置 dtvr,调用 iniconst/inigeom/inifilr;iflag_phys==1 或 >=100 时在 CPP_PHYS 下调用 iniphysiq。
- 确定运行终止日和输出:根据
nday、less1day、ndynstep 计算 day_end;IOIPSL 下初始化 dyn_hist.nc 和 dyn_hist_ave.nc。
- 写初始 restart 头并进入积分:Mars 使用
day_ini 写 dynredem0("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 |
写法特点
.F90 自由格式源码,但保留旧 gcm.F 注释和 LMDZ 动力变量命名。
- 大量功能由条件编译控制:
CPP_IOIPSL、CPP_XIOS、CPP_PHYS。
iflag_phys 决定初始化路径:1 是物理路径;>=100 也初始化物理,但部分动力初始化只在 ==1 执行。
- Mars 路径给
dynredem0 传 day_ini,其他行星传 day_end。
- 仅写
restart.nc 头部;完整时间积分和最终 restart 写出在 leapfrog_nogcm 中。
复现要点
- 需要
conf_gcm 能找到运行配置,并保证 iphysiq 是 iperiod 的倍数。
- 顺序动力版本不能启用
use_filtre_fft。
- 若
read_start=.true.,当前目录必须有 start.nc;若 generic nudging 打开,还要有 relax.nc。
- 若启用物理,必须以
CPP_PHYS 编译并能调用 iniphysiq 及后续物理链。
leapfrog_nogcm 才是时间积分核心;调试运行结果时应同时检查该页面。
待确认
modname='gcm' 仍沿用旧程序名,日志/中止信息是否应改为 nogcm 待确认。
istdyn=day_step/4 注释写有“6h=1jour/12”不一致;源码实际按 day_step/4 执行。
iflag_phys>=100 时是否应同样执行 iniconst/inigeom/inifilr,本页只按源码字面记录。
相关页面