Fixing copyright issues and code contributors
[alexxy/gromacs.git] / src / gmxlib / gmx_lapack / dlarrfx.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
37 #include <types/simple.h>
38
39 #include "gmx_blas.h"
40 #include "gmx_lapack.h"
41 #include "lapack_limits.h"
42
43
44 void
45 F77_FUNC(dlarrfx,DLARRFX)(int *n, 
46         double *d__, 
47         double *l, 
48         double *ld, 
49         double *lld, 
50         int *ifirst, 
51         int *ilast, 
52         double *w, 
53         double *sigma, 
54         double *dplus, 
55         double *lplus, 
56         double *work,
57         int *info)
58 {
59     int i1 = 1;
60     int i__1;
61     double d__2, d__3;
62
63     int i__;
64     double s, eps, tmp, dmax1, dmax2, delta;
65     --work;
66     --lplus;
67     --dplus;
68     --w;
69     --lld;
70     --ld;
71     --l;
72     --d__;
73     *info = 0;
74     eps = GMX_DOUBLE_EPS;
75     *sigma = w[*ifirst];
76     delta = eps * 2.;
77
78 L10:
79     s = -(*sigma);
80     dplus[1] = d__[1] + s;
81     dmax1 = fabs(dplus[1]);
82     i__1 = *n - 1;
83     for (i__ = 1; i__ <= i__1; ++i__) {
84         lplus[i__] = ld[i__] / dplus[i__];
85         s = s * lplus[i__] * l[i__] - *sigma;
86         dplus[i__ + 1] = d__[i__ + 1] + s;
87         d__2 = dmax1, d__3 = fabs(dplus[i__ + 1]);
88         dmax1 = (d__2>d__3) ? d__2 : d__3;
89     }
90     if (! (dmax1 > 0. || dmax1 < 1.)) {
91         *sigma -= fabs(*sigma) * delta;
92         delta *= 2.;
93         goto L10;
94     }
95
96     tmp = w[*ilast];
97     delta = eps * 2.;
98 L30:
99     s = -tmp;
100     work[1] = d__[1] + s;
101     dmax2 = fabs(work[1]);
102     i__1 = *n - 1;
103     for (i__ = 1; i__ <= i__1; ++i__) {
104         work[*n + i__] = ld[i__] / work[i__];
105         s = s * work[*n + i__] * l[i__] - tmp;
106         work[i__ + 1] = d__[i__ + 1] + s;
107         d__2 = dmax2, d__3 = fabs(work[i__ + 1]);
108         dmax2 = (d__2>d__3) ? d__2 : d__3;
109     }
110     if (! (dmax2 > 0. || dmax2 < 1.)) {
111         tmp += fabs(tmp) * delta;
112         delta *= 2.;
113         goto L30;
114     }
115     if (dmax2 < dmax1) {
116         *sigma = tmp;
117         F77_FUNC(dcopy,DCOPY)(n, &work[1], &i1, &dplus[1], &i1);
118         i__1 = *n - 1;
119         F77_FUNC(dcopy,DCOPY)(&i__1, &work[*n + 1], &i1, &lplus[1], &i1);
120     }
121
122     return;
123 }