Advertisement
Guest User

Untitled

a guest
Sep 1st, 2016
64
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.95 KB | None | 0 0
  1. # Jacobi-Iteration Poisson
  2. # n = Dimension der Matrix A (wobei hier n durch Anzahl der Prozesseteilbar sein soll
  3. # mpiexec -np 100 python JacobiParallel.py 1000000
  4. import numpy as np
  5. import sys
  6. import math
  7. from mpi4py import MPI
  8.  
  9. n = int(sys.argv[1])
  10.  
  11. comm = MPI.COMM_WORLD
  12. size = comm.Get_size()
  13. rank = comm.Get_rank()
  14.  
  15. # lokale Groesse der Arrays (zu bearbeitender Block)
  16. local_n = n/size
  17.  
  18. if comm.rank < n-size*local_n:
  19. local_n = local_n + 1
  20.  
  21. # Initialisierung der Arrays
  22. local_A = np.zeros((n+2,local_n+2))
  23. for i in range(0,n+1):
  24. for j in range(0,local_n+1):
  25. if i == j:
  26. local_A[i,j] = 4
  27. elif i==0 and j== 0:
  28. local_A[i,j] = 0
  29. elif i-1 == j and i != 0:
  30. local_A[i,j] = -1
  31. elif i+1 == j:
  32. local_A[i,j] = -1
  33. else:
  34. local_A[i,j] = 0
  35. local_B = np.zeros((n,local_n))
  36. print ("Fuer den Prozess", rank, "gilt:" , local_A)
  37.  
  38.  
  39. iterations = 0
  40. eps = 1e-8 #Konvergenzgrenzwert
  41. error = 2*eps
  42.  
  43.  
  44. #Main - Loop
  45. while iterations < 1e4 and error > eps:
  46. for j in range(1, local_n, 1):
  47. for i in range(1, n, 1):
  48. local_B[i,j] = 0.25*(local_A[i+1,j]+local_A[i,j+1]+local_A[i-1,j]+local_A[i,j-1])
  49. error = error+ abs(local_B[i,j]-local_A[i,j])
  50.  
  51. for j in range(1,local_n,1):
  52. for i in range(1, n, 1):
  53. local_A[i,j] = local_B[i,j]
  54.  
  55. if comm.rank % 2 == 1:
  56. comm.send(local_B[:,1], rank-1)
  57. comm.recv(local_A[:,0], rank-1)
  58. if comm.rank < size - 1:
  59. comm.send(local_B[:,local_n], rank+1)
  60. comm.recv(local_A[:,local_n+1], rank+1)
  61. else:
  62. if comm.rank > 0:
  63. comm.recv(local_A[:,0], rank-1)
  64. comm.send(local_B[:,1], rank-1)
  65. if comm.rank < size-1:
  66. comm.recv(local_A[:,local_n+1], rank+1)
  67. comm.send(local_B[:,local_n], rank+1)
  68. print (local_B)
  69.  
  70. iterations = iterations + 1
  71. error = error/n**2
  72.  
  73.  
  74. comm.Barrier()
  75. if rank == 0:
  76. A_Gathered = np.zeros((n+2,n+2))
  77. else:
  78. A_Gathered = None
  79. comm.Gather(local_A, A_Gathered, root = 0)
  80. print (" Das ist A_Gathered",A_Gathered)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement