From a364fc947043abce116a042d3f7b25493edccf88 Mon Sep 17 00:00:00 2001 From: chtong Date: Wed, 26 Jan 2011 01:28:47 +0000 Subject: [PATCH] Add SetAtol to pcg and gmres and add pcg recompute residual option. --- FEI_mv/fei-hypre/HYPRE_LSC_aux.cxx | 12 ++++++++++++ FEI_mv/fei-hypre/HYPRE_LinSysCore.cxx | 26 ++++++++++++++++++++------ 2 files changed, 32 insertions(+), 6 deletions(-) diff --git a/FEI_mv/fei-hypre/HYPRE_LSC_aux.cxx b/FEI_mv/fei-hypre/HYPRE_LSC_aux.cxx index 4b107ca9c..badc45039 100644 --- a/FEI_mv/fei-hypre/HYPRE_LSC_aux.cxx +++ b/FEI_mv/fei-hypre/HYPRE_LSC_aux.cxx @@ -262,6 +262,7 @@ int HYPRE_LinSysCore::parameters(int numParams, char **params) printf(" - tolerance \n"); printf(" - gmresDim \n"); printf(" - stopCrit \n"); + printf(" - pcgRecomputeResiudal\n"); printf(" - preconditioner \n"); @@ -646,6 +647,17 @@ int HYPRE_LinSysCore::parameters(int numParams, char **params) param2); } + //---------------------------------------------------------------- + // for PCG only + //---------------------------------------------------------------- + + else if ( !strcmp(param1, "pcgRecomputeResidual") ) + { + pcgRecomputeRes_ = 1; + if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 3 && mypid_ == 0 ) + printf(" HYPRE_LSC::parameters pcgRecomputeResidual\n"); + } + //---------------------------------------------------------------- // preconditioner reuse //---------------------------------------------------------------- diff --git a/FEI_mv/fei-hypre/HYPRE_LinSysCore.cxx b/FEI_mv/fei-hypre/HYPRE_LinSysCore.cxx index d4760037c..ec8fa8299 100644 --- a/FEI_mv/fei-hypre/HYPRE_LinSysCore.cxx +++ b/FEI_mv/fei-hypre/HYPRE_LinSysCore.cxx @@ -4780,12 +4780,19 @@ int HYPRE_LinSysCore::launchSolver(int& solveStatus, int &iterations) } setupPCGPrecon(); HYPRE_ParCSRPCGSetMaxIter(HYSolver_, maxIterations_); - HYPRE_ParCSRPCGSetTol(HYSolver_, tolerance_); HYPRE_ParCSRPCGSetRelChange(HYSolver_, 0); HYPRE_ParCSRPCGSetTwoNorm(HYSolver_, 1); HYPRE_PCGSetRecomputeResidual(HYSolver_, pcgRecomputeRes_); - if ( normAbsRel_ == 0 ) HYPRE_ParCSRPCGSetStopCrit(HYSolver_,0); - else HYPRE_ParCSRPCGSetStopCrit(HYSolver_,1); + if ( normAbsRel_ == 0 ) + { + HYPRE_PCGSetStopCrit(HYSolver_,0); + HYPRE_PCGSetTol(HYSolver_, tolerance_); + } + else + { + HYPRE_PCGSetStopCrit(HYSolver_,1); + HYPRE_PCGSetAbsoluteTol(HYSolver_, tolerance_); + } if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 1 ) { if ( mypid_ == 0 ) @@ -5019,9 +5026,16 @@ int HYPRE_LinSysCore::launchSolver(int& solveStatus, int &iterations) setupGMRESPrecon(); HYPRE_ParCSRGMRESSetKDim(HYSolver_, gmresDim_); HYPRE_ParCSRGMRESSetMaxIter(HYSolver_, maxIterations_); - HYPRE_ParCSRGMRESSetTol(HYSolver_, tolerance_); - if ( normAbsRel_ == 0 ) HYPRE_ParCSRGMRESSetStopCrit(HYSolver_,0); - else HYPRE_ParCSRGMRESSetStopCrit(HYSolver_,1); + if ( normAbsRel_ == 0 ) + { + HYPRE_GMRESSetStopCrit(HYSolver_,0); + HYPRE_GMRESSetTol(HYSolver_, tolerance_); + } + else + { + HYPRE_GMRESSetStopCrit(HYSolver_,1); + HYPRE_GMRESSetAbsoluteTol(HYSolver_, tolerance_); + } if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 1 ) { HYPRE_ParCSRGMRESSetPrintLevel(HYSolver_, 1);