mirror of
https://github.com/paboyle/Grid.git
synced 2025-04-09 21:50:45 +01:00
Fix bugs in Flexible GMRES solvers
Somehow I got the left and right-preconditioned versions of GMRES mixed up. As of now this is right-preconditioned version, which is what we want.
This commit is contained in:
parent
4ded1ceeb0
commit
9f79a87102
@ -148,18 +148,14 @@ class FlexibleCommunicationAvoidingGeneralisedMinimalResidual : public OperatorF
|
|||||||
|
|
||||||
Field w(src._grid);
|
Field w(src._grid);
|
||||||
Field r(src._grid);
|
Field r(src._grid);
|
||||||
Field z(src._grid);
|
|
||||||
|
|
||||||
std::vector<Field> v(RestartLength + 1, src._grid);
|
std::vector<Field> v(RestartLength + 1, src._grid);
|
||||||
|
std::vector<Field> z(RestartLength + 1, src._grid);
|
||||||
|
|
||||||
MatrixTimer.Start();
|
MatrixTimer.Start();
|
||||||
LinOp.Op(psi, z);
|
LinOp.Op(psi, w);
|
||||||
MatrixTimer.Stop();
|
MatrixTimer.Stop();
|
||||||
|
|
||||||
PrecTimer.Start();
|
|
||||||
Preconditioner(z, w);
|
|
||||||
PrecTimer.Stop();
|
|
||||||
|
|
||||||
LinalgTimer.Start();
|
LinalgTimer.Start();
|
||||||
r = src - w;
|
r = src - w;
|
||||||
|
|
||||||
@ -183,7 +179,7 @@ class FlexibleCommunicationAvoidingGeneralisedMinimalResidual : public OperatorF
|
|||||||
|
|
||||||
if ((i == RestartLength - 1) || (IterationCount == MaxIterations) || (cp <= rsq)) {
|
if ((i == RestartLength - 1) || (IterationCount == MaxIterations) || (cp <= rsq)) {
|
||||||
|
|
||||||
computeSolution(v, psi, i);
|
computeSolution(z, psi, i);
|
||||||
|
|
||||||
return cp;
|
return cp;
|
||||||
}
|
}
|
||||||
@ -193,16 +189,16 @@ class FlexibleCommunicationAvoidingGeneralisedMinimalResidual : public OperatorF
|
|||||||
return cp;
|
return cp;
|
||||||
}
|
}
|
||||||
|
|
||||||
void arnoldiStep(LinearOperatorBase<Field> &LinOp, std::vector<Field> &v, Field &z, Field &w, int iter) {
|
void arnoldiStep(LinearOperatorBase<Field> &LinOp, std::vector<Field> &v, std::vector<Field> &z, Field &w, int iter) {
|
||||||
|
|
||||||
MatrixTimer.Start();
|
|
||||||
LinOp.Op(v[iter], z);
|
|
||||||
MatrixTimer.Stop();
|
|
||||||
|
|
||||||
PrecTimer.Start();
|
PrecTimer.Start();
|
||||||
Preconditioner(z, w);
|
Preconditioner(v[iter], z[iter]);
|
||||||
PrecTimer.Stop();
|
PrecTimer.Stop();
|
||||||
|
|
||||||
|
MatrixTimer.Start();
|
||||||
|
LinOp.Op(z[iter], w);
|
||||||
|
MatrixTimer.Stop();
|
||||||
|
|
||||||
LinalgTimer.Start();
|
LinalgTimer.Start();
|
||||||
for (int i = 0; i <= iter; ++i) {
|
for (int i = 0; i <= iter; ++i) {
|
||||||
H(iter, i) = innerProduct(v[i], w);
|
H(iter, i) = innerProduct(v[i], w);
|
||||||
@ -237,7 +233,7 @@ class FlexibleCommunicationAvoidingGeneralisedMinimalResidual : public OperatorF
|
|||||||
QrTimer.Stop();
|
QrTimer.Stop();
|
||||||
}
|
}
|
||||||
|
|
||||||
void computeSolution(std::vector<Field> const &v, Field &psi, int iter) {
|
void computeSolution(std::vector<Field> const &z, Field &psi, int iter) {
|
||||||
|
|
||||||
CompSolutionTimer.Start();
|
CompSolutionTimer.Start();
|
||||||
for (int i = iter; i >= 0; i--) {
|
for (int i = iter; i >= 0; i--) {
|
||||||
@ -249,12 +245,12 @@ class FlexibleCommunicationAvoidingGeneralisedMinimalResidual : public OperatorF
|
|||||||
|
|
||||||
if (true) {
|
if (true) {
|
||||||
for (int i = 0; i <= iter; i++)
|
for (int i = 0; i <= iter; i++)
|
||||||
psi = psi + v[i] * y[i];
|
psi = psi + z[i] * y[i];
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
psi = y[0] * v[0];
|
psi = y[0] * z[0];
|
||||||
for (int i = 1; i <= iter; i++)
|
for (int i = 1; i <= iter; i++)
|
||||||
psi = psi + v[i] * y[i];
|
psi = psi + z[i] * y[i];
|
||||||
}
|
}
|
||||||
CompSolutionTimer.Stop();
|
CompSolutionTimer.Stop();
|
||||||
}
|
}
|
||||||
|
@ -148,18 +148,14 @@ class FlexibleGeneralisedMinimalResidual : public OperatorFunction<Field> {
|
|||||||
|
|
||||||
Field w(src._grid);
|
Field w(src._grid);
|
||||||
Field r(src._grid);
|
Field r(src._grid);
|
||||||
Field z(src._grid);
|
|
||||||
|
|
||||||
std::vector<Field> v(RestartLength + 1, src._grid);
|
std::vector<Field> v(RestartLength + 1, src._grid);
|
||||||
|
std::vector<Field> z(RestartLength + 1, src._grid);
|
||||||
|
|
||||||
MatrixTimer.Start();
|
MatrixTimer.Start();
|
||||||
LinOp.Op(psi, z);
|
LinOp.Op(psi, w);
|
||||||
MatrixTimer.Stop();
|
MatrixTimer.Stop();
|
||||||
|
|
||||||
PrecTimer.Start();
|
|
||||||
Preconditioner(z, w);
|
|
||||||
PrecTimer.Stop();
|
|
||||||
|
|
||||||
LinalgTimer.Start();
|
LinalgTimer.Start();
|
||||||
r = src - w;
|
r = src - w;
|
||||||
|
|
||||||
@ -183,7 +179,7 @@ class FlexibleGeneralisedMinimalResidual : public OperatorFunction<Field> {
|
|||||||
|
|
||||||
if ((i == RestartLength - 1) || (IterationCount == MaxIterations) || (cp <= rsq)) {
|
if ((i == RestartLength - 1) || (IterationCount == MaxIterations) || (cp <= rsq)) {
|
||||||
|
|
||||||
computeSolution(v, psi, i);
|
computeSolution(z, psi, i);
|
||||||
|
|
||||||
return cp;
|
return cp;
|
||||||
}
|
}
|
||||||
@ -193,16 +189,16 @@ class FlexibleGeneralisedMinimalResidual : public OperatorFunction<Field> {
|
|||||||
return cp;
|
return cp;
|
||||||
}
|
}
|
||||||
|
|
||||||
void arnoldiStep(LinearOperatorBase<Field> &LinOp, std::vector<Field> &v, Field &z, Field &w, int iter) {
|
void arnoldiStep(LinearOperatorBase<Field> &LinOp, std::vector<Field> &v, std::vector<Field> &z, Field &w, int iter) {
|
||||||
|
|
||||||
MatrixTimer.Start();
|
|
||||||
LinOp.Op(v[iter], z);
|
|
||||||
MatrixTimer.Stop();
|
|
||||||
|
|
||||||
PrecTimer.Start();
|
PrecTimer.Start();
|
||||||
Preconditioner(z, w);
|
Preconditioner(v[iter], z[iter]);
|
||||||
PrecTimer.Stop();
|
PrecTimer.Stop();
|
||||||
|
|
||||||
|
MatrixTimer.Start();
|
||||||
|
LinOp.Op(z[iter], w);
|
||||||
|
MatrixTimer.Stop();
|
||||||
|
|
||||||
LinalgTimer.Start();
|
LinalgTimer.Start();
|
||||||
for (int i = 0; i <= iter; ++i) {
|
for (int i = 0; i <= iter; ++i) {
|
||||||
H(iter, i) = innerProduct(v[i], w);
|
H(iter, i) = innerProduct(v[i], w);
|
||||||
@ -237,7 +233,7 @@ class FlexibleGeneralisedMinimalResidual : public OperatorFunction<Field> {
|
|||||||
QrTimer.Stop();
|
QrTimer.Stop();
|
||||||
}
|
}
|
||||||
|
|
||||||
void computeSolution(std::vector<Field> const &v, Field &psi, int iter) {
|
void computeSolution(std::vector<Field> const &z, Field &psi, int iter) {
|
||||||
|
|
||||||
CompSolutionTimer.Start();
|
CompSolutionTimer.Start();
|
||||||
for (int i = iter; i >= 0; i--) {
|
for (int i = iter; i >= 0; i--) {
|
||||||
@ -249,12 +245,12 @@ class FlexibleGeneralisedMinimalResidual : public OperatorFunction<Field> {
|
|||||||
|
|
||||||
if (true) {
|
if (true) {
|
||||||
for (int i = 0; i <= iter; i++)
|
for (int i = 0; i <= iter; i++)
|
||||||
psi = psi + v[i] * y[i];
|
psi = psi + z[i] * y[i];
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
psi = y[0] * v[0];
|
psi = y[0] * z[0];
|
||||||
for (int i = 1; i <= iter; i++)
|
for (int i = 1; i <= iter; i++)
|
||||||
psi = psi + v[i] * y[i];
|
psi = psi + z[i] * y[i];
|
||||||
}
|
}
|
||||||
CompSolutionTimer.Stop();
|
CompSolutionTimer.Stop();
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user