28 #ifndef OOMPH_TNAVIER_STOKES_ELEMENTS_HEADER
29 #define OOMPH_TNAVIER_STOKES_ELEMENTS_HEADER
33 #include <oomph-lib-config.h>
38 #include "../generic/Telements.h"
40 #include "../generic/error_estimator.h"
59 template<
unsigned DIM>
168 double p_nst(
const unsigned&
t,
const unsigned&
i)
const
201 std::set<std::pair<Data*, unsigned>>& paired_load_data);
212 std::set<std::pair<Data*, unsigned>>& paired_pressure_data);
221 void output(std::ostream& outfile,
const unsigned& nplot)
233 void output(FILE* file_pt,
const unsigned& n_plot)
270 unsigned num_entries =
DIM + (
DIM * (
DIM - 1)) / 2;
271 if (
flux.size() < num_entries)
273 std::ostringstream error_message;
274 error_message <<
"The flux vector has the wrong number of entries, "
275 <<
flux.size() <<
", whereas it should be at least "
276 << num_entries << std::endl;
291 for (
unsigned i = 0;
i <
DIM;
i++)
293 flux[icount] = strainrate(
i,
i);
298 for (
unsigned i = 0;
i <
DIM;
i++)
300 for (
unsigned j =
i + 1;
j <
DIM;
j++)
302 flux[icount] = strainrate(
i,
j);
339 std::list<std::pair<unsigned long, unsigned>>& dof_lookup_list)
const;
349 template<
unsigned DIM>
358 double J = this->dshape_eulerian(
s, psi, dpsidx);
372 template<
unsigned DIM>
374 DIM>::dshape_and_dtest_eulerian_at_knot_nst(
const unsigned& ipt,
381 double J = this->dshape_eulerian_at_knot(ipt, psi, dpsidx);
399 template<
unsigned DIM>
412 const double J = this->dshape_eulerian_at_knot(
413 ipt, psi, dpsidx, djacobian_dX, d_dpsidx_dX);
417 for (
unsigned i = 0;
i < 9;
i++)
421 for (
unsigned k = 0;
k < 2;
k++)
423 dtestdx(
i,
k) = dpsidx(
i,
k);
425 for (
unsigned p = 0;
p < 2;
p++)
427 for (
unsigned q = 0;
q < 9;
q++)
429 d_dtestdx_dX(
p,
q,
i,
k) = d_dpsidx_dX(
p,
q,
i,
k);
462 this->pshape_nst(
s, psi);
492 this->pshape_nst(
s, psi);
528 dshape_local(
s, psi, dpsi);
534 const double det = local_to_eulerian_mapping(dpsi, inverse_jacobian);
538 transform_derivatives(inverse_jacobian, dppsidx);
587 dshape_local(
s, psi, dpsi);
593 const double det = local_to_eulerian_mapping(dpsi, inverse_jacobian);
597 transform_derivatives(inverse_jacobian, dppsidx);
662 template<
unsigned DIM>
664 std::list<std::pair<unsigned long, unsigned>>& dof_lookup_list)
const
667 unsigned n_node = this->nnode();
670 unsigned n_press = this->npres_nst();
673 std::pair<unsigned, unsigned> dof_lookup;
676 unsigned pressure_dof_number =
DIM;
679 for (
unsigned n = 0;
n < n_press;
n++)
682 int local_eqn_number = this->p_local_eqn(
n);
687 if (local_eqn_number >= 0)
691 dof_lookup.first = this->eqn_number(local_eqn_number);
692 dof_lookup.second = pressure_dof_number;
695 dof_lookup_list.push_front(dof_lookup);
700 for (
unsigned n = 0;
n < n_node;
n++)
703 unsigned nv = this->node_pt(
n)->nvalue();
706 for (
unsigned v = 0;
v < nv;
v++)
709 int local_eqn_number = this->nodal_local_eqn(
n,
v);
712 if (local_eqn_number >= 0)
716 dof_lookup.first = this->eqn_number(local_eqn_number);
717 dof_lookup.second =
v;
720 dof_lookup_list.push_front(dof_lookup);
736 template<
unsigned DIM>
857 double p_nst(
const unsigned& n_p)
const
864 double p_nst(
const unsigned&
t,
const unsigned& n_p)
const
872 return static_cast<int>(
DIM);
904 std::set<std::pair<Data*, unsigned>>& paired_load_data);
915 std::set<std::pair<Data*, unsigned>>& paired_pressure_data);
924 void output(std::ostream& outfile,
const unsigned& nplot)
936 void output(FILE* file_pt,
const unsigned& n_plot)
973 unsigned num_entries =
DIM + (
DIM * (
DIM - 1)) / 2;
974 if (
flux.size() < num_entries)
976 std::ostringstream error_message;
977 error_message <<
"The flux vector has the wrong number of entries, "
978 <<
flux.size() <<
", whereas it should be at least "
979 << num_entries << std::endl;
994 for (
unsigned i = 0;
i <
DIM;
i++)
996 flux[icount] = strainrate(
i,
i);
1001 for (
unsigned i = 0;
i <
DIM;
i++)
1003 for (
unsigned j =
i + 1;
j <
DIM;
j++)
1005 flux[icount] = strainrate(
i,
j);
1025 std::list<std::pair<unsigned long, unsigned>>& dof_lookup_list)
const
1028 unsigned n_node = this->
nnode();
1031 std::pair<unsigned, unsigned> dof_lookup;
1034 for (
unsigned n = 0;
n < n_node;
n++)
1040 for (
unsigned v = 0;
v < nv;
v++)
1048 if (local_eqn_number >= 0)
1052 dof_lookup.first = this->
eqn_number(local_eqn_number);
1055 dof_lookup.second =
v;
1058 dof_lookup_list.push_front(dof_lookup);
1095 template<
unsigned DIM>
1104 double J = this->dshape_eulerian(
s, psi, dpsidx);
1118 template<
unsigned DIM>
1120 const unsigned& ipt,
1127 double J = this->dshape_eulerian_at_knot(ipt, psi, dpsidx);
1150 ppsi[2] = 1.0 -
s[0] -
s[1];
1152 dppsidx(0, 0) = 1.0;
1153 dppsidx(0, 1) = 0.0;
1155 dppsidx(1, 0) = 0.0;
1156 dppsidx(1, 1) = 1.0;
1158 dppsidx(2, 0) = -1.0;
1159 dppsidx(2, 1) = -1.0;
1168 dshape_local(
s, psi, dpsi);
1171 const double det = local_to_eulerian_mapping(dpsi, inverse_jacobian);
1175 transform_derivatives(inverse_jacobian, dppsidx);
1202 ppsi[3] = 1.0 -
s[0] -
s[1] -
s[2];
1204 dppsidx(0, 0) = 1.0;
1205 dppsidx(0, 1) = 0.0;
1206 dppsidx(0, 2) = 0.0;
1208 dppsidx(1, 0) = 0.0;
1209 dppsidx(1, 1) = 1.0;
1210 dppsidx(1, 2) = 0.0;
1212 dppsidx(2, 0) = 0.0;
1213 dppsidx(2, 1) = 0.0;
1214 dppsidx(2, 2) = 1.0;
1216 dppsidx(3, 0) = -1.0;
1217 dppsidx(3, 1) = -1.0;
1218 dppsidx(3, 2) = -1.0;
1224 dshape_local(
s, psi, dpsi);
1230 const double det = local_to_eulerian_mapping(dpsi, inverse_jacobian);
1234 transform_derivatives(inverse_jacobian, dppsidx);
1256 const unsigned& ipt,
1266 const double J = this->dshape_eulerian_at_knot(
1267 ipt, psi, dpsidx, djacobian_dX, d_dpsidx_dX);
1271 for (
unsigned i = 0;
i < 6;
i++)
1275 for (
unsigned k = 0;
k < 2;
k++)
1277 dtestdx(
i,
k) = dpsidx(
i,
k);
1279 for (
unsigned p = 0;
p < 2;
p++)
1281 for (
unsigned q = 0;
q < 6;
q++)
1283 d_dtestdx_dX(
p,
q,
i,
k) = d_dpsidx_dX(
p,
q,
i,
k);
1305 const unsigned& ipt,
1315 const double J = this->dshape_eulerian_at_knot(
1316 ipt, psi, dpsidx, djacobian_dX, d_dpsidx_dX);
1320 for (
unsigned i = 0;
i < 10;
i++)
1324 for (
unsigned k = 0;
k < 3;
k++)
1326 dtestdx(
i,
k) = dpsidx(
i,
k);
1328 for (
unsigned p = 0;
p < 3;
p++)
1330 for (
unsigned q = 0;
q < 10;
q++)
1332 d_dtestdx_dX(
p,
q,
i,
k) = d_dpsidx_dX(
p,
q,
i,
k);
1353 psi[2] = 1.0 -
s[0] -
s[1];
1367 psi[3] = 1.0 -
s[0] -
s[1] -
s[2];
1374 template<
unsigned DIM>
1380 this->pshape_nst(
s, psi);
Array< int, Dynamic, 1 > v
Definition: Array_initializer_list_vector_cxx11.cpp:1
int i
Definition: BiCGSTAB_step_by_step.cpp:9
const unsigned n
Definition: CG3DPackingUnitTest.cpp:11
JacobiRotation< float > J
Definition: Jacobi_makeJacobi.cpp:3
float * p
Definition: Tutorial_Map_using.cpp:9
void pin(const unsigned &i)
Pin the i-th stored variable.
Definition: nodes.h:385
void set_value(const unsigned &i, const double &value_)
Definition: nodes.h:271
double value(const unsigned &i) const
Definition: nodes.h:293
Definition: error_estimator.h:79
FaceGeometry()
Definition: Tnavier_stokes_elements.h:638
FaceGeometry()
Definition: Tnavier_stokes_elements.h:650
FaceGeometry()
Definition: Tnavier_stokes_elements.h:1418
FaceGeometry()
Definition: Tnavier_stokes_elements.h:1430
FaceGeometry()
Definition: Tnavier_stokes_elements.h:615
FaceGeometry()
Definition: Tnavier_stokes_elements.h:626
FaceGeometry()
Constructor: Call constructor of base.
Definition: Tnavier_stokes_elements.h:1394
FaceGeometry()
Constructor: Call constructor of base.
Definition: Tnavier_stokes_elements.h:1406
Definition: elements.h:4998
Node *& node_pt(const unsigned &n)
Return a pointer to the local node n.
Definition: elements.h:2175
double nodal_value(const unsigned &n, const unsigned &i) const
Definition: elements.h:2593
int nodal_local_eqn(const unsigned &n, const unsigned &i) const
Definition: elements.h:1432
unsigned nnode() const
Return the number of nodes.
Definition: elements.h:2210
Definition: navier_stokes_elements.h:89
unsigned long eqn_number(const unsigned &ieqn_local) const
Definition: elements.h:704
int local_eqn_number(const unsigned long &ieqn_global) const
Definition: elements.h:726
Data *& internal_data_pt(const unsigned &i)
Return a pointer to i-th internal data object.
Definition: elements.h:622
int internal_local_eqn(const unsigned &i, const unsigned &j) const
Definition: elements.h:267
unsigned add_internal_data(Data *const &data_pt, const bool &fd=true)
Definition: elements.cc:62
Definition: navier_stokes_elements.h:395
void strain_rate(const Vector< double > &s, DenseMatrix< double > &strain_rate) const
Strain-rate tensor: 1/2 (du_i/dx_j + du_j/dx_i)
Definition: navier_stokes_elements.cc:1185
void full_output(std::ostream &outfile)
Definition: navier_stokes_elements.h:1180
void output(std::ostream &outfile)
Definition: navier_stokes_elements.h:1155
Vector< FpPressureAdvDiffRobinBCElementBase * > Pressure_advection_diffusion_robin_element_pt
Definition: navier_stokes_elements.h:475
Definition: oomph_definitions.h:222
Definition: elements.h:3439
A Rank 4 Tensor class.
Definition: matrices.h:1701
Definition: Telements.h:3570
Definition: Tnavier_stokes_elements.h:63
void full_output(std::ostream &outfile, const unsigned &nplot)
Definition: Tnavier_stokes_elements.h:320
unsigned npres_nst() const
Return number of pressure values.
Definition: Tnavier_stokes_elements.h:174
unsigned P_nst_internal_index
Definition: Tnavier_stokes_elements.h:67
void get_dof_numbers_for_unknowns(std::list< std::pair< unsigned long, unsigned >> &dof_lookup_list) const
Definition: Tnavier_stokes_elements.h:663
double p_nst(const unsigned &i) const
Definition: Tnavier_stokes_elements.h:160
TCrouzeixRaviartElement()
Constructor, there are DIM+1 internal values (for the pressure)
Definition: Tnavier_stokes_elements.h:130
void identify_pressure_data(std::set< std::pair< Data *, unsigned >> &paired_pressure_data)
Definition: Tnavier_stokes_elements.cc:101
void get_Z2_flux(const Vector< double > &s, Vector< double > &flux)
Definition: Tnavier_stokes_elements.h:267
unsigned nvertex_node() const
Number of vertex nodes in the element.
Definition: Tnavier_stokes_elements.h:247
double dshape_and_dtest_eulerian_nst(const Vector< double > &s, Shape &psi, DShape &dpsidx, Shape &test, DShape &dtestdx) const
Definition: Tnavier_stokes_elements.h:350
double dshape_and_dtest_eulerian_at_knot_nst(const unsigned &ipt, Shape &psi, DShape &dpsidx, Shape &test, DShape &dtestdx) const
Definition: Tnavier_stokes_elements.h:374
void output(std::ostream &outfile)
Redirect output to NavierStokesEquations output.
Definition: Tnavier_stokes_elements.h:215
void fix_pressure(const unsigned &p_dof, const double &p_value)
Pin p_dof-th pressure dof and set it to value specified by p_value.
Definition: Tnavier_stokes_elements.h:180
void identify_load_data(std::set< std::pair< Data *, unsigned >> &paired_load_data)
Definition: Tnavier_stokes_elements.cc:64
int p_local_eqn(const unsigned &n) const
Return the local equation numbers for the pressure values.
Definition: Tnavier_stokes_elements.h:123
double dpshape_and_dptest_eulerian_nst(const Vector< double > &s, Shape &ppsi, DShape &dppsidx, Shape &ptest, DShape &dptestdx) const
void unpin_all_internal_pressure_dofs()
Unpin all internal pressure dofs.
Definition: Tnavier_stokes_elements.cc:42
void output(FILE *file_pt)
Redirect output to NavierStokesEquations output.
Definition: Tnavier_stokes_elements.h:227
unsigned nrecovery_order()
Definition: Tnavier_stokes_elements.h:241
void output(std::ostream &outfile, const unsigned &nplot)
Redirect output to NavierStokesEquations output.
Definition: Tnavier_stokes_elements.h:221
void build_fp_press_adv_diff_robin_bc_element(const unsigned &face_index)
Definition: Tnavier_stokes_elements.h:189
double p_nst(const unsigned &t, const unsigned &i) const
Definition: Tnavier_stokes_elements.h:168
void pshape_nst(const Vector< double > &s, Shape &psi, Shape &test) const
Pressure shape and test functions at local coordinte s.
virtual unsigned required_nvalue(const unsigned &n) const
Broken assignment operator.
Definition: Tnavier_stokes_elements.h:151
void pshape_nst(const Vector< double > &s, Shape &psi) const
Pressure shape functions at local coordinate s.
void output(FILE *file_pt, const unsigned &n_plot)
Redirect output to NavierStokesEquations output.
Definition: Tnavier_stokes_elements.h:233
Node * vertex_node_pt(const unsigned &j) const
Pointer to the j-th vertex node in the element.
Definition: Tnavier_stokes_elements.h:253
unsigned num_Z2_flux_terms()
Number of 'flux' terms for Z2 error estimation.
Definition: Tnavier_stokes_elements.h:259
TCrouzeixRaviartElement(const TCrouzeixRaviartElement< DIM > &dummy)=delete
Broken copy constructor.
unsigned ndof_types() const
Definition: Tnavier_stokes_elements.h:327
void full_output(std::ostream &outfile)
Definition: Tnavier_stokes_elements.h:312
Definition: Telements.h:1208
Definition: Tnavier_stokes_elements.h:741
unsigned p_index_nst()
Which nodal value represents the pressure?
Definition: Tnavier_stokes_elements.h:840
void pin_all_nodal_pressure_dofs()
Pin all nodal pressure dofs.
Definition: Tnavier_stokes_elements.cc:170
TTaylorHoodElement()
Constructor, no internal data points.
Definition: Tnavier_stokes_elements.h:810
static const unsigned TEMPLATE_PARAMETER_DIM
Publicly exposed template parameter.
Definition: Tnavier_stokes_elements.h:744
unsigned nrecovery_order()
Definition: Tnavier_stokes_elements.h:943
unsigned num_Z2_flux_terms()
Number of 'flux' terms for Z2 error estimation.
Definition: Tnavier_stokes_elements.h:962
double dshape_and_dtest_eulerian_at_knot_nst(const unsigned &ipt, Shape &psi, DShape &dpsidx, Shape &test, DShape &dtestdx) const
Definition: Tnavier_stokes_elements.h:1119
Node * vertex_node_pt(const unsigned &j) const
Pointer to the j-th vertex node in the element.
Definition: Tnavier_stokes_elements.h:955
void identify_pressure_data(std::set< std::pair< Data *, unsigned >> &paired_pressure_data)
Definition: Tnavier_stokes_elements.cc:241
void unpin_proper_nodal_pressure_dofs()
Unpin the proper nodal pressure dofs.
Definition: Tnavier_stokes_elements.cc:187
static const unsigned Initial_Nvalue[]
Static array of ints to hold number of variables at node.
Definition: Tnavier_stokes_elements.h:751
void unpin_all_nodal_pressure_dofs()
Unpin all pressure dofs.
Definition: Tnavier_stokes_elements.cc:150
void build_fp_press_adv_diff_robin_bc_element(const unsigned &face_index)
Definition: Tnavier_stokes_elements.h:889
void output(std::ostream &outfile, const unsigned &nplot)
Redirect output to NavierStokesEquations output.
Definition: Tnavier_stokes_elements.h:924
double dshape_and_dtest_eulerian_at_knot_nst(const unsigned &ipt, Shape &psi, DShape &dpsidx, RankFourTensor< double > &d_dpsidx_dX, Shape &test, DShape &dtestdx, RankFourTensor< double > &d_dtestdx_dX, DenseMatrix< double > &djacobian_dX) const
virtual unsigned required_nvalue(const unsigned &n) const
Broken assignment operator.
Definition: Tnavier_stokes_elements.h:821
void get_Z2_flux(const Vector< double > &s, Vector< double > &flux)
Definition: Tnavier_stokes_elements.h:970
void pshape_nst(const Vector< double > &s, Shape &psi) const
Test whether the pressure dof p_dof hanging or not?
void get_dof_numbers_for_unknowns(std::list< std::pair< unsigned long, unsigned >> &dof_lookup_list) const
Definition: Tnavier_stokes_elements.h:1024
virtual double dpshape_and_dptest_eulerian_nst(const Vector< double > &s, Shape &ppsi, DShape &dppsidx, Shape &ptest, DShape &dptestdx) const
unsigned nvertex_node() const
Number of vertex nodes in the element.
Definition: Tnavier_stokes_elements.h:949
static const unsigned TEMPLATE_PARAMETER_NNODE_1D
Publicly exposed template parameter.
Definition: Tnavier_stokes_elements.h:747
double p_nst(const unsigned &t, const unsigned &n_p) const
Definition: Tnavier_stokes_elements.h:864
double p_nst(const unsigned &n_p) const
Definition: Tnavier_stokes_elements.h:857
unsigned ndof_types() const
Definition: Tnavier_stokes_elements.h:1013
void output(FILE *file_pt, const unsigned &n_plot)
Redirect output to NavierStokesEquations output.
Definition: Tnavier_stokes_elements.h:936
int p_nodal_index_nst() const
Set the value at which the pressure is stored in the nodes.
Definition: Tnavier_stokes_elements.h:870
TTaylorHoodElement(const TTaylorHoodElement< DIM > &dummy)=delete
Broken copy constructor.
void output(std::ostream &outfile)
Redirect output to NavierStokesEquations output.
Definition: Tnavier_stokes_elements.h:918
int p_local_eqn(const unsigned &n) const
Pointer to n_p-th pressure node.
Definition: Tnavier_stokes_elements.h:850
static const unsigned Pconv[]
Definition: Tnavier_stokes_elements.h:756
void identify_load_data(std::set< std::pair< Data *, unsigned >> &paired_load_data)
Definition: Tnavier_stokes_elements.cc:212
unsigned npres_nst() const
Return number of pressure values.
void fix_pressure(const unsigned &p_dof, const double &p_value)
Pin p_dof-th pressure dof and set it to value specified by p_value.
Definition: Tnavier_stokes_elements.h:879
void output(FILE *file_pt)
Redirect output to NavierStokesEquations output.
Definition: Tnavier_stokes_elements.h:930
double dshape_and_dtest_eulerian_nst(const Vector< double > &s, Shape &psi, DShape &dpsidx, Shape &test, DShape &dtestdx) const
Definition: Tnavier_stokes_elements.h:1096
RealScalar s
Definition: level1_cplx_impl.h:130
char char char int int * k
Definition: level2_impl.h:374
#define DIM
Definition: linearised_navier_stokes_elements.h:44
EIGEN_DEVICE_FUNC const Scalar & q
Definition: SpecialFunctionsImpl.h:2019
void flux(const double &time, const Vector< double > &x, double &flux)
Get flux applied along boundary x=0.
Definition: pretend_melt.cc:59
DRAIG: Change all instances of (SPATIAL_DIM) to (DIM-1).
Definition: AnisotropicHookean.h:10
t
Definition: plotPSD.py:36
Definition: indexed_view.cpp:20
#define OOMPH_EXCEPTION_LOCATION
Definition: oomph_definitions.h:61
#define OOMPH_CURRENT_FUNCTION
Definition: oomph_definitions.h:86
void set(Container &c, Position position, const Value &value)
Definition: stdlist_overload.cpp:36
std::ptrdiff_t j
Definition: tut_arithmetic_redux_minmax.cpp:2