ini_archive.F
路径
LMDZ.MARS\libf\dynphy_lonlat\phymars\ini_archive.F
所属目录/模块
libf/dynphy_lonlat/phymars
文件定位
ini_archive 是 start_archive NetCDF 文件的头部初始化写入例程。它在已打开的 NetCDF 文件中创建完整的维度定义、坐标变量、垂直层系数、土壤层深度、地表位势、热惯量、网格面积、协变/反变转换系数、次网格坡向分布和坡度定义等静态元数据,并把动力+物理运行控制参数写入 controle 一维数组变量。
定义的符号
| 符号 |
类型 |
行号 |
作用 |
ini_archive |
subroutine |
2 |
写入 start_archive NetCDF 文件头部:维度、坐标、垂直系数、地表场和控制参数 |
依赖的模块
| use 模块 |
only 列表 |
用途 |
待确认 |
comsoil_h |
nsoilmx, mlayer |
土壤层数和层中点深度 |
|
comvert_mod |
ap, bp, aps, bps, pa, preff, presnivs, pseudoalt |
混合 sigma 坐标系数、参考气压、伪高度 |
|
comconst_mod |
daysec, dtvr, rad, omeg, g, cpp, kappa, pi |
火星物理常数(日长、动力步长、半径、角速度、重力、比热、比热比、圆周率) |
|
logic_mod |
fxyhypb, ysinus |
zoom 函数类型选择标志 |
|
serre_mod |
clon, clat, grossismx, grossismy, dzoomx, dzoomy |
zoom 中心经纬、放大因子和扩展范围 |
|
ener_mod |
etot0, ptot0, ztot0, stot0, ang0 |
全局守恒控制变量(总能、总压、总涡度、总焓、角动量) |
|
comslope_mod |
nslope |
次网格坡面类别数 |
|
调用的关键例程
| 被调用例程 |
所在模块/文件 |
调用位置 |
作用 |
def_var |
phymars/def_var.F90 |
行 180 |
定义 Time 无限维度变量 |
NF_DEF_DIM |
NetCDF API |
行 160-171 |
定义 latitude/longitude/altitude/subsurface_layers/index/rlonu/rlatv/interlayer/Time/nslope/nslope_plus_1 维度 |
NF_DEF_VAR |
NetCDF API |
行 185-552 |
定义 controle/rlonu/rlatu/rlonv/rlatv/ap/bp/aps/bps/presnivs/latitude/longitude/altitude/soildepth/inertiedat/cu/cv/aire/phisinit/subslope_dist/def_slope 变量 |
NF_PUT_VAR_* |
NetCDF API |
多处 |
写入各变量数据(DOUBLE/REAL 编译期分派) |
NF_PUT_ATT_TEXT |
NetCDF API |
多处 |
写入 title/long_name/units/positive 文本属性 |
NF_REDEF/NF_ENDDEF |
NetCDF API |
多处 |
在定义模式和数据写入模式间切换 |
输入
| 输入 |
来源 |
类型/维度 |
单位 |
含义 |
nid |
调用方打开的 NetCDF 文件句柄 |
INTEGER |
— |
start_archive 文件的逻辑单元号 |
idayref |
调用方传入 |
INTEGER*4 |
day |
初始日参考值,写入 controle(4) |
phis |
调用方(start2archive) |
REAL(ip1jmp1) |
m²/s² |
地表位势,写入 phisinit 变量 |
ith |
调用方 |
REAL(ip1jmp1,nsoilmx) |
J·s⁻¹/²·m⁻²·K⁻¹ |
土壤热惯量,写入 inertiedat 变量 |
tab_cntrl_fi |
物理初始化路径 |
REAL(length=100) |
混合 |
物理控制参数表(前 50 个),复制到 tab_cntrl(51:100) |
def_slope |
调用方 |
REAL(nslope+1) |
— |
坡面类别定义边界值 |
subslope_dist |
调用方 |
REAL(ip1jmp1,nslope) |
— |
次网格坡面面积分数分布 |
输出
| 输出 |
去向 |
类型/维度 |
单位 |
含义 |
| NetCDF 文件 |
nid 指向的 start_archive 文件 |
— |
— |
完整的文件头部和静态元数据 |
共享状态与副作用
- 读共享状态:从
comvert_mod 读 ap/bp/aps/bps/pa/preff/presnivs/pseudoalt,从 comconst_mod 读物理常数,从 serre_mod 读 zoom 参数,从 ener_mod 读全局守恒变量,从 comsoil_h 读 nsoilmx/mlayer,从 comslope_mod 读 nslope,从 logic_mod 读 zoom 类型标志。
- INCLUDE 公共块:
dimensions.h(iim/jjm/llm/ip1jmp1/llmp1)、paramet.h、comgeom.h(rlonu/rlatv/rlatv/cu/cv/aire)、netcdf.inc(NetCDF 常量)。
- 文件写入:向
nid 对应的 NetCDF 文件写入所有定义和数据。
- 标准输出:行 562-565 PRINT 打印
iim/jjm/llm/idayref 和物理常数摘要。
- 局部赋值:行 87
pi = 2.*ASIN(1.) 覆写 comconst_mod::pi(副作用)。
核心逻辑
- 控制参数表填充:清零
tab_cntrl(100),填入 26 个动力控制参数(网格维度 iim/jjm/llm、idayref、火星物理常数 rad/omeg/g/cpp/kappa、日长 daysec、动力步长 dtvr、全局守恒量 etot0/ptot0/ztot0/stot0/ang0、气压 pa/preff、zoom 参数 clon/clat/grossismx/grossismy/dzoomx/dzoomy 和 fxyhypb/ysinus 标志),再把 tab_cntrl_fi(1:50) 复制到 tab_cntrl(51:100)。
- NetCDF 维度定义:创建 latitude(jjp1)、longitude(iip1)、altitude(llm)、subsurface_layers(nsoilmx)、index(100)、rlonu(iip1)、rlatv(jjm)、interlayer(llmp1)、Time(unlimited)、nslope、nslope_plus_1 共 11 个维度。
- 变量定义与写入:依次用 REDEF/ENDDEF 循环定义并写入:Time 变量(
def_var)、controle 控制参数(tab_cntrl)、四组经纬坐标(rlonu/rlatu/rlonv/rlatv)、六组垂直系数(ap/bp/aps/bps/presnivs/altitude)、土壤深度(soildepth/mlayer)、热惯量(inertiedat/ith)、协变/反变转换系数(cu/cv)、网格面积(aire)、地表位势(phisinit)、次网格坡面分布(subslope_dist)和坡度定义(def_slope)。所有浮点变量均通过 #ifdef NC_DOUBLE 分派 DOUBLE/REAL。
- latitude/longitude 可视化坐标:额外写入 degree 单位的 latitude 和 longitude 变量(带
degrees_north/degrees_east 属性),用于 GrADS/Ferret 后处理可视化。
伪代码
pi = 2 * asin(1)
! 清零并填充控制参数表
tab_cntrl(:) = 0
tab_cntrl(1:26) = [iim, jjm, llm, idayref, rad, omeg, g, cpp, kappa, daysec, dtvr,
etot0, ptot0, ztot0, stot0, ang0, pa, preff,
clon, clat, grossismx, grossismy, fxyhypb_flag, dzoomx, dzoomy, ysinus_flag]
tab_cntrl(51:100) = tab_cntrl_fi(1:50)
! 定义 NetCDF 维度 (11 个)
NF_DEF_DIM: latitude, longitude, altitude, subsurface_layers, index,
rlonu, rlatv, interlayer, Time(unlimited), nslope, nslope_plus_1
NF_ENDDEF
! 定义 Time 变量
def_var(nid, "Time", ...)
! 逐个定义并写入变量 (REDEF→DEF_VAR→ATT→ENDDEF→PUT_VAR 循环)
controle = tab_cntrl
rlonu/rlatu = 坐标
rlonv/rlatv = 坐标
ap/bp/aps/bps/presnivs = 垂直系数
latitude = rlatu * 180/pi (degrees_north)
longitude = rlonv * 180/pi (degrees_east)
altitude = pseudoalt (km, positive=up)
soildepth = mlayer (m, positive=down)
inertiedat = ith (J·s⁻¹/²·m⁻²·K⁻¹)
cu/cv = 协变/反变转换系数
aire = 网格面积
phisinit = phis (地表位势)
subslope_dist = subslope_dist (3D: lon×lat×nslope)
def_slope = def_slope (1D: nslope+1)
PRINT 物理常数摘要
RETURN
参与的主题流程
| 主题 |
参与方式 |
| 初始场 / restart 管理 |
为 start_archive 文件创建完整的 NetCDF 头部和静态元数据 |
| 归档输出 |
在 start2archive 流程中作为第一步,建立文件结构供后续 write_archive 追加时间步数据 |
写法特点
- 固定格式 Fortran:源码使用 F77 固定格式(列 6 续行符
&/*、列 1-5 标签),与 iniwrite.F 风格一致。
- 条件编译:
#ifdef NC_DOUBLE 在每对 DEF_VAR/PUT_VAR 处切换 DOUBLE/REAL 精度;#include "dimensions.h" 等提供网格维度。
- 硬编码常数:行 107
cpp = 43.49 覆写 comconst_mod::cpp(注释 "mars temporaire"),行 87 pi = 2.*ASIN(1.) 覆写 comconst_mod::pi。
- tab_cntrl 索引布局:前 26 个位置为动力控制参数(但编号 8 出现两次赋值,cpp 被 43.49 覆写),51-100 为物理参数副本。
- REDEF/ENDDEF 模式:每个变量写入遵循 REDEF → DEF_VAR → PUT_ATT → ENDDEF → PUT_VAR 的固定模式。
复现要点
- 需要已打开的 NetCDF 文件句柄(
NF_CREATE 由调用方 start2archive 完成)。
- 需要
comgeom.h 公共块中的 rlonu/rlatv/cu/cv/aire 已被动力初始化填充。
- 需要
comvert_mod 的垂直坐标系数已由 comvert 或等价初始化路径建立。
tab_cntrl_fi 的前 50 个元素来自物理初始化路径(tabfi → 物理参数表)。
#include "netcdf.inc" 提供 NF_GLOBAL/NF_UNLIMITED/NF_DOUBLE/NF_FLOAT 等常量。
待确认
- 行 106-107
tab_cntrl(8) 被赋值两次(先 cpp 再 43.49),注释写 "mars temporaire"——是否已在后续版本修正。
- 行 87
pi = 2.*ASIN(1.) 直接覆写 comconst_mod::pi 而非使用模块值,是否为遗留做法。
tab_cntrl 的 27-50 位置保持为 0(仅在 fxyhypb/ysinus 分支写入 23-26),是否有未使用的扩展槽。
相关页面