intrplf.F
路径
LMDZ.MARS\libf\aeronomars\intrplf.F
所属目录/模块
libf\aeronomars
文件定位
intrplf.F 定义 intrplf_mod,提供例程 intrplf:一维线性插值器。给定已知数据 (xd,yd)(长度 nd),求查询点 x 处的 y=f(x);超出 xd 范围时取端点常数外推。支持 xd 升序或降序排列。该例程自包含(无 use 依赖),由 inichim_newstart 在化学初始场构造中插值成分廓线。
定义的符号
| 符号 |
类型 |
行号 |
作用 |
intrplf_mod |
module |
1(END MODULE 51) |
包装一维插值例程的模块 |
intrplf |
subroutine |
8(END SUBROUTINE 49) |
一维线性插值,端点常数外推 |
依赖的模块
| use 模块 |
only 列表 |
用途 |
待确认 |
| 无 |
- |
- |
自包含,无 use 依赖 |
调用的关键例程
| 被调用例程 |
所在模块/文件 |
调用位置 |
作用 |
| 无外部例程 |
- |
- |
仅线性搜索与算术运算 |
输入
| 输入 |
来源 |
类型/维度 |
含义 |
x |
调用方 |
real |
查询点 |
xd(nd) |
调用方 |
real |
已知自变量数组(可升序或降序) |
yd(nd) |
调用方 |
real |
已知函数值数组 |
nd |
调用方 |
integer |
数据点数 |
输出
| 输出 |
去向 |
类型 |
含义 |
y |
调用方 |
real |
插值结果;x 超出范围时为端点常数 |
共享状态与副作用
- 无模块级共享变量、无
SAVE/THREADPRIVATE、无文件 I/O、无诊断打印、无 abort。
- 哑元均有
intent(x/xd/yd/nd 为 in,y 为 out)。
- 局部
y_undefined=1.e20(第 27 行)赋值后未被使用(见待确认)。
核心逻辑
y=0.(第 29 行)。
- 下界外推(第 30–32 行):若
x ≤ xd(1) 且 x ≤ xd(nd)(低于两端):升序取 y=yd(1);降序取 y=yd(nd)。
- 上界外推(第 33–35 行):若
x ≥ xd(1) 且 x ≥ xd(nd)(高于两端):升序取 y=yd(nd);降序取 y=yd(1)。
- 区间内线性插值(第 37–44 行):
do i=1,nd-1,找到包含 x 的区间(同时匹配升/降序方向):y=yd(i)+(x-xd(i))*(yd(i+1)-yd(i))/(xd(i+1)-xd(i)),goto 99 退出。
99 continue(第 47 行)。
伪代码
intrplf(x,y,xd,yd,nd):
y = 0.
if x <= xd(1) and x <= xd(nd): # below range
if xd(1) < xd(nd): y = yd(1)
if xd(1) >= xd(nd): y = yd(nd)
else if x >= xd(1) and x >= xd(nd): # above range
if xd(1) < xd(nd): y = yd(nd)
if xd(1) >= xd(nd): y = yd(1)
else: # within range
for i = 1..nd-1:
if x in [xd(i), xd(i+1)] (either direction):
y = yd(i) + (x-xd(i))*(yd(i+1)-yd(i))/(xd(i+1)-xd(i))
break
参与的主题流程
| 主题 |
参与方式 |
| 化学初始化 |
inichim_newstart 用其把初始成分体积混合比从参考气压网格插值到 GCM 气压层 |
写法特点
- 固定格式
.F,续行用第 6 列 &。
- 同时支持
xd 升序与降序(用 (x.ge.xd(i)).and.(x.lt.xd(i+1)) 或反向区间判定)。
- 边界外用常数外推(取邻近端点值),而非线性外推。
- 线性搜索 O(nd),无二分;
nd 较大时效率低。
- 局部
y_undefined=1.e20 赋值后未用(疑似遗留)。
- 行 31–36 部分行尾注释(
! yd(1))与实际赋值不符,为陈旧拷贝注释。
复现要点
- 超出
xd 范围时返回端点常数,不外推斜率——复现边界行为时注意。
xd 可升可降,但须单调;非单调 xd 会使搜索取到第一个匹配区间,结果不确定。
- 线性搜索,
nd 大时性能差(化学初始化中 nd 为参考网格层数,通常不大)。
goto 99 控制流为固定格式 Fortran 风格。
待确认
y_undefined=1.e20 设值后未用,是否曾用于未定义标记(当前不影响结果)。
- 行 31–36 陈旧注释是否反映早期不同实现。
相关页面