pintgr.c 8.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257
  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 <stdio.h>
  18. #include <stdlib.h>
  19. #include "applu_share.h"
  20. #include "applu_macros.h"
  21. void pintgr() {
  22. int i, j, k, ind1, ind2;
  23. int ibeg, ifin, ifin1, jbeg, jfin, jfin1;
  24. int iglob, iglob1, iglob2, jglob, jglob1, jglob2;
  25. double phi1[(isiz2+2)*(isiz3+2)], phi2[(isiz2+2)*(isiz3+2)],
  26. frc1, frc2, frc3, dummy;
  27. //c---------------------------------------------------------------------
  28. //c set up the sub-domains for integeration in each processor
  29. //c---------------------------------------------------------------------
  30. ibeg = nx + 1;
  31. ifin = 0;
  32. iglob1 = ipt + 1;
  33. iglob2 = ipt + nx;
  34. if ((iglob1 >= ii1) && (iglob2 < ii2+nx)) ibeg = 1;
  35. if ((iglob1 > ii1-nx) && (iglob2 <= ii2) ) ifin = nx;
  36. if ((ii1 >= iglob1) && (ii1 <= iglob2) ) ibeg = ii1 - ipt;
  37. if ((ii2 >= iglob1) && (ii2 <= iglob2) ) ifin = ii2 - ipt;
  38. jbeg = ny + 1;
  39. jfin = 0;
  40. jglob1 = jpt + 1;
  41. jglob2 = jpt + ny;
  42. if ((jglob1 >= ji1) && (jglob2 < ji2+ny)) jbeg = 1;
  43. if ((jglob1 > ji1-ny) && (jglob2 <= ji2) ) jfin = ny;
  44. if ((ji1 >= jglob1) && (ji1 <= jglob2) ) jbeg = ji1 - jpt;
  45. if ((ji2 >= jglob1) && (ji2 <= jglob2) ) jfin = ji2 - jpt;
  46. ifin1 = ifin;
  47. jfin1 = jfin;
  48. if (ipt + ifin1 == ii2) ifin1 = ifin -1;
  49. if (jpt + jfin1 == ji2) jfin1 = jfin -1;
  50. //c---------------------------------------------------------------------
  51. //c initialize
  52. //c---------------------------------------------------------------------
  53. for (i=0; i<=isiz2+1; i++) {
  54. for (k=0; k<=isiz3+1; k++) {
  55. phi1(i,k) = 0.0;
  56. phi2(i,k) = 0.0;
  57. }
  58. }
  59. for (j= jbeg; j<=jfin; j++) {
  60. jglob = jpt + j;
  61. for (i=ibeg; i<=ifin; i++) {
  62. iglob = ipt + i;
  63. k = ki1;
  64. phi1(i,j) = c2*( u(5,i,j,k)
  65. - 0.50 * ( u(2,i,j,k) * u(2,i,j,k)
  66. + u(3,i,j,k) * u(3,i,j,k)
  67. + u(4,i,j,k) * u(4,i,j,k) )
  68. / u(1,i,j,k) );
  69. k = ki2;
  70. phi2(i,j) = c2*( u(5,i,j,k)
  71. - 0.50 * ( u(2,i,j,k) * u(2,i,j,k)
  72. + u(3,i,j,k) * u(3,i,j,k)
  73. + u(4,i,j,k) * u(4,i,j,k) )
  74. / u(1,i,j,k) );
  75. }
  76. }
  77. //c---------------------------------------------------------------------
  78. //c communicate in i and j directions
  79. //c---------------------------------------------------------------------
  80. exchange_4(phi1, phi2, ibeg, ifin1, jbeg, jfin1);
  81. frc1 = 0.0;
  82. for (j= jbeg; j<=jfin1; j++) {
  83. for (i=ibeg; i<= ifin1; i++) {
  84. frc1 = frc1 + ( phi1(i,j)
  85. + phi1(i+1,j)
  86. + phi1(i,j+1)
  87. + phi1(i+1,j+1)
  88. + phi2(i,j)
  89. + phi2(i+1,j)
  90. + phi2(i,j+1)
  91. + phi2(i+1,j+1) );
  92. }
  93. }
  94. //c---------------------------------------------------------------------
  95. //c compute the global sum of individual contributions to frc1
  96. //c---------------------------------------------------------------------
  97. dummy = frc1;
  98. RCCE_allreduce((char*)(&dummy), (char*)(&frc1), 1, RCCE_DOUBLE, RCCE_SUM, RCCE_COMM_WORLD);
  99. frc1 = dxi * deta * frc1;
  100. //c---------------------------------------------------------------------
  101. //c initialize
  102. //c---------------------------------------------------------------------
  103. for (i=0; i<=isiz2+1; i++) {
  104. for (k= 0; k<=isiz3+1; k++) {
  105. phi1(i,k) = 0.0;
  106. phi2(i,k) = 0.0;
  107. }
  108. }
  109. jglob = jpt + jbeg;
  110. ind1 = 0;
  111. if (jglob == ji1) {
  112. ind1 = 1;
  113. for (k= ki1; k<= ki2; k++) {
  114. for (i=ibeg; i<= ifin; i++) {
  115. iglob = ipt + i;
  116. phi1(i,k) = c2*( u(5,i,jbeg,k)
  117. - 0.50 * ( u(2,i,jbeg,k) * u(2,i,jbeg,k)
  118. + u(3,i,jbeg,k) * u(3,i,jbeg,k)
  119. + u(4,i,jbeg,k) *u(4,i,jbeg,k) )
  120. / u(1,i,jbeg,k) );
  121. }
  122. }
  123. }
  124. jglob = jpt + jfin;
  125. ind2 = 0;
  126. if (jglob == ji2) {
  127. ind2 = 1;
  128. for (k= ki1; k<= ki2; k++) {
  129. for (i=ibeg; i<= ifin; i++) {
  130. iglob = ipt + i;
  131. phi2(i,k) = c2*( u(5,i,jfin,k)
  132. - 0.50 * ( u(2,i,jfin,k) * u(2,i,jfin,k)
  133. + u(3,i,jfin,k) * u(3,i,jfin,k)
  134. + u(4,i,jfin,k) * u(4,i,jfin,k) )
  135. / u(1,i,jfin,k) );
  136. }
  137. }
  138. }
  139. //c---------------------------------------------------------------------
  140. //c communicate in i direction
  141. //c---------------------------------------------------------------------
  142. if (ind1 == 1) exchange_5(phi1, ibeg, ifin1);
  143. if (ind2 == 1) exchange_5(phi2, ibeg, ifin1);
  144. frc2 = 0.0;
  145. for (k= ki1; k<= ki2-1; k++) {
  146. for (i=ibeg; i<= ifin1; i++) {
  147. frc2 = frc2 + ( phi1(i,k)
  148. + phi1(i+1,k)
  149. + phi1(i,k+1)
  150. + phi1(i+1,k+1)
  151. + phi2(i,k)
  152. + phi2(i+1,k)
  153. + phi2(i,k+1)
  154. + phi2(i+1,k+1) );
  155. }
  156. }
  157. //c---------------------------------------------------------------------
  158. //c compute the global sum of individual contributions to frc2
  159. //c---------------------------------------------------------------------
  160. dummy = frc2;
  161. RCCE_allreduce((char*)(&dummy), (char*)(&frc2), 1, RCCE_DOUBLE, RCCE_SUM, RCCE_COMM_WORLD);
  162. frc2 = dxi * dzeta * frc2;
  163. //c---------------------------------------------------------------------
  164. //c initialize
  165. //c---------------------------------------------------------------------
  166. for (i=0; i<=isiz2+1; i++) {
  167. for (k= 0; k<=isiz3+1; k++) {
  168. phi1(i,k) = 0.0;
  169. phi2(i,k) = 0.0;
  170. }
  171. }
  172. iglob = ipt + ibeg;
  173. ind1 = 0;
  174. if (iglob == ii1) {
  175. ind1 = 1;
  176. for (k= ki1; k<= ki2; k++) {
  177. for (j= jbeg; j<= jfin; j++) {
  178. jglob = jpt + j;
  179. phi1(j,k) = c2*( u(5,ibeg,j,k)
  180. - 0.50 * ( u(2,ibeg,j,k) * u(2,ibeg,j,k)
  181. + u(3,ibeg,j,k) * u(3,ibeg,j,k)
  182. + u(4,ibeg,j,k) * u(4,ibeg,j,k) )
  183. / u(1,ibeg,j,k) );
  184. }
  185. }
  186. }
  187. iglob = ipt + ifin;
  188. ind2 = 0;
  189. if (iglob == ii2) {
  190. ind2 = 1;
  191. for (k= ki1; k<= ki2; k++) {
  192. for (j= jbeg; j<= jfin; j++) {
  193. jglob = jpt + j;
  194. phi2(j,k) = c2*( u(5,ifin,j,k)
  195. - 0.50 * ( u(2,ifin,j,k) * u(2,ifin,j,k)
  196. + u(3,ifin,j,k) * u(3,ifin,j,k)
  197. + u(4,ifin,j,k) * u(4,ifin,j,k) )
  198. / u(1,ifin,j,k) );
  199. }
  200. }
  201. }
  202. //c---------------------------------------------------------------------
  203. //c communicate in j direction
  204. //c---------------------------------------------------------------------
  205. if (ind1 == 1) exchange_6(phi1, jbeg, jfin1);
  206. if (ind2 == 1) exchange_6(phi2, jbeg, jfin1);
  207. frc3 = 0.0;
  208. for (k= ki1; k<= ki2-1; k++) {
  209. for (j= jbeg; j<= jfin1; j++) {
  210. frc3 = frc3 + ( phi1(j,k)
  211. + phi1(j+1,k)
  212. + phi1(j,k+1)
  213. + phi1(j+1,k+1)
  214. + phi2(j,k)
  215. + phi2(j+1,k)
  216. + phi2(j,k+1)
  217. + phi2(j+1,k+1) );
  218. }
  219. }
  220. //c---------------------------------------------------------------------
  221. //c compute the global sum of individual contributions to frc3
  222. //c---------------------------------------------------------------------
  223. dummy = frc3;
  224. RCCE_allreduce((char*)(&dummy), (char*)(&frc3), 1, RCCE_DOUBLE, RCCE_SUM, RCCE_COMM_WORLD);
  225. frc3 = deta * dzeta * frc3;
  226. frc = 0.25 * ( frc1 + frc2 + frc3 );
  227. return;
  228. }