diff --git a/src/petsc4Foam/solvers/petscSolver.C b/src/petsc4Foam/solvers/petscSolver.C index 77474c26cc5579e315c75675eb5509f334b3dca9..8a6097e5e804add4dbf1bdf1292761794437727a 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 08a491668bd842d70e50292385c4f19e578c5f59..b288366f8fd2d7e64a5591a2df819433fbd19fec 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 3deb0a984653ecc10cc78720f3da918ecfc62bcf..4c2e0905ad931f42624ea33c1d6b2d7f8ad91772 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); }