16 #ifdef USE_PARAMETERS_FACTORY
28 bool init = Solver::Factory::Register(
"BiCGStab_Cmplx", create_object);
43 #ifdef USE_PARAMETERS_FACTORY
56 const string str_vlevel = params.
get_string(
"verbose_level");
65 err += params.
fetch_int(
"maximum_number_of_iteration", Niter);
66 err += params.
fetch_double(
"convergence_criterion_squared", Stop_cond);
69 vout.
crucial(
m_vl,
"Solver_BiCGStab_Cmplx: fetch error, input parameter not found.\n");
92 vout.
crucial(
m_vl,
"Solver_BiCGStab_Cmplx: parameter range check failed.\n");
104 int& Nconv,
double& diff)
115 double snorm = 1.0 / b.
norm2();
125 for (
int iter = 0; iter <
m_Niter; iter++) {
136 Nconv = 2 * (iter + 1);
164 if ((
s.
nin() != Nin) || (
s.
nvol() != Nvol) || (
s.
nex() != Nex)) {
190 rho_p = cmplx(1.0, 0.0);
205 double const_r, const_i;
208 dcomplex rho = cmplx(const_r, const_i);
215 mult_c(w,
v, real(bet), imag(bet));
222 dcomplex aden = cmplx(const_r, const_i);
224 dcomplex alpha = rho / aden;
227 mult_c(w,
v, real(alpha), imag(alpha));
233 double omega_d = t * t;
237 dcomplex omega_n = cmplx(const_r, const_i);
239 dcomplex omega = omega_n / omega_d;
242 mult_c(w,
s, real(omega), imag(omega));
244 mult_c(w,
p, real(alpha), imag(alpha));
248 mult_c(w, t, real(omega), imag(omega));
267 assert(v.
size() == size);
272 for (
int i = 0; i < size; i += 2) {
273 prod_r += v.
cmp(i) * w.
cmp(i) + v.
cmp(i + 1) * w.
cmp(i + 1);
274 prod_i += v.
cmp(i) * w.
cmp(i + 1) - v.
cmp(i + 1) * w.
cmp(i);
285 const double& prod_r,
const double& prod_i)
291 assert(v.
size() == size);
294 for (
int i = 0; i < size; i += 2) {
295 v_r = prod_r * w.
cmp(i) - prod_i * w.
cmp(i + 1);
296 v_i = prod_r * w.
cmp(i + 1) + prod_i * w.
cmp(i);