28 #ifndef OOMPH_GENERAL_BLOCK_PRECONDITIONERS
29 #define OOMPH_GENERAL_BLOCK_PRECONDITIONERS
34 #include <oomph-lib-config.h>
52 namespace PreconditionerCreationFunctions
75 template<
typename MATRIX>
192 const bool& allow_multiple_element_type_in_mesh =
false)
198 std::ostringstream err_msg;
199 err_msg <<
"The mesh_pt is null, please point it to a mesh.\n";
206 std::make_pair(
mesh_pt, allow_multiple_element_type_in_mesh));
224 std::ostringstream err_msg;
225 err_msg <<
"There are no meshes set.\n"
226 <<
"Have you remembered to call add_mesh(...)?\n";
233 for (
unsigned mesh_i = 0; mesh_i <
nmesh; mesh_i++)
269 using namespace StringConversion;
270 std::string error_msg =
"Wrong number of precondtioners in";
271 error_msg +=
"Subsidiary_preconditioner_pt, should have ";
272 error_msg +=
to_string(nprec_needed) +
" but we actually have ";
288 (*Subsidiary_preconditioner_creation_function_pt)();
318 template<
typename MATRIX>
327 Use_two_level_parallelisation =
false;
330 Preconditioner_array_pt = 0;
333 Doc_time_during_preconditioner_solve =
false;
345 if (Use_two_level_parallelisation)
347 delete Preconditioner_array_pt;
348 Preconditioner_array_pt = 0;
365 virtual void setup();
370 #ifndef OOMPH_HAS_MPI
371 throw OomphLibError(
"Cannot do any parallelism since we don't have MPI.",
375 Use_two_level_parallelisation =
true;
381 Use_two_level_parallelisation =
false;
387 Doc_time_during_preconditioner_solve =
true;
393 Doc_time_during_preconditioner_solve =
false;
399 if ((Use_two_level_parallelisation) &&
403 "Two level parallelism diagonal block preconditioners cannot have";
405 " any preset preconditioners (due to weird memory management";
406 err_msg +=
" in the PreconditionerArray, you could try fixing it).";
424 const unsigned& nblock)
const
456 template<
typename MATRIX>
466 Upper_triangular =
true;
479 for (
unsigned i = 0, ni = Off_diagonal_matrix_vector_products.nrow();
483 for (
unsigned j = 0, nj = Off_diagonal_matrix_vector_products.ncol();
487 delete Off_diagonal_matrix_vector_products(
i,
j);
488 Off_diagonal_matrix_vector_products(
i,
j) = 0;
512 Upper_triangular =
true;
518 Upper_triangular =
false;
539 template<
typename MATRIX>
576 template<
typename MATRIX>
588 return nblock -
i - 1;
597 template<
typename MATRIX>
int i
Definition: BiCGSTAB_step_by_step.cpp:9
Definition: general_purpose_block_preconditioners.h:579
unsigned get_other_diag_ds(const unsigned &i, const unsigned &nblock) const
Definition: general_purpose_block_preconditioners.h:586
Definition: general_purpose_block_preconditioners.h:321
void disable_doc_time_during_preconditioner_solve()
Disable Doc timings in application of block sub-preconditioners.
Definition: general_purpose_block_preconditioners.h:391
virtual ~BlockDiagonalPreconditioner()
Destructor - delete the preconditioner matrices.
Definition: general_purpose_block_preconditioners.h:337
void fill_in_subsidiary_preconditioners(const unsigned &nprec_needed)
Definition: general_purpose_block_preconditioners.h:396
void enable_two_level_parallelisation()
Use two level parallelisation.
Definition: general_purpose_block_preconditioners.h:368
bool Doc_time_during_preconditioner_solve
Doc timings in application of block sub-preconditioners?
Definition: general_purpose_block_preconditioners.h:438
void operator=(const BlockDiagonalPreconditioner &)=delete
Broken assignment operator.
void enable_doc_time_during_preconditioner_solve()
Enable Doc timings in application of block sub-preconditioners.
Definition: general_purpose_block_preconditioners.h:385
void disable_two_level_parallelisation()
Don't use two-level parallelisation.
Definition: general_purpose_block_preconditioners.h:379
BlockDiagonalPreconditioner(const BlockDiagonalPreconditioner &)=delete
Broken copy constructor.
BlockDiagonalPreconditioner()
constructor - when the preconditioner is used as a master preconditioner
Definition: general_purpose_block_preconditioners.h:324
virtual unsigned get_other_diag_ds(const unsigned &i, const unsigned &nblock) const
Definition: general_purpose_block_preconditioners.h:423
virtual void clean_up_memory()
clean up the memory
Definition: general_purpose_block_preconditioners.h:343
PreconditionerArray * Preconditioner_array_pt
pointer for the PreconditionerArray
Definition: general_purpose_block_preconditioners.h:432
bool Use_two_level_parallelisation
Use two level parallelism using the PreconditionerArray.
Definition: general_purpose_block_preconditioners.h:435
Definition: block_preconditioner.h:422
unsigned nmesh() const
Definition: block_preconditioner.h:1816
const Mesh * mesh_pt(const unsigned &i) const
Definition: block_preconditioner.h:1782
void clear_block_preconditioner_base()
Definition: block_preconditioner.h:2159
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
Definition: general_purpose_block_preconditioners.h:459
virtual ~BlockTriangularPreconditioner()
Destructor - delete the preconditioner matrices.
Definition: general_purpose_block_preconditioners.h:470
DenseMatrix< MatrixVectorProduct * > Off_diagonal_matrix_vector_products
Matrix of matrix vector product operators for the off diagonals.
Definition: general_purpose_block_preconditioners.h:523
void upper_triangular()
Use as an upper triangular preconditioner.
Definition: general_purpose_block_preconditioners.h:510
BlockTriangularPreconditioner()
Constructor. (By default this preconditioner is upper triangular).
Definition: general_purpose_block_preconditioners.h:462
void operator=(const BlockTriangularPreconditioner &)=delete
Broken assignment operator.
BlockTriangularPreconditioner(const BlockTriangularPreconditioner &)=delete
Broken copy constructor.
void lower_triangular()
Use as a lower triangular preconditioner.
Definition: general_purpose_block_preconditioners.h:516
virtual void clean_up_memory()
clean up the memory
Definition: general_purpose_block_preconditioners.h:476
bool Upper_triangular
Boolean indicating upper or lower triangular.
Definition: general_purpose_block_preconditioners.h:526
Definition: matrices.h:386
Definition: double_vector.h:58
void build(const DoubleVector &old_vector)
Just copys the argument DoubleVector.
Definition: double_vector.cc:35
Definition: general_purpose_block_preconditioners.h:600
DummyBlockPreconditioner(const DummyBlockPreconditioner &)=delete
Broken copy constructor.
void preconditioner_solve(const DoubleVector &r, DoubleVector &z)
Apply preconditioner to r (just copy r to z).
Definition: general_purpose_block_preconditioners.h:615
DummyBlockPreconditioner()
Constructor.
Definition: general_purpose_block_preconditioners.h:603
void setup()
Setup the preconditioner.
Definition: general_purpose_block_preconditioners.h:621
~DummyBlockPreconditioner()
Destructor.
Definition: general_purpose_block_preconditioners.h:606
void operator=(const DummyBlockPreconditioner &)=delete
Broken assignment operator.
Definition: general_purpose_block_preconditioners.h:542
ExactBlockPreconditioner()
constructor
Definition: general_purpose_block_preconditioners.h:545
void operator=(const ExactBlockPreconditioner &)=delete
Broken assignment operator.
ExactBlockPreconditioner(const ExactBlockPreconditioner &)=delete
Broken copy constructor.
virtual ~ExactBlockPreconditioner()
Destructor.
Definition: general_purpose_block_preconditioners.h:548
Preconditioner *& preconditioner_pt()
Definition: general_purpose_block_preconditioners.h:564
Definition: general_purpose_block_preconditioners.h:77
void operator=(const GeneralPurposeBlockPreconditioner &)=delete
Broken assignment operator.
Vector< unsigned > Dof_to_block_map
the set of dof to block maps for this preconditioner
Definition: general_purpose_block_preconditioners.h:303
void set_dof_to_block_map(Vector< unsigned > &dof_to_block_map)
Specify a DOF to block map.
Definition: general_purpose_block_preconditioners.h:182
virtual void clean_up_memory()
Definition: general_purpose_block_preconditioners.h:112
GeneralPurposeBlockPreconditioner()
constructor
Definition: general_purpose_block_preconditioners.h:87
virtual ~GeneralPurposeBlockPreconditioner()
Definition: general_purpose_block_preconditioners.h:98
Preconditioner *(* SubsidiaryPreconditionerFctPt)()
Definition: general_purpose_block_preconditioners.h:84
SubsidiaryPreconditionerFctPt Subsidiary_preconditioner_creation_function_pt
Definition: general_purpose_block_preconditioners.h:299
Vector< Preconditioner * > Subsidiary_preconditioner_pt
List of preconditioners to use for the blocks to be solved.
Definition: general_purpose_block_preconditioners.h:294
Vector< std::pair< const Mesh *, bool > > Gp_mesh_pt
Definition: general_purpose_block_preconditioners.h:307
Preconditioner * subsidiary_preconditioner_pt(const unsigned &i) const
Definition: general_purpose_block_preconditioners.h:176
void reset_subsidiary_preconditioner_function_to_default()
Reset the subsidiary preconditioner function to its default.
Definition: general_purpose_block_preconditioners.h:143
void add_mesh(const Mesh *mesh_pt, const bool &allow_multiple_element_type_in_mesh=false)
Definition: general_purpose_block_preconditioners.h:191
void gp_preconditioner_set_all_meshes()
Set the mesh in the block preconditioning framework.
Definition: general_purpose_block_preconditioners.h:218
GeneralPurposeBlockPreconditioner(const GeneralPurposeBlockPreconditioner &)=delete
Broken copy constructor.
void fill_in_subsidiary_preconditioners(const unsigned &nprec_needed)
Definition: general_purpose_block_preconditioners.h:256
void set_subsidiary_preconditioner_pt(Preconditioner *prec, const unsigned &i)
Definition: general_purpose_block_preconditioners.h:154
void gp_preconditioner_block_setup()
Modified block setup for general purpose block preconditioners.
Definition: general_purpose_block_preconditioners.h:241
void set_subsidiary_preconditioner_function(SubsidiaryPreconditionerFctPt sub_prec_fn)
access function to set the subsidiary preconditioner function.
Definition: general_purpose_block_preconditioners.h:136
unsigned gp_nmesh()
Definition: general_purpose_block_preconditioners.h:211
Definition: oomph_definitions.h:222
Definition: preconditioner_array.h:50
Definition: preconditioner.h:54
virtual void preconditioner_solve(const DoubleVector &r, DoubleVector &z)=0
An interface to allow SuperLU to be used as an (exact) Preconditioner.
Definition: SuperLU_preconditioner.h:40
std::string string(const unsigned &i)
Definition: oomph_definitions.cc:286
Preconditioner * create_super_lu_preconditioner()
Definition: general_purpose_block_preconditioners.h:57
std::string to_string(T object, unsigned float_precision=8)
Definition: oomph_utilities.h:189
DRAIG: Change all instances of (SPATIAL_DIM) to (DIM-1).
Definition: AnisotropicHookean.h:10
#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