Add SetAtol to pcg and gmres and add pcg recompute residual option.

This commit is contained in:
chtong 2011-01-26 01:28:47 +00:00
parent e212be53c0
commit a364fc9470
2 changed files with 32 additions and 6 deletions

View File

@ -262,6 +262,7 @@ int HYPRE_LinSysCore::parameters(int numParams, char **params)
printf(" - tolerance <f>\n");
printf(" - gmresDim <d>\n");
printf(" - stopCrit <absolute,relative>\n");
printf(" - pcgRecomputeResiudal\n");
printf(" - preconditioner <identity,diagonal,pilut,parasails,\n");
printf(" - boomeramg,ddilut,schwarz,ddict,poly,euclid,...\n");
printf(" - blockP,ml,mli,reuse,parasails_reuse> <override>\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
//----------------------------------------------------------------

View File

@ -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);