oomph::InexactSubBiharmonicPreconditioner Class Reference

#include <biharmonic_preconditioner.h>

+ Inheritance diagram for oomph::InexactSubBiharmonicPreconditioner:

Public Member Functions

 InexactSubBiharmonicPreconditioner (BiharmonicPreconditioner *master_prec_pt, const bool use_amg)
 
 ~InexactSubBiharmonicPreconditioner ()
 destructor - just calls this->clean_up_memory() More...
 
void clean_up_memory ()
 clean the memory More...
 
 InexactSubBiharmonicPreconditioner (const InexactSubBiharmonicPreconditioner &)=delete
 Broken copy constructor. More...
 
void operator= (const InexactSubBiharmonicPreconditioner &)=delete
 Broken assignment operator. More...
 
void setup ()
 Setup the preconditioner. More...
 
void preconditioner_solve (const DoubleVector &r, DoubleVector &z)
 Apply preconditioner to r. More...
 
void compute_inexact_schur_complement ()
 
- Public Member Functions inherited from oomph::BlockPreconditioner< CRDoubleMatrix >
 BlockPreconditioner ()
 Constructor. More...
 
 BlockPreconditioner (const BlockPreconditioner &)=delete
 Broken copy constructor. More...
 
virtual ~BlockPreconditioner ()
 Destructor. More...
 
void operator= (const BlockPreconditioner &)=delete
 Broken assignment operator. More...
 
CRDoubleMatrixmatrix_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< CRDoubleMatrix > *master_block_prec_pt, const Vector< unsigned > &doftype_in_master_preconditioner_coarse)
 
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)
 
virtual void block_setup ()
 
void block_setup (const Vector< unsigned > &dof_to_block_map)
 
void get_block (const unsigned &i, const unsigned &j, CRDoubleMatrix &output_matrix, const bool &ignore_replacement_block=false) const
 
CRDoubleMatrix get_block (const unsigned &i, const unsigned &j, const bool &ignore_replacement_block=false) const
 
void set_master_matrix_pt (CRDoubleMatrix *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, CRDoubleMatrix *in_matrix_pt, CRDoubleMatrix &output_matrix)
 
void get_blocks (DenseMatrix< bool > &required_blocks, DenseMatrix< CRDoubleMatrix * > &block_matrix_pt) const
 
void get_dof_level_block (const unsigned &i, const unsigned &j, CRDoubleMatrix &output_block, const bool &ignore_replacement_block=false) const
 
void get_dof_level_block (const unsigned &block_i, const unsigned &block_j, CRDoubleMatrix &output_block, const bool &ignore_replacement_block) const
 
CRDoubleMatrix 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< CRDoubleMatrix > * 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, CRDoubleMatrix &output_block) const
 
void internal_get_block (const unsigned &block_i, const unsigned &block_j, CRDoubleMatrix &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 CRDoubleMatrix *block_matrix_pt) const
 
int get_index_of_value (const Vector< myType > &vec, const myType val, const bool sorted=false) 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 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)
 

Public Attributes

PreconditionerS_00_preconditioner_pt
 Pointer to the S00 Schur Complement preconditioner. More...
 
MatrixBasedLumpedPreconditioner< CRDoubleMatrix > * Lumped_J_11_preconditioner_pt
 Preconditioner for storing the lumped J_11 matrix. More...
 
MatrixBasedLumpedPreconditioner< CRDoubleMatrix > * Lumped_J_22_preconditioner_pt
 Preconditioner for storing the lumped J_22 matrix. More...
 
DenseMatrix< CRDoubleMatrix * > Matrix_of_block_pointers
 
CRDoubleMatrixS_00_pt
 
unsigned Use_amg
 

Additional Inherited Members

- Protected Member Functions inherited from oomph::BlockPreconditioner< CRDoubleMatrix >
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< CRDoubleMatrix >
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

SubBiharmonic Preconditioner - an inexact preconditioner for the 3x3 top left hand corner sub block matrix. Used as part of the BiharmonicPreconditioner<MATRIX>

Constructor & Destructor Documentation

◆ InexactSubBiharmonicPreconditioner() [1/2]

oomph::InexactSubBiharmonicPreconditioner::InexactSubBiharmonicPreconditioner ( BiharmonicPreconditioner master_prec_pt,
const bool  use_amg 
)
inline

Constructor for the inexact block preconditioner.
This a helper class for BiharmonicPreconditioner and cannot be used as a standalone preconditioner.
master_prec_pt is the pointer to the master BiharmonicPreconditioner.

261  {
262  // Block mapping for ExactSubBiharmonicPreconditioner
263  Vector<unsigned> block_lookup(3);
264  block_lookup[0] = 0;
265  block_lookup[1] = 1;
266  block_lookup[2] = 2;
267 
268  // set as subsidiary block preconditioner
269  this->turn_into_subsidiary_block_preconditioner(master_prec_pt,
270  block_lookup);
271 
272  // zero all the preconditioner pt
276 
277  // store the preconditioner type
278  Use_amg = use_amg;
279  }
void turn_into_subsidiary_block_preconditioner(BlockPreconditioner< CRDoubleMatrix > *master_block_prec_pt, const Vector< unsigned > &doftype_in_master_preconditioner_coarse)
Definition: block_preconditioner.cc:2376
Preconditioner * S_00_preconditioner_pt
Pointer to the S00 Schur Complement preconditioner.
Definition: biharmonic_preconditioner.h:338
unsigned Use_amg
Definition: biharmonic_preconditioner.h:356
MatrixBasedLumpedPreconditioner< CRDoubleMatrix > * Lumped_J_22_preconditioner_pt
Preconditioner for storing the lumped J_22 matrix.
Definition: biharmonic_preconditioner.h:346
MatrixBasedLumpedPreconditioner< CRDoubleMatrix > * Lumped_J_11_preconditioner_pt
Preconditioner for storing the lumped J_11 matrix.
Definition: biharmonic_preconditioner.h:342

References Lumped_J_11_preconditioner_pt, Lumped_J_22_preconditioner_pt, S_00_preconditioner_pt, oomph::BlockPreconditioner< CRDoubleMatrix >::turn_into_subsidiary_block_preconditioner(), and Use_amg.

◆ ~InexactSubBiharmonicPreconditioner()

oomph::InexactSubBiharmonicPreconditioner::~InexactSubBiharmonicPreconditioner ( )
inline

destructor - just calls this->clean_up_memory()

283  {
284  this->clean_up_memory();
285  }
void clean_up_memory()
clean the memory
Definition: biharmonic_preconditioner.h:288

References clean_up_memory().

◆ InexactSubBiharmonicPreconditioner() [2/2]

oomph::InexactSubBiharmonicPreconditioner::InexactSubBiharmonicPreconditioner ( const InexactSubBiharmonicPreconditioner )
delete

Broken copy constructor.

Member Function Documentation

◆ clean_up_memory()

void oomph::InexactSubBiharmonicPreconditioner::clean_up_memory ( )
inlinevirtual

clean the memory

Reimplemented from oomph::Preconditioner.

289  {
290  // delete the sub preconditioner pt
291  delete S_00_preconditioner_pt;
293 
294  // delete the lumped preconditioners
299 
300  // Number of block types
301  unsigned n = Matrix_of_block_pointers.nrow();
302 
303  // delete the block matrices
304  for (unsigned i = 0; i < n; i++)
305  {
306  for (unsigned j = 0; j < n; j++)
307  {
308  if (Matrix_of_block_pointers(i, j) != 0)
309  {
310  delete Matrix_of_block_pointers(i, j);
312  }
313  }
314  }
315  }
int i
Definition: BiCGSTAB_step_by_step.cpp:9
const unsigned n
Definition: CG3DPackingUnitTest.cpp:11
DenseMatrix< CRDoubleMatrix * > Matrix_of_block_pointers
Definition: biharmonic_preconditioner.h:349
std::ptrdiff_t j
Definition: tut_arithmetic_redux_minmax.cpp:2

References i, j, Lumped_J_11_preconditioner_pt, Lumped_J_22_preconditioner_pt, Matrix_of_block_pointers, n, and S_00_preconditioner_pt.

Referenced by setup(), and ~InexactSubBiharmonicPreconditioner().

◆ compute_inexact_schur_complement()

void oomph::InexactSubBiharmonicPreconditioner::compute_inexact_schur_complement ( )

Computes the inexact schur complement of the block J_00 using lumping as an approximate inverse of block J_11 and J_22 (where possible)

computes the schur complement for the inexact sub biharmonic preconditioner

447  {
448  // if required get pointers to the vector components of J01 and J10
449  int* J_01_row_start = 0;
450  int* J_01_column_index = 0;
451  double* J_01_value = 0;
452  int* J_10_row_start = 0;
453  int* J_10_column_index = 0;
454 
455  // J_01 matrix
456  J_01_row_start = Matrix_of_block_pointers(0, 1)->row_start();
457  J_01_column_index = Matrix_of_block_pointers(0, 1)->column_index();
458  J_01_value = Matrix_of_block_pointers(0, 1)->value();
459 
460  // J_10 matrix
461  J_10_row_start = Matrix_of_block_pointers(1, 0)->row_start();
462  J_10_column_index = Matrix_of_block_pointers(1, 0)->column_index();
463 
464  // if required get pointers to the vector components of J01 and J10
465  int* J_02_row_start = 0;
466  int* J_02_column_index = 0;
467  double* J_02_value = 0;
468  int* J_20_row_start = 0;
469  int* J_20_column_index = 0;
470 
471  // J_02 matrix
472  J_02_row_start = Matrix_of_block_pointers(0, 2)->row_start();
473  J_02_column_index = Matrix_of_block_pointers(0, 2)->column_index();
474  J_02_value = Matrix_of_block_pointers(0, 2)->value();
475 
476  // J_20 matrix
477  J_20_row_start = Matrix_of_block_pointers(2, 0)->row_start();
478  J_20_column_index = Matrix_of_block_pointers(2, 0)->column_index();
479 
480  // get the inverse lumped vector of J_11 if required
481  double* J_11_lumped_and_inverted = 0;
482  J_11_lumped_and_inverted =
483  Lumped_J_11_preconditioner_pt->inverse_lumped_vector_pt();
484 
485  // get the inverse lumped vector of J_22 if required
486  double* J_22_lumped_and_inverted = 0;
487  J_22_lumped_and_inverted =
488  Lumped_J_22_preconditioner_pt->inverse_lumped_vector_pt();
489 
490  // size of J00 matrix (and S00 matrix)
491  unsigned J_00_nrow = Matrix_of_block_pointers(0, 0)->nrow();
492 
493  // vectors for the schur complement
494  Vector<int> S_00_row_start(J_00_nrow + 1);
495  Vector<int> S_00_column_index;
496  Vector<double> S_00_value;
497 
498  // number of elements in the x-dimension of the mesh
499  unsigned n_element_x =
500  dynamic_cast<HermiteQuadMesh<Hijacked<BiharmonicElement<2>>>*>(
501  dynamic_cast<BiharmonicPreconditioner*>(
503  ->bulk_element_mesh_pt())
504  ->nelement_in_dim(0);
505 
506  // nnz in schur complement (initialised to zero)
507  unsigned S_00_nnz = 0;
508 
509  // loop over columns of schur complement matrix
510  for (unsigned i = 0; i < J_00_nrow; i++)
511  {
512  // set column_start
513  S_00_row_start[i] = S_00_nnz;
514 
515  // loop over rows in schur complement matrix
516  // the schur complement matrix has 5 well defined bands thus we only
517  // perform matrix-matrix multiplication for these bands
518  //
519  // where the diagonal band is 0 :
520  //
521  // band 1 : -2*n_element_x +/- 5
522  // 2 : -n_element_x +/- 3
523  // 3 : 0 +/- 3
524  // 4 : n_element_x +/- 3
525  // 5 : 2*n_element_x +/- 5
526  //
527  // regardless of the type or combination of boundary conditions applied
528 
529  // Vector for postion of the bands in S_00
530  Vector<std::pair<int, int>> band_position(5);
531 
532  // compute the minimum and maximum positions of each band in terms of
533  // row number for column j
534  // note : static_cast used because max and min don't work on unsigned
535  band_position[0].first =
536  std::max(0, static_cast<int>(i - n_element_x * 2 - 5));
537  band_position[0].second =
538  std::max(0,
539  std::min(static_cast<int>(J_00_nrow - 1),
540  static_cast<int>(i - n_element_x * 2 + 5)));
541  band_position[1].first =
542  std::max(band_position[0].second + 1,
543  std::max(0, static_cast<int>(i - n_element_x - 3)));
544  band_position[1].second =
545  std::max(0,
546  std::min(static_cast<int>(J_00_nrow - 1),
547  static_cast<int>(i - n_element_x + 3)));
548  band_position[2].first = std::max(band_position[1].second + 1,
549  std::max(0, static_cast<int>(i - 3)));
550  band_position[2].second = std::max(
551  0, std::min(static_cast<int>(J_00_nrow - 1), static_cast<int>(i + 3)));
552  band_position[3].first =
553  std::max(band_position[2].second + 1,
554  std::max(0, static_cast<int>(i + n_element_x - 3)));
555  band_position[3].second =
556  std::max(0,
557  std::min(static_cast<int>(J_00_nrow - 1),
558  static_cast<int>(i + n_element_x + 3)));
559  band_position[4].first =
560  std::max(band_position[3].second + 1,
561  std::max(0, static_cast<int>(i + n_element_x * 2 - 5)));
562  band_position[4].second =
563  std::max(0,
564  std::min(static_cast<int>(J_00_nrow - 1),
565  static_cast<int>(i + n_element_x * 2 + 5)));
566 
567  // number of bands
568  unsigned n_band = 5;
569 
570  // loop over the bands
571  for (unsigned b = 0; b < n_band; b++)
572  {
573  // loop over the rows in band b
574  for (unsigned j = static_cast<unsigned>(band_position[b].first);
575  j <= static_cast<unsigned>(band_position[b].second);
576  j++)
577  {
578  ;
579 
580  // temporary value for the computation of S00(i,j)
581  double temp_value = Matrix_of_block_pointers(0, 0)->operator()(i, j);
582 
583  // iterate through non-zero entries of column j of A_10
584  for (int k = J_01_row_start[i]; k < J_01_row_start[i + 1]; k++)
585  {
586  if (J_10_column_index[J_10_row_start[J_01_column_index[k]]] <=
587  static_cast<int>(j) &&
588  static_cast<int>(j) <=
589  J_10_column_index[J_10_row_start[J_01_column_index[k] + 1] -
590  1])
591  {
592  temp_value -= J_01_value[k] *
593  Matrix_of_block_pointers(1, 0)->operator()(
594  J_01_column_index[k], j) *
595  J_11_lumped_and_inverted[J_01_column_index[k]];
596  }
597  }
598 
599  // next compute contribution for A_02*lumped(A_22)'*A_20
600 
601  // iterate through non-zero entries of column j of A_10
602  for (int k = J_02_row_start[i]; k < J_02_row_start[i + 1]; k++)
603  {
604  if (J_20_column_index[J_20_row_start[J_02_column_index[k]]] <=
605  static_cast<int>(j) &&
606  static_cast<int>(j) <=
607  J_20_column_index[J_20_row_start[J_02_column_index[k] + 1] -
608  1])
609  {
610  temp_value -= J_02_value[k] *
611  Matrix_of_block_pointers(2, 0)->operator()(
612  J_02_column_index[k], j) *
613  J_22_lumped_and_inverted[J_02_column_index[k]];
614  }
615  }
616 
617  // add element to schur complement matrix S00
618  if (temp_value != 0.0)
619  {
620  S_00_nnz++;
621  S_00_value.push_back(temp_value);
622  S_00_column_index.push_back(j);
623  }
624  }
625  }
626  }
627 
628  // last entry of s00 column start
629  S_00_row_start[J_00_nrow] = S_00_nnz;
630 
631  // build the schur complement S00
632  S_00_pt = new CRDoubleMatrix(this->block_distribution_pt(0),
633  J_00_nrow,
634  S_00_value,
635  S_00_column_index,
636  S_00_row_start);
637 
638  // replace block J01 with J01*lumped(J11)' (if J11 can be lumped)
639  unsigned J_01_nnz = Matrix_of_block_pointers(0, 1)->nnz();
640  for (unsigned i = 0; i < J_01_nnz; i++)
641  {
642  J_01_value[i] *= J_11_lumped_and_inverted[J_01_column_index[i]];
643  }
644 
645  // replace block J_02 with J_02*lumped(J_22)' (if J22 can be lumped)
646  unsigned J_02_nnz = Matrix_of_block_pointers(0, 2)->nnz();
647  for (unsigned i = 0; i < J_02_nnz; i++)
648  {
649  J_02_value[i] *= J_22_lumped_and_inverted[J_02_column_index[i]];
650  }
651  }
Scalar * b
Definition: benchVecAdd.cpp:17
const LinearAlgebraDistribution * block_distribution_pt(const unsigned &b) const
Access function to the block distributions (const version).
Definition: block_preconditioner.h:1903
BlockPreconditioner< CRDoubleMatrix > * master_block_preconditioner_pt() const
Access function to the master block preconditioner pt.
Definition: block_preconditioner.h:2141
CRDoubleMatrix * S_00_pt
Definition: biharmonic_preconditioner.h:352
#define min(a, b)
Definition: datatypes.h:22
#define max(a, b)
Definition: datatypes.h:23
char char char int int * k
Definition: level2_impl.h:374

References b, oomph::BlockPreconditioner< CRDoubleMatrix >::block_distribution_pt(), i, j, k, Lumped_J_11_preconditioner_pt, Lumped_J_22_preconditioner_pt, oomph::BlockPreconditioner< CRDoubleMatrix >::master_block_preconditioner_pt(), Matrix_of_block_pointers, max, min, and S_00_pt.

Referenced by setup().

◆ operator=()

void oomph::InexactSubBiharmonicPreconditioner::operator= ( const InexactSubBiharmonicPreconditioner )
delete

Broken assignment operator.

◆ preconditioner_solve()

void oomph::InexactSubBiharmonicPreconditioner::preconditioner_solve ( const DoubleVector r,
DoubleVector z 
)
virtual

Apply preconditioner to r.

preconditioner solve for the inexact sub biharmonic preconditioner

Implements oomph::Preconditioner.

659  {
660  // get the block vectors
661  Vector<DoubleVector> block_r(3);
662  get_block_vectors(r, block_r);
663 
664  // r_0 = r_0 - J_01 * lumped(J_11)'*r_1 - J_02 * lumped(J_22)'*r_2
665  // Remember that J_01 has already been premultiplied by lumped(J_11)
666  DoubleVector temp;
667  Matrix_of_block_pointers(0, 1)->multiply(block_r[1], temp);
668  block_r[0] -= temp;
669  temp.clear();
670  Matrix_of_block_pointers(0, 2)->multiply(block_r[2], temp);
671  block_r[0] -= temp;
672 
673  // apply the inexact preconditioner
674  temp.clear();
675  S_00_preconditioner_pt->preconditioner_solve(block_r[0], temp);
676  return_block_vector(0, temp, z);
677 
678  // solve: lumped(J_11) x_1 = r_1 - J_10 x_0 for x_1
679  // remember temp contains r_0 (...or z_0)
680  DoubleVector temp2;
681  Matrix_of_block_pointers(1, 0)->multiply(temp, temp2);
682  block_r[1] -= temp2;
683  DoubleVector z_1;
684  Lumped_J_11_preconditioner_pt->preconditioner_solve(block_r[1], z_1);
685  return_block_vector(1, z_1, z);
686 
687  // solve: lumped(J_22) x_2 = r_2 - J_20 x_0 for x_2
688  // remember temp contains r_0 (...or z_0)
689  temp2.clear();
690  Matrix_of_block_pointers(2, 0)->multiply(temp, temp2);
691  block_r[2] -= temp2;
692  DoubleVector z_2;
693  Lumped_J_22_preconditioner_pt->preconditioner_solve(block_r[2], z_2);
694  return_block_vector(2, z_2, z);
695  }
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_vectors(const Vector< unsigned > &block_vec_number, const DoubleVector &v, Vector< DoubleVector > &s) const
Definition: block_preconditioner.cc:2939
virtual void preconditioner_solve(const DoubleVector &r, DoubleVector &z)=0
r
Definition: UniformPSDSelfTest.py:20

References oomph::DoubleVector::clear(), oomph::BlockPreconditioner< CRDoubleMatrix >::get_block_vectors(), Lumped_J_11_preconditioner_pt, Lumped_J_22_preconditioner_pt, Matrix_of_block_pointers, oomph::Preconditioner::preconditioner_solve(), UniformPSDSelfTest::r, oomph::BlockPreconditioner< CRDoubleMatrix >::return_block_vector(), and S_00_preconditioner_pt.

◆ setup()

void oomph::InexactSubBiharmonicPreconditioner::setup ( )
virtual

Setup the preconditioner.

setup for the inexact sub biharmonic preconditioner

Implements oomph::Preconditioner.

357  {
358  // clean up memory first
359  this->clean_up_memory();
360 
361  // setup
362  this->block_setup();
363 
364  // Number of block types
365  unsigned n_block_types = this->nblock_types();
366 
367  // paranoid check for number of blocks
368 #ifdef PARANOID
369  if (n_block_types != 3)
370  {
371  std::ostringstream error_message;
372  error_message
373  << "This preconditioner requires 3 block types.\n"
374  << "It is sub preconditioner for the BiharmonicPreconditioner.\n";
375  throw OomphLibError(
376  error_message.str(), OOMPH_CURRENT_FUNCTION, OOMPH_EXCEPTION_LOCATION);
377  }
378 #endif
379 
380  // required blocks
381  DenseMatrix<bool> required_blocks(n_block_types, n_block_types, false);
382  required_blocks(0, 0) = true;
383  required_blocks(0, 1) = true;
384  required_blocks(1, 0) = true;
385  required_blocks(1, 1) = true;
386  required_blocks(0, 2) = true;
387  required_blocks(2, 0) = true;
388  required_blocks(2, 2) = true;
389 
390  // Matrix of block matrix pointers
391  Matrix_of_block_pointers.resize(n_block_types, n_block_types, 0);
392 
393  // get the blocks
394  this->get_blocks(required_blocks, Matrix_of_block_pointers);
395 
396  // lump the matrix J_11
398  new MatrixBasedLumpedPreconditioner<CRDoubleMatrix>;
400 
401  delete Matrix_of_block_pointers(1, 1);
402  Matrix_of_block_pointers(1, 1) = 0;
403 
404  // lump the matrix J_22
406  new MatrixBasedLumpedPreconditioner<CRDoubleMatrix>;
408  delete Matrix_of_block_pointers(2, 2);
409  Matrix_of_block_pointers(2, 2) = 0;
410 
411  // compute the schur complement
413 
414  // create the preconditioner for the S00 Schur complement linear system
415  if (Use_amg)
416  {
417 #ifdef OOMPH_HAS_HYPRE
418  // Use Hypre Boomer AMG
419  S_00_preconditioner_pt = new HyprePreconditioner;
421  static_cast<HyprePreconditioner*>(S_00_preconditioner_pt));
422 #else
423  std::ostringstream error_message;
424  error_message << "Request AMG solver but oomph-lib does not have HYPRE";
425  throw OomphLibError(
426  error_message.str(), OOMPH_CURRENT_FUNCTION, OOMPH_EXCEPTION_LOCATION);
427 #endif
428  }
429  else
430  {
431  S_00_preconditioner_pt = new SuperLUPreconditioner;
432  }
433 
434  // setup the preconditioner
436 
437  // clean up
438  delete S_00_pt;
439  S_00_pt = 0;
440  }
void get_blocks(DenseMatrix< bool > &required_blocks, DenseMatrix< CRDoubleMatrix * > &block_matrix_pt) const
Definition: block_preconditioner.cc:2537
unsigned nblock_types() const
Return the number of block types.
Definition: block_preconditioner.h:1670
virtual void block_setup()
Definition: block_preconditioner.cc:2483
void compute_inexact_schur_complement()
Definition: biharmonic_preconditioner.cc:446
void setup(DoubleMatrixBase *matrix_pt)
Definition: preconditioner.h:94
static void set_defaults(double knobs[NKnobs])
set default parameters The use of this routine is optional.
Definition: Eigen_Colamd.h:295
#define OOMPH_EXCEPTION_LOCATION
Definition: oomph_definitions.h:61
#define OOMPH_CURRENT_FUNCTION
Definition: oomph_definitions.h:86

References oomph::BlockPreconditioner< CRDoubleMatrix >::block_setup(), clean_up_memory(), compute_inexact_schur_complement(), oomph::BlockPreconditioner< CRDoubleMatrix >::get_blocks(), Lumped_J_11_preconditioner_pt, Lumped_J_22_preconditioner_pt, Matrix_of_block_pointers, oomph::BlockPreconditioner< CRDoubleMatrix >::nblock_types(), OOMPH_CURRENT_FUNCTION, OOMPH_EXCEPTION_LOCATION, S_00_preconditioner_pt, S_00_pt, internal::Colamd::set_defaults(), oomph::Preconditioner::setup(), and Use_amg.

Member Data Documentation

◆ Lumped_J_11_preconditioner_pt

MatrixBasedLumpedPreconditioner<CRDoubleMatrix>* oomph::InexactSubBiharmonicPreconditioner::Lumped_J_11_preconditioner_pt

Preconditioner for storing the lumped J_11 matrix.

Referenced by clean_up_memory(), compute_inexact_schur_complement(), InexactSubBiharmonicPreconditioner(), preconditioner_solve(), and setup().

◆ Lumped_J_22_preconditioner_pt

MatrixBasedLumpedPreconditioner<CRDoubleMatrix>* oomph::InexactSubBiharmonicPreconditioner::Lumped_J_22_preconditioner_pt

Preconditioner for storing the lumped J_22 matrix.

Referenced by clean_up_memory(), compute_inexact_schur_complement(), InexactSubBiharmonicPreconditioner(), preconditioner_solve(), and setup().

◆ Matrix_of_block_pointers

DenseMatrix<CRDoubleMatrix*> oomph::InexactSubBiharmonicPreconditioner::Matrix_of_block_pointers

◆ S_00_preconditioner_pt

Preconditioner* oomph::InexactSubBiharmonicPreconditioner::S_00_preconditioner_pt

Pointer to the S00 Schur Complement preconditioner.

Referenced by clean_up_memory(), InexactSubBiharmonicPreconditioner(), preconditioner_solve(), and setup().

◆ S_00_pt

CRDoubleMatrix* oomph::InexactSubBiharmonicPreconditioner::S_00_pt

◆ Use_amg

unsigned oomph::InexactSubBiharmonicPreconditioner::Use_amg

booean indicating whether (Hypre BoomerAMG) AMG should be used to solve the S00 subsidiary linear system.

Referenced by InexactSubBiharmonicPreconditioner(), and setup().


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