oomph::FSIPreconditioner Class Reference

#include <fsi_preconditioners.h>

+ Inheritance diagram for oomph::FSIPreconditioner:

Public Member Functions

 FSIPreconditioner (Problem *problem_pt)
 
 ~FSIPreconditioner ()
 Destructor: Clean up. More...
 
 FSIPreconditioner (const FSIPreconditioner &)=delete
 Broken copy constructor. More...
 
void set_solid_preconditioner_pt (Preconditioner *solid_preconditioner_pt)
 Broken assignment operator. More...
 
Preconditionersolid_preconditioner_pt () const
 Read-only access to solid preconditoner (use set_... to set it) More...
 
void use_block_diagonal_version ()
 Switch to block-diagonal preconditioner. More...
 
void use_block_triangular_version_with_fluid_on_solid ()
 
void use_block_triangular_version_with_solid_on_fluid ()
 
void set_navier_stokes_mesh (Mesh *mesh_pt, const bool &allow_multiple_element_type_in_navier_stokes_mesh=false)
 
void set_wall_mesh (Mesh *mesh_pt, const bool &allow_multiple_element_type_in_wall_mesh=false)
 
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 time. More...
 
void disable_doc_time ()
 Disable documentation of time. 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 clean_up_memory ()
 Clean up memory (empty). Generic interface function. More...
 
virtual void set_matrix_pt (DoubleMatrixBase *matrix_pt)
 Set the matrix pointer. More...
 
virtual const OomphCommunicatorcomm_pt () const
 Get function for comm pointer. More...
 
virtual void set_comm_pt (const OomphCommunicator *const comm_pt)
 Set the communicator pointer. More...
 
double setup_time () const
 Returns the time to setup the preconditioner. More...
 
virtual void turn_into_subsidiary_block_preconditioner (BlockPreconditioner< CRDoubleMatrix > *master_block_prec_pt, const Vector< unsigned > &doftype_in_master_preconditioner_coarse)
 
virtual void turn_into_subsidiary_block_preconditioner (BlockPreconditioner< CRDoubleMatrix > *master_block_prec_pt, const Vector< unsigned > &doftype_in_master_preconditioner_coarse, const Vector< Vector< unsigned >> &doftype_coarsen_map_coarse)
 
- Public Member Functions inherited from oomph::DistributableLinearAlgebraObject
 DistributableLinearAlgebraObject ()
 Default constructor - create a distribution. More...
 
 DistributableLinearAlgebraObject (const DistributableLinearAlgebraObject &matrix)=delete
 Broken copy constructor. More...
 
void operator= (const DistributableLinearAlgebraObject &)=delete
 Broken assignment operator. More...
 
virtual ~DistributableLinearAlgebraObject ()
 Destructor. More...
 
LinearAlgebraDistributiondistribution_pt () const
 access to the LinearAlgebraDistribution More...
 
unsigned nrow () const
 access function to the number of global rows. More...
 
unsigned nrow_local () const
 access function for the num of local rows on this processor. More...
 
unsigned nrow_local (const unsigned &p) const
 access function for the num of local rows on this processor. More...
 
unsigned first_row () const
 access function for the first row on this processor More...
 
unsigned first_row (const unsigned &p) const
 access function for the first row on this processor More...
 
bool distributed () const
 distribution is serial or distributed More...
 
bool distribution_built () const
 
void build_distribution (const LinearAlgebraDistribution *const dist_pt)
 
void build_distribution (const LinearAlgebraDistribution &dist)
 

Private Attributes

NavierStokesSchurComplementPreconditionerNavier_stokes_preconditioner_pt
 Pointer the Navier Stokes preconditioner (inexact solver) More...
 
PreconditionerSolid_preconditioner_pt
 Pointer to the solid preconditioner (inexact solver) More...
 
MatrixVectorProductMatrix_vector_product_0_1_pt
 Pointer to fluid/solid interaction matrix. More...
 
MatrixVectorProductMatrix_vector_product_1_0_pt
 Pointer to solid/fluid solid interaction matrix. More...
 
bool Preconditioner_has_been_setup
 Boolean indicating the preconditioner has been set up. More...
 
bool Retain_solid_onto_fluid_terms
 
bool Retain_fluid_onto_solid_terms
 
bool Doc_time
 Set Doc_time to true for outputting results of timings. More...
 
MeshNavier_stokes_mesh_pt
 Pointer to the navier stokes mesh. More...
 
MeshWall_mesh_pt
 pointer to the solid mesh More...
 
bool Allow_multiple_element_type_in_navier_stokes_mesh
 
bool Allow_multiple_element_type_in_wall_mesh
 

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

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

Constructor & Destructor Documentation

◆ FSIPreconditioner() [1/2]

oomph::FSIPreconditioner::FSIPreconditioner ( Problem problem_pt)
inline

Constructor: By default use block triangular form with retained fluid on solid terms. A problem pointer is required for the underlying NavierStokesSchurComplementPreconditioner.

57  {
58  // set the mesh pointers
59  this->set_nmesh(2);
61  Wall_mesh_pt = 0;
62 
63  // Initially assume that there are no multiple element types in the
64  // meshes.
67 
68  // Default setting: Fluid onto solid as it this was shown to be
69  // marginally faster than solid onto fluid; see Heil CMAME 193 (2004)
72 
73  // Create the Navier Stokes Schur complement preconditioner
75  new NavierStokesSchurComplementPreconditioner(problem_pt);
76 
77  // Create the Solid preconditioner
78  Solid_preconditioner_pt = new SuperLUPreconditioner;
79 
80  // Preconditioner hasn't been set up yet.
82 
83  // Create the matrix vector product operators
84  Matrix_vector_product_0_1_pt = new MatrixVectorProduct;
85  Matrix_vector_product_1_0_pt = new MatrixVectorProduct;
86 
87  // set Doc_time to false
88  Doc_time = false;
89  }
void set_nmesh(const unsigned &n)
Definition: block_preconditioner.h:2851
Mesh * Navier_stokes_mesh_pt
Pointer to the navier stokes mesh.
Definition: fsi_preconditioners.h:245
bool Doc_time
Set Doc_time to true for outputting results of timings.
Definition: fsi_preconditioners.h:242
bool Allow_multiple_element_type_in_navier_stokes_mesh
Definition: fsi_preconditioners.h:252
MatrixVectorProduct * Matrix_vector_product_0_1_pt
Pointer to fluid/solid interaction matrix.
Definition: fsi_preconditioners.h:225
bool Allow_multiple_element_type_in_wall_mesh
Definition: fsi_preconditioners.h:255
MatrixVectorProduct * Matrix_vector_product_1_0_pt
Pointer to solid/fluid solid interaction matrix.
Definition: fsi_preconditioners.h:228
Preconditioner * Solid_preconditioner_pt
Pointer to the solid preconditioner (inexact solver)
Definition: fsi_preconditioners.h:222
bool Retain_solid_onto_fluid_terms
Definition: fsi_preconditioners.h:235
bool Preconditioner_has_been_setup
Boolean indicating the preconditioner has been set up.
Definition: fsi_preconditioners.h:231
bool Retain_fluid_onto_solid_terms
Definition: fsi_preconditioners.h:239
NavierStokesSchurComplementPreconditioner * Navier_stokes_preconditioner_pt
Pointer the Navier Stokes preconditioner (inexact solver)
Definition: fsi_preconditioners.h:219
Mesh * Wall_mesh_pt
pointer to the solid mesh
Definition: fsi_preconditioners.h:248

References Allow_multiple_element_type_in_navier_stokes_mesh, Allow_multiple_element_type_in_wall_mesh, Doc_time, Matrix_vector_product_0_1_pt, Matrix_vector_product_1_0_pt, Navier_stokes_mesh_pt, Navier_stokes_preconditioner_pt, Preconditioner_has_been_setup, Retain_fluid_onto_solid_terms, Retain_solid_onto_fluid_terms, oomph::BlockPreconditioner< CRDoubleMatrix >::set_nmesh(), Solid_preconditioner_pt, and Wall_mesh_pt.

◆ ~FSIPreconditioner()

oomph::FSIPreconditioner::~FSIPreconditioner ( )
inline

Destructor: Clean up.

94  {
95  // Delete the Navier-Stokes preconditioner (inexact solver)
97 
98  // Delete the solid preconditioner (inexact solver)
100 
101  // delete the matrix vector product operators
104  }

References Matrix_vector_product_0_1_pt, Matrix_vector_product_1_0_pt, Navier_stokes_preconditioner_pt, and Solid_preconditioner_pt.

◆ FSIPreconditioner() [2/2]

oomph::FSIPreconditioner::FSIPreconditioner ( const FSIPreconditioner )
delete

Broken copy constructor.

Member Function Documentation

◆ disable_doc_time()

void oomph::FSIPreconditioner::disable_doc_time ( )
inline

Disable documentation of time.

212  {
213  Doc_time = false;
214  }

References Doc_time.

◆ enable_doc_time()

void oomph::FSIPreconditioner::enable_doc_time ( )
inline

Enable documentation of time.

206  {
207  Doc_time = true;
208  }

References Doc_time.

Referenced by main().

◆ navier_stokes_preconditioner_pt()

◆ preconditioner_solve()

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

Apply preconditioner to r.

Apply preconditioner to Vector r.

Implements oomph::Preconditioner.

375  {
376  // if z is not setup then give it the same distribution
377  if (!z.built())
378  {
379  z.build(r.distribution_pt(), 0.0);
380  }
381 
382  // Make copy of residual vector (to overcome const-ness
383  DoubleVector res(r);
384 
385 
386  // Retain off-diagonals that represent effect of solid on fluid
387  //-------------------------------------------------------------
389  {
390  // Working vectors
391  DoubleVector temp_solid_vec;
392  DoubleVector temp_fluid_vec;
393 
394  // Copy solid values from residual to temp_vec:
395  // Loop over all entries in the global vector (this one
396  // includes solid, velocity and pressure dofs in some random fashion)
397  get_block_vector(1, res, temp_solid_vec);
398 
399  // Solve solid system by back-substitution
400  // with LU-decomposed stiffness matrix
401  DoubleVector temp_solid_vec2;
403  temp_solid_vec2);
404  this->return_block_vector(1, temp_solid_vec2, z);
405 
406  // NOTE: temp_solid_vec now contains z_s = S^{-1} r_s
407 
408  // Multiply C_{us} by z_s
409  Matrix_vector_product_0_1_pt->multiply(temp_solid_vec2, temp_fluid_vec);
410  temp_solid_vec.clear();
411 
412  // Subtract from fluid residual vector for fluid solve
413  DoubleVector another_temp_vec;
414  this->get_block_vector(0, res, another_temp_vec);
415  another_temp_vec -= temp_fluid_vec;
416  this->return_block_vector(0, another_temp_vec, res);
417 
418  // now apply the navier stokes lsc preconditioner
420  }
421 
422 
423  // Retain off-diagonals that represent effect of fluid on solid
424  //-------------------------------------------------------------
425  // (or diagonal preconditioner)
426  //-----------------------------
427  else
428  {
429  // Call fluid preconditioner for fluid block
431 
432  // Working vectors
433  DoubleVector temp_solid_vec;
434 
435  // get the solid vector
436  get_block_vector(1, res, temp_solid_vec);
437 
438  // Do matrix vector products with fluid onto solid coupling matrices:
440  {
441  DoubleVector temp_fluid_vec;
442  get_block_vector(0, z, temp_fluid_vec);
443 
444  // Auxiliary vector to hold the matrix vector product of the
445  // fluid-onto-solid coupling matrices with the fluid solutions:
446  DoubleVector aux_vec;
447 
448  // Multiply C_{su} by z_u
449  Matrix_vector_product_1_0_pt->multiply(temp_fluid_vec, aux_vec);
450 
451  // ...and subtract from r_s:
452  temp_solid_vec -= aux_vec;
453  }
454 
455  // Solve solid system by back-substitution
456  // with LU-decomposed stiffness matrix
457  DoubleVector temp_solid_vec2;
459  temp_solid_vec2);
460 
461  // Now copy result_vec (i.e. z_s) back into the global vector z.
462  // Loop over all entries in the global results vector z:
463  return_block_vector(1, temp_solid_vec2, z);
464  }
465  }
std::vector< double > DoubleVector
loads clump configuration
Definition: ClumpInput.h:26
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 &y) const
Definition: matrix_vector_product.cc:108
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(), oomph::BlockPreconditioner< CRDoubleMatrix >::get_block_vector(), Matrix_vector_product_0_1_pt, Matrix_vector_product_1_0_pt, oomph::MatrixVectorProduct::multiply(), Navier_stokes_preconditioner_pt, oomph::NavierStokesSchurComplementPreconditioner::preconditioner_solve(), oomph::Preconditioner::preconditioner_solve(), UniformPSDSelfTest::r, res, Retain_fluid_onto_solid_terms, Retain_solid_onto_fluid_terms, oomph::BlockPreconditioner< CRDoubleMatrix >::return_block_vector(), and Solid_preconditioner_pt.

◆ set_navier_stokes_mesh()

void oomph::FSIPreconditioner::set_navier_stokes_mesh ( Mesh mesh_pt,
const bool allow_multiple_element_type_in_navier_stokes_mesh = false 
)
inline

Setter function for the mesh containing the block-preconditionable Navier-Stokes elements. The optional argument indicates if there are more than one type of elements in same mesh.

167  {
168  // Store the mesh pointer.
170 
171  // Are there multiple element types in the Navier-Stokes mesh?
173  allow_multiple_element_type_in_navier_stokes_mesh;
174  }
const Mesh * mesh_pt(const unsigned &i) const
Definition: block_preconditioner.h:1782

References Allow_multiple_element_type_in_navier_stokes_mesh, oomph::BlockPreconditioner< CRDoubleMatrix >::mesh_pt(), and Navier_stokes_mesh_pt.

Referenced by FSIChannelWithLeafletProblem< ELEMENT >::FSIChannelWithLeafletProblem(), main(), PreconditionedFSICollapsibleChannelProblem< ELEMENT >::PreconditionedFSICollapsibleChannelProblem(), RefineableConvectionProblem< NST_ELEMENT, AD_ELEMENT >::switch_to_iterative_linear_solver(), and TurekProblem< FLUID_ELEMENT, SOLID_ELEMENT >::TurekProblem().

◆ set_solid_preconditioner_pt()

void oomph::FSIPreconditioner::set_solid_preconditioner_pt ( Preconditioner solid_preconditioner_pt)
inline

Broken assignment operator.

Set solid preconditioner (deletes existing one)

122  {
123  // Kill existing one
124  if (Solid_preconditioner_pt != 0)
125  {
127  }
129  }
Preconditioner * solid_preconditioner_pt() const
Read-only access to solid preconditoner (use set_... to set it)
Definition: fsi_preconditioners.h:132

References solid_preconditioner_pt(), and Solid_preconditioner_pt.

Referenced by RefineableConvectionProblem< NST_ELEMENT, AD_ELEMENT >::switch_to_iterative_linear_solver().

◆ set_wall_mesh()

void oomph::FSIPreconditioner::set_wall_mesh ( Mesh mesh_pt,
const bool allow_multiple_element_type_in_wall_mesh = false 
)
inline

Setter function for the mesh containing the block-preconditionable FSI solid elements. The optional argument indicates if there are more than one type of elements in the same mesh.

182  {
183  // Store the mesh pointer
185 
186  // Are there multiple element types in the wall mesh?
188  allow_multiple_element_type_in_wall_mesh;
189  }

References Allow_multiple_element_type_in_wall_mesh, oomph::BlockPreconditioner< CRDoubleMatrix >::mesh_pt(), and Wall_mesh_pt.

Referenced by FSIChannelWithLeafletProblem< ELEMENT >::FSIChannelWithLeafletProblem(), main(), PreconditionedFSICollapsibleChannelProblem< ELEMENT >::PreconditionedFSICollapsibleChannelProblem(), RefineableConvectionProblem< NST_ELEMENT, AD_ELEMENT >::switch_to_iterative_linear_solver(), and TurekProblem< FLUID_ELEMENT, SOLID_ELEMENT >::TurekProblem().

◆ setup()

void oomph::FSIPreconditioner::setup ( )
virtual

Setup the preconditioner.

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

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

Implements oomph::Preconditioner.

270  {
271  // check the meshes have been set
272 #ifdef PARANOID
273  if (Navier_stokes_mesh_pt == 0)
274  {
275  std::ostringstream error_message;
276  error_message << "Pointer to fluid mesh hasn't been set!\n";
277  throw OomphLibError(
278  error_message.str(), OOMPH_CURRENT_FUNCTION, OOMPH_EXCEPTION_LOCATION);
279  }
280  if (Wall_mesh_pt == 0)
281  {
282  std::ostringstream error_message;
283  error_message << "Pointer to solid mesh hasn't been set!\n";
284  throw OomphLibError(
285  error_message.str(), OOMPH_CURRENT_FUNCTION, OOMPH_EXCEPTION_LOCATION);
286  }
287 #endif
288 
289  // setup the meshes
290  this->set_mesh(0,
294 
295  // get the number of fluid dofs from teh first element in the mesh
296  unsigned n_fluid_dof = this->ndof_types_in_mesh(0);
297  unsigned n_dof = n_fluid_dof + this->ndof_types_in_mesh(1);
298 
299  // this fsi preconditioner has two types of DOF fluid dofs and solid dofs
300  Vector<unsigned> dof_to_block_map(n_dof, 0);
301  for (unsigned i = n_fluid_dof; i < n_dof; i++)
302  {
303  dof_to_block_map[i] = 1;
304  }
305 
306  // Call block setup for this preconditioner
307  this->block_setup(dof_to_block_map);
308 
309  // Block mapping for the subsidiary Navier Stokes preconditioner:
310  // blocks 0 and 1 in the FSI preconditioner are also blocks 0 and 1
311  // in the subsidiary Navier Stokes one.
312  Vector<unsigned> ns_dof_lookup(n_fluid_dof);
313  for (unsigned i = 0; i < n_fluid_dof; i++)
314  {
315  ns_dof_lookup[i] = i;
316  }
317 
318  // Turn the Navier Stokes Schur complement preconditioner into a
319  // subsidiary preconditioner of this preconditioner
321  this, ns_dof_lookup);
322 
323  // Setup the navier stokes preconditioner: Tell it about the
324  // Navier Stokes mesh and set it up.
328 
329  // Extract the additional blocks we need for FSI:
330 
331  // Solid tangent stiffness matrix
332  CRDoubleMatrix block_matrix_1_1;
333  this->get_block(1, 1, block_matrix_1_1);
334 
335  // Setup the solid preconditioner (inexact solver)
336  double t_start = TimingHelpers::timer();
337  Solid_preconditioner_pt->setup(&block_matrix_1_1);
338  double t_end = TimingHelpers::timer();
339  block_matrix_1_1.clear();
340  double setup_time = t_end - t_start;
341 
342  // Solid on fluid terms (if needed)
344  {
345  CRDoubleMatrix block_matrix_0_1 = get_block(0, 1);
347  Matrix_vector_product_0_1_pt, &block_matrix_0_1, 1);
348  }
349 
350  // Fluid on solid terms (if needed)
352  {
353  CRDoubleMatrix block_matrix_1_0 = get_block(1, 0);
355  Matrix_vector_product_1_0_pt, &block_matrix_1_0, 0);
356  }
357 
358  // Output times
359  if (Doc_time)
360  {
361  oomph_info << "Solid sub-preconditioner setup time [sec]: " << setup_time
362  << "\n";
363  }
364 
365  // We're done (and we stored some data)
367  }
int i
Definition: BiCGSTAB_step_by_step.cpp:9
unsigned ndof_types_in_mesh(const unsigned &i) const
Definition: block_preconditioner.h:2037
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< MATRIX > *master_block_prec_pt, const Vector< unsigned > &doftype_in_master_preconditioner_coarse)
Definition: block_preconditioner.cc:2376
void setup_matrix_vector_product(MatrixVectorProduct *matvec_prod_pt, CRDoubleMatrix *block_pt, const Vector< unsigned > &block_col_indices)
Definition: block_preconditioner.h:2397
virtual void block_setup()
Definition: block_preconditioner.cc:2483
void set_mesh(const unsigned &i, const Mesh *const mesh_pt, const bool &allow_multiple_element_type_in_mesh=false)
Definition: block_preconditioner.h:2866
void setup()
Setup the preconditioner.
Definition: driven_cavity_with_simple_lsc_preconditioner.cc:167
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 setup(DoubleMatrixBase *matrix_pt)
Definition: preconditioner.h:94
double setup_time() const
Returns the time to setup the preconditioner.
Definition: preconditioner.h:199
double timer()
returns the time in seconds after some point in past
Definition: oomph_utilities.cc:1295
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 Allow_multiple_element_type_in_navier_stokes_mesh, Allow_multiple_element_type_in_wall_mesh, oomph::BlockPreconditioner< CRDoubleMatrix >::block_setup(), oomph::CRDoubleMatrix::clear(), Doc_time, oomph::BlockPreconditioner< CRDoubleMatrix >::get_block(), i, oomph::BlockPreconditioner< CRDoubleMatrix >::matrix_pt(), Matrix_vector_product_0_1_pt, Matrix_vector_product_1_0_pt, Navier_stokes_mesh_pt, Navier_stokes_preconditioner_pt, oomph::BlockPreconditioner< CRDoubleMatrix >::ndof_types_in_mesh(), OOMPH_CURRENT_FUNCTION, OOMPH_EXCEPTION_LOCATION, oomph::oomph_info, Preconditioner_has_been_setup, Retain_fluid_onto_solid_terms, Retain_solid_onto_fluid_terms, oomph::BlockPreconditioner< CRDoubleMatrix >::set_mesh(), oomph::NavierStokesSchurComplementPreconditioner::set_navier_stokes_mesh(), oomph::NavierStokesSchurComplementPreconditioner::setup(), oomph::Preconditioner::setup(), oomph::BlockPreconditioner< CRDoubleMatrix >::setup_matrix_vector_product(), oomph::Preconditioner::setup_time(), Solid_preconditioner_pt, oomph::TimingHelpers::timer(), oomph::BlockPreconditioner< MATRIX >::turn_into_subsidiary_block_preconditioner(), and Wall_mesh_pt.

◆ solid_preconditioner_pt()

Preconditioner* oomph::FSIPreconditioner::solid_preconditioner_pt ( ) const
inline

Read-only access to solid preconditoner (use set_... to set it)

133  {
135  }

References Solid_preconditioner_pt.

Referenced by set_solid_preconditioner_pt().

◆ use_block_diagonal_version()

void oomph::FSIPreconditioner::use_block_diagonal_version ( )
inline

◆ use_block_triangular_version_with_fluid_on_solid()

void oomph::FSIPreconditioner::use_block_triangular_version_with_fluid_on_solid ( )
inline

◆ use_block_triangular_version_with_solid_on_fluid()

void oomph::FSIPreconditioner::use_block_triangular_version_with_solid_on_fluid ( )
inline

Member Data Documentation

◆ Allow_multiple_element_type_in_navier_stokes_mesh

bool oomph::FSIPreconditioner::Allow_multiple_element_type_in_navier_stokes_mesh
private

Flag to indicate if there are multiple element types in the Navier-Stokes mesh.

Referenced by FSIPreconditioner(), set_navier_stokes_mesh(), and setup().

◆ Allow_multiple_element_type_in_wall_mesh

bool oomph::FSIPreconditioner::Allow_multiple_element_type_in_wall_mesh
private

◆ Doc_time

bool oomph::FSIPreconditioner::Doc_time
private

Set Doc_time to true for outputting results of timings.

Referenced by disable_doc_time(), enable_doc_time(), FSIPreconditioner(), and setup().

◆ Matrix_vector_product_0_1_pt

MatrixVectorProduct* oomph::FSIPreconditioner::Matrix_vector_product_0_1_pt
private

Pointer to fluid/solid interaction matrix.

Referenced by FSIPreconditioner(), preconditioner_solve(), setup(), and ~FSIPreconditioner().

◆ Matrix_vector_product_1_0_pt

MatrixVectorProduct* oomph::FSIPreconditioner::Matrix_vector_product_1_0_pt
private

Pointer to solid/fluid solid interaction matrix.

Referenced by FSIPreconditioner(), preconditioner_solve(), setup(), and ~FSIPreconditioner().

◆ Navier_stokes_mesh_pt

Mesh* oomph::FSIPreconditioner::Navier_stokes_mesh_pt
private

Pointer to the navier stokes mesh.

Referenced by FSIPreconditioner(), set_navier_stokes_mesh(), and setup().

◆ Navier_stokes_preconditioner_pt

NavierStokesSchurComplementPreconditioner* oomph::FSIPreconditioner::Navier_stokes_preconditioner_pt
private

Pointer the Navier Stokes preconditioner (inexact solver)

Referenced by FSIPreconditioner(), navier_stokes_preconditioner_pt(), preconditioner_solve(), setup(), and ~FSIPreconditioner().

◆ Preconditioner_has_been_setup

bool oomph::FSIPreconditioner::Preconditioner_has_been_setup
private

Boolean indicating the preconditioner has been set up.

Referenced by FSIPreconditioner(), and setup().

◆ Retain_fluid_onto_solid_terms

bool oomph::FSIPreconditioner::Retain_fluid_onto_solid_terms
private

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

Referenced by FSIPreconditioner(), preconditioner_solve(), setup(), use_block_diagonal_version(), use_block_triangular_version_with_fluid_on_solid(), and use_block_triangular_version_with_solid_on_fluid().

◆ Retain_solid_onto_fluid_terms

bool oomph::FSIPreconditioner::Retain_solid_onto_fluid_terms
private

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

Referenced by FSIPreconditioner(), preconditioner_solve(), setup(), use_block_diagonal_version(), use_block_triangular_version_with_fluid_on_solid(), and use_block_triangular_version_with_solid_on_fluid().

◆ Solid_preconditioner_pt

Preconditioner* oomph::FSIPreconditioner::Solid_preconditioner_pt
private

Pointer to the solid preconditioner (inexact solver)

Referenced by FSIPreconditioner(), preconditioner_solve(), set_solid_preconditioner_pt(), setup(), solid_preconditioner_pt(), and ~FSIPreconditioner().

◆ Wall_mesh_pt

Mesh* oomph::FSIPreconditioner::Wall_mesh_pt
private

pointer to the solid mesh

Referenced by FSIPreconditioner(), set_wall_mesh(), and setup().


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