From 2bb7111a060c1c37cf25d52cafd2e82d391a033a Mon Sep 17 00:00:00 2001 From: kolev1 Date: Fri, 4 Nov 2011 23:57:46 +0000 Subject: [PATCH] Final, final changes before 2.8.0b :) --- docs/usr_solvers.tex | 2 +- parcsr_ls/HYPRE_parcsr_ls.h | 2 +- parcsr_ls/ads.c | 12 ++++++++++-- parcsr_ls/ams.c | 11 +++++++++++ 4 files changed, 23 insertions(+), 4 deletions(-) diff --git a/docs/usr_solvers.tex b/docs/usr_solvers.tex index cb18f1cc7..71741d65d 100644 --- a/docs/usr_solvers.tex +++ b/docs/usr_solvers.tex @@ -931,7 +931,7 @@ The available cycle types in ADS are: \item \code{cycle_type=6}: additive solver $(1+020)$ \item \code{cycle_type=7}: multiplicative solver $(0201020)$ \item \code{cycle_type=8}: additive solver $(0(1+2)0)$ -\item \code{cycle_type=11}: multiplicative solver $(013454310)$ +\item \code{cycle_type=11}: multiplicative solver $(01345054310)$ \item \code{cycle_type=12}: additive solver $(0+1+3+4+5)$ \item \code{cycle_type=13}: multiplicative solver $(034515430)$ \item \code{cycle_type=14}: additive solver $(01(3+4+5)10)$ diff --git a/parcsr_ls/HYPRE_parcsr_ls.h b/parcsr_ls/HYPRE_parcsr_ls.h index 7d3642aa0..464f30b5b 100644 --- a/parcsr_ls/HYPRE_parcsr_ls.h +++ b/parcsr_ls/HYPRE_parcsr_ls.h @@ -1738,7 +1738,7 @@ HYPRE_Int HYPRE_ADSSetTol(HYPRE_Solver solver , double tol); * 6 & 3-level additive solver (1+020) \\ * 7 & 3-level multiplicative solver (0201020) \\ * 8 & 3-level additive solver (0(1+2)0) \\ - * 11 & 5-level multiplicative solver (013454310) \\ + * 11 & 5-level multiplicative solver (01345054310) \\ * 12 & 5-level additive solver (0+1+3+4+5) \\ * 13 & 5-level multiplicative solver (034515430) \\ * 14 & 5-level additive solver (01(3+4+5)10) \\ diff --git a/parcsr_ls/ads.c b/parcsr_ls/ads.c index e019af78c..02d8272c7 100644 --- a/parcsr_ls/ads.c +++ b/parcsr_ls/ads.c @@ -319,7 +319,7 @@ HYPRE_Int hypre_ADSSetTol(void *solver, * 7 = 3-level multipl. solver (0201020) <-- small number of iterations * 8 = 3-level additive solver (0(1+2)0) <-- small solution time * 9 = 3-level multipl. solver (01210) with discrete divergence - * 11 = 5-level multipl. solver (013454310) <-- small solution time, memory + * 11 = 5-level multipl. solver (01345054310)<-- small solution time, memory * 12 = 5-level additive solver (0+1+3+4+5) * 13 = 5-level multipl. solver (034515430) <-- small solution time, memory * 14 = 5-level additive solver (01(3+4+5)10) @@ -1040,6 +1040,14 @@ HYPRE_Int hypre_ADSSetup(void *solver, HYPRE_BoomerAMGSetInterpType(ads_data -> B_Piz, ads_data -> B_Pi_interp_type); HYPRE_BoomerAMGSetPMaxElmts(ads_data -> B_Piz, ads_data -> B_Pi_Pmax); + /* Don't use exact solve on the coarsest level (matrices may be singular) */ + HYPRE_BoomerAMGSetCycleRelaxType(ads_data -> B_Pix, + ads_data -> B_Pi_relax_type, 3); + HYPRE_BoomerAMGSetCycleRelaxType(ads_data -> B_Piy, + ads_data -> B_Pi_relax_type, 3); + HYPRE_BoomerAMGSetCycleRelaxType(ads_data -> B_Piz, + ads_data -> B_Pi_relax_type, 3); + /* Construct the coarse space matrices by RAP */ if (!hypre_ParCSRMatrixCommPkg(ads_data -> Pix)) hypre_MatvecCommPkgCreate(ads_data -> Pix); @@ -1229,7 +1237,7 @@ HYPRE_Int hypre_ADSSolve(void *solver, hypre_sprintf(cycle,"%s","01210"); break; case 11: - hypre_sprintf(cycle,"%s","013454310"); + hypre_sprintf(cycle,"%s","01345054310"); break; case 12: hypre_sprintf(cycle,"%s","(0+1+3+4+5)"); diff --git a/parcsr_ls/ams.c b/parcsr_ls/ams.c index 9be57d798..48e36c6ed 100644 --- a/parcsr_ls/ams.c +++ b/parcsr_ls/ams.c @@ -2290,6 +2290,17 @@ HYPRE_Int hypre_AMSSetup(void *solver, HYPRE_BoomerAMGSetInterpType(ams_data -> B_Piz, ams_data -> B_Pi_interp_type); HYPRE_BoomerAMGSetPMaxElmts(ams_data -> B_Piz, ams_data -> B_Pi_Pmax); + if (ams_data -> beta_is_zero) + { + /* don't use exact solve on the coarsest level (matrices may be singular) */ + HYPRE_BoomerAMGSetCycleRelaxType(ams_data -> B_Pix, + ams_data -> B_Pi_relax_type, 3); + HYPRE_BoomerAMGSetCycleRelaxType(ams_data -> B_Piy, + ams_data -> B_Pi_relax_type, 3); + HYPRE_BoomerAMGSetCycleRelaxType(ams_data -> B_Piz, + ams_data -> B_Pi_relax_type, 3); + } + if (ams_data -> cycle_type == 0) { HYPRE_BoomerAMGSetMaxLevels(ams_data -> B_Pix, 2);