From b61bab96522d2cd4ad559a5d2d398d934cc295a3 Mon Sep 17 00:00:00 2001
From: Stefano Zampini <stefano.zampini@gmail.com>
Date: Sun, 17 Jan 2021 11:40:26 +0300
Subject: [PATCH] Support older versions of PETSc

---
 src/petsc4Foam/solvers/petscSolver.C          | 64 ++++++++++---------
 .../utils/petscLinearSolverContext.H          |  3 +-
 src/petsc4Foam/utils/petscUtils.C             |  4 +-
 3 files changed, 37 insertions(+), 34 deletions(-)

diff --git a/src/petsc4Foam/solvers/petscSolver.C b/src/petsc4Foam/solvers/petscSolver.C
index 77474c2..8a6097e 100644
--- a/src/petsc4Foam/solvers/petscSolver.C
+++ b/src/petsc4Foam/solvers/petscSolver.C
@@ -263,38 +263,42 @@ Foam::solverPerformance Foam::petscSolver::scalarSolve
     }
 
     // Convergence testing
-    if (usePetscResidualNorm)
-    {
-        // Add monitor to record initial residual computed by PETSc
-        KSPMonitorSet
-        (
-            ksp,
-            PetscUtils::foamKSPMonitorRecordInit,
-            &ctx,
-            NULL
-        );
-    }
-    else
+    if (firsttimein)
     {
-        KSPSetConvergenceTest
-        (
-            ksp,
-            PetscUtils::foamKSPConverge,
-            &ctx,
-            NULL
-        );
-    }
+        if (usePetscResidualNorm)
+        {
+            // Add monitor to record initial residual computed by PETSc
+            KSPMonitorSet
+            (
+                ksp,
+                PetscUtils::foamKSPMonitorRecordInit,
+                &ctx,
+                NULL
+            );
+        }
+        else
+        {
+            ctx.useFoamTest = true;
+            KSPSetConvergenceTest
+            (
+                ksp,
+                PetscUtils::foamKSPConverge,
+                &ctx,
+                NULL
+            );
+        }
 
-    // Monitoring (print to stdout) residual reduction in OpenFOAM norm
-    if (monitorFoamResidualNorm)
-    {
-        KSPMonitorSet
-        (
-            ksp,
-            PetscUtils::foamKSPMonitorFoam,
-            &ctx,
-            NULL
-        );
+        // Monitoring (print to stdout) residual reduction in OpenFOAM norm
+        if (monitorFoamResidualNorm)
+        {
+            KSPMonitorSet
+            (
+                ksp,
+                PetscUtils::foamKSPMonitorFoam,
+                &ctx,
+                NULL
+            );
+        }
     }
 
     // Geometric multigrid support
diff --git a/src/petsc4Foam/utils/petscLinearSolverContext.H b/src/petsc4Foam/utils/petscLinearSolverContext.H
index 08a4916..b288366 100644
--- a/src/petsc4Foam/utils/petscLinearSolverContext.H
+++ b/src/petsc4Foam/utils/petscLinearSolverContext.H
@@ -69,7 +69,7 @@ public:
         Mat Amat;
         KSP ksp;
 
-        // Auxiliary vectors for the OpenFOAM-PETSc L1-norm
+        bool useFoamTest;
         Vec ArowsSum;
         Vec *res_l1_w;
 
@@ -95,6 +95,7 @@ public:
             init_aux_vectors_(false),
             Amat(nullptr),
             ksp(nullptr),
+            useFoamTest(false),
             ArowsSum(nullptr),
             res_l1_w(nullptr)
         {}
diff --git a/src/petsc4Foam/utils/petscUtils.C b/src/petsc4Foam/utils/petscUtils.C
index 3deb0a9..4c2e090 100644
--- a/src/petsc4Foam/utils/petscUtils.C
+++ b/src/petsc4Foam/utils/petscUtils.C
@@ -160,12 +160,10 @@ PetscErrorCode Foam::PetscUtils::foamKSPMonitorFoam
     if (ntype != KSP_NORM_NONE) // Print both norms, KSP built-in and OpenFOAM built-in
     {
        char normtype[256];
-       PetscErrorCode (*converge)(KSP,PetscInt,PetscReal,KSPConvergedReason*,void*);
 
        ierr = PetscStrncpy(normtype,KSPNormTypes[ntype],sizeof(normtype));CHKERRQ(ierr);
        ierr = PetscStrtolower(normtype);CHKERRQ(ierr);
-       ierr = KSPGetConvergenceTest(ksp, &converge, NULL, NULL);CHKERRQ(ierr);
-       if (converge == Foam::PetscUtils::foamKSPConverge) // we are using foam convergence testing, list foam norm first
+       if (ctx->useFoamTest) // we are using foam convergence testing, list foam norm first
        {
           ierr = PetscViewerASCIIPrintf(viewer, "%3D KSP Residual foam norm %14.12e (PETSc %s norm %14.12e)\n", it, (double)fnorm, normtype, (double)rnorm);CHKERRQ(ierr);
        }
-- 
GitLab