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 交换 zqzm。相比 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 一致性。

核心流程

  1. 首次调用时分配 zm/mw/zq,尺寸覆盖本地水平网格、垂直层和全部 tracer。
  2. 设置两个 halo 请求 tag,准备分方向 split。
  3. 对每个 tracer 根据 iadv 和父子关系复制 qmasse、flux 到工作数组。
  4. 第一组 x pass:普通 tracer 调 vlx_p,饱和 tracer 调 vlxqs_p;随后注册 halo。
  5. 发送 request 100,计算剩余区域并等待 halo。
  6. 进入 y pass,按普通/饱和分支调 vly_pvlyqs_p
  7. z pass 调 vlz_p,注册并发送 request 101。
  8. 等待 z halo 后执行第二 y pass 和第二 x pass。
  9. 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

复现要点

待确认

相关页面