Update copyright statements and change license to LGPL
[alexxy/gromacs.git] / src / gmxlib / gmx_lapack / dlasq6.c
1 /*
2  * This file is part of the GROMACS molecular simulation package.
3  *
4  * Copyright (c) 2012, 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 #include "lapack_limits.h"
38
39 #include <types/simple.h>
40
41 void 
42 F77_FUNC(dlasq6,DLASQ6)(int *i0, 
43         int *n0, 
44         double *z__, 
45         int *pp, 
46         double *dmin__, 
47         double *dmin1, 
48         double *dmin2,
49         double *dn, 
50         double *dnm1, 
51         double *dnm2)
52 {
53     int i__1;
54     double d__1, d__2;
55
56     /* Local variables */
57     double d__;
58     int j4, j4p2;
59     double emin, temp;
60     const double safemin = GMX_DOUBLE_MIN*(1.0+GMX_DOUBLE_EPS);
61
62     --z__;
63
64     if (*n0 - *i0 - 1 <= 0) {
65         return;
66     }
67
68     j4 = (*i0 << 2) + *pp - 3;
69     emin = z__[j4 + 4];
70     d__ = z__[j4];
71     *dmin__ = d__;
72
73     if (*pp == 0) {
74         i__1 = 4*(*n0 - 3);
75         for (j4 = *i0*4; j4 <= i__1; j4 += 4) {
76             z__[j4 - 2] = d__ + z__[j4 - 1];
77             if (fabs(z__[j4 - 2])<GMX_DOUBLE_MIN) {
78                 z__[j4] = 0.;
79                 d__ = z__[j4 + 1];
80                 *dmin__ = d__;
81                 emin = 0.;
82             } else if (safemin * z__[j4 + 1] < z__[j4 - 2] && safemin * z__[j4 
83                     - 2] < z__[j4 + 1]) {
84                 temp = z__[j4 + 1] / z__[j4 - 2];
85                 z__[j4] = z__[j4 - 1] * temp;
86                 d__ *= temp;
87             } else {
88                 z__[j4] = z__[j4 + 1] * (z__[j4 - 1] / z__[j4 - 2]);
89                 d__ = z__[j4 + 1] * (d__ / z__[j4 - 2]);
90             }
91             if(d__<*dmin__)
92               *dmin__ = d__;
93
94             d__1 = emin, d__2 = z__[j4];
95             emin = (d__1<d__2) ? d__1 : d__2;
96         }
97     } else {
98         i__1 = 4*(*n0 - 3);
99         for (j4 = *i0 << 2; j4 <= i__1; j4 += 4) {
100             z__[j4 - 3] = d__ + z__[j4];
101             if (fabs(z__[j4 - 3])<GMX_DOUBLE_MIN) {
102                 z__[j4 - 1] = 0.;
103                 d__ = z__[j4 + 2];
104                 *dmin__ = d__;
105                 emin = 0.;
106             } else if (safemin * z__[j4 + 2] < z__[j4 - 3] && safemin * z__[j4 
107                     - 3] < z__[j4 + 2]) {
108                 temp = z__[j4 + 2] / z__[j4 - 3];
109                 z__[j4 - 1] = z__[j4] * temp;
110                 d__ *= temp;
111             } else {
112                 z__[j4 - 1] = z__[j4 + 2] * (z__[j4] / z__[j4 - 3]);
113                 d__ = z__[j4 + 2] * (d__ / z__[j4 - 3]);
114             }
115             if(d__<*dmin__)
116               *dmin__ = d__;
117             d__1 = emin, d__2 = z__[j4 - 1];
118             emin = (d__1<d__2) ? d__1 : d__2;
119         }
120     }
121
122     *dnm2 = d__;
123     *dmin2 = *dmin__;
124     j4 = 4*(*n0 - 2) - *pp;
125     j4p2 = j4 + (*pp << 1) - 1;
126     z__[j4 - 2] = *dnm2 + z__[j4p2];
127     if (fabs(z__[j4 - 2])<GMX_DOUBLE_MIN) {
128         z__[j4] = 0.;
129         *dnm1 = z__[j4p2 + 2];
130         *dmin__ = *dnm1;
131         emin = 0.;
132     } else if (safemin * z__[j4p2 + 2] < z__[j4 - 2] && safemin * z__[j4 - 2] < 
133             z__[j4p2 + 2]) {
134         temp = z__[j4p2 + 2] / z__[j4 - 2];
135         z__[j4] = z__[j4p2] * temp;
136         *dnm1 = *dnm2 * temp;
137     } else {
138         z__[j4] = z__[j4p2 + 2] * (z__[j4p2] / z__[j4 - 2]);
139         *dnm1 = z__[j4p2 + 2] * (*dnm2 / z__[j4 - 2]);
140     }
141     if(*dnm1<*dmin__)
142       *dmin__ = *dnm1;
143
144     *dmin1 = *dmin__;
145     j4 += 4;
146     j4p2 = j4 + (*pp << 1) - 1;
147     z__[j4 - 2] = *dnm1 + z__[j4p2];
148     if (fabs(z__[j4 - 2])<GMX_DOUBLE_MIN) {
149         z__[j4] = 0.;
150         *dn = z__[j4p2 + 2];
151         *dmin__ = *dn;
152         emin = 0.;
153     } else if (safemin * z__[j4p2 + 2] < z__[j4 - 2] && safemin * z__[j4 - 2] < 
154             z__[j4p2 + 2]) {
155         temp = z__[j4p2 + 2] / z__[j4 - 2];
156         z__[j4] = z__[j4p2] * temp;
157         *dn = *dnm1 * temp;
158     } else {
159         z__[j4] = z__[j4p2 + 2] * (z__[j4p2] / z__[j4 - 2]);
160         *dn = z__[j4p2 + 2] * (*dnm1 / z__[j4 - 2]);
161     }
162     if(*dn<*dmin__)
163       *dmin__ = *dn;
164
165     z__[j4 + 2] = *dn;
166     z__[(*n0 << 2) - *pp] = emin;
167     return;
168
169
170