oomph::PseudoElasticFSIPreconditioner Class Reference

#include <pseudo_elastic_fsi_preconditioner.h>

+ Inheritance diagram for oomph::PseudoElasticFSIPreconditioner:

Public Member Functions

 PseudoElasticFSIPreconditioner (const unsigned &dim, Problem *problem_pt)
 
virtual ~PseudoElasticFSIPreconditioner ()
 
 PseudoElasticFSIPreconditioner (const PseudoElasticFSIPreconditioner &)=delete
 Broken copy constructor. More...
 
void clean_up_memory ()
 Broken assignment operator. More...
 
void setup ()
 Setup the precoonditioner. More...
 
void preconditioner_solve (const DoubleVector &r, DoubleVector &z)
 Apply the preconditioner. More...
 
void set_fluid_and_pseudo_elastic_mesh_pt (Mesh *mesh_pt)
 specify the mesh containing the combined fluid/pseudo solid elements More...
 
void set_solid_mesh_pt (Mesh *mesh_pt)
 specify the mesh containing the solid elements More...
 
void set_lagrange_multiplier_mesh_pt (Mesh *mesh_pt)
 specify the mesh containing the lagrange multiplier elements More...
 
void set_solid_preconditioner (Preconditioner *prec_pt)
 
PseudoElasticPreconditioner *const pseudo_elastic_preconditioner_pt ()
 Access function to the pseudo elastic subsidiary preconditioner. More...
 
NavierStokesSchurComplementPreconditioner *const navier_stokes_schur_complement_preconditioner_pt ()
 Access function to the Navier Stokes Schur complement preconditioner. More...
 
void enable_navier_stokes_schur_complement_preconditioner ()
 
void disable_navier_stokes_schur_complement_preconditioner ()
 
- 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 Attributes

PseudoElasticPreconditionerPseudo_elastic_preconditioner_pt
 pointer to the pseudo solid preconditioner More...
 
PreconditionerNavier_stokes_preconditioner_pt
 pointer to the navier stokes precondtioner More...
 
NavierStokesSchurComplementPreconditionerNavier_stokes_schur_complement_preconditioner_pt
 Navier Stokes Schur complement preconditioner. More...
 
PreconditionerSolid_preconditioner_pt
 pointer to the solid preconditioner More...
 
bool Using_default_solid_preconditioner
 
bool Solid_preconditioner_is_block_preconditioner
 
MatrixVectorProductFluid_pseudo_elastic_matvec_pt
 fluid onto pseudosolid matrix vector operator More...
 
MatrixVectorProductSolid_fluid_matvec_pt
 solid onto fluid matrix vector operatio More...
 
MatrixVectorProductSolid_pseudo_elastic_matvec_pt
 solid onto pseudo solid matrix vector operatio More...
 
MatrixVectorProductLagrange_solid_matvec_pt
 
MeshFluid_and_pseudo_elastic_mesh_pt
 Mesh containing the combined fluid and pseudo solid element. More...
 
MeshSolid_mesh_pt
 Mesh containing the solid elements. More...
 
MeshLagrange_multiplier_mesh_pt
 Mesh containing the lagrange multiplier elements. More...
 
unsigned Dim
 the dimension of the fluid More...
 
bool Use_navier_stokes_schur_complement_preconditioner
 

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

Preconditioner for FSI problems with pseudo-elastic fluid node updates. Note: NavierStokesSchurComplementPreconditioner is applied to the Navier Stokes subsidiary system. Default solid preconditioner is SuperLUPreconditioner. Enumeration of Elastic DOF types in the Pseudo-Elastic Elements The method get_dof_types_for_unknowns() must be implemented such that DOFs subject be Lagrange multiplier and DOFs NOT subject to Lagrange multiplier have different labels. For example in a 3D problem there are 6 DOF types and the following labelling must be implemented: 0 - x displacement (without lagr mult traction) 1 - y displacement (without lagr mult traction) 2 - z displacement (without lagr mult traction) 3 - x displacement (with lagr mult traction) 4 - y displacement (with lagr mult traction) 5 - z displacement (with lagr mult traction)

Constructor & Destructor Documentation

◆ PseudoElasticFSIPreconditioner() [1/2]

oomph::PseudoElasticFSIPreconditioner::PseudoElasticFSIPreconditioner ( const unsigned dim,
Problem problem_pt 
)
inline

constructor - just set defaults. Specify the spatial dimension of the fluid and a (non-const) problem pointer needed for the underlying NavierStokesSchurComplementPreconditioner.

68  : Dim(dim)
69  {
71 
72  // set the number of meshes
73  this->set_nmesh(3);
74 
75  // null pointers
77  Solid_mesh_pt = 0;
79 
80  // create the pseudo solid preconditioner
81  Pseudo_elastic_preconditioner_pt = new PseudoElasticPreconditioner();
82 
83  // using Schur complement preconditioner for NS
84  Navier_stokes_preconditioner_pt = new SuperLUPreconditioner;
86  new NavierStokesSchurComplementPreconditioner(problem_pt);
87 
88  // set defaults
90 
91  // default super lu
92  Solid_preconditioner_pt = new SuperLUPreconditioner;
93 
94  // create the matrix vector product operatrs
95  Solid_fluid_matvec_pt = new MatrixVectorProduct;
96  Solid_pseudo_elastic_matvec_pt = new MatrixVectorProduct;
97  Fluid_pseudo_elastic_matvec_pt = new MatrixVectorProduct;
98  Lagrange_solid_matvec_pt = new MatrixVectorProduct;
99  }
void set_nmesh(const unsigned &n)
Definition: block_preconditioner.h:2851
MatrixVectorProduct * Solid_pseudo_elastic_matvec_pt
solid onto pseudo solid matrix vector operatio
Definition: pseudo_elastic_fsi_preconditioner.h:234
Mesh * Lagrange_multiplier_mesh_pt
Mesh containing the lagrange multiplier elements.
Definition: pseudo_elastic_fsi_preconditioner.h:246
MatrixVectorProduct * Lagrange_solid_matvec_pt
Definition: pseudo_elastic_fsi_preconditioner.h:237
Preconditioner * Solid_preconditioner_pt
pointer to the solid preconditioner
Definition: pseudo_elastic_fsi_preconditioner.h:217
NavierStokesSchurComplementPreconditioner * Navier_stokes_schur_complement_preconditioner_pt
Navier Stokes Schur complement preconditioner.
Definition: pseudo_elastic_fsi_preconditioner.h:214
Preconditioner * Navier_stokes_preconditioner_pt
pointer to the navier stokes precondtioner
Definition: pseudo_elastic_fsi_preconditioner.h:210
MatrixVectorProduct * Fluid_pseudo_elastic_matvec_pt
fluid onto pseudosolid matrix vector operator
Definition: pseudo_elastic_fsi_preconditioner.h:228
MatrixVectorProduct * Solid_fluid_matvec_pt
solid onto fluid matrix vector operatio
Definition: pseudo_elastic_fsi_preconditioner.h:231
Mesh * Fluid_and_pseudo_elastic_mesh_pt
Mesh containing the combined fluid and pseudo solid element.
Definition: pseudo_elastic_fsi_preconditioner.h:240
bool Use_navier_stokes_schur_complement_preconditioner
Definition: pseudo_elastic_fsi_preconditioner.h:254
bool Using_default_solid_preconditioner
Definition: pseudo_elastic_fsi_preconditioner.h:221
unsigned Dim
the dimension of the fluid
Definition: pseudo_elastic_fsi_preconditioner.h:249
PseudoElasticPreconditioner * Pseudo_elastic_preconditioner_pt
pointer to the pseudo solid preconditioner
Definition: pseudo_elastic_fsi_preconditioner.h:207
Mesh * Solid_mesh_pt
Mesh containing the solid elements.
Definition: pseudo_elastic_fsi_preconditioner.h:243

References Fluid_and_pseudo_elastic_mesh_pt, Fluid_pseudo_elastic_matvec_pt, Lagrange_multiplier_mesh_pt, Lagrange_solid_matvec_pt, Navier_stokes_preconditioner_pt, Navier_stokes_schur_complement_preconditioner_pt, Pseudo_elastic_preconditioner_pt, oomph::BlockPreconditioner< CRDoubleMatrix >::set_nmesh(), Solid_fluid_matvec_pt, Solid_mesh_pt, Solid_preconditioner_pt, Solid_pseudo_elastic_matvec_pt, Use_navier_stokes_schur_complement_preconditioner, and Using_default_solid_preconditioner.

◆ ~PseudoElasticFSIPreconditioner()

virtual oomph::PseudoElasticFSIPreconditioner::~PseudoElasticFSIPreconditioner ( )
inlinevirtual
103  {
104  // clean the memory
105  this->clean_up_memory();
106 
107  // delete the pseudo solid preconditioner
109 
110  // delete the navier stokes preconditioner
113 
114  // delete the solid preconditioner if default
116  {
118  }
119 
120  // delete the matrix vector product operators
122  delete Solid_fluid_matvec_pt;
125  }
void clean_up_memory()
Broken assignment operator.
Definition: pseudo_elastic_fsi_preconditioner.cc:34

References clean_up_memory(), Fluid_pseudo_elastic_matvec_pt, Lagrange_solid_matvec_pt, Navier_stokes_preconditioner_pt, Navier_stokes_schur_complement_preconditioner_pt, Pseudo_elastic_preconditioner_pt, Solid_fluid_matvec_pt, Solid_preconditioner_pt, Solid_pseudo_elastic_matvec_pt, and Using_default_solid_preconditioner.

◆ PseudoElasticFSIPreconditioner() [2/2]

oomph::PseudoElasticFSIPreconditioner::PseudoElasticFSIPreconditioner ( const PseudoElasticFSIPreconditioner )
delete

Broken copy constructor.

Member Function Documentation

◆ clean_up_memory()

void oomph::PseudoElasticFSIPreconditioner::clean_up_memory ( )
virtual

Broken assignment operator.

clean up memory method

Reimplemented from oomph::Preconditioner.

35  {
36  // wipe the preconditioner
41 
42  // clean the subsidiary matvec operators
47  }
void clean_up_memory()
clear the memory
Definition: matrix_vector_product.h:77
void clean_up_memory()
Helper function to delete preconditioner data.
Definition: navier_stokes_preconditioners.cc:1672
virtual void clean_up_memory()
Clean up memory (empty). Generic interface function.
Definition: preconditioner.h:147
void clean_up_memory()
Clears the memory.
Definition: pseudo_elastic_preconditioner.cc:527

References oomph::MatrixVectorProduct::clean_up_memory(), oomph::Preconditioner::clean_up_memory(), oomph::PseudoElasticPreconditioner::clean_up_memory(), oomph::NavierStokesSchurComplementPreconditioner::clean_up_memory(), Fluid_pseudo_elastic_matvec_pt, Lagrange_solid_matvec_pt, Navier_stokes_preconditioner_pt, Navier_stokes_schur_complement_preconditioner_pt, Pseudo_elastic_preconditioner_pt, Solid_fluid_matvec_pt, Solid_preconditioner_pt, and Solid_pseudo_elastic_matvec_pt.

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

◆ disable_navier_stokes_schur_complement_preconditioner()

void oomph::PseudoElasticFSIPreconditioner::disable_navier_stokes_schur_complement_preconditioner ( )
inline

Call to use the SuperLUPreconditioner is used for the Navier Stokes subsidiary system.

201  {
203  }

References Use_navier_stokes_schur_complement_preconditioner.

Referenced by FSIChannelWithLeafletProblem< ELEMENT >::set_iterative_solver().

◆ enable_navier_stokes_schur_complement_preconditioner()

void oomph::PseudoElasticFSIPreconditioner::enable_navier_stokes_schur_complement_preconditioner ( )
inline

◆ navier_stokes_schur_complement_preconditioner_pt()

NavierStokesSchurComplementPreconditioner* const oomph::PseudoElasticFSIPreconditioner::navier_stokes_schur_complement_preconditioner_pt ( )
inline

◆ preconditioner_solve()

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

Apply the preconditioner.

Implements oomph::Preconditioner.

282  {
283  // apply the "pseudo solid" component of the pseudo solid preconditioner
285 
286  // apply the fluid on pseudo solid matrix vector product operator
287  DoubleVector x;
288  this->get_block_vector(2, z, x);
289  DoubleVector y;
291  DoubleVector w;
293  x.clear();
294  this->get_block_vector(0, r, x);
295  x -= y;
296  y.clear();
297 
298  // storage for a copy of z
299  DoubleVector z_copy;
300 
301  // apply the ns preconditioner
303  {
304  z_copy.build(z);
305  this->return_block_vector(0, x, z_copy);
306  x.clear();
308  z_copy, z);
309  z_copy.clear();
310  }
311  else
312  {
314  x.clear();
315  this->return_block_vector(0, y, z);
316  y.clear();
317  }
318 
319  // apply the solid onto fluid matrix vector product operator
320  this->get_block_vector(0, z, x);
322  x.clear();
323  this->get_block_vector(1, r, x);
324  x -= y;
325  y.clear();
326 
327  // apply the result of the solid onto pseudo solid matrix vector product
328  x -= w;
329  w.clear();
330 
331  // apply the solid preconditioner
333  {
334  DoubleVector z_copy(z);
335  this->return_block_vector(1, x, z_copy);
336  x.clear();
337  (dynamic_cast<GeneralPurposeBlockPreconditioner<CRDoubleMatrix>*>(
339  ->preconditioner_solve(z_copy, z);
340  this->get_block_vector(1, z, y);
341  }
342  else
343  {
345  x.clear();
346  this->return_block_vector(1, y, z);
347  }
348 
349  // apply the lagrange multiplier solid matrix vector product operator
351  y.clear();
352  this->get_block_vector(3, r, y);
353  y -= x;
354  x.clear();
355  z_copy.build(z);
356  this->return_block_vector(3, y, z_copy);
357 
358  // apply the lagrange multiplier compenent of the pseudo solid
359  // preconditioner
361  z_copy, z);
362  z_copy.clear();
363  }
std::vector< double > DoubleVector
loads clump configuration
Definition: ClumpInput.h:26
RowVector3d w
Definition: Matrix_resize_int.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
bool Solid_preconditioner_is_block_preconditioner
Definition: pseudo_elastic_fsi_preconditioner.h:225
void lagrange_multiplier_preconditioner_solve(const DoubleVector &r, DoubleVector &z)
Apply the lagrange multiplier subsidiary preconditioner.
Definition: pseudo_elastic_preconditioner.cc:503
void elastic_preconditioner_solve(const DoubleVector &r, DoubleVector &z)
Apply the elastic subsidiary preconditioner.
Definition: pseudo_elastic_preconditioner.cc:493
Scalar * y
Definition: level1_cplx_impl.h:128
r
Definition: UniformPSDSelfTest.py:20
list x
Definition: plotDoE.py:28

References oomph::DoubleVector::build(), oomph::DoubleVector::clear(), oomph::PseudoElasticPreconditioner::elastic_preconditioner_solve(), Fluid_pseudo_elastic_matvec_pt, oomph::BlockPreconditioner< CRDoubleMatrix >::get_block_vector(), oomph::PseudoElasticPreconditioner::lagrange_multiplier_preconditioner_solve(), Lagrange_solid_matvec_pt, oomph::MatrixVectorProduct::multiply(), Navier_stokes_preconditioner_pt, Navier_stokes_schur_complement_preconditioner_pt, oomph::NavierStokesSchurComplementPreconditioner::preconditioner_solve(), oomph::Preconditioner::preconditioner_solve(), Pseudo_elastic_preconditioner_pt, UniformPSDSelfTest::r, oomph::BlockPreconditioner< CRDoubleMatrix >::return_block_vector(), Solid_fluid_matvec_pt, Solid_preconditioner_is_block_preconditioner, Solid_preconditioner_pt, Solid_pseudo_elastic_matvec_pt, Use_navier_stokes_schur_complement_preconditioner, w, plotDoE::x, and y.

◆ pseudo_elastic_preconditioner_pt()

PseudoElasticPreconditioner* const oomph::PseudoElasticFSIPreconditioner::pseudo_elastic_preconditioner_pt ( )
inline

◆ set_fluid_and_pseudo_elastic_mesh_pt()

void oomph::PseudoElasticFSIPreconditioner::set_fluid_and_pseudo_elastic_mesh_pt ( Mesh mesh_pt)
inline

◆ set_lagrange_multiplier_mesh_pt()

void oomph::PseudoElasticFSIPreconditioner::set_lagrange_multiplier_mesh_pt ( Mesh mesh_pt)
inline

◆ set_solid_mesh_pt()

void oomph::PseudoElasticFSIPreconditioner::set_solid_mesh_pt ( Mesh mesh_pt)
inline

◆ set_solid_preconditioner()

void oomph::PseudoElasticFSIPreconditioner::set_solid_preconditioner ( Preconditioner prec_pt)
inline

speicify a non default solid preconditioner. This preconditioner will not delete it

170  {
172  {
174  }
175  Solid_preconditioner_pt = prec_pt;
177  }

References Solid_preconditioner_pt, and Using_default_solid_preconditioner.

Referenced by PseudoElasticCollapsibleChannelProblem< FLUID_ELEMENT, SOLID_ELEMENT >::set_pseudo_elastic_fsi_solver(), and set_pseudo_elastic_fsi_solver().

◆ setup()

void oomph::PseudoElasticFSIPreconditioner::setup ( )
virtual

Setup the precoonditioner.

Implements oomph::Preconditioner.

53  {
54  // clean the memory
55  this->clean_up_memory();
56 
57 #ifdef PARANOID
58  // paranoid check that the meshes have been set
60  {
61  std::ostringstream error_message;
62  error_message << "The fluid and pseudo elastic mesh must be set.";
63  throw OomphLibError(
64  error_message.str(), OOMPH_CURRENT_FUNCTION, OOMPH_EXCEPTION_LOCATION);
65  }
66  if (Solid_mesh_pt == 0)
67  {
68  std::ostringstream error_message;
69  error_message << "The solid mesh must be set.";
70  throw OomphLibError(
71  error_message.str(), OOMPH_CURRENT_FUNCTION, OOMPH_EXCEPTION_LOCATION);
72  }
74  {
75  std::ostringstream error_message;
76  error_message << "The Lagrange multiplier mesh must be set.";
77  throw OomphLibError(
78  error_message.str(), OOMPH_CURRENT_FUNCTION, OOMPH_EXCEPTION_LOCATION);
79  }
80 #endif
81 
82  // add the meshes
84  this->set_mesh(1, Solid_mesh_pt);
86 
87  // determine the number of fluid dofs
88  unsigned nfluid_dof = Dim + 1;
89 
90  // determine the number of pseudo solid dofs
91  unsigned npseudo_elastic_dof = this->ndof_types_in_mesh(0) - nfluid_dof;
92 
93  // determine the number of solid dofs
94  unsigned nsolid_dof = this->ndof_types_in_mesh(1);
95 
96  // determine the number of lagrange multiplier dofs
97  unsigned nlagr_mult_dof = this->ndof_types_in_mesh(2);
98 
99  // total number of dof types
100  unsigned ntotal_dof =
101  nfluid_dof + npseudo_elastic_dof + nsolid_dof + nlagr_mult_dof;
102 
103  // setup the block lookup scheme
104  // block 0 - fluid
105  // 1 - solid
106  // 2 - pseudo solid inc. lagrange mult
107  Vector<unsigned> dof_to_block_map(ntotal_dof, 0);
108  int c = nfluid_dof;
109  for (unsigned i = 0; i < npseudo_elastic_dof; i++)
110  {
111  dof_to_block_map[c] = 2;
112  c++;
113  }
114  for (unsigned i = 0; i < nsolid_dof; i++)
115  {
116  dof_to_block_map[c] = 1;
117  c++;
118  }
119  for (unsigned i = 0; i < nlagr_mult_dof; i++)
120  {
121  dof_to_block_map[c] = 3;
122  c++;
123  }
124 
125  // Recast Jacobian matrix to CRDoubleMatrix
126  CRDoubleMatrix* cr_matrix_pt = dynamic_cast<CRDoubleMatrix*>(matrix_pt());
127 #ifdef PARANOID
128  if (cr_matrix_pt == 0)
129  {
130  std::ostringstream error_message;
131  error_message << "FSIPreconditioner only works with"
132  << " CRDoubleMatrix matrices" << std::endl;
133  throw OomphLibError(
134  error_message.str(), OOMPH_CURRENT_FUNCTION, OOMPH_EXCEPTION_LOCATION);
135  }
136 #endif
137 
138  // Call block setup for this preconditioner
139  this->block_setup(dof_to_block_map);
140 
141  // SETUP THE PRECONDITIONERS
142  // =========================
143 
144  // setup the navier stokes preconditioner
146  {
149 
150  Vector<unsigned> ns_dof_list(nfluid_dof, 0);
151  for (unsigned i = 0; i < nfluid_dof; i++)
152  {
153  ns_dof_list[i] = i;
154  }
155 
157  ->turn_into_subsidiary_block_preconditioner(this, ns_dof_list);
158 
160  matrix_pt());
161  }
162  else
163  {
164  CRDoubleMatrix* ns_matrix_pt = new CRDoubleMatrix;
165  this->get_block(0, 0, *ns_matrix_pt);
166 
167  Navier_stokes_preconditioner_pt->setup(ns_matrix_pt);
168  delete ns_matrix_pt;
169  ns_matrix_pt = 0;
170  }
171 
172  // next the solid preconditioner
173  if (dynamic_cast<BlockPreconditioner<CRDoubleMatrix>*>(
175  {
177  GeneralPurposeBlockPreconditioner<CRDoubleMatrix>*
178  solid_block_preconditioner_pt =
179  dynamic_cast<GeneralPurposeBlockPreconditioner<CRDoubleMatrix>*>(
181 
182  if (solid_block_preconditioner_pt != 0)
183  {
184  unsigned offset = nfluid_dof + npseudo_elastic_dof;
185  Vector<unsigned> solid_prec_dof_list(nsolid_dof);
186  for (unsigned i = 0; i < nsolid_dof; i++)
187  {
188  solid_prec_dof_list[i] = offset + i;
189  }
190  solid_block_preconditioner_pt
191  ->turn_into_subsidiary_block_preconditioner(this,
192  solid_prec_dof_list);
193  solid_block_preconditioner_pt->setup(cr_matrix_pt);
194  }
195  else
196  {
197  std::ostringstream error_message;
198  error_message << "If the (real) solid preconditioner is a "
199  << "BlockPreconditioner then is must be a "
200  << "GeneralPurposeBlockPreconditioner";
201  throw OomphLibError(error_message.str(),
204  }
205  }
206  // otherwise it is a solid preconditioner
207  else
208  {
210  CRDoubleMatrix* s_matrix_pt = new CRDoubleMatrix;
211  this->get_block(1, 1, *s_matrix_pt);
212  Solid_preconditioner_pt->setup(s_matrix_pt);
213  delete s_matrix_pt;
214  s_matrix_pt = 0;
215  }
216 
217  // next the pseudo solid preconditioner
218  unsigned ndof_for_pseudo_elastic_prec = Dim * 3;
219  Vector<unsigned> pseudo_elastic_prec_dof_list(ndof_for_pseudo_elastic_prec,
220  0);
221  for (unsigned i = 0; i < Dim * 2; i++)
222  {
223  pseudo_elastic_prec_dof_list[i] = nfluid_dof + i;
224  }
225  for (unsigned i = 0; i < Dim; i++)
226  {
227  pseudo_elastic_prec_dof_list[i + Dim * 2] =
228  nfluid_dof + npseudo_elastic_dof + nsolid_dof + i;
229  }
231  this, pseudo_elastic_prec_dof_list);
236  Pseudo_elastic_preconditioner_pt->Preconditioner::setup(matrix_pt());
237 
238  // SETUP THE MATRIX VECTOR PRODUCT OPERATORS
239  // =========================================
240 
241  // setup the fluid pseudo-solid matvec operator
242  CRDoubleMatrix* fp_matrix_pt = new CRDoubleMatrix;
243  get_block(0, 2, *fp_matrix_pt);
244  // Fluid_pseudo_elastic_matvec_pt->setup(fp_matrix_pt);
246  Fluid_pseudo_elastic_matvec_pt, fp_matrix_pt, 2);
247  delete fp_matrix_pt;
248  fp_matrix_pt = 0;
249 
250  // setup the solid fluid matvec operator
251  CRDoubleMatrix* sf_matrix_pt = new CRDoubleMatrix;
252  get_block(1, 0, *sf_matrix_pt);
253  // Solid_fluid_matvec_pt->setup(sf_matrix_pt);
254  this->setup_matrix_vector_product(Solid_fluid_matvec_pt, sf_matrix_pt, 0);
255  delete sf_matrix_pt;
256  sf_matrix_pt = 0;
257 
258  // setup the solid pseudo-solid matvec operator
259  CRDoubleMatrix* sp_matrix_pt = new CRDoubleMatrix;
260  get_block(1, 2, *sp_matrix_pt);
261  // Solid_pseudo_elastic_matvec_pt->setup(sp_matrix_pt);
263  Solid_pseudo_elastic_matvec_pt, sp_matrix_pt, 2);
264  delete sp_matrix_pt;
265  sp_matrix_pt = 0;
266 
267  // build the lagrange solid matvec operator
268  CRDoubleMatrix* ls_matrix_pt = new CRDoubleMatrix;
269  get_block(3, 1, *ls_matrix_pt);
270  // Lagrange_solid_matvec_pt->setup(ls_matrix_pt);
272  Lagrange_solid_matvec_pt, ls_matrix_pt, 1);
273  delete ls_matrix_pt;
274  ls_matrix_pt = 0;
275  }
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 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
void set_lagrange_multiplier_mesh(Mesh *mesh_pt)
Definition: pseudo_elastic_preconditioner.h:185
void set_elastic_mesh(Mesh *mesh_pt)
Definition: pseudo_elastic_preconditioner.h:178
int c
Definition: calibrate.py:100
#define OOMPH_EXCEPTION_LOCATION
Definition: oomph_definitions.h:61
#define OOMPH_CURRENT_FUNCTION
Definition: oomph_definitions.h:86

References oomph::BlockPreconditioner< CRDoubleMatrix >::block_setup(), calibrate::c, clean_up_memory(), Dim, Fluid_and_pseudo_elastic_mesh_pt, Fluid_pseudo_elastic_matvec_pt, oomph::BlockPreconditioner< CRDoubleMatrix >::get_block(), i, Lagrange_multiplier_mesh_pt, Lagrange_solid_matvec_pt, oomph::BlockPreconditioner< CRDoubleMatrix >::matrix_pt(), Navier_stokes_preconditioner_pt, Navier_stokes_schur_complement_preconditioner_pt, oomph::BlockPreconditioner< CRDoubleMatrix >::ndof_types_in_mesh(), OOMPH_CURRENT_FUNCTION, OOMPH_EXCEPTION_LOCATION, Pseudo_elastic_preconditioner_pt, oomph::PseudoElasticPreconditioner::set_elastic_mesh(), oomph::PseudoElasticPreconditioner::set_lagrange_multiplier_mesh(), oomph::BlockPreconditioner< CRDoubleMatrix >::set_mesh(), oomph::NavierStokesSchurComplementPreconditioner::set_navier_stokes_mesh(), oomph::Preconditioner::setup(), oomph::BlockPreconditioner< CRDoubleMatrix >::setup_matrix_vector_product(), Solid_fluid_matvec_pt, Solid_mesh_pt, Solid_preconditioner_is_block_preconditioner, Solid_preconditioner_pt, Solid_pseudo_elastic_matvec_pt, oomph::BlockPreconditioner< MATRIX >::turn_into_subsidiary_block_preconditioner(), and Use_navier_stokes_schur_complement_preconditioner.

Member Data Documentation

◆ Dim

unsigned oomph::PseudoElasticFSIPreconditioner::Dim
private

the dimension of the fluid

Referenced by setup().

◆ Fluid_and_pseudo_elastic_mesh_pt

Mesh* oomph::PseudoElasticFSIPreconditioner::Fluid_and_pseudo_elastic_mesh_pt
private

Mesh containing the combined fluid and pseudo solid element.

Referenced by PseudoElasticFSIPreconditioner(), set_fluid_and_pseudo_elastic_mesh_pt(), and setup().

◆ Fluid_pseudo_elastic_matvec_pt

MatrixVectorProduct* oomph::PseudoElasticFSIPreconditioner::Fluid_pseudo_elastic_matvec_pt
private

fluid onto pseudosolid matrix vector operator

Referenced by clean_up_memory(), preconditioner_solve(), PseudoElasticFSIPreconditioner(), setup(), and ~PseudoElasticFSIPreconditioner().

◆ Lagrange_multiplier_mesh_pt

Mesh* oomph::PseudoElasticFSIPreconditioner::Lagrange_multiplier_mesh_pt
private

Mesh containing the lagrange multiplier elements.

Referenced by PseudoElasticFSIPreconditioner(), set_lagrange_multiplier_mesh_pt(), and setup().

◆ Lagrange_solid_matvec_pt

MatrixVectorProduct* oomph::PseudoElasticFSIPreconditioner::Lagrange_solid_matvec_pt
private

◆ Navier_stokes_preconditioner_pt

Preconditioner* oomph::PseudoElasticFSIPreconditioner::Navier_stokes_preconditioner_pt
private

◆ Navier_stokes_schur_complement_preconditioner_pt

NavierStokesSchurComplementPreconditioner* oomph::PseudoElasticFSIPreconditioner::Navier_stokes_schur_complement_preconditioner_pt
private

◆ Pseudo_elastic_preconditioner_pt

PseudoElasticPreconditioner* oomph::PseudoElasticFSIPreconditioner::Pseudo_elastic_preconditioner_pt
private

◆ Solid_fluid_matvec_pt

MatrixVectorProduct* oomph::PseudoElasticFSIPreconditioner::Solid_fluid_matvec_pt
private

◆ Solid_mesh_pt

Mesh* oomph::PseudoElasticFSIPreconditioner::Solid_mesh_pt
private

Mesh containing the solid elements.

Referenced by PseudoElasticFSIPreconditioner(), set_solid_mesh_pt(), and setup().

◆ Solid_preconditioner_is_block_preconditioner

bool oomph::PseudoElasticFSIPreconditioner::Solid_preconditioner_is_block_preconditioner
private

boolean flag to indicate whether the Solid preconditioner is a block preconditioner

Referenced by preconditioner_solve(), and setup().

◆ Solid_preconditioner_pt

Preconditioner* oomph::PseudoElasticFSIPreconditioner::Solid_preconditioner_pt
private

◆ Solid_pseudo_elastic_matvec_pt

MatrixVectorProduct* oomph::PseudoElasticFSIPreconditioner::Solid_pseudo_elastic_matvec_pt
private

solid onto pseudo solid matrix vector operatio

Referenced by clean_up_memory(), preconditioner_solve(), PseudoElasticFSIPreconditioner(), setup(), and ~PseudoElasticFSIPreconditioner().

◆ Use_navier_stokes_schur_complement_preconditioner

bool oomph::PseudoElasticFSIPreconditioner::Use_navier_stokes_schur_complement_preconditioner
private

If true the Navier Stokes Schur complement preconditioner is used. Otherwise SuperLUPreconditioner is used for the Navier Stokes subsidiary system.

Referenced by disable_navier_stokes_schur_complement_preconditioner(), enable_navier_stokes_schur_complement_preconditioner(), preconditioner_solve(), PseudoElasticFSIPreconditioner(), and setup().

◆ Using_default_solid_preconditioner

bool oomph::PseudoElasticFSIPreconditioner::Using_default_solid_preconditioner
private

boolean flag to indicate whether default Solid preconditioner is used

Referenced by PseudoElasticFSIPreconditioner(), set_solid_preconditioner(), and ~PseudoElasticFSIPreconditioner().


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