16 #ifdef USE_PARAMETERS_FACTORY
28 bool init = Solver::Factory::Register(
"GMRES_m_Cmplx", create_object);
45 #ifdef USE_PARAMETERS_FACTORY
58 const string str_vlevel = params.
get_string(
"verbose_level");
68 err += params.
fetch_int(
"maximum_number_of_iteration", Niter);
69 err += params.
fetch_double(
"convergence_criterion_squared", Stop_cond);
70 err += params.
fetch_int(
"number_of_orthonormal_vectors", N_M);
73 vout.
crucial(
m_vl,
"Solver_GMRES_m_Cmplx: fetch error, input parameter not found.\n");
97 vout.
crucial(
m_vl,
"Solver_GMRES_m_Cmplx: parameter range check failed.\n");
118 vout.
crucial(
m_vl,
"Solver_GMRES_m_Cmplx: parameter range check failed.\n");
129 int& Nconv,
double& diff)
138 double snorm = 1.0 / b.
norm2();
148 for (
int iter = 0; iter <
m_Niter; iter++) {
159 Nconv =
m_N_M * (iter + 1);
187 if ((
s.
nin() != Nin) || (
s.
nvol() != Nvol) || (
s.
nex() != Nex)) {
196 for (
int i = 0; i <
m_N_M + 1; ++i) {
197 v[i].reset(Nin, Nvol, Nex);
225 double const_r, const_i;
232 for (
int j = 0; j <
m_N_M; ++j) {
235 for (
int i = 0; i < (j + 1); ++i) {
239 h[ij] = cmplx(const_r, const_i);
245 for (
int i = 0; i < (j + 1); ++i) {
252 const_r =
v[j + 1] *
v[j + 1];
255 h[ij] = sqrt(const_r);
256 v[j + 1] /= sqrt(const_r);
265 for (
int i = 0; i <
m_N_M; ++i) {
285 assert(v.
size() == size);
290 for (
int i = 0; i < size; i += 2) {
291 prod_r += v.
cmp(i) * w.
cmp(i) + v.
cmp(i + 1) * w.
cmp(i + 1);
292 prod_i += v.
cmp(i) * w.
cmp(i + 1) - v.
cmp(i + 1) * w.
cmp(i);
302 std::valarray<dcomplex>& h)
306 int ii, i1i, ij, i1j;
307 double const_r, const_1_r, const_2_r;
308 dcomplex cs, sn, const_1_c, const_2_c;
310 std::valarray<dcomplex> g(
m_N_M + 1);
316 for (
int i = 0; i <
m_N_M; ++i) {
318 const_1_r = abs(h[ii]);
321 const_2_r = abs(h[i1i]);
323 const_r = sqrt(const_1_r * const_1_r
324 + const_2_r * const_2_r);
326 cs = h[ii] / const_r;
327 sn = h[i1i] / const_r;
329 for (
int j = i; j <
m_N_M; ++j) {
333 const_1_c = conj(cs) * h[ij] + sn * h[i1j];
334 const_2_c = -sn * h[ij] + cs * h[i1j];
340 const_1_c = conj(cs) * g[i] + sn * g[i + 1];
341 const_2_c = -sn * g[i] + cs * g[i + 1];
344 g[i + 1] = const_2_c;
348 for (
int i = m_N_M - 1; i > -1; --i) {
349 for (
int j = i + 1; j <
m_N_M; ++j) {
351 g[i] -= h[ij] * y[j];
363 const double& prod_r,
const double& prod_i)
369 assert(v.
size() == size);
372 for (
int i = 0; i < size; i += 2) {
373 vr = prod_r * w.
cmp(i) - prod_i * w.
cmp(i + 1);
374 vi = prod_r * w.
cmp(i + 1) + prod_i * w.
cmp(i);