exact_rhs.c.svn-base 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376
  1. //---------------------------------------------------------------------
  2. //
  3. // Copyright 2010 Intel Corporation
  4. //
  5. // Licensed under the Apache License, Version 2.0 (the "License");
  6. // you may not use this file except in compliance with the License.
  7. // You may obtain a copy of the License at
  8. //
  9. // http://www.apache.org/licenses/LICENSE-2.0
  10. //
  11. // Unless required by applicable law or agreed to in writing, software
  12. // distributed under the License is distributed on an "AS IS" BASIS,
  13. // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  14. // See the License for the specific language governing permissions and
  15. // limitations under the License.
  16. //
  17. //---------------------------------------------------------------------
  18. #include "header.h"
  19. void exact_rhs() {
  20. //---------------------------------------------------------------------
  21. //---------------------------------------------------------------------
  22. //---------------------------------------------------------------------
  23. // compute the right hand side based on exact solution
  24. //---------------------------------------------------------------------
  25. double dtemp[5], xi, eta, zeta, dtpp;
  26. int c, m, i, j, k, ip1, im1, jp1,
  27. jm1, km1, kp1;
  28. #define dtemp(m) dtemp[m-1]
  29. //---------------------------------------------------------------------
  30. // loop over all cells owned by this node
  31. //---------------------------------------------------------------------
  32. for (c = 1; c <= ncells; c++) {
  33. //---------------------------------------------------------------------
  34. // initialize
  35. //---------------------------------------------------------------------
  36. for (k = 0; k <= cell_size(3,c)-1; k++) {
  37. for (j = 0; j <= cell_size(2,c)-1; j++) {
  38. for (i = 0; i <= cell_size(1,c)-1; i++) {
  39. for (m = 1; m <= 5; m++) {
  40. forcing(m,i,j,k,c) = 0.0e0;
  41. }
  42. }
  43. }
  44. }
  45. //---------------------------------------------------------------------
  46. // xi-direction flux differences
  47. //---------------------------------------------------------------------
  48. for (k = start(3,c); k <= cell_size(3,c)-end(3,c)-1; k++) {
  49. zeta = (double)(k+cell_low(3,c)) * dnzm1;
  50. for (j = start(2,c); j <= cell_size(2,c)-end(2,c)-1; j++) {
  51. eta = (double)(j+cell_low(2,c)) * dnym1;
  52. for (i = -2*(1-start(1,c)); i <= cell_size(1,c)+1-2*end(1,c); i++) {
  53. xi = (double)(i+cell_low(1,c)) * dnxm1;
  54. exact_solution(xi, eta, zeta, dtemp);
  55. for (m = 1; m <= 5; m++) {
  56. ue(i,m) = dtemp(m);
  57. }
  58. dtpp = 1.0e0 / dtemp(1);
  59. for (m = 2; m <= 5; m++) {
  60. buf(i,m) = dtpp * dtemp(m);
  61. }
  62. cuf(i) = buf(i,2) * buf(i,2);
  63. buf(i,1) = cuf(i) + buf(i,3) * buf(i,3) +
  64. buf(i,4) * buf(i,4) ;
  65. q(i) = 0.5e0*(buf(i,2)*ue(i,2) + buf(i,3)*ue(i,3) +
  66. buf(i,4)*ue(i,4));
  67. }
  68. for (i = start(1,c); i <= cell_size(1,c)-end(1,c)-1; i++) {
  69. im1 = i-1;
  70. ip1 = i+1;
  71. forcing(1,i,j,k,c) = forcing(1,i,j,k,c) -
  72. tx2*( ue(ip1,2)-ue(im1,2) )+
  73. dx1tx1*(ue(ip1,1)-2.0e0*ue(i,1)+ue(im1,1));
  74. forcing(2,i,j,k,c) = forcing(2,i,j,k,c) - tx2 * (
  75. (ue(ip1,2)*buf(ip1,2)+c2*(ue(ip1,5)-q(ip1)))-
  76. (ue(im1,2)*buf(im1,2)+c2*(ue(im1,5)-q(im1))))+
  77. xxcon1*(buf(ip1,2)-2.0e0*buf(i,2)+buf(im1,2))+
  78. dx2tx1*( ue(ip1,2)-2.0e0* ue(i,2)+ue(im1,2));
  79. forcing(3,i,j,k,c) = forcing(3,i,j,k,c) - tx2 * (
  80. ue(ip1,3)*buf(ip1,2)-ue(im1,3)*buf(im1,2))+
  81. xxcon2*(buf(ip1,3)-2.0e0*buf(i,3)+buf(im1,3))+
  82. dx3tx1*( ue(ip1,3)-2.0e0*ue(i,3) +ue(im1,3));
  83. forcing(4,i,j,k,c) = forcing(4,i,j,k,c) - tx2*(
  84. ue(ip1,4)*buf(ip1,2)-ue(im1,4)*buf(im1,2))+
  85. xxcon2*(buf(ip1,4)-2.0e0*buf(i,4)+buf(im1,4))+
  86. dx4tx1*( ue(ip1,4)-2.0e0* ue(i,4)+ ue(im1,4));
  87. forcing(5,i,j,k,c) = forcing(5,i,j,k,c) - tx2*(
  88. buf(ip1,2)*(c1*ue(ip1,5)-c2*q(ip1))-
  89. buf(im1,2)*(c1*ue(im1,5)-c2*q(im1)))+
  90. 0.5e0*xxcon3*(buf(ip1,1)-2.0e0*buf(i,1)+
  91. buf(im1,1))+
  92. xxcon4*(cuf(ip1)-2.0e0*cuf(i)+cuf(im1))+
  93. xxcon5*(buf(ip1,5)-2.0e0*buf(i,5)+buf(im1,5))+
  94. dx5tx1*( ue(ip1,5)-2.0e0* ue(i,5)+ ue(im1,5));
  95. }
  96. //---------------------------------------------------------------------
  97. // Fourth-order dissipation
  98. //---------------------------------------------------------------------
  99. if (start(1,c) > 0) {
  100. for (m = 1; m <= 5; m++) {
  101. i = 1;
  102. forcing(m,i,j,k,c) = forcing(m,i,j,k,c) - dssp *
  103. (5.0e0*ue(i,m) - 4.0e0*ue(i+1,m) +ue(i+2,m));
  104. i = 2;
  105. forcing(m,i,j,k,c) = forcing(m,i,j,k,c) - dssp *
  106. (-4.0e0*ue(i-1,m) + 6.0e0*ue(i,m) -
  107. 4.0e0*ue(i+1,m) + ue(i+2,m));
  108. }
  109. }
  110. for (i = start(1,c)*3; i <= cell_size(1,c)-3*end(1,c)-1; i++) {
  111. for (m = 1; m <= 5; m++) {
  112. forcing(m,i,j,k,c) = forcing(m,i,j,k,c) - dssp*
  113. (ue(i-2,m) - 4.0e0*ue(i-1,m) +
  114. 6.0e0*ue(i,m) - 4.0e0*ue(i+1,m) + ue(i+2,m));
  115. }
  116. }
  117. if (end(1,c) > 0) {
  118. for (m = 1; m <= 5; m++) {
  119. i = cell_size(1,c)-3;
  120. forcing(m,i,j,k,c) = forcing(m,i,j,k,c) - dssp *
  121. (ue(i-2,m) - 4.0e0*ue(i-1,m) +
  122. 6.0e0*ue(i,m) - 4.0e0*ue(i+1,m));
  123. i = cell_size(1,c)-2;
  124. forcing(m,i,j,k,c) = forcing(m,i,j,k,c) - dssp *
  125. (ue(i-2,m) - 4.0e0*ue(i-1,m) + 5.0e0*ue(i,m));
  126. }
  127. }
  128. }
  129. }
  130. //---------------------------------------------------------------------
  131. // eta-direction flux differences
  132. //---------------------------------------------------------------------
  133. for (k = start(3,c); k <= cell_size(3,c)-end(3,c)-1; k++) {
  134. zeta = (double)(k+cell_low(3,c)) * dnzm1;
  135. for (i = start(1,c); i <= cell_size(1,c)-end(1,c)-1; i++) {
  136. xi = (double)(i+cell_low(1,c)) * dnxm1;
  137. for (j = -2*(1-start(2,c)); j <= cell_size(2,c)+1-2*end(2,c); j++) {
  138. eta = (double)(j+cell_low(2,c)) * dnym1;
  139. exact_solution(xi, eta, zeta, dtemp);
  140. for (m = 1; m <= 5; m++) {
  141. ue(j,m) = dtemp(m);
  142. }
  143. dtpp = 1.0e0/dtemp(1);
  144. for (m = 2; m <= 5; m++) {
  145. buf(j,m) = dtpp * dtemp(m);
  146. }
  147. cuf(j) = buf(j,3) * buf(j,3);
  148. buf(j,1) = cuf(j) + buf(j,2) * buf(j,2) +
  149. buf(j,4) * buf(j,4);
  150. q(j) = 0.5e0*(buf(j,2)*ue(j,2) + buf(j,3)*ue(j,3) +
  151. buf(j,4)*ue(j,4));
  152. }
  153. for (j = start(2,c); j <= cell_size(2,c)-end(2,c)-1; j++) {
  154. jm1 = j-1;
  155. jp1 = j+1;
  156. forcing(1,i,j,k,c) = forcing(1,i,j,k,c) -
  157. ty2*( ue(jp1,3)-ue(jm1,3) )+
  158. dy1ty1*(ue(jp1,1)-2.0e0*ue(j,1)+ue(jm1,1));
  159. forcing(2,i,j,k,c) = forcing(2,i,j,k,c) - ty2*(
  160. ue(jp1,2)*buf(jp1,3)-ue(jm1,2)*buf(jm1,3))+
  161. yycon2*(buf(jp1,2)-2.0e0*buf(j,2)+buf(jm1,2))+
  162. dy2ty1*( ue(jp1,2)-2.0* ue(j,2)+ ue(jm1,2));
  163. forcing(3,i,j,k,c) = forcing(3,i,j,k,c) - ty2*(
  164. (ue(jp1,3)*buf(jp1,3)+c2*(ue(jp1,5)-q(jp1)))-
  165. (ue(jm1,3)*buf(jm1,3)+c2*(ue(jm1,5)-q(jm1))))+
  166. yycon1*(buf(jp1,3)-2.0e0*buf(j,3)+buf(jm1,3))+
  167. dy3ty1*( ue(jp1,3)-2.0e0*ue(j,3) +ue(jm1,3));
  168. forcing(4,i,j,k,c) = forcing(4,i,j,k,c) - ty2*(
  169. ue(jp1,4)*buf(jp1,3)-ue(jm1,4)*buf(jm1,3))+
  170. yycon2*(buf(jp1,4)-2.0e0*buf(j,4)+buf(jm1,4))+
  171. dy4ty1*( ue(jp1,4)-2.0e0*ue(j,4)+ ue(jm1,4));
  172. forcing(5,i,j,k,c) = forcing(5,i,j,k,c) - ty2*(
  173. buf(jp1,3)*(c1*ue(jp1,5)-c2*q(jp1))-
  174. buf(jm1,3)*(c1*ue(jm1,5)-c2*q(jm1)))+
  175. 0.5e0*yycon3*(buf(jp1,1)-2.0e0*buf(j,1)+
  176. buf(jm1,1))+
  177. yycon4*(cuf(jp1)-2.0e0*cuf(j)+cuf(jm1))+
  178. yycon5*(buf(jp1,5)-2.0e0*buf(j,5)+buf(jm1,5))+
  179. dy5ty1*(ue(jp1,5)-2.0e0*ue(j,5)+ue(jm1,5));
  180. }
  181. //---------------------------------------------------------------------
  182. // Fourth-order dissipation
  183. //---------------------------------------------------------------------
  184. if (start(2,c) > 0) {
  185. for (m = 1; m <= 5; m++) {
  186. j = 1;
  187. forcing(m,i,j,k,c) = forcing(m,i,j,k,c) - dssp *
  188. (5.0e0*ue(j,m) - 4.0e0*ue(j+1,m) +ue(j+2,m));
  189. j = 2;
  190. forcing(m,i,j,k,c) = forcing(m,i,j,k,c) - dssp *
  191. (-4.0e0*ue(j-1,m) + 6.0e0*ue(j,m) -
  192. 4.0e0*ue(j+1,m) + ue(j+2,m));
  193. }
  194. }
  195. for (j = start(2,c)*3; j <= cell_size(2,c)-3*end(2,c)-1; j++) {
  196. for (m = 1; m <= 5; m++) {
  197. forcing(m,i,j,k,c) = forcing(m,i,j,k,c) - dssp*
  198. (ue(j-2,m) - 4.0e0*ue(j-1,m) +
  199. 6.0e0*ue(j,m) - 4.0e0*ue(j+1,m) + ue(j+2,m));
  200. }
  201. }
  202. if (end(2,c) > 0) {
  203. for (m = 1; m <= 5; m++) {
  204. j = cell_size(2,c)-3;
  205. forcing(m,i,j,k,c) = forcing(m,i,j,k,c) - dssp *
  206. (ue(j-2,m) - 4.0e0*ue(j-1,m) +
  207. 6.0e0*ue(j,m) - 4.0e0*ue(j+1,m));
  208. j = cell_size(2,c)-2;
  209. forcing(m,i,j,k,c) = forcing(m,i,j,k,c) - dssp *
  210. (ue(j-2,m) - 4.0e0*ue(j-1,m) + 5.0e0*ue(j,m));
  211. }
  212. }
  213. }
  214. }
  215. //---------------------------------------------------------------------
  216. // zeta-direction flux differences
  217. //---------------------------------------------------------------------
  218. for (j = start(2,c); j <= cell_size(2,c)-end(2,c)-1; j++) {
  219. eta = (double)(j+cell_low(2,c)) * dnym1;
  220. for (i = start(1,c); i <= cell_size(1,c)-end(1,c)-1; i++) {
  221. xi = (double)(i+cell_low(1,c)) * dnxm1;
  222. for (k = -2*(1-start(3,c)); k <= cell_size(3,c)+1-2*end(3,c); k++) {
  223. zeta = (double)(k+cell_low(3,c)) * dnzm1;
  224. exact_solution(xi, eta, zeta, dtemp);
  225. for (m = 1; m <= 5; m++) {
  226. ue(k,m) = dtemp(m);
  227. }
  228. dtpp = 1.0e0/dtemp(1);
  229. for (m = 2; m <= 5; m++) {
  230. buf(k,m) = dtpp * dtemp(m);
  231. }
  232. cuf(k) = buf(k,4) * buf(k,4);
  233. buf(k,1) = cuf(k) + buf(k,2) * buf(k,2) +
  234. buf(k,3) * buf(k,3);
  235. q(k) = 0.5e0*(buf(k,2)*ue(k,2) + buf(k,3)*ue(k,3) +
  236. buf(k,4)*ue(k,4));
  237. }
  238. for (k = start(3,c); k <= cell_size(3,c)-end(3,c)-1; k++) {
  239. km1 = k-1;
  240. kp1 = k+1;
  241. forcing(1,i,j,k,c) = forcing(1,i,j,k,c) -
  242. tz2*( ue(kp1,4)-ue(km1,4) )+
  243. dz1tz1*(ue(kp1,1)-2.0e0*ue(k,1)+ue(km1,1));
  244. forcing(2,i,j,k,c) = forcing(2,i,j,k,c) - tz2 * (
  245. ue(kp1,2)*buf(kp1,4)-ue(km1,2)*buf(km1,4))+
  246. zzcon2*(buf(kp1,2)-2.0e0*buf(k,2)+buf(km1,2))+
  247. dz2tz1*( ue(kp1,2)-2.0e0* ue(k,2)+ ue(km1,2));
  248. forcing(3,i,j,k,c) = forcing(3,i,j,k,c) - tz2 * (
  249. ue(kp1,3)*buf(kp1,4)-ue(km1,3)*buf(km1,4))+
  250. zzcon2*(buf(kp1,3)-2.0e0*buf(k,3)+buf(km1,3))+
  251. dz3tz1*(ue(kp1,3)-2.0e0*ue(k,3)+ue(km1,3));
  252. forcing(4,i,j,k,c) = forcing(4,i,j,k,c) - tz2 * (
  253. (ue(kp1,4)*buf(kp1,4)+c2*(ue(kp1,5)-q(kp1)))-
  254. (ue(km1,4)*buf(km1,4)+c2*(ue(km1,5)-q(km1))))+
  255. zzcon1*(buf(kp1,4)-2.0e0*buf(k,4)+buf(km1,4))+
  256. dz4tz1*( ue(kp1,4)-2.0e0*ue(k,4) +ue(km1,4));
  257. forcing(5,i,j,k,c) = forcing(5,i,j,k,c) - tz2 * (
  258. buf(kp1,4)*(c1*ue(kp1,5)-c2*q(kp1))-
  259. buf(km1,4)*(c1*ue(km1,5)-c2*q(km1)))+
  260. 0.5e0*zzcon3*(buf(kp1,1)-2.0e0*buf(k,1)
  261. +buf(km1,1))+
  262. zzcon4*(cuf(kp1)-2.0e0*cuf(k)+cuf(km1))+
  263. zzcon5*(buf(kp1,5)-2.0e0*buf(k,5)+buf(km1,5))+
  264. dz5tz1*( ue(kp1,5)-2.0e0*ue(k,5)+ ue(km1,5));
  265. }
  266. //---------------------------------------------------------------------
  267. // Fourth-order dissipation
  268. //---------------------------------------------------------------------
  269. if (start(3,c) > 0) {
  270. for (m = 1; m <= 5; m++) {
  271. k = 1;
  272. forcing(m,i,j,k,c) = forcing(m,i,j,k,c) - dssp *
  273. (5.0e0*ue(k,m) - 4.0e0*ue(k+1,m) +ue(k+2,m));
  274. k = 2;
  275. forcing(m,i,j,k,c) = forcing(m,i,j,k,c) - dssp *
  276. (-4.0e0*ue(k-1,m) + 6.0e0*ue(k,m) -
  277. 4.0e0*ue(k+1,m) + ue(k+2,m));
  278. }
  279. }
  280. for (k = start(3,c)*3; k <= cell_size(3,c)-3*end(3,c)-1; k++) {
  281. for (m = 1; m <= 5; m++) {
  282. forcing(m,i,j,k,c) = forcing(m,i,j,k,c) - dssp*
  283. (ue(k-2,m) - 4.0e0*ue(k-1,m) +
  284. 6.0e0*ue(k,m) - 4.0e0*ue(k+1,m) + ue(k+2,m));
  285. }
  286. }
  287. if (end(3,c) > 0) {
  288. for (m = 1; m <= 5; m++) {
  289. k = cell_size(3,c)-3;
  290. forcing(m,i,j,k,c) = forcing(m,i,j,k,c) - dssp *
  291. (ue(k-2,m) - 4.0e0*ue(k-1,m) +
  292. 6.0e0*ue(k,m) - 4.0e0*ue(k+1,m));
  293. k = cell_size(3,c)-2;
  294. forcing(m,i,j,k,c) = forcing(m,i,j,k,c) - dssp *
  295. (ue(k-2,m) - 4.0e0*ue(k-1,m) + 5.0e0*ue(k,m));
  296. }
  297. }
  298. }
  299. }
  300. //---------------------------------------------------------------------
  301. // now change the sign of the forcing function,
  302. //---------------------------------------------------------------------
  303. for (k = start(3,c); k <= cell_size(3,c)-end(3,c)-1; k++) {
  304. for (j = start(2,c); j <= cell_size(2,c)-end(2,c)-1; j++) {
  305. for (i = start(1,c); i <= cell_size(1,c)-end(1,c)-1; i++) {
  306. for (m = 1; m <= 5; m++) {
  307. forcing(m,i,j,k,c) = -1.e0 * forcing(m,i,j,k,c);
  308. }
  309. }
  310. }
  311. }
  312. }
  313. return;
  314. }