7973107a1b504b280ac7843ba437f112b4d6b681
[alexxy/gromacs.git] / src / gmxlib / gmx_lapack / strti2.c
1 #include "gmx_blas.h"
2 #include "gmx_lapack.h"
3 #include "lapack_limits.h"
4
5 void
6 F77_FUNC(strti2,STRTI2)(const char *uplo,
7         const char *diag, 
8         int *n, 
9         float *a,
10         int *lda,
11         int *info)
12 {
13     int a_dim1, a_offset, i__1, i__2;
14
15     int j;
16     float ajj;
17     int upper, nounit;
18     int c__1 = 1;
19
20
21     a_dim1 = *lda;
22     a_offset = 1 + a_dim1;
23     a -= a_offset;
24
25     *info = 0;
26     upper = (*uplo=='U' || *uplo=='u');
27     nounit = (*diag=='N' || *diag=='n');
28
29     if (*info != 0) {
30         i__1 = -(*info);
31         return;
32     }
33
34     if (upper) {
35
36         i__1 = *n;
37         for (j = 1; j <= i__1; ++j) {
38             if (nounit) {
39                 a[j + j * a_dim1] = 1. / a[j + j * a_dim1];
40                 ajj = -a[j + j * a_dim1];
41             } else {
42                 ajj = -1.;
43             }
44
45             i__2 = j - 1;
46             F77_FUNC(strmv,STRMV)("Upper", "No transpose", diag, &i__2, &a[a_offset], lda, &
47                     a[j * a_dim1 + 1], &c__1);
48             i__2 = j - 1;
49             F77_FUNC(sscal,SSCAL)(&i__2, &ajj, &a[j * a_dim1 + 1], &c__1);
50         }
51     } else {
52
53         for (j = *n; j >= 1; --j) {
54             if (nounit) {
55                 a[j + j * a_dim1] = 1. / a[j + j * a_dim1];
56                 ajj = -a[j + j * a_dim1];
57             } else {
58                 ajj = -1.;
59             }
60             if (j < *n) {
61
62                 i__1 = *n - j;
63                 F77_FUNC(strmv,STRMV)("Lower", "No transpose", diag, &i__1, &a[j + 1 + (j + 
64                         1) * a_dim1], lda, &a[j + 1 + j * a_dim1], &c__1);
65                 i__1 = *n - j;
66                 F77_FUNC(sscal,SSCAL)(&i__1, &ajj, &a[j + 1 + j * a_dim1], &c__1);
67             }
68         }
69     }
70     return;
71 }