BoussinesqPreconditioner Class Reference
+ Inheritance diagram for BoussinesqPreconditioner:

Public Member Functions

 BoussinesqPreconditioner (Problem *problem_pt)
 
 ~BoussinesqPreconditioner ()
 Destructor: Clean up. More...
 
 BoussinesqPreconditioner (const BoussinesqPreconditioner &)
 Broken copy constructor. More...
 
void use_block_diagonal_version ()
 Switch to block-diagonal preconditioner. More...
 
void use_block_triangular_version_with_fluid_on_temperature ()
 
void use_block_triangular_version_with_temperature_on_fluid ()
 
void setup ()
 Setup the preconditioner. More...
 
void preconditioner_solve (const DoubleVector &r, DoubleVector &z)
 Apply preconditioner to r. More...
 
NavierStokesSchurComplementPreconditionernavier_stokes_preconditioner_pt () const
 Access function to the Navier Stokes preconditioner (inexact solver) More...
 
void enable_doc_time ()
 Enable documentation of timings. More...
 
void disable_doc_time ()
 Disable documentation of timings. More...
 
- 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)
 

Private Member Functions

void clean_up_memory ()
 Clean up memory, delete the blocks allocated in setup. More...
 

Private Attributes

NavierStokesSchurComplementPreconditionerNavier_stokes_preconditioner_pt
 Pointer the Navier Stokes preconditioner (inexact solver) More...
 
PreconditionerTemperature_preconditioner_pt
 Pointer to the temperature preconditioner (inexact solver) More...
 
PreconditionerP_preconditioner_pt
 Inexact solver for P block. More...
 
PreconditionerF_preconditioner_pt
 Inexact solver for F block. More...
 
CRDoubleMatrixBlock_matrix_0_1_pt
 Pointer to fluid/temperature interaction matrix. More...
 
CRDoubleMatrixBlock_matrix_1_0_pt
 Pointer to temperature/fluid interaction matrix. More...
 
bool Preconditioner_has_been_setup
 Boolean indicating the preconditioner has been set up. More...
 
bool Retain_temperature_onto_fluid_terms
 
bool Retain_fluid_onto_temperature_terms
 
bool Doc_time
 Set Doc_time to true for outputting results of timings. More...
 

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

Boussinesq preconditioner. This extracts upper/lower triangular blocks in the 3x3 overall block matrix structure arising from the monolithic discretisation of Boussinesq problems. Dofs are decomposed into fluid velocity, pressure and temperature unknowns. NavierStokesSchurComplementPreconditioner is used as the inexact solver for the fluid block; SuperLU (in its incarnation as an "exact" preconditioner) is used for the temperature block. By default we retain the fluid on temperature off diagonal blocks.

Constructor & Destructor Documentation

◆ BoussinesqPreconditioner() [1/2]

BoussinesqPreconditioner::BoussinesqPreconditioner ( Problem problem_pt)
inline

Constructor: By default use block triangular form with retained fluid on temperature terms. Requires a non-constant problem pointer because of the underlying NavierStokesSchurComplementPreconditioner.

85  {
86  // Default setting: Fluid onto temperature
89 
90  // Create the Navier Stokes preconditioner
94 
95  //Set the temperature preconditioner
97 
98  //Initialise the P and F block preconditioners
101 
102 #ifdef OOMPH_HAS_HYPRE
103 //If we have compiled with MPI,
104 //only use HYPRE if it's been initialised
105 #ifdef OOMPH_HAS_MPI
106  if(MPI_Helpers::mpi_has_been_initialised())
107 #endif
108  {
109  //Set up the internal preconditioners
111 
112  // Set parameters for use as preconditioner on Poisson-type problem
115 
116  // Use Hypre for the Schur complement block
118  set_p_preconditioner(P_preconditioner_pt);
119 
121 
122  // Set parameters for use as preconditioner in for momentum
123  // block in Navier-Stokes problem
126 
127  // Use Hypre for momentum block
129  set_f_preconditioner(F_preconditioner_pt);
130 
131  //Set the Temperature preconditioner to also use AMG
133 
137  }
138 #endif
139 
140  // Preconditioner hasn't been set up yet.
142 
143  // Null out pointers to additional block matrices not already
144  // stored in Navier Stokes block preconditioner
147 
148  // set Doc_time to false
149  Doc_time = false;
150 
151  // set the mesh to be the main mesh of the problem
152  this->set_nmesh(1);
153  this->set_mesh(0,problem_pt->mesh_pt());
154 
155  // Set up the (non-const) mesh pointer for the schur complement
156  // preconditioner.
158  (problem_pt->mesh_pt());
159  }
Preconditioner * F_preconditioner_pt
Inexact solver for F block.
Definition: 3d_ref_b_convect.cc:263
NavierStokesSchurComplementPreconditioner * Navier_stokes_preconditioner_pt
Pointer the Navier Stokes preconditioner (inexact solver)
Definition: 3d_ref_b_convect.cc:254
bool Preconditioner_has_been_setup
Boolean indicating the preconditioner has been set up.
Definition: 3d_ref_b_convect.cc:274
CRDoubleMatrix * Block_matrix_0_1_pt
Pointer to fluid/temperature interaction matrix.
Definition: 3d_ref_b_convect.cc:266
bool Retain_fluid_onto_temperature_terms
Definition: 3d_ref_b_convect.cc:282
bool Retain_temperature_onto_fluid_terms
Definition: 3d_ref_b_convect.cc:278
CRDoubleMatrix * Block_matrix_1_0_pt
Pointer to temperature/fluid interaction matrix.
Definition: 3d_ref_b_convect.cc:270
Preconditioner * P_preconditioner_pt
Inexact solver for P block.
Definition: 3d_ref_b_convect.cc:260
Preconditioner * Temperature_preconditioner_pt
Pointer to the temperature preconditioner (inexact solver)
Definition: 3d_ref_b_convect.cc:257
bool Doc_time
Set Doc_time to true for outputting results of timings.
Definition: 3d_ref_b_convect.cc:285
void set_nmesh(const unsigned &n)
Definition: block_preconditioner.h:2851
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
Definition: hypre_solver.h:826
Definition: navier_stokes_preconditioners.h:607
void set_navier_stokes_mesh(Mesh *mesh_pt, const bool &allow_multiple_element_type_in_navier_stokes_mesh=false)
Definition: navier_stokes_preconditioners.h:732
void disable_doc_time()
Disable documentation of time.
Definition: navier_stokes_preconditioners.h:811
Mesh *& mesh_pt()
Return a pointer to the global mesh.
Definition: problem.h:1280
An interface to allow SuperLU to be used as an (exact) Preconditioner.
Definition: SuperLU_preconditioner.h:40
void set_defaults_for_navier_stokes_momentum_block(HyprePreconditioner *hypre_preconditioner_pt)
Definition: hypre_solver.cc:85
void set_defaults_for_3D_poisson_problem(HyprePreconditioner *hypre_preconditioner_pt)
Definition: hypre_solver.cc:72

References oomph::Problem::mesh_pt(), oomph::MPI_Helpers::mpi_has_been_initialised(), oomph::Hypre_default_settings::set_defaults_for_3D_poisson_problem(), and oomph::Hypre_default_settings::set_defaults_for_navier_stokes_momentum_block().

◆ ~BoussinesqPreconditioner()

BoussinesqPreconditioner::~BoussinesqPreconditioner ( )
inline

Destructor: Clean up.

164  {
165  // Do what it says
166  clean_up_memory();
167 
168  //Delete the P block preconditioners
170 
171  //Delete the F block preconditioner
173 
174  //Delete the Navier-Stokes preconditioner (inexact solver)
176 
177  //Delete the temperature preconditioner (inexact solver)
179  }
void clean_up_memory()
Clean up memory, delete the blocks allocated in setup.
Definition: 3d_ref_b_convect.cc:236

References oomph::TerminateHelper::clean_up_memory().

◆ BoussinesqPreconditioner() [2/2]

BoussinesqPreconditioner::BoussinesqPreconditioner ( const BoussinesqPreconditioner )
inline

Broken copy constructor.

184  {
185  BrokenCopy::broken_copy("BoussinesqPreconditioner");
186  }
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_memory()

void BoussinesqPreconditioner::clean_up_memory ( )
inlineprivatevirtual

Clean up memory, delete the blocks allocated in setup.

Reimplemented from oomph::Preconditioner.

237  {
239  {
241  {
242  delete Block_matrix_0_1_pt;
244  }
246  {
247  delete Block_matrix_1_0_pt;
249  }
250  }
251  }

◆ disable_doc_time()

void BoussinesqPreconditioner::disable_doc_time ( )
inline

Disable documentation of timings.

230 {Doc_time = false;}

◆ enable_doc_time()

void BoussinesqPreconditioner::enable_doc_time ( )
inline

Enable documentation of timings.

227 {Doc_time = true;}

◆ navier_stokes_preconditioner_pt()

NavierStokesSchurComplementPreconditioner* BoussinesqPreconditioner::navier_stokes_preconditioner_pt ( ) const
inline

Access function to the Navier Stokes preconditioner (inexact solver)

222  {
224  }

◆ preconditioner_solve()

void BoussinesqPreconditioner::preconditioner_solve ( const DoubleVector r,
DoubleVector z 
)
virtual

Apply preconditioner to r.

Apply preconditioner to Vector r.

Implements oomph::Preconditioner.

414 {
415  // if z is not setup then give it the same distribution
416  if (!z.built())
417  {
418  z.build(r.distribution_pt(),0.0);
419  }
420 
421  // Make copy of residual vector (to overcome const-ness
422  DoubleVector res(r);
423 
424 
425  // Retain off-diagonals that represent effect of temperature on fluid
426  //-------------------------------------------------------------------
428  {
429 
430  // Working vectors
431  DoubleVector temp_temperature_vec;
432  DoubleVector temp_fluid_vec;
433 
434  // Copy temperature values from residual to temp_vec:
435  // Loop over all entries in the global vector (this one
436  // includes tempearture, velocity and pressure dofs in some random fashion)
437  get_block_vector(1,res,temp_temperature_vec);
438 
439  // Solve temperature system by back-substitution
440  // with LU-decomposed temperature-temperature Jacobian
442  temp_temperature_vec);
443  this->return_block_vector(1,temp_temperature_vec,z);
444 
445  // NOTE: temp_temperature_vec now contains z_t = S^{-1} r_t
446 
447  // Multiply C_{ut} by z_t
448  Block_matrix_0_1_pt->multiply(temp_temperature_vec,temp_fluid_vec);
449 // Mat_vec_operator_0_1_pt->multiply(temp_temperature_vec,temp_fluid_vec);
450  temp_temperature_vec.clear();
451 
452  // Subtract from fluid residual vector for fluid solve
453  DoubleVector another_temp_vec;
454  this->get_block_vector(0,res,another_temp_vec);
455  another_temp_vec -= temp_fluid_vec;
456  this->return_block_vector(0,another_temp_vec,res);
457 
458  // now apply the navier stokes lsc preconditioner
460  }
461 
462 
463  // Retain off-diagonals that represent effect of fluid on temperature
464  //-------------------------------------------------------------------
465  // (or diagonal preconditioner)
466  //-----------------------------
467  else
468  {
469 
470  // Call fluid preconditioner for fluid block
472 
473  // Working vectors
474  DoubleVector temp_temperature_vec;
475 
476  // get the temperature vector
477  get_block_vector(1,res,temp_temperature_vec);
478 
479  // Do matrix vector products with fluid onto temperature coupling matrices:
481  {
482  DoubleVector temp_fluid_vec;
483  get_block_vector(0,z,temp_fluid_vec);
484 
485  // Auxiliary vector to hold the matrix vector product of the
486  // fluid-onto-temperature coupling matrices with the fluid solutions:
487  DoubleVector aux_vec;
488 
489  // Multiply C_{tu} by z_u
490  Block_matrix_1_0_pt->multiply(temp_fluid_vec, aux_vec);
491 
492  // ...and subtract from r_t:
493  temp_temperature_vec-=aux_vec;
494  }
495 
496  // Solve temperature system by back-substitution
497  // with LU-decomposed temperature-temperature Jacobian
499  temp_temperature_vec);
500 
501  // Now copy result_vec (i.e. z_t) back into the global vector z.
502  // Loop over all entries in the global results vector z:
503  return_block_vector(1,temp_temperature_vec,z);
504  }
505 }
cout<< "Here is the matrix m:"<< endl<< m<< endl;Matrix< ptrdiff_t, 3, 1 > res
Definition: PartialRedux_count.cpp:3
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 &soln) const
Multiply the matrix by the vector x: soln=Ax.
Definition: matrices.cc:1782
Definition: double_vector.h:58
void build(const DoubleVector &old_vector)
Just copys the argument DoubleVector.
Definition: double_vector.cc:35
bool built() const
Definition: double_vector.h:154
void clear()
wipes the DoubleVector
Definition: double_vector.h:142
void preconditioner_solve(const DoubleVector &r, DoubleVector &z)
Apply preconditioner to Vector r.
Definition: driven_cavity_with_simple_lsc_preconditioner.cc:384
virtual void preconditioner_solve(const DoubleVector &r, DoubleVector &z)=0
r
Definition: UniformPSDSelfTest.py:20

References oomph::DoubleVector::build(), oomph::DoubleVector::built(), oomph::DoubleVector::clear(), UniformPSDSelfTest::r, and res.

◆ setup()

void BoussinesqPreconditioner::setup ( )
virtual

Setup the preconditioner.

Setup the preconditioner. Note: Matrix must be a CRDoubleMatrix.

/////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////

Implements oomph::Preconditioner.

302  {
303 
304  // Clean up any existing data
305  this->clean_up_memory();
306 
307  // Get total number of dofs.
308  unsigned n_dof=mesh_pt(0)->finite_element_pt(0)->dim()+2;
309 
310  // Number of fluid dofs: one less
311  unsigned n_fluid_dof = n_dof-1;
312 
313  // This preconditioner has two types of DOF: Fluid dofs and temperature dofs
314 
315  // Initialise block type to zero (correct for fluid dofs)
316  Vector<unsigned> dof_to_block_map(n_dof,0);
317 
318  // Temperature dofs are "type one"
319  dof_to_block_map[n_dof-1] = 1;
320 
321  // Call block setup for this preconditioner
322  this->block_setup(dof_to_block_map);
323 
324  // Block mapping for the subsidiary Navier Stokes preconditioner:
325  // blocks 0 and 1 in the Boussinesq preconditioner are also blocks 0 and 1
326  // in the subsidiary Navier Stokes one.
327  Vector<unsigned> ns_dof_lookup(n_fluid_dof);
328  for (unsigned i = 0; i < n_fluid_dof; i++)
329  {
330  ns_dof_lookup[i] = i;
331  }
332 
333  // Turn the Navier Stokes Schur complement preconditioner into a
334  // subsidiary preconditioner of this preconditioner
336  turn_into_subsidiary_block_preconditioner(this,ns_dof_lookup);
337 
338  // Setup the Navier Stokes preconditioner:
340 
341  // Extract the additional blocks we need for Boussinesq:
342 
343  // Temperature matrix
344  CRDoubleMatrix* block_matrix_1_1_pt = new CRDoubleMatrix;
345  this->get_block(1,1,*block_matrix_1_1_pt);
346 
347  // Temperature on fluid terms (if needed)
348 
350  {
353  this->get_block(0,1,*Block_matrix_0_1_pt);
354  }
355 
356  // Fluid on temperature terms (if needed)
358  {
361  this->get_block(1,0,*Block_matrix_1_0_pt);
362  }
363 
364 
365  // Setup the temperature preconditioner (inexact solver)
366  double t_start = TimingHelpers::timer();
367  Temperature_preconditioner_pt->setup(block_matrix_1_1_pt);
368  double t_end = TimingHelpers::timer();
369  double setup_time= t_end-t_start;
370  delete block_matrix_1_1_pt; block_matrix_1_1_pt = 0;
371 
372 
373  // Output times
374  if(Doc_time)
375  {
376  oomph_info << "Temperature sub-preconditioner setup time [sec]: "
377  << setup_time << "\n";
378 
379  // Doc density of retained interaction block
381  {
382  oomph_info
383  << "Fill level of temperature on fluid blocks (C_ut and C_pt): " <<
386  Block_matrix_0_1_pt->ncol())*100.0
387  << "% " << std::endl;
388  }
389 
390  // Doc density of retained interaction block
392  {
393  oomph_info
394  << "Fill level of fluid on temperature blocks (C_tu and C_tp): " <<
397  Block_matrix_1_0_pt->ncol())*100.0
398  << "% " << std::endl;
399  }
400  }
401 
402  // We're done (and we stored some data)
404 
405 
406  }
int i
Definition: BiCGSTAB_step_by_step.cpp:9
const Mesh * mesh_pt(const unsigned &i) const
Definition: block_preconditioner.h:1782
void get_block(const unsigned &i, const unsigned &j, CRDoubleMatrix &output_matrix, const bool &ignore_replacement_block=false) const
Definition: block_preconditioner.h:673
CRDoubleMatrix * matrix_pt() const
Definition: block_preconditioner.h:520
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
virtual void block_setup()
Definition: block_preconditioner.cc:2483
Definition: matrices.h:888
unsigned long ncol() const
Return the number of columns of the matrix.
Definition: matrices.h:1008
unsigned long nnz() const
Return the number of nonzero entries (the local nnz)
Definition: matrices.h:1096
unsigned long nrow() const
Return the number of rows of the matrix.
Definition: matrices.h:1002
unsigned dim() const
Definition: elements.h:2611
FiniteElement * finite_element_pt(const unsigned &e) const
Definition: mesh.h:473
void setup()
Setup the preconditioner.
Definition: driven_cavity_with_simple_lsc_preconditioner.cc:167
void setup(DoubleMatrixBase *matrix_pt)
Definition: preconditioner.h:94
double setup_time() const
Returns the time to setup the preconditioner.
Definition: preconditioner.h:199
OomphInfo oomph_info
Definition: oomph_definitions.cc:319
double timer
Definition: oomph_metis_from_parmetis_3.1.1/struct.h:210

References oomph::TerminateHelper::clean_up_memory(), i, oomph::oomph_info, and oomph::TimingHelpers::timer().

◆ use_block_diagonal_version()

void BoussinesqPreconditioner::use_block_diagonal_version ( )
inline

Switch to block-diagonal preconditioner.

◆ use_block_triangular_version_with_fluid_on_temperature()

void BoussinesqPreconditioner::use_block_triangular_version_with_fluid_on_temperature ( )
inline

Switch to block-triangular preconditioner in which action of fluid dofs onto temperature equations is retained

◆ use_block_triangular_version_with_temperature_on_fluid()

void BoussinesqPreconditioner::use_block_triangular_version_with_temperature_on_fluid ( )
inline

Switch to block-triangular preconditioner in which action of temperature dofs onto fluid equations is retained

Member Data Documentation

◆ Block_matrix_0_1_pt

CRDoubleMatrix* BoussinesqPreconditioner::Block_matrix_0_1_pt
private

Pointer to fluid/temperature interaction matrix.

◆ Block_matrix_1_0_pt

CRDoubleMatrix* BoussinesqPreconditioner::Block_matrix_1_0_pt
private

Pointer to temperature/fluid interaction matrix.

◆ Doc_time

bool BoussinesqPreconditioner::Doc_time
private

Set Doc_time to true for outputting results of timings.

◆ F_preconditioner_pt

Preconditioner* BoussinesqPreconditioner::F_preconditioner_pt
private

Inexact solver for F block.

◆ Navier_stokes_preconditioner_pt

NavierStokesSchurComplementPreconditioner* BoussinesqPreconditioner::Navier_stokes_preconditioner_pt
private

Pointer the Navier Stokes preconditioner (inexact solver)

◆ P_preconditioner_pt

Preconditioner* BoussinesqPreconditioner::P_preconditioner_pt
private

Inexact solver for P block.

◆ Preconditioner_has_been_setup

bool BoussinesqPreconditioner::Preconditioner_has_been_setup
private

Boolean indicating the preconditioner has been set up.

◆ Retain_fluid_onto_temperature_terms

bool BoussinesqPreconditioner::Retain_fluid_onto_temperature_terms
private

Boolean flag used to indicate that the fluid onto temperature interaction terms are to be retained

◆ Retain_temperature_onto_fluid_terms

bool BoussinesqPreconditioner::Retain_temperature_onto_fluid_terms
private

Boolean flag used to indicate that the temperature onto fluid interaction terms are to be retained

◆ Temperature_preconditioner_pt

Preconditioner* BoussinesqPreconditioner::Temperature_preconditioner_pt
private

Pointer to the temperature preconditioner (inexact solver)


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