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   108   : 
public BlockPreconditioner<CRDoubleMatrix>
   121   typedef Preconditioner* (*SubsidiaryPreconditionerFctPt)();
   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();
   163     BrokenCopy::broken_copy(
"PseudoElasticPreconditioner");
   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();
   249   void elastic_preconditioner_solve(
const DoubleVector& r, DoubleVector& z);
   252   void lagrange_multiplier_preconditioner_solve(
const DoubleVector& r,
   276   SubsidiaryPreconditionerFctPt 
   313   : 
public BlockPreconditioner<CRDoubleMatrix>
   326   typedef Preconditioner* (*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();
   368     BrokenCopy::broken_copy(
"PseudoElasticPreconditionerOld");
   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();
   450   void elastic_preconditioner_solve(
const DoubleVector& r, DoubleVector& z);
   453   void lagrange_multiplier_preconditioner_solve(
const DoubleVector& r,
   477   SubsidiaryPreconditionerFctPt 
   510   : 
public BlockPreconditioner<CRDoubleMatrix>
   520   typedef Preconditioner* (*SubsidiaryPreconditionerFctPt)();
   526     Preconditioner_pt = 0;
   527     Subsidiary_preconditioner_function_pt = 0;
   533     this->clean_up_memory();
   540     BrokenCopy::broken_copy
   541      (
"PseudoElasticPreconditionerSubsidiaryPreconditionerOld ");
   555   void preconditioner_solve(
const DoubleVector& r, DoubleVector& z);
   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;
   611   : 
public BlockPreconditioner<CRDoubleMatrix>
   620   typedef Preconditioner* (*SubsidiaryPreconditionerFctPt)();
   624    : BlockPreconditioner<CRDoubleMatrix>()
   627     Subsidiary_preconditioner_function_pt = 0;
   639     this->clean_up_memory();
   646     BrokenCopy::broken_copy
   647      (
"PseudoElasticPreconditionerSubsidiaryBlockPreconditionerOld ");
   659   void clean_up_memory();
   665   void preconditioner_solve(
const DoubleVector &res, DoubleVector &z);
   668   void set_subsidiary_preconditioner_function
   669    (SubsidiaryPreconditionerFctPt sub_prec_fn)
   671    Subsidiary_preconditioner_function_pt = sub_prec_fn;
   703   Vector<PseudoElasticPreconditionerSubsidiaryPreconditionerOld*> 
   736   : 
public BlockPreconditioner<CRDoubleMatrix>
   751    (BlockPreconditioner<CRDoubleMatrix>* master_prec_pt,
   752     CRDoubleMatrix* matrix_pt, Vector<unsigned>& dof_list,
   753     const Mesh* 
const solid_mesh_pt,
   754     const OomphCommunicator* comm_pt)
   757     this->turn_into_subsidiary_block_preconditioner(master_prec_pt,dof_list);
   760     Vector<unsigned> dof_to_block_map(dof_list.size(),0);
   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");
   801    CRDoubleMatrix* m_pt = 
new CRDoubleMatrix;
   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. 
 
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. 
 
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. 
 
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. 
 
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)
 
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. 
 
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...
 
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. 
 
~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.