Bridge++
Ver. 1.1.x
Main Page
Namespaces
Classes
Files
File List
File Members
All
Classes
Namespaces
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Friends
Macros
Pages
fopr_Rational.cpp
Go to the documentation of this file.
1
14
#include "
fopr_Rational.h
"
15
16
#ifdef USE_PARAMETERS_FACTORY
17
#include "
parameters_factory.h
"
18
#endif
19
20
//- parameter entry
21
namespace
{
22
void
append_entry(
Parameters
& param)
23
{
24
param.
Register_int
(
"number_of_poles"
, 0);
25
param.
Register_int
(
"exponent_numerator"
, 0);
26
param.
Register_int
(
"exponent_denominator"
, 0);
27
param.
Register_double
(
"lower_bound"
, 0.0);
28
param.
Register_double
(
"upper_bound"
, 0.0);
29
param.
Register_int
(
"maximum_number_of_iteration"
, 0);
30
param.
Register_double
(
"convergence_criterion_squared"
, 0.0);
31
32
param.
Register_string
(
"verbose_level"
,
"NULL"
);
33
}
34
35
36
#ifdef USE_PARAMETERS_FACTORY
37
bool
init_param =
ParametersFactory::Register
(
"Fopr.Rational"
, append_entry);
38
#endif
39
}
40
//- end
41
42
//- parameters class
43
Parameters_Fopr_Rational::Parameters_Fopr_Rational
() { append_entry(*
this
); }
44
//- end
45
46
//====================================================================
47
void
Fopr_Rational::set_parameters
(
const
Parameters
& params)
48
{
49
const
string
str_vlevel = params.
get_string
(
"verbose_level"
);
50
51
m_vl
=
vout
.
set_verbose_level
(str_vlevel);
52
53
//- fetch and check input parameters
54
int
Np, n_exp, d_exp;
55
double
x_min, x_max;
56
int
Niter;
57
double
Stop_cond;
58
59
int
err = 0;
60
err += params.
fetch_int
(
"number_of_poles"
, Np);
61
err += params.
fetch_int
(
"exponent_numerator"
, n_exp);
62
err += params.
fetch_int
(
"exponent_denominator"
, d_exp);
63
err += params.
fetch_double
(
"lower_bound"
, x_min);
64
err += params.
fetch_double
(
"upper_bound"
, x_max);
65
err += params.
fetch_int
(
"maximum_number_of_iteration"
, Niter);
66
err += params.
fetch_double
(
"convergence_criterion_squared"
, Stop_cond);
67
68
if
(err) {
69
vout
.
crucial
(
m_vl
,
"Fopr_Rational: fetch error, input parameter not found.\n"
);
70
abort();
71
}
72
73
74
set_parameters
(Np, n_exp, d_exp, x_min, x_max, Niter, Stop_cond);
75
}
76
77
78
//====================================================================
79
void
Fopr_Rational::set_parameters
(
int
Np,
int
n_exp,
int
d_exp,
80
double
x_min,
double
x_max,
81
int
Niter,
double
Stop_cond)
82
{
83
//- print input parameters
84
vout
.
general
(
m_vl
,
"Parameters of Fopr_Rational:\n"
);
85
vout
.
general
(
m_vl
,
" Np = %d\n"
, Np);
86
vout
.
general
(
m_vl
,
" n_exp = %d\n"
, n_exp);
87
vout
.
general
(
m_vl
,
" d_exp = %d\n"
, d_exp);
88
vout
.
general
(
m_vl
,
" x_min = %10.6f\n"
, x_min);
89
vout
.
general
(
m_vl
,
" x_max = %10.6f\n"
, x_max);
90
vout
.
general
(
m_vl
,
" Niter = %d\n"
, Niter);
91
vout
.
general
(
m_vl
,
" Stop_cond = %10.6f\n"
, Stop_cond);
92
93
//- range check
94
int
err = 0;
95
err +=
ParameterCheck::non_zero
(Np);
96
err +=
ParameterCheck::non_zero
(n_exp);
97
err +=
ParameterCheck::non_zero
(d_exp);
98
// NB. x_min,x_max=0 is allowed.
99
err +=
ParameterCheck::non_zero
(Niter);
100
err +=
ParameterCheck::square_non_zero
(Stop_cond);
101
102
if
(err) {
103
vout
.
crucial
(
m_vl
,
"Fopr_Rational: parameter range check failed.\n"
);
104
abort();
105
}
106
107
//- store values
108
m_Np
= Np;
109
m_n_exp
= n_exp;
110
m_d_exp
= d_exp;
111
m_x_min
= x_min;
112
m_x_max
= x_max;
113
m_Niter
= Niter;
114
m_Stop_cond
= Stop_cond;
115
116
//- post-process
117
init_parameters
();
118
}
119
120
121
//====================================================================
122
void
Fopr_Rational::init_parameters
()
123
{
124
int
Nin =
m_fopr
->
field_nin
();
125
int
Nvol =
m_fopr
->
field_nvol
();
126
int
Nex =
m_fopr
->
field_nex
();
127
128
int
Nshift =
m_Np
;
129
130
double
x_min2 =
m_x_min
*
m_x_min
;
131
double
x_max2 =
m_x_max
*
m_x_max
;
132
133
m_cl
.resize(
m_Np
);
134
m_bl
.resize(
m_Np
);
135
136
m_xq
.resize(
m_Np
);
137
for
(
int
i = 0; i < Nshift; ++i) {
138
m_xq
[i].reset(Nin, Nvol, Nex);
139
}
140
141
m_solver
=
new
Shiftsolver_CG
(
m_fopr
,
m_Niter
,
m_Stop_cond
);
142
143
Math_Rational
rational;
144
rational.
set_parameters
(
m_Np
,
m_n_exp
,
m_d_exp
, x_min2, x_max2);
145
rational.
get_parameters
(
m_a0
,
m_bl
,
m_cl
);
146
147
vout
.
general
(
m_vl
,
" a0 = %18.14f\n"
,
m_a0
);
148
for
(
int
i = 0; i <
m_Np
; i++) {
149
vout
.
general
(
m_vl
,
" bl[%d] = %18.14f cl[%d] = %18.14f\n"
,
150
i,
m_bl
[i], i,
m_cl
[i]);
151
}
152
}
153
154
155
//====================================================================
156
const
Field
Fopr_Rational::mult
(
const
Field
& b)
157
{
158
int
Nconv;
159
double
diff;
160
161
vout
.
general
(
m_vl
,
" Shift solver in rational function\n"
);
162
vout
.
general
(
m_vl
,
" Number of shift values = %d\n"
,
m_Np
);
163
164
m_fopr
->
set_mode
(
"DdagD"
);
165
m_solver
->
solve
(
m_xq
,
m_cl
, b, Nconv, diff);
166
167
vout
.
general
(
m_vl
,
" diff(max) = %22.15e \n"
, diff);
168
169
Field
v(b);
170
v *=
m_a0
;
171
for
(
int
i = 0; i <
m_Np
; i++) {
172
v +=
m_bl
[i] *
m_xq
[i];
173
}
174
175
return
v;
176
}
177
178
179
//====================================================================
180
double
Fopr_Rational::func
(
double
x)
181
{
182
double
y =
m_a0
;
183
184
for
(
int
k = 0; k <
m_Np
; ++k) {
185
y +=
m_bl
[k] / (x +
m_cl
[k]);
186
}
187
188
return
y;
189
}
190
191
192
//====================================================================
193
//============================================================END=====
src
Fopr
fopr_Rational.cpp
Generated on Tue Jul 23 2013 10:48:48 for Bridge++ by
1.8.3.1