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_SF.cpp
Go to the documentation of this file.
1
14
#include "
fopr_Rational_SF.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_SF"
, append_entry);
38
#endif
39
}
40
//- end
41
42
//- parameters class
43
Parameters_Fopr_Rational_SF::Parameters_Fopr_Rational_SF
() { append_entry(*
this
); }
44
//- end
45
46
//====================================================================
47
void
Fopr_Rational_SF::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_SF: 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_SF::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_SF:\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_SF: 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_SF::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
164
const
Field
Fopr_Rational_SF::mult
(
const
Field
& b)
165
{
166
int
Nconv;
167
double
diff;
168
169
Field_F_SF
set_zero;
170
171
Field
v(b);
172
173
vout
.
general
(
m_vl
,
" Shift solver in rational function\n"
);
174
vout
.
general
(
m_vl
,
" Number of shift values = %d\n"
,
m_Np
);
175
176
set_zero.
set_boundary_zero
(v);
177
178
m_fopr
->
set_mode
(
"DdagD"
);
179
m_solver
->
solve
(
m_xq
,
m_cl
, v, Nconv, diff);
180
181
vout
.
general
(
m_vl
,
" diff(max) = %22.15e \n"
, diff);
182
183
v = b;
184
v *=
m_a0
;
185
for
(
int
i = 0; i <
m_Np
; i++) {
186
v +=
m_bl
[i] *
m_xq
[i];
187
}
188
189
set_zero.
set_boundary_zero
(v);
190
191
return
v;
192
}
193
194
195
//====================================================================
196
double
Fopr_Rational_SF::func
(
double
x)
197
{
198
double
y =
m_a0
;
199
200
for
(
int
k = 0; k <
m_Np
; ++k) {
201
y +=
m_bl
[k] / (x +
m_cl
[k]);
202
}
203
204
return
y;
205
}
206
207
208
//====================================================================
209
//============================================================END=====
src
Fopr
fopr_Rational_SF.cpp
Generated on Tue Jul 23 2013 10:48:48 for Bridge++ by
1.8.3.1