oomph::BlockTriangularPreconditioner< MATRIX > Class Template Reference

#include <general_purpose_block_preconditioners.h>

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

Public Member Functions

 BlockTriangularPreconditioner ()
 Constructor. (By default this preconditioner is upper triangular). More...
 
virtual ~BlockTriangularPreconditioner ()
 Destructor - delete the preconditioner matrices. More...
 
virtual void clean_up_memory ()
 clean up the memory More...
 
 BlockTriangularPreconditioner (const BlockTriangularPreconditioner &)=delete
 Broken copy constructor. More...
 
void operator= (const BlockTriangularPreconditioner &)=delete
 Broken assignment operator. More...
 
void preconditioner_solve (const DoubleVector &r, DoubleVector &z)
 Apply preconditioner to r. More...
 
void setup ()
 Setup the preconditioner. More...
 
void upper_triangular ()
 Use as an upper triangular preconditioner. More...
 
void lower_triangular ()
 Use as a lower triangular preconditioner. More...
 
- Public Member Functions inherited from oomph::GeneralPurposeBlockPreconditioner< MATRIX >
 GeneralPurposeBlockPreconditioner ()
 constructor More...
 
virtual ~GeneralPurposeBlockPreconditioner ()
 
 GeneralPurposeBlockPreconditioner (const GeneralPurposeBlockPreconditioner &)=delete
 Broken copy constructor. More...
 
void operator= (const GeneralPurposeBlockPreconditioner &)=delete
 Broken assignment operator. More...
 
void set_subsidiary_preconditioner_function (SubsidiaryPreconditionerFctPt sub_prec_fn)
 access function to set the subsidiary preconditioner function. More...
 
void reset_subsidiary_preconditioner_function_to_default ()
 Reset the subsidiary preconditioner function to its default. More...
 
void set_subsidiary_preconditioner_pt (Preconditioner *prec, const unsigned &i)
 
Preconditionersubsidiary_preconditioner_pt (const unsigned &i) const
 
void set_dof_to_block_map (Vector< unsigned > &dof_to_block_map)
 Specify a DOF to block map. More...
 
void add_mesh (const Mesh *mesh_pt, const bool &allow_multiple_element_type_in_mesh=false)
 
unsigned gp_nmesh ()
 
- 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 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

DenseMatrix< MatrixVectorProduct * > Off_diagonal_matrix_vector_products
 Matrix of matrix vector product operators for the off diagonals. More...
 
bool Upper_triangular
 Boolean indicating upper or lower triangular. More...
 

Additional Inherited Members

- Public Types inherited from oomph::GeneralPurposeBlockPreconditioner< MATRIX >
typedef Preconditioner *(* SubsidiaryPreconditionerFctPt) ()
 
- Protected Member Functions inherited from oomph::GeneralPurposeBlockPreconditioner< MATRIX >
void gp_preconditioner_set_all_meshes ()
 Set the mesh in the block preconditioning framework. More...
 
void gp_preconditioner_block_setup ()
 Modified block setup for general purpose block preconditioners. More...
 
void fill_in_subsidiary_preconditioners (const unsigned &nprec_needed)
 
- 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::GeneralPurposeBlockPreconditioner< MATRIX >
Vector< Preconditioner * > Subsidiary_preconditioner_pt
 List of preconditioners to use for the blocks to be solved. More...
 
SubsidiaryPreconditionerFctPt Subsidiary_preconditioner_creation_function_pt
 
- 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::BlockTriangularPreconditioner< MATRIX >

//////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// General purpose block triangular preconditioner By default this is Upper triangular. By default SuperLUPreconditioner (or SuperLUDistPreconditioner) is used to solve the subsidiary systems, but other preconditioners can be used by setting them using passing a pointer to a function of type SubsidiaryPreconditionerFctPt to the method subsidiary_preconditioner_function_pt().

Constructor & Destructor Documentation

◆ BlockTriangularPreconditioner() [1/2]

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

Constructor. (By default this preconditioner is upper triangular).

463  : GeneralPurposeBlockPreconditioner<MATRIX>()
464  {
465  // default to upper triangular
466  Upper_triangular = true;
467  }
bool Upper_triangular
Boolean indicating upper or lower triangular.
Definition: general_purpose_block_preconditioners.h:526

◆ ~BlockTriangularPreconditioner()

template<typename MATRIX >
virtual oomph::BlockTriangularPreconditioner< MATRIX >::~BlockTriangularPreconditioner ( )
inlinevirtual

Destructor - delete the preconditioner matrices.

471  {
472  this->clean_up_memory();
473  }
virtual void clean_up_memory()
clean up the memory
Definition: general_purpose_block_preconditioners.h:476

References oomph::GeneralPurposeBlockPreconditioner< MATRIX >::clean_up_memory().

◆ BlockTriangularPreconditioner() [2/2]

template<typename MATRIX >
oomph::BlockTriangularPreconditioner< MATRIX >::BlockTriangularPreconditioner ( const BlockTriangularPreconditioner< MATRIX > &  )
delete

Broken copy constructor.

Member Function Documentation

◆ clean_up_memory()

template<typename MATRIX >
virtual void oomph::BlockTriangularPreconditioner< MATRIX >::clean_up_memory ( )
inlinevirtual

clean up the memory

Reimplemented from oomph::GeneralPurposeBlockPreconditioner< MATRIX >.

477  {
478  // Delete anything in Off_diagonal_matrix_vector_products
479  for (unsigned i = 0, ni = Off_diagonal_matrix_vector_products.nrow();
480  i < ni;
481  i++)
482  {
483  for (unsigned j = 0, nj = Off_diagonal_matrix_vector_products.ncol();
484  j < nj;
485  j++)
486  {
489  }
490  }
491 
492  // Clean up the base class too
494  }
int i
Definition: BiCGSTAB_step_by_step.cpp:9
DenseMatrix< MatrixVectorProduct * > Off_diagonal_matrix_vector_products
Matrix of matrix vector product operators for the off diagonals.
Definition: general_purpose_block_preconditioners.h:523
virtual void clean_up_memory()
Definition: general_purpose_block_preconditioners.h:112
std::ptrdiff_t j
Definition: tut_arithmetic_redux_minmax.cpp:2

References oomph::GeneralPurposeBlockPreconditioner< MATRIX >::clean_up_memory(), i, and j.

◆ lower_triangular()

template<typename MATRIX >
void oomph::BlockTriangularPreconditioner< MATRIX >::lower_triangular ( )
inline

Use as a lower triangular preconditioner.

517  {
518  Upper_triangular = false;
519  }

Referenced by oomph::PseudoElasticPreconditioner::setup().

◆ operator=()

template<typename MATRIX >
void oomph::BlockTriangularPreconditioner< MATRIX >::operator= ( const BlockTriangularPreconditioner< MATRIX > &  )
delete

Broken assignment operator.

◆ preconditioner_solve()

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

Apply preconditioner to r.

Preconditioner solve for the block triangular preconditioner.

Implements oomph::Preconditioner.

453  {
454  // Cache number of block types
455  unsigned n_block = this->nblock_types();
456 
457  //
458  int start, end, step;
459  if (Upper_triangular)
460  {
461  start = n_block - 1;
462  end = -1;
463  step = -1;
464  }
465  else
466  {
467  start = 0;
468  end = n_block;
469  step = 1;
470  }
471 
472  // vector of vectors for each section of residual vector
473  Vector<DoubleVector> block_r;
474 
475  // rearrange the vector r into the vector of block vectors block_r
476  this->get_block_vectors(r, block_r);
477 
478  // vector of vectors for the solution block vectors
479  Vector<DoubleVector> block_z(n_block);
480 
481  //
482  for (int i = start; i != end; i += step)
483  {
484  // ??ds ugly, fix this?
485  if (dynamic_cast<BlockPreconditioner<CRDoubleMatrix>*>(
486  this->Subsidiary_preconditioner_pt[i]) == 0)
487  {
488  // solve on the block
489  this->Subsidiary_preconditioner_pt[i]->preconditioner_solve(block_r[i],
490  block_z[i]);
491  }
492  else
493  {
494  // This is pretty inefficient but there is no other way to do this with
495  // block sub preconditioners as far as I can tell because they demand
496  // to have the full r and z vectors...
497 
498  DoubleVector block_z_with_size_of_full_z(r.distribution_pt()),
499  r_updated(r.distribution_pt());
500 
501  // Construct the new r vector (with the update given by back subs
502  // below).
503  this->return_block_vectors(block_r, r_updated);
504 
505  // Solve (blocking is handled inside the block preconditioner).
506  this->Subsidiary_preconditioner_pt[i]->preconditioner_solve(
507  r_updated, block_z_with_size_of_full_z);
508 
509  // Extract this block's z vector because we need it for the next step
510  // (and throw away block_z_with_size_of_full_z).
511  this->get_block_vector(i, block_z_with_size_of_full_z, block_z[i]);
512  }
513 
514  // substitute
515  for (int j = i + step; j != end; j += step)
516  {
517  DoubleVector temp;
518  Off_diagonal_matrix_vector_products(j, i)->multiply(block_z[i], temp);
519  block_r[j] -= temp;
520  }
521  }
522 
523  // copy solution in block vectors block_r back to z
524  this->return_block_vectors(block_z, z);
525  }
std::vector< double > DoubleVector
loads clump configuration
Definition: ClumpInput.h:26
void return_block_vectors(const Vector< unsigned > &block_vec_number, const Vector< DoubleVector > &s, DoubleVector &v) const
Definition: block_preconditioner.cc:3443
void get_block_vector(const unsigned &n, const DoubleVector &v, DoubleVector &b) const
Definition: block_preconditioner.cc:4186
unsigned nblock_types() const
Return the number of block types.
Definition: block_preconditioner.h:1670
void get_block_vectors(const Vector< unsigned > &block_vec_number, const DoubleVector &v, Vector< DoubleVector > &s) const
Definition: block_preconditioner.cc:2939
Vector< Preconditioner * > Subsidiary_preconditioner_pt
List of preconditioners to use for the blocks to be solved.
Definition: general_purpose_block_preconditioners.h:294
static constexpr lastp1_t end
Definition: IndexedViewHelper.h:79
r
Definition: UniformPSDSelfTest.py:20
void start(const unsigned &i)
(Re-)start i-th timer
Definition: oomph_utilities.cc:243

References Eigen::placeholders::end, i, j, UniformPSDSelfTest::r, and oomph::CumulativeTimings::start().

◆ setup()

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

Setup the preconditioner.

setup for the block triangular preconditioner

Implements oomph::Preconditioner.

298  {
299  // clean the memory
300  this->clean_up_memory();
301 
302  // Subsidiary preconditioners don't really need the meshes
303  if (this->is_master_block_preconditioner())
304  {
305 #ifdef PARANOID
306  if (this->gp_nmesh() == 0)
307  {
308  std::ostringstream err_msg;
309  err_msg << "There are no meshes set.\n"
310  << "Did you remember to call add_mesh(...)?";
311  throw OomphLibError(
313  }
314 #endif
315 
316  // Set all meshes if this is master block preconditioner
318  }
319 
320  // If we're meant to build silently
321  if (this->Silent_preconditioner_setup == true)
322  {
323  // Store the output stream pointer
324  this->Stream_pt = oomph_info.stream_pt();
325 
326  // Now set the oomph_info stream pointer to the null stream to
327  // disable all possible output
329  }
330 
331  // Set up the block look up schemes
333 
334  // number of block types
335  unsigned nblock_types = this->nblock_types();
336 
337  // storage for the off diagonal matrix vector products
338  Off_diagonal_matrix_vector_products.resize(nblock_types, nblock_types, 0);
339 
340  // Fill in any null subsidiary preconditioners
341  this->fill_in_subsidiary_preconditioners(nblock_types);
342 
343  // The total time for extracting all the blocks from the "global" matrix
344  double t_extraction_total = 0.0;
345 
346  // The total time for setting up the subsidiary preconditioners
347  double t_subsidiary_setup_total = 0.0;
348 
349  // The total time for setting up the matrix-vector products
350  double t_mvp_setup_total = 0.0;
351 
352  // build the preconditioners and matrix vector products
353  for (unsigned i = 0; i < nblock_types; i++)
354  {
355  // Get the block and set up the preconditioner.
356  {
357  // Get the start time
358  double t_extract_start = TimingHelpers::timer();
359 
360  // Grab the i-th diagonal block
361  CRDoubleMatrix block_matrix = this->get_block(i, i);
362 
363  // Get the end time
364  double t_extract_end = TimingHelpers::timer();
365 
366  // Update the timing total
367  t_extraction_total += (t_extract_end - t_extract_start);
368 
369  // Get the start time
370  double t_subsidiary_setup_start = TimingHelpers::timer();
371 
372  // Set up the i-th subsidiary preconditioner with this block
373  this->Subsidiary_preconditioner_pt[i]->setup(&block_matrix);
374 
375  // Get the end time
376  double t_subsidiary_setup_end = TimingHelpers::timer();
377 
378  // Update the timing total
379  t_subsidiary_setup_total +=
380  (t_subsidiary_setup_end - t_subsidiary_setup_start);
381  }
382 
383  // next setup the off diagonal mat vec operators
384  unsigned l, u;
385  if (Upper_triangular)
386  {
387  l = i + 1;
388  u = nblock_types;
389  }
390  else
391  {
392  l = 0;
393  u = i;
394  }
395 
396  for (unsigned j = l; j < u; j++)
397  {
398  // Get the start time
399  double t_extract_start = TimingHelpers::timer();
400 
401  // Get the block
402  CRDoubleMatrix block_matrix = this->get_block(i, j);
403 
404  // Get the end time
405  double t_extract_end = TimingHelpers::timer();
406 
407  // Update the timing total
408  t_extraction_total += (t_extract_end - t_extract_start);
409 
410  // Get the start time
411  double t_mvp_start = TimingHelpers::timer();
412 
413  // Copy the block into a "multiplier" class. If trilinos is being
414  // used this should also be faster than oomph-lib's multiphys.
415  Off_diagonal_matrix_vector_products(i, j) = new MatrixVectorProduct();
416 
417  // Set the damn thing up
419  Off_diagonal_matrix_vector_products(i, j), &block_matrix, j);
420 
421  // Get the end time
422  double t_mvp_end = TimingHelpers::timer();
423 
424  // Update the timing total
425  t_mvp_setup_total += (t_mvp_end - t_mvp_start);
426  }
427  }
428 
429  // Tell the user
430  oomph_info << "Total block extraction time [sec]: " << t_extraction_total
431  << "\nTotal subsidiary preconditioner setup time [sec]: "
432  << t_subsidiary_setup_total
433  << "\nTotal matrix-vector product setup time [sec]: "
434  << t_mvp_setup_total << std::endl;
435 
436  // If we're meant to build silently, reassign the oomph stream pointer
437  if (this->Silent_preconditioner_setup == true)
438  {
439  // Store the output stream pointer
440  oomph_info.stream_pt() = this->Stream_pt;
441 
442  // Reset our own stream pointer
443  this->Stream_pt = 0;
444  }
445  } // End of setup
void get_block(const unsigned &i, const unsigned &j, MATRIX &output_matrix, const bool &ignore_replacement_block=false) const
Definition: block_preconditioner.h:673
bool is_master_block_preconditioner() const
Definition: block_preconditioner.h:2068
void setup_matrix_vector_product(MatrixVectorProduct *matvec_prod_pt, CRDoubleMatrix *block_pt, const Vector< unsigned > &block_col_indices)
Definition: block_preconditioner.h:2397
void gp_preconditioner_set_all_meshes()
Set the mesh in the block preconditioning framework.
Definition: general_purpose_block_preconditioners.h:218
void fill_in_subsidiary_preconditioners(const unsigned &nprec_needed)
Definition: general_purpose_block_preconditioners.h:256
void gp_preconditioner_block_setup()
Modified block setup for general purpose block preconditioners.
Definition: general_purpose_block_preconditioners.h:241
unsigned gp_nmesh()
Definition: general_purpose_block_preconditioners.h:211
std::ostream *& stream_pt()
Access function for the stream pointer.
Definition: oomph_definitions.h:464
std::ostream * Stream_pt
Pointer to the output stream – defaults to std::cout.
Definition: preconditioner.h:232
bool Silent_preconditioner_setup
Boolean to indicate whether or not the build should be done silently.
Definition: preconditioner.h:229
double timer()
returns the time in seconds after some point in past
Definition: oomph_utilities.cc:1295
Nullstream oomph_nullstream
Single (global) instantiation of the Nullstream.
Definition: oomph_definitions.cc:313
OomphInfo oomph_info
Definition: oomph_definitions.cc:319
#define OOMPH_EXCEPTION_LOCATION
Definition: oomph_definitions.h:61
#define OOMPH_CURRENT_FUNCTION
Definition: oomph_definitions.h:86

References oomph::TerminateHelper::clean_up_memory(), i, j, OOMPH_CURRENT_FUNCTION, OOMPH_EXCEPTION_LOCATION, oomph::oomph_info, oomph::oomph_nullstream, GlobalParameters::Stream_pt, oomph::OomphInfo::stream_pt(), and oomph::TimingHelpers::timer().

◆ upper_triangular()

template<typename MATRIX >
void oomph::BlockTriangularPreconditioner< MATRIX >::upper_triangular ( )
inline

Use as an upper triangular preconditioner.

511  {
512  Upper_triangular = true;
513  }

Referenced by oomph::PseudoElasticPreconditioner::setup().

Member Data Documentation

◆ Off_diagonal_matrix_vector_products

template<typename MATRIX >
DenseMatrix<MatrixVectorProduct*> oomph::BlockTriangularPreconditioner< MATRIX >::Off_diagonal_matrix_vector_products
private

Matrix of matrix vector product operators for the off diagonals.

◆ Upper_triangular

template<typename MATRIX >
bool oomph::BlockTriangularPreconditioner< MATRIX >::Upper_triangular
private

Boolean indicating upper or lower triangular.


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