comcstfi_h.F90
路径
LMDZ.MARS\libf\phymars\comcstfi_h.F90
所属目录/模块
libf\phymars
文件定位
comcstfi_h.F90 定义 comcstfi_h,是 phymars 中集中保存行星半径、重力、气体常数、比热、平均摩尔质量和自转角速度的共享物理常数模块。它本身不读取配置文件,也不做物理计算;主要职责是在初始化阶段接收上游给定的常数,并让辐射、沉降、边界层、云微物理、坡面和诊断等下游方案通过 use comcstfi_h 读取同一套常数。
这个模块的复现意义在于:很多物理公式只在下游文件中出现,但公式中的 g、r、cpp、rcp、rad、pi 等都来自这里。若初始化路径不同,常数来源也可能不同,例如 GCM 主路径由 phys_state_var_init_mod 调用 init_comcstfi_h 初始化一部分常数,而 tabfi.F 和 1D 初始化路径会直接写入 rad/g/mugaz/omeg/rcp 等模块变量。
定义的符号
| 符号 |
类型 |
行号 |
作用 |
comcstfi_h |
module |
1 |
保存 phymars 共享物理常数 |
pi |
real parameter |
4 |
圆周率,按 acos(-1.d0) 计算 |
rad |
real save |
5 |
行星半径,单位 m |
g |
real save |
6 |
重力加速度,单位 m/s2 |
r |
real save |
8 |
大气比气体常数 |
cpp |
real save |
9 |
大气定压比热 |
rcp |
real save |
10 |
r/cpp |
mugaz |
real save |
12 |
大气平均摩尔质量,注释单位 g/mol |
omeg |
real save |
13 |
行星自转角速度,单位 rad/s |
init_comcstfi_h |
subroutine |
20 |
从调用方参数初始化 rad、cpp、g、r,并计算 rcp |
依赖的模块
| use 模块 |
only 列表 |
用途 |
待确认 |
| 无 |
- |
本模块没有 use 依赖 |
- |
调用的关键例程
| 被调用例程 |
所在模块/文件 |
调用位置 |
作用 |
| 无 |
- |
- |
本模块只赋值共享常数,不调用其他例程 |
输入
| 输入 |
来源 |
类型/维度 |
单位 |
含义 |
prad |
phys_state_var_init 等调用方 |
real scalar |
m |
初始化 rad |
pcpp |
phys_state_var_init 等调用方 |
real scalar |
J/kg/K,推断 |
初始化 cpp |
pg |
phys_state_var_init 等调用方 |
real scalar |
m/s2 |
初始化 g |
pr |
phys_state_var_init 等调用方 |
real scalar |
J/kg/K,推断 |
初始化 r |
输出
| 输出 |
去向 |
类型/维度 |
单位 |
含义 |
rad |
全局模块状态 |
real save |
m |
行星半径,供几何、坡面、I/O 等读取 |
g |
全局模块状态 |
real save |
m/s2 |
重力加速度,供层质量、沉降、拖曳、PBL 等读取 |
r |
全局模块状态 |
real save |
J/kg/K,推断 |
比气体常数,供密度、热力学和输送计算读取 |
cpp |
全局模块状态 |
real save |
J/kg/K,推断 |
定压比热,供辐射、云、热通量和加热率换算读取 |
rcp |
全局模块状态 |
real save |
- |
r/cpp,供 Exner/位温相关计算读取 |
mugaz |
全局模块状态 |
real save |
g/mol |
平均摩尔质量;不由 init_comcstfi_h 赋值 |
omeg |
全局模块状态 |
real save |
rad/s |
自转角速度;不由 init_comcstfi_h 赋值 |
共享状态与副作用
rad、g、r、cpp、rcp、mugaz、omeg 都是 SAVE 模块变量。
- 源码用 OpenMP
THREADPRIVATE 分三组声明:rad/g、r/cpp/rcp、mugaz/omeg。并行复现时需要确认每个线程已获得正确副本。
init_comcstfi_h 只写 rad、cpp、g、r 和 rcp;它不写 mugaz 或 omeg。
tabfi.F 在读取或默认生成 tab_cntrl 时会直接写 rad、omeg、g、mugaz、rcp,并把这些值回传到 p_rad/p_omeg/p_g/p_mugaz/p_daysec。
- 1D
dyn1d/init_testphys1d_mod.F90 也直接写 rad、omeg、g、mugaz、rcp、r、cpp。
- 本模块没有文件 I/O、没有分配内存、没有显式结束/释放例程。
核心逻辑
- 编译/加载模块时,
pi 作为 parameter 由 acos(-1.d0) 固定。
- 模块暴露一组
SAVE 常数变量,供下游 use comcstfi_h, only: ... 读取。
- GCM 初始化路径中,
phys_state_var_init_mod.F90 行 46 导入 init_comcstfi_h,行 118 调用 init_comcstfi_h(prad,pcpp,pg,pr)。
init_comcstfi_h 将 prad、pcpp、pg、pr 分别赋给 rad、cpp、g、r。
init_comcstfi_h 最后计算 rcp=r/cpp,保证 rcp 与本次传入的 r 和 cpp 一致。
mugaz 和 omeg 必须由其他初始化路径赋值;源码证据包括 tabfi.F 行 114-119、182-186,以及 1D 初始化行 133-140。
伪代码
module comcstfi_h:
define pi = acos(-1)
keep SAVE constants:
rad, g, r, cpp, rcp, mugaz, omeg
mark these constants THREADPRIVATE
init_comcstfi_h(prad, pcpp, pg, pr):
rad = prad
cpp = pcpp
g = pg
r = pr
rcp = r / cpp
参与的主题流程
| 主题 |
参与方式 |
| 物理初始化 |
phys_state_var_init 调用 init_comcstfi_h,先设置共享常数,再初始化时间、坡面、几何、土壤、辐射等模块 |
| 初始状态 / restart 控制量 |
tabfi 可从 tab_cntrl 读取并写回 rad/omeg/g/mugaz/rcp/daysec/dtphys;phyetat0_mod 用 tabfi 处理 startfi.nc 或学术初始化 |
| 1D testphys |
dyn1d/init_testphys1d_mod.F90 直接设置 Mars 默认常数,并由 r=8.314511*1000./mugaz、cpp=r/rcp 补全热力学常数 |
| 辐射和云微物理 |
callradite_mod、co2cloud_mod、improvedclouds_mod、improvedco2clouds_mod 等读取 g、cpp、pi |
| 沉降 / 尘埃 / tracer 质量 |
callsedim_mod、newsedim_mod、dust_coagulation_mod、tracer_mass_fixer_dyn_mod 等读取 g、r、pi |
| 边界层 / 对流 / 重力波 |
vdifc_mod、pbl_parameters_mod、calltherm_interface_mod、calldrag_noro_mod、nonoro_gwd_* 等读取 g/r/cpp/rcp/pi |
写法特点
- 这是自由格式
.F90 模块,但变量命名保留 LMD 历史公共常数风格。
- 模块注释写明“理想情况下所有 module variables 应该 protected”,但当前源码没有使用
PROTECTED 属性;任何 use comcstfi_h 且未限制写保护的代码理论上可写这些变量。
pi 是唯一编译期常量;其余常数依赖初始化顺序。
mugaz 和 omeg 与 rad/g 同属本模块状态,但不在 init_comcstfi_h 中初始化,这是复现时最容易混淆的点。
复现要点
- 复现 GCM 主路径时,应确认
phys_state_var_init 传入的 prad/pg/pr/pcpp 来源,并确认 tabfi 或其他路径是否随后覆盖了 rad/g/rcp/mugaz/omeg。
rcp 既可能由 init_comcstfi_h 计算,也可能由 tabfi 从 tab_cntrl(tab0+9) 读取;两者不一致会影响位温、Exner 因子和垂直插值相关计算。
mugaz 不由 init_comcstfi_h 赋值,但 dust_coagulation_mod、iniwrite.F、phyetat0_mod 等会读取它;需要确认启动文件或 1D 初始化已设置该值。
- OpenMP
THREADPRIVATE 意味着共享常数在多线程环境中不是普通全局单例;复现线程初始化问题时,应检查线程私有副本是否完成同步或初始化。
tabfi.F 的默认 Mars 常数为 rad=3397200.、daysec=88775.、g=3.72、mugaz=43.49、rcp=.256793,但这些默认值只代表 tabfi 的 nid=0/默认路径,不应覆盖所有实验配置。
待确认
- GCM 主路径中
mugaz 和 omeg 是否总是在 phys_state_var_init 后由 tabfi 或等价流程赋值,需结合完整初始化调用顺序确认。
THREADPRIVATE 变量在当前并行框架下的拷贝/广播策略未在本文件内体现,需要查看 OpenMP 初始化约定。
相关页面