oomph::PseudoElasticPreconditioner Class Reference

#include <pseudo_elastic_preconditioner.h>

+ Inheritance diagram for oomph::PseudoElasticPreconditioner:

Public Types

enum  Elastic_preconditioner_type { Exact_block_preconditioner , Block_diagonal_preconditioner , Block_lower_triangular_preconditioner , Block_upper_triangular_preconditioner }
 
typedef Preconditioner *(* SubsidiaryPreconditionerFctPt) ()
 

Public Member Functions

 PseudoElasticPreconditioner ()
 Default (and only) constructor. More...
 
virtual ~PseudoElasticPreconditioner ()
 destructor More...
 
 PseudoElasticPreconditioner (const PseudoElasticPreconditioner &)=delete
 Broken copy constructor. More...
 
void setup ()
 Broken assignment operator. More...
 
void preconditioner_solve (const DoubleVector &r, DoubleVector &z)
 
void set_elastic_mesh (Mesh *mesh_pt)
 
void set_lagrange_multiplier_mesh (Mesh *mesh_pt)
 
void enable_inf_norm_of_s_scaling ()
 Call to use the inf norm of S as scaling. More...
 
void disable_inf_norm_of_s_scaling ()
 Call to use no scaling. More...
 
void set_lagrange_multiplier_subsidiary_preconditioner (SubsidiaryPreconditionerFctPt prec_fn)
 
void set_elastic_subsidiary_preconditioner (SubsidiaryPreconditionerFctPt prec_fn)
 
Elastic_preconditioner_typeelastic_preconditioner_type ()
 
void clean_up_memory ()
 Clears the memory. More...
 
- Public Member Functions inherited from oomph::BlockPreconditioner< CRDoubleMatrix >
 BlockPreconditioner ()
 Constructor. More...
 
 BlockPreconditioner (const BlockPreconditioner &)=delete
 Broken copy constructor. More...
 
virtual ~BlockPreconditioner ()
 Destructor. More...
 
void operator= (const BlockPreconditioner &)=delete
 Broken assignment operator. More...
 
CRDoubleMatrixmatrix_pt () const
 
void turn_on_recursive_debug_flag ()
 
void turn_off_recursive_debug_flag ()
 
void turn_on_debug_flag ()
 Toggles on the debug flag. More...
 
void turn_off_debug_flag ()
 Toggles off the debug flag. More...
 
void turn_into_subsidiary_block_preconditioner (BlockPreconditioner< CRDoubleMatrix > *master_block_prec_pt, const Vector< unsigned > &doftype_in_master_preconditioner_coarse)
 
void turn_into_subsidiary_block_preconditioner (BlockPreconditioner< CRDoubleMatrix > *master_block_prec_pt, const Vector< unsigned > &doftype_in_master_preconditioner_coarse, const Vector< Vector< unsigned >> &doftype_coarsen_map_coarse)
 
virtual void block_setup ()
 
void block_setup (const Vector< unsigned > &dof_to_block_map)
 
void get_block (const unsigned &i, const unsigned &j, CRDoubleMatrix &output_matrix, const bool &ignore_replacement_block=false) const
 
CRDoubleMatrix get_block (const unsigned &i, const unsigned &j, const bool &ignore_replacement_block=false) const
 
void set_master_matrix_pt (CRDoubleMatrix *in_matrix_pt)
 Set the matrix_pt in the upper-most master preconditioner. More...
 
void get_block_other_matrix (const unsigned &i, const unsigned &j, CRDoubleMatrix *in_matrix_pt, CRDoubleMatrix &output_matrix)
 
void get_blocks (DenseMatrix< bool > &required_blocks, DenseMatrix< CRDoubleMatrix * > &block_matrix_pt) const
 
void get_dof_level_block (const unsigned &i, const unsigned &j, CRDoubleMatrix &output_block, const bool &ignore_replacement_block=false) const
 
void get_dof_level_block (const unsigned &block_i, const unsigned &block_j, CRDoubleMatrix &output_block, const bool &ignore_replacement_block) const
 
CRDoubleMatrix get_concatenated_block (const VectorMatrix< BlockSelector > &selected_block)
 
void get_concatenated_block_vector (const Vector< unsigned > &block_vec_number, const DoubleVector &v, DoubleVector &b)
 
void return_concatenated_block_vector (const Vector< unsigned > &block_vec_number, const DoubleVector &b, DoubleVector &v) const
 Takes concatenated block ordered vector, b, and copies its. More...
 
void get_block_vectors (const Vector< unsigned > &block_vec_number, const DoubleVector &v, Vector< DoubleVector > &s) const
 
void get_block_vectors (const DoubleVector &v, Vector< DoubleVector > &s) const
 
void return_block_vectors (const Vector< unsigned > &block_vec_number, const Vector< DoubleVector > &s, DoubleVector &v) const
 
void return_block_vectors (const Vector< DoubleVector > &s, DoubleVector &v) const
 
void get_block_vector (const unsigned &n, const DoubleVector &v, DoubleVector &b) const
 
void return_block_vector (const unsigned &n, const DoubleVector &b, DoubleVector &v) const
 
void get_block_ordered_preconditioner_vector (const DoubleVector &v, DoubleVector &w)
 
void return_block_ordered_preconditioner_vector (const DoubleVector &w, DoubleVector &v) const
 
unsigned nblock_types () const
 Return the number of block types. More...
 
unsigned ndof_types () const
 Return the total number of DOF types. More...
 
const Meshmesh_pt (const unsigned &i) const
 
unsigned nmesh () const
 
int block_number (const unsigned &i_dof) const
 Return the block number corresponding to a global index i_dof. More...
 
int index_in_block (const unsigned &i_dof) const
 
const LinearAlgebraDistributionblock_distribution_pt (const unsigned &b) const
 Access function to the block distributions (const version). More...
 
LinearAlgebraDistributionblock_distribution_pt (const unsigned b)
 Access function to the block distributions (non-const version). More...
 
LinearAlgebraDistributiondof_block_distribution_pt (const unsigned &b)
 Access function to the dof-level block distributions. More...
 
const LinearAlgebraDistributionmaster_distribution_pt () const
 
unsigned ndof_types_in_mesh (const unsigned &i) const
 
bool is_subsidiary_block_preconditioner () const
 
bool is_master_block_preconditioner () const
 
void set_block_output_to_files (const std::string &basefilename)
 
void disable_block_output_to_files ()
 Turn off output of blocks (by clearing the basefilename string). More...
 
bool block_output_on () const
 Test if output of blocks is on or not. More...
 
void output_blocks_to_files (const std::string &basefilename, const unsigned &precision=8) const
 
void post_block_matrix_assembly_partial_clear ()
 
BlockPreconditioner< CRDoubleMatrix > * master_block_preconditioner_pt () const
 Access function to the master block preconditioner pt. More...
 
void clear_block_preconditioner_base ()
 
void document ()
 
Vector< Vector< unsigned > > doftype_coarsen_map_fine () const
 
Vector< unsignedget_fine_grain_dof_types_in (const unsigned &i) const
 
unsigned nfine_grain_dof_types_in (const unsigned &i) const
 
MapMatrix< unsigned, CRDoubleMatrix * > replacement_dof_block_pt () const
 Access function to the replaced dof-level blocks. More...
 
void setup_matrix_vector_product (MatrixVectorProduct *matvec_prod_pt, CRDoubleMatrix *block_pt, const Vector< unsigned > &block_col_indices)
 
void setup_matrix_vector_product (MatrixVectorProduct *matvec_prod_pt, CRDoubleMatrix *block_pt, const unsigned &block_col_index)
 
void internal_get_block_ordered_preconditioner_vector (const DoubleVector &v, DoubleVector &w) const
 
void internal_return_block_ordered_preconditioner_vector (const DoubleVector &w, DoubleVector &v) const
 
unsigned internal_nblock_types () const
 
unsigned internal_ndof_types () const
 
void internal_return_block_vector (const unsigned &n, const DoubleVector &b, DoubleVector &v) const
 
void internal_get_block_vector (const unsigned &n, const DoubleVector &v, DoubleVector &b) const
 
void internal_get_block_vectors (const Vector< unsigned > &block_vec_number, const DoubleVector &v, Vector< DoubleVector > &s) const
 
void internal_get_block_vectors (const DoubleVector &v, Vector< DoubleVector > &s) const
 
void internal_return_block_vectors (const Vector< unsigned > &block_vec_number, const Vector< DoubleVector > &s, DoubleVector &v) const
 
void internal_return_block_vectors (const Vector< DoubleVector > &s, DoubleVector &v) const
 
void internal_get_block (const unsigned &i, const unsigned &j, CRDoubleMatrix &output_block) const
 
void internal_get_block (const unsigned &block_i, const unsigned &block_j, CRDoubleMatrix &output_block) const
 
int internal_block_number (const unsigned &i_dof) const
 
int internal_index_in_block (const unsigned &i_dof) const
 
const LinearAlgebraDistributioninternal_block_distribution_pt (const unsigned &b) const
 Access function to the internal block distributions. More...
 
void insert_auxiliary_block_distribution (const Vector< unsigned > &block_vec_number, LinearAlgebraDistribution *dist_pt)
 
void block_matrix_test (const unsigned &i, const unsigned &j, const CRDoubleMatrix *block_matrix_pt) const
 
int get_index_of_value (const Vector< myType > &vec, const myType val, const bool sorted=false) const
 
- Public Member Functions inherited from oomph::Preconditioner
 Preconditioner ()
 Constructor. More...
 
 Preconditioner (const Preconditioner &)=delete
 Broken copy constructor. More...
 
void operator= (const Preconditioner &)=delete
 Broken assignment operator. More...
 
virtual ~Preconditioner ()
 Destructor (empty) More...
 
virtual void preconditioner_solve_transpose (const DoubleVector &r, DoubleVector &z)
 
void setup (DoubleMatrixBase *matrix_pt)
 
void setup (const Problem *problem_pt, DoubleMatrixBase *matrix_pt)
 
void enable_silent_preconditioner_setup ()
 Set up the block preconditioner quietly! More...
 
void disable_silent_preconditioner_setup ()
 Be verbose in the block preconditioner setup. More...
 
virtual void set_matrix_pt (DoubleMatrixBase *matrix_pt)
 Set the matrix pointer. More...
 
virtual const OomphCommunicatorcomm_pt () const
 Get function for comm pointer. More...
 
virtual void set_comm_pt (const OomphCommunicator *const comm_pt)
 Set the communicator pointer. More...
 
double setup_time () const
 Returns the time to setup the preconditioner. More...
 
virtual void turn_into_subsidiary_block_preconditioner (BlockPreconditioner< CRDoubleMatrix > *master_block_prec_pt, const Vector< unsigned > &doftype_in_master_preconditioner_coarse)
 
virtual void turn_into_subsidiary_block_preconditioner (BlockPreconditioner< CRDoubleMatrix > *master_block_prec_pt, const Vector< unsigned > &doftype_in_master_preconditioner_coarse, const Vector< Vector< unsigned >> &doftype_coarsen_map_coarse)
 
- Public Member Functions inherited from oomph::DistributableLinearAlgebraObject
 DistributableLinearAlgebraObject ()
 Default constructor - create a distribution. More...
 
 DistributableLinearAlgebraObject (const DistributableLinearAlgebraObject &matrix)=delete
 Broken copy constructor. More...
 
void operator= (const DistributableLinearAlgebraObject &)=delete
 Broken assignment operator. More...
 
virtual ~DistributableLinearAlgebraObject ()
 Destructor. More...
 
LinearAlgebraDistributiondistribution_pt () const
 access to the LinearAlgebraDistribution More...
 
unsigned nrow () const
 access function to the number of global rows. More...
 
unsigned nrow_local () const
 access function for the num of local rows on this processor. More...
 
unsigned nrow_local (const unsigned &p) const
 access function for the num of local rows on this processor. More...
 
unsigned first_row () const
 access function for the first row on this processor More...
 
unsigned first_row (const unsigned &p) const
 access function for the first row on this processor More...
 
bool distributed () const
 distribution is serial or distributed More...
 
bool distribution_built () const
 
void build_distribution (const LinearAlgebraDistribution *const dist_pt)
 
void build_distribution (const LinearAlgebraDistribution &dist)
 

Private Member Functions

void elastic_preconditioner_solve (const DoubleVector &r, DoubleVector &z)
 Apply the elastic subsidiary preconditioner. More...
 
void lagrange_multiplier_preconditioner_solve (const DoubleVector &r, DoubleVector &z)
 Apply the lagrange multiplier subsidiary preconditioner. More...
 

Private Attributes

double Scaling
 The scaling. Defaults to infinity norm of S. More...
 
bool Use_inf_norm_of_s_scaling
 
Elastic_preconditioner_type E_preconditioner_type
 
unsigned Dim
 the dimension of the problem More...
 
PreconditionerElastic_preconditioner_pt
 storage for the preconditioner for the solid system More...
 
Vector< Preconditioner * > Lagrange_multiplier_preconditioner_pt
 lagrange multiplier preconditioner pt More...
 
SubsidiaryPreconditionerFctPt Lagrange_multiplier_subsidiary_preconditioner_function_pt
 The Lagrange multiplier subsidiary preconditioner function pointer. More...
 
SubsidiaryPreconditionerFctPt Elastic_subsidiary_preconditioner_function_pt
 The solid subsidiary preconditioner function pointer. More...
 
MeshElastic_mesh_pt
 Pointer to the mesh containing the solid elements. More...
 
MeshLagrange_multiplier_mesh_pt
 Pointer to the mesh containing the Lagrange multiplier elements. More...
 

Friends

class PseudoElasticFSIPreconditioner
 

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

//////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// A subsidiary preconditioner for the pseudo-elastic FSI preconditioner. Also a stand-alone preconditioner for the problem of non-linear elasticity subject to prescribed displacement by Lagrange multiplier. 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) 4 - x displacement (with lagr mult traction) 5 - y displacement (with lagr mult traction) 6 - z displacement (with lagr mult traction)

Member Typedef Documentation

◆ SubsidiaryPreconditionerFctPt

typedef Preconditioner*(* oomph::PseudoElasticPreconditioner::SubsidiaryPreconditionerFctPt) ()

This preconditioner includes the option to use subsidiary operators other than SuperLUPreconditioner for this problem. This is the typedef of a function that should return an instance of a subsidiary preconditioning operator. This preconditioner is responsible for the destruction of the subsidiary preconditioners.

Member Enumeration Documentation

◆ Elastic_preconditioner_type

The augmented elasticity system can be preconditioned in one of four ways. 0 - Exact preconditioner 1 - Block diagonal preconditioning 2 - Block upper triangular preconditioner 3 - Block lower triangular preconditioner We group together the different components of the displacement vector field for the block decomposition.

Enumerator
Exact_block_preconditioner 
Block_diagonal_preconditioner 
Block_lower_triangular_preconditioner 
Block_upper_triangular_preconditioner 
122  {
127  };
@ Block_diagonal_preconditioner
Definition: pseudo_elastic_preconditioner.h:124
@ Exact_block_preconditioner
Definition: pseudo_elastic_preconditioner.h:123
@ Block_lower_triangular_preconditioner
Definition: pseudo_elastic_preconditioner.h:125
@ Block_upper_triangular_preconditioner
Definition: pseudo_elastic_preconditioner.h:126

Constructor & Destructor Documentation

◆ PseudoElasticPreconditioner() [1/2]

oomph::PseudoElasticPreconditioner::PseudoElasticPreconditioner ( )
inline

Default (and only) constructor.

131  {
132  // null pointers
136 
137  // set defaults
140 
141  // resize the Mesh_pt
143  Elastic_mesh_pt = 0;
144  }
SubsidiaryPreconditionerFctPt Lagrange_multiplier_subsidiary_preconditioner_function_pt
The Lagrange multiplier subsidiary preconditioner function pointer.
Definition: pseudo_elastic_preconditioner.h:267
bool Use_inf_norm_of_s_scaling
Definition: pseudo_elastic_preconditioner.h:250
Mesh * Lagrange_multiplier_mesh_pt
Pointer to the mesh containing the Lagrange multiplier elements.
Definition: pseudo_elastic_preconditioner.h:276
SubsidiaryPreconditionerFctPt Elastic_subsidiary_preconditioner_function_pt
The solid subsidiary preconditioner function pointer.
Definition: pseudo_elastic_preconditioner.h:270
Mesh * Elastic_mesh_pt
Pointer to the mesh containing the solid elements.
Definition: pseudo_elastic_preconditioner.h:273
Elastic_preconditioner_type E_preconditioner_type
Definition: pseudo_elastic_preconditioner.h:254
Preconditioner * Elastic_preconditioner_pt
storage for the preconditioner for the solid system
Definition: pseudo_elastic_preconditioner.h:260

References E_preconditioner_type, Elastic_mesh_pt, Elastic_preconditioner_pt, Elastic_subsidiary_preconditioner_function_pt, Exact_block_preconditioner, Lagrange_multiplier_mesh_pt, Lagrange_multiplier_subsidiary_preconditioner_function_pt, and Use_inf_norm_of_s_scaling.

◆ ~PseudoElasticPreconditioner()

virtual oomph::PseudoElasticPreconditioner::~PseudoElasticPreconditioner ( )
inlinevirtual

destructor

148  {
149  this->clean_up_memory();
150  }
void clean_up_memory()
Clears the memory.
Definition: pseudo_elastic_preconditioner.cc:527

References clean_up_memory().

◆ PseudoElasticPreconditioner() [2/2]

oomph::PseudoElasticPreconditioner::PseudoElasticPreconditioner ( const PseudoElasticPreconditioner )
delete

Broken copy constructor.

Member Function Documentation

◆ clean_up_memory()

void oomph::PseudoElasticPreconditioner::clean_up_memory ( )
virtual

Clears the memory.

Reimplemented from oomph::Preconditioner.

528  {
529  // clean the block preconditioner base class memory
531 
532  // delete the solid preconditioner
535 
536  // delete the lagrange multiplier preconditioner pt
537  unsigned sz = Lagrange_multiplier_preconditioner_pt.size();
538  for (unsigned i = 0; i < sz; i++)
539  {
542  }
543  }
int i
Definition: BiCGSTAB_step_by_step.cpp:9
void clear_block_preconditioner_base()
Definition: block_preconditioner.h:2159
Vector< Preconditioner * > Lagrange_multiplier_preconditioner_pt
lagrange multiplier preconditioner pt
Definition: pseudo_elastic_preconditioner.h:263

References oomph::BlockPreconditioner< CRDoubleMatrix >::clear_block_preconditioner_base(), Elastic_preconditioner_pt, i, and Lagrange_multiplier_preconditioner_pt.

Referenced by oomph::PseudoElasticFSIPreconditioner::clean_up_memory(), setup(), and ~PseudoElasticPreconditioner().

◆ disable_inf_norm_of_s_scaling()

void oomph::PseudoElasticPreconditioner::disable_inf_norm_of_s_scaling ( )
inline

Call to use no scaling.

198  {
200  }

References Use_inf_norm_of_s_scaling.

◆ elastic_preconditioner_solve()

void oomph::PseudoElasticPreconditioner::elastic_preconditioner_solve ( const DoubleVector r,
DoubleVector z 
)
private

Apply the elastic subsidiary preconditioner.

495  {
496  // apply the solid preconditioner
498  }
virtual void preconditioner_solve(const DoubleVector &r, DoubleVector &z)=0
r
Definition: UniformPSDSelfTest.py:20

References Elastic_preconditioner_pt, oomph::Preconditioner::preconditioner_solve(), and UniformPSDSelfTest::r.

Referenced by oomph::PseudoElasticFSIPreconditioner::preconditioner_solve(), and preconditioner_solve().

◆ elastic_preconditioner_type()

Elastic_preconditioner_type& oomph::PseudoElasticPreconditioner::elastic_preconditioner_type ( )
inline

Set the type of preconditioner applied to the elastic: 0 - Exact preconditioner 1 - Block diagonal preconditioning 2 - Block upper triangular preconditioner 3 - Block lower triangular preconditioner We group together the different components of the displacement vector field for the block decomposition.

230  {
231  return E_preconditioner_type;
232  }

References E_preconditioner_type.

Referenced by PrescribedBoundaryDisplacementProblem< ELEMENT >::PrescribedBoundaryDisplacementProblem(), FSIChannelWithLeafletProblem< ELEMENT >::set_iterative_solver(), PseudoElasticCollapsibleChannelProblem< FLUID_ELEMENT, SOLID_ELEMENT >::set_pseudo_elastic_fsi_solver(), and set_pseudo_elastic_fsi_solver().

◆ enable_inf_norm_of_s_scaling()

void oomph::PseudoElasticPreconditioner::enable_inf_norm_of_s_scaling ( )
inline

Call to use the inf norm of S as scaling.

192  {
194  }

References Use_inf_norm_of_s_scaling.

◆ lagrange_multiplier_preconditioner_solve()

void oomph::PseudoElasticPreconditioner::lagrange_multiplier_preconditioner_solve ( const DoubleVector r,
DoubleVector z 
)
private

Apply the lagrange multiplier subsidiary preconditioner.

505  {
506  // apply the lagrange multiplier preconditioner
507  for (unsigned d = 0; d < Dim; d++)
508  {
509  DoubleVector x;
510  this->get_block_vector(Dim * 2 + d, r, x);
511  DoubleVector y;
512  Lagrange_multiplier_preconditioner_pt[d]->preconditioner_solve(x, y);
513  Lagrange_multiplier_preconditioner_pt[d]->preconditioner_solve(y, x);
514  unsigned nrow_local = x.nrow_local();
515  double* x_pt = x.values_pt();
516  for (unsigned i = 0; i < nrow_local; i++)
517  {
518  x_pt[i] = x_pt[i] * Scaling;
519  }
520  this->return_block_vector(Dim * 2 + d, x, z);
521  }
522  }
std::vector< double > DoubleVector
loads clump configuration
Definition: ClumpInput.h:26
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
unsigned nrow_local() const
access function for the num of local rows on this processor.
Definition: linear_algebra_distribution.h:469
double Scaling
The scaling. Defaults to infinity norm of S.
Definition: pseudo_elastic_preconditioner.h:246
unsigned Dim
the dimension of the problem
Definition: pseudo_elastic_preconditioner.h:257
Scalar * y
Definition: level1_cplx_impl.h:128
list x
Definition: plotDoE.py:28

References Dim, oomph::BlockPreconditioner< CRDoubleMatrix >::get_block_vector(), i, Lagrange_multiplier_preconditioner_pt, oomph::DistributableLinearAlgebraObject::nrow_local(), UniformPSDSelfTest::r, oomph::BlockPreconditioner< CRDoubleMatrix >::return_block_vector(), Scaling, plotDoE::x, and y.

Referenced by oomph::PseudoElasticFSIPreconditioner::preconditioner_solve(), and preconditioner_solve().

◆ preconditioner_solve()

void oomph::PseudoElasticPreconditioner::preconditioner_solve ( const DoubleVector r,
DoubleVector z 
)
inlinevirtual

Apply the preconditioner. Method implemented in two other methods (elastic and lagrange multiplier subsidiary preocnditioner) for the PseudoElasticFSIPreconditioner

Implements oomph::Preconditioner.

171  {
174  }
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

References elastic_preconditioner_solve(), and lagrange_multiplier_preconditioner_solve().

◆ set_elastic_mesh()

void oomph::PseudoElasticPreconditioner::set_elastic_mesh ( Mesh mesh_pt)
inline

Access function to mesh containing the block-preconditionable elastic elements

179  {
181  }
const Mesh * mesh_pt(const unsigned &i) const
Definition: block_preconditioner.h:1782

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

Referenced by PrescribedBoundaryDisplacementProblem< ELEMENT >::PrescribedBoundaryDisplacementProblem(), and oomph::PseudoElasticFSIPreconditioner::setup().

◆ set_elastic_subsidiary_preconditioner()

void oomph::PseudoElasticPreconditioner::set_elastic_subsidiary_preconditioner ( SubsidiaryPreconditionerFctPt  prec_fn)
inline

By default the elastic subsidiary systems are preconditioner with SuperLUPreconditioner. For a different preconditioner, pass a function to this method returning a different subsidiary operator.

218  {
220  }

References Elastic_subsidiary_preconditioner_function_pt.

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

◆ set_lagrange_multiplier_mesh()

void oomph::PseudoElasticPreconditioner::set_lagrange_multiplier_mesh ( Mesh mesh_pt)
inline

◆ set_lagrange_multiplier_subsidiary_preconditioner()

void oomph::PseudoElasticPreconditioner::set_lagrange_multiplier_subsidiary_preconditioner ( SubsidiaryPreconditionerFctPt  prec_fn)
inline

By default the Lagrange multiplier subsidiary systems are preconditioner with SuperLUPreconditioner. For a different preconditioner, pass a function to this method returning a different subsidiary operator.

References Lagrange_multiplier_subsidiary_preconditioner_function_pt.

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

◆ setup()

void oomph::PseudoElasticPreconditioner::setup ( )
virtual

Broken assignment operator.

Setup method for the PseudoElasticPreconditioner.

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

Implements oomph::Preconditioner.

115  {
116  // clean
117  this->clean_up_memory();
118 
119 #ifdef PARANOID
120  // paranoid check that meshes have been set
121  if (Elastic_mesh_pt == 0)
122  {
123  std::ostringstream error_message;
124  error_message << "The elastic mesh must be set.";
125  throw OomphLibError(
126  error_message.str(), OOMPH_CURRENT_FUNCTION, OOMPH_EXCEPTION_LOCATION);
127  }
129  {
130  std::ostringstream error_message;
131  error_message << "The Lagrange multiplier mesh must be set.";
132  throw OomphLibError(
133  error_message.str(), OOMPH_CURRENT_FUNCTION, OOMPH_EXCEPTION_LOCATION);
134  }
135 #endif
136 
137  // set the meshes
138  this->set_nmesh(2);
139  this->set_mesh(0, Elastic_mesh_pt);
141 
142  // Figure out number of dof types
143  unsigned n_solid_dof_types = 0;
144  unsigned n_dof_types = 0;
145 
146  if (this->is_master_block_preconditioner())
147  {
148  // get the number of solid dof types from the first element
149  n_solid_dof_types = this->ndof_types_in_mesh(0);
150 
151  // get the total number of dof types
152  n_dof_types = n_solid_dof_types + this->ndof_types_in_mesh(1);
153  }
154  else
155  {
156  n_dof_types = this->ndof_types();
157  n_solid_dof_types = n_dof_types - (n_dof_types / 3);
158  }
159 #ifdef PARANOID
160  if (n_dof_types % 3 != 0)
161  {
162  std::ostringstream error_message;
163  error_message << "This preconditioner requires DIM*3 types of DOF";
164  throw OomphLibError(
165  error_message.str(), OOMPH_CURRENT_FUNCTION, OOMPH_EXCEPTION_LOCATION);
166  }
167 #endif
168 
169  // determine the dimension
170  Dim = n_dof_types / 3;
171 
172 #ifdef PARANOID
173  // Recast Jacobian matrix to CRDoubleMatrix
174  CRDoubleMatrix* cr_matrix_pt = dynamic_cast<CRDoubleMatrix*>(matrix_pt());
175 
176  if (cr_matrix_pt == 0)
177  {
178  std::ostringstream error_message;
179  error_message << "FSIPreconditioner only works with"
180  << " CRDoubleMatrix matrices" << std::endl;
181  throw OomphLibError(
182  error_message.str(), OOMPH_CURRENT_FUNCTION, OOMPH_EXCEPTION_LOCATION);
183  }
184 #endif
185 
186  // Setup the dof_list scheme for block_setup.
187  // The natural DOF types order is (in 3D):
188  // 0 1 2 3 4 5 6 7 8 <- natural DOF type index
189  // x y z xc yc zc lx ly lz <- DOf type
190  //
191  // We need to group the directional displacements together:
192  // 0 1 2 3 4 5 6 7 8 <- block index
193  // x xc y yc xz zc lx ly lz <- DOF type
194  //
195  // The mapping required is:
196  // 0 2 4 1 3 5 6 7 8
197  //
198  // In general we want:
199  //
200  // dof_to_block_map[DOF type] = block type
201  Vector<unsigned> dof_list_for_block_setup(n_dof_types);
202  for (unsigned dim_i = 0; dim_i < Dim; dim_i++)
203  {
204  // bulk solid dof types
205  dof_list_for_block_setup[dim_i] = 2 * dim_i;
206 
207  // constrained solid dof types
208  dof_list_for_block_setup[dim_i + Dim] = 2 * dim_i + 1;
209 
210  // lagr dof types
211  dof_list_for_block_setup[dim_i + 2 * Dim] = 2 * Dim + dim_i;
212  }
213 
214  // Setup the block ordering. We have the following:
215  // Block types [0, 2*Dim) are the solid blocks.
216  // Block types [2*Dim, 3*Dim) are the Lagrange multiplier blocks.
217  //
218  // For d = 0, 1, 2,
219  // Bulk solid doftypes: 2*d
220  // Constrained solid doftypes: 2*d+1
221  // Lgr doftyoes: 2*Dim + d
222  this->block_setup(dof_list_for_block_setup);
223 
224  // Create dof_list for subsidiary preconditioner. This will be used later
225  // in turn_into_subsidiary_block_preconditioner(...)
226  Vector<unsigned> dof_list_for_subsidiary_prec(n_solid_dof_types);
227 
228  // The dof types are currently in the order (in 3D):
229  // 0 1 2 3 4 5 6 7 8 <- DOF index
230  // x y z xc yc zc lx ly lz <- DOF type
231  //
232  // We need to group the directional displacements together:
233  // x xc y yc xz zc
234  //
235  // The mapping required is:
236  // 0 3 1 4 2 5
237  //
238  // In general we want:
239  // dof_list[subsidiary DOF type] = master DOF type
240  for (unsigned dim_i = 0; dim_i < Dim; dim_i++)
241  {
242  // bulk solid dof
243  dof_list_for_subsidiary_prec[2 * dim_i] = dim_i;
244 
245  // constrained solid dof
246  dof_list_for_subsidiary_prec[2 * dim_i + 1] = dim_i + Dim;
247  }
248 
249  // Get the solid blocks
250  DenseMatrix<CRDoubleMatrix*> solid_matrix_pt(
251  n_solid_dof_types, n_solid_dof_types, 0);
252 
253  for (unsigned row_i = 0; row_i < n_solid_dof_types; row_i++)
254  {
255  for (unsigned col_i = 0; col_i < n_solid_dof_types; col_i++)
256  {
257  solid_matrix_pt(row_i, col_i) = new CRDoubleMatrix;
258  this->get_block(row_i, col_i, *solid_matrix_pt(row_i, col_i));
259  }
260  }
261 
262  // compute the scaling (if required)
264  {
265  Scaling = CRDoubleMatrixHelpers::inf_norm(solid_matrix_pt);
266  }
267  else
268  {
269  Scaling = 1.0;
270  }
271 
272  // Add the scaled identify matrix to the constrained solid blocks.
273  for (unsigned d = 0; d < Dim; d++)
274  {
275  // Where is the constrained block located?
276  unsigned block_i = 2 * d + 1;
277 
278  // Data from the constrained block.
279  double* s_values = solid_matrix_pt(block_i, block_i)->value();
280  int* s_column_index = solid_matrix_pt(block_i, block_i)->column_index();
281  int* s_row_start = solid_matrix_pt(block_i, block_i)->row_start();
282  int s_nrow_local = solid_matrix_pt(block_i, block_i)->nrow_local();
283  int s_first_row = solid_matrix_pt(block_i, block_i)->first_row();
284 
285  // Loop through the diagonal entries and add the scaling.
286  for (int i = 0; i < s_nrow_local; i++)
287  {
288  bool found = false;
289  for (int j = s_row_start[i]; j < s_row_start[i + 1] && !found; j++)
290  {
291  if (s_column_index[j] == i + s_first_row)
292  {
293  s_values[j] += Scaling;
294  found = true;
295  } // if
296  } // for row start
297 
298  // Check if the diagonal entry is found.
299  if (!found)
300  {
301  std::ostringstream error_message;
302  error_message << "The diagonal entry for the constained block("
303  << block_i << "," << block_i << ")\n"
304  << "on local row " << i << " does not exist."
305  << std::endl;
306  throw OomphLibError(error_message.str(),
309  }
310  } // for nrow_local
311  } // for Dim
312 
313 
314  // setup the solid subsidiary preconditioner
315  // //////////////////////////////// this preconditioner uses the full S
316  // matrix
318  {
319  ExactBlockPreconditioner<CRDoubleMatrix>* s_prec_pt =
320  new ExactBlockPreconditioner<CRDoubleMatrix>;
321 
322  // Add mesh (not actually used since this only acts as a subsidiary
323  // preconditioner...
324  // s_prec_pt->add_mesh(Elastic_mesh_pt);
325 
326  Vector<Vector<unsigned>> doftype_to_doftype_map(n_solid_dof_types,
327  Vector<unsigned>(1, 0));
328 
329  for (unsigned i = 0; i < n_solid_dof_types; i++)
330  {
331  doftype_to_doftype_map[i][0] = i;
332  }
333 
334  s_prec_pt->turn_into_subsidiary_block_preconditioner(
335  this, dof_list_for_subsidiary_prec, doftype_to_doftype_map);
336 
338  {
339  s_prec_pt->set_subsidiary_preconditioner_function(
341  }
342 
343  // Set the replacement blocks.
344  for (unsigned d = 0; d < Dim; d++)
345  {
346  // The dof-block located in the block-ordering.
347  unsigned block_i = 2 * d + 1;
348 
349  // The dof-block located in the dof-ordering.
350  unsigned dof_block_i = Dim + d;
352  dof_block_i, dof_block_i, solid_matrix_pt(block_i, block_i));
353  }
354 
355  s_prec_pt->Preconditioner::setup(matrix_pt());
356  Elastic_preconditioner_pt = s_prec_pt;
357  }
358  // otherwise it is a block based preconditioner
359  else
360  {
361  GeneralPurposeBlockPreconditioner<CRDoubleMatrix>* s_prec_pt = 0;
362 
363  // set the block preconditioning method
364  switch (E_preconditioner_type)
365  {
367  {
368  s_prec_pt = new BlockDiagonalPreconditioner<CRDoubleMatrix>;
369  }
370  break;
372  {
373  BlockTriangularPreconditioner<CRDoubleMatrix>*
374  block_triangular_prec_pt =
375  new BlockTriangularPreconditioner<CRDoubleMatrix>;
376  block_triangular_prec_pt->upper_triangular();
377 
378  s_prec_pt = block_triangular_prec_pt;
379  }
380  break;
382  {
383  BlockTriangularPreconditioner<CRDoubleMatrix>*
384  block_triangular_prec_pt =
385  new BlockTriangularPreconditioner<CRDoubleMatrix>;
386  block_triangular_prec_pt->lower_triangular();
387 
388  s_prec_pt = block_triangular_prec_pt;
389  }
390  break;
391  default:
392  {
393  std::ostringstream error_msg;
394  error_msg
395  << "There is no such block based preconditioner.\n"
396  << "Candidates are:\n"
397  << "PseudoElasticPreconditioner::Block_diagonal_preconditioner\n"
398  << "PseudoElasticPreconditioner::Block_upper_triangular_"
399  "preconditioner\n"
400  << "PseudoElasticPreconditioner::Block_lower_triangular_"
401  "preconditioner\n";
402  throw OomphLibError(
404  }
405  break;
406  }
407 
408 
409  // Add mesh (not actually used since this only acts as a subsidiary
410  // preconditioner...
411  // s_prec_pt->add_mesh(Elastic_mesh_pt);
412 
413  // The block to block map
414  Vector<Vector<unsigned>> doftype_to_doftype_map(Dim,
415  Vector<unsigned>(2, 0));
416  Vector<unsigned> s_prec_dof_to_block_map(Dim, 0);
417 
418  unsigned tmp_index = 0;
419  for (unsigned d = 0; d < Dim; d++)
420  {
421  s_prec_dof_to_block_map[d] = d;
422  doftype_to_doftype_map[d][0] = tmp_index++;
423  doftype_to_doftype_map[d][1] = tmp_index++;
424  }
425 
426  s_prec_pt->turn_into_subsidiary_block_preconditioner(
427  this, dof_list_for_subsidiary_prec, doftype_to_doftype_map);
428 
430  {
431  s_prec_pt->set_subsidiary_preconditioner_function(
433  }
434 
435  // Set the replacement blocks.
436  for (unsigned d = 0; d < Dim; d++)
437  {
438  // The dof-block located in the block-ordering.
439  unsigned block_i = 2 * d + 1;
440 
441  // Then dof-block located in the dof-ordering.
442  unsigned dof_block_i = Dim + d;
444  dof_block_i, dof_block_i, solid_matrix_pt(block_i, block_i));
445  }
446 
447  s_prec_pt->set_dof_to_block_map(s_prec_dof_to_block_map);
448  s_prec_pt->Preconditioner::setup(matrix_pt());
449 
450  Elastic_preconditioner_pt = s_prec_pt;
451  }
452 
453  // No longer require the solid blocks
454  for (unsigned row_i = 0; row_i < n_solid_dof_types; row_i++)
455  {
456  for (unsigned col_i = 0; col_i < n_solid_dof_types; col_i++)
457  {
458  delete solid_matrix_pt(row_i, col_i);
459  solid_matrix_pt(row_i, col_i) = 0;
460  }
461  }
462 
463  // next setup the lagrange multiplier preconditioners
465  for (unsigned d = 0; d < Dim; d++)
466  {
467  CRDoubleMatrix* b_pt = new CRDoubleMatrix;
468  this->get_block(2 * Dim + d, 2 * d + 1, *b_pt);
469 
470  // if a non default preconditioner is specified create
471  // the preconditioners
473  {
475  (*Lagrange_multiplier_subsidiary_preconditioner_function_pt)();
476  }
477  // else use default superlu preconditioner
478  else
479  {
480  Lagrange_multiplier_preconditioner_pt[d] = new SuperLUPreconditioner;
481  }
482 
483  // and setup
485  delete b_pt;
486  b_pt = 0;
487  }
488  }
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
bool is_master_block_preconditioner() const
Definition: block_preconditioner.h:2068
void set_replacement_dof_block(const unsigned &block_i, const unsigned &block_j, CRDoubleMatrix *replacement_dof_block_pt)
Definition: block_preconditioner.h:2911
CRDoubleMatrix * matrix_pt() const
Definition: block_preconditioner.h:520
unsigned ndof_types() const
Return the total number of DOF types.
Definition: block_preconditioner.h:1694
void set_nmesh(const unsigned &n)
Definition: block_preconditioner.h:2851
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
bool found
Definition: MergeRestartFiles.py:24
double inf_norm(const DenseMatrix< CRDoubleMatrix * > &matrix_pt)
Compute infinity (maximum) norm of sub blocks as if it was one matrix.
Definition: matrices.cc:3731
#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 Block_diagonal_preconditioner, Block_lower_triangular_preconditioner, oomph::BlockPreconditioner< CRDoubleMatrix >::block_setup(), Block_upper_triangular_preconditioner, clean_up_memory(), Dim, E_preconditioner_type, Elastic_mesh_pt, Elastic_preconditioner_pt, Elastic_subsidiary_preconditioner_function_pt, Exact_block_preconditioner, MergeRestartFiles::found, oomph::BlockPreconditioner< CRDoubleMatrix >::get_block(), i, oomph::CRDoubleMatrixHelpers::inf_norm(), oomph::BlockPreconditioner< CRDoubleMatrix >::is_master_block_preconditioner(), j, Lagrange_multiplier_mesh_pt, Lagrange_multiplier_preconditioner_pt, Lagrange_multiplier_subsidiary_preconditioner_function_pt, oomph::BlockTriangularPreconditioner< MATRIX >::lower_triangular(), oomph::BlockPreconditioner< CRDoubleMatrix >::matrix_pt(), oomph::BlockPreconditioner< CRDoubleMatrix >::ndof_types(), oomph::BlockPreconditioner< CRDoubleMatrix >::ndof_types_in_mesh(), OOMPH_CURRENT_FUNCTION, OOMPH_EXCEPTION_LOCATION, Scaling, oomph::GeneralPurposeBlockPreconditioner< MATRIX >::set_dof_to_block_map(), oomph::BlockPreconditioner< CRDoubleMatrix >::set_mesh(), oomph::BlockPreconditioner< CRDoubleMatrix >::set_nmesh(), oomph::BlockPreconditioner< CRDoubleMatrix >::set_replacement_dof_block(), oomph::GeneralPurposeBlockPreconditioner< MATRIX >::set_subsidiary_preconditioner_function(), oomph::BlockPreconditioner< MATRIX >::turn_into_subsidiary_block_preconditioner(), oomph::BlockTriangularPreconditioner< MATRIX >::upper_triangular(), and Use_inf_norm_of_s_scaling.

Friends And Related Function Documentation

◆ PseudoElasticFSIPreconditioner

friend class PseudoElasticFSIPreconditioner
friend

PseudoElasticFSIPreconditioner is a friend to access the private *_preconditioner_solve(...) method

Member Data Documentation

◆ Dim

unsigned oomph::PseudoElasticPreconditioner::Dim
private

the dimension of the problem

Referenced by lagrange_multiplier_preconditioner_solve(), and setup().

◆ E_preconditioner_type

Elastic_preconditioner_type oomph::PseudoElasticPreconditioner::E_preconditioner_type
private

An unsigned indicating which method should be used for preconditioning the solid component.

Referenced by elastic_preconditioner_type(), PseudoElasticPreconditioner(), and setup().

◆ Elastic_mesh_pt

Mesh* oomph::PseudoElasticPreconditioner::Elastic_mesh_pt
private

Pointer to the mesh containing the solid elements.

Referenced by PseudoElasticPreconditioner(), set_elastic_mesh(), and setup().

◆ Elastic_preconditioner_pt

Preconditioner* oomph::PseudoElasticPreconditioner::Elastic_preconditioner_pt
private

storage for the preconditioner for the solid system

Referenced by clean_up_memory(), elastic_preconditioner_solve(), PseudoElasticPreconditioner(), and setup().

◆ Elastic_subsidiary_preconditioner_function_pt

SubsidiaryPreconditionerFctPt oomph::PseudoElasticPreconditioner::Elastic_subsidiary_preconditioner_function_pt
private

The solid subsidiary preconditioner function pointer.

Referenced by PseudoElasticPreconditioner(), set_elastic_subsidiary_preconditioner(), and setup().

◆ Lagrange_multiplier_mesh_pt

Mesh* oomph::PseudoElasticPreconditioner::Lagrange_multiplier_mesh_pt
private

Pointer to the mesh containing the Lagrange multiplier elements.

Referenced by PseudoElasticPreconditioner(), set_lagrange_multiplier_mesh(), and setup().

◆ Lagrange_multiplier_preconditioner_pt

Vector<Preconditioner*> oomph::PseudoElasticPreconditioner::Lagrange_multiplier_preconditioner_pt
private

lagrange multiplier preconditioner pt

Referenced by clean_up_memory(), lagrange_multiplier_preconditioner_solve(), and setup().

◆ Lagrange_multiplier_subsidiary_preconditioner_function_pt

SubsidiaryPreconditionerFctPt oomph::PseudoElasticPreconditioner::Lagrange_multiplier_subsidiary_preconditioner_function_pt
private

The Lagrange multiplier subsidiary preconditioner function pointer.

Referenced by PseudoElasticPreconditioner(), set_lagrange_multiplier_subsidiary_preconditioner(), and setup().

◆ Scaling

double oomph::PseudoElasticPreconditioner::Scaling
private

The scaling. Defaults to infinity norm of S.

Referenced by lagrange_multiplier_preconditioner_solve(), and setup().

◆ Use_inf_norm_of_s_scaling

bool oomph::PseudoElasticPreconditioner::Use_inf_norm_of_s_scaling
private

boolean indicating whether the inf-norm of S should be used as scaling. Default = true;

Referenced by disable_inf_norm_of_s_scaling(), enable_inf_norm_of_s_scaling(), PseudoElasticPreconditioner(), and setup().


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