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