interp_line.F

路径

LMDZ.MARS\libf\phymars\interp_line.F

所属目录 / 模块

libf\phymars

文件定位

interp_line.F 定义 interp_line_mod 模块和 interp_line 子程序,是一个通用的线性插值工具例程。它被 soil_settings.Flect_start_archive.F 调用,用于在有序的源数据点之间进行线性插值,或在目标点超出源数据范围时使用最近的边界值。

本例程的核心功能是:给定源数据 (x1, y1) 和目标横坐标 x2,计算对应的插值结果 y2。当 x2 超出 x1 的范围时,不做外推,而是使用最近的边界值。

定义的符号

符号 类型 行号 作用
interp_line_mod module 1 封装线性插值工具例程
interp_line subroutine 7 在有序源数据点之间进行线性插值

依赖的模块

use 模块 only 列表 用途 待确认
- - -

调用的关键例程

被调用例程 所在模块 / 文件 调用位置 作用
- - 本例程只使用内在函数和数组循环,不调用其他用户例程

输入

输入 来源 类型/维度 单位 含义
x1 调用方 real (len1) - 源数据的有序横坐标数组
y1 调用方 real (len1) - 源数据在 x1 处的值
len1 调用方 integer scalar - 源数据数组长度
x2 调用方 real (len2) - 目标横坐标数组(有序)
len2 调用方 integer scalar - 目标数组长度

输出

输出 去向 类型/维度 单位 含义
y2 调用方 real (len2) - x2 处的插值结果

共享状态与副作用

核心逻辑

  1. 对每个目标点 x2(i)
    • 边界检查:若 x2(i) 超出 x1 的范围(即 (x2(i) ≤ x1(1) 且 x2(i) ≤ x1(len1))(x2(i) ≥ x1(1) 且 x2(i) ≥ x1(len1))):
      • 使用最近的边界值:若 |x2(i) - x1(1)| < |x2(i) - x1(len1)|,则 y2(i) = y1(1),否则 y2(i) = y1(len1)
    • 内部插值:否则,找到包含 x2(i) 的区间 [x1(j), x1(j+1)],进行线性插值:
      y2(i) = ((x2(i) - x1(j)) / (x1(j+1) - x1(j))) * y1(j+1)
            + ((x2(i) - x1(j+1)) / (x1(j) - x1(j+1))) * y1(j)

伪代码

interp_line(x1, y1, len1, x2, y2, len2):
    for i in 1..len2:
        if x2(i) is outside [x1(1), x1(len1)]:
            if |x2(i) - x1(1)| < |x2(i) - x1(len1)|:
                y2(i) = y1(1)
            else:
                y2(i) = y1(len1)
        else:
            for j in 1..len1-1:
                if x2(i) is in [x1(j), x1(j+1)]:
                    y2(i) = linear_interpolation(x1(j), y1(j), x1(j+1), y1(j+1), x2(i))

参与的主题流程

主题 参与方式
土壤设置 soil_settings.F 调用本例程进行土壤参数插值
初始场读取 lect_start_archive.F 调用本例程进行初始数据插值

写法特点

复现要点

待确认

相关页面