这个问题的背景在于一些计算领域,比如计算流体力学(CFD)。在某些关键区域,我们经常需要更细的网格,而背景网格可以更粗。例如,在气象学中跟踪冲击波和嵌套域的自适应细化网格。使用笛卡尔拓扑结构,并且将域分解如下图所示。在这种情况下,使用4*2=8个处理器。单个数字表示处理器的等级,(x,y)表示其拓扑坐标。
假设在等级为2、3、4、5(中间位置)的区域中细化了网格,并且在本例中定义了局部细化比率R=D_coarse/D_fine=2。由于网格被细化,因此时间推进也应该被细化。这需要在细化区域计算时间步长t、t+1/2*dt、t+dt,而在全局区域只计算时间步长t和t+dt。这需要一个更小的通信器,其中仅包括中间等级的排名进行额外计算。以下是全局等级+坐标和相应的本地等级(红色)示意图:
然而,我在实现这个方案时遇到了一些错误,并且Fortran的代码片段(不完整)如下:
当我运行程序时,问题出在“****获取本地通信器等级”步骤。我的想法是建立两个通信器:全局通信器和本地通信器,本地通信器嵌入在全局通信器中。然后在全局和本地通信器中分别创建它们的对应拓扑关系。我不知道我的概念是否正确或语法是否有误。如果您能给我一些建议,非常感谢。
错误信息为:
![Fig 1. Basic topology](https://istack.dev59.com/FpJbH.webp)
![Local refinement and their ranks and topological coordinate](https://istack.dev59.com/Q6M1c.webp)
integer :: global_comm, local_comm ! global and local communicators
integer :: global_rank, local_rank !
integer :: global_grp, local_grp ! global and local groups
integer :: ranks(4) ! ranks in the refined region
integer :: dim ! dimension
integer :: left(-2:2), right(-2:2) ! ranks of neighbouring processors in 2 directions
ranks=[2,3,4,5]
!---- Make global communicator and their topological relationship
call mpi_init(ierr)
call mpi_cart_create(MPI_COMM_WORLD, 2, [4,2], [.false., .false.], .true., global_comm, ierr)
call mpi_comm_rank(global_comm, global_rank, ierr)
do dim=1, 2
call mpi_cart_shift(global_comm, dim-1, 1, left(-dim), right(dim), ierr)
end do
!---- make local communicator and its topological relationship
! Here I use group and create communicator
! create global group
call mpi_comm_group(MPI_COMM_WORLD, global_grp, ierr)
! extract 4 ranks from global group to make a local group
call mpi_group_incl(global_grp, 4, ranks, local_grp, ierr)
! make new communicator based on local group
call mpi_comm_create(MPI_COMM_WORLD, local_grp, local_comm, ierr)
! make topology for local communicator
call mpi_cart_create(global_comm, 2, [2,2], [.false., .false.], .true., local_comm, ierr)
! **** get rank for local communicator
call mpi_comm_rank(local_comm, local_rank, ierr)
! Do the same thing to make topological relationship as before in local communicator.
...
当我运行程序时,问题出在“****获取本地通信器等级”步骤。我的想法是建立两个通信器:全局通信器和本地通信器,本地通信器嵌入在全局通信器中。然后在全局和本地通信器中分别创建它们的对应拓扑关系。我不知道我的概念是否正确或语法是否有误。如果您能给我一些建议,非常感谢。
错误信息为:
*** An error occurred in MPI_Comm_rank
*** reported by process [817692673,4]
*** on communicator MPI_COMM_WORLD
*** MPI_ERR_COMM: invalid communicator
*** MPI_ERRORS_ARE_FATAL (processes in this communicator will now abort,
*** and potentially your MPI job)
ierr
获取操作的状态,你尝试过在每个操作和每个进程中检查它们以验证到目前为止所有操作是否确实正常工作了吗? - d_1999local_comm
?(例如,首先使用mpi_comm_create()
,然后使用mpi_cart_create()
) - Gilles Gouaillardetmpi_cart_create()
步骤中,我应该使用local_comm
作为旧通信器来创建一个新的笛卡尔通信器。谢谢。 - Yongxin