initialize.c 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322
  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 initialize() {
  20. //---------------------------------------------------------------------
  21. //---------------------------------------------------------------------
  22. //---------------------------------------------------------------------
  23. // This subroutine initializes the field variable u using
  24. // tri-linear transfinite interpolation of the boundary values
  25. //---------------------------------------------------------------------
  26. int c, i, j, k, m, ii, jj, kk, ix, iy, iz;
  27. double xi, eta, zeta, Pface[5*3*2], Pxi, Peta,
  28. Pzeta, temp[5];
  29. #define Pface(m,n,i) Pface[(m-1)+5*((n-1)+3*(i-1))]
  30. #define temp(m) temp[m-1]
  31. //---------------------------------------------------------------------
  32. // Later (in compute_rhs) we compute 1/u for every element. A few of
  33. // the corner elements are not used, but it convenient (and faster)
  34. // to compute the whole thing with a simple loop. Make sure those
  35. // values are nonzero by initializing the whole thing here.
  36. //---------------------------------------------------------------------
  37. for (c = 1; c <= ncells; c++) {
  38. for (kk = -1; kk <= KMAX; kk++) {
  39. for (jj = -1; jj <= JMAX; jj++) {
  40. for (ii = -1; ii <= IMAX; ii++) {
  41. for (m = 1; m <= 5; m++) {
  42. u(m, ii, jj, kk, c) = 1.0;
  43. }
  44. }
  45. }
  46. }
  47. }
  48. //---------------------------------------------------------------------
  49. //---------------------------------------------------------------------
  50. // first store the "interpolated" values everywhere on the grid
  51. //---------------------------------------------------------------------
  52. for (c = 1; c <= ncells; c++) {
  53. kk = 0;
  54. for (k = cell_low(3,c); k <= cell_high(3,c); k++) {
  55. zeta = (double)(k) * dnzm1;
  56. jj = 0;
  57. for (j = cell_low(2,c); j <= cell_high(2,c); j++) {
  58. eta = (double)(j) * dnym1;
  59. ii = 0;
  60. for (i = cell_low(1,c); i <= cell_high(1,c); i++) {
  61. xi = (double)(i) * dnxm1;
  62. for (ix = 1; ix <= 2; ix++) {
  63. exact_solution((double)(ix-1), eta, zeta,
  64. &Pface(1,1,ix));
  65. }
  66. for (iy = 1; iy <= 2; iy++) {
  67. exact_solution(xi, (double)(iy-1) , zeta,
  68. &Pface(1,2,iy));
  69. }
  70. for (iz = 1; iz <= 2; iz++) {
  71. exact_solution(xi, eta, (double)(iz-1),
  72. &Pface(1,3,iz));
  73. }
  74. for (m = 1; m <= 5; m++) {
  75. Pxi = xi * Pface(m,1,2) +
  76. (1.0e0-xi) * Pface(m,1,1);
  77. Peta = eta * Pface(m,2,2) +
  78. (1.0e0-eta) * Pface(m,2,1);
  79. Pzeta = zeta * Pface(m,3,2) +
  80. (1.0e0-zeta) * Pface(m,3,1);
  81. u(m,ii,jj,kk,c) = Pxi + Peta + Pzeta -
  82. Pxi*Peta - Pxi*Pzeta - Peta*Pzeta +
  83. Pxi*Peta*Pzeta;
  84. }
  85. ii = ii + 1;
  86. }
  87. jj = jj + 1;
  88. }
  89. kk = kk+1;
  90. }
  91. }
  92. //---------------------------------------------------------------------
  93. // now store the exact values on the boundaries
  94. //---------------------------------------------------------------------
  95. //---------------------------------------------------------------------
  96. // west face
  97. //---------------------------------------------------------------------
  98. c = slice(1,1);
  99. ii = 0;
  100. xi = 0.0e0;
  101. kk = 0;
  102. for (k = cell_low(3,c); k <= cell_high(3,c); k++) {
  103. zeta = (double)(k) * dnzm1;
  104. jj = 0;
  105. for (j = cell_low(2,c); j <= cell_high(2,c); j++) {
  106. eta = (double)(j) * dnym1;
  107. exact_solution(xi, eta, zeta, temp);
  108. for (m = 1; m <= 5; m++) {
  109. u(m,ii,jj,kk,c) = temp(m);
  110. }
  111. jj = jj + 1;
  112. }
  113. kk = kk + 1;
  114. }
  115. //---------------------------------------------------------------------
  116. // east face
  117. //---------------------------------------------------------------------
  118. c = slice(1,ncells);
  119. ii = cell_size(1,c)-1;
  120. xi = 1.0e0;
  121. kk = 0;
  122. for (k = cell_low(3,c); k <= cell_high(3,c); k++) {
  123. zeta = (double)(k) * dnzm1;
  124. jj = 0;
  125. for (j = cell_low(2,c); j <= cell_high(2,c); j++) {
  126. eta = (double)(j) * dnym1;
  127. exact_solution(xi, eta, zeta, temp);
  128. for (m = 1; m <= 5; m++) {
  129. u(m,ii,jj,kk,c) = temp(m);
  130. }
  131. jj = jj + 1;
  132. }
  133. kk = kk + 1;
  134. }
  135. //---------------------------------------------------------------------
  136. // south face
  137. //---------------------------------------------------------------------
  138. c = slice(2,1);
  139. jj = 0;
  140. eta = 0.0e0;
  141. kk = 0;
  142. for (k = cell_low(3,c); k <= cell_high(3,c); k++) {
  143. zeta = (double)(k) * dnzm1;
  144. ii = 0;
  145. for (i = cell_low(1,c); i <= cell_high(1,c); i++) {
  146. xi = (double)(i) * dnxm1;
  147. exact_solution(xi, eta, zeta, temp);
  148. for (m = 1; m <= 5; m++) {
  149. u(m,ii,jj,kk,c) = temp(m);
  150. }
  151. ii = ii + 1;
  152. }
  153. kk = kk + 1;
  154. }
  155. //---------------------------------------------------------------------
  156. // north face
  157. //---------------------------------------------------------------------
  158. c = slice(2,ncells);
  159. jj = cell_size(2,c)-1;
  160. eta = 1.0e0;
  161. kk = 0;
  162. for (k = cell_low(3,c); k <= cell_high(3,c); k++) {
  163. zeta = (double)(k) * dnzm1;
  164. ii = 0;
  165. for (i = cell_low(1,c); i <= cell_high(1,c); i++) {
  166. xi = (double)(i) * dnxm1;
  167. exact_solution(xi, eta, zeta, temp);
  168. for (m = 1; m <= 5; m++) {
  169. u(m,ii,jj,kk,c) = temp(m);
  170. }
  171. ii = ii + 1;
  172. }
  173. kk = kk + 1;
  174. }
  175. //---------------------------------------------------------------------
  176. // bottom face
  177. //---------------------------------------------------------------------
  178. c = slice(3,1);
  179. kk = 0;
  180. zeta = 0.0e0;
  181. jj = 0;
  182. for (j = cell_low(2,c); j <= cell_high(2,c); j++) {
  183. eta = (double)(j) * dnym1;
  184. ii = 0;
  185. for (i = cell_low(1,c); i <= cell_high(1,c); i++) {
  186. xi = (double)(i) *dnxm1;
  187. exact_solution(xi, eta, zeta, temp);
  188. for (m = 1; m <= 5; m++) {
  189. u(m,ii,jj,kk,c) = temp(m);
  190. }
  191. ii = ii + 1;
  192. }
  193. jj = jj + 1;
  194. }
  195. //---------------------------------------------------------------------
  196. // top face
  197. //---------------------------------------------------------------------
  198. c = slice(3,ncells);
  199. kk = cell_size(3,c)-1;
  200. zeta = 1.0e0;
  201. jj = 0;
  202. for (j = cell_low(2,c); j <= cell_high(2,c); j++) {
  203. eta = (double)(j) * dnym1;
  204. ii = 0;
  205. for (i = cell_low(1,c); i <= cell_high(1,c); i++) {
  206. xi = (double)(i) * dnxm1;
  207. exact_solution(xi, eta, zeta, temp);
  208. for (m = 1; m <= 5; m++) {
  209. u(m,ii,jj,kk,c) = temp(m);
  210. }
  211. ii = ii + 1;
  212. }
  213. jj = jj + 1;
  214. }
  215. return;
  216. }
  217. //---------------------------------------------------------------------
  218. //---------------------------------------------------------------------
  219. void lhsinit() {
  220. //---------------------------------------------------------------------
  221. //---------------------------------------------------------------------
  222. int i, j, k, d, c, m, n;
  223. //---------------------------------------------------------------------
  224. // loop over all cells
  225. //---------------------------------------------------------------------
  226. for (c = 1; c <= ncells; c++) {
  227. //---------------------------------------------------------------------
  228. // first, initialize the start and end arrays
  229. //---------------------------------------------------------------------
  230. for (d = 1; d <= 3; d++) {
  231. if (cell_coord(d,c) == 1) {
  232. start(d,c) = 1;
  233. } else {
  234. start(d,c) = 0;
  235. }
  236. if (cell_coord(d,c) == ncells) {
  237. end(d,c) = 1;
  238. } else {
  239. end(d,c) = 0;
  240. }
  241. }
  242. //---------------------------------------------------------------------
  243. // zero the whole left hand side for starters
  244. //---------------------------------------------------------------------
  245. for (k = 0; k <= cell_size(3,c)-1; k++) {
  246. for (j = 0; j <= cell_size(2,c)-1; j++) {
  247. for (i = 0; i <= cell_size(1,c)-1; i++) {
  248. for (m = 1; m <= 5; m++) {
  249. for (n = 1; n <= 5; n++) {
  250. lhsc(m,n,i,j,k,c) = 0.0e0;
  251. }
  252. }
  253. }
  254. }
  255. }
  256. }
  257. return;
  258. }
  259. //---------------------------------------------------------------------
  260. //---------------------------------------------------------------------
  261. void lhsabinit(double lhsa[], double lhsb[], int size) {
  262. #define lhsa(m,n,i) lhsa[(m-1)+5*((n-1)+5*(i+1))]
  263. #define lhsb(m,n,i) lhsb[(m-1)+5*((n-1)+5*(i+1))]
  264. int i, m, n;
  265. //---------------------------------------------------------------------
  266. // next, set all diagonal values to 1. This is overkill, but convenient
  267. //---------------------------------------------------------------------
  268. for (i = 0; i <= size; i++) {
  269. for (m = 1; m <= 5; m++) {
  270. for (n = 1; n <= 5; n++) {
  271. lhsa(m,n,i) = 0.0e0;
  272. lhsb(m,n,i) = 0.0e0;
  273. }
  274. lhsb(m,m,i) = 1.0e0;
  275. }
  276. }
  277. return;
  278. }