paleoclimate_mod.F90
路径
LMDZ.MARS\libf\phymars\paleoclimate_mod.F90
所属目录 / 模块
libf/phymars
文件定位
paleoclimate_mod.F90 是古气候和 lag-layer 路径的共享状态模块。它本身不实现物理通量公式,而是集中保存 conf_phys.F 读取的古气候开关,以及按 (ngrid, nslope) 分配的地下 H2O/CO2 冰深度、地下水扩散系数和地下冰交互总通量缓存。后续初始化、重启读写、newstart 坡面重映射和 vdifc 水冰交换路径都通过这些 module 变量传递状态。
定义的符号
| 符号 |
类型 |
行号 |
作用 |
paleoclimate_mod |
module |
1 |
古气候共享状态模块 |
paleoclimate |
logical module variable |
13 |
是否启用古气候相关处理,由 conf_phys.F 读取 |
lag_layer |
logical module variable |
14 |
是否启用 lag-layer 路径,由 conf_phys.F 读取 |
include_waterbuoyancy |
logical module variable |
15 |
是否在水冰升华相关计算中考虑水汽浮力,由 conf_phys.F 读取 |
h2oice_depth |
allocatable module array |
18 |
最浅 H2O 冰层深度,维度 (ngrid, nslope),单位 m |
co2ice_depth |
allocatable module array |
19 |
最浅 CO2 冰层深度,维度 (ngrid, nslope),单位 m |
zdqsdif_ssi_tot |
allocatable module array |
20 |
地下冰交互总通量缓存,维度 (ngrid, nslope),单位 kg/m^2/s |
coef_ssdif |
allocatable module array |
21 |
地下水扩散系数,维度 (ngrid, nslope) |
ini_paleoclimate |
subroutine |
28 |
按 ngrid, nslope 分配四个古气候数组 |
end_paleoclimate |
subroutine |
44 |
释放已经分配的古气候数组 |
依赖的模块
| use 模块 |
only 列表 |
用途 |
待确认 |
| (无) |
- |
本文件没有 use 依赖 |
- |
调用的关键例程
| 被调用例程 |
所在模块 / 文件 |
调用位置 |
作用 |
| (无外部调用) |
- |
- |
本模块只分配/释放自身数组,不调用外部例程 |
输入
| 输入 |
来源 |
类型/维度 |
单位 |
含义 |
ngrid |
ini_paleoclimate 调用方 |
integer |
- |
物理网格点数 |
nslope |
ini_paleoclimate 调用方 |
integer |
- |
次网格坡面数量 |
paleoclimate |
conf_phys.F 读取 callphys.def |
logical |
- |
控制 paleoclimate 重启字段读写和相关路径 |
lag_layer |
conf_phys.F 读取 callphys.def |
logical |
- |
控制 vdifc 中 lag-layer 阻力/通量路径 |
include_waterbuoyancy |
conf_phys.F 读取 callphys.def |
logical |
- |
控制 PBL/交换系数中水汽浮力修正路径 |
输出
| 输出 |
去向 |
类型/维度 |
单位 |
含义 |
h2oice_depth(ngrid,nslope) |
phyetat0_mod、vdifc_mod、phyredem、newstart.F |
real array |
m |
最浅 H2O 冰层深度;默认缺省值见 phyetat0_mod |
co2ice_depth(ngrid,nslope) |
phyetat0_mod、phyredem、newstart.F |
real array |
m |
最浅 CO2 冰层深度 |
coef_ssdif(ngrid,nslope) |
phyetat0_mod、vdifc_mod、phyredem、newstart.F |
real array |
- |
地下水扩散系数;缺省值由 phyetat0_mod 设为 4.e-4 |
zdqsdif_ssi_tot(ngrid,nslope) |
vdifc_mod、诊断输出路径 |
real array |
kg/m^2/s |
vdifc 中累计的地下冰交互总通量 |
共享状态与副作用
- 三个 logical 开关和四个 allocatable 数组都声明为
!$OMP THREADPRIVATE,每个 OpenMP 线程持有独立副本。
ini_paleoclimate 只执行 allocate,不会给数组填充值;实际初始化依赖 phyetat0_mod.F90 的 restart 读取或缺省值路径,以及 1D/newstart 相关流程。
end_paleoclimate 对每个数组执行 allocated(...) 检查后释放,用于重新初始化不同网格/坡面尺寸之前清理旧形状。
zdqsdif_ssi_tot 在 vdifc_mod.F 中被清零并累计;本次看到的 restart 写出字段包括 h2oice_depth、co2ice_depth、coef_ssdif,不包括 zdqsdif_ssi_tot。
核心逻辑
conf_phys.F 读取 lag_layer、paleoclimate、include_waterbuoyancy 三个配置开关;其中 include_waterbuoyancy 为真但 paleoclimate 为假时会中止。
phys_state_var_init_mod.F90 在初始化物理状态变量时先调用 end_paleoclimate,再调用 ini_paleoclimate(ngrid, nslope) 分配数组。
phyetat0_mod.F90 在 paleoclimate 为真时从物理 start/restart 字段读取古气候数组;缺字段时给 h2oice_depth/co2ice_depth 等设置缺省值。
vdifc_mod.F 根据 lag_layer、h2oice_depth 和 coef_ssdif 计算地下冰相关阻力和水通量,并更新 zdqsdif_ssi_tot。
phyredem.F90 在 paleoclimate 为真时把持久 CO2 冰和古气候数组写入重启文件;newstart.F 在坡面数量改变时保存旧数组、重分配并重映射到新坡面布局。
伪代码
MODULE paleoclimate_mod
保存 paleoclimate、lag_layer、include_waterbuoyancy 三个线程私有开关
保存 h2oice_depth、co2ice_depth、zdqsdif_ssi_tot、coef_ssdif 四个线程私有数组
SUBROUTINE ini_paleoclimate(ngrid, nslope)
allocate h2oice_depth(ngrid, nslope)
allocate co2ice_depth(ngrid, nslope)
allocate zdqsdif_ssi_tot(ngrid, nslope)
allocate coef_ssdif(ngrid, nslope)
SUBROUTINE end_paleoclimate()
对每个数组:
if allocated then deallocate
参与的主题流程
| 主题 |
参与方式 |
| 古气候 / lag-layer |
保存 paleoclimate、lag_layer 开关和地下冰深度/扩散系数 |
| 水循环 |
vdifc 使用 h2oice_depth、coef_ssdif 和 zdqsdif_ssi_tot 计算地下冰与大气/霜之间的水交换 |
| CO2 循环 |
co2ice_depth 与 perennial_co2ice restart 路径一起描述古气候 CO2 冰状态 |
| 边界层交换 |
include_waterbuoyancy 被 pbl_parameters_mod 和 vdif_cd_mod 用于水汽浮力修正路径 |
写法特点
- 这是纯 module 状态容器,接口很小;文件级复现重点不在公式,而在生命周期和调用方初始化顺序。
- 所有共享变量均
THREADPRIVATE,多线程运行时要保证每个线程都经过正确初始化/广播路径。
- 分配例程没有防重复分配检查;调用方在重新分配前必须先走
end_paleoclimate。
已确认初始化与使用链
| 文件 |
位置 |
作用 |
conf_phys.F |
42-43, 433-465 |
读取 lag_layer、paleoclimate、include_waterbuoyancy,并强制 include_waterbuoyancy 依赖 paleoclimate |
phys_state_var_init_mod.F90 |
65, 195-197 |
调用 end_paleoclimate 和 ini_paleoclimate(ngrid,nslope) |
phyetat0_mod.F90 |
39, 902-953 |
按 paleoclimate 读取或缺省初始化 h2oice_depth、co2ice_depth、coef_ssdif |
phyredem.F90 |
208-212, 258, 389-392 |
按 paleoclimate 写出常年 CO2 冰和古气候地下冰 restart 字段 |
vdifc_mod.F |
36-37, 315, 1090-1192, 1268, 1402-1407 |
读取 lag-layer 状态并累计/输出地下冰交互通量 |
dynphy_lonlat/phymars/newstart.F |
62-63, 1852-1901 |
坡面数量变化时保存、重分配并重映射古气候数组 |
pbl_parameters_mod.F90 |
29, 204-208 |
使用 include_waterbuoyancy 控制水汽浮力修正 |
vdif_cd_mod.F90 |
23, 171-176 |
使用 include_waterbuoyancy 控制交换系数中的水汽浮力修正 |
复现要点
ini_paleoclimate 只分配不初始化;复现实验必须确认 phyetat0_mod、1D 初始化或 newstart 路径已经填好数组。
h2oice_depth 缺省可为 -999.,表示无地下冰;coef_ssdif 缺省值为 4.e-4,这些缺省来自 phyetat0_mod.F90 而不是本模块。
include_waterbuoyancy 不能单独启用;conf_phys.F 中明确要求它必须与 paleoclimate 同时使用。
- 改变
nslope 或 ngrid 形状前必须先释放旧数组,否则重复 allocate 会失败。
zdqsdif_ssi_tot 是运行时通量累计缓存,不应当当成 restart 持久初值使用。
待确认
phyredem.F90 中古气候地下冰字段未带 time 实参写出,而读端传入 indextime;需按 iostart 维度分派确认 restart 文件实际形状。
- 1D
testphys1d 路径是否还有额外古气候数组初始化入口,本页仅按当前读取到的 GCM/newstart 路径记录。
相关页面