Advertisement
Guest User

Untitled

a guest
Mar 21st, 2017
65
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. program jacobi_parallel
  2. implicit none
  3. include "mpif.h"
  4. real, dimension(0:10001) :: x,newx, z
  5. real :: dx2
  6. integer :: n, noiters, i, k
  7. integer :: p, me, ln, lm, tag, ierr
  8. integer, dimension(MPI_STATUS_SIZE) :: status
  9. ! ¬вод исходных данных
  10.  open(unit = 12, file = "laplace1d.in")
  11. ! Number of cells
  12.  read(12,  *)  n
  13. ! Number of iterations
  14.  read(12,  *)  noiters
  15.  close(12)
  16.  
  17. dx2 = (1. / n)**2
  18.  
  19. call MPI_Init(ierr)
  20.  
  21. call MPI_Comm_rank(MPI_COMM_WORLD, me, ierr)
  22. call MPI_Comm_size(MPI_COMM_WORLD, p, ierr)
  23.  
  24. tag = 0
  25. ln = n / p
  26.  
  27. do i = 1, ln
  28.  x(i) = 1.0
  29. enddo
  30.  
  31. if(me == 0) then
  32. x(0) = 0.0; lm = 0
  33. else
  34. lm = ln * me
  35. endif
  36.  
  37. if(me == p - 1) then
  38. x(ln + 1) = 0.0
  39. endif
  40. do k = 1, noiters
  41. ! ѕересылки граничных значений
  42.  if(me - 1 >= 0) call MPI_Send(newx(1), 1, MPI_REAL, me - 1, tag, MPI_COMM_WORLD, ierr)
  43.  if(me + 1 < p)  call MPI_Recv(x(ln + 1), 1, MPI_REAL, me + 1, tag, MPI_COMM_WORLD, status, ierr)
  44.  tag = tag + 1
  45.  if(me + 1 < p)  call MPI_Send(newx(ln), 1, MPI_REAL, me + 1, tag, MPI_COMM_WORLD, ierr)
  46.  if(me - 1 >= 0) call MPI_Recv(x(0), 1, MPI_REAL, me - 1, tag, MPI_COMM_WORLD, status, ierr)
  47.  tag = tag + 1
  48. ! »терации якоби
  49.  do i = 1, ln
  50.   newx(i) = 0.5 * (x(i - 1) + x(i + 1))
  51.   !newx(i) = 0.5 * (x(i - 1) + x(i + 1) - dx2 * x(i))
  52.  enddo
  53.  
  54.  do i = 1, ln
  55.   x(i) = newx(i)
  56.  enddo
  57. enddo
  58. ! —обираем решение
  59. if(me == 0) then
  60.   do i = 1, ln
  61.    z(i) = x(i)
  62.   enddo
  63.   do k = 1, p - 1
  64.    lm = ln * k
  65.    call MPI_Recv(z(lm), ln, MPI_REAL, k, k, MPI_COMM_WORLD, status, ierr)  
  66.   enddo
  67.  else
  68.    call MPI_Send(x(1), ln, MPI_REAL, 0, me, MPI_COMM_WORLD, ierr)
  69.  endif
  70.  
  71. call MPI_Finalize(ierr)
  72. ! «апись результата в файл
  73. if(me == 0) then
  74.  open(unit = 11, file = "laplace1d_parallel.dat", status = "NEW")
  75.   write(11, "(2x, e8.3)") (z(i),   i = 1, n)
  76.  close(11)
  77. endif
  78. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement