datareadnc.F

路径

LMDZ.MARS\libf\dynphy_lonlat\phymars\datareadnc.F

所属目录/模块

libf/dynphy_lonlat/phymars

文件定位

火星地表数据 NetCDF 读取与网格插值例程。datareadncsurface.nc 文件读取地表粗糙度、反照率、热惯量、MOLA 地形和亚网格地形参数(hmons/summit/base),分别经水平插值或复合平均映射到 GCM 目标网格,输出给 newstart 用于初始化地表物理场。

定义的符号

符号 类型 行号 作用
datareadnc subroutine 2 读取 surface.nc 地表数据并插值到 GCM 网格

依赖的模块

use 模块 only 列表 用途 待确认
ioipsl_getincom getin 读取用户配置的 datadir 路径
comconst_mod g, pi 重力加速度常数和圆周率
datafile_mod datadir 数据文件目录路径(模块变量)
avg_horiz_mod avg_horiz 水平空间平均插值
mvc_horiz_mod mvc_horiz 水平质量权重复合平均(取最大值)

INCLUDE 头文件

头文件 用途
dimensions.h 网格维度参数 iim, jjm, iip1, jjp1
paramet.h 物理参数
comgeom.h 几何参数 rlonu, rlatv
netcdf.inc NetCDF Fortran 接口常量和声明

调用的关键例程

被调用例程 所在模块/文件 调用位置 作用
getin ioipsl_getincom 行 123 读取 datadir 配置覆盖默认路径
NF_OPEN NetCDF 库 行 125 打开 surface.nc 文件
NF_INQ_VARID NetCDF 库 行 143, 152, 216, 338 查询变量 ID
NF_GET_VAR_REAL/DOUBLE NetCDF 库 行 145/147, 154/156, 223/225, 353/355 读取变量数据
initial0 公共工具(待确认模块) 行 208-210, 348-350 将数组初始化为零
grid_noro1 grid_noro1.F 行 241 无旋转网格设置,为亚网格地形统计计算中间网格
avg_horiz avg_horiz_mod.F 行 245 亚网格地形平均:源网格数据分箱平均到 GCM 网格
interp_horiz 待确认文件 行 274 水平插值:将数据网格插值到 GCM 网格
mvc_horiz mvc_horiz_mod.F 行 378 亚网格地形最大值:hmons/summit/base 取网格内最大值

输入

输入 来源 类型/维度 单位 含义
relief 调用方 CHARACTER(len=3), inout 地形类型标志;'pla' 表示平面(无地形),否则设为 'MOL'(MOLA)

输出

输出 去向 类型/维度 单位 含义
phisinit newstart REAL (iimp1*jjp1) m²/s² 地表位势(km×g)
alb newstart REAL (iimp1*jjp1) 地表反照率
ith newstart REAL (iimp1*jjp1) 热惯量
z0 newstart REAL (iimp1*jjp1) m 表面粗糙度(源数据 cm→m ×0.01)
zmea newstart REAL (imdp1*jmdp1) m 亚网格平均高程
zstd newstart REAL (imdp1*jmdp1) m 亚网格高程标准差
zsig newstart REAL (imdp1*jmdp1) m 亚网格高程偏度相关
zgam newstart REAL (imdp1*jmdp1) m 亚网格高程峰度相关
zthe newstart REAL (imdp1*jmdp1) m 亚网格高程阈值
hmons newstart REAL (imdp1*jmdp1) m 亚网格山峰高度
summit newstart REAL (imdp1*jmdp1) m 山峰顶部高程
base newstart REAL (imdp1*jmdp1) m 山峰基底高程
zavg newstart REAL (imdp1*jmdp1) m MOLA 地形平均值(经 avg_horiz

共享状态与副作用

核心逻辑

  1. 打开 NetCDF:设定 datadir 默认路径→getin 覆盖→NF_OPEN 打开 surface.nc;失败则打印指引信息并 CALL ABORT
  2. 读坐标:读取 latitude(jmdp1)longitude(imd) 数组,转换为弧度标量盒坐标 rlonud(imdp1)rlatvd(jmd)
  3. 主循环 k=0..4:依次读取 z0albedothermalzMOL(地形)、zMOL(亚网格统计):
    • k=4(亚网格地形统计)zMOL×1000 转 m → grid_noro1 计算亚网格统计量(zmea/zstd/zsig/zgam/zthe) → avg_horiz 计算 GCM 网格平均 → zavg
    • k=0..3:数据填充到 zdataSimdp1×jmdp1)→ interp_horiz 插值 → 周期性边界 → 按 k 保存到 z0(×0.01 转 m)/ alb / ith / phisinit
  4. 地形后处理phisinit × 1000 × g 转换为地表位势(m²/s²)。
  5. 扩展循环 k=5..7:读取 hmonssummitbase,使用 mvc_horiz 取最大值复合 → -999999 缺失值填 0。

伪代码

SUBROUTINE datareadnc(relief, phisinit, alb, ith, z0,
                      zmea, zstd, zsig, zgam, zthe,
                      hmons, summit, base, zavg)

  datadir ← "/u/lmdz/WWW/planets/mars/datadir"
  getin("datadir", datadir)
  NF_OPEN(datadir/surface.nc)
  READ latitude, longitude
  转换 → rlonud, rlatvd(弧度标量盒坐标)

  FOR k = 0 TO 4:
    string = ['z0', 'albedo', 'thermal', 'zMOL', 'zMOL']
    READ NetCDF variable string(k) → zdata
    IF k == 4 THEN  ! 亚网格地形
      zdata × 1000
      grid_noro1 → zmea/zstd/zsig/zgam/zthe
      avg_horiz → zavg
    ELSE
      zdata → zdataS(填充 imdp1 列)
      interp_horiz(zdataS → pfield)
      周期性边界补齐
      按 k 保存: z0(×0.01), alb, ith, phisinit
    ENDIF
  ENDFOR

  phisinit ← phisinit × 1000 × g

  FOR k = 5 TO 7:
    string = ['hmons', 'summit', 'base']
    READ NetCDF variable → zdata
    zdata → zdataS
    mvc_horiz(取最大值)→ pfield
    -999999 缺失值 → 0
    保存到 hmons/summit/base
  ENDFOR
END SUBROUTINE

参与的主题流程

主题 参与方式
初始场准备 surface.nc 读取全套地表参数供 GCM 初始化使用
地形与亚网格 提供 MOLA 地形、亚网格统计和山峰参数,影响动力学和物理过程

写法特点

复现要点

待确认

相关页面