1fa6712b213c3746f69ce58245a7e3f40e9392a3
[alexxy/gromacs.git] / src / gmxlib / gmx_lapack / sorm2r.c
1 #include "gmx_lapack.h"
2
3 void 
4 F77_FUNC(sorm2r,SORM2R)(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
19     int i__, i1, i2, i3, ic, jc, mi, ni, nq;
20     float aii;
21     int left;
22     int notran;
23     int c__1 = 1;
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     *info = 0;
34     left = (*side=='L' || *side=='l');
35     notran = (*trans=='N' || *trans=='n');
36
37     ic = jc = 0;
38
39     if (left) {
40         nq = *m;
41     } else {
42         nq = *n;
43     }
44
45     if (*m <= 0 || *n <= 0 || *k <= 0) {
46         return;
47     }
48
49     if ((left && !notran) || (!left && notran)) {
50         i1 = 1;
51         i2 = *k;
52         i3 = 1;
53     } else {
54         i1 = *k;
55         i2 = 1;
56         i3 = -1;
57     }
58
59     if (left) {
60         ni = *n;
61         jc = 1;
62     } else {
63         mi = *m;
64         ic = 1;
65     }
66
67     i__1 = i2;
68     i__2 = i3;
69     for (i__ = i1; i__2 < 0 ? i__ >= i__1 : i__ <= i__1; i__ += i__2) {
70         if (left) {
71
72             mi = *m - i__ + 1;
73             ic = i__;
74         } else {
75
76             ni = *n - i__ + 1;
77             jc = i__;
78         }
79
80
81         aii = a[i__ + i__ * a_dim1];
82         a[i__ + i__ * a_dim1] = 1.;
83         F77_FUNC(slarf,SLARF)(side, &mi, &ni, &a[i__ + i__ * a_dim1], &c__1, &tau[i__], &c__[
84                 ic + jc * c_dim1], ldc, &work[1]);
85         a[i__ + i__ * a_dim1] = aii;
86     }
87     return;
88
89