interp_vert.F
路径
LMDZ.MARS\libf\dynphy_lonlat\phymars\interp_vert.F
所属目录/模块
libf/dynphy_lonlat/phymars
文件定位
垂直坐标线性插值例程。将 GCM 变量从旧垂直离散化方案插值到新的垂直离散化方案,用于混合 σ-p 坐标系下的垂直重映射。典型应用场景包括读取初始场(restart)时,初始文件的垂直层与当前模拟的垂直层不一致,需要插值对齐。
作者:Francois Forget(1995-01),混合坐标修改(2003-03)。
定义的符号
| 符号 | 类型 | 行号 | 作用 |
|---|---|---|---|
interp_vert |
subroutine | 2 | 将变量从旧垂直网格线性插值到新垂直网格 |
依赖的模块
无 USE 依赖,无 INCLUDE。该例程为完全自包含的纯数值计算过程。
调用的关键例程
无外部调用。
输入
| 输入 | 来源 | 类型/维度 | 单位 | 含义 |
|---|---|---|---|---|
lmo |
参数 | integer |
— | 旧垂直层数 |
lmn |
参数 | integer |
— | 新垂直层数 |
apso |
参数 | real(lmo) |
Pa | 旧混合坐标 midlayer a 系数 |
bpso |
参数 | real(lmo) |
— | 旧混合坐标 midlayer b 系数 |
aps |
参数 | real(lmn) |
Pa | 新混合坐标 midlayer a 系数 |
bps |
参数 | real(lmn) |
— | 新混合坐标 midlayer b 系数 |
ps |
参数 | real(Nhoriz) |
Pa | 各水平点地表气压 |
Nhoriz |
参数 | integer |
— | 水平点数 |
varo |
参数 | real(Nhoriz, lmo) |
任意 | 旧垂直网格上的变量值 |
输出
| 输出 | 去向 | 类型/维度 | 单位 | 含义 |
|---|---|---|---|---|
varn |
参数 | real(Nhoriz, lmn) |
同 varo |
新垂直网格上插值后的变量值 |
共享状态与副作用
无。不读写任何模块变量或公共块,不产生文件 I/O 或诊断输出。
核心逻辑
- 对每个水平点
n = 1..Nhoriz: - 计算新网格的 sigma 坐标:
sigmn(ln) = aps(ln)/ps(n) + bps(ln),ln = 1..lmn - 计算旧网格的 sigma 坐标:
sigmo(lo) = apso(lo)/ps(n) + bpso(lo),lo = 1..lmo - 对每个新层
ln = 1..lmn,按 sigma 值在旧网格中定位并插值:- 若
sigmn(ln) >= sigmo(1)(新层在旧网格顶部之上):取旧顶层值varo(n,1) - 若
sigmn(ln) <= sigmo(lmo)(新层在旧网格底部之下):取旧底层值varo(n,lmo) - 否则:找到
lo使得sigmo(lo+1) < sigmn(ln) <= sigmo(lo),线性插值varn = varo(lo) + coef * (varo(lo+1) - varo(lo)),其中coef = (sigmn(ln) - sigmo(lo)) / (sigmo(lo+1) - sigmo(lo))
- 若
伪代码
FOR each horizontal point n:
Compute sigma levels for new grid: sigmn(ln) = aps(ln)/ps(n) + bps(ln)
Compute sigma levels for old grid: sigmo(lo) = apso(lo)/ps(n) + bpso(lo)
FOR each new level ln:
IF new sigma >= top of old grid:
varn(n,ln) = varo(n, 1) -- 顶层外推
ELSE IF new sigma <= bottom of old grid:
varn(n,ln) = varo(n, lmo) -- 底层外推
ELSE:
Find bracketing old levels lo, lo+1
coef = linear interpolation weight
varn(n,ln) = varo(n,lo) + coef * (varo(n,lo+1) - varo(n,lo))
调用方
| 调用方 | 所在文件 | 行号 | 用途 |
|---|---|---|---|
lect_start_archive |
lect_start_archive.F |
1528, 1538, 1550, 1558, 1598 | 读取初始场时,将 restart 文件中的变量(温度、风场、示踪剂等)从旧垂直层插值到当前模拟垂直层 |
参与的主题流程
| 主题 | 参与方式 |
|---|---|
| 初始场读取与垂直重映射 | 在 lect_start_archive 中将 restart 文件的垂直层插值到当前模拟层 |
写法特点
- 固定格式 Fortran 77(
.F后缀但使用 f77 风格缩进与列格式) - 无模块依赖:完全自包含,不 USE 任何模块,不使用 INCLUDE
- 坐标约定:sigma 坐标从上到下递增(
sigmo(1)为顶,sigmo(lmo)为底),与混合坐标sigma = a/p_s + b的定义一致 - 边界处理:超出旧网格范围时取最近层值(零阶外推),不做外推
- 混合坐标:同时使用
ap(气压部分)和bp(sigma 部分),通过地表气压ps计算实际 sigma 值
复现要点
- 输入
apso/bpso和aps/bps分别为旧/新网格的混合坐标系数 - 需要地表气压
ps将混合坐标转换为 sigma 坐标 - 插值为逐点独立(水平方向无耦合),可并行化
待确认
- 当前实现为逐列串行循环,是否存在 OpenMP 并行版本待确认
相关页面
- lect_start_archive — 唯一调用方,在初始场读取中调用
interp_vert进行垂直插值 - dynphy_lonlat/index — 所属目录概览