190
comm1d, status, ierr)
call MPI_SEND( a(l,s),nx, MPI_DOUBLE_PRECISION,nbrbottom, 1,comm1d, ierr )
call MPI_RECV( a(l,e+l), nx, MPI_DOUBLE_PRECISION, nbrtop, 1,
comm1d, status, ierr )
return
end
В этой процедуре каждый процесс посылает данные процессу
nbrtop, расположенному выше его, и затем принимает данные от про-
цесса
nbrbottom ниже его. Затем порядок меняется на обратный -
данные посылаются процессу ниже и принимаются от процесса, выше
данного.
Опишем все части программы для решения задачи Пуассона. В
основной части программы для назначения процессов разделенным
областям массива будем использовать картезианскую топологию еди-
ничной размерности. Используем процедуру
MPI_CART_CREATE
для создания декомпозиции процессов и процедуру MPE_Decomp1d,
чтобы определить декомпозицию массива. Процедура
ONEDINIT
инициализирует элементы массивов a, f. Решение вычисляется попе-
ременно в массивах
а и b, так как в цикле имеется два обращения к
EXCHNG1 и SWEEP1D. Итерации заканчиваются, когда разница
между двумя смежными значениями аппроксимаций становится
меньше, чем 10
-5
. Разность между двумя локальными частями а и b
вычисляется процедурой DIFF. Процедура MPI_ALLREDUCE нуж-
на, чтобы гарантировать, что во всех процессах достигнута точность
вычислений. Программа печатает как результаты итераций, так и ко-
нечный результат. Цикл
DO с максимумом итераций maxit гаран-
тирует, что программа закончится, даже если итерации не сходятся.
Вычислительная часть программы представлена на рис. 8.2.
! определение нового коммуникатора картезианской топологии
! размерности 1 для декомпозиции процессов
call MPI_CART_CREATE(MPI_COMM_WORLD,1,numprocs, .false., .true,
comm1d, ierr )
! определение позиции процесса в данном коммуникаторе
call MPI_COMM_RANK( comm1d, myid, ierr )
! определение номеров процессов для заполнения теневых точек
call MPI_CART_SHIFT( comm1d, 0, 1, nbrbottom, nbrtop, ierr)
! определение декомпозиции исходного массива
call MPE_DECOMP1D( ny, numprocs, myid, s, e )
! инициализация массивов f и a
call ONEDINIT( а, b, f, nx, s, e )
! Вычисление итераций Якоби , maxit – максимальное число итераций
do 10 it=l, maxit