1
0
mirror of https://github.com/paboyle/Grid.git synced 2025-04-07 04:35:56 +01:00

Make GMRES solvers perform no more than MaxIterations steps

I noticed that it was possible to overrun this number.
This commit is contained in:
Daniel Richtmann 2018-02-08 15:29:44 +01:00
parent 8bc12e0ce1
commit 4ded1ceeb0
No known key found for this signature in database
GPG Key ID: B33C490AF0772057
4 changed files with 16 additions and 8 deletions

View File

@ -97,7 +97,9 @@ class CommunicationAvoidingGeneralisedMinimalResidual : public OperatorFunction<
SolverTimer.Start();
IterationCount = 0;
for (int k=0; k<MaxIterations; k++) {
auto outerLoopMax = MaxIterations/RestartLength + ((MaxIterations%RestartLength == 0) ? 0 : 1);
for (int k=0; k<outerLoopMax; k++) {
cp = outerLoopBody(LinOp, src, psi, rsq);
@ -167,7 +169,7 @@ class CommunicationAvoidingGeneralisedMinimalResidual : public OperatorFunction<
std::cout << GridLogIterative << "CommunicationAvoidingGeneralisedMinimalResidual: Iteration " << IterationCount
<< " residual " << cp << " target " << rsq << std::endl;
if ((i == RestartLength - 1) || (cp <= rsq)) {
if ((i == RestartLength - 1) || (IterationCount == MaxIterations) || (cp <= rsq)) {
computeSolution(v, psi, i);

View File

@ -103,7 +103,9 @@ class FlexibleCommunicationAvoidingGeneralisedMinimalResidual : public OperatorF
SolverTimer.Start();
IterationCount = 0;
for (int k=0; k<MaxIterations; k++) {
auto outerLoopMax = MaxIterations/RestartLength + ((MaxIterations%RestartLength == 0) ? 0 : 1);
for (int k=0; k<outerLoopMax; k++) {
cp = outerLoopBody(LinOp, src, psi, rsq);
@ -179,7 +181,7 @@ class FlexibleCommunicationAvoidingGeneralisedMinimalResidual : public OperatorF
std::cout << GridLogIterative << "FlexibleCommunicationAvoidingGeneralisedMinimalResidual: Iteration " << IterationCount
<< " residual " << cp << " target " << rsq << std::endl;
if ((i == RestartLength - 1) || (cp <= rsq)) {
if ((i == RestartLength - 1) || (IterationCount == MaxIterations) || (cp <= rsq)) {
computeSolution(v, psi, i);

View File

@ -103,7 +103,9 @@ class FlexibleGeneralisedMinimalResidual : public OperatorFunction<Field> {
SolverTimer.Start();
IterationCount = 0;
for (int k=0; k<MaxIterations; k++) {
auto outerLoopMax = MaxIterations/RestartLength + ((MaxIterations%RestartLength == 0) ? 0 : 1);
for (int k=0; k<outerLoopMax; k++) {
cp = outerLoopBody(LinOp, src, psi, rsq);
@ -179,7 +181,7 @@ class FlexibleGeneralisedMinimalResidual : public OperatorFunction<Field> {
std::cout << GridLogIterative << "FlexibleGeneralisedMinimalResidual: Iteration " << IterationCount
<< " residual " << cp << " target " << rsq << std::endl;
if ((i == RestartLength - 1) || (cp <= rsq)) {
if ((i == RestartLength - 1) || (IterationCount == MaxIterations) || (cp <= rsq)) {
computeSolution(v, psi, i);

View File

@ -97,7 +97,9 @@ class GeneralisedMinimalResidual : public OperatorFunction<Field> {
SolverTimer.Start();
IterationCount = 0;
for (int k=0; k<MaxIterations; k++) {
auto outerLoopMax = MaxIterations/RestartLength + ((MaxIterations%RestartLength == 0) ? 0 : 1);
for (int k=0; k<outerLoopMax; k++) {
cp = outerLoopBody(LinOp, src, psi, rsq);
@ -167,7 +169,7 @@ class GeneralisedMinimalResidual : public OperatorFunction<Field> {
std::cout << GridLogIterative << "GeneralisedMinimalResidual: Iteration " << IterationCount
<< " residual " << cp << " target " << rsq << std::endl;
if ((i == RestartLength - 1) || (cp <= rsq)) {
if ((i == RestartLength - 1) || (IterationCount == MaxIterations) || (cp <= rsq)) {
computeSolution(v, psi, i);