Skip to content

Commit

Permalink
New MGR restriction based on column sum (#1046)
Browse files Browse the repository at this point in the history
This PR adds a new option for defining MGR's restriction via (block) column sums, referred as `BlockColLumped`.
  • Loading branch information
victorapm authored Feb 2, 2024
1 parent ba42ea8 commit eab5f9f
Show file tree
Hide file tree
Showing 26 changed files with 1,160 additions and 684 deletions.
2 changes: 2 additions & 0 deletions src/parcsr_ls/HYPRE_parcsr_ls.h
Original file line number Diff line number Diff line change
Expand Up @@ -4145,6 +4145,7 @@ HYPRE_MGRSetLevelFRelaxType(HYPRE_Solver solver,
* Options for \e cg_method are:
*
* - 0 : Galerkin coarse grid computation using RAP.
* - 5 : Galerkin coarse grid computation using RAI (injective prolongation).
* - 1 - 4 : Non-Galerkin coarse grid computation with dropping strategy.
* - 1: inv(A_FF) approximated by its (block) diagonal inverse
* - 2: CPR-like approximation with inv(A_FF) approximated by its diagonal inverse
Expand Down Expand Up @@ -4178,6 +4179,7 @@ HYPRE_MGRSetLevelFRelaxNumFunctions(HYPRE_Solver solver,
* - 5 : pAIR distance 2
* - 12 : Block Jacobi
* - 13 : CPR-like restriction operator
* - 14 : (Block) Column-lumped restriction
* - else : use classical modified interpolation
*
* The default is injection.
Expand Down
51 changes: 30 additions & 21 deletions src/parcsr_ls/_hypre_parcsr_ls.h
Original file line number Diff line number Diff line change
Expand Up @@ -3621,6 +3621,7 @@ HYPRE_Int hypre_MGRBlockRelaxSolve( hypre_ParCSRMatrix *A, hypre_ParVector *f,
HYPRE_Int n_block, HYPRE_Int left_size,
HYPRE_Int method, HYPRE_Real *diaginv,
hypre_ParVector *Vtemp );
HYPRE_Int hypre_BlockDiagInvLapack( HYPRE_Real *diag, HYPRE_Int N, HYPRE_Int blk_size );
HYPRE_Int hypre_MGRBlockRelaxSetup( hypre_ParCSRMatrix *A, HYPRE_Int blk_size,
HYPRE_Real **diaginvptr );
//HYPRE_Int hypre_blockRelax(hypre_ParCSRMatrix *A, hypre_ParVector *f, hypre_ParVector *u,
Expand All @@ -3647,12 +3648,14 @@ HYPRE_Int hypre_MGRAddVectorR( hypre_IntArray *CF_marker, HYPRE_Int point_type,
hypre_ParVector **toVector );
HYPRE_Int hypre_MGRTruncateAcfCPRDevice( hypre_ParCSRMatrix *A_CF,
hypre_ParCSRMatrix **A_CF_new_ptr );
HYPRE_Int hypre_MGRTruncateAcfCPR( hypre_ParCSRMatrix *A_CF, hypre_ParCSRMatrix **A_CF_new_ptr );
HYPRE_Int hypre_MGRComputeNonGalerkinCoarseGrid( hypre_ParCSRMatrix *A, hypre_ParCSRMatrix *P,
hypre_ParCSRMatrix *RT, HYPRE_Int bsize,
HYPRE_Int ordering, HYPRE_Int method,
HYPRE_Int Pmax, HYPRE_Int *CF_marker,
hypre_ParCSRMatrix **A_H_ptr );
HYPRE_Int hypre_MGRComputeNonGalerkinCoarseGrid(hypre_ParCSRMatrix *A_FF,
hypre_ParCSRMatrix *A_FC,
hypre_ParCSRMatrix *A_CF,
hypre_ParCSRMatrix *A_CC,
hypre_ParCSRMatrix *Wp, hypre_ParCSRMatrix *Wr,
HYPRE_Int bsize, HYPRE_Int ordering,
HYPRE_Int method, HYPRE_Int max_elmts,
hypre_ParCSRMatrix **A_H_ptr);
HYPRE_Int hypre_MGRSetAffSolverType( void *systg_vdata, HYPRE_Int *aff_solver_type );
HYPRE_Int hypre_MGRSetCoarseSolverType( void *systg_vdata, HYPRE_Int coarse_solver_type );
HYPRE_Int hypre_MGRSetCoarseSolverIter( void *systg_vdata, HYPRE_Int coarse_solver_iter );
Expand Down Expand Up @@ -3710,23 +3713,23 @@ HYPRE_Int hypre_MGRBuildInterp( hypre_ParCSRMatrix *A, hypre_ParCSRMatrix *A_FF,
hypre_ParCSRMatrix **P_tr, HYPRE_Int method,
HYPRE_Int num_sweeps_post );
HYPRE_Int hypre_MGRBuildRestrict( hypre_ParCSRMatrix *A, hypre_ParCSRMatrix *A_FF,
hypre_ParCSRMatrix *A_FC, HYPRE_Int *CF_marker,
HYPRE_BigInt *num_cpts_global, HYPRE_Real trunc_factor,
HYPRE_Int max_elmts, HYPRE_Real strong_threshold,
HYPRE_Real max_row_sum, HYPRE_Int blk_size,
hypre_ParCSRMatrix **RT, HYPRE_Int method );
hypre_ParCSRMatrix *A_FC, hypre_ParCSRMatrix *A_CF,
hypre_IntArray *CF_marker, HYPRE_BigInt *num_cpts_global,
HYPRE_Real trunc_factor, HYPRE_Int max_elmts,
HYPRE_Real strong_threshold, HYPRE_Real max_row_sum,
HYPRE_Int blk_size, HYPRE_Int method,
hypre_ParCSRMatrix **W_ptr, hypre_ParCSRMatrix **R_ptr,
hypre_ParCSRMatrix **RT_ptr );
HYPRE_Int hypre_MGRBuildPFromWp( hypre_ParCSRMatrix *A, hypre_ParCSRMatrix *Wp,
HYPRE_Int *CF_marker, hypre_ParCSRMatrix **P_ptr );
HYPRE_Int hypre_MGRBuildPFromWpHost( hypre_ParCSRMatrix *A, hypre_ParCSRMatrix *Wp,
HYPRE_Int *CF_marker, hypre_ParCSRMatrix **P_ptr );
HYPRE_Int hypre_MGRBuildBlockJacobiWp( hypre_ParCSRMatrix *A_FF, hypre_ParCSRMatrix *A_FC,
HYPRE_Int blk_size, HYPRE_Int *CF_marker,
HYPRE_BigInt *cpts_starts_in,
hypre_ParCSRMatrix **Wp_ptr );
HYPRE_Int blk_size, hypre_ParCSRMatrix **Wp_ptr );
HYPRE_Int hypre_MGRBuildPBlockJacobi( hypre_ParCSRMatrix *A, hypre_ParCSRMatrix *A_FF,
hypre_ParCSRMatrix *A_FC, hypre_ParCSRMatrix *Wp,
HYPRE_Int blk_size, HYPRE_Int *CF_marker,
HYPRE_BigInt *cpts_starts, hypre_ParCSRMatrix **P_ptr );
hypre_ParCSRMatrix **P_ptr );
HYPRE_Int hypre_MGRBuildP( hypre_ParCSRMatrix *A, HYPRE_Int *CF_marker,
HYPRE_BigInt *num_cpts_global, HYPRE_Int method,
HYPRE_Int debug_flag, hypre_ParCSRMatrix **P_ptr );
Expand All @@ -3736,13 +3739,18 @@ HYPRE_Int hypre_MGRBuildPHost( hypre_ParCSRMatrix *A, HYPRE_Int *CF_marker,
HYPRE_Int hypre_MGRBuildInterpApproximateInverse( hypre_ParCSRMatrix *A, HYPRE_Int *CF_marker,
HYPRE_BigInt *num_cpts_global,
hypre_ParCSRMatrix **P_ptr );
HYPRE_Int hypre_MGRGetAcfCPR( hypre_ParCSRMatrix *A, HYPRE_Int blk_size,
HYPRE_Int *c_marker, HYPRE_Int *f_marker,
hypre_ParCSRMatrix **A_CF_ptr );
HYPRE_Int hypre_MGRTruncateAcfCPR( hypre_ParCSRMatrix *A_CF, hypre_ParCSRMatrix **A_CF_new_ptr );
HYPRE_Int hypre_MGRBuildRFromW( HYPRE_Int *C_map, HYPRE_Int *F_map, HYPRE_BigInt *row_starts_R,
HYPRE_BigInt *col_starts_R, hypre_ParCSRMatrix *W,
hypre_ParCSRMatrix **R_ptr );
HYPRE_Int hypre_MGRBuildRFromW( HYPRE_Int *C_map, HYPRE_Int *F_map,
HYPRE_BigInt global_num_rows_R, HYPRE_BigInt global_num_cols_R,
HYPRE_BigInt *row_starts_R, HYPRE_BigInt *col_starts_R,
hypre_ParCSRMatrix *W, hypre_ParCSRMatrix **R_ptr );
HYPRE_Int hypre_MGRBlockColLumpedRestrict( hypre_ParCSRMatrix *A, hypre_ParCSRMatrix *A_FF,
hypre_ParCSRMatrix *A_CF, hypre_IntArray *CF_marker,
HYPRE_Int block_dim, hypre_ParCSRMatrix **W_ptr,
hypre_ParCSRMatrix **R_ptr);
HYPRE_Int hypre_MGRColLumpedRestrict(hypre_ParCSRMatrix *A, hypre_ParCSRMatrix *A_FF,
hypre_ParCSRMatrix *A_CF, hypre_IntArray *CF_marker,
hypre_ParCSRMatrix **W_ptr, hypre_ParCSRMatrix **R_ptr);

/* par_mgr_coarsen.c */
HYPRE_Int hypre_MGRCoarseParms( MPI_Comm comm, HYPRE_Int num_rows, hypre_IntArray *CF_marker,
Expand Down Expand Up @@ -3770,6 +3778,7 @@ HYPRE_Int hypre_ParCSRMatrixBlockDiagMatrixDevice( hypre_ParCSRMatrix *A, HYPRE_
hypre_ParCSRMatrix **B_ptr );
HYPRE_Int hypre_MGRComputeNonGalerkinCGDevice( hypre_ParCSRMatrix *A_FF, hypre_ParCSRMatrix *A_FC,
hypre_ParCSRMatrix *A_CF, hypre_ParCSRMatrix *A_CC,
hypre_ParCSRMatrix *Wp, hypre_ParCSRMatrix *Wr,
HYPRE_Int blk_size, HYPRE_Int method,
HYPRE_Complex threshold,
hypre_ParCSRMatrix **A_H_ptr );
Expand Down
Loading

0 comments on commit eab5f9f

Please sign in to comment.