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、动力维度、火星常数、能量积分初值、几何数组、phisaps/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_OPENNF_INQ_VARIDNF_GET_VAR_*NF_CLOSENF_NOERRNF_NOWRITE 等 NetCDF Fortran 接口常量和例程声明。
dimensions.h 提供编译期 iim/jjm/llm 等维度常量。
paramet.h 提供派生维度常量,例如 ip1jmp1
comgeom.h 提供动力几何公共数组,例如 rlonurlatvaire

调用的关键例程

被调用例程 所在模块/文件 调用位置 作用
NF_OPEN NetCDF Fortran API readhead_NC.F:45 以只读方式打开 fichnom
NF_INQ_VARID NetCDF Fortran API 多处 查询 controlelongitudelatitudeairephisinitapsbps 的变量 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_gcminiconstinigeom 初始化后续物理/几何状态。

输入

输入 来源 类型/维度 单位 含义
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 apsbps 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.499preff=610.r=constR 为例程内赋值。
etot0,ptot0,ztot0,stot0,ang0 ener_mod 标量 待确认 初始能量、动量或守恒量诊断。
rlonu,rlatv,aire,aps,bps common/module state 数组 混合 动力几何和垂直坐标状态。

共享状态与副作用

核心逻辑

  1. NF_NOWRITE 打开 fichnom,失败则打印文件名并终止。
  2. 查询并读取 NetCDF 变量 controletab_cntrl(100);缺失或读取失败均终止。
  3. tab_cntrl 解包动力维度、初始日、火星半径、自转角速度、重力、kappa、日长、动力时间步和五个能量/动量诊断量。
  4. 固定设置 cpp=744.499,固定设置 preff=610.,再令 day0=day_iniconstR=kappa*cppr=constR
  5. 检查运行文件维度 im/jm/lllm 是否等于编译维度 iim/jjm/llm;任一不一致即 STOP
  6. 查询并读取 longituderlonu,随后执行 rlonu(:)=rlonu(:)*pi/180.
  7. 查询并读取 latituderlatv,随后执行 rlatv(:)=rlatv(:)*pi/180.
  8. 查询并读取 aire 到公共几何数组,计算并打印 MINVAL(aire)MAXVAL(aire)
  9. 查询并读取 phisinit 到输出数组 phis
  10. 查询并读取 apsbpscomvert_mod 的垂直坐标数组。
  11. 关闭 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 头信息约定 读取的 controleaps/bps、经纬度和面积变量与 ini_archive 写入控制表/静态变量的约定相呼应,但本例程的直接调用方是 xvik

写法特点

复现要点

待确认

相关页面