dgtts2.c 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262
  1. /* dgtts2.f -- translated by f2c (version 20061008).
  2. You must link the resulting object file with libf2c:
  3. on Microsoft Windows system, link with libf2c.lib;
  4. on Linux or Unix systems, link with .../path/to/libf2c.a -lm
  5. or, if you install libf2c.a in a standard place, with -lf2c -lm
  6. -- in that order, at the end of the command line, as in
  7. cc *.o -lf2c -lm
  8. Source for libf2c is in /netlib/f2c/libf2c.zip, e.g.,
  9. http://www.netlib.org/f2c/libf2c.zip
  10. */
  11. #include "f2c.h"
  12. #include "blaswrap.h"
  13. /* Subroutine */ int _starpu_dgtts2_(integer *itrans, integer *n, integer *nrhs,
  14. doublereal *dl, doublereal *d__, doublereal *du, doublereal *du2,
  15. integer *ipiv, doublereal *b, integer *ldb)
  16. {
  17. /* System generated locals */
  18. integer b_dim1, b_offset, i__1, i__2;
  19. /* Local variables */
  20. integer i__, j, ip;
  21. doublereal temp;
  22. /* -- LAPACK auxiliary routine (version 3.2) -- */
  23. /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */
  24. /* November 2006 */
  25. /* .. Scalar Arguments .. */
  26. /* .. */
  27. /* .. Array Arguments .. */
  28. /* .. */
  29. /* Purpose */
  30. /* ======= */
  31. /* DGTTS2 solves one of the systems of equations */
  32. /* A*X = B or A'*X = B, */
  33. /* with a tridiagonal matrix A using the LU factorization computed */
  34. /* by DGTTRF. */
  35. /* Arguments */
  36. /* ========= */
  37. /* ITRANS (input) INTEGER */
  38. /* Specifies the form of the system of equations. */
  39. /* = 0: A * X = B (No transpose) */
  40. /* = 1: A'* X = B (Transpose) */
  41. /* = 2: A'* X = B (Conjugate transpose = Transpose) */
  42. /* N (input) INTEGER */
  43. /* The order of the matrix A. */
  44. /* NRHS (input) INTEGER */
  45. /* The number of right hand sides, i.e., the number of columns */
  46. /* of the matrix B. NRHS >= 0. */
  47. /* DL (input) DOUBLE PRECISION array, dimension (N-1) */
  48. /* The (n-1) multipliers that define the matrix L from the */
  49. /* LU factorization of A. */
  50. /* D (input) DOUBLE PRECISION array, dimension (N) */
  51. /* The n diagonal elements of the upper triangular matrix U from */
  52. /* the LU factorization of A. */
  53. /* DU (input) DOUBLE PRECISION array, dimension (N-1) */
  54. /* The (n-1) elements of the first super-diagonal of U. */
  55. /* DU2 (input) DOUBLE PRECISION array, dimension (N-2) */
  56. /* The (n-2) elements of the second super-diagonal of U. */
  57. /* IPIV (input) INTEGER array, dimension (N) */
  58. /* The pivot indices; for 1 <= i <= n, row i of the matrix was */
  59. /* interchanged with row IPIV(i). IPIV(i) will always be either */
  60. /* i or i+1; IPIV(i) = i indicates a row interchange was not */
  61. /* required. */
  62. /* B (input/output) DOUBLE PRECISION array, dimension (LDB,NRHS) */
  63. /* On entry, the matrix of right hand side vectors B. */
  64. /* On exit, B is overwritten by the solution vectors X. */
  65. /* LDB (input) INTEGER */
  66. /* The leading dimension of the array B. LDB >= max(1,N). */
  67. /* ===================================================================== */
  68. /* .. Local Scalars .. */
  69. /* .. */
  70. /* .. Executable Statements .. */
  71. /* Quick return if possible */
  72. /* Parameter adjustments */
  73. --dl;
  74. --d__;
  75. --du;
  76. --du2;
  77. --ipiv;
  78. b_dim1 = *ldb;
  79. b_offset = 1 + b_dim1;
  80. b -= b_offset;
  81. /* Function Body */
  82. if (*n == 0 || *nrhs == 0) {
  83. return 0;
  84. }
  85. if (*itrans == 0) {
  86. /* Solve A*X = B using the LU factorization of A, */
  87. /* overwriting each right hand side vector with its solution. */
  88. if (*nrhs <= 1) {
  89. j = 1;
  90. L10:
  91. /* Solve L*x = b. */
  92. i__1 = *n - 1;
  93. for (i__ = 1; i__ <= i__1; ++i__) {
  94. ip = ipiv[i__];
  95. temp = b[i__ + 1 - ip + i__ + j * b_dim1] - dl[i__] * b[ip +
  96. j * b_dim1];
  97. b[i__ + j * b_dim1] = b[ip + j * b_dim1];
  98. b[i__ + 1 + j * b_dim1] = temp;
  99. /* L20: */
  100. }
  101. /* Solve U*x = b. */
  102. b[*n + j * b_dim1] /= d__[*n];
  103. if (*n > 1) {
  104. b[*n - 1 + j * b_dim1] = (b[*n - 1 + j * b_dim1] - du[*n - 1]
  105. * b[*n + j * b_dim1]) / d__[*n - 1];
  106. }
  107. for (i__ = *n - 2; i__ >= 1; --i__) {
  108. b[i__ + j * b_dim1] = (b[i__ + j * b_dim1] - du[i__] * b[i__
  109. + 1 + j * b_dim1] - du2[i__] * b[i__ + 2 + j * b_dim1]
  110. ) / d__[i__];
  111. /* L30: */
  112. }
  113. if (j < *nrhs) {
  114. ++j;
  115. goto L10;
  116. }
  117. } else {
  118. i__1 = *nrhs;
  119. for (j = 1; j <= i__1; ++j) {
  120. /* Solve L*x = b. */
  121. i__2 = *n - 1;
  122. for (i__ = 1; i__ <= i__2; ++i__) {
  123. if (ipiv[i__] == i__) {
  124. b[i__ + 1 + j * b_dim1] -= dl[i__] * b[i__ + j *
  125. b_dim1];
  126. } else {
  127. temp = b[i__ + j * b_dim1];
  128. b[i__ + j * b_dim1] = b[i__ + 1 + j * b_dim1];
  129. b[i__ + 1 + j * b_dim1] = temp - dl[i__] * b[i__ + j *
  130. b_dim1];
  131. }
  132. /* L40: */
  133. }
  134. /* Solve U*x = b. */
  135. b[*n + j * b_dim1] /= d__[*n];
  136. if (*n > 1) {
  137. b[*n - 1 + j * b_dim1] = (b[*n - 1 + j * b_dim1] - du[*n
  138. - 1] * b[*n + j * b_dim1]) / d__[*n - 1];
  139. }
  140. for (i__ = *n - 2; i__ >= 1; --i__) {
  141. b[i__ + j * b_dim1] = (b[i__ + j * b_dim1] - du[i__] * b[
  142. i__ + 1 + j * b_dim1] - du2[i__] * b[i__ + 2 + j *
  143. b_dim1]) / d__[i__];
  144. /* L50: */
  145. }
  146. /* L60: */
  147. }
  148. }
  149. } else {
  150. /* Solve A' * X = B. */
  151. if (*nrhs <= 1) {
  152. /* Solve U'*x = b. */
  153. j = 1;
  154. L70:
  155. b[j * b_dim1 + 1] /= d__[1];
  156. if (*n > 1) {
  157. b[j * b_dim1 + 2] = (b[j * b_dim1 + 2] - du[1] * b[j * b_dim1
  158. + 1]) / d__[2];
  159. }
  160. i__1 = *n;
  161. for (i__ = 3; i__ <= i__1; ++i__) {
  162. b[i__ + j * b_dim1] = (b[i__ + j * b_dim1] - du[i__ - 1] * b[
  163. i__ - 1 + j * b_dim1] - du2[i__ - 2] * b[i__ - 2 + j *
  164. b_dim1]) / d__[i__];
  165. /* L80: */
  166. }
  167. /* Solve L'*x = b. */
  168. for (i__ = *n - 1; i__ >= 1; --i__) {
  169. ip = ipiv[i__];
  170. temp = b[i__ + j * b_dim1] - dl[i__] * b[i__ + 1 + j * b_dim1]
  171. ;
  172. b[i__ + j * b_dim1] = b[ip + j * b_dim1];
  173. b[ip + j * b_dim1] = temp;
  174. /* L90: */
  175. }
  176. if (j < *nrhs) {
  177. ++j;
  178. goto L70;
  179. }
  180. } else {
  181. i__1 = *nrhs;
  182. for (j = 1; j <= i__1; ++j) {
  183. /* Solve U'*x = b. */
  184. b[j * b_dim1 + 1] /= d__[1];
  185. if (*n > 1) {
  186. b[j * b_dim1 + 2] = (b[j * b_dim1 + 2] - du[1] * b[j *
  187. b_dim1 + 1]) / d__[2];
  188. }
  189. i__2 = *n;
  190. for (i__ = 3; i__ <= i__2; ++i__) {
  191. b[i__ + j * b_dim1] = (b[i__ + j * b_dim1] - du[i__ - 1] *
  192. b[i__ - 1 + j * b_dim1] - du2[i__ - 2] * b[i__ -
  193. 2 + j * b_dim1]) / d__[i__];
  194. /* L100: */
  195. }
  196. for (i__ = *n - 1; i__ >= 1; --i__) {
  197. if (ipiv[i__] == i__) {
  198. b[i__ + j * b_dim1] -= dl[i__] * b[i__ + 1 + j *
  199. b_dim1];
  200. } else {
  201. temp = b[i__ + 1 + j * b_dim1];
  202. b[i__ + 1 + j * b_dim1] = b[i__ + j * b_dim1] - dl[
  203. i__] * temp;
  204. b[i__ + j * b_dim1] = temp;
  205. }
  206. /* L110: */
  207. }
  208. /* L120: */
  209. }
  210. }
  211. }
  212. /* End of DGTTS2 */
  213. return 0;
  214. } /* _starpu_dgtts2_ */