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:
parent
8bc12e0ce1
commit
4ded1ceeb0
@ -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);
|
||||
|
||||
|
@ -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);
|
||||
|
||||
|
@ -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);
|
||||
|
||||
|
@ -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);
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user