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