oomph::SimpleFSIPreconditioner< MATRIX > Class Template Reference

#include <fsi_preconditioners.h>

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

Public Member Functions

 SimpleFSIPreconditioner ()
 Constructor. More...
 
 ~SimpleFSIPreconditioner ()
 Destructor: Clean up. More...
 
 SimpleFSIPreconditioner (const SimpleFSIPreconditioner &)=delete
 Broken copy constructor. More...
 
void set_navier_stokes_mesh (Mesh *mesh_pt, const bool &allow_multiple_element_type_in_navier_stokes_mesh=false)
 Broken assignment operator. More...
 
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...
 
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 ()
 
- Public Member Functions inherited from oomph::BlockPreconditioner< MATRIX >
 BlockPreconditioner ()
 Constructor. More...
 
virtual ~BlockPreconditioner ()
 Destructor. More...
 
 BlockPreconditioner (const BlockPreconditioner &)=delete
 Broken copy constructor. More...
 
void operator= (const BlockPreconditioner &)=delete
 Broken assignment operator. More...
 
MATRIX * matrix_pt () const
 
void turn_on_recursive_debug_flag ()
 
void turn_off_recursive_debug_flag ()
 
void turn_on_debug_flag ()
 Toggles on the debug flag. More...
 
void turn_off_debug_flag ()
 Toggles off the debug flag. More...
 
void turn_into_subsidiary_block_preconditioner (BlockPreconditioner< MATRIX > *master_block_prec_pt, const Vector< unsigned > &doftype_in_master_preconditioner_coarse)
 
void turn_into_subsidiary_block_preconditioner (BlockPreconditioner< MATRIX > *master_block_prec_pt, const Vector< unsigned > &doftype_in_master_preconditioner_coarse, const Vector< Vector< unsigned >> &doftype_coarsen_map_coarse)
 
virtual void block_setup ()
 
void block_setup (const Vector< unsigned > &dof_to_block_map)
 
void get_block (const unsigned &i, const unsigned &j, MATRIX &output_matrix, const bool &ignore_replacement_block=false) const
 
MATRIX get_block (const unsigned &i, const unsigned &j, const bool &ignore_replacement_block=false) const
 
void set_master_matrix_pt (MATRIX *in_matrix_pt)
 Set the matrix_pt in the upper-most master preconditioner. More...
 
void get_block_other_matrix (const unsigned &i, const unsigned &j, MATRIX *in_matrix_pt, MATRIX &output_matrix)
 
void get_blocks (DenseMatrix< bool > &required_blocks, DenseMatrix< MATRIX * > &block_matrix_pt) const
 
void get_dof_level_block (const unsigned &i, const unsigned &j, MATRIX &output_block, const bool &ignore_replacement_block=false) const
 
MATRIX get_concatenated_block (const VectorMatrix< BlockSelector > &selected_block)
 
void get_concatenated_block_vector (const Vector< unsigned > &block_vec_number, const DoubleVector &v, DoubleVector &b)
 
void return_concatenated_block_vector (const Vector< unsigned > &block_vec_number, const DoubleVector &b, DoubleVector &v) const
 Takes concatenated block ordered vector, b, and copies its. More...
 
void get_block_vectors (const Vector< unsigned > &block_vec_number, const DoubleVector &v, Vector< DoubleVector > &s) const
 
void get_block_vectors (const DoubleVector &v, Vector< DoubleVector > &s) const
 
void return_block_vectors (const Vector< unsigned > &block_vec_number, const Vector< DoubleVector > &s, DoubleVector &v) const
 
void return_block_vectors (const Vector< DoubleVector > &s, DoubleVector &v) const
 
void get_block_vector (const unsigned &n, const DoubleVector &v, DoubleVector &b) const
 
void return_block_vector (const unsigned &n, const DoubleVector &b, DoubleVector &v) const
 
void get_block_ordered_preconditioner_vector (const DoubleVector &v, DoubleVector &w)
 
void return_block_ordered_preconditioner_vector (const DoubleVector &w, DoubleVector &v) const
 
unsigned nblock_types () const
 Return the number of block types. More...
 
unsigned ndof_types () const
 Return the total number of DOF types. More...
 
const Meshmesh_pt (const unsigned &i) const
 
unsigned nmesh () const
 
int block_number (const unsigned &i_dof) const
 Return the block number corresponding to a global index i_dof. More...
 
int index_in_block (const unsigned &i_dof) const
 
const LinearAlgebraDistributionblock_distribution_pt (const unsigned &b) const
 Access function to the block distributions (const version). More...
 
LinearAlgebraDistributionblock_distribution_pt (const unsigned b)
 Access function to the block distributions (non-const version). More...
 
LinearAlgebraDistributiondof_block_distribution_pt (const unsigned &b)
 Access function to the dof-level block distributions. More...
 
const LinearAlgebraDistributionmaster_distribution_pt () const
 
unsigned ndof_types_in_mesh (const unsigned &i) const
 
bool is_subsidiary_block_preconditioner () const
 
bool is_master_block_preconditioner () const
 
void set_block_output_to_files (const std::string &basefilename)
 
void disable_block_output_to_files ()
 Turn off output of blocks (by clearing the basefilename string). More...
 
bool block_output_on () const
 Test if output of blocks is on or not. More...
 
void output_blocks_to_files (const std::string &basefilename, const unsigned &precision=8) const
 
void post_block_matrix_assembly_partial_clear ()
 
BlockPreconditioner< MATRIX > * master_block_preconditioner_pt () const
 Access function to the master block preconditioner pt. More...
 
void clear_block_preconditioner_base ()
 
void document ()
 
Vector< Vector< unsigned > > doftype_coarsen_map_fine () const
 
Vector< unsignedget_fine_grain_dof_types_in (const unsigned &i) const
 
unsigned nfine_grain_dof_types_in (const unsigned &i) const
 
MapMatrix< unsigned, CRDoubleMatrix * > replacement_dof_block_pt () const
 Access function to the replaced dof-level blocks. More...
 
void setup_matrix_vector_product (MatrixVectorProduct *matvec_prod_pt, CRDoubleMatrix *block_pt, const Vector< unsigned > &block_col_indices)
 
void setup_matrix_vector_product (MatrixVectorProduct *matvec_prod_pt, CRDoubleMatrix *block_pt, const unsigned &block_col_index)
 
void internal_get_block_ordered_preconditioner_vector (const DoubleVector &v, DoubleVector &w) const
 
void internal_return_block_ordered_preconditioner_vector (const DoubleVector &w, DoubleVector &v) const
 
unsigned internal_nblock_types () const
 
unsigned internal_ndof_types () const
 
void internal_return_block_vector (const unsigned &n, const DoubleVector &b, DoubleVector &v) const
 
void internal_get_block_vector (const unsigned &n, const DoubleVector &v, DoubleVector &b) const
 
void internal_get_block_vectors (const Vector< unsigned > &block_vec_number, const DoubleVector &v, Vector< DoubleVector > &s) const
 
void internal_get_block_vectors (const DoubleVector &v, Vector< DoubleVector > &s) const
 
void internal_return_block_vectors (const Vector< unsigned > &block_vec_number, const Vector< DoubleVector > &s, DoubleVector &v) const
 
void internal_return_block_vectors (const Vector< DoubleVector > &s, DoubleVector &v) const
 
void internal_get_block (const unsigned &i, const unsigned &j, MATRIX &output_block) const
 
int internal_block_number (const unsigned &i_dof) const
 
int internal_index_in_block (const unsigned &i_dof) const
 
const LinearAlgebraDistributioninternal_block_distribution_pt (const unsigned &b) const
 Access function to the internal block distributions. More...
 
void insert_auxiliary_block_distribution (const Vector< unsigned > &block_vec_number, LinearAlgebraDistribution *dist_pt)
 
void block_matrix_test (const unsigned &i, const unsigned &j, const MATRIX *block_matrix_pt) const
 
template<typename myType >
int get_index_of_value (const Vector< myType > &vec, const myType val, const bool sorted=false) const
 
void internal_get_block (const unsigned &block_i, const unsigned &block_j, CRDoubleMatrix &output_block) const
 
void get_dof_level_block (const unsigned &block_i, const unsigned &block_j, CRDoubleMatrix &output_block, const bool &ignore_replacement_block) const
 
- Public Member Functions inherited from oomph::Preconditioner
 Preconditioner ()
 Constructor. More...
 
 Preconditioner (const Preconditioner &)=delete
 Broken copy constructor. More...
 
void operator= (const Preconditioner &)=delete
 Broken assignment operator. More...
 
virtual ~Preconditioner ()
 Destructor (empty) More...
 
virtual void preconditioner_solve_transpose (const DoubleVector &r, DoubleVector &z)
 
void setup (DoubleMatrixBase *matrix_pt)
 
void setup (const Problem *problem_pt, DoubleMatrixBase *matrix_pt)
 
void enable_silent_preconditioner_setup ()
 Set up the block preconditioner quietly! More...
 
void disable_silent_preconditioner_setup ()
 Be verbose in the block preconditioner setup. More...
 
virtual void 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 Member Functions

virtual void identify_required_blocks (DenseMatrix< bool > &required_blocks)
 

Private Attributes

PreconditionerPreconditioner_pt
 Preconditioner (inexact solver) More...
 
bool Retain_solid_onto_fluid_terms
 
bool Retain_fluid_onto_solid_terms
 
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
 Flag for multiple element types in the Navier-Stokes mesh. More...
 
bool Allow_multiple_element_type_in_wall_mesh
 Flag for multiple element types in the Wall mesh. More...
 

Additional Inherited Members

- Protected Member Functions inherited from oomph::BlockPreconditioner< MATRIX >
void set_nmesh (const unsigned &n)
 
void set_mesh (const unsigned &i, const Mesh *const mesh_pt, const bool &allow_multiple_element_type_in_mesh=false)
 
void set_replacement_dof_block (const unsigned &block_i, const unsigned &block_j, CRDoubleMatrix *replacement_dof_block_pt)
 
bool any_mesh_distributed () const
 
int internal_dof_number (const unsigned &i_dof) const
 
unsigned internal_index_in_dof (const unsigned &i_dof) const
 
unsigned internal_block_dimension (const unsigned &b) const
 
unsigned internal_dof_block_dimension (const unsigned &i) const
 
unsigned master_nrow () const
 
unsigned internal_master_dof_number (const unsigned &b) const
 
const LinearAlgebraDistributioninternal_preconditioner_matrix_distribution_pt () const
 
const LinearAlgebraDistributionpreconditioner_matrix_distribution_pt () const
 
- Protected Member Functions inherited from oomph::DistributableLinearAlgebraObject
void clear_distribution ()
 
- Protected Attributes inherited from oomph::BlockPreconditioner< MATRIX >
MapMatrix< unsigned, CRDoubleMatrix * > Replacement_dof_block_pt
 The replacement dof-level blocks. More...
 
Vector< LinearAlgebraDistribution * > Block_distribution_pt
 The distribution for the blocks. More...
 
Vector< Vector< unsigned > > Block_to_dof_map_coarse
 
Vector< Vector< unsigned > > Block_to_dof_map_fine
 Mapping for the block types to the most fine grain dof types. More...
 
Vector< Vector< unsigned > > Doftype_coarsen_map_coarse
 
Vector< Vector< unsigned > > Doftype_coarsen_map_fine
 
Vector< LinearAlgebraDistribution * > Internal_block_distribution_pt
 Storage for the default distribution for each internal block. More...
 
Vector< LinearAlgebraDistribution * > Dof_block_distribution_pt
 
Vector< unsignedAllow_multiple_element_type_in_mesh
 
Vector< const Mesh * > Mesh_pt
 
Vector< unsignedNdof_types_in_mesh
 
unsigned Internal_nblock_types
 
unsigned Internal_ndof_types
 
- Protected Attributes inherited from oomph::Preconditioner
bool Silent_preconditioner_setup
 Boolean to indicate whether or not the build should be done silently. More...
 
std::ostream * Stream_pt
 Pointer to the output stream – defaults to std::cout. More...
 

Detailed Description

template<typename MATRIX>
class oomph::SimpleFSIPreconditioner< MATRIX >

//////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// 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. Blocks are then re-assembled into one global matrix and solved with a direct solver (SuperLU in its incarnation as an exact preconditioner). By default we retain the fluid on solid off diagonal blocks.

Constructor & Destructor Documentation

◆ SimpleFSIPreconditioner() [1/2]

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

Constructor.

488  : BlockPreconditioner<MATRIX>()
489  {
490  // set the mesh pointers
492  Wall_mesh_pt = 0;
493  this->set_nmesh(2);
494 
495  // Default setting: Retain fluid on solid
498 
499  // Null the preconditioner pointer (inexact solver)
500  Preconditioner_pt = 0;
501 
502  // Initially assume that there are no multiple element types in
503  // the same mesh.
506  }
void set_nmesh(const unsigned &n)
Definition: block_preconditioner.h:2851
bool Retain_fluid_onto_solid_terms
Definition: fsi_preconditioners.h:596
Mesh * Wall_mesh_pt
pointer to the solid mesh
Definition: fsi_preconditioners.h:608
bool Retain_solid_onto_fluid_terms
Definition: fsi_preconditioners.h:592
bool Allow_multiple_element_type_in_wall_mesh
Flag for multiple element types in the Wall mesh.
Definition: fsi_preconditioners.h:614
Mesh * Navier_stokes_mesh_pt
Pointer to the navier stokes mesh.
Definition: fsi_preconditioners.h:605
bool Allow_multiple_element_type_in_navier_stokes_mesh
Flag for multiple element types in the Navier-Stokes mesh.
Definition: fsi_preconditioners.h:611
Preconditioner * Preconditioner_pt
Preconditioner (inexact solver)
Definition: fsi_preconditioners.h:588

References oomph::SimpleFSIPreconditioner< MATRIX >::Allow_multiple_element_type_in_navier_stokes_mesh, oomph::SimpleFSIPreconditioner< MATRIX >::Allow_multiple_element_type_in_wall_mesh, oomph::SimpleFSIPreconditioner< MATRIX >::Navier_stokes_mesh_pt, oomph::SimpleFSIPreconditioner< MATRIX >::Preconditioner_pt, oomph::SimpleFSIPreconditioner< MATRIX >::Retain_fluid_onto_solid_terms, oomph::SimpleFSIPreconditioner< MATRIX >::Retain_solid_onto_fluid_terms, oomph::BlockPreconditioner< MATRIX >::set_nmesh(), and oomph::SimpleFSIPreconditioner< MATRIX >::Wall_mesh_pt.

◆ ~SimpleFSIPreconditioner()

template<typename MATRIX >
oomph::SimpleFSIPreconditioner< MATRIX >::~SimpleFSIPreconditioner ( )
inline

Destructor: Clean up.

511  {
512  // Wiping preconditioner (inexact solver) wipes the stored
513  // LU decompositon
514  if (Preconditioner_pt != 0)
515  {
516  delete Preconditioner_pt;
517  Preconditioner_pt = 0;
518  }
519  }

References oomph::SimpleFSIPreconditioner< MATRIX >::Preconditioner_pt.

◆ SimpleFSIPreconditioner() [2/2]

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

Broken copy constructor.

Member Function Documentation

◆ identify_required_blocks()

template<typename MATRIX >
void SimpleFSIPreconditioner< MATRIX >::identify_required_blocks ( DenseMatrix< bool > &  required_blocks)
privatevirtual

Identify the required blocks: Here we only need the momentum, gradient and divergence blocks of the 2x2 block-structured fluid matrix, the 1x1 solid block and the selected FSI-off diagonals.

///////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////// Identify the required blocks: Here we only need the momentum, gradient and divergence blocks of the 2x2 block-structured fluid matrix, the 1x1 solid block and the selected FSI-off diagonals.

634  {
635  // find number of block types
636  unsigned n_dof = this->nblock_types();
637 
638  // Initialise all blocks to false
639  for (unsigned i = 0; i < n_dof; i++)
640  {
641  for (unsigned j = 0; j < n_dof; j++)
642  {
643  required_blocks(i, j) = false;
644  }
645  }
646 
647  // Fluid: Only need momentum, gradient and divergence blocks
648  required_blocks(0, 0) = true;
649  required_blocks(1, 0) = true;
650  required_blocks(0, 1) = true;
651 
652  // Always retain the solid block
653  required_blocks(2, 2) = true;
654 
655  // Switch on the required off-diagonals
657  {
658  required_blocks(0, 2) = true;
659  required_blocks(1, 2) = true;
660  }
662  {
663  required_blocks(2, 0) = true;
664  required_blocks(2, 1) = true;
666  {
667  std::ostringstream error_message;
668  error_message << "Can't retain all off-diagonal blocks!\n";
669  throw OomphLibError(error_message.str(),
672  }
673  }
674  }
int i
Definition: BiCGSTAB_step_by_step.cpp:9
unsigned nblock_types() const
Return the number of block types.
Definition: block_preconditioner.h:1670
#define OOMPH_EXCEPTION_LOCATION
Definition: oomph_definitions.h:61
#define OOMPH_CURRENT_FUNCTION
Definition: oomph_definitions.h:86
std::ptrdiff_t j
Definition: tut_arithmetic_redux_minmax.cpp:2

References i, j, OOMPH_CURRENT_FUNCTION, and OOMPH_EXCEPTION_LOCATION.

◆ preconditioner_solve()

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

Apply preconditioner to r.

Apply preconditioner to Vector r.

Apply preconditioner.

Implements oomph::Preconditioner.

844 {
845  // Fluid Subsidiary Preconditioner
846  //=================================
847 
848  // Start by applying the Fluid subsidiary preconditioner
849  // The fluid subsidiary preconditioner is a block preconditioner and
850  // hence we pass it the global residual and solution vectors (y and z)
851  Navier_stokes_preconditioner_pt->preconditioner_solve(y,z);
852 
853  // Fluid Onto Solid Matrix Vector Product Operator
854  //================================================
855 
856  // The vector z_f contains the result of the action of the
857  // NavierStokesPreconditioner on a subset of the elements of z.
858  // Remember the fluid block index is 0 and the solid block index is 1.
859  DoubleVector z_f;
860  this->get_block_vector(0,z,z_f);
861 
862  // Apply the matrix vector product to z_f and store the results in w
863  DoubleVector w;
864  Fluid_solid_coupling_matvec_pt->multiply(z_f,w);
865 
866  // The vector y_s contains the solid residuals
867  DoubleVector y_s;
868  this->get_block_vector(1,y,y_s);
869 
870  // Subtract the action of the fluid onto solid matrix vector product from y_s
871  y_s -= w;
872  w = y_s;
873 
874  // Solid Subsidiary Preconditioner
875  //================================
876 
877  // Apply the solid preconditioner to s and return the result to the
878  // global solution vector z
879  DoubleVector z_s;
880  Solid_preconditioner_pt->preconditioner_solve(w,z_s);
881  this->return_block_vector(1,z_s,z);
882 }
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
Definition: double_vector.h:58
Scalar * y
Definition: level1_cplx_impl.h:128

References w, and y.

◆ set_navier_stokes_mesh()

template<typename MATRIX >
void oomph::SimpleFSIPreconditioner< MATRIX >::set_navier_stokes_mesh ( Mesh mesh_pt,
const bool allow_multiple_element_type_in_navier_stokes_mesh = false 
)
inline

Broken assignment operator.

Setter function for the mesh containing the block-preconditionable Navier-Stokes elements.

534  {
535  // Store the mesh pointer.
537 
538  // Are there multiple elements in this mesh?
540  allow_multiple_element_type_in_navier_stokes_mesh;
541  }
const Mesh * mesh_pt(const unsigned &i) const
Definition: block_preconditioner.h:1782

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

Referenced by main(), and PreconditionedFSICollapsibleChannelProblem< ELEMENT >::PreconditionedFSICollapsibleChannelProblem().

◆ set_wall_mesh()

template<typename MATRIX >
void oomph::SimpleFSIPreconditioner< MATRIX >::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.

548  {
549  // Store the mesh pointer
551 
552  // Are the multiple elements in this mesh?
554  allow_multiple_element_type_in_wall_mesh;
555  }

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

Referenced by PreconditionedFSICollapsibleChannelProblem< ELEMENT >::PreconditionedFSICollapsibleChannelProblem().

◆ setup()

template<typename MATRIX >
void SimpleFSIPreconditioner< MATRIX >::setup
virtual

Setup the preconditioner.

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

Setup the preconditioner: Copy the upper/lower triangular block matrices back into a big matrix (with the entries re-ordered relative to the original Jacobian matrix).

Implements oomph::Preconditioner.

757 {
758  // setup the meshes for BlockPreconditioner and get the number of types of
759  // DOF assoicated with each Mesh.
760  // Mesh 0 is the fluid mesh, and hence DOFs 0 to n_fluid_dof_type-1
761  // are the fluid DOFs. Mesh 1 is the solid mesh and therefore DOFs
762  // n_fluid_dof_type to n_total_dof_type-1 are solid DOFs
763  // set the mesh pointers
764  this->set_nmesh(2);
766  this->set_mesh(1,Solid_mesh_pt);
767 
768  unsigned n_fluid_dof_type = this->ndof_types_in_mesh(0);
769  unsigned n_total_dof_type = n_fluid_dof_type + this->ndof_types_in_mesh(1);
770 
771  // This fsi preconditioner has two types of block -- fluid and solid.
772  // Create a map from DOF number to block type. The fluid block is labelled
773  // 0 and the solid block 1.
774  Vector<unsigned> dof_to_block_map(n_total_dof_type,0);
775  for (unsigned i = n_fluid_dof_type; i < n_total_dof_type; i++)
776  {
777  dof_to_block_map[i] = 1;
778  }
779 
780  // Call the BlockPreconditioner method block_setup(...) to assemble the data
781  // structures required for block preconditioning.
782  this->block_setup(dof_to_block_map);
783 
784  // First the solid preconditioner
785  //===============================
786 
787  // get the solid block matrix (1,1)
788  CRDoubleMatrix* solid_matrix_pt = new CRDoubleMatrix;
789  this->get_block(1,1,*solid_matrix_pt);
790 
791  // setup the solid preconditioner
792  // (perform the LU decomposition)
793  Solid_preconditioner_pt->setup(solid_matrix_pt);
794  delete solid_matrix_pt; solid_matrix_pt = 0;
795 
796  // Next the fluid preconditioner
797  //==============================
798 
799  // Specify the relationship between the enumeration of DOF types in the
800  // master preconditioner and the Schur complement subsidiary preconditioner
801  // so that ns_dof_type[i_nst] contains i_master
802  Vector<unsigned> ns_dof_list(n_fluid_dof_type);
803  for (unsigned i = 0; i < n_fluid_dof_type; i++)
804  {
805  ns_dof_list[i] = i;
806  }
807 
808  // Turn the NavierStokesSchurComplement preconditioner into a subsidiary
809  // preconditioner of this (FSI) preconditioner
810  Navier_stokes_preconditioner_pt->
812 
813  // Set up the NavierStokesSchurComplement preconditioner.
814  // (Pass it a pointer to the Navier Stokes mesh)
815  Navier_stokes_preconditioner_pt->
817 
818  // Navier Stokes preconditioner is a subsidiary block preconditioner.
819  // It therefore needs a pointer to the full matrix.
820  Navier_stokes_preconditioner_pt->setup(this->matrix_pt());
821 
822  // Finally the fluid onto solid matrix vector product operator
823  //============================================================
824 
825  // Similar to the solid preconditioner get the matrix
826  CRDoubleMatrix* fluid_onto_solid_matrix_pt = new CRDoubleMatrix;
827  this->get_block(1,0,*fluid_onto_solid_matrix_pt);
828 
829  // And setup the matrix vector product operator
830  this->setup_matrix_vector_product(Fluid_solid_coupling_matvec_pt,
831  fluid_onto_solid_matrix_pt,
832  0);
833  // Clean up
834  delete fluid_onto_solid_matrix_pt; fluid_onto_solid_matrix_pt = 0;
835 }
unsigned ndof_types_in_mesh(const unsigned &i) const
Definition: block_preconditioner.h:2037
void get_block(const unsigned &i, const unsigned &j, MATRIX &output_matrix, const bool &ignore_replacement_block=false) const
Definition: block_preconditioner.h:673
MATRIX * 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
Definition: matrices.h:888
void set_navier_stokes_mesh(Mesh *mesh_pt, const bool &allow_multiple_element_type_in_navier_stokes_mesh=false)
Broken assignment operator.
Definition: fsi_preconditioners.h:531

References i.

◆ use_block_diagonal_version()

◆ use_block_triangular_version_with_fluid_on_solid()

template<typename MATRIX >
void oomph::SimpleFSIPreconditioner< MATRIX >::use_block_triangular_version_with_fluid_on_solid ( )
inline

◆ use_block_triangular_version_with_solid_on_fluid()

template<typename MATRIX >
void oomph::SimpleFSIPreconditioner< MATRIX >::use_block_triangular_version_with_solid_on_fluid ( )
inline

Member Data Documentation

◆ Allow_multiple_element_type_in_navier_stokes_mesh

template<typename MATRIX >
bool oomph::SimpleFSIPreconditioner< MATRIX >::Allow_multiple_element_type_in_navier_stokes_mesh
private

◆ Allow_multiple_element_type_in_wall_mesh

template<typename MATRIX >
bool oomph::SimpleFSIPreconditioner< MATRIX >::Allow_multiple_element_type_in_wall_mesh
private

◆ Navier_stokes_mesh_pt

template<typename MATRIX >
Mesh* oomph::SimpleFSIPreconditioner< MATRIX >::Navier_stokes_mesh_pt
private

◆ Preconditioner_pt

template<typename MATRIX >
Preconditioner* oomph::SimpleFSIPreconditioner< MATRIX >::Preconditioner_pt
private

◆ Retain_fluid_onto_solid_terms

◆ Retain_solid_onto_fluid_terms

◆ Wall_mesh_pt

template<typename MATRIX >
Mesh* oomph::SimpleFSIPreconditioner< MATRIX >::Wall_mesh_pt
private

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