lslin.F90
快速理解
它做什么: 离线时间坐标重采样工具,把 Time (sol) 转换为太阳经度 Ls 并重采样到等间隔 Ls。
基本过程: 读输入 → 构造等间隔 Ls 坐标 → 线性插值或窗口平均 → 写 input_Ls.nc。
关键结果: 按等间隔 Ls 重采样的 NetCDF + GrADS 控制文件。
路径
LMDZ.MARS\util\lslin.F90
文件定位
lslin.F90 是一个离线 NetCDF 时间坐标重采样工具。它读取 diagfi.nc、concat.nc 等 lon-lat GCM 输出,把原始 Time sol 坐标转换成太阳经度 Ls,再把所有 3D (lon,lat,Time) 和 4D (lon,lat,alt,Time) 变量重采样到等间隔 Ls 坐标,输出 input_Ls.nc。
程序支持两种重采样方式:
- 对每个目标 Ls 点做线性插值;
- 或对目标 Ls 步长窗口内的输入样本做平均。
它还会写一个伴随的 input_Ls.ctl,用于 GrADS 按近似月份时间轴读取输出文件。
定义的符号
| 符号 | 类型 | 行号 | 作用 |
|---|---|---|---|
lslin |
program | 3 | 主程序;读取输入文件、构造等间隔 Ls 坐标并重采样变量。 |
initiate |
internal subroutine | 653 | 创建输出 NetCDF 文件,定义并写入坐标、Time 和可选 controle。 |
init2 |
internal subroutine | 854 | 尝试复制 aps、bps 和 phisinit 到输出文件。 |
def_var |
internal subroutine | 1052 | 在输出 NetCDF 中定义变量并写 long_name、units 属性。 |
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 时读取用户给定 deltals 和 ls0。 |
| 是否按 Ls 步长平均 | y 时在 timels(n) +- deltals/2 窗口内平均;其他回答走线性插值。 |
lslin.def 的末尾 USE 行写成 localtime.e < localtime.def,与本程序名不一致;页面按源码和文件内容记录,实际运行应使用 lslin.e < lslin.def。
输入 NetCDF 契约
| 输入 | 必需性 | 说明 |
|---|---|---|
latitude / longitude |
必需 | 坐标维度和值原样写入输出。 |
altitude |
可缺省 | 缺失时源码设 altlen=1、alt(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 创建,同名文件会被覆盖。
核心逻辑
- 读取文件名并打开 NetCDF。
- 确定待处理变量范围:从变量编号 1 开始查
NF_INQ_VARNDIMS,直到遇到第一个ndim>=3的变量;假定此后变量都是物理输出候选。 - 读取坐标与辅助字段:
- 必需
latitude、longitude、Time; altitude缺失时退化为单层;controle存在时可读取day_ini;- 输出文件初始化后尝试复制
aps/bps/phisinit。
- 必需
- 构造输入 Ls 序列:
deltatsol = time(2)-time(1);- 对每个
time(i)调sol2ls(day_ini+time(i), lsgcm(i)); - 若后续 Ls 小于首个 Ls,则加 360 处理跨年。
- 构造输出 Ls 序列:
- 自动模式根据
0.6*deltatsol选离散 Ls 步长; - 手动模式读取
deltals和ls0,且ls0不能早于输入最早 Ls; Nls=int(int((lsgcm(timelen)-ls0)/deltals)+1);timels(1)四舍五入到 0.01 度,之后逐步加deltals。
- 自动模式根据
- 逐变量处理:
ndim<3跳过;ndim==3按(lon,lat,time)处理;ndim==4按(lon,lat,alt,time)处理;- 复制
long_name或title、units属性; - 读取全变量到内存。
- 重采样:
- 平均模式:收集
lsgcm(l)落在timels(n) +- deltals/2的非 missing 样本,写平均值;无样本写 missing。 - 插值模式:调
interpolf在lsgcm和变量时间序列之间线性插值;超出范围或邻点 missing 时写 missing。
- 平均模式:收集
- 写输出:写变量值,若输入有
missing_value属性则在输出变量上写同名属性。 - 写 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 坐标。 |
复现要点
- 输入至少需要两个 Time 点;源码直接使用
time(2)-time(1)。 - 自动 Ls 步长采用一组阈值赋值。
- 缺失值只按精确等于
missing_value判断;若输入没有missing_value属性,missing变量的值未显式初始化。 - 程序假定 NetCDF 变量顺序中 0D/1D/2D 坐标在 3D/4D 物理变量之前。
- 平均模式只接受小写
y;大写Y会进入插值分支。
待确认
controle(4)是否在所有目标文件中都是起始日;其他页面常见controle槽位约定需交叉核验。valid_range被读取但输出写回逻辑注释掉;是否应保留仍需开发者确认。- GrADS
.ctl用地球 365 日月份近似描述 Ls 轴,适合 GrADS 读取但不是火星日历。 - 变量属性只复制
long_name/title和units,其他属性会丢失。
复现风险
- 输出
_Ls.nc和_Ls.ctl会覆盖同名文件。 - 大文件会一次性读入每个 3D/4D 变量,内存需求较高。
- 输入变量顺序、维度名或 missing value 约定不符合源码假设时,输出可能不可信。
- 插值模式在目标 Ls 超出输入范围时写 missing;平均模式窗口无样本也写 missing。
相关页面
- util/index.md - util 后处理工具总览。
- concatnc.md - 常见上游时间拼接工具。
- localtime.md - 另一个时间坐标重排工具。