lslin.F90

路径

LMDZ.MARS\util\lslin.F90

文件定位

lslin.F90 是一个离线 NetCDF 时间坐标重采样工具。它读取 diagfi.ncconcat.nc 等 lon-lat GCM 输出,把原始 Time sol 坐标转换成太阳经度 Ls,再把所有 3D (lon,lat,Time) 和 4D (lon,lat,alt,Time) 变量重采样到等间隔 Ls 坐标,输出 input_Ls.nc

程序支持两种重采样方式:

它还会写一个伴随的 input_Ls.ctl,用于 GrADS 按近似月份时间轴读取输出文件。

定义的符号

符号 类型 行号 作用
lslin program 3 主程序;读取输入文件、构造等间隔 Ls 坐标并重采样变量。
initiate internal subroutine 653 创建输出 NetCDF 文件,定义并写入坐标、Time 和可选 controle
init2 internal subroutine 854 尝试复制 apsbpsphisinit 到输出文件。
def_var internal subroutine 1052 在输出 NetCDF 中定义变量并写 long_nameunits 属性。
missing_value internal subroutine 1102 写出变量 missing_value 属性。
sol2ls internal subroutine 1171 将 sol 日期转换为太阳经度 Ls,可跨年累加 360 度。
interpolf internal subroutine 1265 对一维时间序列做线性插值;超出范围或邻点缺测时返回 missing。

依赖

依赖 用途
include "netcdf.inc" 使用旧式 NetCDF Fortran NF_* API 读写输入和输出文件。
lslin.def 可选 stdin 输入样例,提供文件名、起始日、Ls 步长和平均/插值选择。

交互输入

输入 说明
输入文件名 例如 diagfi.nc
是否手动指定起始日 若输入含 controle 且回答 n,使用 controle(4);否则读取用户给定 sol。
是否自动 Ls 步长 y 时根据输入 sol 步长选取 1/12, 1/6, 0.25, 0.5, 0.75, 1, 2, 3, 5 度之一;n 时读取用户给定 deltalsls0
是否按 Ls 步长平均 y 时在 timels(n) +- deltals/2 窗口内平均;其他回答走线性插值。

lslin.def 的末尾 USE 行写成 localtime.e < localtime.def,与本程序名不一致;页面按源码和文件内容记录,实际运行应使用 lslin.e < lslin.def

输入 NetCDF 契约

输入 必需性 说明
latitude / longitude 必需 坐标维度和值原样写入输出。
altitude 可缺省 缺失时源码设 altlen=1alt(1)=0,但仍继续。
Time 必需 原始 sol 时间坐标。
controle with index dimension 可选 存在时可用 controle(4) 推断 day_ini,并复制到输出。
aps / bps / phisinit 可选 init2 尝试复制;aps/bps 维度长度必须等于 altlen
3D/4D 变量 必需至少一类 程序从第一个 ndim>=3 的变量开始,将后续变量列为待处理对象。

输出

输出 类型 内容
input_Ls.nc NetCDF 等间隔 Ls 坐标上的变量;Time 变量单位写为 degrees,long_name 为 Ls (Solar Longitude)
input_Ls.ctl GrADS control 用近似月步长描述 Ls 轴,绕过 GrADS 对某些年份格式的限制。
stdout 文本 变量清单、维度、Ls 范围、步长选择和错误信息。

输出 NetCDF 用 NF_CLOBBER | NF_64BIT_OFFSET 创建,同名文件会被覆盖。

核心逻辑

  1. 读取文件名并打开 NetCDF
  2. 确定待处理变量范围:从变量编号 1 开始查 NF_INQ_VARNDIMS,直到遇到第一个 ndim>=3 的变量;假定此后变量都是物理输出候选。
  3. 读取坐标与辅助字段
    • 必需 latitudelongitudeTime
    • altitude 缺失时退化为单层;
    • controle 存在时可读取 day_ini
    • 输出文件初始化后尝试复制 aps/bps/phisinit
  4. 构造输入 Ls 序列
    • deltatsol = time(2)-time(1)
    • 对每个 time(i)sol2ls(day_ini+time(i), lsgcm(i))
    • 若后续 Ls 小于首个 Ls,则加 360 处理跨年。
  5. 构造输出 Ls 序列
    • 自动模式根据 0.6*deltatsol 选离散 Ls 步长;
    • 手动模式读取 deltalsls0,且 ls0 不能早于输入最早 Ls;
    • Nls=int(int((lsgcm(timelen)-ls0)/deltals)+1)
    • timels(1) 四舍五入到 0.01 度,之后逐步加 deltals
  6. 逐变量处理
    • ndim<3 跳过;
    • ndim==3(lon,lat,time) 处理;
    • ndim==4(lon,lat,alt,time) 处理;
    • 复制 long_nametitleunits 属性;
    • 读取全变量到内存。
  7. 重采样
    • 平均模式:收集 lsgcm(l) 落在 timels(n) +- deltals/2 的非 missing 样本,写平均值;无样本写 missing。
    • 插值模式:调 interpolflsgcm 和变量时间序列之间线性插值;超出范围或邻点 missing 时写 missing。
  8. 写输出:写变量值,若输入有 missing_value 属性则在输出变量上写同名属性。
  9. 写 GrADS ctl:根据 timels(1) 的小数部分估算月份,写 TDEF Time ... LINEAR ... mo

伪代码

read infile
open infile
find first variable with ndim >= 3
read latitude, longitude, optional altitude, optional controle
create infile_Ls.nc and copy coordinates/controle
copy optional aps, bps, phisinit
read Time
choose day_ini from controle(4) or user input
for each input time:
  lsgcm = sol2ls(day_ini + time)
  unwrap if crossing 360
choose deltals and ls0
build timels
for each variable from start_var to end:
  skip if ndim < 3
  define output variable
  read full variable
  for each lon/lat[/alt] point and target Ls:
    if average:
      average valid input samples inside Ls bin
    else:
      linearly interpolate in Ls
  write variable
write infile_Ls.ctl

参与的主题流程

主题 参与方式
util/index.md 属于常规输出整理链,把非线性或非等间隔 sol 输出重采样到等间隔 Ls。
观测比较 平均模式用于按 Ls bin 与 TES、MCS 等观测分箱比较;源码注释明确提到 2013 修改加入该用途。
concatnc.md 常接在拼接输出之后,把多段时间序列进一步转换到 Ls 坐标。

复现要点

待确认

复现风险

相关页面