extractcolumnfor1D.F90

路径

LMDZ.MARS\util\extractcolumnfor1D.F90

文件定位

extractcolumnfor1D.F90 是一个命令行列抽取工具。它从 diagfi.ncstats.nc 或类似的 GCM NetCDF 输出中,按用户给定的经度索引、纬度索引和时间索引抽取一个垂直廓线,并为变量列表中的每个变量写出一个 ASCII profile_<var> 文件,供 1D 物理测试配置或手工检查使用。

源码按数组索引读取,不做经纬度值查找,也不做时间或垂直插值。

定义的符号

符号 类型 行号 作用
extractcolumnfor1D program 1 主程序;解析命令行,读取 NetCDF 变量列,写出 profile_* 文件。

依赖

依赖 用途
use netcdf 使用现代 NetCDF Fortran nf90_* API 读取输入文件。
command_argument_count / get_command_argument 解析 -i/-j/-l/-v infile 命令行参数。

命令行接口

extractcolumnfor1D.e -i # -j # -l # -v list_of_variables infile
参数 含义
-i # 经度索引,直接作为 NetCDF longitude 维的 1-based start index。
-j # 纬度索引,直接作为 NetCDF latitude 维的 1-based start index。
-l # 时间索引,直接作为 NetCDF Time 维的 1-based start index。
-v list 逗号分隔变量名列表,例如 temp,u,v
infile 输入 NetCDF 文件。

程序要求参数总数严格为 9;多或少都会停止。选项顺序由循环按 -i/-j/-l/-v 成对解析,最后一个参数固定为输入文件名。

输入

输入 类型/维度 说明
longitude dimension 必需;只读取长度以确认文件结构。
latitude dimension 必需;只读取长度以确认文件结构。
altitude dimension 必需;决定输出廓线层数 altlen
Time dimension 必需;用于 timeindex 读取。
var(lon,lat,alt,Time) NetCDF variable -v 列表中每个变量应为 4D 场;源码用 start=[i,j,1,l]count=[1,1,altlen,1] 读取。
var_s(lon,lat,Time) NetCDF variable,可缺失 对应地表变量;缺失时用第一层值代替。
tsurf(lon,lat,Time) NetCDF variable,可缺失 当变量名为 temp 时,地表值变量名特殊映射为 tsurf

输出

输出 格式 内容
profile_<var> ASCII 第一行是地表值,之后每行一个垂直层值,共 altlen+1 行。
stdout 文本 输入文件、变量列表、缺失变量或写出文件提示。

输出文件使用固定文件名 profile_<var> 打开,已有同名文件会被覆盖。

核心逻辑

  1. 参数检查:要求 command_argument_count()==9,否则打印 usage 并停止。
  2. 解析选项:读取 -i-j-l-v 的值;最后一个参数作为输入文件。
  3. 打开 NetCDF:用 nf90_open(infile,NF90_NOWRITE,inid)
  4. 读取维度长度:要求存在 longitudelatitudealtitudeTime 四个维度。
  5. 解析变量列表:扫描逗号位置,把 varlist 拆成 varnames(:)
  6. 逐变量读取垂直列
    • 查找变量 ID;
    • nf90_get_var 读取 (lonindex,latindex,1:altlen,timeindex)
    • temp 的地表变量名为 tsurf,其他变量为 <var>_s
    • 地表变量缺失时,使用第一层值作为 surface。
  7. 写 ASCII 文件:写第一行 surface,再依次写各垂直层。

伪代码

require exactly 9 arguments
parse -i lonindex, -j latindex, -l timeindex, -v varlist, infile
open infile
read longitude/latitude/altitude/Time dimensions
split varlist by commas
for each varname:
  find varname in NetCDF
  read variable(lonindex, latindex, 1:altlen, timeindex)
  if varname == temp:
    surfvar = tsurf
  else:
    surfvar = varname + "_s"
  read surfvar(lonindex, latindex, timeindex), or use first layer
  write profile_varname: surface then vertical profile

参与的主题流程

主题 参与方式
util/index.md 属于 util 初始场与 1D 输入链,从 3D/4D 输出中抽取单柱廓线。
1D 物理测试 生成的 profile_* 文件可作为 testphys1d 或相关脚本的廓线输入材料;具体字段消费路径需结合 dyn1d 页面核验。

复现要点

待确认

复现风险

相关页面