rhs.c 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507
  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 "applu_share.h"
  17. #include "applu_macros.h"
  18. void rhs(){
  19. //c compute the right hand sides
  20. //c---------------------------------------------------------------------
  21. //c local variables
  22. //c---------------------------------------------------------------------
  23. int i, j, k, m;
  24. int iex;
  25. int L1, L2;
  26. int ist1, iend1;
  27. int jst1, jend1;
  28. double q;
  29. double u21, u31, u41;
  30. double tmp;
  31. double u21i, u31i, u41i, u51i;
  32. double u21j, u31j, u41j, u51j;
  33. double u21k, u31k, u41k, u51k;
  34. double u21im1, u31im1, u41im1, u51im1;
  35. double u21jm1, u31jm1, u41jm1, u51jm1;
  36. double u21km1, u31km1, u41km1, u51km1;
  37. for (k=1; k<=nz; k++)
  38. for (j=1; j<=ny; j++)
  39. for (i=1; i<=nx; i++)
  40. for (m=1; m<=5; m++)
  41. rsd(m,i,j,k) = - frct(m,i,j,k);
  42. //c---------------------------------------------------------------------
  43. //c xi-direction flux differences
  44. //c---------------------------------------------------------------------
  45. //c
  46. //c---------------------------------------------------------------------
  47. //c iex = flag : iex = 0 north/south communication
  48. //c : iex = 1 east/west communication
  49. //c---------------------------------------------------------------------
  50. iex = 0;
  51. //c---------------------------------------------------------------------
  52. //c communicate and receive/send two rows of data
  53. //c---------------------------------------------------------------------
  54. exchange_3(u,iex);
  55. L1 = 0;
  56. if (north == -1) L1 = 1;
  57. L2 = nx + 1;
  58. if (south == -1) L2 = nx;
  59. ist1 = 1;
  60. iend1 = nx;
  61. if (north == -1) ist1 = 4;
  62. if (south == -1) iend1 = nx - 3;
  63. for (k=2; k<=nz-1; k++) {
  64. for (j=jst; j<=jend; j++) {
  65. for (i=L1; i<=L2; i++) {
  66. flux(1,i,j,k) = u(2,i,j,k);
  67. u21 = u(2,i,j,k) / u(1,i,j,k);
  68. q = 0.50 * ( u(2,i,j,k) * u(2,i,j,k)
  69. + u(3,i,j,k) * u(3,i,j,k)
  70. + u(4,i,j,k) * u(4,i,j,k) )
  71. / u(1,i,j,k);
  72. flux(2,i,j,k) = u(2,i,j,k) * u21 + c2 *
  73. ( u(5,i,j,k) - q );
  74. flux(3,i,j,k) = u(3,i,j,k) * u21;
  75. flux(4,i,j,k) = u(4,i,j,k) * u21;
  76. flux(5,i,j,k) = ( c1 * u(5,i,j,k) - c2 * q ) * u21;
  77. }
  78. for (i=ist; i<=iend; i++) {
  79. for (m=1; m<=5; m++) {
  80. rsd(m,i,j,k) = rsd(m,i,j,k)
  81. - tx2 * ( flux(m,i+1,j,k) - flux(m,i-1,j,k) );
  82. }
  83. }
  84. for (i=ist; i<=L2; i++) {
  85. tmp = 1.0 / u(1,i,j,k);
  86. u21i = tmp * u(2,i,j,k);
  87. u31i = tmp * u(3,i,j,k);
  88. u41i = tmp * u(4,i,j,k);
  89. u51i = tmp * u(5,i,j,k);
  90. tmp = 1.0 / u(1,i-1,j,k);
  91. u21im1 = tmp * u(2,i-1,j,k);
  92. u31im1 = tmp * u(3,i-1,j,k);
  93. u41im1 = tmp * u(4,i-1,j,k);
  94. u51im1 = tmp * u(5,i-1,j,k);
  95. flux(2,i,j,k) = (4.0/3.0) * tx3 * (u21i-u21im1);
  96. flux(3,i,j,k) = tx3 * ( u31i - u31im1 );
  97. flux(4,i,j,k) = tx3 * ( u41i - u41im1 );
  98. flux(5,i,j,k) = 0.50 * ( 1.0 - c1*c5 )
  99. * tx3 * ( ( u21i *u21i + u31i *u31i + u41i *u41i )
  100. - ( u21im1*u21im1 + u31im1*u31im1 + u41im1*u41im1 ) )
  101. + (1.0/6.0)
  102. * tx3 * ( u21i*u21i - u21im1*u21im1 )
  103. + c1 * c5 * tx3 * ( u51i - u51im1 );
  104. }
  105. for (i=ist; i<=iend; i++) {
  106. rsd(1,i,j,k) = rsd(1,i,j,k)
  107. + dx1 * tx1 * ( u(1,i-1,j,k)
  108. - 2.0 * u(1,i,j,k)
  109. + u(1,i+1,j,k) );
  110. rsd(2,i,j,k) = rsd(2,i,j,k)
  111. + tx3 * c3 * c4 * ( flux(2,i+1,j,k) - flux(2,i,j,k) )
  112. + dx2 * tx1 * ( u(2,i-1,j,k)
  113. - 2.0 * u(2,i,j,k)
  114. + u(2,i+1,j,k) );
  115. rsd(3,i,j,k) = rsd(3,i,j,k)
  116. + tx3 * c3 * c4 * ( flux(3,i+1,j,k) - flux(3,i,j,k) )
  117. + dx3 * tx1 * ( u(3,i-1,j,k)
  118. - 2.0 * u(3,i,j,k)
  119. + u(3,i+1,j,k) );
  120. rsd(4,i,j,k) = rsd(4,i,j,k)
  121. + tx3 * c3 * c4 * ( flux(4,i+1,j,k) - flux(4,i,j,k) )
  122. + dx4 * tx1 * ( u(4,i-1,j,k)
  123. - 2.0 * u(4,i,j,k)
  124. + u(4,i+1,j,k) );
  125. rsd(5,i,j,k) = rsd(5,i,j,k)
  126. + tx3 * c3 * c4 * ( flux(5,i+1,j,k) - flux(5,i,j,k) )
  127. + dx5 * tx1 * ( u(5,i-1,j,k)
  128. - 2.0 * u(5,i,j,k)
  129. + u(5,i+1,j,k) );
  130. }
  131. //c---------------------------------------------------------------------
  132. //c Fourth-order dissipation
  133. //c---------------------------------------------------------------------
  134. if (north == -1) {
  135. for (m=1; m<=5; m++) {
  136. rsd(m,2,j,k) = rsd(m,2,j,k)
  137. - dssp * ( + 5.0 * u(m,2,j,k)
  138. - 4.0 * u(m,3,j,k)
  139. + u(m,4,j,k) );
  140. rsd(m,3,j,k) = rsd(m,3,j,k)
  141. - dssp * ( - 4.0 * u(m,2,j,k)
  142. + 6.0 * u(m,3,j,k)
  143. - 4.0 * u(m,4,j,k)
  144. + u(m,5,j,k) );
  145. }
  146. }
  147. for (i=ist1; i<=iend1; i++) {
  148. for (m=1; m<=5; m++) {
  149. rsd(m,i,j,k) = rsd(m,i,j,k)
  150. - dssp * ( u(m,i-2,j,k)
  151. - 4.0 * u(m,i-1,j,k)
  152. + 6.0 * u(m,i,j,k)
  153. - 4.0 * u(m,i+1,j,k)
  154. + u(m,i+2,j,k) );
  155. }
  156. }
  157. if (south == -1) {
  158. for (m=1; m<=5; m++) {
  159. rsd(m,nx-2,j,k) = rsd(m,nx-2,j,k)
  160. - dssp * ( u(m,nx-4,j,k)
  161. - 4.0 * u(m,nx-3,j,k)
  162. + 6.0 * u(m,nx-2,j,k)
  163. - 4.0 * u(m,nx-1,j,k) );
  164. rsd(m,nx-1,j,k) = rsd(m,nx-1,j,k)
  165. - dssp * ( u(m,nx-3,j,k)
  166. - 4.0 * u(m,nx-2,j,k)
  167. + 5.0 * u(m,nx-1,j,k) );
  168. }
  169. }
  170. }
  171. }
  172. //c---------------------------------------------------------------------
  173. //c eta-direction flux differences
  174. //c---------------------------------------------------------------------
  175. //
  176. //c---------------------------------------------------------------------
  177. //c iex = flag : iex = 0 north/south communication
  178. //c---------------------------------------------------------------------
  179. iex = 1;
  180. //c---------------------------------------------------------------------
  181. //c communicate and receive/send two rows of data
  182. //c---------------------------------------------------------------------
  183. exchange_3(u,iex);
  184. L1 = 0;
  185. if (west == -1) L1 = 1;
  186. L2 = ny + 1;
  187. if (east == -1) L2 = ny;
  188. jst1 = 1;
  189. jend1 = ny;
  190. if (west == -1) jst1 = 4;
  191. if (east == -1) jend1 = ny - 3;
  192. for (k=2; k<=nz-1; k++) {
  193. for (j=L1; j<=L2; j++) {
  194. for (i=ist; i<=iend; i++) {
  195. flux(1,i,j,k) = u(3,i,j,k);
  196. u31 = u(3,i,j,k) / u(1,i,j,k);
  197. q = 0.50 * ( u(2,i,j,k) * u(2,i,j,k)
  198. + u(3,i,j,k) * u(3,i,j,k)
  199. + u(4,i,j,k) * u(4,i,j,k) )
  200. / u(1,i,j,k);
  201. flux(2,i,j,k) = u(2,i,j,k) * u31 ;
  202. flux(3,i,j,k) = u(3,i,j,k) * u31 + c2 * (u(5,i,j,k)-q);
  203. flux(4,i,j,k) = u(4,i,j,k) * u31;
  204. flux(5,i,j,k) = ( c1 * u(5,i,j,k) - c2 * q ) * u31;
  205. }
  206. }
  207. for (j=jst; j<=jend; j++) {
  208. for (i=ist; i<=iend; i++) {
  209. for (m=1; m<=5; m++) {
  210. rsd(m,i,j,k) = rsd(m,i,j,k)
  211. - ty2 * ( flux(m,i,j+1,k) - flux(m,i,j-1,k) );
  212. }
  213. }
  214. }
  215. for (j=jst; j<=L2; j++) {
  216. for (i=ist; i<=iend; i++) {
  217. tmp = 1.0 / u(1,i,j,k);
  218. u21j = tmp * u(2,i,j,k);
  219. u31j = tmp * u(3,i,j,k);
  220. u41j = tmp * u(4,i,j,k);
  221. u51j = tmp * u(5,i,j,k);
  222. tmp = 1.0 / u(1,i,j-1,k);
  223. u21jm1 = tmp * u(2,i,j-1,k);
  224. u31jm1 = tmp * u(3,i,j-1,k);
  225. u41jm1 = tmp * u(4,i,j-1,k);
  226. u51jm1 = tmp * u(5,i,j-1,k);
  227. flux(2,i,j,k) = ty3 * ( u21j - u21jm1 );
  228. flux(3,i,j,k) = (4.0/3.0) * ty3 * (u31j-u31jm1);
  229. flux(4,i,j,k) = ty3 * ( u41j - u41jm1 );
  230. flux(5,i,j,k) = 0.50 * ( 1.0 - c1*c5 )
  231. * ty3 * ( ( u21j *u21j + u31j *u31j + u41j *u41j )
  232. - ( u21jm1*u21jm1 + u31jm1*u31jm1 + u41jm1*u41jm1 ) )
  233. + (1.0/6.0)
  234. * ty3 * ( u31j*u31j - u31jm1*u31jm1 )
  235. + c1 * c5 * ty3 * ( u51j - u51jm1 );
  236. }
  237. }
  238. for (j=jst; j<=jend; j++) {
  239. for (i=ist; i<=iend; i++) {
  240. rsd(1,i,j,k) = rsd(1,i,j,k)
  241. + dy1 * ty1 * ( u(1,i,j-1,k)
  242. - 2.0 * u(1,i,j,k)
  243. + u(1,i,j+1,k) );
  244. rsd(2,i,j,k) = rsd(2,i,j,k)
  245. + ty3 * c3 * c4 * ( flux(2,i,j+1,k) - flux(2,i,j,k) )
  246. + dy2 * ty1 * ( u(2,i,j-1,k)
  247. - 2.0 * u(2,i,j,k)
  248. + u(2,i,j+1,k) );
  249. rsd(3,i,j,k) = rsd(3,i,j,k)
  250. + ty3 * c3 * c4 * ( flux(3,i,j+1,k) - flux(3,i,j,k) )
  251. + dy3 * ty1 * ( u(3,i,j-1,k)
  252. - 2.0 * u(3,i,j,k)
  253. + u(3,i,j+1,k) );
  254. rsd(4,i,j,k) = rsd(4,i,j,k)
  255. + ty3 * c3 * c4 * ( flux(4,i,j+1,k) - flux(4,i,j,k) )
  256. + dy4 * ty1 * ( u(4,i,j-1,k)
  257. - 2.0 * u(4,i,j,k)
  258. + u(4,i,j+1,k) );
  259. rsd(5,i,j,k) = rsd(5,i,j,k)
  260. + ty3 * c3 * c4 * ( flux(5,i,j+1,k) - flux(5,i,j,k) )
  261. + dy5 * ty1 * ( u(5,i,j-1,k)
  262. - 2.0 * u(5,i,j,k)
  263. + u(5,i,j+1,k) );
  264. }
  265. }
  266. //c---------------------------------------------------------------------
  267. //c fourth-order dissipation
  268. //c---------------------------------------------------------------------
  269. if (west == -1) {
  270. for (i=ist; i<=iend; i++) {
  271. for (m=1; m<=5; m++) {
  272. rsd(m,i,2,k) = rsd(m,i,2,k)
  273. - dssp * ( + 5.0 * u(m,i,2,k)
  274. - 4.0 * u(m,i,3,k)
  275. + u(m,i,4,k) );
  276. rsd(m,i,3,k) = rsd(m,i,3,k)
  277. - dssp * ( - 4.0 * u(m,i,2,k)
  278. + 6.0 * u(m,i,3,k)
  279. - 4.0 * u(m,i,4,k)
  280. + u(m,i,5,k) );
  281. }
  282. }
  283. }
  284. for (j=jst1; j<=jend1; j++) {
  285. for (i=ist; i<=iend; i++) {
  286. for (m=1; m<=5; m++) {
  287. rsd(m,i,j,k) = rsd(m,i,j,k)
  288. - dssp * ( u(m,i,j-2,k)
  289. - 4.0 * u(m,i,j-1,k)
  290. + 6.0 * u(m,i,j,k)
  291. - 4.0 * u(m,i,j+1,k)
  292. + u(m,i,j+2,k) );
  293. }
  294. }
  295. }
  296. if (east == -1) {
  297. for (i=ist; i<=iend; i++) {
  298. for (m=1; m<=5; m++) {
  299. rsd(m,i,ny-2,k) = rsd(m,i,ny-2,k)
  300. - dssp * ( u(m,i,ny-4,k)
  301. - 4.0 * u(m,i,ny-3,k)
  302. + 6.0 * u(m,i,ny-2,k)
  303. - 4.0 * u(m,i,ny-1,k) );
  304. rsd(m,i,ny-1,k) = rsd(m,i,ny-1,k)
  305. - dssp * ( u(m,i,ny-3,k)
  306. - 4.0 * u(m,i,ny-2,k)
  307. + 5.0 * u(m,i,ny-1,k) );
  308. }
  309. }
  310. }
  311. }
  312. //c---------------------------------------------------------------------
  313. //c zeta-direction flux differences
  314. //c---------------------------------------------------------------------
  315. for (k=1; k<=nz; k++) {
  316. for (j=jst; j<=jend; j++) {
  317. for (i=ist; i<=iend; i++) {
  318. flux(1,i,j,k) = u(4,i,j,k);
  319. u41 = u(4,i,j,k) / u(1,i,j,k);
  320. q = 0.50 * ( u(2,i,j,k) * u(2,i,j,k)
  321. + u(3,i,j,k) * u(3,i,j,k)
  322. + u(4,i,j,k) * u(4,i,j,k) )
  323. / u(1,i,j,k);
  324. flux(2,i,j,k) = u(2,i,j,k) * u41 ;
  325. flux(3,i,j,k) = u(3,i,j,k) * u41 ;
  326. flux(4,i,j,k) = u(4,i,j,k) * u41 + c2 * (u(5,i,j,k)-q);
  327. flux(5,i,j,k) = ( c1 * u(5,i,j,k) - c2 * q ) * u41;
  328. }
  329. }
  330. }
  331. for (k=2; k<=nz-1; k++) {
  332. for (j=jst; j<=jend; j++) {
  333. for (i=ist; i<=iend; i++) {
  334. for (m=1; m<=5; m++) {
  335. rsd(m,i,j,k) = rsd(m,i,j,k)
  336. - tz2 * ( flux(m,i,j,k+1) - flux(m,i,j,k-1) );
  337. }
  338. }
  339. }
  340. }
  341. for (k=2; k<=nz; k++) {
  342. for (j=jst; j<=jend; j++) {
  343. for (i=ist; i<=iend; i++) {
  344. tmp = 1.0 / u(1,i,j,k);
  345. u21k = tmp * u(2,i,j,k);
  346. u31k = tmp * u(3,i,j,k);
  347. u41k = tmp * u(4,i,j,k);
  348. u51k = tmp * u(5,i,j,k);
  349. tmp = 1.0 / u(1,i,j,k-1);
  350. u21km1 = tmp * u(2,i,j,k-1);
  351. u31km1 = tmp * u(3,i,j,k-1);
  352. u41km1 = tmp * u(4,i,j,k-1);
  353. u51km1 = tmp * u(5,i,j,k-1);
  354. flux(2,i,j,k) = tz3 * ( u21k - u21km1 );
  355. flux(3,i,j,k) = tz3 * ( u31k - u31km1 );
  356. flux(4,i,j,k) = (4.0/3.0) * tz3 * (u41k-u41km1);
  357. flux(5,i,j,k) = 0.50 * ( 1.0 - c1*c5 )
  358. * tz3 * ( ( u21k *u21k + u31k *u31k + u41k *u41k )
  359. - ( u21km1*u21km1 + u31km1*u31km1 + u41km1*u41km1 ) )
  360. + (1.0/6.0)
  361. * tz3 * ( u41k*u41k - u41km1*u41km1 )
  362. + c1 * c5 * tz3 * ( u51k - u51km1 );
  363. }
  364. }
  365. }
  366. for (k=2; k<=nz-1; k++) {
  367. for (j=jst; j<=jend; j++) {
  368. for (i=ist; i<=iend; i++) {
  369. rsd(1,i,j,k) = rsd(1,i,j,k)
  370. + dz1 * tz1 * ( u(1,i,j,k-1)
  371. - 2.0 * u(1,i,j,k)
  372. + u(1,i,j,k+1) );
  373. rsd(2,i,j,k) = rsd(2,i,j,k)
  374. + tz3 * c3 * c4 * ( flux(2,i,j,k+1) - flux(2,i,j,k) )
  375. + dz2 * tz1 * ( u(2,i,j,k-1)
  376. - 2.0 * u(2,i,j,k)
  377. + u(2,i,j,k+1) );
  378. rsd(3,i,j,k) = rsd(3,i,j,k)
  379. + tz3 * c3 * c4 * ( flux(3,i,j,k+1) - flux(3,i,j,k) )
  380. + dz3 * tz1 * ( u(3,i,j,k-1)
  381. - 2.0 * u(3,i,j,k)
  382. + u(3,i,j,k+1) );
  383. rsd(4,i,j,k) = rsd(4,i,j,k)
  384. + tz3 * c3 * c4 * ( flux(4,i,j,k+1) - flux(4,i,j,k) )
  385. + dz4 * tz1 * ( u(4,i,j,k-1)
  386. - 2.0 * u(4,i,j,k)
  387. + u(4,i,j,k+1) );
  388. rsd(5,i,j,k) = rsd(5,i,j,k)
  389. + tz3 * c3 * c4 * ( flux(5,i,j,k+1) - flux(5,i,j,k) )
  390. + dz5 * tz1 * ( u(5,i,j,k-1)
  391. - 2.0 * u(5,i,j,k)
  392. + u(5,i,j,k+1) );
  393. }
  394. }
  395. }
  396. //c---------------------------------------------------------------------
  397. //c fourth-order dissipation
  398. //c---------------------------------------------------------------------
  399. for (j=jst; j<=jend; j++) {
  400. for (i=ist; i<=iend; i++) {
  401. for (m=1; m<=5; m++) {
  402. rsd(m,i,j,2) = rsd(m,i,j,2)
  403. - dssp * ( + 5.0 * u(m,i,j,2)
  404. - 4.0 * u(m,i,j,3)
  405. + u(m,i,j,4) );
  406. rsd(m,i,j,3) = rsd(m,i,j,3)
  407. - dssp * ( - 4.0 * u(m,i,j,2)
  408. + 6.0 * u(m,i,j,3)
  409. - 4.0 * u(m,i,j,4)
  410. + u(m,i,j,5) );
  411. }
  412. }
  413. }
  414. for (k=4; k<=nz-3; k++) {
  415. for (j=jst; j<=jend; j++) {
  416. for (i=ist; i<=iend; i++) {
  417. for (m=1; m<=5; m++) {
  418. rsd(m,i,j,k) = rsd(m,i,j,k)
  419. - dssp * ( u(m,i,j,k-2)
  420. - 4.0 * u(m,i,j,k-1)
  421. + 6.0 * u(m,i,j,k)
  422. - 4.0 * u(m,i,j,k+1)
  423. + u(m,i,j,k+2) );
  424. }
  425. }
  426. }
  427. }
  428. for (j=jst; j<=jend; j++) {
  429. for (i=ist; i<=iend; i++) {
  430. for (m=1; m<=5; m++) {
  431. rsd(m,i,j,nz-2) = rsd(m,i,j,nz-2)
  432. - dssp * ( u(m,i,j,nz-4)
  433. - 4.0 * u(m,i,j,nz-3)
  434. + 6.0 * u(m,i,j,nz-2)
  435. - 4.0 * u(m,i,j,nz-1) );
  436. rsd(m,i,j,nz-1) = rsd(m,i,j,nz-1)
  437. - dssp * ( u(m,i,j,nz-3)
  438. - 4.0 * u(m,i,j,nz-2)
  439. + 5.0 * u(m,i,j,nz-1) );
  440. }
  441. }
  442. }
  443. return;
  444. }