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)
257 return DIM + (DIM * (DIM - 1)) / 2;
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;
273 OOMPH_CURRENT_FUNCTION,
274 OOMPH_EXCEPTION_LOCATION);
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)
952 return DIM + (DIM * (DIM - 1)) / 2;
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;
968 OOMPH_CURRENT_FUNCTION,
969 OOMPH_EXCEPTION_LOCATION);
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++)
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);
A Class for the derivatives of shape functions The class design is essentially the same as Shape,...
A class that represents a collection of data; each Data object may contain many different individual ...
void pin(const unsigned &i)
Pin the i-th stored variable.
void set_value(const unsigned &i, const double &value_)
Set the i-th stored data value to specified value. The only reason that we require an explicit set fu...
double value(const unsigned &i) const
Return i-th stored value. This function is not virtual so that it can be inlined. This means that if ...
Base class for finite elements that can compute the quantities that are required for the Z2 error est...
FaceGeometry()
Constructor: Call constructor of base.
FaceGeometry()
Constructor: Call constructor of base.
//////////////////////////////////////////////////////////////////// ////////////////////////////////...
Node *& node_pt(const unsigned &n)
Return a pointer to the local node n.
double nodal_value(const unsigned &n, const unsigned &i) const
Return the i-th value stored at local node n. Produces suitably interpolated values for hanging nodes...
int nodal_local_eqn(const unsigned &n, const unsigned &i) const
Return the local equation number corresponding to the i-th value at the n-th local node.
unsigned nnode() const
Return the number of nodes.
unsigned add_internal_data(Data *const &data_pt, const bool &fd=true)
Add a (pointer to an) internal data object to the element and return the index required to obtain it ...
unsigned long eqn_number(const unsigned &ieqn_local) const
Return the global equation number corresponding to the ieqn_local-th local equation number.
int local_eqn_number(const unsigned long &ieqn_global) const
Return the local equation number corresponding to the ieqn_global-th global equation number....
Data *& internal_data_pt(const unsigned &i)
Return a pointer to i-th internal data object.
int internal_local_eqn(const unsigned &i, const unsigned &j) const
Return the local equation number corresponding to the j-th value stored at the i-th internal data.
//////////////////////////////////////////////////////////////////// ////////////////////////////////...
void output(std::ostream &outfile)
Output function: x,y,[z],u,v,[w],p in tecplot format. Default number of plot points.
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)
void full_output(std::ostream &outfile)
Full output function: x,y,[z],u,v,[w],p,du/dt,dv/dt,[dw/dt],dissipation in tecplot format....
///////////////////////////////////////////////////////////////////////////
void output(FILE *file_pt)
Redirect output to NavierStokesEquations output.
void identify_load_data(std::set< std::pair< Data *, unsigned >> &paired_load_data)
Add to the set paired_load_data pairs of pointers to data objects and unsignedegers that index the va...
unsigned num_Z2_flux_terms()
Number of 'flux' terms for Z2 error estimation.
void output(std::ostream &outfile)
Redirect output to NavierStokesEquations output.
void output(std::ostream &outfile, const unsigned &nplot)
Redirect output to NavierStokesEquations output.
void output(FILE *file_pt, const unsigned &n_plot)
Redirect output to NavierStokesEquations output.
Node * vertex_node_pt(const unsigned &j) const
Pointer to the j-th vertex node in the element.
unsigned nvertex_node() const
Number of vertex nodes in the element.
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.
double dshape_and_dtest_eulerian_nst(const Vector< double > &s, Shape &psi, DShape &dpsidx, Shape &test, DShape &dtestdx) const
Velocity shape and test functions and their derivs w.r.t. to global coords at local coordinate s (tak...
double dpshape_and_dptest_eulerian_nst(const Vector< double > &s, Shape &ppsi, DShape &dppsidx, Shape &ptest, DShape &dptestdx) const
Pressure shape and test functions and their derivs w.r.t. to global coords at local coordinate s (tak...
void identify_pressure_data(std::set< std::pair< Data *, unsigned >> &paired_pressure_data)
Add to the set paired_pressure_data pairs containing.
double p_nst(const unsigned &t, const unsigned &i) const
Return the pressure values at internal dof i_internal (Discontinous pressure interpolation – no need ...
int p_local_eqn(const unsigned &n) const
Return the local equation numbers for the pressure values.
double dshape_and_dtest_eulerian_at_knot_nst(const unsigned &ipt, Shape &psi, DShape &dpsidx, Shape &test, DShape &dtestdx) const
Velocity shape and test functions and their derivs w.r.t. to global coords at ipt-th integation point...
unsigned npres_nst() const
Return number of pressure values.
void full_output(std::ostream &outfile, const unsigned &nplot)
Full output function: x,y,[z],u,v,[w],p,du/dt,dv/dt,[dw/dt],dissipation in tecplot format....
unsigned ndof_types() const
The number of "DOF types" that degrees of freedom in this element are sub-divided into: Velocity and ...
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
Return the pressure values at internal dof i_internal (Discontinous pressure interpolation – no need ...
virtual unsigned required_nvalue(const unsigned &n) const
Broken assignment operator.
void full_output(std::ostream &outfile)
Full output function: x,y,[z],u,v,[w],p,du/dt,dv/dt,[dw/dt],dissipation in tecplot format....
void unpin_all_internal_pressure_dofs()
Unpin all internal pressure dofs.
unsigned P_nst_internal_index
Internal index that indicates at which internal datum the pressure is stored.
GeneralisedNewtonianTCrouzeixRaviartElement()
Constructor, there are DIM+1 internal values (for the pressure)
void get_dof_numbers_for_unknowns(std::list< std::pair< unsigned long, unsigned >> &dof_lookup_list) const
Create a list of pairs for all unknowns in this element, so that the first entry in each pair contain...
GeneralisedNewtonianTCrouzeixRaviartElement(const GeneralisedNewtonianTCrouzeixRaviartElement< DIM > &dummy)=delete
Broken copy constructor.
unsigned nrecovery_order()
Order of recovery shape functions for Z2 error estimation: Same order as unenriched shape functions.
void get_Z2_flux(const Vector< double > &s, Vector< double > &flux)
Get 'flux' for Z2 error recovery: Upper triangular entries in strain rate tensor.
///////////////////////////////////////////////////////////////////////// ///////////////////////////...
double p_nst(const unsigned &n_p) const
Access function for the pressure values at local pressure node n_p (const version)
void identify_load_data(std::set< std::pair< Data *, unsigned >> &paired_load_data)
Add to the set paired_load_data pairs containing.
static const unsigned Initial_Nvalue[]
Static array of ints to hold number of variables at node.
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.
unsigned npres_nst() const
Return number of pressure values.
void output(std::ostream &outfile, const unsigned &nplot)
Redirect output to NavierStokesEquations output.
int p_local_eqn(const unsigned &n) const
Pointer to n_p-th pressure node.
double dshape_and_dtest_eulerian_nst(const Vector< double > &s, Shape &psi, DShape &dpsidx, Shape &test, DShape &dtestdx) const
Velocity shape and test functions and their derivs w.r.t. to global coords at local coordinate s (tak...
void pin_all_nodal_pressure_dofs()
Pin all nodal pressure dofs.
void output(FILE *file_pt)
Redirect output to NavierStokesEquations output.
void get_dof_numbers_for_unknowns(std::list< std::pair< unsigned long, unsigned >> &dof_lookup_list) const
Create a list of pairs for all unknowns in this element, so that the first entry in each pair contain...
void unpin_proper_nodal_pressure_dofs()
Unpin the proper nodal pressure dofs.
unsigned p_index_nst()
Which nodal value represents the pressure?
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.
void get_Z2_flux(const Vector< double > &s, Vector< double > &flux)
Get 'flux' for Z2 error recovery: Upper triangular entries in strain rate tensor.
double dshape_and_dtest_eulerian_at_knot_nst(const unsigned &ipt, Shape &psi, DShape &dpsidx, Shape &test, DShape &dtestdx) const
Velocity shape and test functions and their derivs w.r.t. to global coords at local coordinate s (tak...
static const unsigned Pconv[]
Static array of ints to hold conversion from pressure node numbers to actual node numbers.
GeneralisedNewtonianTTaylorHoodElement()
Constructor, no internal data points.
unsigned ndof_types() const
The number of "DOF types" that degrees of freedom in this element are sub-divided into: Velocity and ...
void unpin_all_nodal_pressure_dofs()
Unpin all pressure dofs.
void output(std::ostream &outfile)
Redirect output to NavierStokesEquations output.
double p_nst(const unsigned &t, const unsigned &n_p) const
Access function for the pressure values at local pressure node n_p (const version)
Node * vertex_node_pt(const unsigned &j) const
Pointer to the j-th vertex node in the element.
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
Shape/test functions and derivs w.r.t. to global coords at integration point ipt; return Jacobian of ...
GeneralisedNewtonianTTaylorHoodElement(const GeneralisedNewtonianTTaylorHoodElement< DIM > &dummy)=delete
Broken copy constructor.
unsigned nvertex_node() const
Number of vertex nodes in the element.
virtual double dpshape_and_dptest_eulerian_nst(const Vector< double > &s, Shape &ppsi, DShape &dppsidx, Shape &ptest, DShape &dptestdx) const
Compute the pressure shape and test functions and derivatives w.r.t. global coords at local coordinat...
void output(FILE *file_pt, const unsigned &n_plot)
Redirect output to NavierStokesEquations output.
unsigned nrecovery_order()
Order of recovery shape functions for Z2 error estimation: Same order as shape functions.
int p_nodal_index_nst() const
Set the value at which the pressure is stored in the nodes.
unsigned num_Z2_flux_terms()
Number of 'flux' terms for Z2 error estimation.
void identify_pressure_data(std::set< std::pair< Data *, unsigned >> &paired_pressure_data)
Add to the set paired_pressure_data pairs containing.
Nodes are derived from Data, but, in addition, have a definite (Eulerian) position in a space of a gi...
An OomphLibError object which should be thrown when an run-time error is encountered....
/////////////////////////////////////////////////////////////////////// /////////////////////////////...
////////////////////////////////////////////////////////////////// //////////////////////////////////...
A Class for shape functions. In simple cases, the shape functions have only one index that can be tho...
//////////////////////////////////////////////////////////////////// ////////////////////////////////...
//////////////////////////////////////////////////////////////////// ////////////////////////////////...