1#include "RCCE.h"
2#include <stdlib.h>
3#include <stdio.h>
4#include "directions.h"
5#include "applu_share.h"
6#include "applu_macros.h"
7
8#define g(m,i,j,k) g[m-1+5*((i+1)+(isiz1+4)*((j+1)+(isiz2+4)*(k-1)))]
9
10extern int rcce_curphase;
11
12void exchange_3(double *g,int iex) {
13
14      int i, j, k;
15      size_t chunk;
16      double bufin[5*2*isiz2*isiz3], bufout[5*2*isiz2*isiz3];
17
18      rcce_curphase = iex == 0 ? 0 : 1;
19
20      if (iex == 0) {
21
22//c---------------------------------------------------------------------
23//c   communicate in the south and north directions
24//c---------------------------------------------------------------------
25
26//c---------------------------------------------------------------------
27//c   send south
28//c---------------------------------------------------------------------
29      if (south != -1) {
30        for (int ib=0,k=1; k<=nz; k++) {
31          for (j=1; j<=ny; j++) {
32            bufout[ib++] = g(1,nx-1,j,k) ;
33            bufout[ib++] = g(2,nx-1,j,k) ;
34            bufout[ib++] = g(3,nx-1,j,k) ;
35            bufout[ib++] = g(4,nx-1,j,k) ;
36            bufout[ib++] = g(5,nx-1,j,k) ;
37            bufout[ib++] = g(1,nx,j,k);
38            bufout[ib++] = g(2,nx,j,k);
39            bufout[ib++] = g(3,nx,j,k);
40            bufout[ib++] = g(4,nx,j,k);
41            bufout[ib++] = g(5,nx,j,k);
42          }
43        }
44
45        RCCE_send((char*)bufout, 10*ny*nz*sizeof(double), south);
46     }
47
48//c---------------------------------------------------------------------
49//c   receive from north
50//c---------------------------------------------------------------------
51      if (north != -1) {
52        RCCE_recv((char*)bufin, 10*ny*nz*sizeof(double), north);
53
54        for (int ib=0,k=1; k<=nz; k++) {
55          for (j=1; j<=ny; j++) {
56            g(1,-1,j,k) = bufin[ib++];
57            g(2,-1,j,k) = bufin[ib++];
58            g(3,-1,j,k) = bufin[ib++];
59            g(4,-1,j,k) = bufin[ib++];
60            g(5,-1,j,k) = bufin[ib++];
61            g(1,0,j,k) = bufin[ib++];
62            g(2,0,j,k) = bufin[ib++];
63            g(3,0,j,k) = bufin[ib++];
64            g(4,0,j,k) = bufin[ib++];
65            g(5,0,j,k) = bufin[ib++];
66          }
67        }
68       }
69
70//c---------------------------------------------------------------------
71//c   send north
72//c---------------------------------------------------------------------
73      if (north != -1) {
74        for (int ib=0,k=1; k<=nz; k++) {
75          for (j=1; j<=ny; j++) {
76            bufout[ib++] = g(1,2,j,k);
77            bufout[ib++] = g(2,2,j,k);
78            bufout[ib++] = g(3,2,j,k);
79            bufout[ib++] = g(4,2,j,k);
80            bufout[ib++] = g(5,2,j,k);
81            bufout[ib++] = g(1,1,j,k);
82            bufout[ib++] = g(2,1,j,k);
83            bufout[ib++] = g(3,1,j,k);
84            bufout[ib++] = g(4,1,j,k);
85            bufout[ib++] = g(5,1,j,k);
86          }
87        }
88        RCCE_send((char*)bufout, 10*ny*nz*sizeof(double), north);
89      }
90
91//c---------------------------------------------------------------------
92//c   receive from south
93//c---------------------------------------------------------------------
94      if (south != -1) {
95        RCCE_recv((char*)bufin, 10*ny*nz*sizeof(double), south);
96
97        for (int ib=0,k=1; k<=nz; k++) {
98          for (j=1; j<=ny; j++) {
99            g(1,nx+2,j,k) = bufin[ib++];
100            g(2,nx+2,j,k) = bufin[ib++];
101            g(3,nx+2,j,k) = bufin[ib++];
102            g(4,nx+2,j,k) = bufin[ib++];
103            g(5,nx+2,j,k) = bufin[ib++];
104            g(1,nx+1,j,k) = bufin[ib++];
105            g(2,nx+1,j,k) = bufin[ib++];
106            g(3,nx+1,j,k) = bufin[ib++];
107            g(4,nx+1,j,k) = bufin[ib++];
108            g(5,nx+1,j,k) = bufin[ib++];
109          }
110        }
111      }
112
113    }
114
115    else {
116
117//c---------------------------------------------------------------------
118//c   communicate in the east and west directions
119//c---------------------------------------------------------------------
120//c---------------------------------------------------------------------
121//c   send east
122//c---------------------------------------------------------------------
123      if (east != -1) {
124        for (int ib=0,k=1; k<=nz; k++) {
125          for (i=1; i<=nx; i++) {
126            bufout[ib++] = g(1,i,ny-1,k);
127            bufout[ib++] = g(2,i,ny-1,k);
128            bufout[ib++] = g(3,i,ny-1,k);
129            bufout[ib++] = g(4,i,ny-1,k);
130            bufout[ib++] = g(5,i,ny-1,k);
131            bufout[ib++] = g(1,i,ny,k);
132            bufout[ib++] = g(2,i,ny,k);
133            bufout[ib++] = g(3,i,ny,k);
134            bufout[ib++] = g(4,i,ny,k);
135            bufout[ib++] = g(5,i,ny,k);
136          }
137        }
138        RCCE_send((char*)bufout, 10*nx*nz*sizeof(double), east);
139    }
140
141//c---------------------------------------------------------------------
142//c   receive from west
143//c---------------------------------------------------------------------
144      if (west != -1) {
145        RCCE_recv((char*)bufin, 10*nx*nz*sizeof(double), west);
146
147        for (int ib=0,k=1; k<=nz; k++) {
148          for (i=1; i<=nx; i++) {
149            g(1,i,-1,k) = bufin[ib++];
150            g(2,i,-1,k) = bufin[ib++];
151            g(3,i,-1,k) = bufin[ib++];
152            g(4,i,-1,k) = bufin[ib++];
153            g(5,i,-1,k) = bufin[ib++];
154            g(1,i,0,k) = bufin[ib++];
155            g(2,i,0,k) = bufin[ib++];
156            g(3,i,0,k) = bufin[ib++];
157            g(4,i,0,k) = bufin[ib++];
158            g(5,i,0,k) = bufin[ib++];
159          }
160        }
161
162      }
163
164//c---------------------------------------------------------------------
165//c   send west
166//c---------------------------------------------------------------------
167      if (west != -1) {
168          for (int ib=0,k=1; k<=nz; k++) {
169            for (i=1; i<=nx; i++) {
170              bufout[ib++] = g(1,i,2,k);
171              bufout[ib++] = g(2,i,2,k);
172              bufout[ib++] = g(3,i,2,k);
173              bufout[ib++] = g(4,i,2,k);
174              bufout[ib++] = g(5,i,2,k);
175              bufout[ib++] = g(1,i,1,k);
176              bufout[ib++] = g(2,i,1,k);
177              bufout[ib++] = g(3,i,1,k);
178              bufout[ib++] = g(4,i,1,k);
179              bufout[ib++] = g(5,i,1,k);
180            }
181          }
182        RCCE_send((char*)bufout, 10*nx*nz*sizeof(double), west);
183      }
184
185//c---------------------------------------------------------------------
186//c   receive from east
187//c---------------------------------------------------------------------
188      if (east != -1) {
189        RCCE_recv((char*)bufin, 10*nx*nz*sizeof(double), east);
190
191        for (int ib=0,k=1; k<=nz; k++) {
192          for (i=1; i<=nx; i++) {
193            g(1,i,ny+2,k) = bufin[ib++];
194            g(2,i,ny+2,k) = bufin[ib++];
195            g(3,i,ny+2,k) = bufin[ib++];
196            g(4,i,ny+2,k) = bufin[ib++];
197            g(5,i,ny+2,k) = bufin[ib++];
198            g(1,i,ny+1,k) = bufin[ib++];
199            g(2,i,ny+1,k) = bufin[ib++];
200            g(3,i,ny+1,k) = bufin[ib++];
201            g(4,i,ny+1,k) = bufin[ib++];
202            g(5,i,ny+1,k) = bufin[ib++];
203          }
204        }
205
206      }
207
208    }
209
210    return;
211}
212