2 c---------------------------------------------------------------------
3 c---------------------------------------------------------------------
5 subroutine exchange_3(g,iex)
7 c---------------------------------------------------------------------
8 c---------------------------------------------------------------------
10 c---------------------------------------------------------------------
11 c compute the right hand side based on exact solution
12 c---------------------------------------------------------------------
19 c---------------------------------------------------------------------
21 c---------------------------------------------------------------------
22 double precision g(5,-1:isiz1+2,-1:isiz2+2,isiz3)
25 c---------------------------------------------------------------------
27 c---------------------------------------------------------------------
32 integer STATUS(MPI_STATUS_SIZE)
38 c---------------------------------------------------------------------
39 c communicate in the south and north directions
40 c---------------------------------------------------------------------
52 c---------------------------------------------------------------------
54 c---------------------------------------------------------------------
60 buf(1,ipos1) = g(1,nx-1,j,k)
61 buf(2,ipos1) = g(2,nx-1,j,k)
62 buf(3,ipos1) = g(3,nx-1,j,k)
63 buf(4,ipos1) = g(4,nx-1,j,k)
64 buf(5,ipos1) = g(5,nx-1,j,k)
65 buf(1,ipos2) = g(1,nx,j,k)
66 buf(2,ipos2) = g(2,nx,j,k)
67 buf(3,ipos2) = g(3,nx,j,k)
68 buf(4,ipos2) = g(4,nx,j,k)
69 buf(5,ipos2) = g(5,nx,j,k)
82 c---------------------------------------------------------------------
84 c---------------------------------------------------------------------
86 call MPI_WAIT( mid, STATUS, IERROR )
92 g(1,-1,j,k) = buf1(1,ipos1)
93 g(2,-1,j,k) = buf1(2,ipos1)
94 g(3,-1,j,k) = buf1(3,ipos1)
95 g(4,-1,j,k) = buf1(4,ipos1)
96 g(5,-1,j,k) = buf1(5,ipos1)
97 g(1,0,j,k) = buf1(1,ipos2)
98 g(2,0,j,k) = buf1(2,ipos2)
99 g(3,0,j,k) = buf1(3,ipos2)
100 g(4,0,j,k) = buf1(4,ipos2)
101 g(5,0,j,k) = buf1(5,ipos2)
107 if (south.ne.-1) then
108 call MPI_IRECV( buf1,
118 c---------------------------------------------------------------------
120 c---------------------------------------------------------------------
121 if (north.ne.-1) then
125 ipos2 = ipos1 + ny*nz
126 buf(1,ipos1) = g(1,2,j,k)
127 buf(2,ipos1) = g(2,2,j,k)
128 buf(3,ipos1) = g(3,2,j,k)
129 buf(4,ipos1) = g(4,2,j,k)
130 buf(5,ipos1) = g(5,2,j,k)
131 buf(1,ipos2) = g(1,1,j,k)
132 buf(2,ipos2) = g(2,1,j,k)
133 buf(3,ipos2) = g(3,1,j,k)
134 buf(4,ipos2) = g(4,1,j,k)
135 buf(5,ipos2) = g(5,1,j,k)
148 c---------------------------------------------------------------------
150 c---------------------------------------------------------------------
151 if (south.ne.-1) then
152 call MPI_WAIT( mid, STATUS, IERROR )
157 ipos2 = ipos1 + ny*nz
158 g(1,nx+2,j,k) = buf1(1,ipos1)
159 g(2,nx+2,j,k) = buf1(2,ipos1)
160 g(3,nx+2,j,k) = buf1(3,ipos1)
161 g(4,nx+2,j,k) = buf1(4,ipos1)
162 g(5,nx+2,j,k) = buf1(5,ipos1)
163 g(1,nx+1,j,k) = buf1(1,ipos2)
164 g(2,nx+1,j,k) = buf1(2,ipos2)
165 g(3,nx+1,j,k) = buf1(3,ipos2)
166 g(4,nx+1,j,k) = buf1(4,ipos2)
167 g(5,nx+1,j,k) = buf1(5,ipos2)
174 c---------------------------------------------------------------------
175 c communicate in the east and west directions
176 c---------------------------------------------------------------------
178 call MPI_IRECV( buf1,
188 c---------------------------------------------------------------------
190 c---------------------------------------------------------------------
195 ipos2 = ipos1 + nx*nz
196 buf(1,ipos1) = g(1,i,ny-1,k)
197 buf(2,ipos1) = g(2,i,ny-1,k)
198 buf(3,ipos1) = g(3,i,ny-1,k)
199 buf(4,ipos1) = g(4,i,ny-1,k)
200 buf(5,ipos1) = g(5,i,ny-1,k)
201 buf(1,ipos2) = g(1,i,ny,k)
202 buf(2,ipos2) = g(2,i,ny,k)
203 buf(3,ipos2) = g(3,i,ny,k)
204 buf(4,ipos2) = g(4,i,ny,k)
205 buf(5,ipos2) = g(5,i,ny,k)
218 c---------------------------------------------------------------------
220 c---------------------------------------------------------------------
222 call MPI_WAIT( mid, STATUS, IERROR )
227 ipos2 = ipos1 + nx*nz
228 g(1,i,-1,k) = buf1(1,ipos1)
229 g(2,i,-1,k) = buf1(2,ipos1)
230 g(3,i,-1,k) = buf1(3,ipos1)
231 g(4,i,-1,k) = buf1(4,ipos1)
232 g(5,i,-1,k) = buf1(5,ipos1)
233 g(1,i,0,k) = buf1(1,ipos2)
234 g(2,i,0,k) = buf1(2,ipos2)
235 g(3,i,0,k) = buf1(3,ipos2)
236 g(4,i,0,k) = buf1(4,ipos2)
237 g(5,i,0,k) = buf1(5,ipos2)
244 call MPI_IRECV( buf1,
254 c---------------------------------------------------------------------
256 c---------------------------------------------------------------------
261 ipos2 = ipos1 + nx*nz
262 buf(1,ipos1) = g(1,i,2,k)
263 buf(2,ipos1) = g(2,i,2,k)
264 buf(3,ipos1) = g(3,i,2,k)
265 buf(4,ipos1) = g(4,i,2,k)
266 buf(5,ipos1) = g(5,i,2,k)
267 buf(1,ipos2) = g(1,i,1,k)
268 buf(2,ipos2) = g(2,i,1,k)
269 buf(3,ipos2) = g(3,i,1,k)
270 buf(4,ipos2) = g(4,i,1,k)
271 buf(5,ipos2) = g(5,i,1,k)
284 c---------------------------------------------------------------------
286 c---------------------------------------------------------------------
288 call MPI_WAIT( mid, STATUS, IERROR )
293 ipos2 = ipos1 + nx*nz
294 g(1,i,ny+2,k) = buf1(1,ipos1)
295 g(2,i,ny+2,k) = buf1(2,ipos1)
296 g(3,i,ny+2,k) = buf1(3,ipos1)
297 g(4,i,ny+2,k) = buf1(4,ipos1)
298 g(5,i,ny+2,k) = buf1(5,ipos1)
299 g(1,i,ny+1,k) = buf1(1,ipos2)
300 g(2,i,ny+1,k) = buf1(2,ipos2)
301 g(3,i,ny+1,k) = buf1(3,ipos2)
302 g(4,i,ny+1,k) = buf1(4,ipos2)
303 g(5,i,ny+1,k) = buf1(5,ipos2)