oomph::TwoPlusOneUpperTriangularPreconditioner< MATRIX > Class Template Reference

#include <multi_poisson_block_preconditioners.h>

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

Public Member Functions

 TwoPlusOneUpperTriangularPreconditioner ()
 Constructor for TwoPlusOneUpperTriangularPreconditioner. More...
 
 ~TwoPlusOneUpperTriangularPreconditioner ()
 Destructor - delete the diagonal solvers (subsidiary preconditioners) More...
 
virtual void clean_up_my_memory ()
 Cleanup function. More...
 
 TwoPlusOneUpperTriangularPreconditioner (const TwoPlusOneUpperTriangularPreconditioner &)
 Broken copy constructor. More...
 
void operator= (const TwoPlusOneUpperTriangularPreconditioner &)
 Broken assignment operator. More...
 
void preconditioner_solve (const DoubleVector &r, DoubleVector &z)
 Apply preconditioner to r, i.e. return z such that P z = 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

PreconditionerFirst_subsidiary_preconditioner_pt
 
PreconditionerSecond_subsidiary_preconditioner_pt
 
MatrixVectorProductOff_diagonal_matrix_vector_product_pt
 Matrix vector product operators for the off diagonals. More...
 
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::TwoPlusOneUpperTriangularPreconditioner< MATRIX >

///////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////// Block diagonal preconditioner for system with 3 dof types assembled into a 2x2 block system, with (0,0) block containing the first two dof types, the (1,1) block containing the last one. Both blocks are solved by subsidiary diagonal block preconditioners, so the overall behaviour is equivalent to a solve with a 3x3 upper triangular preconditioner.

Constructor & Destructor Documentation

◆ TwoPlusOneUpperTriangularPreconditioner() [1/2]

Constructor for TwoPlusOneUpperTriangularPreconditioner.

1834  :
1835  BlockPreconditioner<MATRIX>(),
1839  {
1841  } // end_of_constructor
MatrixVectorProduct * Off_diagonal_matrix_vector_product_pt
Matrix vector product operators for the off diagonals.
Definition: multi_poisson_block_preconditioners.h:1894
Preconditioner * First_subsidiary_preconditioner_pt
Definition: multi_poisson_block_preconditioners.h:1887
Mesh * Multi_poisson_mesh_pt
Definition: multi_poisson_block_preconditioners.h:1898
Preconditioner * Second_subsidiary_preconditioner_pt
Definition: multi_poisson_block_preconditioners.h:1891

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

◆ ~TwoPlusOneUpperTriangularPreconditioner()

Destructor - delete the diagonal solvers (subsidiary preconditioners)

1846  {
1847  this->clean_up_my_memory();
1848  }
virtual void clean_up_my_memory()
Cleanup function.
Definition: multi_poisson_block_preconditioners.h:2078

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

◆ TwoPlusOneUpperTriangularPreconditioner() [2/2]

Broken copy constructor.

1857  {
1858  BrokenCopy::broken_copy("TwoPlusOneUpperTriangularPreconditioner");
1859  }
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::TwoPlusOneUpperTriangularPreconditioner< MATRIX >::clean_up_my_memory
virtual

Cleanup function.

The clean up function.

2079  {
2080  // Delete diagonal preconditioners (approximate solvers)
2082  {
2085  }
2087  {
2090  }
2092  {
2095  }
2096  } // End of clean_up_my_memory function.

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

◆ operator=()

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

Broken assignment operator.

1863  {
1864  BrokenCopy::broken_assign("TwoPlusOneUpperTriangularPreconditioner");
1865  }
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::TwoPlusOneUpperTriangularPreconditioner< MATRIX >::preconditioner_solve ( const DoubleVector r,
DoubleVector z 
)
virtual

Apply preconditioner to r, i.e. return z such that P z = r.

Preconditioner solve for the two plus one diagonal preconditioner: Apply preconditioner to r and return z, so that P z = r

Implements oomph::Preconditioner.

2033  {
2034  // Solve (1,1) diagonal block system:
2035  // Apply the subsidiary block preconditioner that acts on the
2036  // "bottom right" 1x1 sub-system (only!). The subsidiary preconditioner
2037  // will extract the relevant (1x1) "sub-vectors" from the "big" (3x1)
2038  // vector big_r and treat it as the rhs, r, of P z = r
2039  // where P is 1x1 block diagonal. Once the system is solved,
2040  // the result is automatically put back into the appropriate places
2041  // of the "big" (3x1) vector z:
2043 
2044  // Perform matrix vector product with (0,1) off diagonal.
2045  DoubleVector temp;
2046  DoubleVector z_1;
2047  this->get_block_vector(1,z,z_1);
2049 
2050  // Get r_0 from the RHS and modify it accordingly.
2051  DoubleVector r_0;
2052  this->get_block_vector(0,r,r_0);
2053  r_0 -= temp;
2054 
2055 
2056  // Block solve for first diagonal block. Since the associated subsidiary
2057  // preconditioner is a block preconditioner itself, it will extract
2058  // the required (2x1) block rhs from a "big" (3x1) rhs vector, big_r.
2059  // Therefore we first put the actual (2x1) rhs vector r_0 into the
2060  // "big" (3x1) vector big_r.
2061  DoubleVector big_r(z.distribution_pt());
2062  this->return_block_vector(0,r_0,big_r);
2063 
2064  // Now apply the subsidiary block preconditioner that acts on the
2065  // "top left" 2x2 sub-system (only!). The subsidiary preconditioner
2066  // will extract the relevant (2x1) "sub-vectors" from the "big" (3x1)
2067  // vector big_r and treat it as the rhs, r, of P z = r
2068  // where P is 2x2 block diagonal. Once the system is solved,
2069  // the result is automatically put back into the appropriate places
2070  // of the "big" (3x1) vector z:
2072  }
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
r
Definition: UniformPSDSelfTest.py:20

References oomph::DistributableLinearAlgebraObject::distribution_pt(), and UniformPSDSelfTest::r.

◆ set_multi_poisson_mesh()

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

Specify the mesh that contains multi-poisson elements.

1879  {
1880  Multi_poisson_mesh_pt=multi_poisson_mesh_pt;
1881  }

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

Referenced by oomph::TwoPlusThreeUpperTriangularWithTwoLevelSubsidiary< MATRIX >::setup().

◆ setup() [1/4]

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

Setup the preconditioner.

The setup function.

Implements oomph::Preconditioner.

1907  {
1908  // Clean up memory.
1909  this->clean_up_my_memory();
1910 
1911 #ifdef PARANOID
1912  if (Multi_poisson_mesh_pt == 0)
1913  {
1914  std::stringstream err;
1915  err << "Please set pointer to mesh using set_multi_poisson_mesh(...).\n";
1916  throw OomphLibError(err.str(),
1919  }
1920 #endif
1921 
1922  // The preconditioner works with one mesh; set it!
1923  this->set_nmesh(1);
1925 
1926 
1927 #ifdef PARANOID
1928  // This preconditioner only works for 3 dof types
1929  unsigned n_dof_types = this->ndof_types();
1930  if (n_dof_types!=3)
1931  {
1932  std::stringstream tmp;
1933  tmp << "This preconditioner only works for problems with 3 dof types\n"
1934  << "Yours has " << n_dof_types;
1935  throw OomphLibError(tmp.str(),
1938  }
1939 #endif
1940 
1941  // Combine into two major blocks, one containing dofs 0 and 1, the
1942  // final one dof, 2.
1943 
1944  Vector<unsigned> dof_to_block_map(3);
1945  dof_to_block_map[0]=0;
1946  dof_to_block_map[1]=0;
1947  dof_to_block_map[2]=1;
1948  this->block_setup(dof_to_block_map);
1949 
1950  // Create the subsidiary preconditioners
1951  //--------------------------------------
1952 
1953  // First one:
1954  {
1955  UpperTriangular<CRDoubleMatrix>* block_prec_pt=
1956  new UpperTriangular<CRDoubleMatrix>;
1957  First_subsidiary_preconditioner_pt=block_prec_pt;
1958 
1959  // Set mesh
1960  block_prec_pt->set_multi_poisson_mesh(Multi_poisson_mesh_pt);
1961 
1962  // Turn it into a subsidiary preconditioner, declaring which
1963  // of the three dof types in the present (master) preconditioner
1964  // correspond to the dof types in the subsidiary block preconditioner,
1965  // i.e. arguments: dof_map[doc_in_subsidiary]=dof_in_present
1966  unsigned n_sub_dof_types=2;
1967  Vector<unsigned> dof_map(n_sub_dof_types);
1968  dof_map[0] = 0;
1969  dof_map[1] = 1;
1970  block_prec_pt->turn_into_subsidiary_block_preconditioner(this,dof_map);
1971 
1972  // Perform setup. Note that because the subsidiary
1973  // preconditioner is a block preconditioner itself it is given
1974  // the pointer to the "full" matrix
1975  block_prec_pt->setup(this->matrix_pt());
1976  }
1977 
1978 
1979  // Second one:
1980  {
1981  UpperTriangular<CRDoubleMatrix>* block_prec_pt=
1982  new UpperTriangular<CRDoubleMatrix>;
1984 
1985  // Set mesh
1986  block_prec_pt->set_multi_poisson_mesh(Multi_poisson_mesh_pt);
1987 
1988  // Turn it into a subsidiary preconditioner, declaring which
1989  // of the three dof types in the present (master) preconditioner
1990  // correspond to the dof types in the subsidiary block preconditioner i.e.
1991  // arguments: dof_map[doc_in_subsidiary]=dof_in_present
1992  unsigned n_sub_dof_types=1;
1993  Vector<unsigned> dof_map(n_sub_dof_types);
1994  dof_map[0] = 2;
1995  block_prec_pt->turn_into_subsidiary_block_preconditioner(this,dof_map);
1996 
1997  // Perform setup. Note that because the subsidiary
1998  // preconditioner is a block preconditioner itself it is given
1999  // the pointer to the "full" matrix
2000  block_prec_pt->setup(this->matrix_pt());
2001  }
2002 
2003 
2004  // Set up off diagonal matrix vector product operator.
2005  {
2006  // Get the block
2007  CRDoubleMatrix block_matrix = this->get_block(0,1);
2008 
2009  // Create matrix vector product operator
2010  Off_diagonal_matrix_vector_product_pt = new MatrixVectorProduct;
2011 
2012  // Setup: Final argument indicates block column in the present
2013  // block preconditioner (which views the system matrix as comprising
2014  // 2x2 blocks).
2015  unsigned block_column_index=1;
2017  Off_diagonal_matrix_vector_product_pt,&block_matrix,block_column_index);
2018 
2019  // Extracted block can now go out of scope since the
2020  // matrix vector product operators stores what it needs
2021  }
2022 
2023  }
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().

Referenced by oomph::TwoPlusThreeUpperTriangularWithTwoLevelSubsidiary< MATRIX >::setup().

◆ 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:1906
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::TwoPlusOneUpperTriangularPreconditioner< MATRIX >::First_subsidiary_preconditioner_pt
private

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

◆ Multi_poisson_mesh_pt

template<typename MATRIX >
Mesh* oomph::TwoPlusOneUpperTriangularPreconditioner< MATRIX >::Multi_poisson_mesh_pt
private

◆ Off_diagonal_matrix_vector_product_pt

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

Matrix vector product operators for the off diagonals.

◆ Second_subsidiary_preconditioner_pt

template<typename MATRIX >
Preconditioner* oomph::TwoPlusOneUpperTriangularPreconditioner< 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: