Пример 6.6 Этот пример показывает, как могут использоваться в прикладной программе функции формирования решетки и функции запроса. Дифференциальные уравнения в частных производных, например, уравнение Пуассона, могут быть решены на прямоугольной решетке. Сначала процессы располагаются в двумерной структуре. Каждый процесс затем запрашивает номера соседей в четырех направлениях (вверх, вниз, вправо, влево). Числовая задача решается итерационным методом, детали которого скрыты в подпрограмме.
На каждой итерации каждый процесс вычисляет новые значения для функции в области решетки, за которую он ответственен. Затем процесс на своих границах должен обменяться значениями функции с соседними процессами. Например, подпрограмма обмена может содержать вызов функции MPI_SEND(..., neigh_rank (1), ...) , чтобы затем послать модифицированные значения функции левому соседу (i-1, j).
Integer ndims, num_neihg
Logical reorder
Parameter (ndims=2,num_neigh=4,reorder=.true.)
Integer comm, comm_cart, dims (ndims), neigh_def (ndims), ierr
Integer neigh_rank (num_neigh), own_position (ndims), i,j
Logical periods (ndims)
Real*8 u(0:101,0:101), f(0:101,0:101)
Data dims /ndims*0/
Comm = MPI_COMM_WORLD
C устанавливает размер решетки и периодичность
Call MPI_DIMS_CREATE (comm, ndims, dims, ierr)
Periods (1) = .TRUE.
Periods (2) = .TRUE.
C создает структуру решетки в группе WORLD
C и запрашивает собственную позицию
Call MPI_CART_CREATE (comm, ndims, dims,
periods, reorder, comm_cart, ierr)
Call MPI_CART_GET (comm_cart, ndims, dims, periods, own_position, ierr)
C просматривает номера соседей. Собственные координаты есть
C (i,j). Соседями являются процессы с номерами
C (i-1,j), (i+1,j), (i,j-1), (i,j+1)
I = own_position(1)
J = own_position(2)
Neigh_def(1)= i-1
Neigh_def(2)= j
Call MPI_CART_RANK (comm_cart, neigh_def, neigh_rank(1), ierr)
Neigh_def(1)= i+1
Neigh_def(2)= j
Call MPI_CART_RANK (comm_cart, neigh_def, neigh_rank(2), ierr)
Neigh_def(1)= i
Neigh_def(2)= j-1
Call MPI_CART_RANK (comm_cart, neigh_def, neigh_rank(3), ierr)
Neigh_def(1)= i
Neigh_def(2)= j+1
Call MPI_CART_RANK (comm_cart, neigh_def, neigh_rank(4), ierr)
C инициализация функций решеток и начало итерации
Call init (u,f)
Do 10 it=1,100
Call relax (u,f)
C обмен данными с соседними процессами
сall exchange (u, comm_cart, neigh_rank, num_neigh)
10 continue
call output (u)
end