iniwrite.F

快速理解

它做什么: 初始化 diagfi.nc 固定结构(维度/坐标/控制参数/土壤深度/网格面积/位势)。被 writediagfi 首次调用时触发。

基本过程: 建立坐标轴和维度 → 写入垂直层坐标/控制参数/土壤深度/网格面积/phis → 后续 writediagfi 复用维度。

关键结果: diagfi.nc 的固定头结构;也服务 writediagmicrofi。

路径

LMDZ.MARS\libf\phymars\iniwrite.F

所属目录 / 模块

libf\phymars

文件定位

iniwrite.F 定义外部子程序 iniwrite,用于初始化传统物理诊断 NetCDF 文件的固定结构。源码注释说明其目标是初始化 diagfi.nc:写入维度,以及随时间不变的字段,例如地表位势和网格面积。实际调用点还包括 writediagmicrofi.F,因此同一初始化例程也服务微物理诊断文件。

它不负责逐时间步追加诊断变量;后续变量由 writediagfi.F 或 writediagmicrofi.F 使用 def_var 等路径定义并写入。iniwrite 的职责是先建立坐标轴、垂直层坐标、控制参数、土壤深度、网格面积和地表位势,使后续诊断变量可以复用这些维度。

定义的符号

符号 类型 行号 作用
iniwrite subroutine 1 初始化已打开 NetCDF 诊断文件的维度、坐标变量和固定二维/一维字段

依赖的模块

use 模块 only 列表 用途 待确认
comsoil_h mlayer, nsoilmx 定义 subsurface_layers 维度,并写入土壤层中点深度 soildepth -
comcstfi_h g, mugaz, omeg, rad, rcp, pi 把行星常数用于诊断打印;pi 用于经纬度弧度转角度 -
vertical_layers_mod ap, bp, aps, bps, pseudoalt 写入垂直坐标:伪高度、hybrid pressure/sigma midlayer 与 interlayer 系数 -
time_phylmdz_mod hour_ini, daysec, dtphys 诊断打印中输出时间常数;hour_ini 在当前可执行语句中未使用 -
regular_lonlat_mod lon_reg, lat_reg 写入规则经纬度坐标;3D 情况下扩展一个冗余经度点 -
mod_grid_phy_lmdz nbp_lon, nbp_lat, nbp_lev 定义经度、纬度、垂直层维度,并判断 1D/3D 网格 -
phyetat0_mod tab_cntrl_mod 写入 controle 控制参数数组,并用其长度定义 index 维度 -
netcdf.inc include file 提供传统 NetCDF Fortran NF_* 常量和接口 -

调用的关键例程

被调用例程 所在模块 / 文件 调用位置 作用
NF_REDEF / NF_ENDDEF NetCDF Fortran 接口 多处 在定义维度或变量前后切换 NetCDF define mode
NF_DEF_DIM NetCDF Fortran 接口 113-124 定义 index、latitude、longitude、interlayer、altitude、subsurface_layers
NF_DEF_VAR NetCDF Fortran 接口 131-366 定义 controle、经纬度、altitude、soildepth、aire、phisinit 等变量
NF_PUT_ATT_TEXT NetCDF Fortran 接口 多处 写入 title、long_name、units、positive 等文本属性
NF_PUT_VAR_REAL / NF_PUT_VAR_DOUBLE NetCDF Fortran 接口 多处 按 NC_DOUBLE 编译开关写入单精度或双精度变量值
def_var def_var.F90 244, 252, 260, 268 定义 aps、bps、ap、bp 垂直 hybrid 坐标变量

上游调用点

调用方 调用位置 传入形态 作用
writediagfi.F 251 iniwrite(nid,day_ini,phis,area,nbp_lon+1,nbp_lat) 3D lon-lat 传统 diagfi 输出初始化
writediagfi.F 253 iniwrite(nid,day_ini,phisfi_glo(1),areafi_glo(1),1,1) 1D 情况下用单点面积和位势初始化
writediagmicrofi.F 257 iniwrite(nid,day_ini,phis,area,nbp_lon+1,nbp_lat) 3D 微物理诊断输出初始化
writediagmicrofi.F 259 iniwrite(nid,day_ini,phisfi_glo(1),areafi_glo(1),1,1) 1D 微物理诊断输出初始化

输入

输入 来源 类型 / 维度 单位 含义
nid 调用方已创建或打开的 NetCDF 文件 integer - NetCDF file ID;本例程在这个文件内定义维度和变量
idayref 调用方传入,通常为 day_ini INTEGER*4 sol / model day 初始日期;当前源码只在末尾诊断打印中使用
phis 调用方传入 real(nbplon,nbp_lat) geopotential 地表位势,写入 phisinit
area 调用方传入 real(nbplon,nbp_lat) m2 网格面积,写入 aire
nbplon 调用方传入 integer grid points phis 和 area 第一维长度;3D 通常为 nbp_lon+1,1D 为 1
nbplat 调用方传入 integer grid points 接口参数;当前源码声明后未直接使用,纬度维度使用模块变量 nbp_lat
tab_cntrl_mod phyetat0_mod real array mixed 控制参数数组,长度定义 index 维度并写入 controle
lon_reg, lat_reg regular_lonlat_mod real arrays radians 规则经纬度坐标,写出前乘 180/pi
ap, bp, aps, bps, pseudoalt vertical_layers_mod real arrays Pa / sigma / km 垂直 hybrid 坐标和伪高度
mlayer, nsoilmx comsoil_h real array / integer m / layers 土壤层中点深度和土壤层数

输出

输出 去向 类型 / 维度 单位 含义
index NetCDF dimension SIZE(tab_cntrl_mod) - controle 控制参数轴
latitude NetCDF dimension + variable nbp_lat degrees_north 纬度坐标
longitude NetCDF dimension + variable 1 或 nbp_lon+1 degrees_east 经度坐标;3D 写入冗余闭合经度点
interlayer NetCDF dimension nbp_lev+1 - 层间界面维度
altitude NetCDF dimension + variable nbp_lev km 伪高度坐标,属性 positive="up"
subsurface_layers NetCDF dimension nsoilmx - 土壤层维度
controle NetCDF variable index mixed 物理控制参数数组
aps, bps, ap, bp NetCDF variables altitude 或 interlayer Pa / sigma hybrid 垂直坐标系数
soildepth NetCDF variable subsurface_layers m 土壤中层深度,属性 positive="down"
aire NetCDF variable (longitude, latitude) source value 网格面积
phisinit NetCDF variable (longitude, latitude) source value 地表位势

共享状态与副作用

核心逻辑

  1. 根据 nbp_lon*nbp_lat==1 判断是否为 1D 模式;1D 分配单点 lon_reg_ext(1),3D 分配 lon_reg_ext(nbp_lon+1)。
  2. 进入 NetCDF define mode,定义 index、latitude、longitude、interlayer、altitude 和 subsurface_layers 维度;经度维度在 1D 时为 1,在 3D 时为 nbp_lon+1。
  3. 定义并写入 controle,数据来源是 tab_cntrl_mod,变量类型由 NC_DOUBLE 条件编译决定。
  4. 定义并写入 latitude,把 lat_reg 从弧度转换为角度,属性包含 units="degrees_north" 和 long_name="North latitude"。
  5. 填充 lon_reg_ext:先复制 lon_reg(1:nbp_lon),3D 时把最后一点设为 -lon_reg_ext(1),源码注释说明这是因为 lon_reg 从 -180 开始,所以补上 180 的冗余点。
  6. 定义并写入 longitude,把 lon_reg_ext 从弧度转换为角度,属性包含 units="degrees_east"。
  7. 定义并写入 altitude,数据来源是 pseudoalt,单位 km,正方向向上。
  8. 通过 def_var 定义 aps、bps、ap、bp,随后分别写入 vertical_layers_mod 中的同名数组。
  9. 定义并写入 soildepth,数据来源是 mlayer,维度是 subsurface_layers。
  10. 用 (longitude, latitude) 维度定义并写入 aire 和 phisinit。
  11. 打印初始化摘要并返回。

伪代码

subroutine iniwrite(nid, idayref, phis, area, nbplon, nbplat)
  if nbp_lon * nbp_lat == 1:
    allocate lon_reg_ext(1)
  else:
    allocate lon_reg_ext(nbp_lon + 1)

  define dimensions:
    index = size(tab_cntrl_mod)
    latitude = nbp_lat
    longitude = 1 or nbp_lon + 1
    interlayer = nbp_lev + 1
    altitude = nbp_lev
    subsurface_layers = nsoilmx

  define and write controle(tab_cntrl_mod)
  define and write latitude(lat_reg * 180/pi)

  lon_reg_ext(1:nbp_lon) = lon_reg(1:nbp_lon)
  if 3D:
    lon_reg_ext(nbp_lon+1) = -lon_reg_ext(1)
  define and write longitude(lon_reg_ext * 180/pi)

  define and write altitude(pseudoalt)
  def_var/write aps, bps on altitude
  def_var/write ap, bp on interlayer
  define and write soildepth(mlayer)
  define and write aire(area)
  define and write phisinit(phis)

  print grid and constant summary
end

参与的主题流程

主题 参与方式
传统物理诊断输出 为 writediagfi.F 的 diagfi.nc 首次写入建立坐标轴、固定字段和控制参数
微物理诊断输出 被 writediagmicrofi.F 复用,用同一 NetCDF 初始化结构服务微物理诊断文件
垂直坐标 / z2sig 把 vertical_layers_mod 的 ap/bp/aps/bps/pseudoalt 写入诊断文件,供输出解释和后处理使用
土壤诊断上下文 虽然不写 diagsoil.nc,但会在常规诊断文件中写入 soildepth,与 comsoil_h 的土壤层定义保持一致

写法特点

复现要点

待确认

相关页面