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_p、vlyqs_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 |
交换 zq 与 zm 的邻接带。 |
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 |
性能计时状态,非物理状态。 |
核心流程
- 调用
tpot2t_glo_p(teta,tempe,pk) 得到全局并行温度场。
- 根据温度、压力和目标 tracer 计算饱和比湿
qsat。
- 为两个 halo 请求设置 tag 100 和 101。
- 对 x 方向先计算南北边界带,注册
zq/zm halo 并异步发送。
- 计算 x 方向内区,等待接收,进入 y 方向输送。
- 对 z 方向重复边界带、halo、内区、等待的模式。
- 再做第二次 y 方向,最后做第二次 x 方向,形成 x-y-z-y-x split。
- 等待两个发送请求完成,把工作数组结果写回
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 |
复现要点
- 复现并行结果时,必须在 x 和 z 两次方向输送后交换
zq 和 zm,否则 y pass 看到的邻接值会错。
vlxqs_p 的 ijb_x/ije_x 允许只计算子域的一段,这是边界带/内区重叠的基础。
- 饱和约束依赖
qsat,不能把非饱和 vlsplt_p 的内核替换到这里。
待确认
qsat 的具体公式在本文件内展开,但其物理常数来源需要和水汽/热力学任务进一步确认。
- Mars 默认并行构建是否常走本文件取决于 tracer 配置和
iadv 选择。
相关页面