Update copyright statements and change license to LGPL
[alexxy/gromacs.git] / src / gmxlib / gmx_lapack / dlas2.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 <types/simple.h>
37
38 #include "gmx_lapack.h"
39
40 void
41 F77_FUNC(dlas2,DLAS2)(double *f,
42        double *g,
43        double *h,
44        double *ssmin,
45        double *ssmax)
46 {
47   double fa = fabs(*f);
48   double ga = fabs(*g);
49   double ha = fabs(*h);
50   double fhmin,fhmax,tmax,tmin,tmp1,tmp2;
51   double as,at,au,c;
52
53   fhmin = (fa<ha) ? fa : ha;
54   fhmax = (fa>ha) ? fa : ha;
55   
56   if(fabs(fhmin)<GMX_DOUBLE_MIN) {
57     *ssmin = 0.0;
58     if(fabs(fhmax)<GMX_DOUBLE_MIN) 
59       *ssmax = ga;
60     else {
61       tmax = (fhmax>ga) ? fhmax : ga;
62       tmin = (fhmax<ga) ? fhmax : ga;
63       tmp1 = tmin / tmax;
64       tmp1 = tmp1 * tmp1;
65       *ssmax = tmax*sqrt(1.0 + tmp1);
66     }
67   } else {
68     if(ga<fhmax) {
69       as = 1.0 + fhmin / fhmax;
70       at = (fhmax-fhmin) / fhmax;
71       au = (ga/fhmax);
72       au = au * au;
73       c = 2.0 / ( sqrt(as*as+au) + sqrt(at*at+au) );
74       *ssmin = fhmin * c;
75       *ssmax = fhmax / c;
76     } else {
77       au = fhmax / ga;
78       if(fabs(au)<GMX_DOUBLE_MIN) {
79         *ssmin = (fhmin*fhmax)/ga;
80         *ssmax = ga;
81       } else {
82         as = 1.0 + fhmin / fhmax;
83         at = (fhmax-fhmin)/fhmax;
84         tmp1 = as*au;
85         tmp2 = at*au;
86         c = 1.0 / ( sqrt(1.0+tmp1*tmp1) + sqrt(1.0+tmp2*tmp2));
87         *ssmin = (fhmin*c)*au;
88         *ssmin = *ssmin + *ssmin;
89         *ssmax = ga / (c+c);
90       }
91     }
92   }
93   return;
94 }