readhead_NC.F
路径
LMDZ.MARS\libf\dynphy_lonlat\phymars\readhead_NC.F
所属目录/模块
libf/dynphy_lonlat/phymars
文件定位
readhead_NC.F 定义 readhead_NC,用于从 NetCDF 诊断/初始状态文件读取动力网格头信息、火星常数、初始日、几何数组、地表位势和垂直坐标系数。它不创建文件,也不推进物理过程;主要职责是在 xvik.F 初始化物理前,把 NetCDF 文件中的 controle、经纬度、面积和 aps/bps 等静态状态装入动力公共模块与输出参数。
定义的符号
| 符号 |
类型 |
行号 |
作用 |
readhead_NC |
subroutine |
1 |
打开 NetCDF 文件,读取控制参数和网格静态场,设置 day_ini/day0、动力维度、火星常数、能量积分初值、几何数组、phis、aps/bps。 |
依赖的模块
| use 模块 |
only 列表 |
用途 |
待确认 |
comvert_mod |
aps,bps,preff |
接收垂直混合坐标系数,并硬编码设置参考压力 preff=610.。 |
preff 未使用 tab_cntrl(18),源码注释说明该项不适用于 diagfi。 |
comconst_mod |
im,jm,lllm,daysec,dtvr,rad,omeg,g,cpp,kappa,r,pi |
写入动力维度、时间步长、行星常数、气体常数;使用 pi 做度到弧度转换。 |
cpp 固定为 744.499,未从控制表读取。 |
temps_mod |
day_ini |
从 controle(4) 接收初始日,并复制到输出参数 day0。 |
无。 |
ener_mod |
etot0,ptot0,ztot0,stot0,ang0 |
从 controle(12:16) 接收初始能量/动量诊断量。 |
这些量的物理单位需结合生成端确认。 |
include 依赖
| include |
用途 |
netcdf.inc |
提供 NF_OPEN、NF_INQ_VARID、NF_GET_VAR_*、NF_CLOSE、NF_NOERR、NF_NOWRITE 等 NetCDF Fortran 接口常量和例程声明。 |
dimensions.h |
提供编译期 iim/jjm/llm 等维度常量。 |
paramet.h |
提供派生维度常量,例如 ip1jmp1。 |
comgeom.h |
提供动力几何公共数组,例如 rlonu、rlatv、aire。 |
调用的关键例程
| 被调用例程 |
所在模块/文件 |
调用位置 |
作用 |
NF_OPEN |
NetCDF Fortran API |
readhead_NC.F:45 |
以只读方式打开 fichnom。 |
NF_INQ_VARID |
NetCDF Fortran API |
多处 |
查询 controle、longitude、latitude、aire、phisinit、aps、bps 的变量 ID。 |
NF_GET_VAR_DOUBLE / NF_GET_VAR_REAL |
NetCDF Fortran API |
多处 |
根据是否定义 NC_DOUBLE 读取双精度或单精度变量。 |
abort |
外部例程 |
多处错误分支 |
NetCDF 打开、查询或读取失败时终止。 |
NF_CLOSE |
NetCDF Fortran API |
readhead_NC.F:232 |
关闭 NetCDF 文件。 |
调用方
| 调用方 |
调用位置 |
作用 |
xvik.F |
libf/dynphy_lonlat/phymars/xvik.F:229 |
在处理每个 diagfi NetCDF 文件时,先调用 readhead_NC(file//'.nc',day0,phis,constR) 读取头信息,再调用 conf_gcm、iniconst、inigeom 初始化后续物理/几何状态。 |
输入
| 输入 |
来源 |
类型/维度 |
单位 |
含义 |
fichnom |
调用方参数 |
CHARACTER*(*) |
路径 |
要打开的 NetCDF 文件名,xvik 传入 file//'.nc'。 |
NetCDF controle |
fichnom |
REAL tab_cntrl(100) |
混合 |
控制参数表,位置 1-16 被读取到维度、时间、常数和能量变量。 |
NetCDF longitude |
fichnom |
写入 rlonu(:) |
源文件中为度,例程内转弧度 |
动力 u 经度坐标。 |
NetCDF latitude |
fichnom |
写入 rlatv(:) |
源文件中为度,例程内转弧度 |
动力 v 纬度坐标。 |
NetCDF aire |
fichnom |
写入 aire(:) |
待确认 |
网格单元面积。 |
NetCDF phisinit |
fichnom |
写入 phis(ip1jmp1) |
待确认,通常为地表位势 |
地表位势初始场。 |
NetCDF aps、bps |
fichnom |
写入 aps(:)、bps(:) |
混合坐标系数 |
垂直坐标系数。 |
输出
| 输出 |
去向 |
类型/维度 |
单位 |
含义 |
day0 |
调用方 |
INTEGER |
model day |
复制自 day_ini=tab_cntrl(4)。 |
phis |
调用方 |
REAL(ip1jmp1) |
待确认 |
从 NetCDF phisinit 读取的地表位势。 |
constR |
调用方 |
REAL |
J kg-1 K-1(推断) |
计算为 kappa*cpp,并同步写入 comconst_mod::r。 |
im,jm,lllm |
comconst_mod |
标量 |
grid count |
从 controle(1:3) 读取的水平/垂直维度。 |
rad,omeg,g,kappa,daysec,dtvr |
comconst_mod |
标量 |
混合 |
从控制表读取的行星半径、角速度、重力、kappa、日长和动力时间步。 |
cpp,preff,r |
comconst_mod / comvert_mod |
标量 |
混合 |
cpp=744.499、preff=610.、r=constR 为例程内赋值。 |
etot0,ptot0,ztot0,stot0,ang0 |
ener_mod |
标量 |
待确认 |
初始能量、动量或守恒量诊断。 |
rlonu,rlatv,aire,aps,bps |
common/module state |
数组 |
混合 |
动力几何和垂直坐标状态。 |
共享状态与副作用
- 读取 NetCDF 文件但不写文件;所有 NetCDF 失败分支打印错误信息并
CALL abort。
- 若
controle 中的 im/jm/lllm 与编译期 iim/jjm/llm 不一致,打印格式化错误并 STOP。
- 修改
comconst_mod、temps_mod、ener_mod、comvert_mod 和 comgeom.h 公共数组中的全局状态。
- 将
longitude、latitude 从度转换为弧度后覆盖 rlonu(:)、rlatv(:)。
- 打印
preff、constR 和 aire 的最小/最大值到标准输出。
nbsrf、radpas、length/iq、str3 中部分变量没有参与后续计算;其中 length 只用于定义控制表长度。
核心逻辑
- 以
NF_NOWRITE 打开 fichnom,失败则打印文件名并终止。
- 查询并读取 NetCDF 变量
controle 到 tab_cntrl(100);缺失或读取失败均终止。
- 从
tab_cntrl 解包动力维度、初始日、火星半径、自转角速度、重力、kappa、日长、动力时间步和五个能量/动量诊断量。
- 固定设置
cpp=744.499,固定设置 preff=610.,再令 day0=day_ini、constR=kappa*cpp、r=constR。
- 检查运行文件维度
im/jm/lllm 是否等于编译维度 iim/jjm/llm;任一不一致即 STOP。
- 查询并读取
longitude 到 rlonu,随后执行 rlonu(:)=rlonu(:)*pi/180.。
- 查询并读取
latitude 到 rlatv,随后执行 rlatv(:)=rlatv(:)*pi/180.。
- 查询并读取
aire 到公共几何数组,计算并打印 MINVAL(aire) 和 MAXVAL(aire)。
- 查询并读取
phisinit 到输出数组 phis。
- 查询并读取
aps、bps 到 comvert_mod 的垂直坐标数组。
- 关闭 NetCDF 文件并返回。
伪代码
open fichnom as read-only NetCDF
read controle into tab_cntrl
im, jm, lllm = tab_cntrl(1:3)
day_ini = tab_cntrl(4)
rad, omeg, g = tab_cntrl(5:7)
cpp = 744.499
kappa = tab_cntrl(9)
daysec, dtvr = tab_cntrl(10:11)
etot0, ptot0, ztot0, stot0, ang0 = tab_cntrl(12:16)
preff = 610.
day0 = day_ini
constR = kappa * cpp
r = constR
if im != iim or jm != jjm or lllm != llm:
print mismatch and stop
read longitude into rlonu; convert degrees to radians
read latitude into rlatv; convert degrees to radians
read aire into aire; print min/max
read phisinit into phis
read aps into aps
read bps into bps
close file
参与的主题流程
| 主题 |
参与方式 |
| dynphy_lonlat 初始状态/诊断文件读取 |
为 xvik 的 diagfi NetCDF 后处理路径提供网格、控制参数和垂直坐标头信息。 |
| start_archive/NetCDF 头信息约定 |
读取的 controle、aps/bps、经纬度和面积变量与 ini_archive 写入控制表/静态变量的约定相呼应,但本例程的直接调用方是 xvik。 |
写法特点
- 固定格式 Fortran,依赖
#include 和 #ifdef NC_DOUBLE 预处理。
NC_DOUBLE 控制 NetCDF 读取例程选择;未定义时使用 NF_GET_VAR_REAL。
preff 和 cpp 是硬编码火星值,不完全采用 controle 表。
- 错误处理以
CALL abort 和少量 STOP 为主,没有把 NetCDF 错误码转换为详细文本。
复现要点
- 输入 NetCDF 必须包含
controle、longitude、latitude、aire、phisinit、aps、bps,否则例程会终止。
controle(1:3) 必须与编译期 iim/jjm/llm 一致;此例程不做重网格或垂直插值。
- 调用后
rlonu/rlatv 已经是弧度;后续初始化不要再次按度解释。
constR 和 comconst_mod::r 来自 kappa*744.499,不是直接从文件读取。
preff 固定为 610 Pa;如果复现实验依赖控制表中的参考压,需要确认生成文件和读取端约定。
待确认
tab_cntrl(12:16) 对 etot0/ptot0/ztot0/stot0/ang0 的单位和后续消费路径需要结合动力框架确认。
aire 和 phisinit 的单位由写入端/文件约定决定;本文件只读取和转交。
nbsrf、radpas、iq、str3 等变量是否是旧 readhead 迁移残留。
preff=610. 与注释中 tab_cntrl(18) 的差异在 xvik 路径中同样表现为硬编码参考压;设计意图仍需结合垂直坐标模块确认。
相关页面