iniconst / conf_planete 行星常数初始化链

源码:

本文只覆盖 COMMON 当前行星常数、时间步和垂直离散入口;Mars nogcm.F90/newstart.F/tabfi.F 只作为 MARS 侧使用位置和边界上下文,不视为 COMMON 源文件。

结论

COMMON 有两条行星常数进入动力核的路径:

  1. start.nc 的主流程:dynetat0("start.nc")controle/tab_cntrl 读取 rad/omeg/g/cpp/kappa/daysec/dtvr/pa/preff,写入 comconst_modcomvert_mod;随后 gcmdaysec/day_step 重算 dtvr,再调用 iniconst 派生 dtphys/r/pi/unsim 并建立垂直坐标。
  2. start.nc 或理想化场路径:iniacademicconf_planete,后者用 getin 读取行星半径、重力、气体常数、热容、自转和日长等常数;随后 iniacademic 计算 dtvr=daysec/day_step 并调用 iniconst

因此,conf_planete 不是常规 Mars restart 运行的唯一入口;它是理想化/academic 初始化路径的常数来源。常规 Mars/GCM restart 路径首先信任 start.nccontrole 元数据,再由 run.defday_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.nccontrole 数组或 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_typegenericmars 时,将文件识别为 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。它假定这些值已经来自 dynetat0conf_planete/iniacademic,然后做以下派生:

  1. dimensions.h/paramet.h 写入维度状态:im=iim, jm=jjm, lllm=llm, imp1=iim, jmp1=jjm+1, lllmm1=llm-1, lllmp1=llm+1
  2. 用当前 dtvrcontrol_mod: iphysiq 计算 dtphys=iphysiq*dtvr
  3. 计算 unsim=1./iimpi=2.*asin(1.)
  4. r=cpp*kappa 派生气体常数;若 cpp/kappa 来自 restart 或 conf_planete 覆盖,这里只做一致的乘积。
  5. planet_type 设置垂直离散默认:earth 默认 disvert_type=1,其他行星默认 disvert_type=2
  6. 允许 getin('disvert_type',...) 覆盖默认值。
  7. 设置 pressure_exner = disvert_type == 1,再允许 getin('pressure_exner',...) 覆盖。
  8. disvert_type==1disvert()disvert_type==2disvert_noterre;其他值调用 abort_gcm

这也是 Mars/Generic 默认进入 disvert_noterre 的原因:默认分支来自 planet_type,但最终仍可被 run.def 覆盖。

主流程顺序

COMMON 串行 gcm.F90 和并行 gcm.F 的顺序一致:

  1. parse_args() 处理 runtime option。
  2. conf_gcm(99,.TRUE.) 读取 run.def,其中 day_step 默认 240iphysiq/iperiod/nsplit_phys 等也在这里确定。
  3. read_start,调用 dynetat0("start.nc",...),常数来自 restart controle
  4. .not.read_start,调用 iniacademic,常数来自 conf_planete/getin
  5. 入口检查 day_step 必须能整除 iperiodiphysiq
  6. 计算 zdtvr=daysec/REAL(day_step),若旧 dtvr 不同则打印警告,再执行 dtvr=zdtvr
  7. 物理开启的常规路径 iflag_phys==1 下,设置 dtvr=zdtvr 并调用 iniconstinigeominifilr
  8. 调用 inidissip,耗散时间步 dtdiss 后续由 dissip_period*dtvr 得到。
  9. 若 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.Ftabfi.F 说明了另一个方向的常数同步:

因此 Mars utility 和 physics 的 mugaz/rcp 状态属于 MARS physics 层;COMMON 动力层对应的是 cpp/kappa/r。两者数值要通过 start/startfi/archive 文件和初始化调用保持一致,但模块名和职责不同。

使用点

状态 进入位置 后续影响
daysec dynetat0conf_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_planeteriniconst 派生 Exner/potential temperature、能量项、Mars physics 初始化参数。
omeg restart 或 conf_planete Coriolis、restart/archive 元数据。
preff/pa restart 或 conf_planete hybrid vertical coordinate pressure reference。

复现检查清单

复现 Mars/Generic 常数初始化时按这个顺序检查:

  1. run.def 中的 planet_type, read_start, day_step, iphysiq, nsplit_phys, disvert_type, pressure_exner
  2. read_start=y,检查 start.nc:controle 的 planeto-like 偏移:rad/omeg/g/cpp/kappa/daysec/dtvr/pa/preff
  3. 若无 start,检查 conf_planete 支持的 getin 键,尤其 radius/g/molmass/kappa/cpp/daysec/daylen/year_day/omeg
  4. 确认 gcm 或 Mars nogcm 是否把 dtvr 重设为 daysec/day_step
  5. 确认 iniconstdtphys=iphysiq*dtvr,而 iniphysiq 收到的是 dtphys/nsplit_phys
  6. 对 Mars utility,确认 startfi.nc/start_archive.nc:controletabfirad/omeg/g/mugaz/rcp/daysec/dtphys

风险和待确认

相关页面