ergo
template_lapack_labad.h
Go to the documentation of this file.
1 /* Ergo, version 3.2, a program for linear scaling electronic structure
2  * calculations.
3  * Copyright (C) 2012 Elias Rudberg, Emanuel H. Rubensson, and Pawel Salek.
4  *
5  * This program is free software: you can redistribute it and/or modify
6  * it under the terms of the GNU General Public License as published by
7  * the Free Software Foundation, either version 3 of the License, or
8  * (at your option) any later version.
9  *
10  * This program is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13  * GNU General Public License for more details.
14  *
15  * You should have received a copy of the GNU General Public License
16  * along with this program. If not, see <http://www.gnu.org/licenses/>.
17  *
18  * Primary academic reference:
19  * Kohn−Sham Density Functional Theory Electronic Structure Calculations
20  * with Linearly Scaling Computational Time and Memory Usage,
21  * Elias Rudberg, Emanuel H. Rubensson, and Pawel Salek,
22  * J. Chem. Theory Comput. 7, 340 (2011),
23  * <http://dx.doi.org/10.1021/ct100611z>
24  *
25  * For further information about Ergo, see <http://www.ergoscf.org>.
26  */
27 
28  /* This file belongs to the template_lapack part of the Ergo source
29  * code. The source files in the template_lapack directory are modified
30  * versions of files originally distributed as CLAPACK, see the
31  * Copyright/license notice in the file template_lapack/COPYING.
32  */
33 
34 
35 #ifndef TEMPLATE_LAPACK_LABAD_HEADER
36 #define TEMPLATE_LAPACK_LABAD_HEADER
37 
38 
39 template<class Treal>
40 int template_lapack_labad(Treal *small, Treal *large)
41 {
42 /* -- LAPACK auxiliary routine (version 3.0) --
43  Univ. of Tennessee, Univ. of California Berkeley, NAG Ltd.,
44  Courant Institute, Argonne National Lab, and Rice University
45  October 31, 1992
46 
47 
48  Purpose
49  =======
50 
51  DLABAD takes as input the values computed by DLAMCH for underflow and
52  overflow, and returns the square root of each of these values if the
53  log of LARGE is sufficiently large. This subroutine is intended to
54  identify machines with a large exponent range, such as the Crays, and
55  redefine the underflow and overflow limits to be the square roots of
56  the values computed by DLAMCH. This subroutine is needed because
57  DLAMCH does not compensate for poor arithmetic in the upper half of
58  the exponent range, as is found on a Cray.
59 
60  Arguments
61  =========
62 
63  SMALL (input/output) DOUBLE PRECISION
64  On entry, the underflow threshold as computed by DLAMCH.
65  On exit, if LOG10(LARGE) is sufficiently large, the square
66  root of SMALL, otherwise unchanged.
67 
68  LARGE (input/output) DOUBLE PRECISION
69  On entry, the overflow threshold as computed by DLAMCH.
70  On exit, if LOG10(LARGE) is sufficiently large, the square
71  root of LARGE, otherwise unchanged.
72 
73  =====================================================================
74 
75 
76  If it looks like we're on a Cray, take the square root of
77  SMALL and LARGE to avoid overflow and underflow problems. */
78 
79 
80  if (template_blas_lg10(large) > 2e3) {
81  *small = template_blas_sqrt(*small);
82  *large = template_blas_sqrt(*large);
83  }
84 
85  return 0;
86 
87  /* End of DLABAD */
88 
89 } /* dlabad_ */
90 
91 #endif