Fixing copyright issues and code contributors
[alexxy/gromacs.git] / src / gmxlib / gmx_lapack / dlasd1.c
1 /*
2  * This file is part of the GROMACS molecular simulation package.
3  *
4  * Copyright (c) 2012,2013, by the GROMACS development team, led by
5  * David van der Spoel, Berk Hess, Erik Lindahl, and including many
6  * others, as listed in the AUTHORS file in the top-level source
7  * directory and at http://www.gromacs.org.
8  *
9  * GROMACS is free software; you can redistribute it and/or
10  * modify it under the terms of the GNU Lesser General Public License
11  * as published by the Free Software Foundation; either version 2.1
12  * of the License, or (at your option) any later version.
13  *
14  * GROMACS is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
17  * Lesser General Public License for more details.
18  *
19  * You should have received a copy of the GNU Lesser General Public
20  * License along with GROMACS; if not, see
21  * http://www.gnu.org/licenses, or write to the Free Software Foundation,
22  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA.
23  *
24  * If you want to redistribute modifications to GROMACS, please
25  * consider that scientific software is very special. Version
26  * control is crucial - bugs must be traceable. We will be happy to
27  * consider code for inclusion in the official distribution, but
28  * derived work must not be called official GROMACS. Details are found
29  * in the README & COPYING files - if they are missing, get the
30  * official version at http://www.gromacs.org.
31  *
32  * To help us fund GROMACS development, we humbly ask that you cite
33  * the research papers on the package. Check out http://www.gromacs.org.
34  */
35 #include <math.h>
36 #include "gmx_lapack.h"
37
38 void 
39 F77_FUNC(dlasd1,DLASD1)(int *nl, 
40         int *nr, 
41         int *sqre, 
42         double *d__, 
43         double *alpha, 
44         double *beta, 
45         double *u, 
46         int *ldu, 
47         double *vt, 
48         int *ldvt, 
49         int *idxq, 
50         int *iwork, 
51         double *work, 
52         int *info)
53 {
54     int u_dim1, u_offset, vt_dim1, vt_offset, i__1;
55     double d__1, d__2;
56
57     int i__, k, m, n, n1, n2, iq, iz, iu2, ldq, idx, ldu2, ivt2, 
58             idxc, idxp, ldvt2;
59     int isigma;
60     double orgnrm;
61     int coltyp;
62     int c__0 = 0;
63     double one = 1.0;
64     int c__1 = 1;
65     int c_n1 = -1;
66
67     --d__;
68     u_dim1 = *ldu;
69     u_offset = 1 + u_dim1;
70     u -= u_offset;
71     vt_dim1 = *ldvt;
72     vt_offset = 1 + vt_dim1;
73     vt -= vt_offset;
74     --idxq;
75     --iwork;
76     --work;
77
78     *info = 0;
79
80     if (*nl < 1) {
81         *info = -1;
82     } else if (*nr < 1) {
83         *info = -2;
84     } else if (*sqre < 0 || *sqre > 1) {
85         *info = -3;
86     }
87     if (*info != 0) {
88         i__1 = -(*info);
89         return;
90     }
91
92     n = *nl + *nr + 1;
93     m = n + *sqre;
94
95
96     ldu2 = n;
97     ldvt2 = m;
98
99     iz = 1;
100     isigma = iz + m;
101     iu2 = isigma + n;
102     ivt2 = iu2 + ldu2 * n;
103     iq = ivt2 + ldvt2 * m;
104
105     idx = 1;
106     idxc = idx + n;
107     coltyp = idxc + n;
108     idxp = coltyp + n;
109
110     d__1 = fabs(*alpha);
111     d__2 = fabs(*beta);
112     orgnrm = (d__1>d__2) ? d__1 : d__2;
113     d__[*nl + 1] = 0.;
114     i__1 = n;
115     for (i__ = 1; i__ <= i__1; ++i__) {
116         if (fabs(d__[i__]) > orgnrm) {
117             orgnrm = fabs(d__[i__]);
118         }
119     }
120     F77_FUNC(dlascl,DLASCL)("G", &c__0, &c__0, &orgnrm, &one, &n, &c__1, &d__[1], &n, info);
121     *alpha /= orgnrm;
122     *beta /= orgnrm;
123
124     F77_FUNC(dlasd2,DLASD2)(nl, nr, sqre, &k, &d__[1], &work[iz], alpha, beta, &u[u_offset], 
125             ldu, &vt[vt_offset], ldvt, &work[isigma], &work[iu2], &ldu2, &
126             work[ivt2], &ldvt2, &iwork[idxp], &iwork[idx], &iwork[idxc], &
127             idxq[1], &iwork[coltyp], info);
128
129     ldq = k;
130     F77_FUNC(dlasd3,DLASD3)(nl, nr, sqre, &k, &d__[1], &work[iq], &ldq, &work[isigma], &u[
131             u_offset], ldu, &work[iu2], &ldu2, &vt[vt_offset], ldvt, &work[
132             ivt2], &ldvt2, &iwork[idxc], &iwork[coltyp], &work[iz], info);
133     if (*info != 0) {
134         return;
135     }
136     F77_FUNC(dlascl,DLASCL)("G", &c__0, &c__0, &one, &orgnrm, &n, &c__1, &d__[1], &n, info);
137
138     n1 = k;
139     n2 = n - k;
140     F77_FUNC(dlamrg,DLAMRG)(&n1, &n2, &d__[1], &c__1, &c_n1, &idxq[1]);
141
142     return;
143
144 }