26 #ifndef OOMPH_FSI_PRECONDITIONERS_HEADER
27 #define OOMPH_FSI_PRECONDITIONERS_HEADER
30 #include "../navier_stokes/navier_stokes_preconditioners.h"
166 const bool& allow_multiple_element_type_in_navier_stokes_mesh =
false)
173 allow_multiple_element_type_in_navier_stokes_mesh;
181 const bool& allow_multiple_element_type_in_wall_mesh =
false)
188 allow_multiple_element_type_in_wall_mesh;
275 std::ostringstream error_message;
276 error_message <<
"Pointer to fluid mesh hasn't been set!\n";
282 std::ostringstream error_message;
283 error_message <<
"Pointer to solid mesh hasn't been set!\n";
301 for (
unsigned i = n_fluid_dof;
i < n_dof;
i++)
303 dof_to_block_map[
i] = 1;
313 for (
unsigned i = 0;
i < n_fluid_dof;
i++)
315 ns_dof_lookup[
i] =
i;
321 this, ns_dof_lookup);
339 block_matrix_1_1.
clear();
379 z.
build(
r.distribution_pt(), 0.0);
410 temp_solid_vec.
clear();
415 another_temp_vec -= temp_fluid_vec;
452 temp_solid_vec -= aux_vec;
483 template<
typename MATRIX>
533 const bool& allow_multiple_element_type_in_navier_stokes_mesh =
false)
540 allow_multiple_element_type_in_navier_stokes_mesh;
547 const bool& allow_multiple_element_type_in_wall_mesh =
false)
554 allow_multiple_element_type_in_wall_mesh;
631 template<
typename MATRIX>
636 unsigned n_dof = this->nblock_types();
639 for (
unsigned i = 0;
i < n_dof;
i++)
641 for (
unsigned j = 0;
j < n_dof;
j++)
643 required_blocks(
i,
j) =
false;
648 required_blocks(0, 0) =
true;
649 required_blocks(1, 0) =
true;
650 required_blocks(0, 1) =
true;
653 required_blocks(2, 2) =
true;
656 if (Retain_solid_onto_fluid_terms)
658 required_blocks(0, 2) =
true;
659 required_blocks(1, 2) =
true;
661 if (Retain_fluid_onto_solid_terms)
663 required_blocks(2, 0) =
true;
664 required_blocks(2, 1) =
true;
665 if (Retain_solid_onto_fluid_terms)
667 std::ostringstream error_message;
668 error_message <<
"Can't retain all off-diagonal blocks!\n";
682 template<
typename MATRIX>
686 if (Preconditioner_pt != 0)
688 delete Preconditioner_pt;
689 Preconditioner_pt = 0;
692 if (Navier_stokes_mesh_pt == 0)
694 std::ostringstream error_message;
695 error_message <<
"Pointer to fluid mesh hasn't been set!\n";
699 if (Wall_mesh_pt == 0)
701 std::ostringstream error_message;
702 error_message <<
"Pointer to solid mesh hasn't been set!\n";
710 Navier_stokes_mesh_pt,
711 Allow_multiple_element_type_in_navier_stokes_mesh);
712 this->set_mesh(1, Wall_mesh_pt, Allow_multiple_element_type_in_wall_mesh);
715 unsigned n_fluid_dof = this->ndof_types_in_mesh(0);
716 unsigned n_dof = n_fluid_dof + this->ndof_types_in_mesh(1);
719 Vector<unsigned> dof_to_block_map(n_dof, 0);
720 dof_to_block_map[n_fluid_dof - 1] = 1;
721 for (
unsigned i = n_fluid_dof;
i < n_dof;
i++)
723 dof_to_block_map[
i] = 2;
727 this->block_setup(dof_to_block_map);
730 n_dof = this->nblock_types();
736 identify_required_blocks(required_blocks);
738 VectorMatrix<BlockSelector> selected_blocks(n_dof, n_dof);
740 for (
unsigned dof_i = 0; dof_i < n_dof; dof_i++)
742 for (
unsigned dof_j = 0; dof_j < n_dof; dof_j++)
744 selected_blocks[dof_i][dof_j].select_block(dof_i, dof_j,
false, 0);
746 if (required_blocks(dof_i, dof_j))
748 selected_blocks[dof_i][dof_j].want_block();
753 CRDoubleMatrix P_matrix = this->get_concatenated_block(selected_blocks);
756 Preconditioner_pt =
new SuperLUPreconditioner;
757 Preconditioner_pt->setup(&P_matrix);
764 template<
typename MATRIX>
772 this->get_block_ordered_preconditioner_vector(
r, temp_vec);
775 Preconditioner_pt->preconditioner_solve(temp_vec, temp_vec);
778 this->return_block_ordered_preconditioner_vector(temp_vec, z);
Matrix< Scalar, Dynamic, Dynamic > DenseMatrix
Definition: BenchSparseUtil.h:23
int i
Definition: BiCGSTAB_step_by_step.cpp:9
cout<< "Here is the matrix m:"<< endl<< m<< endl;Matrix< ptrdiff_t, 3, 1 > res
Definition: PartialRedux_count.cpp:3
Definition: block_preconditioner.h:422
void return_block_vector(const unsigned &n, const DoubleVector &b, DoubleVector &v) const
Definition: block_preconditioner.cc:4489
const Mesh * mesh_pt(const unsigned &i) const
Definition: block_preconditioner.h:1782
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
void get_block_vector(const unsigned &n, const DoubleVector &v, DoubleVector &b) const
Definition: block_preconditioner.cc:4186
CRDoubleMatrix * 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
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: matrices.h:888
void clear()
clear
Definition: matrices.cc:1657
Definition: double_vector.h:58
void build(const DoubleVector &old_vector)
Just copys the argument DoubleVector.
Definition: double_vector.cc:35
bool built() const
Definition: double_vector.h:154
void clear()
wipes the DoubleVector
Definition: double_vector.h:142
Definition: fsi_preconditioners.h:51
void set_solid_preconditioner_pt(Preconditioner *solid_preconditioner_pt)
Broken assignment operator.
Definition: fsi_preconditioners.h:121
void use_block_triangular_version_with_solid_on_fluid()
Definition: fsi_preconditioners.h:155
Mesh * Navier_stokes_mesh_pt
Pointer to the navier stokes mesh.
Definition: fsi_preconditioners.h:245
void enable_doc_time()
Enable documentation of time.
Definition: fsi_preconditioners.h:205
void preconditioner_solve(const DoubleVector &r, DoubleVector &z)
Apply preconditioner to r.
Definition: fsi_preconditioners.h:373
bool Doc_time
Set Doc_time to true for outputting results of timings.
Definition: fsi_preconditioners.h:242
bool Allow_multiple_element_type_in_navier_stokes_mesh
Definition: fsi_preconditioners.h:252
MatrixVectorProduct * Matrix_vector_product_0_1_pt
Pointer to fluid/solid interaction matrix.
Definition: fsi_preconditioners.h:225
FSIPreconditioner(const FSIPreconditioner &)=delete
Broken copy constructor.
void set_navier_stokes_mesh(Mesh *mesh_pt, const bool &allow_multiple_element_type_in_navier_stokes_mesh=false)
Definition: fsi_preconditioners.h:164
void set_wall_mesh(Mesh *mesh_pt, const bool &allow_multiple_element_type_in_wall_mesh=false)
Definition: fsi_preconditioners.h:179
~FSIPreconditioner()
Destructor: Clean up.
Definition: fsi_preconditioners.h:93
bool Allow_multiple_element_type_in_wall_mesh
Definition: fsi_preconditioners.h:255
MatrixVectorProduct * Matrix_vector_product_1_0_pt
Pointer to solid/fluid solid interaction matrix.
Definition: fsi_preconditioners.h:228
NavierStokesSchurComplementPreconditioner * navier_stokes_preconditioner_pt() const
Access function to the Navier Stokes preconditioner (inexact solver)
Definition: fsi_preconditioners.h:198
void use_block_diagonal_version()
Switch to block-diagonal preconditioner.
Definition: fsi_preconditioners.h:139
void disable_doc_time()
Disable documentation of time.
Definition: fsi_preconditioners.h:211
Preconditioner * Solid_preconditioner_pt
Pointer to the solid preconditioner (inexact solver)
Definition: fsi_preconditioners.h:222
Preconditioner * solid_preconditioner_pt() const
Read-only access to solid preconditoner (use set_... to set it)
Definition: fsi_preconditioners.h:132
bool Retain_solid_onto_fluid_terms
Definition: fsi_preconditioners.h:235
void use_block_triangular_version_with_fluid_on_solid()
Definition: fsi_preconditioners.h:147
bool Preconditioner_has_been_setup
Boolean indicating the preconditioner has been set up.
Definition: fsi_preconditioners.h:231
bool Retain_fluid_onto_solid_terms
Definition: fsi_preconditioners.h:239
void setup()
Setup the preconditioner.
Definition: fsi_preconditioners.h:269
NavierStokesSchurComplementPreconditioner * Navier_stokes_preconditioner_pt
Pointer the Navier Stokes preconditioner (inexact solver)
Definition: fsi_preconditioners.h:219
Mesh * Wall_mesh_pt
pointer to the solid mesh
Definition: fsi_preconditioners.h:248
FSIPreconditioner(Problem *problem_pt)
Definition: fsi_preconditioners.h:56
Definition: matrix_vector_product.h:51
void multiply(const DoubleVector &x, DoubleVector &y) const
Definition: matrix_vector_product.cc:108
Definition: navier_stokes_preconditioners.h:607
void setup()
Setup the preconditioner.
Definition: driven_cavity_with_simple_lsc_preconditioner.cc:167
void set_navier_stokes_mesh(Mesh *mesh_pt, const bool &allow_multiple_element_type_in_navier_stokes_mesh=false)
Definition: navier_stokes_preconditioners.h:732
void preconditioner_solve(const DoubleVector &r, DoubleVector &z)
Apply preconditioner to Vector r.
Definition: driven_cavity_with_simple_lsc_preconditioner.cc:384
Definition: oomph_definitions.h:222
Definition: preconditioner.h:54
void setup(DoubleMatrixBase *matrix_pt)
Definition: preconditioner.h:94
double setup_time() const
Returns the time to setup the preconditioner.
Definition: preconditioner.h:199
virtual void preconditioner_solve(const DoubleVector &r, DoubleVector &z)=0
Definition: problem.h:151
Definition: fsi_preconditioners.h:485
bool Retain_fluid_onto_solid_terms
Definition: fsi_preconditioners.h:596
void set_wall_mesh(Mesh *mesh_pt, const bool &allow_multiple_element_type_in_wall_mesh=false)
Definition: fsi_preconditioners.h:545
Mesh * Wall_mesh_pt
pointer to the solid mesh
Definition: fsi_preconditioners.h:608
SimpleFSIPreconditioner()
Constructor.
Definition: fsi_preconditioners.h:488
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
void setup()
Setup the preconditioner.
Definition: mpi/solvers/fsi_channel_with_leaflet.cc:756
~SimpleFSIPreconditioner()
Destructor: Clean up.
Definition: fsi_preconditioners.h:510
void use_block_triangular_version_with_solid_on_fluid()
Definition: fsi_preconditioners.h:580
SimpleFSIPreconditioner(const SimpleFSIPreconditioner &)=delete
Broken copy constructor.
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
void use_block_diagonal_version()
Switch to block-diagonal preconditioner.
Definition: fsi_preconditioners.h:564
Preconditioner * Preconditioner_pt
Preconditioner (inexact solver)
Definition: fsi_preconditioners.h:588
void preconditioner_solve(const DoubleVector &r, DoubleVector &z)
Apply preconditioner to r.
Definition: mpi/solvers/fsi_channel_with_leaflet.cc:842
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
virtual void identify_required_blocks(DenseMatrix< bool > &required_blocks)
Definition: fsi_preconditioners.h:632
void use_block_triangular_version_with_fluid_on_solid()
Definition: fsi_preconditioners.h:572
An interface to allow SuperLU to be used as an (exact) Preconditioner.
Definition: SuperLU_preconditioner.h:40
double timer()
returns the time in seconds after some point in past
Definition: oomph_utilities.cc:1295
DRAIG: Change all instances of (SPATIAL_DIM) to (DIM-1).
Definition: AnisotropicHookean.h:10
OomphInfo oomph_info
Definition: oomph_definitions.cc:319
#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