iniphysiq_mod.F90
路径
LMDZ.MARS\libf\dynphy_lonlat\phymars\iniphysiq_mod.F90
所属目录/模块
libf/dynphy_lonlat/phymars
文件定位
iniphysiq_mod 是 lon-lat GCM 物理初始化的主入口模块。它封装 iniphysiq 子程序,依次完成几何初始化、物理状态变量分配、几何三角函数缓存填充和物理配置读取,在动力核心启动后为物理包做好全部共享状态准备。
定义的符号
| 符号 |
类型 |
行号 |
作用 |
iniphysiq_mod |
module |
1 |
封装 iniphysiq 子程序的容器模块 |
iniphysiq |
subroutine |
5 |
物理初始化主入口:几何→状态变量→三角缓存→配置读取 |
依赖的模块
| use 模块 |
only 列表 |
用途 |
待确认 |
infotrac |
nqtot |
平流 tracer 总数 |
|
temps_mod |
day_ini, day_end, hour_ini |
运行起止日和初始时刻 |
|
inigeomphy_mod |
inigeomphy |
COMMON 几何初始化(网格分发、面积计算),见 common-dependencies。 |
|
comgeomfi_h |
ini_fillgeom |
填充 sinlat/coslat/sinlon/coslon 三角缓存 |
|
geometry_mod |
cell_area, longitude, latitude |
物理网格面积和经纬度 |
|
phys_state_var_init_mod |
phys_state_var_init |
分配并初始化 phymars 共享状态数组 |
|
mod_phys_lmdz_para |
klon_omp |
OpenMP 子网格列数 |
|
conf_phys_mod |
conf_phys |
读取物理配置(callphys.def 等) |
|
调用的关键例程
| 被调用例程 |
所在模块/文件 |
调用位置 |
作用 |
inigeomphy |
inigeomphy_mod |
行 57 |
初始化物理网格分发、面积、经纬度(跨 MPI 进程) |
phys_state_var_init |
phys_state_var_init_mod |
行 71 |
分配 phymars 共享状态数组、写入物理常数和轨道参数 |
ini_fillgeom |
comgeomfi_h |
行 75 |
从 latitude/longitude 填充 sinlat/coslat/sinlon/coslon 缓存 |
conf_phys |
conf_phys_mod |
行 78 |
读取 callphys.def/run.def 物理配置键并写入共享状态 |
输入
| 输入 |
来源 |
类型/维度 |
单位 |
含义 |
ii |
动力核心 |
INTEGER |
— |
经度方向格点数 |
jj |
动力核心 |
INTEGER |
— |
纬度方向格点数 |
nlayer |
动力核心 |
INTEGER |
— |
垂直层数 |
nbp |
MPI 分发 |
INTEGER |
— |
当前 MPI 进程物理列数 |
communicator |
MPI |
INTEGER |
— |
MPI 通信器 |
rlatudyn |
动力核心 |
REAL(jj+1) |
rad |
U 点纬度 |
rlatvdyn |
动力核心 |
REAL(jj) |
rad |
V 点纬度 |
rlonudyn |
动力核心 |
REAL(ii+1) |
rad |
U 点经度 |
rlonvdyn |
动力核心 |
REAL(ii+1) |
rad |
V 点经度 |
airedyn |
动力核心 |
REAL(ii+1,jj+1) |
m² |
动力网格面积 |
cudyn |
动力核心 |
REAL((ii+1)*(jj+1)) |
— |
U 协变/反变转换系数 |
cvdyn |
动力核心 |
REAL((ii+1)*jj) |
— |
V 协变/反变转换系数 |
prad |
常量 |
REAL |
m |
行星半径 |
pg |
常量 |
REAL |
m/s² |
重力加速度 |
pr |
常量 |
REAL |
J/(kg·K) |
折合气体常数 R/μ |
pcpp |
常量 |
REAL |
J/(kg·K) |
定压比热 |
punjours |
常量 |
REAL |
s |
一个标准日长度 |
pdayref |
运行配置 |
INTEGER |
day |
参考日 |
ptimestep |
运行配置 |
REAL |
s |
物理时间步长 |
iflag_phys |
运行配置 |
INTEGER |
— |
物理调用类型标志 |
输出
| 输出 |
去向 |
类型/维度 |
单位 |
含义 |
| 共享状态 |
geometry_mod/comgeomfi_h/phymars 各模块 |
— |
— |
全部物理初始化状态写入各共享模块 |
共享状态与副作用
- 写共享状态:
inigeomphy 分配 geometry_mod 网格变量;phys_state_var_init 分配 phymars 多个共享模块数组;ini_fillgeom 填充 comgeomfi_h 三角缓存;conf_phys 写入 callkeys_mod 等多个配置模块。
- INCLUDE:
iniprint.h(输出单元号 lunout)。
- OpenMP:行 69
$OMP PARALLEL COPYIN(day_ini,day_end,hour_ini) 进入并行区,temps_mod 的 THREADPRIVATE 变量通过 COPYIN 广播到所有线程。行 80 $OMP END PARALLEL 结束。
- 无文件 I/O:本身不读写文件,配置读取由
conf_phys 完成。
核心逻辑
- 通用几何初始化:调用
inigeomphy 把动力核心的网格维度、经纬度、面积和转换系数分发到物理包,建立 geometry_mod 中的 cell_area/longitude/latitude。
- OpenMP 并行区进入:开启并行区,COPYIN
temps_mod 的时间变量。
- 物理状态变量初始化:调用
phys_state_var_init,传入 klon_omp/nlayer/nqtot 和时间/物理常数,分配 phymars 所有共享状态数组(地表、土壤、tracer、云、辐射等)。
- 几何三角缓存填充:调用
ini_fillgeom,从 latitude/longitude 计算并缓存 sinlat/coslat/sinlon/coslon。
- 物理配置读取:调用
conf_phys 读取 callphys.def 等配置键,写入各物理开关模块。
- OpenMP 并行区结束。
伪代码
SUBROUTINE iniphysiq(网格维度, MPI, 经纬度, 面积, 转换系数, 物理常数, 时间步长, ...)
! 第一阶段:通用几何初始化(跨 MPI)
CALL inigeomphy(ii, jj, nlayer, nbp, communicator, 经纬度, 面积, cu/cv)
! 第二阶段:OpenMP 并行区
!$OMP PARALLEL COPYIN(day_ini, day_end, hour_ini)
CALL phys_state_var_init(klon_omp, nlayer, nqtot, 时间, 物理常数)
CALL ini_fillgeom(klon_omp, latitude, longitude, cell_area)
CALL conf_phys(klon_omp, nlayer, nqtot)
!$OMP END PARALLEL
END SUBROUTINE
参与的主题流程
| 主题 |
参与方式 |
| 物理初始化 |
GCM 启动后为物理包分配全部共享状态、填充几何缓存和读取配置 |
| 独立物理模式 (nogcm) |
nogcm.F90 直接调用 iniphysiq 初始化 1D 列模型物理状态 |
| 归档输出 |
start2archive.F 调用 iniphysiq 确保物理网格已初始化后再转换归档 |
写法特点
- 模块封装:使用
MODULE iniphysiq_mod ... CONTAINS ... END MODULE 现代 Fortran 90 模块结构,便于 USE iniphysiq_mod, ONLY: iniphysiq 精确导入。
- OpenMP COPYIN:
temps_mod 的 day_ini/day_end/hour_ini 是 THREADPRIVATE 变量,通过 COPYIN 在并行区入口广播主线程值到所有工作线程。
- 调用顺序强约束:
inigeomphy → phys_state_var_init → ini_fillgeom → conf_phys 顺序不可调换,后续依赖前序分配/填充的共享状态。
- 注释标记:行 76 的 TODO 注释建议将
comgeomfi_h 内容迁移到 geometry_mod,当前尚未实现。
复现要点
- 需要动力核心已完成网格初始化并提供
rlatudyn/rlatvdyn/rlonudyn/rlonvdyn/airedyn/cudyn/cvdyn。
- 需要 MPI 环境已初始化,
communicator 有效。
inigeomphy 内部分配 geometry_mod 数组,phys_state_var_init 内部依赖 klon_omp 已被 mod_phys_lmdz_para 设定。
- 1D
init_testphys1d_mod.F90 行 422 注释说明它模拟 iniphysiq 的初始化链。
待确认
iflag_phys 参数在 iniphysiq 内部未被消费,仅作为输入声明——是否应由 conf_phys 或下游使用。
pdayref 和 ptimestep 在 iniphysiq 内部也未直接使用(通过 temps_mod 传递),是否存在冗余参数传递。
punjours 对应火星日长度(daysec),传入 phys_state_var_init 后写入 time_phylmdz_mod。
相关页面