extractcolumnfor1D.F90
路径
LMDZ.MARS\util\extractcolumnfor1D.F90
文件定位
extractcolumnfor1D.F90 是一个命令行列抽取工具。它从 diagfi.nc、stats.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> 打开,已有同名文件会被覆盖。
核心逻辑
- 参数检查:要求
command_argument_count()==9,否则打印 usage 并停止。
- 解析选项:读取
-i、-j、-l、-v 的值;最后一个参数作为输入文件。
- 打开 NetCDF:用
nf90_open(infile,NF90_NOWRITE,inid)。
- 读取维度长度:要求存在
longitude、latitude、altitude、Time 四个维度。
- 解析变量列表:扫描逗号位置,把
varlist 拆成 varnames(:)。
- 逐变量读取垂直列:
- 查找变量 ID;
- 用
nf90_get_var 读取 (lonindex,latindex,1:altlen,timeindex);
temp 的地表变量名为 tsurf,其他变量为 <var>_s;
- 地表变量缺失时,使用第一层值作为 surface。
- 写 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 页面核验。 |
复现要点
- 索引是 Fortran/NetCDF Fortran 1-based 数组索引,不是经纬度数值。
-v 列表只按逗号拆分;源码没有处理空格、尾随逗号或超过 100 个逗号的情况。
- 所选变量应为
(longitude,latitude,altitude,Time) 维度顺序;源码没有检查变量实际维度 ID。
- 若地表变量不存在,输出第一行等于第一大气层值。
- 输出不包含变量名、单位、层号或高度,只是数值序列。
待确认
profile_* 文件与当前 libf/phymars/dyn1d 读取模块之间的精确字段命名和单位契约需要后续 dyn1d 任务核验。
- 参数选项顺序错误或重复时,源码只打印
invalid option,但不会立即停止;未赋值索引可能导致后续读取错误。
nf90_get_var 后没有检查读取状态;变量维度不匹配或索引越界时的错误可能不会被清晰报告。
复现风险
- 输出文件会覆盖同名
profile_*。
- 输入文件必须有
longitude/latitude/altitude/Time 维度名;不支持 lon/lat/time_counter 别名。
- 索引越界、变量缺失或维度顺序不匹配会导致失败或输出不可信。
- ASCII 输出没有元数据,后续使用时必须另外记录变量、单位和抽取位置。
相关页面