NetCDF95 wrapper 组页
输入范围
LMDZ.COMMON-6.3\LMDZ.COMMON\libf\misc\netcdf95.F90
LMDZ.COMMON-6.3\LMDZ.COMMON\libf\misc\simple.F90
LMDZ.COMMON-6.3\LMDZ.COMMON\libf\misc\nf95_def_var_m.F90
LMDZ.COMMON-6.3\LMDZ.COMMON\libf\misc\nf95_get_var_m.F90
LMDZ.COMMON-6.3\LMDZ.COMMON\libf\misc\nf95_put_var_m.F90
LMDZ.COMMON-6.3\LMDZ.COMMON\libf\misc\nf95_gw_var_m.F90
LMDZ.COMMON-6.3\LMDZ.COMMON\libf\misc\nf95_get_att_m.F90
LMDZ.COMMON-6.3\LMDZ.COMMON\libf\misc\nf95_put_att_m.F90
LMDZ.COMMON-6.3\LMDZ.COMMON\libf\misc\new_unit_m.F90
LMDZ.COMMON-6.3\LMDZ.COMMON\libf\misc\handle_err_m.F90
文件定位
netcdf95.F90 是聚合模块,use 各个 nf95_* 模块和 simple 模块,向调用方暴露更 Fortran-95 风格的 NetCDF API。handle_err_m 是统一错误处理;new_unit_m 是查找空闲 Fortran unit 的小工具。
Mars 运行参与度:条件经过。COMMON guide/nudging 代码使用 netcdf95 定义和写出 nudging 系数;COMMON dynredem/dynredem_p 也用 nf95_put_var 写部分 restart 元数据。Mars archive utilities 主要仍直接使用 netcdf.inc/NF_*,不直接进入本页 wrapper 错误处理链;边界见 Mars utility NetCDF 和 COMMON helper 边界。
例程和模块
| 文件 | 行数 | 主要符号 | 作用 |
|---|---|---|---|
netcdf95.F90 |
17 | module netcdf95 |
聚合 nf95_def_var/get_var/put_var/gw_var/att/simple/handle_err。 |
simple.F90 |
361 | nf95_open, nf95_create, nf95_def_dim, nf95_inq_varid, nf95_close 等 |
对常用 nf90_* 文件、维度、变量、attribute 查询做可选错误码包装。 |
nf95_def_var_m.F90 |
102 | nf95_def_var generic |
scalar、oneDim、ManyDims 变量定义。 |
nf95_get_var_m.F90 |
391 | nf95_get_var generic |
scalar 到 5D,real/int,不同 kind 读取。 |
nf95_put_var_m.F90 |
335 | nf95_put_var generic |
scalar 到 4D,real/int 写入。 |
nf95_gw_var_m.F90 |
336 | nf95_gw_var generic |
get-or-write helper,若变量不存在则定义再写。 |
nf95_get_att_m.F90 |
105 | nf95_get_att generic |
text 和 integer attribute 读取。 |
nf95_put_att_m.F90 |
67 | nf95_put_att generic |
text 和 integer attribute 写入。 |
handle_err_m.F90 |
46 | handle_err |
打印 NetCDF 错误,可关闭文件,然后 abort_physic。 |
new_unit_m.F90 |
25 | new_unit |
从 unit=0 开始用 INQUIRE 查找存在且未打开的 Fortran unit。 |
错误处理约定
所有 wrapper 基本遵循同一模式:
- 调用底层
nf90_*,把返回值保存为本地ncerr_not_opt。 - 如果调用方传入可选
ncerr,只回填错误码,不中止。 - 如果未传
ncerr,调用handle_err。 handle_err在ncerr /= nf90_noerr时打印上下文和nf90_strerror;若传入ncid,先尝试nf90_close(ncid);最后调用abort_physic("NetCDF95 handle_err","",1)。
复现要点
nf95_def_var接收 scalar、一维 dimid 或 dimid 数组,底层都调用nf90_def_var。nf95_get_att_text会先nf95_inquire_attribute得到 attribute 长度,再读取字符值。new_unit在当前源码中从unit=0开始循环INQUIRE(unit=unit, opened=opened, exist=exist),遇到存在且未打开的 unit 即返回;源码没有 10..99 上限。
待确认
nf95_gw_var的 get-or-write 分支在当前 Mars 运行中是否实际经过,需要结合 guide/nudging 主页面逐步确认。