blts.c 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227
  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 blts(int k) {
  19. //c compute the regular-sparse, block lower triangular solution:
  20. //c local variables
  21. int i, j, m;
  22. int iex;
  23. double tmp, tmp1;
  24. double tmat[5*5];
  25. //c receive data from north and west
  26. iex = 0;
  27. exchange_1(rsd, k, iex);
  28. for (j=jst; j<=jend; j++) {
  29. for (i=ist; i<=iend; i++) {
  30. for (m=1; m<=5; m++) {
  31. rsd( m, i, j, k ) = rsd( m, i, j, k )
  32. - omega * ( a( m, 1, i, j ) * rsd( 1, i, j, k-1 )
  33. + a( m, 2, i, j ) * rsd( 2, i, j, k-1 )
  34. + a( m, 3, i, j ) * rsd( 3, i, j, k-1 )
  35. + a( m, 4, i, j ) * rsd( 4, i, j, k-1 )
  36. + a( m, 5, i, j ) * rsd( 5, i, j, k-1 ) );
  37. }
  38. }
  39. }
  40. for (j=jst; j<=jend; j++) {
  41. for (i=ist; i<=iend; i++) {
  42. for (m=1; m<=5; m++) {
  43. rsd( m, i, j, k ) = rsd( m, i, j, k )
  44. - omega * ( b( m, 1, i, j ) * rsd( 1, i, j-1, k )
  45. + c( m, 1, i, j ) * rsd( 1, i-1, j, k )
  46. + b( m, 2, i, j ) * rsd( 2, i, j-1, k )
  47. + c( m, 2, i, j ) * rsd( 2, i-1, j, k )
  48. + b( m, 3, i, j ) * rsd( 3, i, j-1, k )
  49. + c( m, 3, i, j ) * rsd( 3, i-1, j, k )
  50. + b( m, 4, i, j ) * rsd( 4, i, j-1, k )
  51. + c( m, 4, i, j ) * rsd( 4, i-1, j, k )
  52. + b( m, 5, i, j ) * rsd( 5, i, j-1, k )
  53. + c( m, 5, i, j ) * rsd( 5, i-1, j, k ) );
  54. }
  55. //c diagonal block inversion
  56. //c
  57. //c forward elimination
  58. for (m=1; m<=5; m++) {
  59. tmat( m, 1 ) = d( m, 1, i, j );
  60. tmat( m, 2 ) = d( m, 2, i, j );
  61. tmat( m, 3 ) = d( m, 3, i, j );
  62. tmat( m, 4 ) = d( m, 4, i, j );
  63. tmat( m, 5 ) = d( m, 5, i, j );
  64. }
  65. tmp1 = 1.0 / tmat( 1, 1 );
  66. tmp = tmp1 * tmat( 2, 1 );
  67. tmat( 2, 2 ) = tmat( 2, 2 )
  68. - tmp * tmat( 1, 2 );
  69. tmat( 2, 3 ) = tmat( 2, 3 )
  70. - tmp * tmat( 1, 3 );
  71. tmat( 2, 4 ) = tmat( 2, 4 )
  72. - tmp * tmat( 1, 4 );
  73. tmat( 2, 5 ) = tmat( 2, 5 )
  74. - tmp * tmat( 1, 5 );
  75. rsd( 2, i, j, k ) = rsd( 2, i, j, k )
  76. - rsd( 1, i, j, k ) * tmp;
  77. tmp = tmp1 * tmat( 3, 1 );
  78. tmat( 3, 2 ) = tmat( 3, 2 )
  79. - tmp * tmat( 1, 2 );
  80. tmat( 3, 3 ) = tmat( 3, 3 )
  81. - tmp * tmat( 1, 3 );
  82. tmat( 3, 4 ) = tmat( 3, 4 )
  83. - tmp * tmat( 1, 4 );
  84. tmat( 3, 5 ) = tmat( 3, 5 )
  85. - tmp * tmat( 1, 5 );
  86. rsd( 3, i, j, k ) = rsd( 3, i, j, k )
  87. - rsd( 1, i, j, k ) * tmp;
  88. tmp = tmp1 * tmat( 4, 1 );
  89. tmat( 4, 2 ) = tmat( 4, 2 )
  90. - tmp * tmat( 1, 2 );
  91. tmat( 4, 3 ) = tmat( 4, 3 )
  92. - tmp * tmat( 1, 3 );
  93. tmat( 4, 4 ) = tmat( 4, 4 )
  94. - tmp * tmat( 1, 4 );
  95. tmat( 4, 5 ) = tmat( 4, 5 )
  96. - tmp * tmat( 1, 5 );
  97. rsd( 4, i, j, k ) = rsd( 4, i, j, k )
  98. - rsd( 1, i, j, k ) * tmp;
  99. tmp = tmp1 * tmat( 5, 1 );
  100. tmat( 5, 2 ) = tmat( 5, 2 )
  101. - tmp * tmat( 1, 2 );
  102. tmat( 5, 3 ) = tmat( 5, 3 )
  103. - tmp * tmat( 1, 3 );
  104. tmat( 5, 4 ) = tmat( 5, 4 )
  105. - tmp * tmat( 1, 4 );
  106. tmat( 5, 5 ) = tmat( 5, 5 )
  107. - tmp * tmat( 1, 5 );
  108. rsd( 5, i, j, k ) = rsd( 5, i, j, k )
  109. - rsd( 1, i, j, k ) * tmp;
  110. tmp1 = 1.0 / tmat( 2, 2 );
  111. tmp = tmp1 * tmat( 3, 2 );
  112. tmat( 3, 3 ) = tmat( 3, 3 )
  113. - tmp * tmat( 2, 3 );
  114. tmat( 3, 4 ) = tmat( 3, 4 )
  115. - tmp * tmat( 2, 4 );
  116. tmat( 3, 5 ) = tmat( 3, 5 )
  117. - tmp * tmat( 2, 5 );
  118. rsd( 3, i, j, k ) = rsd( 3, i, j, k )
  119. - rsd( 2, i, j, k ) * tmp;
  120. tmp = tmp1 * tmat( 4, 2 );
  121. tmat( 4, 3 ) = tmat( 4, 3 )
  122. - tmp * tmat( 2, 3 );
  123. tmat( 4, 4 ) = tmat( 4, 4 )
  124. - tmp * tmat( 2, 4 );
  125. tmat( 4, 5 ) = tmat( 4, 5 )
  126. - tmp * tmat( 2, 5 );
  127. rsd( 4, i, j, k ) = rsd( 4, i, j, k )
  128. - rsd( 2, i, j, k ) * tmp;
  129. tmp = tmp1 * tmat( 5, 2 );
  130. tmat( 5, 3 ) = tmat( 5, 3 )
  131. - tmp * tmat( 2, 3 );
  132. tmat( 5, 4 ) = tmat( 5, 4 )
  133. - tmp * tmat( 2, 4 );
  134. tmat( 5, 5 ) = tmat( 5, 5 )
  135. - tmp * tmat( 2, 5 );
  136. rsd( 5, i, j, k ) = rsd( 5, i, j, k )
  137. - rsd( 2, i, j, k ) * tmp;
  138. tmp1 = 1.0 / tmat( 3, 3 );
  139. tmp = tmp1 * tmat( 4, 3 );
  140. tmat( 4, 4 ) = tmat( 4, 4 )
  141. - tmp * tmat( 3, 4 );
  142. tmat( 4, 5 ) = tmat( 4, 5 )
  143. - tmp * tmat( 3, 5 );
  144. rsd( 4, i, j, k ) = rsd( 4, i, j, k )
  145. - rsd( 3, i, j, k ) * tmp;
  146. tmp = tmp1 * tmat( 5, 3 );
  147. tmat( 5, 4 ) = tmat( 5, 4 )
  148. - tmp * tmat( 3, 4 );
  149. tmat( 5, 5 ) = tmat( 5, 5 )
  150. - tmp * tmat( 3, 5 );
  151. rsd( 5, i, j, k ) = rsd( 5, i, j, k )
  152. - rsd( 3, i, j, k ) * tmp;
  153. tmp1 = 1.0 / tmat( 4, 4 );
  154. tmp = tmp1 * tmat( 5, 4 );
  155. tmat( 5, 5 ) = tmat( 5, 5 )
  156. - tmp * tmat( 4, 5 );
  157. rsd( 5, i, j, k ) = rsd( 5, i, j, k )
  158. - rsd( 4, i, j, k ) * tmp;
  159. //c back substitution
  160. rsd( 5, i, j, k ) = rsd( 5, i, j, k )
  161. / tmat( 5, 5 );
  162. rsd( 4, i, j, k ) = rsd( 4, i, j, k )
  163. - tmat( 4, 5 ) * rsd( 5, i, j, k );
  164. rsd( 4, i, j, k ) = rsd( 4, i, j, k )
  165. / tmat( 4, 4 );
  166. rsd( 3, i, j, k ) = rsd( 3, i, j, k )
  167. - tmat( 3, 4 ) * rsd( 4, i, j, k )
  168. - tmat( 3, 5 ) * rsd( 5, i, j, k );
  169. rsd( 3, i, j, k ) = rsd( 3, i, j, k )
  170. / tmat( 3, 3 );
  171. rsd( 2, i, j, k ) = rsd( 2, i, j, k )
  172. - tmat( 2, 3 ) * rsd( 3, i, j, k )
  173. - tmat( 2, 4 ) * rsd( 4, i, j, k )
  174. - tmat( 2, 5 ) * rsd( 5, i, j, k );
  175. rsd( 2, i, j, k ) = rsd( 2, i, j, k )
  176. / tmat( 2, 2 );
  177. rsd( 1, i, j, k ) = rsd( 1, i, j, k )
  178. - tmat( 1, 2 ) * rsd( 2, i, j, k )
  179. - tmat( 1, 3 ) * rsd( 3, i, j, k )
  180. - tmat( 1, 4 ) * rsd( 4, i, j, k )
  181. - tmat( 1, 5 ) * rsd( 5, i, j, k );
  182. rsd( 1, i, j, k ) = rsd( 1, i, j, k )
  183. / tmat( 1, 1 );
  184. }
  185. }
  186. //c send data to east and south
  187. iex = 2;
  188. exchange_1(rsd, k, iex);
  189. return;
  190. }