exchange_3.c 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223
  1. //
  2. // Copyright 2010 Intel Corporation
  3. //
  4. // Licensed under the Apache License, Version 2.0 (the "License");
  5. // you may not use this file except in compliance with the License.
  6. // You may obtain a copy of the License at
  7. //
  8. // http://www.apache.org/licenses/LICENSE-2.0
  9. //
  10. // Unless required by applicable law or agreed to in writing, software
  11. // distributed under the License is distributed on an "AS IS" BASIS,
  12. // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13. // See the License for the specific language governing permissions and
  14. // limitations under the License.
  15. //
  16. #include "RCCE.h"
  17. #include <stdlib.h>
  18. #include <stdio.h>
  19. #include "directions.h"
  20. #include "applu_share.h"
  21. #include "applu_macros.h"
  22. #define g(m,i,j,k) g[m-1+5*((i+1)+(isiz1+4)*((j+1)+(isiz2+4)*(k-1)))]
  23. void exchange_3(double *g,int iex) {
  24. int i, j, k;
  25. size_t chunk;
  26. double buffer[5*2*isiz2*isiz3];
  27. if (iex == 0) {
  28. //c---------------------------------------------------------------------
  29. //c communicate in the south and north directions
  30. //c---------------------------------------------------------------------
  31. //c---------------------------------------------------------------------
  32. //c send south
  33. //c---------------------------------------------------------------------
  34. if (south != -1) {
  35. for (int ib=0,k=1; k<=nz; k++) {
  36. for (j=1; j<=ny; j++) {
  37. buffer[ib++] = g(1,nx-1,j,k) ;
  38. buffer[ib++] = g(2,nx-1,j,k) ;
  39. buffer[ib++] = g(3,nx-1,j,k) ;
  40. buffer[ib++] = g(4,nx-1,j,k) ;
  41. buffer[ib++] = g(5,nx-1,j,k) ;
  42. buffer[ib++] = g(1,nx,j,k);
  43. buffer[ib++] = g(2,nx,j,k);
  44. buffer[ib++] = g(3,nx,j,k);
  45. buffer[ib++] = g(4,nx,j,k);
  46. buffer[ib++] = g(5,nx,j,k);
  47. }
  48. }
  49. RCCE_send((char*)buffer, 10*ny*nz*sizeof(double), south);
  50. }
  51. //c---------------------------------------------------------------------
  52. //c receive from north
  53. //c---------------------------------------------------------------------
  54. if (north != -1) {
  55. RCCE_recv((char*)buffer, 10*ny*nz*sizeof(double), north);
  56. for (int ib=0,k=1; k<=nz; k++) {
  57. for (j=1; j<=ny; j++) {
  58. g(1,-1,j,k) = buffer[ib++];
  59. g(2,-1,j,k) = buffer[ib++];
  60. g(3,-1,j,k) = buffer[ib++];
  61. g(4,-1,j,k) = buffer[ib++];
  62. g(5,-1,j,k) = buffer[ib++];
  63. g(1,0,j,k) = buffer[ib++];
  64. g(2,0,j,k) = buffer[ib++];
  65. g(3,0,j,k) = buffer[ib++];
  66. g(4,0,j,k) = buffer[ib++];
  67. g(5,0,j,k) = buffer[ib++];
  68. }
  69. }
  70. }
  71. //c---------------------------------------------------------------------
  72. //c send north
  73. //c---------------------------------------------------------------------
  74. if (north != -1) {
  75. for (int ib=0,k=1; k<=nz; k++) {
  76. for (j=1; j<=ny; j++) {
  77. buffer[ib++] = g(1,2,j,k);
  78. buffer[ib++] = g(2,2,j,k);
  79. buffer[ib++] = g(3,2,j,k);
  80. buffer[ib++] = g(4,2,j,k);
  81. buffer[ib++] = g(5,2,j,k);
  82. buffer[ib++] = g(1,1,j,k);
  83. buffer[ib++] = g(2,1,j,k);
  84. buffer[ib++] = g(3,1,j,k);
  85. buffer[ib++] = g(4,1,j,k);
  86. buffer[ib++] = g(5,1,j,k);
  87. }
  88. }
  89. RCCE_send((char*)buffer, 10*ny*nz*sizeof(double), north);
  90. }
  91. //c---------------------------------------------------------------------
  92. //c receive from south
  93. //c---------------------------------------------------------------------
  94. if (south != -1) {
  95. RCCE_recv((char*)buffer, 10*ny*nz*sizeof(double), south);
  96. for (int ib=0,k=1; k<=nz; k++) {
  97. for (j=1; j<=ny; j++) {
  98. g(1,nx+2,j,k) = buffer[ib++];
  99. g(2,nx+2,j,k) = buffer[ib++];
  100. g(3,nx+2,j,k) = buffer[ib++];
  101. g(4,nx+2,j,k) = buffer[ib++];
  102. g(5,nx+2,j,k) = buffer[ib++];
  103. g(1,nx+1,j,k) = buffer[ib++];
  104. g(2,nx+1,j,k) = buffer[ib++];
  105. g(3,nx+1,j,k) = buffer[ib++];
  106. g(4,nx+1,j,k) = buffer[ib++];
  107. g(5,nx+1,j,k) = buffer[ib++];
  108. }
  109. }
  110. }
  111. }
  112. else {
  113. //c---------------------------------------------------------------------
  114. //c communicate in the east and west directions
  115. //c---------------------------------------------------------------------
  116. //c---------------------------------------------------------------------
  117. //c send east
  118. //c---------------------------------------------------------------------
  119. if (east != -1) {
  120. for (int ib=0,k=1; k<=nz; k++) {
  121. for (i=1; i<=nx; i++) {
  122. buffer[ib++] = g(1,i,ny-1,k);
  123. buffer[ib++] = g(2,i,ny-1,k);
  124. buffer[ib++] = g(3,i,ny-1,k);
  125. buffer[ib++] = g(4,i,ny-1,k);
  126. buffer[ib++] = g(5,i,ny-1,k);
  127. buffer[ib++] = g(1,i,ny,k);
  128. buffer[ib++] = g(2,i,ny,k);
  129. buffer[ib++] = g(3,i,ny,k);
  130. buffer[ib++] = g(4,i,ny,k);
  131. buffer[ib++] = g(5,i,ny,k);
  132. }
  133. }
  134. RCCE_send((char*)buffer, 10*nx*nz*sizeof(double), east);
  135. }
  136. //c---------------------------------------------------------------------
  137. //c receive from west
  138. //c---------------------------------------------------------------------
  139. if (west != -1) {
  140. RCCE_recv((char*)buffer, 10*nx*nz*sizeof(double), west);
  141. for (int ib=0,k=1; k<=nz; k++) {
  142. for (i=1; i<=nx; i++) {
  143. g(1,i,-1,k) = buffer[ib++];
  144. g(2,i,-1,k) = buffer[ib++];
  145. g(3,i,-1,k) = buffer[ib++];
  146. g(4,i,-1,k) = buffer[ib++];
  147. g(5,i,-1,k) = buffer[ib++];
  148. g(1,i,0,k) = buffer[ib++];
  149. g(2,i,0,k) = buffer[ib++];
  150. g(3,i,0,k) = buffer[ib++];
  151. g(4,i,0,k) = buffer[ib++];
  152. g(5,i,0,k) = buffer[ib++];
  153. }
  154. }
  155. }
  156. //c---------------------------------------------------------------------
  157. //c send west
  158. //c---------------------------------------------------------------------
  159. if (west != -1) {
  160. for (int ib=0,k=1; k<=nz; k++) {
  161. for (i=1; i<=nx; i++) {
  162. buffer[ib++] = g(1,i,2,k);
  163. buffer[ib++] = g(2,i,2,k);
  164. buffer[ib++] = g(3,i,2,k);
  165. buffer[ib++] = g(4,i,2,k);
  166. buffer[ib++] = g(5,i,2,k);
  167. buffer[ib++] = g(1,i,1,k);
  168. buffer[ib++] = g(2,i,1,k);
  169. buffer[ib++] = g(3,i,1,k);
  170. buffer[ib++] = g(4,i,1,k);
  171. buffer[ib++] = g(5,i,1,k);
  172. }
  173. }
  174. RCCE_send((char*)buffer, 10*nx*nz*sizeof(double), west);
  175. }
  176. //c---------------------------------------------------------------------
  177. //c receive from east
  178. //c---------------------------------------------------------------------
  179. if (east != -1) {
  180. RCCE_recv((char*)buffer, 10*nx*nz*sizeof(double), east);
  181. for (int ib=0,k=1; k<=nz; k++) {
  182. for (i=1; i<=nx; i++) {
  183. g(1,i,ny+2,k) = buffer[ib++];
  184. g(2,i,ny+2,k) = buffer[ib++];
  185. g(3,i,ny+2,k) = buffer[ib++];
  186. g(4,i,ny+2,k) = buffer[ib++];
  187. g(5,i,ny+2,k) = buffer[ib++];
  188. g(1,i,ny+1,k) = buffer[ib++];
  189. g(2,i,ny+1,k) = buffer[ib++];
  190. g(3,i,ny+1,k) = buffer[ib++];
  191. g(4,i,ny+1,k) = buffer[ib++];
  192. g(5,i,ny+1,k) = buffer[ib++];
  193. }
  194. }
  195. }
  196. }
  197. return;
  198. }