26 #ifndef OOMPH_NAVIER_STOKES_PRECONDITIONERS_HEADER
27 #define OOMPH_NAVIER_STOKES_PRECONDITIONERS_HEADER
32 #include <oomph-lib-config.h>
37 #include "../generic/matrices.h"
38 #include "../generic/assembly_handler.h"
39 #include "../generic/problem.h"
40 #include "../generic/block_preconditioner.h"
41 #include "../generic/preconditioner.h"
42 #include "../generic/SuperLU_preconditioner.h"
43 #include "../generic/matrix_vector_product.h"
59 namespace PressureAdvectionDiffusionValidation
68 extern void wind_function(
const Vector<double>&
x, Vector<double>& wind);
71 extern void get_exact_u(
const Vector<double>&
x, Vector<double>& u);
74 extern void get_exact_u(
const Vector<double>&
x,
double& u);
107 unsigned n_dof = elem_pt->
ndof();
108 for (
unsigned i = 0;
i < n_dof;
i++)
114 ->fill_in_pressure_advection_diffusion_residuals(residuals);
124 unsigned n_dof = elem_pt->
ndof();
125 for (
unsigned i = 0;
i < n_dof;
i++)
128 for (
unsigned j = 0;
j < n_dof;
j++)
130 jacobian(
i,
j) = 0.0;
135 ->fill_in_pressure_advection_diffusion_jacobian(residuals, jacobian);
153 template<
class ELEMENT>
163 mesh_pt() = navier_stokes_mesh_pt;
185 oomph_info <<
"Eqn numbers after pinning veloc dofs: " << n_dof
196 oomph_info <<
"Eqn numbers in orig problem after re-assignment: "
206 for (
unsigned j = 0;
j < nnod;
j++)
209 unsigned nval = nod_pt->
nvalue();
210 for (
unsigned i = 0;
i < nval;
i++)
218 for (
unsigned e = 0;
e < nelem;
e++)
228 std::ostringstream error_message;
229 error_message <<
"Navier Stokes mesh must contain only Navier Stokes"
230 <<
"bulk elements\n";
237 unsigned nint = el_pt->ninternal_data();
238 for (
unsigned j = 0;
j < nint;
j++)
240 Data* data_pt = el_pt->internal_data_pt(
j);
241 unsigned nvalue = data_pt->
nvalue();
242 for (
unsigned i = 0;
i < nvalue;
i++)
258 const bool& set_pressure_bc_for_validation =
false)
262 for (
unsigned e = 0;
e < nelem;
e++)
273 std::ostringstream error_message;
274 error_message <<
"Navier Stokes mesh must contain only Navier Stokes"
275 <<
"bulk elements\n";
284 if (el_pt->p_nodal_index_nst() < 0)
286 std::ostringstream error_message;
287 error_message <<
"Cannot use Fp preconditioner with discontinuous\n"
296 unsigned nint = el_pt->ninternal_data();
297 for (
unsigned j = 0;
j < nint;
j++)
299 Data* data_pt = el_pt->internal_data_pt(
j);
302 unsigned nvalue = data_pt->
nvalue();
304 for (
unsigned i = 0;
i < nvalue;
i++)
316 unsigned nnod = el_pt->nnode();
317 for (
unsigned j = 0;
j < nnod;
j++)
319 Node* nod_pt = el_pt->node_pt(
j);
322 unsigned nvalue = nod_pt->
nvalue();
324 for (
unsigned i = 0;
i < nvalue;
i++)
328 if (
int(
i) != el_pt->p_nodal_index_nst())
338 if (el_pt->p_nodal_index_nst() >= 0)
348 if (set_pressure_bc_for_validation)
355 nod_pt->
set_value(el_pt->u_index_nst(0), u[0]);
356 nod_pt->
set_value(el_pt->u_index_nst(1), u[1]);
367 oomph_info <<
"\n\n==============================================\n\n";
368 oomph_info <<
"Doing validation for pressure adv diff problem\n";
375 bool set_pressure_bc_for_validation =
true;
385 for (
unsigned e = 0;
e < nel;
e++)
388 ->source_fct_for_pressure_adv_diff() =
393 oomph_info <<
"Eqn numbers after pinning veloc dofs: "
401 for (
unsigned b = 0;
b < nbound;
b++)
407 for (
unsigned e = 0;
e < n_element;
e++)
425 std::ofstream outfile;
426 outfile.open(
"robin_elements.dat");
427 for (
unsigned e = 0;
e < nel;
e++)
430 ->output_pressure_advection_diffusion_robin_elements(outfile);
444 for (
unsigned b = 0;
b < nbound;
b++)
450 for (
unsigned e = 0;
e < n_element;
e++)
467 oomph_info <<
"Eqn numbers in orig problem after re-assignment: "
471 oomph_info <<
"Done validation for pressure adv diff problem\n";
472 oomph_info <<
"\n\n==============================================\n\n";
480 std::ofstream some_file;
491 ->interpolated_p_nst(
s);
493 ->interpolated_x(
s,
x);
501 for (
unsigned j = 0;
j < nnode;
j++)
503 if (
mesh_pt()->node_pt(
j)->nvalue() == 3)
512 some_file.open(
filename.str().c_str());
513 some_file.precision(20);
520 some_file.open(
filename.str().c_str());
521 some_file.precision(20);
694 std::ostringstream error_msg;
695 error_msg <<
"Problem pointer is null, did you set it yet?";
734 const bool& allow_multiple_element_type_in_navier_stokes_mesh =
false)
741 allow_multiple_element_type_in_navier_stokes_mesh;
853 template<
class ELEMENT>
866 for (
unsigned e = 0;
e < nelem;
e++)
897 for (
unsigned i = 0;
i < n_sub_mesh;
i++)
915 problem_pt()->get_first_and_last_element_for_assembly(
916 backed_up_first_el_for_assembly, backed_up_last_el_for_assembly);
919 problem_pt()->set_default_first_and_last_element_for_assembly();
924 int pinned_pressure_eqn = -2;
930 for (
unsigned e = 0;
e < nel;
e++)
938 pinned_pressure_eqn = bulk_elem_pt->
eqn_number(local_eqn);
947 int pinned_pressure_eqn_local = pinned_pressure_eqn;
948 int pinned_pressure_eqn_global = pinned_pressure_eqn;
949 MPI_Allreduce(&pinned_pressure_eqn_local,
950 &pinned_pressure_eqn_global,
955 pinned_pressure_eqn = pinned_pressure_eqn_global;
964 for (
unsigned e = 0;
e < nel;
e++)
980 for (
unsigned b = 0;
b < nbound;
b++)
986 for (
unsigned e = 0;
e < n_element;
e++)
1011 for (
unsigned b = 0;
b < nbound;
b++)
1017 for (
unsigned e = 0;
e < n_element;
e++)
1033 #ifdef OOMPH_HAS_MPI
1037 problem_pt()->set_first_and_last_element_for_assembly(
1038 backed_up_first_el_for_assembly, backed_up_last_el_for_assembly);
1048 for (
unsigned i = 0;
i < n_sub_mesh;
i++)
1064 for (
unsigned j = 0;
j < nnod;
j++)
1067 unsigned nval = nod_pt->
nvalue();
1068 for (
unsigned i = 0;
i < nval;
i++)
1075 if (solid_nod_pt != 0)
1078 unsigned nval = solid_posn_data_pt->
nvalue();
1079 for (
unsigned i = 0;
i < nval;
i++)
1089 for (
unsigned e = 0;
e < nelem;
e++)
1096 for (
unsigned j = 0;
j < nint;
j++)
1099 unsigned nvalue = data_pt->
nvalue();
1100 for (
unsigned i = 0;
i < nvalue;
i++)
1148 const bool& do_both);
1212 template<
typename MATRIX>
int i
Definition: BiCGSTAB_step_by_step.cpp:9
Array< double, 1, 3 > e(1./3., 0.5, 2.)
float * p
Definition: Tutorial_Map_using.cpp:9
Scalar Scalar int size
Definition: benchVecAdd.cpp:17
Scalar * b
Definition: benchVecAdd.cpp:17
Definition: assembly_handler.h:63
Definition: block_preconditioner.h:422
const Mesh * mesh_pt(const unsigned &i) const
Definition: block_preconditioner.h:1782
Definition: matrices.h:888
long & eqn_number(const unsigned &i)
Return the equation number of the i-th stored variable.
Definition: nodes.h:367
void pin(const unsigned &i)
Pin the i-th stored variable.
Definition: nodes.h:385
double * value_pt(const unsigned &i) const
Definition: nodes.h:324
void set_value(const unsigned &i, const double &value_)
Definition: nodes.h:271
unsigned nvalue() const
Return number of values stored in data object (incl pinned ones).
Definition: nodes.h:483
Definition: oomph_utilities.h:499
std::string directory() const
Output directory.
Definition: oomph_utilities.h:524
unsigned & number()
Number used (e.g.) for labeling output files.
Definition: oomph_utilities.h:554
Definition: double_vector.h:58
unsigned dim() const
Definition: elements.h:2611
Definition: navier_stokes_preconditioners.h:93
virtual ~FpPreconditionerAssemblyHandler()
Empty virtual destructor.
Definition: navier_stokes_preconditioners.h:101
void get_jacobian(GeneralisedElement *const &elem_pt, Vector< double > &residuals, DenseMatrix< double > &jacobian)
Definition: navier_stokes_preconditioners.h:119
FpPreconditionerAssemblyHandler(const unsigned &ndim)
Constructor. Pass spatial dimension.
Definition: navier_stokes_preconditioners.h:96
void get_residuals(GeneralisedElement *const &elem_pt, Vector< double > &residuals)
Return the contribution to the residuals of the element elem_pt.
Definition: navier_stokes_preconditioners.h:104
Definition: navier_stokes_preconditioners.h:155
unsigned Ndim
The spatial dimension.
Definition: navier_stokes_preconditioners.h:529
void get_pressure_advection_diffusion_jacobian(CRDoubleMatrix &jacobian)
Get the pressure advection diffusion Jacobian.
Definition: navier_stokes_preconditioners.h:178
FpPressureAdvectionDiffusionProblem(Mesh *navier_stokes_mesh_pt, Problem *orig_problem_pt)
Constructor: Pass Navier-Stokes mesh and pointer to orig problem.
Definition: navier_stokes_preconditioners.h:158
void pin_all_non_pressure_dofs(const bool &set_pressure_bc_for_validation=false)
Definition: navier_stokes_preconditioners.h:257
Problem * Orig_problem_pt
Definition: navier_stokes_preconditioners.h:533
void doc_solution(DocInfo &doc_info)
Definition: navier_stokes_preconditioners.h:478
std::map< Data *, std::vector< int > > Eqn_number_backup
Map to store original equation numbers.
Definition: navier_stokes_preconditioners.h:536
void reset_pin_status()
Reset pin status of all values.
Definition: navier_stokes_preconditioners.h:202
void validate(DocInfo &doc_info)
Definition: navier_stokes_preconditioners.h:365
Definition: elements.h:73
unsigned ndof() const
Return the number of equations/dofs in the element.
Definition: elements.h:835
unsigned long eqn_number(const unsigned &ieqn_local) const
Definition: elements.h:704
Data *& internal_data_pt(const unsigned &i)
Return a pointer to i-th internal data object.
Definition: elements.h:622
unsigned ninternal_data() const
Return the number of internal data objects.
Definition: elements.h:823
Definition: matrix_vector_product.h:51
FiniteElement * finite_element_pt(const unsigned &e) const
Definition: mesh.h:473
int face_index_at_boundary(const unsigned &b, const unsigned &e) const
Definition: mesh.h:896
unsigned nboundary_element(const unsigned &b) const
Return number of finite elements that are adjacent to boundary b.
Definition: mesh.h:878
void output_fct(std::ostream &outfile, const unsigned &n_plot, FiniteElement::SteadyExactSolutionFctPt)
Output a given Vector function at f(n_plot) points in each element.
Definition: mesh.cc:2199
unsigned nboundary() const
Return number of boundaries.
Definition: mesh.h:827
FiniteElement * boundary_element_pt(const unsigned &b, const unsigned &e) const
Return pointer to e-th finite element on boundary b.
Definition: mesh.h:840
GeneralisedElement *& element_pt(const unsigned long &e)
Return pointer to element e.
Definition: mesh.h:448
unsigned long nnode() const
Return number of nodes in the mesh.
Definition: mesh.h:596
void output(std::ostream &outfile)
Output for all elements.
Definition: mesh.cc:2027
Node *& node_pt(const unsigned long &n)
Return pointer to global node n.
Definition: mesh.h:436
unsigned long nelement() const
Return number of elements in the mesh.
Definition: mesh.h:590
Definition: navier_stokes_preconditioners.h:1214
void setup()
Broken assignment operator.
NavierStokesExactPreconditioner(const NavierStokesExactPreconditioner &)=delete
Broken copy constructor.
void preconditioner_solve(const Vector< double > &r, Vector< double > &z)
Apply preconditioner to r.
~NavierStokesExactPreconditioner()
Destructor - do nothing.
Definition: navier_stokes_preconditioners.h:1221
MATRIX P_matrix
Preconditioner matrix.
Definition: navier_stokes_preconditioners.h:1240
NavierStokesExactPreconditioner()
Constructor - do nothing.
Definition: navier_stokes_preconditioners.h:1217
Definition: navier_stokes_preconditioners.h:607
void pin_all_non_pressure_dofs()
Pin all non-pressure dofs.
Definition: navier_stokes_preconditioners.h:862
void setup()
Setup the preconditioner.
Definition: driven_cavity_with_simple_lsc_preconditioner.cc:167
void set_p_superlu_preconditioner()
Definition: navier_stokes_preconditioners.h:759
bool Doc_time
Set Doc_time to true for outputting results of timings.
Definition: navier_stokes_preconditioners.h:1155
Preconditioner * F_preconditioner_pt
Pointer to the 'preconditioner' for the F matrix.
Definition: navier_stokes_preconditioners.h:1121
void validate(DocInfo &doc_info, Problem *orig_problem_pt)
Definition: navier_stokes_preconditioners.h:854
void use_fp()
Use Fp version of the preconditioner.
Definition: navier_stokes_preconditioners.h:788
bool Accept_non_NavierStokesElementWithDiagonalMassMatrices_elements
Definition: navier_stokes_preconditioners.h:1137
Problem * Problem_pt
Definition: navier_stokes_preconditioners.h:1196
bool Preconditioner_has_been_setup
Definition: navier_stokes_preconditioners.h:1132
bool Use_robin_for_fp
Use Robin BC elements for Fp preconditoner?
Definition: navier_stokes_preconditioners.h:1181
bool Pin_first_pressure_dof_in_press_adv_diff
Definition: navier_stokes_preconditioners.h:1192
void set_problem_pt(Problem *problem_pt)
Broken assignment operator.
Definition: navier_stokes_preconditioners.h:684
void disable_accept_non_NavierStokesElementWithDiagonalMassMatrices_elements()
Definition: navier_stokes_preconditioners.h:713
void set_p_preconditioner(Preconditioner *new_p_preconditioner_pt)
Function to set a new pressure matrix preconditioner (inexact solver)
Definition: navier_stokes_preconditioners.h:745
void unpin_first_pressure_dof_in_press_adv_diff()
Definition: navier_stokes_preconditioners.h:846
void clean_up_memory()
Helper function to delete preconditioner data.
Definition: navier_stokes_preconditioners.cc:1672
Mesh * Navier_stokes_mesh_pt
Definition: navier_stokes_preconditioners.h:1171
MatrixVectorProduct * F_mat_vec_pt
MatrixVectorProduct operator for F.
Definition: navier_stokes_preconditioners.h:1164
MatrixVectorProduct * E_mat_vec_pt
MatrixVectorProduct operator for E = Fp Qp^{-1} (only for Fp variant)
Definition: navier_stokes_preconditioners.h:1167
bool Use_LSC
Boolean to indicate use of LSC (true) or Fp (false) variant.
Definition: navier_stokes_preconditioners.h:1178
bool Using_default_p_preconditioner
flag indicating whether the default P preconditioner is used
Definition: navier_stokes_preconditioners.h:1127
MatrixVectorProduct * QBt_mat_vec_pt
MatrixVectorProduct operator for Qv^{-1} Bt.
Definition: navier_stokes_preconditioners.h:1158
bool Using_default_f_preconditioner
flag indicating whether the default F preconditioner is used
Definition: navier_stokes_preconditioners.h:1124
bool Allow_multiple_element_type_in_navier_stokes_mesh
Definition: navier_stokes_preconditioners.h:1175
Preconditioner * P_preconditioner_pt
Pointer to the 'preconditioner' for the pressure matrix.
Definition: navier_stokes_preconditioners.h:1118
void set_f_preconditioner(Preconditioner *new_f_preconditioner_pt)
Function to set a new momentum matrix preconditioner (inexact solver)
Definition: navier_stokes_preconditioners.h:769
void assemble_inv_press_and_veloc_mass_matrix_diagonal(CRDoubleMatrix *&inv_p_mass_pt, CRDoubleMatrix *&inv_v_mass_pt, const bool &do_both)
Definition: navier_stokes_preconditioners.cc:846
NavierStokesSchurComplementPreconditioner(const NavierStokesSchurComplementPreconditioner &)=delete
Broken copy constructor.
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 get_pressure_advection_diffusion_matrix(CRDoubleMatrix &fp_matrix)
Get the pressure advection diffusion matrix.
Definition: navier_stokes_preconditioners.h:880
NavierStokesSchurComplementPreconditioner(Problem *problem_pt)
Constructor - sets defaults for control flags.
Definition: navier_stokes_preconditioners.h:610
void enable_robin_for_fp()
Use Robin BC elements for the Fp preconditioner.
Definition: navier_stokes_preconditioners.h:820
bool F_preconditioner_is_block_preconditioner
Definition: navier_stokes_preconditioners.h:1152
MatrixVectorProduct * Bt_mat_vec_pt
MatrixVectorProduct operator for Bt.
Definition: navier_stokes_preconditioners.h:1161
virtual ~NavierStokesSchurComplementPreconditioner()
Destructor.
Definition: navier_stokes_preconditioners.h:664
void preconditioner_solve(const DoubleVector &r, DoubleVector &z)
Apply preconditioner to Vector r.
Definition: driven_cavity_with_simple_lsc_preconditioner.cc:384
void disable_doc_time()
Disable documentation of time.
Definition: navier_stokes_preconditioners.h:811
void disable_robin_for_fp()
Don't use Robin BC elements for the Fp preconditioenr.
Definition: navier_stokes_preconditioners.h:826
void use_lsc()
Use LSC version of the preconditioner.
Definition: navier_stokes_preconditioners.h:782
void enable_doc_time()
Enable documentation of time.
Definition: navier_stokes_preconditioners.h:805
void reset_pin_status()
Reset pin status of all values.
Definition: navier_stokes_preconditioners.h:1060
void set_f_superlu_preconditioner()
Definition: navier_stokes_preconditioners.h:795
std::map< Data *, std::vector< int > > Eqn_number_backup
Definition: navier_stokes_preconditioners.h:1185
void enable_accept_non_NavierStokesElementWithDiagonalMassMatrices_elements()
Definition: navier_stokes_preconditioners.h:705
void pin_first_pressure_dof_in_press_adv_diff()
Definition: navier_stokes_preconditioners.h:836
Problem * problem_pt() const
Definition: navier_stokes_preconditioners.h:689
double & x(const unsigned &i)
Return the i-th nodal coordinate.
Definition: nodes.h:1060
Definition: oomph_definitions.h:222
Definition: preconditioner.h:54
virtual const OomphCommunicator * comm_pt() const
Get function for comm pointer.
Definition: preconditioner.h:171
Definition: problem.h:151
unsigned add_sub_mesh(Mesh *const &mesh_pt)
Definition: problem.h:1330
AssemblyHandler *& assembly_handler_pt()
Return a pointer to the assembly handler object.
Definition: problem.h:1570
void flush_sub_meshes()
Definition: problem.h:1339
Mesh *& mesh_pt()
Return a pointer to the global mesh.
Definition: problem.h:1280
void newton_solve()
Use Newton method to solve the problem.
Definition: problem.cc:8783
unsigned nsub_mesh() const
Return number of submeshes.
Definition: problem.h:1323
unsigned long assign_eqn_numbers(const bool &assign_local_eqn_numbers=true)
Definition: problem.cc:1989
bool distributed() const
Definition: problem.h:808
virtual void get_jacobian(DoubleVector &residuals, DenseDoubleMatrix &jacobian)
Definition: problem.cc:3890
Data *const & variable_position_pt() const
Pointer to variable_position data (const version)
Definition: nodes.h:1765
An interface to allow SuperLU to be used as an (exact) Preconditioner.
Definition: SuperLU_preconditioner.h:40
Definition: navier_stokes_elements.h:308
virtual void pin_all_non_pressure_dofs(std::map< Data *, std::vector< int >> &eqn_number_backup)=0
Pin all non-pressure dofs and backup eqn numbers of all Data.
virtual int p_local_eqn(const unsigned &n) const =0
virtual int & pinned_fp_pressure_eqn()=0
virtual void build_fp_press_adv_diff_robin_bc_element(const unsigned &face_index)=0
virtual void delete_pressure_advection_diffusion_robin_elements()=0
RealScalar s
Definition: level1_cplx_impl.h:130
string filename
Definition: MergeRestartFiles.py:39
void get_exact_u(const Vector< double > &x, Vector< double > &u)
Exact solution as a Vector.
Definition: navier_stokes_preconditioners.cc:63
double source_function(const Vector< double > &x_vect)
Source function required to make the solution above an exact solution.
Definition: navier_stokes_preconditioners.cc:93
void wind_function(const Vector< double > &x, Vector< double > &wind)
Wind.
Definition: navier_stokes_preconditioners.cc:48
unsigned Flag
Flag for solution.
Definition: navier_stokes_preconditioners.cc:42
double Peclet
Peclet number – overwrite with actual Reynolds number.
Definition: navier_stokes_preconditioners.cc:45
DRAIG: Change all instances of (SPATIAL_DIM) to (DIM-1).
Definition: AnisotropicHookean.h:10
OomphInfo oomph_info
Definition: oomph_definitions.cc:319
list x
Definition: plotDoE.py:28
#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