ergo
Main Page
Namespaces
Classes
Files
File List
File Members
bisection.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
34
#ifndef MAT_BISECTION
35
#define MAT_BISECTION
36
#include <cmath>
37
namespace
mat {
45
template
<
typename
Treal>
46
inline
int
sign
(Treal value) {
47
if
(value > 0)
48
return
1;
49
else
if
(value < 0)
50
return
-1;
51
else
52
return
0;
53
}
54
55
67
template
<
typename
Treal,
typename
Tfun>
68
Treal
bisection
(Tfun
const
& fun, Treal
min
, Treal
max
, Treal
const
tol) {
69
int
sign_min =
sign
(fun.eval(min));
70
int
sign_max =
sign
(fun.eval(max));
71
if
(sign_min == sign_max)
72
throw
Failure
(
"bisection(Tfun&, Treal, Treal, Treal): interval "
73
"incorrect"
);
74
Treal middle = (max +
min
) / 2;
75
int
sign_middle =
sign
(fun.eval(middle));
76
while
(
template_blas_fabs
(max - min) > tol * 2 && sign_middle != 0) {
77
if
(sign_middle == sign_min) {
78
min = middle;
79
sign_min = sign_middle;
80
}
81
else
{
/* (sign_middle == sign_max) */
82
max = middle;
83
sign_max = sign_middle;
84
}
85
middle = (max +
min
) / 2;
86
sign_middle =
sign
(fun.eval(middle));
87
}
88
return
middle;
89
}
90
91
}
/* end namespace mat */
92
#endif
source
matrix
bisection.h
Generated on Fri Feb 15 2013 23:35:34 for ergo by
1.8.3.1