oomph::CoarseTwoPlusTwoPlusOne< MATRIX > Class Template Reference

#include <multi_poisson_block_preconditioners.h>

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

Public Member Functions

 CoarseTwoPlusTwoPlusOne ()
 Constructor for CoarseTwoPlusTwoPlusOne. More...
 
 ~CoarseTwoPlusTwoPlusOne ()
 Destructor - delete the diagonal solvers (subsidiary preconditioners) More...
 
virtual void clean_up_my_memory ()
 clean up the memory More...
 
 CoarseTwoPlusTwoPlusOne (const CoarseTwoPlusTwoPlusOne &)
 Broken copy constructor. More...
 
void operator= (const CoarseTwoPlusTwoPlusOne &)
 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...
 
virtual 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...
 
- 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
 
DenseMatrix< CRDoubleMatrix * > Replacement_matrix_pt
 
MatrixVectorProductOff_diagonal_matrix_vector_product_pt
 Matrix vector product operator. 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::CoarseTwoPlusTwoPlusOne< MATRIX >

///////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////// Block diagonal preconditioner for system with 5 dof types assembled into a 2x2 block system, with the (0,0) block containing the first two dof types, the (1,1) block containing the three remaining ones.

Constructor & Destructor Documentation

◆ CoarseTwoPlusTwoPlusOne() [1/2]

template<typename MATRIX >
oomph::CoarseTwoPlusTwoPlusOne< MATRIX >::CoarseTwoPlusTwoPlusOne ( )
inline

Constructor for CoarseTwoPlusTwoPlusOne.

2813  :
2814  BlockPreconditioner<MATRIX>(),
2818  {
2820  } // end_of_constructor
Mesh * Multi_poisson_mesh_pt
Definition: multi_poisson_block_preconditioners.h:2878
Preconditioner * First_subsidiary_preconditioner_pt
Definition: multi_poisson_block_preconditioners.h:2864
Preconditioner * Second_subsidiary_preconditioner_pt
Definition: multi_poisson_block_preconditioners.h:2868
MatrixVectorProduct * Off_diagonal_matrix_vector_product_pt
Matrix vector product operator.
Definition: multi_poisson_block_preconditioners.h:2874

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

◆ ~CoarseTwoPlusTwoPlusOne()

template<typename MATRIX >
oomph::CoarseTwoPlusTwoPlusOne< MATRIX >::~CoarseTwoPlusTwoPlusOne ( )
inline

Destructor - delete the diagonal solvers (subsidiary preconditioners)

2825  {
2826  this->clean_up_my_memory();
2827  }
virtual void clean_up_my_memory()
clean up the memory
Definition: multi_poisson_block_preconditioners.h:3135

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

◆ CoarseTwoPlusTwoPlusOne() [2/2]

template<typename MATRIX >
oomph::CoarseTwoPlusTwoPlusOne< MATRIX >::CoarseTwoPlusTwoPlusOne ( const CoarseTwoPlusTwoPlusOne< MATRIX > &  )
inline

Broken copy constructor.

2835  {
2837  "CoarseTwoPlusTwoPlusOne");
2838  }
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::CoarseTwoPlusTwoPlusOne< MATRIX >::clean_up_my_memory
virtual

clean up the memory

The clean up function.

3136  {
3137  // Delete diagonal preconditioners (approximate solvers)
3139  {
3142  }
3144  {
3147  }
3148 
3149  // Clean up the replacement matricies.
3150  for(unsigned i=0,ni=Replacement_matrix_pt.nrow();i<ni;i++)
3151  {
3152  for(unsigned j=0,nj=Replacement_matrix_pt.ncol();j<nj;j++)
3153  {
3154  if(Replacement_matrix_pt(i,j)!=0)
3155  {
3156  delete Replacement_matrix_pt(i,j);
3158  }
3159  } // End loop over j.
3160  } // End loop over i.
3161 
3162  // Kill matrix vector product
3164  {
3167  }
3168 
3169  } // End of clean_up_my_memory function.
int i
Definition: BiCGSTAB_step_by_step.cpp:9
DenseMatrix< CRDoubleMatrix * > Replacement_matrix_pt
Definition: multi_poisson_block_preconditioners.h:2871
std::ptrdiff_t j
Definition: tut_arithmetic_redux_minmax.cpp:2

References i, and j.

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

◆ operator=()

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

Broken assignment operator.

2843  {
2845  "CoarseTwoPlusTwoPlusOne");
2846  }
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::CoarseTwoPlusTwoPlusOne< MATRIX >::preconditioner_solve ( const DoubleVector r,
DoubleVector z 
)
virtual

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

Preconditioner solve: Apply preconditioner to r and return z, so that P z = r, where P is the block diagonal matrix constructed from the original linear system.

Implements oomph::Preconditioner.

3090  {
3091  // Now apply the subsidiary block preconditioner that acts on the
3092  // "bottom right" 3x3 sub-system (only!). The subsidiary preconditioner
3093  // will extract the relevant (3x1) "sub-vectors" from the "big" (5x1)
3094  // vector big_r and treat it as the rhs, r, of P z = r
3095  // where P is 3x3 block diagonal.
3097 
3098  // Get the entries from r corresponding to matrix block 0.
3099  DoubleVector r_0;
3100  this->get_block_vector(0,r,r_0);
3101 
3102  // Get the entries from z corresponding to matrix block 0.
3103  DoubleVector z_1;
3104  this->get_block_vector(1,z,z_1);
3105 
3106  // Multiply by off diagonal block and subtract from RHS.
3107  DoubleVector temp;
3109  r_0 -= temp;
3110 
3111  // Block solve for first diagonal block. Since the associated subsidiary
3112  // preconditioner is a block preconditioner itself, it will extract
3113  // the required (2x1) block rhs from a "big" (5x1) rhs vector, big_r.
3114  // Therefore we first put the actual (2x1) rhs vector block_r_0 into the
3115  // "big" (5x1) vector big_r.
3116  DoubleVector big_r(z.distribution_pt());
3117 
3118  this->return_block_vector(0,r_0,big_r);
3119 
3120  // Now apply the subsidiary block preconditioner that acts on the
3121  // "top left" 2x2 sub-system (only!). The subsidiary preconditioner
3122  // will extract the relevant (2x1) "sub-vectors" from the "big" (5x1)
3123  // vector big_r and treat it as the rhs, r, of P z = r
3124  // where P is 2x2 block diagonal. Once the system is solved,
3125  // the result is automatically put back into the appropriate places
3126  // of the "big" (5x1) vector z:
3128  }// End of solve
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::CoarseTwoPlusTwoPlusOne< MATRIX >::set_multi_poisson_mesh ( Mesh multi_poisson_mesh_pt)
inline

Specify the mesh that contains multi-poisson elements.

2856  {
2857  Multi_poisson_mesh_pt=multi_poisson_mesh_pt;
2858  }

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

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

◆ setup()

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

Setup the preconditioner.

The setup function.

Implements oomph::Preconditioner.

2886  {
2887  // Clean up memory
2888  this->clean_up_my_memory();
2889 
2890 #ifdef PARANOID
2891  if (Multi_poisson_mesh_pt == 0)
2892  {
2893  std::stringstream err;
2894  err << "Please set pointer to mesh using set_multi_poisson_mesh(...).\n";
2895  throw OomphLibError(err.str(),
2898  }
2899 #endif
2900 
2901  // The preconditioner works with one mesh; set it!
2902  this->set_nmesh(1);
2904 
2905  // This preconditioner only works for 5 dof types
2906  unsigned n_dof_types = this->ndof_types();
2907 #ifdef PARANOID
2908  if (n_dof_types!=5)
2909  {
2910  std::stringstream tmp;
2911  tmp << "This preconditioner only works for problems with 5 dof types\n"
2912  << "Yours has " << n_dof_types;
2913  throw OomphLibError(tmp.str(),
2916  }
2917 #endif
2918 
2919 
2920  // Call block setup with the Vector [0,0,1,1,1] to:
2921  // Merge DOF types 0 and 1 into block type 0.
2922  // Merge DOF types 2, 3 and 4 into block type 1.
2923  Vector<unsigned> dof_to_block_map(n_dof_types,0);
2924  dof_to_block_map[0] = 0;
2925  dof_to_block_map[1] = 0;
2926  dof_to_block_map[2] = 1;
2927  dof_to_block_map[3] = 1;
2928  dof_to_block_map[4] = 1;
2929  this->block_setup(dof_to_block_map);
2930 
2931 
2932  // Replace all the off-diagonal DOF blocks.
2933  Replacement_matrix_pt.resize(n_dof_types,n_dof_types,0);
2934  for(unsigned i=0;i<n_dof_types;i++)
2935  {
2936  for(unsigned j=0;j<n_dof_types;j++)
2937  {
2938  if(i!=j)
2939  {
2940  // Get the DOF block's (row!) distribution.
2941  LinearAlgebraDistribution* dof_block_dist_pt=
2943 
2944  // Number of rows in DOF block matrix (i,j).
2945  const unsigned long dof_block_nrow = dof_block_dist_pt->nrow_local();
2946 
2947  // Number of columns in block matrix (i,j) is the same as the number
2948  // of rows in block matrix (j,i).
2949  // We use the actual nrow, not the local one here as this block may
2950  // need to be gotten from another processor.
2951  const unsigned long dof_block_ncol
2952  = this->dof_block_distribution_pt(j)->nrow();
2953 
2954  // Storage for replacement matrices:
2955  // Values
2956  Vector<double> replacement_value(0);
2957  // Column index
2958  Vector<int> replacement_column_index(0);
2959  // Row start
2960  Vector<int> replacement_row_start;
2961 
2962  // Need one row start per row, and one for the nnz, all of which are 0.
2963  replacement_row_start.resize(dof_block_nrow+1,0);
2964 
2966  new CRDoubleMatrix(dof_block_dist_pt, dof_block_ncol,
2967  replacement_value,
2968  replacement_column_index, replacement_row_start);
2969 
2970  // Replace.
2972 
2973  }// End of if
2974  }// End of j loop.
2975  }// End of i loop.
2976 
2977  // Create the subsidiary preconditioners
2978  //--------------------------------------
2979  {
2980  // First subsidiary precond is a block diagonal preconditioner itself.
2981  UpperTriangular<CRDoubleMatrix>* block_prec_pt=
2982  new UpperTriangular<CRDoubleMatrix>;
2983  First_subsidiary_preconditioner_pt=block_prec_pt;
2984 
2985  // Set mesh
2986  block_prec_pt->set_multi_poisson_mesh(Multi_poisson_mesh_pt);
2987 
2988  // Turn first_sub into a subsidiary preconditioner, declaring which
2989  // of the five dof types in the present (master) preconditioner
2990  // correspond to the dof types in the subsidiary block preconditioner
2991  const unsigned n_sub_dof_types=2;
2992  Vector<unsigned> dof_map(n_sub_dof_types);
2993  dof_map[0]=0;
2994  dof_map[1]=1;
2995  block_prec_pt->turn_into_subsidiary_block_preconditioner(this,dof_map);
2996 
2997  // Perform setup. Note that because the subsidiary
2998  // preconditioner is a block preconditioner itself it is given
2999  // the pointer to the "full" matrix
3000  block_prec_pt->setup(this->matrix_pt());
3001  }
3002 
3003  // Second subsidiary preconditioner is also a block preconditioner
3004  {
3005  SimpleTwoDofOnly<CRDoubleMatrix>* block_prec_pt=
3006  new SimpleTwoDofOnly<CRDoubleMatrix>;
3008 
3009  // Set mesh
3010  block_prec_pt->set_multi_poisson_mesh(Multi_poisson_mesh_pt);
3011 
3012  // This is the usual mapping between the subsidiary and master dof types.
3013  Vector<unsigned> dof_map(3);
3014  dof_map[0]=2;
3015  dof_map[1]=3;
3016  dof_map[2]=4;
3017 
3018  // The subsidiary block preconditioner SimpleTwoDofOnly accepts only two
3019  // dof types. We therefore have to "coarsen" the 3 dof types into two
3020  // by specifying the vector of vectors doftype_coarsening whose
3021  // entries are to be interpreted as
3022  //
3023  // doftype_coarsening[coarsened_dof_type][i]=dof_type
3024  //
3025  // where i ranges from 0 to the number of dof types (minus one, because
3026  // of the zero-based indexing...) that are to be
3027  // combined/coarsened into dof type dof_type_in_coarsed_block_preconditioner
3028 
3029 
3030  // Number of dof types the subsidiary block preconditioner expects.
3031  const unsigned n_sub_dof_types=2;
3032  Vector<Vector<unsigned> > doftype_coarsening(n_sub_dof_types);
3033 
3034  // Subsidiary dof type 0 contains 2 dof types.
3035  doftype_coarsening[0].resize(2);
3036 
3037  // Coarsen subsidiary dof types 0 and 1 into subsidiary dof type 0.
3038  doftype_coarsening[0][0]=0;
3039  doftype_coarsening[0][1]=1;
3040 
3041  // Subsidiary dof type 1 contains 1 dof types.
3042  doftype_coarsening[1].resize(1);
3043 
3044  // Subsidiary Dof type 1 contains subsidiary dof type 2.
3045  doftype_coarsening[1][0]=2;
3046 
3047  // Turn into subdiary preconditioner
3048  block_prec_pt->
3050  doftype_coarsening);
3051 
3052  // Perform setup. Note that because the subsidiary
3053  // preconditioner is a block preconditioner itself it is given
3054  // the pointer to the "full" matrix
3055  block_prec_pt->setup(this->matrix_pt());
3056  }
3057 
3058 
3059  // Set up off diagonal matrix vector product
3060  {
3061  // Get the off diagonal block.
3062  CRDoubleMatrix block_matrix = this->get_block(0,1);
3063 
3064  // Create matrix vector product operator
3065  Off_diagonal_matrix_vector_product_pt = new MatrixVectorProduct;
3066 
3067  // Setup: Final argument indicates block column in the present
3068  // block preconditioner (which views the system matrix as comprising
3069  // 2x2 blocks).
3070  unsigned block_column_index=1;
3072  Off_diagonal_matrix_vector_product_pt,&block_matrix,block_column_index);
3073 
3074  // extracted block can now go out of scope; the matrix vector product
3075  // retains its own (deep) copy.
3076  }
3077 
3078  }// End of setup
LinearAlgebraDistribution * dof_block_distribution_pt(const unsigned &b)
Access function to the dof-level block distributions.
Definition: block_preconditioner.h:1962
void get_block(const unsigned &i, const unsigned &j, MATRIX &output_matrix, const bool &ignore_replacement_block=false) const
Definition: block_preconditioner.h:673
void set_replacement_dof_block(const unsigned &block_i, const unsigned &block_j, CRDoubleMatrix *replacement_dof_block_pt)
Definition: block_preconditioner.h:2911
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 turn_into_subsidiary_block_preconditioner(BlockPreconditioner< MATRIX > *master_block_prec_pt, const Vector< unsigned > &doftype_in_master_preconditioner_coarse)
Definition: block_preconditioner.cc:2376
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
unsigned nrow() const
access function to the number of global rows.
Definition: linear_algebra_distribution.h:186
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 i, j, oomph::LinearAlgebraDistribution::nrow_local(), OOMPH_CURRENT_FUNCTION, OOMPH_EXCEPTION_LOCATION, oomph::SimpleTwoDofOnly< MATRIX >::set_multi_poisson_mesh(), oomph::UpperTriangular< MATRIX >::set_multi_poisson_mesh(), oomph::SimpleTwoDofOnly< MATRIX >::setup(), oomph::UpperTriangular< MATRIX >::setup(), tmp, and oomph::BlockPreconditioner< MATRIX >::turn_into_subsidiary_block_preconditioner().

Member Data Documentation

◆ First_subsidiary_preconditioner_pt

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

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

◆ Multi_poisson_mesh_pt

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

Pointer to mesh with preconditionable elements used for classification of dof types.

Referenced by oomph::CoarseTwoPlusTwoPlusOne< MATRIX >::CoarseTwoPlusTwoPlusOne(), and oomph::CoarseTwoPlusTwoPlusOne< MATRIX >::set_multi_poisson_mesh().

◆ Off_diagonal_matrix_vector_product_pt

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

Matrix vector product operator.

◆ Replacement_matrix_pt

template<typename MATRIX >
DenseMatrix<CRDoubleMatrix*> oomph::CoarseTwoPlusTwoPlusOne< MATRIX >::Replacement_matrix_pt
private

◆ Second_subsidiary_preconditioner_pt

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