Высокопроизводительные вычисления на кластерах. Беликов Д.А - 189 стр.

UptoLike

189
Integer dims(1:2), coords(1:2)
Parameter (Nx=720, Ny=Nx)
Double precision ap, ae, aw, an, as, hx, hy, Lx, Ly,
1 T(0:Nx+1,0:Ny+1), Tnew(0:Nx+1,0:Ny+1), alfa,
2 tau, time, timefin, timeStart, timeStop,
3 timeStart1, timeStop1, timeStart2, timeStop2,
4 Tpas(0:(Nx+2)*(Ny+2))
Logical period(1:2)
Parameter (timefin=1.0d3, Lx=1.0d0, Ly=1.0d0,
1 hx=Lx/(Nx+1), hy=Ly/(Ny+1), alfa=1.0d-5)
c Инициализация, определение числа выделенных процессоров
c (size) и номера текущего процесса (rank)
Call MPI_INIT(ierr)
Call MPI_comm_size(mpi_comm_world, size, ierr)
Call MPI_comm_rank(mpi_comm_world, rank, ierr)
c Определение числа элементов, обрабатываемых одним
c процессорным элементом
idim = int(sqrt(real(size)))
kdim = int(sqrt(real(size)))
If ( (idim*kdim).ne.(size) ) then
Idim = int(sqrt(real(size/2)))
Kdim = 2*idim
End if
If ( (idim*kdim).ne.(size) ) then
If (rank.eq.0) Write (*,*) 'Incorrect dimensions'
Stop 'Program terminated'
End if
dims(1) = idim
dims(2) = kdim
period(1) = .false.
period(2) = .false.
call MPI_CART_CREATE(mpi_comm_world,2,dims,period,
1 .true.,comm,ierr)
call MPI_COMM_RANK(comm, rank, ierr)
call MPI_CART_COORDS(comm, rank, 2, coords, ierr)
icoor=coords(1)
kcoor=coords(2)
is=Nx/idim
ks=Ny/kdim
Call MPI_CART_SHIFT(comm, 0, 1, left, right, ierr)