localtime.F90

路径

LMDZ.MARS\util\localtime.F90

所属目录/模块

util

文件定位

localtime.F90 是 LMD Mars GCM 输出的本地时重排工具。它读取 diagfi.ncstats.ncconcat.nc 一类 NetCDF 文件,把用户选择的 3D (longitude,latitude,Time) 或 4D (longitude,latitude,altitude,Time) 变量沿时间维插值到若干指定本地时刻,并输出 input_LT.nc

程序不改变水平网格或垂直坐标。核心变换是把每个经度上的 GCM 时间轴转换为本地时坐标:

lt_gcm(t) = time(t) + 0.5 * longitude / 180

即经度 360 度对应 1 sol,相邻本地时样本按 lt_hour/24 写入输出 Time

定义的符号

符号 类型 行号 作用
localtime program 1 主程序:读取输入、变量列表和目标本地时,创建 *_LT.nc 并对变量做时间插值。
initiate internal subroutine 752 创建输出 NetCDF 文件,定义坐标、TimeGCM_layers 和可选 controle
init2 internal subroutine 956 复制可选 aps/bps hybrid 坐标和 phisinit 到输出文件。
def_var internal subroutine 1132 定义输出变量并写入 long_nameunits 属性。
missing_value internal subroutine 1181 把输入变量的 valid_rangemissing_value 属性写入输出变量。
interpolf internal subroutine 1259 一维线性插值;若目标点不在已知坐标范围内或邻点缺测,则返回 missing

依赖

依赖 用途
include "netcdf.inc" 使用旧式 NetCDF Fortran NF_* 接口。

调用的关键例程

被调用例程 所在位置 作用
NF_OPEN / NF_CLOSE NetCDF 库 打开输入文件、关闭输入和输出文件。
NF_INQ_NVARS / NF_INQ_VARNAME / NF_INQ_VARNDIMS NetCDF 库 枚举变量、按变量名过滤坐标和静态字段、确认 3D/4D 变量。
NF_INQ_DIMID / NF_INQ_VARID / NF_INQ_DIMLEN NetCDF 库 读取坐标维度,兼容 latitude/latlongitude/lonTime/time_counter
NF_GET_VAR_REAL / NF_PUT_VARA_REAL NetCDF 库 读取输入变量、写入插值后变量和输出时间轴。
NF_GET_ATT_TEXT / NF_GET_ATT_REAL / NF_PUT_ATT_* NetCDF 库 复制 long_name/titleunitsmissing_valuevalid_range 等属性。
initiate / init2 / def_var / missing_value / interpolf 本文件 输出文件初始化、辅助字段复制、属性写入和线性插值。

输入

输入 来源 类型/维度 单位 含义
输入文件名 stdin / localtime.def NetCDF 文件名 - diagfi.ncstats.ncconcat.nc 等。
变量列表 stdin / localtime.def all 或逐行变量名,空行结束 - 要重排到固定本地时的变量;3D 或 4D 才会处理。
latitude / lat 输入 NetCDF 1D degrees_north 纬度坐标。
longitude / lon 输入 NetCDF 1D degrees_east 经度坐标,用于本地时换算。
altitude 输入 NetCDF 1D 输入属性 4D 变量垂直坐标,属性会复制。
Time / time_counter 输入 NetCDF 1D sol 类时间 输入时间轴;若属性说明为 Solar longitude,程序停止。
GCM_layers 输入 NetCDF 维度 - 可选;存在时用于 aps/bps 长度,否则等于 altlen
controle 输入 NetCDF 1D - 可选控制数组;存在时复制到输出。
aps/bps 输入 NetCDF GCM_layers - 可选 hybrid 中层坐标;存在时复制到输出。
phisinit 输入 NetCDF (longitude,latitude) - 可选地表位势;存在时复制到输出。
目标本地时列表 stdin / localtime.def nhour + nhour 个数值 hour 要输出的本地时刻,注释要求 0<t<24

输出

输出 去向 类型/维度 单位 含义
input_LT.nc 磁盘 NetCDF 文件 - 输入文件名去掉 .nc 后追加 _LT.nc
latitude / longitude / altitude 输出 NetCDF 1D 输入或固定属性 原坐标复制。
Time 输出 NetCDF unlimited stats 时为小时,否则为 sol + local hour/24 目标本地时组合后的输出时间轴。
GCM_layers / aps / bps / phisinit 输出 NetCDF 可选 - 从输入文件复制的辅助坐标和地形字段。
用户选择变量 输出 NetCDF 3D 或 4D 输入 units 插值到指定本地时后的变量。

副作用

核心逻辑

  1. 读输入文件与变量列表:先枚举所有变量,排除 Time/controle/latitude/longitude/altitude/aps/bps/ap/bp/soildepth/cu/cv/aire/phisinit 等 16 个不处理字段;用户可输入 all 或逐行变量名。
  2. 生成输出名filename=file(1:len_trim(file)-3)//"_LT.nc"
  3. 读取坐标和兼容名称
    • 纬度维度/变量可用 latitudelat
    • 经度维度/变量可用 longitudelon
    • 时间维度/变量可用 Timetime_counter
    • altitude 是必需字段,属性 long_name/units/positive 会复制。
  4. 拒绝 Ls 时间轴:若 Timelong_nametitle 包含 Solar,程序停止,因为本地时插值要求 sol 时间轴。
  5. 构造输出时间轴
    • 若输入 timelen==12time(1)==2time(12)==24,识别为 stats 文件,把输入时间从小时除以 24 映射到 0-1 sol,输出 Time 写为目标小时。
    • 否则按 nsol=int(time(last))-int(time(first)),对每个 sol 和每个目标小时生成 lt_out = int(time(1))+k-1+lt_hour/24
    • 若只有 1 个 sol,追加一个周期性时间点参与插值。
  6. 创建输出文件并复制辅助字段initiate 写坐标和 Timeinit2 复制可选 aps/bps/phisinit
  7. 逐变量插值
    • 只处理维度数不少于 3 的变量;ndim==3(lon,lat,time)ndim==4(lon,lat,alt,time)
    • 对每个经度构造 lt_gcm=time+0.5*lon/180
    • 若目标本地时超出当前经度的输入本地时范围,则用前一天或后一天修正 lt_outc
    • 对每个 (lon,lat)(lon,lat,alt) 时间序列调用 interpolf
  8. 写变量和属性:输出变量保留输入的 long_nametitleunits;若输入有 missing_value,则调用 missing_valuevalid_rangemissing_value

伪代码

read input file name
open input and list processable variables
read selected variable names
read lon, lat, alt, Time and optional controle/GCM_layers
reject Time axis if it is Solar longitude
read target local hours
if stats-like file:
  convert input hours to fractions of one sol
  output Time = requested hours
else:
  build output Time = sol start + requested hour/24
create infile_LT.nc and copy coords
copy aps/bps and phisinit if present
for each selected 3D/4D variable:
  read full variable
  for each longitude:
    lt_gcm = time + 0.5*lon/180
    wrap target times by +/- 1 sol if needed
    interpolate each lat or lat-alt time series with interpolf
  write interpolated variable and missing/valid_range attrs

参与的主题流程

主题 参与方式
util 后处理链 常接在 concatnc 后,把多 sol 输出重排到固定本地时,便于日变化比较。
观测比较链 simu_MCSextract 类工具类似,把 GCM 输出转换到观测或分析所需的时间采样。

复现要点

待确认

复现风险

相关页面