iniconst / conf_planete 行星常数初始化链
源码:
LMDZ.COMMON-6.3\LMDZ.COMMON\libf\dyn3d_common\iniconst.F90LMDZ.COMMON-6.3\LMDZ.COMMON\libf\dyn3d_common\conf_planete.F90LMDZ.COMMON-6.3\LMDZ.COMMON\libf\dyn3d_common\comconst_mod.F90
本文只覆盖 COMMON 当前行星常数、时间步和垂直离散入口;Mars nogcm.F90/newstart.F/tabfi.F 只作为 MARS 侧使用位置和边界上下文,不视为 COMMON 源文件。
结论
COMMON 有两条行星常数进入动力核的路径:
- 有
start.nc的主流程:dynetat0("start.nc")从controle/tab_cntrl读取rad/omeg/g/cpp/kappa/daysec/dtvr/pa/preff,写入comconst_mod和comvert_mod;随后gcm用daysec/day_step重算dtvr,再调用iniconst派生dtphys/r/pi/unsim并建立垂直坐标。 - 无
start.nc或理想化场路径:iniacademic调conf_planete,后者用getin读取行星半径、重力、气体常数、热容、自转和日长等常数;随后iniacademic计算dtvr=daysec/day_step并调用iniconst。
因此,conf_planete 不是常规 Mars restart 运行的唯一入口;它是理想化/academic 初始化路径的常数来源。常规 Mars/GCM restart 路径首先信任 start.nc 的 controle 元数据,再由 run.def 的 day_step/iphysiq/nsplit_phys 决定动力步长和 physics 步长。
参与状态
| 符号或文件 | 职责 | 写入状态 | 主要使用位置 |
|---|---|---|---|
comconst_mod |
共享动力常量与维度状态 | im/jm/lllm, dtvr/dtphys/dtdiss, rad/g/omeg/cpp/kappa/r/daysec, 耗散和顶边界参数 |
gcm, leapfrog, inigeom, inidissip, dynredem, sortvarc, Mars utility |
conf_planete |
getin 读取行星常数默认值 |
preff/pa, g/molmass/kappa/cpp/rad/daysec/daylen/year_day/omeg/ihf |
iniacademic |
dynetat0 |
从 start.nc 恢复运行常数 |
rad/omeg/g/cpp/kappa/daysec/dtvr/pa/preff |
gcm 主流程 |
iniconst |
派生动力常数和垂直离散选择 | dtphys=iphysiq*dtvr, r=cpp*kappa, pi, unsim, 维度派生量 |
gcm, iniacademic, grilles_gcm_netcdf_sub |
Mars tabfi |
Mars physics/startfi 侧常数读写 | rad/omeg/g/mugaz/rcp/daysec/dtphys 到 MARS physics 状态 |
newstart, Mars physics 初始化 |
conf_planete 默认值和配置键
conf_planete 先给出 Earth-like 默认值,再允许 run.def/getin 覆盖。默认值本身不代表 Mars production 值;Mars 值通常来自 start.nc/startfi.nc 的 controle 数组或 Mars physics 默认。
| 变量 | 默认值 | getin 键 |
写入模块 | 说明 |
|---|---|---|---|---|
preff |
101325. |
preff |
comvert_mod |
参考地表压力,单位 Pa。 |
pa |
preff/2. |
pa |
comvert_mod |
hybrid 坐标转纯 pressure 的参考压力。 |
g |
9.80665 |
g |
comconst_mod |
重力加速度。 |
molmass |
28.9644 |
molmass |
comconst_mod |
源码注释写作大气摩尔质量;cpp 公式用 8.3145/molmass/kappa*1000.。 |
kappa |
2./7. |
kappa |
comconst_mod |
r/cpp。 |
cpp |
8.3145/molmass/kappa*1000. |
cpp |
comconst_mod |
定压比热。 |
rad |
6371229. |
radius |
comconst_mod |
行星半径,单位 m。 |
daysec |
86400. |
daysec |
comconst_mod |
标准日长度,单位 s。 |
daylen |
1. |
daylen |
comconst_mod |
solar day,以 standard day 为单位。 |
year_day |
365.25 |
year_day |
comconst_mod |
每年 standard day 数。 |
omeg |
2*pi/daysec*(1/daylen+1/year_day) |
omeg |
comconst_mod |
行星自转角速度,单位 rad/s。 |
ihf |
0. |
ihf |
comconst_mod |
giant planet 内禀热通量,源码注释限定 planet_type="giant"。 |
dynetat0 的 restart 常数路径
gcm.F90 在读取 run.def/conf_gcm、初始化 tracer 后,如果 read_start 为真,会调用 dynetat0("start.nc",...)。dynetat0 打开 start.nc,读取 controle 数组;当 planet_type 为 generic 或 mars 时,将文件识别为 planeto-like start,使用 idecal=4:
tab_cntrl(idecal+1) -> rad
tab_cntrl(idecal+2) -> omeg
tab_cntrl(idecal+3) -> g
tab_cntrl(idecal+4) -> cpp
tab_cntrl(idecal+5) -> kappa
tab_cntrl(idecal+6) -> daysec
tab_cntrl(idecal+7) -> dtvr
tab_cntrl(idecal+13) -> pa
tab_cntrl(idecal+14) -> preff
dynredem 写 restart 时使用同一组偏移把这些值写回 controle。这意味着 start/restart 文件是 Mars/Generic restart 运行的常数快照,不只是场变量容器。
iniconst 派生逻辑
iniconst 本身不读取 rad/g/omeg/daysec,也不调用 conf_planete。它假定这些值已经来自 dynetat0 或 conf_planete/iniacademic,然后做以下派生:
- 从
dimensions.h/paramet.h写入维度状态:im=iim,jm=jjm,lllm=llm,imp1=iim,jmp1=jjm+1,lllmm1=llm-1,lllmp1=llm+1。 - 用当前
dtvr和control_mod: iphysiq计算dtphys=iphysiq*dtvr。 - 计算
unsim=1./iim和pi=2.*asin(1.)。 - 用
r=cpp*kappa派生气体常数;若cpp/kappa来自 restart 或conf_planete覆盖,这里只做一致的乘积。 - 按
planet_type设置垂直离散默认:earth默认disvert_type=1,其他行星默认disvert_type=2。 - 允许
getin('disvert_type',...)覆盖默认值。 - 设置
pressure_exner = disvert_type == 1,再允许getin('pressure_exner',...)覆盖。 disvert_type==1调disvert();disvert_type==2调disvert_noterre;其他值调用abort_gcm。
这也是 Mars/Generic 默认进入 disvert_noterre 的原因:默认分支来自 planet_type,但最终仍可被 run.def 覆盖。
主流程顺序
COMMON 串行 gcm.F90 和并行 gcm.F 的顺序一致:
parse_args()处理 runtime option。conf_gcm(99,.TRUE.)读取run.def,其中day_step默认240,iphysiq/iperiod/nsplit_phys等也在这里确定。- 若
read_start,调用dynetat0("start.nc",...),常数来自 restartcontrole。 - 若
.not.read_start,调用iniacademic,常数来自conf_planete/getin。 - 入口检查
day_step必须能整除iperiod和iphysiq。 - 计算
zdtvr=daysec/REAL(day_step),若旧dtvr不同则打印警告,再执行dtvr=zdtvr。 - 物理开启的常规路径
iflag_phys==1下,设置dtvr=zdtvr并调用iniconst、inigeom、inifilr。 - 调用
inidissip,耗散时间步dtdiss后续由dissip_period*dtvr得到。 - 若 physics 开启,
iniphysiq(... daysec, day_ini, dtphys/nsplit_phys, ..., rad,g,r,cpp,iflag_phys)把 COMMON 常数传给 MARS physics 初始化入口。
Mars 侧 LMDZ.MARS\libf\dynphy_lonlat\phymars\nogcm.F90 也复用同一套 COMMON 初始化接口:它计算 zdtvr=daysec/REAL(day_step),在 iflag_phys==1 时调用 iniconst/inigeom/inifilr,然后把 daysec, dtphys/nsplit_phys, rad, g, r, cpp 传给 iniphysiq。这说明 Mars nogcm 是 COMMON 状态的使用位置,不是 COMMON 当前源文件。
Mars utility 边界
Mars newstart.F 和 tabfi.F 说明了另一个方向的常数同步:
newstart.F从动力controle中读取kappa等 COMMON 动力常数。newstart.F调 Mars physicstabfi,从start_archive.nc或startfi.nc的controle读取p_rad/p_omeg/p_g/p_mugaz/p_daysec/time。tabfi.F在nid==0时给 Mars 默认值:rad=3397200.,daysec=88775.,omeg=4*asin(1.)/daysec,g=3.72,mugaz=43.49,rcp=.256793。tabfi.F在读取文件时将tab_cntrl(tab0+5..11)映射为rad/omeg/g/mugaz/rcp/daysec/dtphys,并把p_omeg/p_g/p_mugaz/p_daysec/p_rad作为输出参数返回。
因此 Mars utility 和 physics 的 mugaz/rcp 状态属于 MARS physics 层;COMMON 动力层对应的是 cpp/kappa/r。两者数值要通过 start/startfi/archive 文件和初始化调用保持一致,但模块名和职责不同。
使用点
| 状态 | 进入位置 | 后续影响 |
|---|---|---|
daysec |
dynetat0 或 conf_planete |
dtvr=daysec/day_step,日期换算,iniphysiq,Mars physics time_phylmdz_mod。 |
dtvr |
restart 读入后被 gcm/nogcm 重算 |
leapfrog 倾向积分、tracer advection CFL、inidissip、history 时间轴。 |
dtphys |
iniconst: iphysiq*dtvr |
addfi/top_bound 的 physics 步长,传入 iniphysiq 时再除以 nsplit_phys。 |
rad |
restart 或 conf_planete |
inigeom 几何尺度、Coriolis/面积相关计算、iniphysiq。 |
g |
restart 或 conf_planete |
动力压力/位势、Mars physics、archive/header。 |
cpp/kappa/r |
restart 或 conf_planete,r 由 iniconst 派生 |
Exner/potential temperature、能量项、Mars physics 初始化参数。 |
omeg |
restart 或 conf_planete |
Coriolis、restart/archive 元数据。 |
preff/pa |
restart 或 conf_planete |
hybrid vertical coordinate pressure reference。 |
复现检查清单
复现 Mars/Generic 常数初始化时按这个顺序检查:
run.def中的planet_type,read_start,day_step,iphysiq,nsplit_phys,disvert_type,pressure_exner。- 若
read_start=y,检查start.nc:controle的 planeto-like 偏移:rad/omeg/g/cpp/kappa/daysec/dtvr/pa/preff。 - 若无 start,检查
conf_planete支持的getin键,尤其radius/g/molmass/kappa/cpp/daysec/daylen/year_day/omeg。 - 确认
gcm或 Marsnogcm是否把dtvr重设为daysec/day_step。 - 确认
iniconst后dtphys=iphysiq*dtvr,而iniphysiq收到的是dtphys/nsplit_phys。 - 对 Mars utility,确认
startfi.nc/start_archive.nc:controle和tabfi的rad/omeg/g/mugaz/rcp/daysec/dtphys。
风险和待确认
molmass在 COMMON 注释中写作 molar mass,comconst_mod注释标为(g/mol),而conf_planete的cpp=8.3145/molmass/kappa*1000.体现了单位换算。本文只记录源码行为,不替源码统一单位命名。conf_planete的默认值是 Earth-like;Mars production 运行不应仅凭这些默认值判断火星常数。- 具体算例若同时修改
run.def、start.nc和startfi.nc,需要以实际运行文件确认动力层cpp/kappa/r与 Mars physics 层mugaz/rcp是否一致。