28 #ifndef OOMPH_GENERALISED_NEWTONIAN_TNAVIER_STOKES_ELEMENTS_HEADER
29 #define OOMPH_GENERALISED_NEWTONIAN_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>
172 double p_nst(
const unsigned&
t,
const unsigned&
i)
const
196 std::set<std::pair<Data*, unsigned>>& paired_load_data);
207 std::set<std::pair<Data*, unsigned>>& paired_pressure_data);
216 void output(std::ostream& outfile,
const unsigned& nplot)
228 void output(FILE* file_pt,
const unsigned& n_plot)
265 unsigned num_entries =
DIM + (
DIM * (
DIM - 1)) / 2;
266 if (
flux.size() < num_entries)
268 std::ostringstream error_message;
269 error_message <<
"The flux vector has the wrong number of entries, "
270 <<
flux.size() <<
", whereas it should be at least "
271 << num_entries << std::endl;
286 for (
unsigned i = 0;
i <
DIM;
i++)
288 flux[icount] = strainrate(
i,
i);
293 for (
unsigned i = 0;
i <
DIM;
i++)
295 for (
unsigned j =
i + 1;
j <
DIM;
j++)
297 flux[icount] = strainrate(
i,
j);
335 std::list<std::pair<unsigned long, unsigned>>& dof_lookup_list)
const;
345 template<
unsigned DIM>
346 inline double GeneralisedNewtonianTCrouzeixRaviartElement<
354 double J = this->dshape_eulerian(
s, psi, dpsidx);
368 template<
unsigned DIM>
370 DIM>::dshape_and_dtest_eulerian_at_knot_nst(
const unsigned& ipt,
377 double J = this->dshape_eulerian_at_knot(ipt, psi, dpsidx);
395 template<
unsigned DIM>
408 const double J = this->dshape_eulerian_at_knot(
409 ipt, psi, dpsidx, djacobian_dX, d_dpsidx_dX);
413 for (
unsigned i = 0;
i < 9;
i++)
417 for (
unsigned k = 0;
k < 2;
k++)
419 dtestdx(
i,
k) = dpsidx(
i,
k);
421 for (
unsigned p = 0;
p < 2;
p++)
423 for (
unsigned q = 0;
q < 9;
q++)
425 d_dtestdx_dX(
p,
q,
i,
k) = d_dpsidx_dX(
p,
q,
i,
k);
457 this->pshape_nst(
s, psi);
486 this->pshape_nst(
s, psi);
522 dshape_local(
s, psi, dpsi);
528 const double det = local_to_eulerian_mapping(dpsi, inverse_jacobian);
532 transform_derivatives(inverse_jacobian, dppsidx);
581 dshape_local(
s, psi, dpsi);
587 const double det = local_to_eulerian_mapping(dpsi, inverse_jacobian);
591 transform_derivatives(inverse_jacobian, dppsidx);
659 template<
unsigned DIM>
662 std::list<std::pair<unsigned long, unsigned>>& dof_lookup_list)
const
665 unsigned n_node = this->nnode();
668 unsigned n_press = this->npres_nst();
671 std::pair<unsigned, unsigned> dof_lookup;
674 unsigned pressure_dof_number =
DIM;
677 for (
unsigned n = 0;
n < n_press;
n++)
680 int local_eqn_number = this->p_local_eqn(
n);
685 if (local_eqn_number >= 0)
689 dof_lookup.first = this->eqn_number(local_eqn_number);
690 dof_lookup.second = pressure_dof_number;
693 dof_lookup_list.push_front(dof_lookup);
698 for (
unsigned n = 0;
n < n_node;
n++)
701 unsigned nv = this->node_pt(
n)->nvalue();
704 for (
unsigned v = 0;
v < nv;
v++)
707 int local_eqn_number = this->nodal_local_eqn(
n,
v);
710 if (local_eqn_number >= 0)
714 dof_lookup.first = this->eqn_number(local_eqn_number);
715 dof_lookup.second =
v;
718 dof_lookup_list.push_front(dof_lookup);
734 template<
unsigned DIM>
854 double p_nst(
const unsigned& n_p)
const
861 double p_nst(
const unsigned&
t,
const unsigned& n_p)
const
869 return static_cast<int>(
DIM);
891 std::set<std::pair<Data*, unsigned>>& paired_load_data);
902 std::set<std::pair<Data*, unsigned>>& paired_pressure_data);
911 void output(std::ostream& outfile,
const unsigned& nplot)
923 void output(FILE* file_pt,
const unsigned& n_plot)
960 unsigned num_entries =
DIM + (
DIM * (
DIM - 1)) / 2;
961 if (
flux.size() < num_entries)
963 std::ostringstream error_message;
964 error_message <<
"The flux vector has the wrong number of entries, "
965 <<
flux.size() <<
", whereas it should be at least "
966 << num_entries << std::endl;
981 for (
unsigned i = 0;
i <
DIM;
i++)
983 flux[icount] = strainrate(
i,
i);
988 for (
unsigned i = 0;
i <
DIM;
i++)
990 for (
unsigned j =
i + 1;
j <
DIM;
j++)
992 flux[icount] = strainrate(
i,
j);
1012 std::list<std::pair<unsigned long, unsigned>>& dof_lookup_list)
const
1015 unsigned n_node = this->
nnode();
1018 std::pair<unsigned, unsigned> dof_lookup;
1021 for (
unsigned n = 0;
n < n_node;
n++)
1027 for (
unsigned v = 0;
v < nv;
v++)
1035 if (local_eqn_number >= 0)
1039 dof_lookup.first = this->
eqn_number(local_eqn_number);
1042 dof_lookup.second =
v;
1045 dof_lookup_list.push_front(dof_lookup);
1082 template<
unsigned DIM>
1091 double J = this->dshape_eulerian(
s, psi, dpsidx);
1105 template<
unsigned DIM>
1107 DIM>::dshape_and_dtest_eulerian_at_knot_nst(
const unsigned& ipt,
1114 double J = this->dshape_eulerian_at_knot(ipt, psi, dpsidx);
1137 ppsi[2] = 1.0 -
s[0] -
s[1];
1139 dppsidx(0, 0) = 1.0;
1140 dppsidx(0, 1) = 0.0;
1142 dppsidx(1, 0) = 0.0;
1143 dppsidx(1, 1) = 1.0;
1145 dppsidx(2, 0) = -1.0;
1146 dppsidx(2, 1) = -1.0;
1155 dshape_local(
s, psi, dpsi);
1158 const double det = local_to_eulerian_mapping(dpsi, inverse_jacobian);
1162 transform_derivatives(inverse_jacobian, dppsidx);
1189 ppsi[3] = 1.0 -
s[0] -
s[1] -
s[2];
1191 dppsidx(0, 0) = 1.0;
1192 dppsidx(0, 1) = 0.0;
1193 dppsidx(0, 2) = 0.0;
1195 dppsidx(1, 0) = 0.0;
1196 dppsidx(1, 1) = 1.0;
1197 dppsidx(1, 2) = 0.0;
1199 dppsidx(2, 0) = 0.0;
1200 dppsidx(2, 1) = 0.0;
1201 dppsidx(2, 2) = 1.0;
1203 dppsidx(3, 0) = -1.0;
1204 dppsidx(3, 1) = -1.0;
1205 dppsidx(3, 2) = -1.0;
1211 dshape_local(
s, psi, dpsi);
1217 const double det = local_to_eulerian_mapping(dpsi, inverse_jacobian);
1221 transform_derivatives(inverse_jacobian, dppsidx);
1244 const unsigned& ipt,
1254 const double J = this->dshape_eulerian_at_knot(
1255 ipt, psi, dpsidx, djacobian_dX, d_dpsidx_dX);
1259 for (
unsigned i = 0;
i < 6;
i++)
1263 for (
unsigned k = 0;
k < 2;
k++)
1265 dtestdx(
i,
k) = dpsidx(
i,
k);
1267 for (
unsigned p = 0;
p < 2;
p++)
1269 for (
unsigned q = 0;
q < 6;
q++)
1271 d_dtestdx_dX(
p,
q,
i,
k) = d_dpsidx_dX(
p,
q,
i,
k);
1294 const unsigned& ipt,
1304 const double J = this->dshape_eulerian_at_knot(
1305 ipt, psi, dpsidx, djacobian_dX, d_dpsidx_dX);
1309 for (
unsigned i = 0;
i < 10;
i++)
1313 for (
unsigned k = 0;
k < 3;
k++)
1315 dtestdx(
i,
k) = dpsidx(
i,
k);
1317 for (
unsigned p = 0;
p < 3;
p++)
1319 for (
unsigned q = 0;
q < 10;
q++)
1321 d_dtestdx_dX(
p,
q,
i,
k) = d_dpsidx_dX(
p,
q,
i,
k);
1342 psi[2] = 1.0 -
s[0] -
s[1];
1356 psi[3] = 1.0 -
s[0] -
s[1] -
s[2];
1363 template<
unsigned DIM>
1368 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: generalised_newtonian_Tnavier_stokes_elements.h:634
FaceGeometry()
Definition: generalised_newtonian_Tnavier_stokes_elements.h:647
FaceGeometry()
Definition: generalised_newtonian_Tnavier_stokes_elements.h:1408
FaceGeometry()
Definition: generalised_newtonian_Tnavier_stokes_elements.h:1420
FaceGeometry()
Definition: generalised_newtonian_Tnavier_stokes_elements.h:610
FaceGeometry()
Definition: generalised_newtonian_Tnavier_stokes_elements.h:621
FaceGeometry()
Constructor: Call constructor of base.
Definition: generalised_newtonian_Tnavier_stokes_elements.h:1383
FaceGeometry()
Constructor: Call constructor of base.
Definition: generalised_newtonian_Tnavier_stokes_elements.h:1396
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
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: generalised_newtonian_navier_stokes_elements.h:120
void output(std::ostream &outfile)
Definition: generalised_newtonian_navier_stokes_elements.h:837
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: generalised_newtonian_navier_stokes_elements.cc:1012
void full_output(std::ostream &outfile)
Definition: generalised_newtonian_navier_stokes_elements.h:862
Definition: generalised_newtonian_Tnavier_stokes_elements.h:64
void output(FILE *file_pt)
Redirect output to NavierStokesEquations output.
Definition: generalised_newtonian_Tnavier_stokes_elements.h:222
void identify_load_data(std::set< std::pair< Data *, unsigned >> &paired_load_data)
Definition: generalised_newtonian_Tnavier_stokes_elements.cc:65
unsigned num_Z2_flux_terms()
Number of 'flux' terms for Z2 error estimation.
Definition: generalised_newtonian_Tnavier_stokes_elements.h:254
void output(std::ostream &outfile)
Redirect output to NavierStokesEquations output.
Definition: generalised_newtonian_Tnavier_stokes_elements.h:210
void output(std::ostream &outfile, const unsigned &nplot)
Redirect output to NavierStokesEquations output.
Definition: generalised_newtonian_Tnavier_stokes_elements.h:216
void output(FILE *file_pt, const unsigned &n_plot)
Redirect output to NavierStokesEquations output.
Definition: generalised_newtonian_Tnavier_stokes_elements.h:228
Node * vertex_node_pt(const unsigned &j) const
Pointer to the j-th vertex node in the element.
Definition: generalised_newtonian_Tnavier_stokes_elements.h:248
unsigned nvertex_node() const
Number of vertex nodes in the element.
Definition: generalised_newtonian_Tnavier_stokes_elements.h:242
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: generalised_newtonian_Tnavier_stokes_elements.h:184
double dshape_and_dtest_eulerian_nst(const Vector< double > &s, Shape &psi, DShape &dpsidx, Shape &test, DShape &dtestdx) const
Definition: generalised_newtonian_Tnavier_stokes_elements.h:347
double dpshape_and_dptest_eulerian_nst(const Vector< double > &s, Shape &ppsi, DShape &dppsidx, Shape &ptest, DShape &dptestdx) const
void identify_pressure_data(std::set< std::pair< Data *, unsigned >> &paired_pressure_data)
Definition: generalised_newtonian_Tnavier_stokes_elements.cc:102
double p_nst(const unsigned &t, const unsigned &i) const
Definition: generalised_newtonian_Tnavier_stokes_elements.h:172
int p_local_eqn(const unsigned &n) const
Return the local equation numbers for the pressure values.
Definition: generalised_newtonian_Tnavier_stokes_elements.h:124
double dshape_and_dtest_eulerian_at_knot_nst(const unsigned &ipt, Shape &psi, DShape &dpsidx, Shape &test, DShape &dtestdx) const
Definition: generalised_newtonian_Tnavier_stokes_elements.h:370
unsigned npres_nst() const
Return number of pressure values.
Definition: generalised_newtonian_Tnavier_stokes_elements.h:178
void full_output(std::ostream &outfile, const unsigned &nplot)
Definition: generalised_newtonian_Tnavier_stokes_elements.h:315
unsigned ndof_types() const
Definition: generalised_newtonian_Tnavier_stokes_elements.h:323
void pshape_nst(const Vector< double > &s, Shape &psi) const
Pressure shape functions at local coordinate s.
void pshape_nst(const Vector< double > &s, Shape &psi, Shape &test) const
Pressure shape and test functions at local coordinte s.
double p_nst(const unsigned &i) const
Definition: generalised_newtonian_Tnavier_stokes_elements.h:164
virtual unsigned required_nvalue(const unsigned &n) const
Broken assignment operator.
Definition: generalised_newtonian_Tnavier_stokes_elements.h:155
void full_output(std::ostream &outfile)
Definition: generalised_newtonian_Tnavier_stokes_elements.h:307
void unpin_all_internal_pressure_dofs()
Unpin all internal pressure dofs.
Definition: generalised_newtonian_Tnavier_stokes_elements.cc:43
unsigned P_nst_internal_index
Definition: generalised_newtonian_Tnavier_stokes_elements.h:68
GeneralisedNewtonianTCrouzeixRaviartElement()
Constructor, there are DIM+1 internal values (for the pressure)
Definition: generalised_newtonian_Tnavier_stokes_elements.h:131
void get_dof_numbers_for_unknowns(std::list< std::pair< unsigned long, unsigned >> &dof_lookup_list) const
Definition: generalised_newtonian_Tnavier_stokes_elements.h:661
GeneralisedNewtonianTCrouzeixRaviartElement(const GeneralisedNewtonianTCrouzeixRaviartElement< DIM > &dummy)=delete
Broken copy constructor.
unsigned nrecovery_order()
Definition: generalised_newtonian_Tnavier_stokes_elements.h:236
void get_Z2_flux(const Vector< double > &s, Vector< double > &flux)
Definition: generalised_newtonian_Tnavier_stokes_elements.h:262
Definition: generalised_newtonian_Tnavier_stokes_elements.h:740
double p_nst(const unsigned &n_p) const
Definition: generalised_newtonian_Tnavier_stokes_elements.h:854
void identify_load_data(std::set< std::pair< Data *, unsigned >> &paired_load_data)
Definition: generalised_newtonian_Tnavier_stokes_elements.cc:219
static const unsigned Initial_Nvalue[]
Static array of ints to hold number of variables at node.
Definition: generalised_newtonian_Tnavier_stokes_elements.h:743
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: generalised_newtonian_Tnavier_stokes_elements.h:876
unsigned npres_nst() const
Return number of pressure values.
void output(std::ostream &outfile, const unsigned &nplot)
Redirect output to NavierStokesEquations output.
Definition: generalised_newtonian_Tnavier_stokes_elements.h:911
int p_local_eqn(const unsigned &n) const
Pointer to n_p-th pressure node.
Definition: generalised_newtonian_Tnavier_stokes_elements.h:847
double dshape_and_dtest_eulerian_nst(const Vector< double > &s, Shape &psi, DShape &dpsidx, Shape &test, DShape &dtestdx) const
Definition: generalised_newtonian_Tnavier_stokes_elements.h:1084
void pin_all_nodal_pressure_dofs()
Pin all nodal pressure dofs.
Definition: generalised_newtonian_Tnavier_stokes_elements.cc:176
void output(FILE *file_pt)
Redirect output to NavierStokesEquations output.
Definition: generalised_newtonian_Tnavier_stokes_elements.h:917
void get_dof_numbers_for_unknowns(std::list< std::pair< unsigned long, unsigned >> &dof_lookup_list) const
Definition: generalised_newtonian_Tnavier_stokes_elements.h:1011
void unpin_proper_nodal_pressure_dofs()
Unpin the proper nodal pressure dofs.
Definition: generalised_newtonian_Tnavier_stokes_elements.cc:194
unsigned p_index_nst()
Which nodal value represents the pressure?
Definition: generalised_newtonian_Tnavier_stokes_elements.h:837
void pshape_nst(const Vector< double > &s, Shape &psi) const
Test whether the pressure dof p_dof hanging or not?
virtual unsigned required_nvalue(const unsigned &n) const
Broken assignment operator.
Definition: generalised_newtonian_Tnavier_stokes_elements.h:818
void get_Z2_flux(const Vector< double > &s, Vector< double > &flux)
Definition: generalised_newtonian_Tnavier_stokes_elements.h:957
double dshape_and_dtest_eulerian_at_knot_nst(const unsigned &ipt, Shape &psi, DShape &dpsidx, Shape &test, DShape &dtestdx) const
Definition: generalised_newtonian_Tnavier_stokes_elements.h:1107
static const unsigned Pconv[]
Definition: generalised_newtonian_Tnavier_stokes_elements.h:748
GeneralisedNewtonianTTaylorHoodElement()
Constructor, no internal data points.
Definition: generalised_newtonian_Tnavier_stokes_elements.h:802
unsigned ndof_types() const
Definition: generalised_newtonian_Tnavier_stokes_elements.h:1000
void unpin_all_nodal_pressure_dofs()
Unpin all pressure dofs.
Definition: generalised_newtonian_Tnavier_stokes_elements.cc:155
void output(std::ostream &outfile)
Redirect output to NavierStokesEquations output.
Definition: generalised_newtonian_Tnavier_stokes_elements.h:905
double p_nst(const unsigned &t, const unsigned &n_p) const
Definition: generalised_newtonian_Tnavier_stokes_elements.h:861
Node * vertex_node_pt(const unsigned &j) const
Pointer to the j-th vertex node in the element.
Definition: generalised_newtonian_Tnavier_stokes_elements.h:942
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
GeneralisedNewtonianTTaylorHoodElement(const GeneralisedNewtonianTTaylorHoodElement< DIM > &dummy)=delete
Broken copy constructor.
unsigned nvertex_node() const
Number of vertex nodes in the element.
Definition: generalised_newtonian_Tnavier_stokes_elements.h:936
virtual double dpshape_and_dptest_eulerian_nst(const Vector< double > &s, Shape &ppsi, DShape &dppsidx, Shape &ptest, DShape &dptestdx) const
void output(FILE *file_pt, const unsigned &n_plot)
Redirect output to NavierStokesEquations output.
Definition: generalised_newtonian_Tnavier_stokes_elements.h:923
unsigned nrecovery_order()
Definition: generalised_newtonian_Tnavier_stokes_elements.h:930
int p_nodal_index_nst() const
Set the value at which the pressure is stored in the nodes.
Definition: generalised_newtonian_Tnavier_stokes_elements.h:867
unsigned num_Z2_flux_terms()
Number of 'flux' terms for Z2 error estimation.
Definition: generalised_newtonian_Tnavier_stokes_elements.h:949
void identify_pressure_data(std::set< std::pair< Data *, unsigned >> &paired_pressure_data)
Definition: generalised_newtonian_Tnavier_stokes_elements.cc:248
Definition: oomph_definitions.h:222
Definition: elements.h:3439
A Rank 4 Tensor class.
Definition: matrices.h:1701
Definition: Telements.h:3570
Definition: Telements.h:1208
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