vlspltgen_p.F
路径
LMDZ.COMMON-6.3\LMDZ.COMMON\libf\dyn3dpar\vlspltgen_p.F
文件定位
vlspltgen_p.F 是并行动力中的通用 tracer Van Leer split 输送调度器。它遍历 tracer,按 iadv 和 tracer 父子关系选择普通 vlx_p/vly_p/vlz_p、饱和 vlxqs_p/vlyqs_p 或其他兼容分支,并在 x/z 两段后通过 mod_hallo 交换 zq、zm。相比 vlspltqs_p.F,本文件覆盖多 tracer、多 advection scheme 和 isotope 检查。
Mars 运行参与度
条件经过:Mars 并行动力 tracer advection 的通用入口之一;是否经过取决于并行 leapfrog/advtrac_p 选择的 split transport 路径和 tracer `iadv`。
定义的符号
| 符号 |
类型 |
行号 |
作用 |
vlspltgen_p |
subroutine |
4 |
并行多 tracer split advection 调度。 |
依赖
| use 模块 |
关键符号 |
用途 |
parallel_lmdz |
domain 边界 |
本地网格分段。 |
mod_hallo |
halo 请求 API |
交换 tracer 和质量工作数组。 |
Write_Field_p |
调试输出 |
并行场输出,主要用于诊断。 |
VAMPIR |
VTb/VTe |
计时。 |
infotrac |
nqtot, nqperes, nqdesc, nqfils, iqfils, isotope 检查 |
tracer 父子层级和一致性检查。 |
comconst_mod |
cpp |
热力学相关兼容常量。 |
工作数组和保存状态
| 状态 |
维度 |
说明 |
zm |
ip1jmp1,llm,nqtot |
每个 tracer 对应的质量工作数组。 |
mw |
ip1jmp1,llm+1,nqtot |
垂直质量通量工作数组。 |
zq |
ip1jmp1,llm,nqtot |
tracer 工作副本。 |
firstcall |
SAVE, THREADPRIVATE |
控制首次分配,OpenMP 线程私有。 |
调用关系
| 被调用例程 |
作用 |
vlx_p, vly_p, vlz_p |
普通 Van Leer split 三方向输送。 |
vlxqs_p, vlyqs_p |
饱和 tracer 的 x/y 方向输送。 |
Register_Hallo, SendRequest, WaitRequest |
x/z pass 后交换 halo。 |
check_isotopes |
在多个阶段检查 isotope tracer 一致性。 |
核心流程
- 首次调用时分配
zm/mw/zq,尺寸覆盖本地水平网格、垂直层和全部 tracer。
- 设置两个 halo 请求 tag,准备分方向 split。
- 对每个 tracer 根据
iadv 和父子关系复制 q、masse、flux 到工作数组。
- 第一组 x pass:普通 tracer 调
vlx_p,饱和 tracer 调 vlxqs_p;随后注册 halo。
- 发送 request 100,计算剩余区域并等待 halo。
- 进入 y pass,按普通/饱和分支调
vly_p 或 vlyqs_p。
- z pass 调
vlz_p,注册并发送 request 101。
- 等待 z halo 后执行第二 y pass 和第二 x pass。
- 把
zq 写回 q,必要处执行 isotope 检查。
伪代码
if firstcall:
allocate zm, mw, zq for nqtot
for iq in tracers:
copy q and mass/fluxes to work arrays
choose ordinary or saturated x kernel
exchange x halo
for iq in tracers:
run y kernel
run z kernel and exchange z halo
for iq in tracers:
run second y and x kernels
copy zq back to q
check isotope consistency at guarded points
复现要点
nqperes/nqfils/iqfils 决定父 tracer 与子 tracer 的同步方式;复现时不能只按 iq=1:nqtot 独立处理。
firstcall 是 THREADPRIVATE,多线程下每个线程都可能执行自己的首次分配。
- 本文件把饱和分支嵌入通用 tracer 调度;独立
vlspltqs_p.F 更像特化入口。
待确认
相关页面