dimphy.F90

快速理解

它做什么: 保存物理列数 klon 和垂直层数 klev(及 klevp1/klevm1)的小型共享维度模块。

基本过程: Init_dimphy(klon0,klev0) 赋值 → 下游例程用作数组形状和维度分支依据。

关键结果: 被 check_fields/iostart/xios_output_mod 等用作维度声明依据。

路径

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。

共享状态与副作用

核心逻辑

  1. 调用方传入本地列数 klon0 和垂直层数 klev0。
  2. Init_dimphy 先在当前执行线程上执行 klon=klon0。
  3. 进入 !$OMP MASTER 区域后,master 线程设置 klev=klev0。
  4. 同一 master 区域内派生出 klevp1=klev+1 和 klevm1=klev-1。
  5. !$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。

写法特点

复现要点

待确认

相关页面