dimphy.F90
路径
LMDZ.MARS\libf\phymars\dimphy.F90
所属目录 / 模块
libf\phymars
文件定位
dimphy.F90 定义 dimphy 模块,用来保存物理列数和垂直层数这组小型共享维度状态。它不是辐射维度模块,也不保存全局物理网格大小;源码注释明确把 klon 定义为当前 OpenMP 子网格上的 atmospheric columns,klev 定义为 atmospheric layers。
这些变量被下游例程当作数组形状和维度分支依据使用,例如 check_fields.F90 用 klon/klev 声明温度、风、压力和 tracer 检查数组,iostart.F90 用 klon/klev/klevp1 读写 restart 字段,xios_output_mod.F90 用 klon 校验 XIOS 输出场第一维。
定义的符号
| 符号 |
类型 |
行号 |
作用 |
dimphy |
module |
1 |
保存本地物理网格维度的模块。 |
klon |
saved integer module variable |
3 |
当前 OpenMP 子网格的 atmospheric columns 数。 |
klev |
saved integer module variable |
4 |
atmospheric layers 数。 |
klevp1 |
saved integer module variable |
5 |
klev+1,常用于层界面维度。 |
klevm1 |
saved integer module variable |
6 |
klev-1。 |
Init_dimphy |
subroutine |
13 |
用输入的 klon0/klev0 初始化上述模块变量。 |
依赖的模块
| use 模块 |
only 列表 |
用途 |
待确认 |
| 无 |
- |
本文件不 use 其他模块。 |
- |
调用的关键例程
| 被调用例程 |
所在模块 / 文件 |
调用位置 |
作用 |
| 无 |
- |
- |
Init_dimphy 只写本模块变量,不调用外部例程。 |
输入
| 输入 |
来源 |
类型 / 维度 |
单位 |
含义 |
klon0 |
Init_dimphy 调用方 |
integer scalar |
网格列数 |
本地物理子网格列数;1D testphys 路径传入 1。 |
klev0 |
Init_dimphy 调用方 |
integer scalar |
层数 |
垂直层数;1D testphys 路径传入 nlayer。 |
输出
| 输出 |
去向 |
类型 / 维度 |
单位 |
含义 |
klon |
本模块共享状态 |
saved integer |
网格列数 |
供本地数组形状、聚合和输出校验使用。 |
klev |
本模块共享状态 |
saved integer |
层数 |
供垂直层数组形状和 restart 维度使用。 |
klevp1 |
本模块共享状态 |
saved integer |
层数 |
层界面维度,等于 klev+1。 |
klevm1 |
本模块共享状态 |
saved integer |
层数 |
内层循环或相邻层关系可能使用的 klev-1。 |
共享状态与副作用
klon、klev、klevp1、klevm1 都是 INTEGER,SAVE 模块变量。
- 第 9 行用
!$OMP THREADPRIVATE(klon,klev,klevp1,klevm1) 把这些变量声明为 OpenMP threadprivate 状态。
Init_dimphy 会改写这些模块变量,没有文件 I/O、NetCDF I/O、日志输出或错误中止。
Init_dimphy 的第 21-26 行只在 !$OMP MASTER 区域内写 klev/klevp1/klevm1,随后执行 !$OMP BARRIER。
核心逻辑
- 调用方传入本地列数
klon0 和垂直层数 klev0。
Init_dimphy 先在当前执行线程上执行 klon=klon0。
- 进入
!$OMP MASTER 区域后,master 线程设置 klev=klev0。
- 同一 master 区域内派生出
klevp1=klev+1 和 klevm1=klev-1。
!$OMP BARRIER 让并行区内线程在离开初始化例程前同步。
伪代码
Init_dimphy(klon0, klev0):
klon = klon0
on OpenMP master thread:
klev = klev0
klevp1 = klev + 1
klevm1 = klev - 1
wait at OpenMP barrier
参与的主题流程
| 主题 |
参与方式 |
| 1D testphys 初始化 |
dyn1d/init_testphys1d_mod.F90 第 429 行调用 init_dimphy(1,nlayer),位于 init_geometry 之后、phys_state_var_init 和 conf_phys 之前。 |
| 场检查 / 调试保护 |
check_fields 用 klon/klev 声明并遍历 temp(klon,klev)、u/v(klon,klev)、pplev(klon,klev+1)、q(klon,klev,nqmx) 和 ps(klon)。 |
| restart I/O |
iostart.F90 用 klon 声明本地 restart 字段,用 klev/klevp1 定义 nlayer 和 nlayer_plus_1 NetCDF 维度,并按 field_size==klev 或 field_size==klevp1 选择变量维度。 |
| 全行星统计 |
planetwide_mod.F90 的 max/min/sum 包装例程用 klon 标注本地输入数组,必要时 gather 到 klon_glo 全局数组后再统计。 |
| XIOS 输出 |
xios_output_mod.F90 在 histwrite2d_xios 和 histwrite3d_xios 中校验输入场第一维等于 klon,再聚合并发送给 XIOS。 |
写法特点
- 文件很短,全部逻辑集中在 32 行内;没有
implicit none 放在模块级,只在 Init_dimphy 内声明。
kflev 相关定义和赋值仍保留为注释,当前源码没有启用。
THREADPRIVATE 使这些维度不是普通全局单例;并行复现实验需要关注初始化发生在哪个 OpenMP 上下文中。
复现要点
- 任何读取
klon/klev/klevp1/klevm1 的物理例程都依赖 Init_dimphy 已经先执行。
- 1D testphys 路径的明确初始化顺序是:
init_interface_dyn_phys、init_regular_lonlat、init_geometry、init_geometry_cell_area_for_outputs、init_dimphy(1,nlayer)、phys_state_var_init、ini_fillgeom、conf_phys。
- restart 和 XIOS 输出路径会直接用这些维度声明数组或做尺寸校验;若
klon 或 klev 未初始化,错误会表现为数组形状不符、NetCDF 维度错误或输出例程中止。
- 复现风险:
klev/klevp1/klevm1 在 OMP MASTER 区域内赋值,但这些变量又是 THREADPRIVATE;本文件没有 copyin、copyprivate 或显式逐线程赋值。多线程初始化语义需要结合调用上下文确认。
待确认
- 待确认:3D GCM 初始化路径中
Init_dimphy 的调用点未在本次 libf 范围搜索中找到;可能由其他初始化接口、预处理路径或外部耦合层处理。
- 待确认:
klevm1 的主要下游使用点未在本页的关键使用点中展开;本页只按本文件定义记录其派生关系。
相关页面