Skip to content

Commit

Permalink
Merge pull request #153 from IBAMR/nishantnangia/ASM-Poisson-PETScLev…
Browse files Browse the repository at this point in the history
…elSolvers

Adding provisions to allow ASM preconditioning for PETSc level Poisson solvers
  • Loading branch information
boyceg committed Apr 25, 2017
2 parents c544ff5 + c55e261 commit 4b582b9
Show file tree
Hide file tree
Showing 5 changed files with 54 additions and 20 deletions.
4 changes: 4 additions & 0 deletions ibtk/include/ibtk/CCPoissonPETScLevelSolver.h
Original file line number Diff line number Diff line change
Expand Up @@ -133,6 +133,10 @@ class CCPoissonPETScLevelSolver : public PETScLevelSolver, public PoissonSolver
} // allocate_solver

protected:
/*!
* \brief Generate IS/subdomains for Schwartz type preconditioners.
*/
void generateASMSubdomains(std::vector<std::set<int> >& overlap_is, std::vector<std::set<int> >& nonoverlap_is);
/*!
* \brief Compute hierarchy dependent data required for solving \f$Ax=b\f$.
*/
Expand Down
4 changes: 4 additions & 0 deletions ibtk/include/ibtk/SCPoissonPETScLevelSolver.h
Original file line number Diff line number Diff line change
Expand Up @@ -133,6 +133,10 @@ class SCPoissonPETScLevelSolver : public PETScLevelSolver, public PoissonSolver
} // allocate_solver

protected:
/*!
* \brief Generate IS/subdomains for Schwartz type preconditioners.
*/
void generateASMSubdomains(std::vector<std::set<int> >& overlap_is, std::vector<std::set<int> >& nonoverlap_is);
/*!
* \brief Compute hierarchy dependent data required for solving \f$Ax=b\f$.
*/
Expand Down
24 changes: 16 additions & 8 deletions ibtk/src/solvers/impls/CCPoissonPETScLevelSolver.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -112,6 +112,22 @@ CCPoissonPETScLevelSolver::~CCPoissonPETScLevelSolver()

/////////////////////////////// PROTECTED ////////////////////////////////////

void
CCPoissonPETScLevelSolver::generateASMSubdomains(std::vector<std::set<int> >& /*overlap_is*/,
std::vector<std::set<int> >& /*nonoverlap_is*/)
{
// Construct subdomains for ASM and MSM preconditioner, indexed directly by PETSc IS.
PETScMatUtilities::constructPatchLevelASMSubdomains(d_overlap_is,
d_nonoverlap_is,
d_box_size,
d_overlap_size,
d_num_dofs_per_proc,
d_dof_index_idx,
d_level,
d_cf_boundary);
return;
} // generateASMSubdomains

void
CCPoissonPETScLevelSolver::initializeSolverStateSpecialized(const SAMRAIVectorReal<NDIM, double>& x,
const SAMRAIVectorReal<NDIM, double>& /*b*/)
Expand All @@ -137,14 +153,6 @@ CCPoissonPETScLevelSolver::initializeSolverStateSpecialized(const SAMRAIVectorRe
PETScMatUtilities::constructPatchLevelCCLaplaceOp(
d_petsc_mat, d_poisson_spec, d_bc_coefs, d_solution_time, d_num_dofs_per_proc, d_dof_index_idx, d_level);
d_petsc_pc = d_petsc_mat;
PETScMatUtilities::constructPatchLevelASMSubdomains(d_overlap_is,
d_nonoverlap_is,
d_box_size,
d_overlap_size,
d_num_dofs_per_proc,
d_dof_index_idx,
d_level,
d_cf_boundary);

// Setup SAMRAI communication objects.
d_data_synch_sched = PETScVecUtilities::constructDataSynchSchedule(x_idx, d_level);
Expand Down
18 changes: 14 additions & 4 deletions ibtk/src/solvers/impls/PETScLevelSolver.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -400,9 +400,14 @@ PETScLevelSolver::initializeSolverState(const SAMRAIVectorReal<NDIM, double>& x,
// Generate user-defined subdomains.
std::vector<std::set<int> > overlap_is, nonoverlap_is;
generateASMSubdomains(overlap_is, nonoverlap_is);
generate_petsc_is_from_std_is(overlap_is, nonoverlap_is, d_overlap_is, d_nonoverlap_is);

int num_subdomains = static_cast<int>(overlap_is.size());
// Generate PETSc IS in cases where they have not been generated directly.
if (!d_overlap_is.size())
{
generate_petsc_is_from_std_is(overlap_is, nonoverlap_is, d_overlap_is, d_nonoverlap_is);
}

int num_subdomains = static_cast<int>(d_overlap_is.size());
if (num_subdomains == 0)
{
IS is;
Expand Down Expand Up @@ -462,9 +467,14 @@ PETScLevelSolver::initializeSolverState(const SAMRAIVectorReal<NDIM, double>& x,
// Generate user-defined subdomains.
std::vector<std::set<int> > overlap_is, nonoverlap_is;
generateASMSubdomains(overlap_is, nonoverlap_is);
d_n_local_subdomains = static_cast<int>(overlap_is.size());
d_n_local_subdomains = static_cast<int>(d_overlap_is.size());
d_n_subdomains_max = SAMRAI_MPI::maxReduction(d_n_local_subdomains);
generate_petsc_is_from_std_is(overlap_is, nonoverlap_is, d_overlap_is, d_nonoverlap_is);

// Generate PETSc IS in cases where they have not been generated directly.
if (!d_overlap_is.size())
{
generate_petsc_is_from_std_is(overlap_is, nonoverlap_is, d_overlap_is, d_nonoverlap_is);
}

// Get the local submatrices.
ierr = MatGetSubMatrices(
Expand Down
24 changes: 16 additions & 8 deletions ibtk/src/solvers/impls/SCPoissonPETScLevelSolver.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -112,6 +112,22 @@ SCPoissonPETScLevelSolver::~SCPoissonPETScLevelSolver()

/////////////////////////////// PROTECTED ////////////////////////////////////

void
SCPoissonPETScLevelSolver::generateASMSubdomains(std::vector<std::set<int> >& /*overlap_is*/,
std::vector<std::set<int> >& /*nonoverlap_is*/)
{
// Construct subdomains for ASM and MSM preconditioner, indexed directly by PETSc IS.
PETScMatUtilities::constructPatchLevelASMSubdomains(d_overlap_is,
d_nonoverlap_is,
d_box_size,
d_overlap_size,
d_num_dofs_per_proc,
d_dof_index_idx,
d_level,
d_cf_boundary);
return;
} // generateASMSubdomains

void
SCPoissonPETScLevelSolver::initializeSolverStateSpecialized(const SAMRAIVectorReal<NDIM, double>& x,
const SAMRAIVectorReal<NDIM, double>& /*b*/)
Expand All @@ -137,14 +153,6 @@ SCPoissonPETScLevelSolver::initializeSolverStateSpecialized(const SAMRAIVectorRe
PETScMatUtilities::constructPatchLevelSCLaplaceOp(
d_petsc_mat, d_poisson_spec, d_bc_coefs, d_solution_time, d_num_dofs_per_proc, d_dof_index_idx, d_level);
d_petsc_pc = d_petsc_mat;
PETScMatUtilities::constructPatchLevelASMSubdomains(d_overlap_is,
d_nonoverlap_is,
d_box_size,
d_overlap_size,
d_num_dofs_per_proc,
d_dof_index_idx,
d_level,
d_cf_boundary);

// Setup SAMRAI communication objects.
d_data_synch_sched = PETScVecUtilities::constructDataSynchSchedule(x_idx, d_level);
Expand Down

0 comments on commit 4b582b9

Please sign in to comment.