lslin.F90
路径
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。
相关页面