diff --git a/src/parcsr_ls/HYPRE_parcsr_amg.c b/src/parcsr_ls/HYPRE_parcsr_amg.c index 4fc1b784a..0de544640 100644 --- a/src/parcsr_ls/HYPRE_parcsr_amg.c +++ b/src/parcsr_ls/HYPRE_parcsr_amg.c @@ -1280,6 +1280,39 @@ HYPRE_BoomerAMGSetILUDroptol( HYPRE_Solver solver, return ( hypre_BoomerAMGSetILUDroptol( (void *) solver, ilu_droptol ) ); } +/*-------------------------------------------------------------------------- + * HYPRE_BoomerAMGSetILUTriSolve + *--------------------------------------------------------------------------*/ + +HYPRE_Int +HYPRE_BoomerAMGSetILUTriSolve( HYPRE_Solver solver, + HYPRE_Int ilu_tri_solve) +{ + return( hypre_BoomerAMGSetILUTriSolve( (void *) solver, ilu_tri_solve ) ); +} + +/*-------------------------------------------------------------------------- + * HYPRE_BoomerAMGSetILULowerJacobiIters + *--------------------------------------------------------------------------*/ + +HYPRE_Int +HYPRE_BoomerAMGSetILULowerJacobiIters( HYPRE_Solver solver, + HYPRE_Int ilu_lower_jacobi_iters) +{ + return( hypre_BoomerAMGSetILULowerJacobiIters( (void *) solver, ilu_lower_jacobi_iters ) ); +} + +/*-------------------------------------------------------------------------- + * HYPRE_BoomerAMGSetILUUpperJacobiIters + *--------------------------------------------------------------------------*/ + +HYPRE_Int +HYPRE_BoomerAMGSetILUUpperJacobiIters( HYPRE_Solver solver, + HYPRE_Int ilu_upper_jacobi_iters) +{ + return( hypre_BoomerAMGSetILUUpperJacobiIters( (void *) solver, ilu_upper_jacobi_iters ) ); +} + /*-------------------------------------------------------------------------- * HYPRE_BoomerAMGSetILULocalReordering *--------------------------------------------------------------------------*/ diff --git a/src/parcsr_ls/HYPRE_parcsr_ilu.c b/src/parcsr_ls/HYPRE_parcsr_ilu.c index cb4dc3013..29351707f 100644 --- a/src/parcsr_ls/HYPRE_parcsr_ilu.c +++ b/src/parcsr_ls/HYPRE_parcsr_ilu.c @@ -95,6 +95,36 @@ HYPRE_ILUSetMaxIter( HYPRE_Solver solver, HYPRE_Int max_iter ) return hypre_ILUSetMaxIter( solver, max_iter ); } +/*-------------------------------------------------------------------------- + * HYPRE_ILUSetTriSolve + *--------------------------------------------------------------------------*/ + +HYPRE_Int +HYPRE_ILUSetTriSolve( HYPRE_Solver solver, HYPRE_Int tri_solve ) +{ + return hypre_ILUSetTriSolve( solver, tri_solve ); +} + +/*-------------------------------------------------------------------------- + * HYPRE_ILUSetLowerJacobiIters + *--------------------------------------------------------------------------*/ + +HYPRE_Int +HYPRE_ILUSetLowerJacobiIters( HYPRE_Solver solver, HYPRE_Int lower_jacobi_iters ) +{ + return hypre_ILUSetLowerJacobiIters( solver, lower_jacobi_iters ); +} + +/*-------------------------------------------------------------------------- + * HYPRE_ILUSetUpperJacobiIters + *--------------------------------------------------------------------------*/ + +HYPRE_Int +HYPRE_ILUSetUpperJacobiIters( HYPRE_Solver solver, HYPRE_Int upper_jacobi_iters ) +{ + return hypre_ILUSetUpperJacobiIters( solver, upper_jacobi_iters ); +} + /*-------------------------------------------------------------------------- * HYPRE_ILUSetTol *--------------------------------------------------------------------------*/ diff --git a/src/parcsr_ls/HYPRE_parcsr_ls.h b/src/parcsr_ls/HYPRE_parcsr_ls.h index c07fde3d7..46146860b 100644 --- a/src/parcsr_ls/HYPRE_parcsr_ls.h +++ b/src/parcsr_ls/HYPRE_parcsr_ls.h @@ -1118,6 +1118,34 @@ HYPRE_Int HYPRE_BoomerAMGSetFSAIEigMaxIters(HYPRE_Solver solver, HYPRE_Int HYPRE_BoomerAMGSetFSAIKapTolerance(HYPRE_Solver solver, HYPRE_Real kap_tolerance); +/** + * (Optional) Defines triangular solver for ILU(k,T) smoother: 0-iterative, 1-direct (default) + * For further explanation see description of ILU. + **/ +HYPRE_Int HYPRE_BoomerAMGSetILUTriSolve( HYPRE_Solver solver, + HYPRE_Int ilu_tri_solve); + +/** + * (Optional) Defines number of lower Jacobi iterations for ILU(k,T) smoother triangular solve. + * For further explanation see description of ILU. + **/ +HYPRE_Int HYPRE_BoomerAMGSetILULowerJacobiIters( HYPRE_Solver solver, + HYPRE_Int ilu_lower_jacobi_iters); + +/** + * (Optional) Defines number of upper Jacobi iterations for ILU(k,T) smoother triangular solve. + * For further explanation see description of ILU. + **/ +HYPRE_Int HYPRE_BoomerAMGSetILUUpperJacobiIters( HYPRE_Solver solver, + HYPRE_Int ilu_upper_jacobi_iters); + +/** + * Set Local Reordering paramter (1==RCM, 0==None) + * For further explanation see description of ILU. + **/ +HYPRE_Int HYPRE_BoomerAMGSetILULocalReordering( HYPRE_Solver solver, + HYPRE_Int ilu_reordering_type); + /** * (Optional) Defines which parallel restriction operator is used. * There are the following options for restr_type: @@ -4277,6 +4305,27 @@ HYPRE_Int HYPRE_ILUSolve( HYPRE_Solver solver, HYPRE_Int HYPRE_ILUSetMaxIter( HYPRE_Solver solver, HYPRE_Int max_iter ); +/** + * (Optional) Set triangular solver type (0) direct (1) iterative + * Set this to 1 Jacobi iterations. The default is 0 direct method. + **/ +HYPRE_Int +HYPRE_ILUSetTriSolve( HYPRE_Solver solver, HYPRE_Int tri_solve ); + +/** + * (Optional) Set number of lower Jacobi iterations for the triangular L solves + * Set this to integer > 0 when using iterative tri_solve (0). The default is 5 iterations. + **/ +HYPRE_Int +HYPRE_ILUSetLowerJacobiIters( HYPRE_Solver solver, HYPRE_Int lower_jacobi_iterations ); + +/** + * (Optional) Set number of upper Jacobi iterations for the triangular U solves + * Set this to integer > 0 when using iterative tri_solve (0). The default is 5 iterations. + **/ +HYPRE_Int +HYPRE_ILUSetUpperJacobiIters( HYPRE_Solver solver, HYPRE_Int upper_jacobi_iterations ); + /** * (Optional) Set the convergence tolerance for the ILU smoother. * Use tol = 0.0 if ILU is used as a preconditioner. The default is 1.e-7. diff --git a/src/parcsr_ls/_hypre_parcsr_ls.h b/src/parcsr_ls/_hypre_parcsr_ls.h index 9962370e0..208b126ac 100644 --- a/src/parcsr_ls/_hypre_parcsr_ls.h +++ b/src/parcsr_ls/_hypre_parcsr_ls.h @@ -160,6 +160,9 @@ typedef struct HYPRE_Int ilu_max_row_nnz; HYPRE_Int ilu_max_iter; HYPRE_Real ilu_droptol; + HYPRE_Int ilu_tri_solve; + HYPRE_Int ilu_lower_jacobi_iters; + HYPRE_Int ilu_upper_jacobi_iters; HYPRE_Int ilu_reordering_type; HYPRE_Int fsai_max_steps; @@ -406,6 +409,9 @@ typedef struct #define hypre_ParAMGDataILULevel(amg_data) ((amg_data)->ilu_lfil) #define hypre_ParAMGDataILUMaxRowNnz(amg_data) ((amg_data)->ilu_max_row_nnz) #define hypre_ParAMGDataILUDroptol(amg_data) ((amg_data)->ilu_droptol) +#define hypre_ParAMGDataILUTriSolve(amg_data) ((amg_data)->ilu_tri_solve) +#define hypre_ParAMGDataILULowerJacobiIters(amg_data) ((amg_data)->ilu_lower_jacobi_iters) +#define hypre_ParAMGDataILUUpperJacobiIters(amg_data) ((amg_data)->ilu_upper_jacobi_iters) #define hypre_ParAMGDataILUMaxIter(amg_data) ((amg_data)->ilu_max_iter) #define hypre_ParAMGDataILULocalReordering(amg_data) ((amg_data)->ilu_reordering_type) #define hypre_ParAMGDataFSAIMaxSteps(amg_data) ((amg_data)->fsai_max_steps) @@ -1369,6 +1375,9 @@ HYPRE_Int HYPRE_BoomerAMGSetILULevel( HYPRE_Solver solver, HYPRE_Int ilu_lfil); HYPRE_Int HYPRE_BoomerAMGSetILUMaxRowNnz( HYPRE_Solver solver, HYPRE_Int ilu_max_row_nnz); HYPRE_Int HYPRE_BoomerAMGSetILUMaxIter( HYPRE_Solver solver, HYPRE_Int ilu_max_iter); HYPRE_Int HYPRE_BoomerAMGSetILUDroptol( HYPRE_Solver solver, HYPRE_Real ilu_droptol); +HYPRE_Int HYPRE_BoomerAMGSetILUTriSolve( HYPRE_Solver solver, HYPRE_Int ilu_tri_solve); +HYPRE_Int HYPRE_BoomerAMGSetILULowerJacobiIters( HYPRE_Solver solver, HYPRE_Int ilu_lower_jacobi_iters); +HYPRE_Int HYPRE_BoomerAMGSetILUUpperJacobiIters( HYPRE_Solver solver, HYPRE_Int ilu_upper_jacobi_iters); HYPRE_Int HYPRE_BoomerAMGSetILULocalReordering( HYPRE_Solver solver, HYPRE_Int ilu_reordering_type); HYPRE_Int HYPRE_BoomerAMGSetFSAIMaxSteps ( HYPRE_Solver solver, HYPRE_Int max_steps ); HYPRE_Int HYPRE_BoomerAMGSetFSAIMaxStepSize ( HYPRE_Solver solver, HYPRE_Int max_step_size ); @@ -2006,6 +2015,9 @@ HYPRE_Int hypre_BoomerAMGSetEuBJ ( void *data, HYPRE_Int eu_bj ); HYPRE_Int hypre_BoomerAMGSetILUType( void *data, HYPRE_Int ilu_type); HYPRE_Int hypre_BoomerAMGSetILULevel( void *data, HYPRE_Int ilu_lfil); HYPRE_Int hypre_BoomerAMGSetILUDroptol( void *data, HYPRE_Real ilu_droptol); +HYPRE_Int hypre_BoomerAMGSetILUTriSolve( void *data, HYPRE_Int ilu_tri_solve); +HYPRE_Int hypre_BoomerAMGSetILULowerJacobiIters( void *data, HYPRE_Int ilu_lower_jacobi_iters); +HYPRE_Int hypre_BoomerAMGSetILUUpperJacobiIters( void *data, HYPRE_Int ilu_upper_jacobi_iters); HYPRE_Int hypre_BoomerAMGSetILUMaxIter( void *data, HYPRE_Int ilu_max_iter); HYPRE_Int hypre_BoomerAMGSetILUMaxRowNnz( void *data, HYPRE_Int ilu_max_row_nnz); HYPRE_Int hypre_BoomerAMGSetILULocalReordering( void *data, HYPRE_Int ilu_reordering_type); @@ -3018,6 +3030,9 @@ HYPRE_Int hypre_ILUSetDropThreshold( void *ilu_vdata, HYPRE_Real threshold ); HYPRE_Int hypre_ILUSetDropThresholdArray( void *ilu_vdata, HYPRE_Real *threshold ); HYPRE_Int hypre_ILUSetType( void *ilu_vdata, HYPRE_Int ilu_type ); HYPRE_Int hypre_ILUSetMaxIter( void *ilu_vdata, HYPRE_Int max_iter ); +HYPRE_Int hypre_ILUSetTriSolve( void *ilu_vdata, HYPRE_Int tri_solve ); +HYPRE_Int hypre_ILUSetLowerJacobiIters( void *ilu_vdata, HYPRE_Int lower_jacobi_iters ); +HYPRE_Int hypre_ILUSetUpperJacobiIters( void *ilu_vdata, HYPRE_Int upper_jacobi_iters ); HYPRE_Int hypre_ILUSetTol( void *ilu_vdata, HYPRE_Real tol ); HYPRE_Int hypre_ILUSetup( void *ilu_vdata, hypre_ParCSRMatrix *A, hypre_ParVector *f, hypre_ParVector *u ); diff --git a/src/parcsr_ls/par_amg.c b/src/parcsr_ls/par_amg.c index bc36ba58c..d8197d6a4 100644 --- a/src/parcsr_ls/par_amg.c +++ b/src/parcsr_ls/par_amg.c @@ -104,6 +104,9 @@ hypre_BoomerAMGCreate() HYPRE_Int ilu_max_row_nnz; HYPRE_Int ilu_max_iter; HYPRE_Real ilu_droptol; + HYPRE_Int ilu_tri_solve; + HYPRE_Int ilu_lower_jacobi_iters; + HYPRE_Int ilu_upper_jacobi_iters; HYPRE_Int ilu_reordering_type; HYPRE_Int fsai_max_steps; @@ -211,6 +214,9 @@ hypre_BoomerAMGCreate() ilu_max_row_nnz = 20; ilu_max_iter = 1; ilu_droptol = 0.01; + ilu_tri_solve = 1; + ilu_lower_jacobi_iters = 5; + ilu_upper_jacobi_iters = 5; ilu_reordering_type = 1; /* FSAI smoother params */ @@ -352,6 +358,9 @@ hypre_BoomerAMGCreate() hypre_BoomerAMGSetILULevel(amg_data, ilu_lfil); hypre_BoomerAMGSetILUMaxRowNnz(amg_data, ilu_max_row_nnz); hypre_BoomerAMGSetILUDroptol(amg_data, ilu_droptol); + hypre_BoomerAMGSetILUTriSolve(amg_data, ilu_tri_solve); + hypre_BoomerAMGSetILULowerJacobiIters(amg_data, ilu_lower_jacobi_iters); + hypre_BoomerAMGSetILUUpperJacobiIters(amg_data, ilu_upper_jacobi_iters); hypre_BoomerAMGSetILUMaxIter(amg_data, ilu_max_iter); hypre_BoomerAMGSetILULocalReordering(amg_data, ilu_reordering_type); hypre_BoomerAMGSetFSAIMaxSteps(amg_data, fsai_max_steps); @@ -4186,6 +4195,52 @@ hypre_BoomerAMGSetILUDroptol( void *data, return hypre_error_flag; } HYPRE_Int +hypre_BoomerAMGSetILUTriSolve( void *data, + HYPRE_Int ilu_tri_solve) +{ + hypre_ParAMGData *amg_data = (hypre_ParAMGData*) data; + + if (!amg_data) + { + hypre_error_in_arg(1); + return hypre_error_flag; + } + hypre_ParAMGDataILUTriSolve(amg_data) = ilu_tri_solve; + + return hypre_error_flag; +} +HYPRE_Int +hypre_BoomerAMGSetILULowerJacobiIters( void *data, + HYPRE_Int ilu_lower_jacobi_iters) +{ + hypre_ParAMGData *amg_data = (hypre_ParAMGData*) data; + + if (!amg_data) + { + hypre_error_in_arg(1); + return hypre_error_flag; + } + hypre_ParAMGDataILULowerJacobiIters(amg_data) = ilu_lower_jacobi_iters; + + return hypre_error_flag; +} + +HYPRE_Int +hypre_BoomerAMGSetILUUpperJacobiIters( void *data, + HYPRE_Int ilu_upper_jacobi_iters) +{ + hypre_ParAMGData *amg_data = (hypre_ParAMGData*) data; + + if (!amg_data) + { + hypre_error_in_arg(1); + return hypre_error_flag; + } + hypre_ParAMGDataILUUpperJacobiIters(amg_data) = ilu_upper_jacobi_iters; + + return hypre_error_flag; +} +HYPRE_Int hypre_BoomerAMGSetILUMaxIter( void *data, HYPRE_Int ilu_max_iter) { diff --git a/src/parcsr_ls/par_amg.h b/src/parcsr_ls/par_amg.h index e95286a2e..816706695 100644 --- a/src/parcsr_ls/par_amg.h +++ b/src/parcsr_ls/par_amg.h @@ -142,6 +142,9 @@ typedef struct HYPRE_Int ilu_max_row_nnz; HYPRE_Int ilu_max_iter; HYPRE_Real ilu_droptol; + HYPRE_Int ilu_tri_solve; + HYPRE_Int ilu_lower_jacobi_iters; + HYPRE_Int ilu_upper_jacobi_iters; HYPRE_Int ilu_reordering_type; HYPRE_Int fsai_max_steps; @@ -388,6 +391,9 @@ typedef struct #define hypre_ParAMGDataILULevel(amg_data) ((amg_data)->ilu_lfil) #define hypre_ParAMGDataILUMaxRowNnz(amg_data) ((amg_data)->ilu_max_row_nnz) #define hypre_ParAMGDataILUDroptol(amg_data) ((amg_data)->ilu_droptol) +#define hypre_ParAMGDataILUTriSolve(amg_data) ((amg_data)->ilu_tri_solve) +#define hypre_ParAMGDataILULowerJacobiIters(amg_data) ((amg_data)->ilu_lower_jacobi_iters) +#define hypre_ParAMGDataILUUpperJacobiIters(amg_data) ((amg_data)->ilu_upper_jacobi_iters) #define hypre_ParAMGDataILUMaxIter(amg_data) ((amg_data)->ilu_max_iter) #define hypre_ParAMGDataILULocalReordering(amg_data) ((amg_data)->ilu_reordering_type) #define hypre_ParAMGDataFSAIMaxSteps(amg_data) ((amg_data)->fsai_max_steps) diff --git a/src/parcsr_ls/par_amg_setup.c b/src/parcsr_ls/par_amg_setup.c index cdaf75cac..cc1784a6f 100644 --- a/src/parcsr_ls/par_amg_setup.c +++ b/src/parcsr_ls/par_amg_setup.c @@ -162,6 +162,9 @@ hypre_BoomerAMGSetup( void *amg_vdata, HYPRE_Int ilu_lfil; HYPRE_Int ilu_max_row_nnz; HYPRE_Int ilu_max_iter; + HYPRE_Int ilu_tri_solve; + HYPRE_Int ilu_lower_jacobi_iters; + HYPRE_Int ilu_upper_jacobi_iters; HYPRE_Real ilu_droptol; HYPRE_Int ilu_reordering_type; HYPRE_Int fsai_max_steps; @@ -255,6 +258,9 @@ hypre_BoomerAMGSetup( void *amg_vdata, ilu_lfil = hypre_ParAMGDataILULevel(amg_data); ilu_max_row_nnz = hypre_ParAMGDataILUMaxRowNnz(amg_data); ilu_droptol = hypre_ParAMGDataILUDroptol(amg_data); + ilu_tri_solve = hypre_ParAMGDataILUTriSolve(amg_data); + ilu_lower_jacobi_iters = hypre_ParAMGDataILULowerJacobiIters(amg_data); + ilu_upper_jacobi_iters = hypre_ParAMGDataILUUpperJacobiIters(amg_data); ilu_max_iter = hypre_ParAMGDataILUMaxIter(amg_data); ilu_reordering_type = hypre_ParAMGDataILULocalReordering(amg_data); fsai_max_steps = hypre_ParAMGDataFSAIMaxSteps(amg_data); @@ -3437,6 +3443,9 @@ hypre_BoomerAMGSetup( void *amg_vdata, HYPRE_ILUSetType( smoother[j], ilu_type); HYPRE_ILUSetLocalReordering( smoother[j], ilu_reordering_type); HYPRE_ILUSetMaxIter(smoother[j], ilu_max_iter); + HYPRE_ILUSetTriSolve(smoother[j], ilu_tri_solve); + HYPRE_ILUSetLowerJacobiIters(smoother[j], ilu_lower_jacobi_iters); + HYPRE_ILUSetUpperJacobiIters(smoother[j], ilu_upper_jacobi_iters); HYPRE_ILUSetTol(smoother[j], 0.); HYPRE_ILUSetDropThreshold(smoother[j], ilu_droptol); HYPRE_ILUSetLogging(smoother[j], 0); diff --git a/src/parcsr_ls/par_ilu.c b/src/parcsr_ls/par_ilu.c index 2e9c929c0..b98ed8f57 100644 --- a/src/parcsr_ls/par_ilu.c +++ b/src/parcsr_ls/par_ilu.c @@ -81,6 +81,9 @@ hypre_ILUCreate() hypre_ParILUDataNumIterations(ilu_data) = 0; hypre_ParILUDataMaxIter(ilu_data) = 20; + hypre_ParILUDataTriSolve(ilu_data) = 1; + hypre_ParILUDataLowerJacobiIters(ilu_data) = 5; + hypre_ParILUDataUpperJacobiIters(ilu_data) = 5; hypre_ParILUDataTol(ilu_data) = 1.0e-7; hypre_ParILUDataLogging(ilu_data) = 0; @@ -120,6 +123,9 @@ hypre_ILUCreate() NULL;/* this is not the default option, set it only when switched to */ hypre_ParILUDataSchurPrecondPrintLevel(ilu_data) = 0; hypre_ParILUDataSchurPrecondMaxIter(ilu_data) = 1; + hypre_ParILUDataSchurPrecondTriSolve(ilu_data) = 1; + hypre_ParILUDataSchurPrecondLowerJacobiIters(ilu_data) = 5; + hypre_ParILUDataSchurPrecondUpperJacobiIters(ilu_data) = 5; hypre_ParILUDataSchurPrecondTol(ilu_data) = 0.0; /* -> SCHUR-NSH */ @@ -557,6 +563,30 @@ hypre_ILUSetMaxIter( void *ilu_vdata, HYPRE_Int max_iter ) hypre_ParILUDataMaxIter(ilu_data) = max_iter; return hypre_error_flag; } +/* Set ILU triangular solver type */ +HYPRE_Int +hypre_ILUSetTriSolve( void *ilu_vdata, HYPRE_Int tri_solve ) +{ + hypre_ParILUData *ilu_data = (hypre_ParILUData*) ilu_vdata; + hypre_ParILUDataTriSolve(ilu_data) = tri_solve; + return hypre_error_flag; +} +/* Set Lower Jacobi iterations for iterative triangular solver */ +HYPRE_Int +hypre_ILUSetLowerJacobiIters( void *ilu_vdata, HYPRE_Int lower_jacobi_iters ) +{ + hypre_ParILUData *ilu_data = (hypre_ParILUData*) ilu_vdata; + hypre_ParILUDataLowerJacobiIters(ilu_data) = lower_jacobi_iters; + return hypre_error_flag; +} +/* Set Upper Jacobi iterations for iterative triangular solver */ +HYPRE_Int +hypre_ILUSetUpperJacobiIters( void *ilu_vdata, HYPRE_Int upper_jacobi_iters ) +{ + hypre_ParILUData *ilu_data = (hypre_ParILUData*) ilu_vdata; + hypre_ParILUDataUpperJacobiIters(ilu_data) = upper_jacobi_iters; + return hypre_error_flag; +} /* Set convergence tolerance for ILU solver */ HYPRE_Int hypre_ILUSetTol( void *ilu_vdata, HYPRE_Real tol ) @@ -721,6 +751,30 @@ hypre_ILUSetSchurPrecondMaxIter( void *ilu_vdata, HYPRE_Int sp_max_iter ) hypre_ParILUDataSchurPrecondMaxIter(ilu_data) = sp_max_iter; return hypre_error_flag; } +/* Set triangular solver type for Precond of Schur System */ +HYPRE_Int +hypre_ILUSetSchurPrecondTriSolve( void *ilu_vdata, HYPRE_Int sp_tri_solve ) +{ + hypre_ParILUData *ilu_data = (hypre_ParILUData*) ilu_vdata; + hypre_ParILUDataSchurPrecondTriSolve(ilu_data) = sp_tri_solve; + return hypre_error_flag; +} +/* Set Lower Jacobi iterations for Precond of Schur System */ +HYPRE_Int +hypre_ILUSetSchurPrecondLowerJacobiIters( void *ilu_vdata, HYPRE_Int sp_lower_jacobi_iters ) +{ + hypre_ParILUData *ilu_data = (hypre_ParILUData*) ilu_vdata; + hypre_ParILUDataSchurPrecondLowerJacobiIters(ilu_data) = sp_lower_jacobi_iters; + return hypre_error_flag; +} +/* Set Upper Jacobi iterations for Precond of Schur System */ +HYPRE_Int +hypre_ILUSetSchurPrecondUpperJacobiIters( void *ilu_vdata, HYPRE_Int sp_upper_jacobi_iters ) +{ + hypre_ParILUData *ilu_data = (hypre_ParILUData*) ilu_vdata; + hypre_ParILUDataSchurPrecondUpperJacobiIters(ilu_data) = sp_upper_jacobi_iters; + return hypre_error_flag; +} /* Set onvergence tolerance for Precond of Schur System */ HYPRE_Int hypre_ILUSetSchurPrecondTol( void *ilu_vdata, HYPRE_Int sp_tol ) @@ -938,6 +992,9 @@ hypre_ILUWriteSolverParams(void *ilu_vdata) hypre_printf("\n ILU Solver Parameters: \n"); hypre_printf("Max number of iterations: %d\n", hypre_ParILUDataMaxIter(ilu_data)); + hypre_printf("Triangular solver type: %d\n", hypre_ParILUDataTriSolve(ilu_data)); + hypre_printf("Lower Jacobi Iterations: %d\n", hypre_ParILUDataLowerJacobiIters(ilu_data)); + hypre_printf("Upper Jacobi Iterations: %d\n", hypre_ParILUDataUpperJacobiIters(ilu_data)); hypre_printf("Stopping tolerance: %e\n", hypre_ParILUDataTol(ilu_data)); return hypre_error_flag; diff --git a/src/parcsr_ls/par_ilu.h b/src/parcsr_ls/par_ilu.h index 1acc449dc..6689749d5 100644 --- a/src/parcsr_ls/par_ilu.h +++ b/src/parcsr_ls/par_ilu.h @@ -73,6 +73,10 @@ typedef struct hypre_ParILUData_struct HYPRE_Int print_level; HYPRE_Int max_iter; + HYPRE_Int tri_solve; + HYPRE_Int lower_jacobi_iters; + HYPRE_Int upper_jacobi_iters; + HYPRE_Int ilu_type; HYPRE_Int nLU; HYPRE_Int nI; @@ -130,6 +134,9 @@ typedef struct hypre_ParILUData_struct HYPRE_Real *sp_ilu_droptol;/* droptol array for ILUT */ HYPRE_Int sp_print_level; HYPRE_Int sp_max_iter;/* max precond iter or max MR iteration */ + HYPRE_Int sp_tri_solve; + HYPRE_Int sp_lower_jacobi_iters; + HYPRE_Int sp_upper_jacobi_iters; HYPRE_Real sp_tol; HYPRE_Int test_opt; @@ -193,6 +200,9 @@ typedef struct hypre_ParILUData_struct #define hypre_ParILUDataLogging(ilu_data) ((ilu_data) -> logging) #define hypre_ParILUDataPrintLevel(ilu_data) ((ilu_data) -> print_level) #define hypre_ParILUDataMaxIter(ilu_data) ((ilu_data) -> max_iter) +#define hypre_ParILUDataTriSolve(ilu_data) ((ilu_data) -> tri_solve) +#define hypre_ParILUDataLowerJacobiIters(ilu_data) ((ilu_data) -> lower_jacobi_iters) +#define hypre_ParILUDataUpperJacobiIters(ilu_data) ((ilu_data) -> upper_jacobi_iters) #define hypre_ParILUDataIluType(ilu_data) ((ilu_data) -> ilu_type) #define hypre_ParILUDataNLU(ilu_data) ((ilu_data) -> nLU) #define hypre_ParILUDataNI(ilu_data) ((ilu_data) -> nI) @@ -220,6 +230,9 @@ typedef struct hypre_ParILUData_struct #define hypre_ParILUDataSchurPrecondIluDroptol(ilu_data) ((ilu_data) -> sp_ilu_droptol) #define hypre_ParILUDataSchurPrecondPrintLevel(ilu_data) ((ilu_data) -> sp_print_level) #define hypre_ParILUDataSchurPrecondMaxIter(ilu_data) ((ilu_data) -> sp_max_iter) +#define hypre_ParILUDataSchurPrecondTriSolve(ilu_data) ((ilu_data) -> sp_tri_solve) +#define hypre_ParILUDataSchurPrecondLowerJacobiIters(ilu_data) ((ilu_data) -> sp_lower_jacobi_iters) +#define hypre_ParILUDataSchurPrecondUpperJacobiIters(ilu_data) ((ilu_data) -> sp_upper_jacobi_iters) #define hypre_ParILUDataSchurPrecondTol(ilu_data) ((ilu_data) -> sp_tol) #define hypre_ParILUDataSchurNSHMaxNumIter(ilu_data) ((ilu_data) -> ss_nsh_setup_max_iter) diff --git a/src/parcsr_ls/protos.h b/src/parcsr_ls/protos.h index c3d8af284..0ac454aa2 100644 --- a/src/parcsr_ls/protos.h +++ b/src/parcsr_ls/protos.h @@ -507,6 +507,9 @@ HYPRE_Int HYPRE_BoomerAMGSetILULevel( HYPRE_Solver solver, HYPRE_Int ilu_lfil); HYPRE_Int HYPRE_BoomerAMGSetILUMaxRowNnz( HYPRE_Solver solver, HYPRE_Int ilu_max_row_nnz); HYPRE_Int HYPRE_BoomerAMGSetILUMaxIter( HYPRE_Solver solver, HYPRE_Int ilu_max_iter); HYPRE_Int HYPRE_BoomerAMGSetILUDroptol( HYPRE_Solver solver, HYPRE_Real ilu_droptol); +HYPRE_Int HYPRE_BoomerAMGSetILUTriSolve( HYPRE_Solver solver, HYPRE_Int ilu_tri_solve); +HYPRE_Int HYPRE_BoomerAMGSetILULowerJacobiIters( HYPRE_Solver solver, HYPRE_Int ilu_lower_jacobi_iters); +HYPRE_Int HYPRE_BoomerAMGSetILUUpperJacobiIters( HYPRE_Solver solver, HYPRE_Int ilu_upper_jacobi_iters); HYPRE_Int HYPRE_BoomerAMGSetILULocalReordering( HYPRE_Solver solver, HYPRE_Int ilu_reordering_type); HYPRE_Int HYPRE_BoomerAMGSetFSAIMaxSteps ( HYPRE_Solver solver, HYPRE_Int max_steps ); HYPRE_Int HYPRE_BoomerAMGSetFSAIMaxStepSize ( HYPRE_Solver solver, HYPRE_Int max_step_size ); @@ -1144,6 +1147,9 @@ HYPRE_Int hypre_BoomerAMGSetEuBJ ( void *data, HYPRE_Int eu_bj ); HYPRE_Int hypre_BoomerAMGSetILUType( void *data, HYPRE_Int ilu_type); HYPRE_Int hypre_BoomerAMGSetILULevel( void *data, HYPRE_Int ilu_lfil); HYPRE_Int hypre_BoomerAMGSetILUDroptol( void *data, HYPRE_Real ilu_droptol); +HYPRE_Int hypre_BoomerAMGSetILUTriSolve( void *data, HYPRE_Int ilu_tri_solve); +HYPRE_Int hypre_BoomerAMGSetILULowerJacobiIters( void *data, HYPRE_Int ilu_lower_jacobi_iters); +HYPRE_Int hypre_BoomerAMGSetILUUpperJacobiIters( void *data, HYPRE_Int ilu_upper_jacobi_iters); HYPRE_Int hypre_BoomerAMGSetILUMaxIter( void *data, HYPRE_Int ilu_max_iter); HYPRE_Int hypre_BoomerAMGSetILUMaxRowNnz( void *data, HYPRE_Int ilu_max_row_nnz); HYPRE_Int hypre_BoomerAMGSetILULocalReordering( void *data, HYPRE_Int ilu_reordering_type); @@ -2157,6 +2163,9 @@ HYPRE_Int hypre_ILUSetDropThresholdArray( void *ilu_vdata, HYPRE_Real *threshold HYPRE_Int hypre_ILUSetType( void *ilu_vdata, HYPRE_Int ilu_type ); HYPRE_Int hypre_ILUSetMaxIter( void *ilu_vdata, HYPRE_Int max_iter ); HYPRE_Int hypre_ILUSetTol( void *ilu_vdata, HYPRE_Real tol ); +HYPRE_Int hypre_ILUSetTriSolve( void *ilu_vdata, HYPRE_Int tri_solve ); +HYPRE_Int hypre_ILUSetLowerJacobiIters( void *ilu_vdata, HYPRE_Int lower_jacobi_iters ); +HYPRE_Int hypre_ILUSetUpperJacobiIters( void *ilu_vdata, HYPRE_Int upper_jacobi_iters ); HYPRE_Int hypre_ILUSetup( void *ilu_vdata, hypre_ParCSRMatrix *A, hypre_ParVector *f, hypre_ParVector *u ); HYPRE_Int hypre_ILUSolve( void *ilu_vdata, hypre_ParCSRMatrix *A, hypre_ParVector *f,