fd4eadac28b5be573db09804043e0e7ddb4692e1
[alexxy/gromacs.git] / src / gmxlib / gmx_lapack / sorm2l.c
1 #include "gmx_lapack.h"
2
3 void
4 F77_FUNC(sorm2l,SORM2L)(const char *side, 
5         const char *trans, 
6         int *m, 
7         int *n, 
8         int *k, 
9         float *a,
10         int *lda, 
11         float *tau,
12         float *c__,
13         int *ldc, 
14         float *work, 
15         int *info)
16 {
17     int a_dim1, a_offset, c_dim1, c_offset, i__1, i__2;
18     int c__1 = 1;
19
20     int i__, i1, i2, i3, mi, ni, nq;
21     float aii;
22     int left;
23     int notran;
24
25     a_dim1 = *lda;
26     a_offset = 1 + a_dim1;
27     a -= a_offset;
28     --tau;
29     c_dim1 = *ldc;
30     c_offset = 1 + c_dim1;
31     c__ -= c_offset;
32     --work;
33
34     /* Function Body */
35     *info = 0;
36     left = (*side=='L' || *side=='l');
37     notran = (*trans=='N' || *trans=='n');
38
39     if (left) {
40         nq = *m;
41     } else {
42         nq = *n;
43     }
44     if (*info != 0) {
45         i__1 = -(*info);
46         return;
47     }
48
49     if (*m == 0 || *n == 0 || *k == 0) {
50         return;
51     }
52
53     if ((left && notran) || (! left && ! notran)) {
54         i1 = 1;
55         i2 = *k;
56         i3 = 1;
57     } else {
58         i1 = *k;
59         i2 = 1;
60         i3 = -1;
61     }
62
63     if (left) {
64         ni = *n;
65     } else {
66         mi = *m;
67     }
68
69     i__1 = i2;
70     i__2 = i3;
71     for (i__ = i1; i__2 < 0 ? i__ >= i__1 : i__ <= i__1; i__ += i__2) {
72         if (left) {
73
74             mi = *m - *k + i__;
75         } else {
76
77             ni = *n - *k + i__;
78         }
79
80         aii = a[nq - *k + i__ + i__ * a_dim1];
81         a[nq - *k + i__ + i__ * a_dim1] = 1.;
82         F77_FUNC(slarf,SLARF)(side, &mi, &ni, &a[i__ * a_dim1 + 1], &c__1, &tau[i__], &c__[
83                 c_offset], ldc, &work[1]);
84         a[nq - *k + i__ + i__ * a_dim1] = aii;
85     }
86     return;
87 }