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

View File

@ -4780,12 +4780,19 @@ int HYPRE_LinSysCore::launchSolver(int& solveStatus, int &iterations)
} }
setupPCGPrecon(); setupPCGPrecon();
HYPRE_ParCSRPCGSetMaxIter(HYSolver_, maxIterations_); HYPRE_ParCSRPCGSetMaxIter(HYSolver_, maxIterations_);
HYPRE_ParCSRPCGSetTol(HYSolver_, tolerance_);
HYPRE_ParCSRPCGSetRelChange(HYSolver_, 0); HYPRE_ParCSRPCGSetRelChange(HYSolver_, 0);
HYPRE_ParCSRPCGSetTwoNorm(HYSolver_, 1); HYPRE_ParCSRPCGSetTwoNorm(HYSolver_, 1);
HYPRE_PCGSetRecomputeResidual(HYSolver_, pcgRecomputeRes_); HYPRE_PCGSetRecomputeResidual(HYSolver_, pcgRecomputeRes_);
if ( normAbsRel_ == 0 ) HYPRE_ParCSRPCGSetStopCrit(HYSolver_,0); if ( normAbsRel_ == 0 )
else HYPRE_ParCSRPCGSetStopCrit(HYSolver_,1); {
HYPRE_PCGSetStopCrit(HYSolver_,0);
HYPRE_PCGSetTol(HYSolver_, tolerance_);
}
else
{
HYPRE_PCGSetStopCrit(HYSolver_,1);
HYPRE_PCGSetAbsoluteTol(HYSolver_, tolerance_);
}
if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 1 ) if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 1 )
{ {
if ( mypid_ == 0 ) if ( mypid_ == 0 )
@ -5019,9 +5026,16 @@ int HYPRE_LinSysCore::launchSolver(int& solveStatus, int &iterations)
setupGMRESPrecon(); setupGMRESPrecon();
HYPRE_ParCSRGMRESSetKDim(HYSolver_, gmresDim_); HYPRE_ParCSRGMRESSetKDim(HYSolver_, gmresDim_);
HYPRE_ParCSRGMRESSetMaxIter(HYSolver_, maxIterations_); HYPRE_ParCSRGMRESSetMaxIter(HYSolver_, maxIterations_);
HYPRE_ParCSRGMRESSetTol(HYSolver_, tolerance_); if ( normAbsRel_ == 0 )
if ( normAbsRel_ == 0 ) HYPRE_ParCSRGMRESSetStopCrit(HYSolver_,0); {
else HYPRE_ParCSRGMRESSetStopCrit(HYSolver_,1); HYPRE_GMRESSetStopCrit(HYSolver_,0);
HYPRE_GMRESSetTol(HYSolver_, tolerance_);
}
else
{
HYPRE_GMRESSetStopCrit(HYSolver_,1);
HYPRE_GMRESSetAbsoluteTol(HYSolver_, tolerance_);
}
if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 1 ) if ( (HYOutputLevel_ & HYFEI_SPECIALMASK) >= 1 )
{ {
HYPRE_ParCSRGMRESSetPrintLevel(HYSolver_, 1); HYPRE_ParCSRGMRESSetPrintLevel(HYSolver_, 1);