9.3. PCG AND MPI 359
96. mpi_comm_world,ierr)
97. call mpi_recv(p(0,en+1),(n+1),mpi_real,my_rank+1,50,&
98. mpi_comm_world,status,ierr)
99. call mpi_send(p(0,en),(n+1),mpi_real,my_rank+1,50,&
100. mpi_comm_world,ierr)
101. end if
102. if (my_rank.eq.proc-1) then
103. call mpi_send(p(0,bn),(n+1),mpi_real,my_rank-1,50,&
104. mpi_comm_world,ierr)
105. call mpi_recv(p(0,bn-1),(n+1),mpi_real,my_rank-1,50,&
106. mpi_comm_world,status,ierr)
107. end if
108. q(1:n-1,bn:en)=4.0*p(1:n-1,bn:en)-p(0:n-2,bn:en)-p(2:n,bn:en)&
109. - p(1:n-1,bn-1:en-1) - p(1:n-1,bn+1:en+1)
110. ! Find steepest descent.
111. loc_ap = sum(p(1:n-1,bn:en)*q(1:n-1,bn:en))
112. call mpi_allreduce(loc_ap,ap,1,mpi_real,mpi_sum,&
113. mpi_comm_world,ierr)
114. alpha = rho/ap
115. u(1:n-1,bn:en) = u(1:n-1,bn:en) + alpha*p(1:n-1,bn:en)
116. r(1:n-1,bn:en) = r(1:n-1,bn:en) - alpha*q(1:n-1,bn:en)
117. loc_error = maxval(abs(r(1:n-1,bn:en)))
118. call mpi_allreduce(loc_error,error,1,mpi_real, mpi_sum,&
119. mpi_comm_world,ierr)
120. end do
121. ! Send local solutions to processor zero.
122. if (my_rank.eq.0) then
123. do source = 1,proc-1
124. sbn = 1+(source)*loc_n
125. call mpi_recv(u(0,sbn),(n+1)*loc_n,mpi_real,source,50,&
126. mpi_comm_world,status,ierr)
127. end do
128. else
129. call mpi_send(u(0,bn),(n+1)*loc_n,mpi_real,0,50,&
130. mpi_comm_world,ierr)
131. end if
132. if (my_rank.eq.0) then
133. tend = timef()
134. print*, ’time =’, tend
135. print*, ’time per iteration = ’, tend/m
136. print*, m,error, u(512 ,512)
137. print*, ’w = ’,w
138. end if
139. call mpi_finalize(ierr)
140. end program
© 2004 by Chapman & Hall/CRC