advxp/advyp/advzp Prather 内核组
输入范围
LMDZ.COMMON-6.3\LMDZ.COMMON\libf\dyn3d_common\advxp.F
LMDZ.COMMON-6.3\LMDZ.COMMON\libf\dyn3d_common\advyp.F
LMDZ.COMMON-6.3\LMDZ.COMMON\libf\dyn3d_common\advzp.F
文件定位
这组三个固定格式 Fortran 文件实现 Prather/SOM moments 输送的 x/y/z 方向内核。名称带 p,但文件位于 dyn3d_common,用于 COMMON 的 Prather moments 方向搬运逻辑,而不是 dyn3dpar 专属 MPI halo 层。
Mars 运行参与度
条件经过:Mars 或 COMMON 运行选择 Prather/SOM moments advection scheme 时经过;默认 tracer 输送是否进入本组取决于 `infotrac` 的 `iadv` 配置和上层调度。
例程清单
| 文件 | 行数 | 例程 | 方向 | 主要通量 |
|---|---|---|---|---|
advxp.F |
648 | ADVXP |
x | PBARU(iip1,jjp1,llm) |
advyp.F |
651 | ADVYP |
y | PBARV(iip1,jjm,llm) |
advzp.F |
376 | ADVZP |
z | W(iip1,jjp1,llm) |
共同接口
三者都接收 limiter 开关、方向时间步、质量 SM、均值 S0 和 moments/slopes 数组 SSX/SY/SZ/SSXX/SSXY/SSXZ/SYY/SYZ/SZZ,并按方向通量把 moments 在相邻格点间移动。ntra 是 tracer 维度,调用方需要保证传入数组已经按 Prather 格式初始化。
ADVXP
ADVXP 处理周期 x 方向。它把 pbaru(i,j,l) 反转到 ugri(i,j,llm+1-l),对每个垂直层和纬向行按 PBARU 的符号决定从左格或右格向相邻格搬运 moments。代码包含极区扩展区聚合逻辑,通过 NUM(K) 把极点附近多个 i 方向格点合并处理。
复现要点:
- x 方向是周期边界,
I=1与I=IIM相邻。 LIMIT为真时会限制 x 方向 moments,防止更新后出现负质量或过冲。- 末尾保留
sqi诊断打印/检查痕迹,主要用于调试守恒误差。
ADVYP
ADVYP 处理 y 方向。它把 pbarv(i,j,l) 转为 vgri(i,j,llm+1-l)=-pbarv(i,j,l),并将南北边界外的 vgri(:,0,:) 与 vgri(:,jjp1,:) 设为 0。极点附近存在专门的 north/south moments 汇总变量,例如 sbms/sfms/sfzs/sbmn/sfmn/sfzn。
复现要点:
- y 通量符号在构造
vgri时取负,因此方向判断不能直接套用pbarv原符号。 - 极点行不是普通纬向行,代码对极区 moments 做汇总再分配。
- limiter 主要作用于
SY/SYY/SSXY/SYZ相关项。
ADVZP
ADVZP 处理垂直方向。它把 w(i,j,l) 转为 wgri(i,j,llm+1-l),并设置 wgri(:,:,0)=0。主循环遍历垂直接口 L=1,NIV-1,根据 WGRI 符号在 L 和 LP=L+1 两层之间搬运 moments。
复现要点:
- 垂直索引在入口通量到内部
wgri时反向。 - limiter 主要作用于
SZ/SZZ/SSXZ/SYZ。 - 注释中对符号和
0:llm边界有历史疑问,复现时应以当前数组赋值和循环边界为准。
与串行 advx/advy/advz 的区别
advx/advy/advz 是 slope/limiter advection 内核;本页的 advxp/advyp/advzp 维护 Prather moments,包括一阶和二阶矩数组。两组都在 dyn3d_common,但不能互换:调用方必须按 tracer advection scheme 选择对应格式。
待确认
- 本组在当前 Mars 默认 tracer 配置中是否实际启用,需要结合
infotrac的iadv和上层 advection 分支确认。 ADVZP注释中的符号疑问应在具体测试或原始算法说明中确认。