oomph::TwoPlusThreeUpperTriangularWithOneLevelSubsidiary< MATRIX > Class Template Reference

#include <multi_poisson_block_preconditioners.h>

+ Inheritance diagram for oomph::TwoPlusThreeUpperTriangularWithOneLevelSubsidiary< MATRIX >:

Public Member Functions

 TwoPlusThreeUpperTriangularWithOneLevelSubsidiary ()
 Constructor. More...
 
virtual ~TwoPlusThreeUpperTriangularWithOneLevelSubsidiary ()
 Destructor - delete the preconditioner matrices. More...
 
void clean_up_my_memory ()
 Clean up the memory. More...
 
 TwoPlusThreeUpperTriangularWithOneLevelSubsidiary (const TwoPlusThreeUpperTriangularWithOneLevelSubsidiary &)
 Broken copy constructor. More...
 
void operator= (const TwoPlusThreeUpperTriangularWithOneLevelSubsidiary &)
 Broken assignment operator. More...
 
void preconditioner_solve (const DoubleVector &r, DoubleVector &z)
 Apply preconditioner to r. More...
 
void setup ()
 Setup the preconditioner. More...
 
void set_multi_poisson_mesh (Mesh *multi_poisson_mesh_pt)
 Specify the mesh that contains multi-poisson elements. More...
 
void setup (DoubleMatrixBase *matrix_pt)
 
void setup (const Problem *problem_pt, DoubleMatrixBase *matrix_pt)
 
virtual void setup ()=0
 
- Public Member Functions inherited from oomph::BlockPreconditioner< MATRIX >
 BlockPreconditioner ()
 Constructor. More...
 
virtual ~BlockPreconditioner ()
 Destructor. More...
 
 BlockPreconditioner (const BlockPreconditioner &)=delete
 Broken copy constructor. More...
 
void operator= (const BlockPreconditioner &)=delete
 Broken assignment operator. More...
 
MATRIX * matrix_pt () const
 
void turn_on_recursive_debug_flag ()
 
void turn_off_recursive_debug_flag ()
 
void turn_on_debug_flag ()
 Toggles on the debug flag. More...
 
void turn_off_debug_flag ()
 Toggles off the debug flag. More...
 
void turn_into_subsidiary_block_preconditioner (BlockPreconditioner< MATRIX > *master_block_prec_pt, const Vector< unsigned > &doftype_in_master_preconditioner_coarse)
 
void turn_into_subsidiary_block_preconditioner (BlockPreconditioner< MATRIX > *master_block_prec_pt, const Vector< unsigned > &doftype_in_master_preconditioner_coarse, const Vector< Vector< unsigned >> &doftype_coarsen_map_coarse)
 
virtual void block_setup ()
 
void block_setup (const Vector< unsigned > &dof_to_block_map)
 
void get_block (const unsigned &i, const unsigned &j, MATRIX &output_matrix, const bool &ignore_replacement_block=false) const
 
MATRIX get_block (const unsigned &i, const unsigned &j, const bool &ignore_replacement_block=false) const
 
void set_master_matrix_pt (MATRIX *in_matrix_pt)
 Set the matrix_pt in the upper-most master preconditioner. More...
 
void get_block_other_matrix (const unsigned &i, const unsigned &j, MATRIX *in_matrix_pt, MATRIX &output_matrix)
 
void get_blocks (DenseMatrix< bool > &required_blocks, DenseMatrix< MATRIX * > &block_matrix_pt) const
 
void get_dof_level_block (const unsigned &i, const unsigned &j, MATRIX &output_block, const bool &ignore_replacement_block=false) const
 
MATRIX get_concatenated_block (const VectorMatrix< BlockSelector > &selected_block)
 
void get_concatenated_block_vector (const Vector< unsigned > &block_vec_number, const DoubleVector &v, DoubleVector &b)
 
void return_concatenated_block_vector (const Vector< unsigned > &block_vec_number, const DoubleVector &b, DoubleVector &v) const
 Takes concatenated block ordered vector, b, and copies its. More...
 
void get_block_vectors (const Vector< unsigned > &block_vec_number, const DoubleVector &v, Vector< DoubleVector > &s) const
 
void get_block_vectors (const DoubleVector &v, Vector< DoubleVector > &s) const
 
void return_block_vectors (const Vector< unsigned > &block_vec_number, const Vector< DoubleVector > &s, DoubleVector &v) const
 
void return_block_vectors (const Vector< DoubleVector > &s, DoubleVector &v) const
 
void get_block_vector (const unsigned &n, const DoubleVector &v, DoubleVector &b) const
 
void return_block_vector (const unsigned &n, const DoubleVector &b, DoubleVector &v) const
 
void get_block_ordered_preconditioner_vector (const DoubleVector &v, DoubleVector &w)
 
void return_block_ordered_preconditioner_vector (const DoubleVector &w, DoubleVector &v) const
 
unsigned nblock_types () const
 Return the number of block types. More...
 
unsigned ndof_types () const
 Return the total number of DOF types. More...
 
const Meshmesh_pt (const unsigned &i) const
 
unsigned nmesh () const
 
int block_number (const unsigned &i_dof) const
 Return the block number corresponding to a global index i_dof. More...
 
int index_in_block (const unsigned &i_dof) const
 
const LinearAlgebraDistributionblock_distribution_pt (const unsigned &b) const
 Access function to the block distributions (const version). More...
 
LinearAlgebraDistributionblock_distribution_pt (const unsigned b)
 Access function to the block distributions (non-const version). More...
 
LinearAlgebraDistributiondof_block_distribution_pt (const unsigned &b)
 Access function to the dof-level block distributions. More...
 
const LinearAlgebraDistributionmaster_distribution_pt () const
 
unsigned ndof_types_in_mesh (const unsigned &i) const
 
bool is_subsidiary_block_preconditioner () const
 
bool is_master_block_preconditioner () const
 
void set_block_output_to_files (const std::string &basefilename)
 
void disable_block_output_to_files ()
 Turn off output of blocks (by clearing the basefilename string). More...
 
bool block_output_on () const
 Test if output of blocks is on or not. More...
 
void output_blocks_to_files (const std::string &basefilename, const unsigned &precision=8) const
 
void post_block_matrix_assembly_partial_clear ()
 
BlockPreconditioner< MATRIX > * master_block_preconditioner_pt () const
 Access function to the master block preconditioner pt. More...
 
void clear_block_preconditioner_base ()
 
void document ()
 
Vector< Vector< unsigned > > doftype_coarsen_map_fine () const
 
Vector< unsignedget_fine_grain_dof_types_in (const unsigned &i) const
 
unsigned nfine_grain_dof_types_in (const unsigned &i) const
 
MapMatrix< unsigned, CRDoubleMatrix * > replacement_dof_block_pt () const
 Access function to the replaced dof-level blocks. More...
 
void setup_matrix_vector_product (MatrixVectorProduct *matvec_prod_pt, CRDoubleMatrix *block_pt, const Vector< unsigned > &block_col_indices)
 
void setup_matrix_vector_product (MatrixVectorProduct *matvec_prod_pt, CRDoubleMatrix *block_pt, const unsigned &block_col_index)
 
void internal_get_block_ordered_preconditioner_vector (const DoubleVector &v, DoubleVector &w) const
 
void internal_return_block_ordered_preconditioner_vector (const DoubleVector &w, DoubleVector &v) const
 
unsigned internal_nblock_types () const
 
unsigned internal_ndof_types () const
 
void internal_return_block_vector (const unsigned &n, const DoubleVector &b, DoubleVector &v) const
 
void internal_get_block_vector (const unsigned &n, const DoubleVector &v, DoubleVector &b) const
 
void internal_get_block_vectors (const Vector< unsigned > &block_vec_number, const DoubleVector &v, Vector< DoubleVector > &s) const
 
void internal_get_block_vectors (const DoubleVector &v, Vector< DoubleVector > &s) const
 
void internal_return_block_vectors (const Vector< unsigned > &block_vec_number, const Vector< DoubleVector > &s, DoubleVector &v) const
 
void internal_return_block_vectors (const Vector< DoubleVector > &s, DoubleVector &v) const
 
void internal_get_block (const unsigned &i, const unsigned &j, MATRIX &output_block) const
 
int internal_block_number (const unsigned &i_dof) const
 
int internal_index_in_block (const unsigned &i_dof) const
 
const LinearAlgebraDistributioninternal_block_distribution_pt (const unsigned &b) const
 Access function to the internal block distributions. More...
 
void insert_auxiliary_block_distribution (const Vector< unsigned > &block_vec_number, LinearAlgebraDistribution *dist_pt)
 
void block_matrix_test (const unsigned &i, const unsigned &j, const MATRIX *block_matrix_pt) const
 
template<typename myType >
int get_index_of_value (const Vector< myType > &vec, const myType val, const bool sorted=false) const
 
void internal_get_block (const unsigned &block_i, const unsigned &block_j, CRDoubleMatrix &output_block) const
 
void get_dof_level_block (const unsigned &block_i, const unsigned &block_j, CRDoubleMatrix &output_block, const bool &ignore_replacement_block) const
 
- Public Member Functions inherited from oomph::Preconditioner
 Preconditioner ()
 Constructor. More...
 
 Preconditioner (const Preconditioner &)=delete
 Broken copy constructor. More...
 
void operator= (const Preconditioner &)=delete
 Broken assignment operator. More...
 
virtual ~Preconditioner ()
 Destructor (empty) More...
 
virtual void preconditioner_solve_transpose (const DoubleVector &r, DoubleVector &z)
 
void setup (DoubleMatrixBase *matrix_pt)
 
void setup (const Problem *problem_pt, DoubleMatrixBase *matrix_pt)
 
void enable_silent_preconditioner_setup ()
 Set up the block preconditioner quietly! More...
 
void disable_silent_preconditioner_setup ()
 Be verbose in the block preconditioner setup. More...
 
virtual void clean_up_memory ()
 Clean up memory (empty). Generic interface function. More...
 
virtual void set_matrix_pt (DoubleMatrixBase *matrix_pt)
 Set the matrix pointer. More...
 
virtual const OomphCommunicatorcomm_pt () const
 Get function for comm pointer. More...
 
virtual void set_comm_pt (const OomphCommunicator *const comm_pt)
 Set the communicator pointer. More...
 
double setup_time () const
 Returns the time to setup the preconditioner. More...
 
virtual void turn_into_subsidiary_block_preconditioner (BlockPreconditioner< CRDoubleMatrix > *master_block_prec_pt, const Vector< unsigned > &doftype_in_master_preconditioner_coarse)
 
virtual void turn_into_subsidiary_block_preconditioner (BlockPreconditioner< CRDoubleMatrix > *master_block_prec_pt, const Vector< unsigned > &doftype_in_master_preconditioner_coarse, const Vector< Vector< unsigned >> &doftype_coarsen_map_coarse)
 
- Public Member Functions inherited from oomph::DistributableLinearAlgebraObject
 DistributableLinearAlgebraObject ()
 Default constructor - create a distribution. More...
 
 DistributableLinearAlgebraObject (const DistributableLinearAlgebraObject &matrix)=delete
 Broken copy constructor. More...
 
void operator= (const DistributableLinearAlgebraObject &)=delete
 Broken assignment operator. More...
 
virtual ~DistributableLinearAlgebraObject ()
 Destructor. More...
 
LinearAlgebraDistributiondistribution_pt () const
 access to the LinearAlgebraDistribution More...
 
unsigned nrow () const
 access function to the number of global rows. More...
 
unsigned nrow_local () const
 access function for the num of local rows on this processor. More...
 
unsigned nrow_local (const unsigned &p) const
 access function for the num of local rows on this processor. More...
 
unsigned first_row () const
 access function for the first row on this processor More...
 
unsigned first_row (const unsigned &p) const
 access function for the first row on this processor More...
 
bool distributed () const
 distribution is serial or distributed More...
 
bool distribution_built () const
 
void build_distribution (const LinearAlgebraDistribution *const dist_pt)
 
void build_distribution (const LinearAlgebraDistribution &dist)
 

Private Attributes

MatrixVectorProductOff_diagonal_matrix_vector_product_pt
 Pointer to matrix vector product operators for the off diagonal block. More...
 
PreconditionerFirst_subsidiary_preconditioner_pt
 
PreconditionerSecond_subsidiary_preconditioner_pt
 
MeshMulti_poisson_mesh_pt
 

Additional Inherited Members

- Protected Member Functions inherited from oomph::BlockPreconditioner< MATRIX >
void set_nmesh (const unsigned &n)
 
void set_mesh (const unsigned &i, const Mesh *const mesh_pt, const bool &allow_multiple_element_type_in_mesh=false)
 
void set_replacement_dof_block (const unsigned &block_i, const unsigned &block_j, CRDoubleMatrix *replacement_dof_block_pt)
 
bool any_mesh_distributed () const
 
int internal_dof_number (const unsigned &i_dof) const
 
unsigned internal_index_in_dof (const unsigned &i_dof) const
 
unsigned internal_block_dimension (const unsigned &b) const
 
unsigned internal_dof_block_dimension (const unsigned &i) const
 
unsigned master_nrow () const
 
unsigned internal_master_dof_number (const unsigned &b) const
 
const LinearAlgebraDistributioninternal_preconditioner_matrix_distribution_pt () const
 
const LinearAlgebraDistributionpreconditioner_matrix_distribution_pt () const
 
- Protected Member Functions inherited from oomph::DistributableLinearAlgebraObject
void clear_distribution ()
 
- Protected Attributes inherited from oomph::BlockPreconditioner< MATRIX >
MapMatrix< unsigned, CRDoubleMatrix * > Replacement_dof_block_pt
 The replacement dof-level blocks. More...
 
Vector< LinearAlgebraDistribution * > Block_distribution_pt
 The distribution for the blocks. More...
 
Vector< Vector< unsigned > > Block_to_dof_map_coarse
 
Vector< Vector< unsigned > > Block_to_dof_map_fine
 Mapping for the block types to the most fine grain dof types. More...
 
Vector< Vector< unsigned > > Doftype_coarsen_map_coarse
 
Vector< Vector< unsigned > > Doftype_coarsen_map_fine
 
Vector< LinearAlgebraDistribution * > Internal_block_distribution_pt
 Storage for the default distribution for each internal block. More...
 
Vector< LinearAlgebraDistribution * > Dof_block_distribution_pt
 
Vector< unsignedAllow_multiple_element_type_in_mesh
 
Vector< const Mesh * > Mesh_pt
 
Vector< unsignedNdof_types_in_mesh
 
unsigned Internal_nblock_types
 
unsigned Internal_ndof_types
 
- Protected Attributes inherited from oomph::Preconditioner
bool Silent_preconditioner_setup
 Boolean to indicate whether or not the build should be done silently. More...
 
std::ostream * Stream_pt
 Pointer to the output stream – defaults to std::cout. More...
 

Detailed Description

template<typename MATRIX>
class oomph::TwoPlusThreeUpperTriangularWithOneLevelSubsidiary< MATRIX >

///////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////// Upper block triangular with subsidiary block preconditioners for a system with 5 dof types.

Constructor & Destructor Documentation

◆ TwoPlusThreeUpperTriangularWithOneLevelSubsidiary() [1/2]

Constructor.

1539  :
1540  BlockPreconditioner<MATRIX>(),
1544  {
1546  }
Preconditioner * Second_subsidiary_preconditioner_pt
Definition: multi_poisson_block_preconditioners.h:1600
MatrixVectorProduct * Off_diagonal_matrix_vector_product_pt
Pointer to matrix vector product operators for the off diagonal block.
Definition: multi_poisson_block_preconditioners.h:1592
Preconditioner * First_subsidiary_preconditioner_pt
Definition: multi_poisson_block_preconditioners.h:1596
Mesh * Multi_poisson_mesh_pt
Definition: multi_poisson_block_preconditioners.h:1604

References oomph::TwoPlusThreeUpperTriangularWithOneLevelSubsidiary< MATRIX >::Multi_poisson_mesh_pt.

◆ ~TwoPlusThreeUpperTriangularWithOneLevelSubsidiary()

Destructor - delete the preconditioner matrices.

1550  {
1551  this->clean_up_my_memory();
1552  }
void clean_up_my_memory()
Clean up the memory.
Definition: multi_poisson_block_preconditioners.h:1792

References oomph::TwoPlusThreeUpperTriangularWithOneLevelSubsidiary< MATRIX >::clean_up_my_memory().

◆ TwoPlusThreeUpperTriangularWithOneLevelSubsidiary() [2/2]

Broken copy constructor.

1560  {
1562  ("TwoPlusThreeUpperTriangularWithOneLevelSubsidiary");
1563  }
void broken_copy(const std::string &class_name)
Issue error message and terminate execution.
Definition: oomph_utilities.cc:212

References oomph::BrokenCopy::broken_copy().

Member Function Documentation

◆ clean_up_my_memory()

template<typename MATRIX >
void oomph::TwoPlusThreeUpperTriangularWithOneLevelSubsidiary< MATRIX >::clean_up_my_memory

Clean up the memory.

The clean up function.

1793  {
1794  // Delete off-diagonal matrix vector product
1796  {
1799  }
1800 
1801  //Clean up subsidiary preconditioners.
1803  {
1806  }
1808  {
1811  }
1812  } // End of clean_up_my_memory function.

Referenced by oomph::TwoPlusThreeUpperTriangularWithOneLevelSubsidiary< MATRIX >::~TwoPlusThreeUpperTriangularWithOneLevelSubsidiary().

◆ operator=()

template<typename MATRIX >
void oomph::TwoPlusThreeUpperTriangularWithOneLevelSubsidiary< MATRIX >::operator= ( const TwoPlusThreeUpperTriangularWithOneLevelSubsidiary< MATRIX > &  )
inline

Broken assignment operator.

1568  {
1570  "TwoPlusThreeUpperTriangularWithOneLevelSubsidiary");
1571  }
void broken_assign(const std::string &class_name)
Issue error message and terminate execution.
Definition: oomph_utilities.cc:195

References oomph::BrokenCopy::broken_assign().

◆ preconditioner_solve()

template<typename MATRIX >
void oomph::TwoPlusThreeUpperTriangularWithOneLevelSubsidiary< MATRIX >::preconditioner_solve ( const DoubleVector r,
DoubleVector z 
)
virtual

Apply preconditioner to r.

Preconditioner solve.

Implements oomph::Preconditioner.

1736  {
1737  // Solve "bottom right" (1,1) diagonal block system, using the
1738  // subsidiary block preconditioner that acts on the
1739  // "bottom right" 3x3 sub-system (only!). The subsidiary preconditioner
1740  // will extract the relevant (3x1) "sub-vectors" from the "big" (5x1)
1741  // vector z and treat it as the rhs, r, of P y = z
1742  // where P is 3x3 a block matrix. Once the system is solved,
1743  // the result is automatically put back into the appropriate places
1744  // of the "big" (5x1) vector y:
1746 
1747  // Now extract the "bottom" (3x1) block vector from the full-size (5x1)
1748  // solution vector that we've just computed -- note that index 1
1749  // refers to the block enumeration in the current preconditioner
1750  // (which has two blocks!)
1751  DoubleVector block_y;
1752  this->get_block_vector(1,y,block_y);
1753 
1754  // Evaluate matrix vector product of just-extracted (3x1) solution
1755  // vector with off-diagonal block and store in temporary vector
1756  DoubleVector temp;
1758 
1759  // Extract "upper" (2x1) block vector from full-size (5x1) rhs
1760  // vector (as passed into this function)...
1761  DoubleVector block_z;
1762  this->get_block_vector(0,z,block_z);
1763 
1764  // ...and subtract matrix vector product computed above
1765  block_z -= temp;
1766 
1767  // Block solve for first diagonal block. Since the associated subsidiary
1768  // preconditioner is a block preconditioner itself, it will extract
1769  // the required (2x1) block from a "big" (5x1) rhs vector.
1770  // Therefore we first put the actual (2x1) rhs vector block_z into a
1771  // "big" (5x1) vector big_z whose row distribution matches that of the
1772  // "big" right hand side vector, z, that was passed into this function.
1773  DoubleVector big_z(z.distribution_pt());
1774  this->return_block_vector(0,block_z,big_z);
1775 
1776  // Now apply the subsidiary block preconditioner that acts on the
1777  // "upper left" (2x2) sub-system (only!). The subsidiary preconditioner
1778  // will extract the relevant (2x1) block vector from the "big" (5x1)
1779  // vector big_r and treat it as the rhs, z, of its P y = z
1780  // where P is upper left 2x2 block diagonal of the big system.
1781  // Once the system is solved, the result is automatically put back
1782  // into the appropriate places of the "big" (5x1) vector y which is
1783  // returned by the current function, so no further action is required.
1785  }
std::vector< double > DoubleVector
loads clump configuration
Definition: ClumpInput.h:26
void return_block_vector(const unsigned &n, const DoubleVector &b, DoubleVector &v) const
Definition: block_preconditioner.cc:4489
void get_block_vector(const unsigned &n, const DoubleVector &v, DoubleVector &b) const
Definition: block_preconditioner.cc:4186
void multiply(const DoubleVector &x, DoubleVector &y) const
Definition: matrix_vector_product.cc:108
virtual void preconditioner_solve(const DoubleVector &r, DoubleVector &z)=0
Scalar * y
Definition: level1_cplx_impl.h:128

References oomph::DistributableLinearAlgebraObject::distribution_pt(), and y.

◆ set_multi_poisson_mesh()

template<typename MATRIX >
void oomph::TwoPlusThreeUpperTriangularWithOneLevelSubsidiary< MATRIX >::set_multi_poisson_mesh ( Mesh multi_poisson_mesh_pt)
inline

Specify the mesh that contains multi-poisson elements.

1585  {
1586  Multi_poisson_mesh_pt=multi_poisson_mesh_pt;
1587  }

References oomph::TwoPlusThreeUpperTriangularWithOneLevelSubsidiary< MATRIX >::Multi_poisson_mesh_pt.

Referenced by MultiPoissonProblem< ELEMENT >::MultiPoissonProblem().

◆ setup() [1/4]

template<typename MATRIX >
void oomph::TwoPlusThreeUpperTriangularWithOneLevelSubsidiary< MATRIX >::setup
virtual

Setup the preconditioner.

The setup function.

Implements oomph::Preconditioner.

1613  {
1614  // clean the memory
1615  this->clean_up_my_memory();
1616 
1617 #ifdef PARANOID
1618  if (Multi_poisson_mesh_pt == 0)
1619  {
1620  std::stringstream err;
1621  err << "Please set pointer to mesh using set_multi_poisson_mesh(...).\n";
1622  throw OomphLibError(err.str(),
1625  }
1626 #endif
1627 
1628  // The preconditioner works with one mesh; set it!
1629  this->set_nmesh(1);
1631 
1632  // number of dof types
1633  unsigned n_dof_types = this->ndof_types();
1634 
1635 #ifdef PARANOID
1636  // This preconditioner only works for 5 dof types
1637  if (n_dof_types!=5)
1638  {
1639  std::stringstream tmp;
1640  tmp << "This preconditioner only works for problems with 5 dof types\n"
1641  << "Yours has " << n_dof_types;
1642  throw OomphLibError(tmp.str(),
1645  }
1646 #endif
1647 
1648  // Combine "dof blocks" into two compound blocks, one containing dof
1649  // types 0 and 1, the final one dof types 2-4. In general we want:
1650  // dof_to_block_map[dof_type] = block type
1651  Vector<unsigned> dof_to_block_map(n_dof_types);
1652  dof_to_block_map[0]=0;
1653  dof_to_block_map[1]=0;
1654  dof_to_block_map[2]=1;
1655  dof_to_block_map[3]=1;
1656  dof_to_block_map[4]=1;
1657  this->block_setup(dof_to_block_map);
1658 
1659  // Create the subsidiary block preconditioners.
1660  {
1661  // Block upper triangular block preconditioner for compound
1662  // 2x2 top left block in "big" 5x5 matrix
1663  UpperTriangular<CRDoubleMatrix>* block_prec_pt=
1664  new UpperTriangular<CRDoubleMatrix>;
1665  First_subsidiary_preconditioner_pt=block_prec_pt;
1666 
1667  // Set mesh
1668  block_prec_pt->set_multi_poisson_mesh(Multi_poisson_mesh_pt);
1669 
1670  // Turn into a subsidiary preconditioner, declaring which
1671  // of the five dof types in the present (master) preconditioner
1672  // correspond to the dof types in the subsidiary block preconditioner:
1673  // dof_map[dof_block_ID_in_subsdiary] = dof_block_ID_in_master. Also
1674  // pass pointer to present (master) preconditioner.
1675  unsigned n_sub_dof_types=2;
1676  Vector<unsigned> dof_map(n_sub_dof_types);
1677  dof_map[0]=0;
1678  dof_map[1]=1;
1679  block_prec_pt->turn_into_subsidiary_block_preconditioner(this,dof_map);
1680 
1681  // Setup: Pass pointer to full-size matrix!
1682  block_prec_pt->setup(this->matrix_pt());
1683  }
1684 
1685  {
1686  // Block upper triangular for 3x3 bottom right block in "big" 5x5 matrix
1687  UpperTriangular<CRDoubleMatrix>* block_prec_pt=
1688  new UpperTriangular<CRDoubleMatrix>;
1690 
1691  // Set mesh
1692  block_prec_pt->set_multi_poisson_mesh(Multi_poisson_mesh_pt);
1693 
1694  // Turn second_sub into a subsidiary preconditioner, declaring which
1695  // of the five dof types in the present (master) preconditioner
1696  // correspond to the dof types in the subsidiary block preconditioner:
1697  // dof_map[dof_block_ID_in_subsdiary] = dof_block_ID_in_master. Also
1698  // pass pointer to present (master) preconditioner.
1699  unsigned n_sub_dof_types=3;
1700  Vector<unsigned> dof_map(n_sub_dof_types);
1701  dof_map[0]=2;
1702  dof_map[1]=3;
1703  dof_map[2]=4;
1704  block_prec_pt->turn_into_subsidiary_block_preconditioner(this,dof_map);
1705 
1706  // Setup: Pass pointer to full-size matrix!
1707  block_prec_pt->setup(this->matrix_pt());
1708  }
1709 
1710  // Setup the off-diagonal mat vec operator
1711  {
1712  // Get the off-diagonal block: the top-right block in the present
1713  // block preconditioner (which views the system matrix as comprising
1714  // 2x2 blocks).
1715  CRDoubleMatrix block_matrix = this->get_block(0,1);
1716 
1717  // Create matrix vector product
1718  Off_diagonal_matrix_vector_product_pt = new MatrixVectorProduct;
1719 
1720  // Setup: Final argument indicates block column in the present
1721  // block preconditioner (which views the system matrix as comprising
1722  // 2x2 blocks).
1723  unsigned block_column_index=1;
1725  Off_diagonal_matrix_vector_product_pt,&block_matrix,block_column_index);
1726  }
1727 
1728  }
void get_block(const unsigned &i, const unsigned &j, MATRIX &output_matrix, const bool &ignore_replacement_block=false) const
Definition: block_preconditioner.h:673
MATRIX * matrix_pt() const
Definition: block_preconditioner.h:520
unsigned ndof_types() const
Return the total number of DOF types.
Definition: block_preconditioner.h:1694
void setup_matrix_vector_product(MatrixVectorProduct *matvec_prod_pt, CRDoubleMatrix *block_pt, const Vector< unsigned > &block_col_indices)
Definition: block_preconditioner.h:2397
void set_nmesh(const unsigned &n)
Definition: block_preconditioner.h:2851
virtual void block_setup()
Definition: block_preconditioner.cc:2483
void set_mesh(const unsigned &i, const Mesh *const mesh_pt, const bool &allow_multiple_element_type_in_mesh=false)
Definition: block_preconditioner.h:2866
Eigen::Matrix< Scalar, Dynamic, Dynamic, ColMajor > tmp
Definition: level3_impl.h:365
#define OOMPH_EXCEPTION_LOCATION
Definition: oomph_definitions.h:61
#define OOMPH_CURRENT_FUNCTION
Definition: oomph_definitions.h:86

References OOMPH_CURRENT_FUNCTION, OOMPH_EXCEPTION_LOCATION, oomph::UpperTriangular< MATRIX >::set_multi_poisson_mesh(), oomph::UpperTriangular< MATRIX >::setup(), tmp, and oomph::BlockPreconditioner< MATRIX >::turn_into_subsidiary_block_preconditioner().

◆ setup() [2/4]

template<typename MATRIX >
virtual void oomph::Preconditioner::setup
virtual

Setup the preconditioner. Pure virtual generic interface function.

Implements oomph::Preconditioner.

◆ setup() [3/4]

template<typename MATRIX >
void oomph::Preconditioner::setup
inlinevirtual

Compatability layer for old preconditioners where problem pointers were needed. The problem pointer is only used to get a communicator pointer.

Implements oomph::Preconditioner.

121  {
123  setup(matrix_pt);
124  }
void setup()
Setup the preconditioner.
Definition: multi_poisson_block_preconditioners.h:1612
void obsolete()
Output warning message.
Definition: oomph_utilities.cc:1102

◆ setup() [4/4]

template<typename MATRIX >
void oomph::Preconditioner::setup
inlinevirtual

Setup the preconditioner: store the matrix pointer and the communicator pointer then call preconditioner specific setup() function.

Implements oomph::Preconditioner.

95  {
96  // Store matrix pointer
98 
99  // Extract and store communicator pointer
100  DistributableLinearAlgebraObject* dist_obj_pt =
102  if (dist_obj_pt != 0)
103  {
104  set_comm_pt(dist_obj_pt->distribution_pt()->communicator_pt());
105  }
106  else
107  {
108  set_comm_pt(0);
109  }
110 
111  double setup_time_start = TimingHelpers::timer();
112  setup();
113  double setup_time_finish = TimingHelpers::timer();
114  Setup_time = setup_time_finish - setup_time_start;
115  }
DistributableLinearAlgebraObject()
Default constructor - create a distribution.
Definition: linear_algebra_distribution.h:438
double Setup_time
The time it takes to set up this preconditioner.
Definition: preconditioner.h:243
virtual void set_comm_pt(const OomphCommunicator *const comm_pt)
Set the communicator pointer.
Definition: preconditioner.h:193
virtual void set_matrix_pt(DoubleMatrixBase *matrix_pt)
Set the matrix pointer.
Definition: preconditioner.h:165
double timer()
returns the time in seconds after some point in past
Definition: oomph_utilities.cc:1295

Member Data Documentation

◆ First_subsidiary_preconditioner_pt

template<typename MATRIX >
Preconditioner* oomph::TwoPlusThreeUpperTriangularWithOneLevelSubsidiary< MATRIX >::First_subsidiary_preconditioner_pt
private

Pointer to preconditioners/inexact solver for (0,0) block

◆ Multi_poisson_mesh_pt

◆ Off_diagonal_matrix_vector_product_pt

template<typename MATRIX >
MatrixVectorProduct* oomph::TwoPlusThreeUpperTriangularWithOneLevelSubsidiary< MATRIX >::Off_diagonal_matrix_vector_product_pt
private

Pointer to matrix vector product operators for the off diagonal block.

◆ Second_subsidiary_preconditioner_pt

template<typename MATRIX >
Preconditioner* oomph::TwoPlusThreeUpperTriangularWithOneLevelSubsidiary< MATRIX >::Second_subsidiary_preconditioner_pt
private

Pointer to preconditioners/inexact solver for (1,1) block


The documentation for this class was generated from the following file: