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 超出范围时为端点常数

共享状态与副作用

核心逻辑

  1. y=0.(第 29 行)。
  2. 下界外推(第 30–32 行):若 x ≤ xd(1)x ≤ xd(nd)(低于两端):升序取 y=yd(1);降序取 y=yd(nd)
  3. 上界外推(第 33–35 行):若 x ≥ xd(1)x ≥ xd(nd)(高于两端):升序取 y=yd(nd);降序取 y=yd(1)
  4. 区间内线性插值(第 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 退出。
  5. 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 气压层

写法特点

复现要点

待确认

相关页面