vlspltqs_p.F

路径

LMDZ.COMMON-6.3\LMDZ.COMMON\libf\dyn3dpar\vlspltqs_p.F

文件定位

vlspltqs_p.F 定义并行版饱和水汽 Van Leer split 输送。它只处理带饱和约束的 tracer 分支,主例程 vlspltqs_p 先把位温转换为温度并计算 qsat,再按 x-y-z-y-x 的 Strang split 顺序调用内部 vlxqs_pvlyqs_p 和公共 vlz_p。并行版在 x/z 两段之间注册 halo 交换,使边界带和内区计算可以分开执行。

Mars 运行参与度

条件经过:Mars 并行动力构建在 tracer 输送选择饱和水汽 Van Leer 分支时经过。串行或非饱和 tracer 路径不会直接调用本文件。

定义的符号

符号 类型 行号 作用
vlspltqs_p subroutine 4 并行饱和 tracer split advection 调度。
vlxqs_p internal subroutine 230 x 方向饱和约束 Van Leer 输送。
vlyqs_p internal subroutine 576 y 方向饱和约束 Van Leer 输送。

依赖和调用

类别 符号 用途
parallel_lmdz domain 范围、ij_begin/ij_end 限定本 MPI/OMP 子域计算范围。
mod_hallo Register_Hallo, SendRequest, WaitRecvRequest, WaitSendRequest 交换 zqzm 的邻接带。
VAMPIR VTb, VTe halo 段计时。
cpdet_mod tpot2t_glo_p teta/pk 转为温度,供饱和比湿计算。
公共输送内核 vlz_p z 方向 split 输送。

输入、输出和状态

参数/状态 方向 说明
q inout tracer mixing ratio,目标 tracer 与其子 tracer 会被更新。
pente_max in Van Leer slope limiter 上限。
masse, pbaru, pbarv, w in 气柱质量和三方向质量通量。
pdt, teta, pk in 温度转换和饱和约束所需状态。
zq, zm, mu, mv, mw, qsat local 工作数组;qsat 由温度和压力状态推得。
SAVE testcpu/temps* saved 性能计时状态,非物理状态。

核心流程

  1. 调用 tpot2t_glo_p(teta,tempe,pk) 得到全局并行温度场。
  2. 根据温度、压力和目标 tracer 计算饱和比湿 qsat
  3. 为两个 halo 请求设置 tag 100 和 101。
  4. 对 x 方向先计算南北边界带,注册 zq/zm halo 并异步发送。
  5. 计算 x 方向内区,等待接收,进入 y 方向输送。
  6. 对 z 方向重复边界带、halo、内区、等待的模式。
  7. 再做第二次 y 方向,最后做第二次 x 方向,形成 x-y-z-y-x split。
  8. 等待两个发送请求完成,把工作数组结果写回 q

伪代码

temperature = tpot2t_glo_p(teta, pk)
qsat = saturation(temperature, pressure)
prepare zq, zm and mass fluxes
compute x boundary strips
exchange halo(zq, zm) with request 100
compute x interior
wait recv request 100
compute y pass
compute z boundary strips
exchange halo(zq, zm) with request 101
compute z interior
wait recv request 101
compute second y pass
compute final x pass
wait send requests
copy zq back to q

与串行版本差异

方面 串行 vlspltqs.F 并行 vlspltqs_p.F
温度转换 tpot2t tpot2t_glo_p
水平范围 全局 ip1jmp1 本地 ij_begin/ij_end 与 halo
边界处理 直接全域数组循环 x/z 方向拆边界带与内区,并注册 halo
等待语义 无 MPI 请求 WaitRecvRequest/WaitSendRequest

复现要点

待确认

相关页面