bands.F90
路径
LMDZ.COMMON-6.3\LMDZ.COMMON\libf\dyn3dpar\bands.F90
文件定位
bands.F90 定义模块 Bands,保存并行动力不同阶段的纬向 band 数量和物理列分布。它可从 Bands_${iim}x${jjm}x${llm}_${mpi_size}prc.dat 读取历史分布,也可根据 timing 统计把 band 从慢 rank 调整到快 rank。
Mars 运行参与度
条件经过:Mars 并行动力入口使用 COMMON dyn3dpar band 分布时经过;串行 Mars 路径不经过。
定义的符号
| 符号 | 类型 | 行号 | 作用 |
|---|---|---|---|
Bands |
module | 4 | band 分布和自适应调整模块。 |
AllocateBands |
subroutine | 20 | 分配所有 rank 的 band 数组。 |
Read_distrib |
subroutine | 34 | 读取或生成默认分布。 |
Set_Bands |
subroutine | 93 | 派生 vanleer2 和 physics 分布。 |
AdjustBands_caldyn |
subroutine | 141 | 根据 caldyn timing 调整 caldyn band。 |
AdjustBands_vanleer |
subroutine | 206 | 根据 Van Leer timing 调整输送 band。 |
AdjustBands_dissip |
subroutine | 272 | 根据耗散 timing 调整 dissip band。 |
AdjustBands_physic |
subroutine | 338 | 根据 physics timing 调整物理列分布。 |
WriteBands |
subroutine | 393 | 写出当前分布文件。 |
模块状态
| 状态 | 说明 |
|---|---|
bands_caldyn=1、bands_vanleer=2、bands_dissip=3 |
band 类型编号。 |
jj_Nb_Caldyn |
caldyn 阶段每个 rank 的纬向 band 数。 |
jj_Nb_vanleer、jj_Nb_vanleer2 |
tracer 输送阶段的分布及派生分布。 |
jj_Nb_dissip |
耗散阶段分布。 |
jj_Nb_physic、jj_Nb_physic_bis |
物理列相关的纬向/辅助分布。 |
distrib_phys |
每个 rank 传给物理初始化的物理列数或起始分配信息。 |
读取和默认分布
Read_distrib 构造文件名 Bands_${iim}x${jjm}x${llm}_${mpi_size}prc.dat。若文件存在,按块读取 caldyn、vanleer、dissip 和 physics 分布;若不存在,则把 jjm+1 个纬向 band 尽量平均分给 MPI ranks,同时把 iim*(jjm-1)+2 个物理列平均分配。
Set_Bands
Set_Bands 依据读取结果补充派生状态:
- 计算
jj_Nb_vanleer2。 - 根据
distrib_phys推导物理侧jj_para_begin/end范围。 - 填写
jj_Nb_physic和jj_Nb_physic_bis,供物理接口和重分布使用。
自适应调整
四个 AdjustBands_* 例程都依赖 times 中的 timer_average/timer_delta/timer_iteration。典型逻辑是:
allgather_timer_average汇总所有 rank 的计时。- 找出当前阶段平均耗时最大和最小的 rank。
- 若慢 rank 的 band 数允许减少,且快 rank 增加一个 band 的预测耗时低于慢 rank 当前耗时,则移动一个 band。
- physics 版本还结合
mod_phys_lmdz_para:klon_mpi_para_nb处理物理列数量。
输出格式
WriteBands 使用和 Read_distrib 相同的文件名,以 formatted 文本写出当前 caldyn、vanleer、dissip 和 physics 分布。并行入口中通常只让 mpi_rank==0 写出,避免多个 rank 同时覆盖文件。
复现要点
- band 数组下标是
0:MPI_Size-1,与 Fortran 默认 1 起始不同。 - 默认分布使用
jjm+1,包含极点 band。 - physics 分布的总列数是
iim*(jjm-1)+2,即中间纬向列加两个极点。 - 调整例程一次最多移动一个 band,避免一次计时噪声导致大幅重排。
待确认
Bands_*prc.dat在典型 Mars 作业中是否被保留并复用,需要运行目录样例确认。jj_Nb_vanleer2的下游使用点应在vlsplt_p或后续并行输送页中继续补全。