mirror of
https://github.com/paboyle/Grid.git
synced 2025-04-09 13:40:46 +01:00
Save current state
This commit is contained in:
parent
8c579d2d4a
commit
e1f928398d
@ -2,11 +2,11 @@
|
|||||||
|
|
||||||
Grid physics library, www.github.com/paboyle/Grid
|
Grid physics library, www.github.com/paboyle/Grid
|
||||||
|
|
||||||
Source file: lib/algorithms/iterative/GeneralisedMinimalResidual.h
|
Source file: ./lib/algorithms/iterative/GeneralisedMinimalResidual.h
|
||||||
|
|
||||||
Copyright (C) 2015
|
Copyright (C) 2015
|
||||||
Copyright (C) 2016
|
|
||||||
|
|
||||||
|
Author: Daniel Richtmann <daniel.richtmann@ur.de>
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
This program is free software; you can redistribute it and/or modify
|
||||||
it under the terms of the GNU General Public License as published by
|
it under the terms of the GNU General Public License as published by
|
||||||
@ -58,6 +58,9 @@ class GeneralisedMinimalResidual : public OperatorFunction<Field> {
|
|||||||
Integer RestartLength;
|
Integer RestartLength;
|
||||||
Integer IterationsToComplete; // Number of iterations the GMRES took to
|
Integer IterationsToComplete; // Number of iterations the GMRES took to
|
||||||
// finish. Filled in upon completion
|
// finish. Filled in upon completion
|
||||||
|
GridStopWatch MatrixTimer;
|
||||||
|
GridStopWatch PrecTimer;
|
||||||
|
GridStopWatch LinalgTimer;
|
||||||
|
|
||||||
GeneralisedMinimalResidual(RealD tol,
|
GeneralisedMinimalResidual(RealD tol,
|
||||||
Integer maxit,
|
Integer maxit,
|
||||||
@ -299,7 +302,7 @@ class GeneralisedMinimalResidual : public OperatorFunction<Field> {
|
|||||||
std::cout << GridLogIterative << "GeneralizedMinimalResidual: End of operator()" << std::endl;
|
std::cout << GridLogIterative << "GeneralizedMinimalResidual: End of operator()" << std::endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
void alternativeOperatorImplementation()(LinearOperatorBase<Field> &LinOp, const Field &src, Field &psi) {
|
void alternativeOperatorImplementation(LinearOperatorBase<Field> &LinOp, const Field &src, Field &psi) {
|
||||||
|
|
||||||
psi.checkerboard = src.checkerboard;
|
psi.checkerboard = src.checkerboard;
|
||||||
psi(conformable, src);
|
psi(conformable, src);
|
||||||
@ -314,7 +317,7 @@ class GeneralisedMinimalResidual : public OperatorFunction<Field> {
|
|||||||
Field r(src._grid);
|
Field r(src._grid);
|
||||||
|
|
||||||
PrecTimer.Reset();
|
PrecTimer.Reset();
|
||||||
MatTimer.Reset();
|
MatrixTimer.Reset();
|
||||||
LinalgTimer.Reset();
|
LinalgTimer.Reset();
|
||||||
|
|
||||||
GridStopWatch SolverTimer;
|
GridStopWatch SolverTimer;
|
||||||
@ -323,14 +326,14 @@ class GeneralisedMinimalResidual : public OperatorFunction<Field> {
|
|||||||
int iterations = 0;
|
int iterations = 0;
|
||||||
for (int k=0; k<MaxIterations; k++) {
|
for (int k=0; k<MaxIterations; k++) {
|
||||||
|
|
||||||
cp = outerLoopBody(Linop, src, psi, rsd_sq);
|
cp = outerLoopBody(LinOp, src, psi, rsd_sq);
|
||||||
|
|
||||||
// Stopping condition
|
// Stopping condition
|
||||||
if (cp <= rsd_sq) {
|
if (cp <= rsd_sq) {
|
||||||
|
|
||||||
SolverTimer.Stop();
|
SolverTimer.Stop();
|
||||||
|
|
||||||
Linop.Op(psi,r);
|
LinOp.Op(psi,r);
|
||||||
axpy(r,-1.0,src,r);
|
axpy(r,-1.0,src,r);
|
||||||
|
|
||||||
RealD srcnorm = sqrt(ssq);
|
RealD srcnorm = sqrt(ssq);
|
||||||
@ -345,7 +348,7 @@ class GeneralisedMinimalResidual : public OperatorFunction<Field> {
|
|||||||
std::cout << GridLogMessage << "GeneralizedMinimalResidual Time breakdown" << std::endl;
|
std::cout << GridLogMessage << "GeneralizedMinimalResidual Time breakdown" << std::endl;
|
||||||
std::cout << GridLogMessage << "\tElapsed " << SolverTimer.Elapsed() << std::endl;
|
std::cout << GridLogMessage << "\tElapsed " << SolverTimer.Elapsed() << std::endl;
|
||||||
std::cout << GridLogMessage << "\tPrecon " << PrecTimer.Elapsed() << std::endl;
|
std::cout << GridLogMessage << "\tPrecon " << PrecTimer.Elapsed() << std::endl;
|
||||||
std::cout << GridLogMessage << "\tMatrix " << MatTimer.Elapsed() << std::endl;
|
std::cout << GridLogMessage << "\tMatrix " << MatrixTimer.Elapsed() << std::endl;
|
||||||
std::cout << GridLogMessage << "\tLinalg " << LinalgTimer.Elapsed() << std::endl;
|
std::cout << GridLogMessage << "\tLinalg " << LinalgTimer.Elapsed() << std::endl;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -357,17 +360,21 @@ class GeneralisedMinimalResidual : public OperatorFunction<Field> {
|
|||||||
assert(0);
|
assert(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
RealD outerLoopBody(LinearOperatorBase<Field> &Linop, const Field &src, Field &psi, RealD rsd_sq) {
|
RealD outerLoopBody(LinearOperatorBase<Field> &LinOp, const Field &src, Field &psi, RealD rsd_sq) {
|
||||||
|
|
||||||
|
RealD cp = 0;
|
||||||
|
|
||||||
Field w(src._grid);
|
Field w(src._grid);
|
||||||
Field r(src._grid);
|
Field r(src._grid);
|
||||||
|
|
||||||
|
auto whatDoWePutHere = 1;
|
||||||
|
|
||||||
std::vector<Field> v(whatDoWePutHere, src._grid); // in MG code: m + 1
|
std::vector<Field> v(whatDoWePutHere, src._grid); // in MG code: m + 1
|
||||||
|
|
||||||
std::vector<std::complex<double>> gamma(whatDoWePutHere, 0.); // in MG code: m + 1
|
std::vector<std::complex<double>> gamma(whatDoWePutHere, 0.); // in MG code: m + 1
|
||||||
|
|
||||||
MatrixTimer.Start();
|
MatrixTimer.Start();
|
||||||
Linop.Op(psi, w); // w = D * psi
|
LinOp.Op(psi, w); // w = D * psi
|
||||||
MatrixTimer.Stop();
|
MatrixTimer.Stop();
|
||||||
|
|
||||||
LinalgTimer.Start();
|
LinalgTimer.Start();
|
||||||
@ -380,7 +387,7 @@ class GeneralisedMinimalResidual : public OperatorFunction<Field> {
|
|||||||
|
|
||||||
for (int i=0; i<whatDoWePutHere; i++) { // in MG code: p->restart_length
|
for (int i=0; i<whatDoWePutHere; i++) { // in MG code: p->restart_length
|
||||||
|
|
||||||
arnoldiStep(Linop, v, w, whatDoWePutHere); // in MG code: j
|
arnoldiStep(LinOp, v, w, whatDoWePutHere); // in MG code: j
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////
|
||||||
// Begin of QR Update /////////////////////////////////////////////////
|
// Begin of QR Update /////////////////////////////////////////////////
|
||||||
@ -401,15 +408,15 @@ class GeneralisedMinimalResidual : public OperatorFunction<Field> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void arnoldiStep(LinearOperatorBase<Field> &Linop, std::vector<Field> &v, Field &w, int iter) {
|
void arnoldiStep(LinearOperatorBase<Field> &LinOp, std::vector<Field> &v, Field &w, int iter) {
|
||||||
|
|
||||||
MatrixTimer.Start();
|
MatrixTimer.Start();
|
||||||
Linop.Op(v[iter], w);
|
LinOp.Op(v[iter], w);
|
||||||
MatrixTimer.Stop();
|
MatrixTimer.Stop();
|
||||||
|
|
||||||
LinalgTimer.Start();
|
LinalgTimer.Start();
|
||||||
for(int i = 0; i <= iter; ++i) {
|
for(int i = 0; i <= iter; ++i) {
|
||||||
H(i, j) = innerProduct(v[i], w);
|
H(i, iter) = innerProduct(v[i], w);
|
||||||
w = w - H(i, iter) * v[i];
|
w = w - H(i, iter) * v[i];
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -608,16 +615,16 @@ class GeneralisedMinimalResidual : public OperatorFunction<Field> {
|
|||||||
std::vector<Field> const & v,
|
std::vector<Field> const & v,
|
||||||
Field & x,
|
Field & x,
|
||||||
int j) {
|
int j) {
|
||||||
for(auto i = j; i >= 0; i--) {
|
for(auto i = iter; i >= 0; i--) {
|
||||||
y[i] = gamma[i];
|
y[i] = gamma[i];
|
||||||
for(auto k = i + 1; k <= j; k++)
|
for(auto k = i + 1; k <= iter; k++)
|
||||||
y[i] -= H(i, k) * y[k];
|
y[i] -= H(i, k) * y[k];
|
||||||
y[i] /= H(i, i);
|
y[i] /= H(i, i);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* if(true) // TODO ??? */
|
/* if(true) // TODO ??? */
|
||||||
/* { */
|
/* { */
|
||||||
/* for(auto i = 0; i <= j; i++) */
|
/* for(auto i = 0; i <= iter; i++) */
|
||||||
/* x = x + v[i] * y[i]; */
|
/* x = x + v[i] * y[i]; */
|
||||||
/* } else { */
|
/* } else { */
|
||||||
x = y[0] * v[0];
|
x = y[0] * v[0];
|
||||||
|
Loading…
x
Reference in New Issue
Block a user