30 #ifndef OOMPH_PSEUDO_ELASTIC_SUBSIDIARY_PRECONDITIONER 31 #define OOMPH_PSEUDO_ELASTIC_SUBSIDIARY_PRECONDITIONER 34 #include "../generic/problem.h" 35 #include "../generic/block_preconditioner.h" 36 #include "../generic/preconditioner.h" 37 #include "../generic/SuperLU_preconditioner.h" 38 #include "../generic/matrix_vector_product.h" 39 #include "../generic/general_purpose_preconditioners.h" 40 #include "../generic/general_purpose_block_preconditioners.h" 41 #ifdef OOMPH_HAS_HYPRE 42 #include "../generic/hypre_solver.h" 44 #ifdef OOMPH_HAS_TRILINOS 45 #include "../generic/trilinos_solver.h" 54 namespace Pseudo_Elastic_Preconditioner_Subsidiary_Operator_Helper
58 #ifdef OOMPH_HAS_HYPRE 70 #ifdef OOMPH_HAS_TRILINOS 134 Block_upper_triangular_preconditioner };
140 Lagrange_multiplier_subsidiary_preconditioner_function_pt = 0;
141 Elastic_subsidiary_preconditioner_function_pt = 0;
142 Elastic_preconditioner_pt = 0;
145 Use_inf_norm_of_s_scaling =
true;
146 E_preconditioner_type = Exact_block_preconditioner;
149 Lagrange_multiplier_mesh_pt = 0;
156 this->clean_up_memory();
185 this->elastic_preconditioner_solve(r,z);
186 this->lagrange_multiplier_preconditioner_solve(r,z);
193 Elastic_mesh_pt = mesh_pt;
200 Lagrange_multiplier_mesh_pt = mesh_pt;
205 {Use_inf_norm_of_s_scaling=
true;}
209 {Use_inf_norm_of_s_scaling=
false;}
215 void set_lagrange_multiplier_subsidiary_preconditioner
216 (SubsidiaryPreconditionerFctPt prec_fn)
218 Lagrange_multiplier_subsidiary_preconditioner_function_pt = prec_fn;
225 void set_elastic_subsidiary_preconditioner
226 (SubsidiaryPreconditionerFctPt prec_fn)
228 Elastic_subsidiary_preconditioner_function_pt = prec_fn;
240 return E_preconditioner_type;
244 void clean_up_memory();
252 void lagrange_multiplier_preconditioner_solve(
const DoubleVector& r,
276 SubsidiaryPreconditionerFctPt
339 Block_upper_triangular_preconditioner };
345 Lagrange_multiplier_subsidiary_preconditioner_function_pt = 0;
346 Elastic_subsidiary_preconditioner_function_pt = 0;
347 Elastic_preconditioner_pt = 0;
350 Use_inf_norm_of_s_scaling =
true;
351 E_preconditioner_type = Exact_block_preconditioner;
354 Lagrange_multiplier_mesh_pt = 0;
361 this->clean_up_memory();
386 this->elastic_preconditioner_solve(r,z);
387 this->lagrange_multiplier_preconditioner_solve(r,z);
394 Elastic_mesh_pt = mesh_pt;
401 Lagrange_multiplier_mesh_pt = mesh_pt;
406 {Use_inf_norm_of_s_scaling=
true;}
410 {Use_inf_norm_of_s_scaling=
false;}
416 void set_lagrange_multiplier_subsidiary_preconditioner
417 (SubsidiaryPreconditionerFctPt prec_fn)
419 Lagrange_multiplier_subsidiary_preconditioner_function_pt = prec_fn;
426 void set_elastic_subsidiary_preconditioner
427 (SubsidiaryPreconditionerFctPt prec_fn)
429 Elastic_subsidiary_preconditioner_function_pt = prec_fn;
441 return E_preconditioner_type;
445 void clean_up_memory();
453 void lagrange_multiplier_preconditioner_solve(
const DoubleVector& r,
477 SubsidiaryPreconditionerFctPt
526 Preconditioner_pt = 0;
527 Subsidiary_preconditioner_function_pt = 0;
533 this->clean_up_memory();
541 (
"PseudoElasticPreconditionerSubsidiaryPreconditionerOld ");
565 void set_subsidiary_preconditioner_function
566 (SubsidiaryPreconditionerFctPt sub_prec_fn)
568 Subsidiary_preconditioner_function_pt = sub_prec_fn;
576 delete Preconditioner_pt;
577 Preconditioner_pt = 0;
627 Subsidiary_preconditioner_function_pt = 0;
639 this->clean_up_memory();
647 (
"PseudoElasticPreconditionerSubsidiaryBlockPreconditionerOld ");
659 void clean_up_memory();
668 void set_subsidiary_preconditioner_function
669 (SubsidiaryPreconditionerFctPt sub_prec_fn)
671 Subsidiary_preconditioner_function_pt = sub_prec_fn;
753 const Mesh*
const solid_mesh_pt,
757 this->turn_into_subsidiary_block_preconditioner(master_prec_pt,dof_list);
763 set_matrix_pt(matrix_pt);
767 this->set_mesh(0,solid_mesh_pt);
770 this->set_comm_pt(comm_pt);
773 this->block_setup(dof_to_block_map);
780 this->clear_block_preconditioner_base();
788 broken_copy(
"PseudoElasticPreconditionerScalingHelper");
802 this->get_block(0,0,*m_pt);
803 double s_inf_norm = m_pt->
inf_norm();
811 std::ostringstream error_message;
813 <<
"This method is intentionally broken. This class is not a functioning " 814 <<
"preconditioner.";
817 OOMPH_CURRENT_FUNCTION,
818 OOMPH_EXCEPTION_LOCATION);
824 std::ostringstream error_message;
826 <<
"This method is intentionally broken. This class is not a functioning " 827 <<
"preconditioner.";
830 OOMPH_CURRENT_FUNCTION,
831 OOMPH_EXCEPTION_LOCATION);
virtual ~PseudoElasticPreconditionerOld()
destructor
Preconditioner * Elastic_preconditioner_pt
storage for the preconditioner for the solid system
Elastic_preconditioner_type E_preconditioner_type
An unsigned indicating which method should be used for preconditioning the solid component.
Preconditioner * Elastic_preconditioner_pt
storage for the preconditioner for the solid system
void enable_inf_norm_of_s_scaling()
Call to use the inf norm of S as scaling.
void broken_copy(const std::string &class_name)
Issue error message and terminate execution.
A helper class for PseudoElasticPreconditioner. Note that this is NOT actually a functioning precondi...
bool Use_inf_norm_of_s_scaling
boolean indicating whether the inf-norm of S should be used as scaling. Default = true; ...
void preconditioner_solve(const DoubleVector &r, DoubleVector &z)
Apply the preconditioner. Method implemented in two other methods (elastic and lagrange multiplier su...
void set_lagrange_multiplier_mesh(Mesh *mesh_pt)
Access function to mesh containing the block-preconditionable lagrange multiplier elements...
double s_inf_norm()
Broken assignment operator.
double inf_norm() const
returns the inf-norm of this matrix
bool Use_inf_norm_of_s_scaling
boolean indicating whether the inf-norm of S should be used as scaling. Default = true; ...
void disable_inf_norm_of_s_scaling()
Call to use no scaling.
void setup()
Setup the preconditioner. Pure virtual generic interface function.
Mesh * Elastic_mesh_pt
Pointer to the mesh containing the solid elements.
PseudoElasticPreconditionerSubsidiaryBlockPreconditionerOld()
Constructor. (By default this preconditioner is upper triangular).
Mesh * Elastic_mesh_pt
Pointer to the mesh containing the solid elements.
void set_elastic_mesh(Mesh *mesh_pt)
Access function to mesh containing the block-preconditionable elastic elements.
Preconditioner for FSI problems with pseudo-elastic fluid node updates. Note: NavierStokesSchurComple...
SubsidiaryPreconditionerFctPt Lagrange_multiplier_subsidiary_preconditioner_function_pt
The Lagrange multiplier subsidary preconditioner function pointer.
void preconditioner_solve(const DoubleVector &r, DoubleVector &z)
Apply the preconditioner. Method implemented in two other methods (elastic and lagrange multiplier su...
SubsidiaryPreconditionerFctPt Elastic_subsidiary_preconditioner_function_pt
The solid subsidiary preconditioner function pointer.
double Scaling
The scaling. default 1.0.
A subsidiary preconditioner for the pseudo-elastic FSI preconditioner. Also a stand-alone preconditio...
unsigned Dim
the dimension of the problem
void enable_inf_norm_of_s_scaling()
Call to use the inf norm of S as scaling.
Elastic_preconditioner_type & elastic_preconditioner_type()
Set the type of preconditioner applied to the elastic: 0 - Exact preconditioner 1 - Block diagonal pr...
double Scaling
The scaling. Defaults to infinity norm of S.
void setup()
Setup terminate helper.
Vector< Preconditioner * > Lagrange_multiplier_preconditioner_pt
lagrange multiplier preconditioner pt
Preconditioner * get_elastic_preconditioner_hypre()
AMG w/ GS smoothing for the augmented elastic subsidiary linear systems.
void preconditioner_solve(const DoubleVector &r, DoubleVector &z)
Apply the preconditioner. Pure virtual generic interface function. This method should apply the preco...
Mesh * Lagrange_multiplier_mesh_pt
Pointer to the mesh containing the Lagrange multiplier elements.
void clean_up_memory()
clears the memory
Preconditioner * Preconditioner_pt
the preconditioner pt
Preconditioner * get_elastic_preconditioner()
AMG w/ GS smoothing for the augmented elastic subsidiary linear systems – calls Hypre version to sta...
SubsidiaryPreconditionerFctPt Elastic_subsidiary_preconditioner_function_pt
The solid subsidiary preconditioner function pointer.
Elastic_preconditioner_type & elastic_preconditioner_type()
Set the type of preconditioner applied to the elastic: 0 - Exact preconditioner 1 - Block diagonal pr...
double & scaling()
Specify the scaling. Default is 1.0 Must be set before setup(...).
Elastic_preconditioner_type
The augmented elasticity system can be preconditioned in one of four ways. 0 - Exact preconditioner 1...
Vector< Preconditioner * > Lagrange_multiplier_preconditioner_pt
lagrange multiplier preconditioner pt
DenseMatrix< MatrixVectorProduct * > Off_diagonal_matrix_vector_products
Matrix of matrix vector product operators for the off diagonals.
virtual ~PseudoElasticPreconditioner()
destructor
SubsidiaryPreconditionerFctPt Subsidiary_preconditioner_function_pt
the SubisidaryPreconditionerFctPt
void use_lower_triangular_approximation()
Use as a lower triangular preconditioner.
Preconditioner base class. Gives an interface to call all other preconditioners through and stores th...
void set_elastic_mesh(Mesh *mesh_pt)
Access function to mesh containing the block-preconditionable elastic elements.
double & scaling()
Specify the scaling. Default is 1.0 Must be called before setup(...).
void use_upper_triangular_approximation()
Use as an upper triangular preconditioner.
unsigned Dim
the dimension of the problem
Preconditioner * get_elastic_preconditioner_trilinos_ml()
TrilinosML smoothing for the augmented elastic subsidiary linear systems.
double Scaling
The scaling. Defaults to infinity norm of S.
SubsidiaryPreconditionerFctPt Subsidiary_preconditioner_function_pt
The SubisidaryPreconditionerFctPt.
void set_lagrange_multiplier_mesh(Mesh *mesh_pt)
Access function to mesh containing the block-preconditionable lagrange multiplier elements...
Class for dense matrices, storing all the values of the matrix as a pointer to a pointer with assorte...
A vector in the mathematical sense, initially developed for linear algebra type applications. If MPI then this vector can be distributed - its distribution is described by the LinearAlgebraDistribution object at Distribution_pt. Data is stored in a C-style pointer vector (double*)
void disable_inf_norm_of_s_scaling()
Call to use no scaling.
Elastic_preconditioner_type E_preconditioner_type
An unsigned indicating which method should be used for preconditioning the solid component.
A subsidiary preconditioner for the pseudo-elastic FSI preconditioner. Also a stand-alone preconditio...
Mesh * Lagrange_multiplier_mesh_pt
Pointer to the mesh containing the Lagrange multiplier elements.
~PseudoElasticPreconditionerScalingHelperOld()
Destructor.
PseudoElasticPreconditionerOld()
Default (and only) constructor.
A class for compressed row matrices. This is a distributable object.
~PseudoElasticPreconditionerSubsidiaryPreconditionerOld()
Destructor.
PseudoElasticPreconditioner()
Default (and only) constructor.
SubsidiaryPreconditionerFctPt Lagrange_multiplier_subsidiary_preconditioner_function_pt
The Lagrange multiplier subsidiary preconditioner function pointer.
Preconditioner * get_lagrange_multiplier_preconditioner()
CG with diagonal preconditioner for the lagrange multiplier subsidiary linear systems.
~PseudoElasticPreconditionerSubsidiaryBlockPreconditionerOld()
Destructor.
Vector< PseudoElasticPreconditionerSubsidiaryPreconditionerOld * > Diagonal_block_preconditioner_pt
Vector of SuperLU preconditioner pointers for storing the preconditioners for each diagonal block...
Elastic_preconditioner_type
The augmented elasticity system can be preconditioned in one of four ways. 0 - Exact preconditioner 1...
void use_block_diagonal_approximation()
use as a block diagonal preconditioner
PseudoElasticPreconditionerSubsidiaryPreconditionerOld()
Constructor.
An oomph-lib wrapper to the MPI_Comm communicator object. Just contains an MPI_Comm object (which is ...