28#ifndef OOMPH_REFINEABLE_NAVIER_STOKES_ELEMENTS_HEADER
29#define OOMPH_REFINEABLE_NAVIER_STOKES_ELEMENTS_HEADER
33#include <oomph-lib-config.h>
58 template<
class ELEMENT>
85 template<
class ELEMENT>
112 ELEMENT*
bulk_el_pt =
dynamic_cast<ELEMENT*
>(this->bulk_element_pt());
140 "Pressure advection diffusion does not work in this case\n",
167 s_bulk = this->local_coordinate_in_bulk(
s);
177 for (
unsigned i = 0;
i <
my_dim + 1;
i++)
183 if (flux > 0.0) flux = 0.0;
317 template<
unsigned DIM>
409 std::ostringstream error_message;
410 error_message <<
"The flux vector has the wrong number of entries, "
411 << flux.
size() <<
", whereas it should be at least "
427 for (
unsigned i = 0;
i <
DIM;
i++)
434 for (
unsigned i = 0;
i <
DIM;
i++)
436 for (
unsigned j =
i + 1;
j <
DIM;
j++)
457 this->
Re_pt = cast_father_element_pt->re_pt();
459 this->
ReSt_pt = cast_father_element_pt->re_st_pt();
461 this->
ReInvFr_pt = cast_father_element_pt->re_invfr_pt();
463 this->
G_pt = cast_father_element_pt->g_pt();
549 global_eqn_number.resize(
n_u_dof, 0);
647 template<
unsigned DIM>
747 values.resize(
DIM + 1, 0.0);
750 for (
unsigned i = 0;
i <
DIM;
i++)
768 values.resize(
DIM + 1);
771 for (
unsigned i = 0;
i <
DIM + 1;
i++)
784 for (
unsigned i = 0;
i <
DIM;
i++)
868 for (
unsigned i = 0;
i <
DIM;
i++)
877 else if (
s[
i] == 1.0)
900 index[
i] *
static_cast<unsigned>(
pow(
static_cast<float>(
NNODE_1D),
901 static_cast<int>(
i)));
934 return static_cast<unsigned>(
pow(2.0,
static_cast<int>(
DIM)));
938 return this->
nnode();
983 unsigned u_index[
DIM];
984 for (
unsigned i = 0;
i <
DIM;
i++)
1000 unsigned nmaster =
nod_pt->hanging_pt()->nmaster();
1003 for (
unsigned j = 0;
j < nmaster;
j++)
1009 for (
unsigned i = 0;
i <
DIM;
i++)
1021 for (
unsigned i = 0;
i <
DIM;
i++)
1024 std::make_pair(this->
node_pt(
n), u_index[
i]));
1049 for (
unsigned m = 0;
m < nmaster;
m++)
1073 template<
unsigned DIM>
1087 template<
unsigned DIM>
1089 :
public virtual FaceGeometry<FaceGeometry<QTaylorHoodElement<DIM>>>
1104 template<
unsigned DIM>
1182 values.resize(
DIM, 0.0);
1185 for (
unsigned i = 0;
i <
DIM;
i++)
1208 for (
unsigned i = 0;
i <
DIM;
i++)
1221 for (
unsigned i = 0;
i <
DIM;
i++)
1267 unsigned u_index[
DIM];
1268 for (
unsigned i = 0;
i <
DIM;
i++)
1281 if (
nod_pt->is_hanging())
1284 unsigned nmaster =
nod_pt->hanging_pt()->nmaster();
1287 for (
unsigned j = 0;
j < nmaster;
j++)
1293 for (
unsigned i = 0;
i <
DIM;
i++)
1305 for (
unsigned i = 0;
i <
DIM;
i++)
1308 std::make_pair(this->
node_pt(
n), u_index[
i]));
1331 template<
unsigned DIM>
1359 this->p_order() = 3;
1405 double p_nst(
const unsigned&
t,
const unsigned&
i)
const
1413 return (this->p_order() - 2) * (this->p_order() - 2);
1510 values.resize(
DIM, 0.0);
1513 for (
unsigned i = 0;
i <
DIM;
i++)
1536 for (
unsigned i = 0;
i <
DIM;
i++)
1549 for (
unsigned i = 0;
i <
DIM;
i++)
1575 template<
unsigned DIM>
1577 :
public virtual FaceGeometry<QCrouzeixRaviartElement<DIM>>
1589 template<
unsigned DIM>
1591 :
public virtual FaceGeometry<FaceGeometry<QCrouzeixRaviartElement<DIM>>>
1609 using namespace QuadTreeNames;
1645 double slope1 = quadtree_pt()
1656 double slope2 = quadtree_pt()
1717 using namespace OcTreeNames;
1752 double slope1 = octree_pt()
1763 double slope2 = octree_pt()
1774 double slope3 = octree_pt()
1785 double slope4 = octree_pt()
1930 using namespace QuadTreeNames;
1933 int son_type = quadtree_pt()->son_type();
1949 else if (son_type == SE)
1955 else if (son_type == NE)
1962 else if (son_type == NW)
1978 for (
unsigned i = 1;
i < 3;
i++)
2002 using namespace OcTreeNames;
2005 int son_type = octree_pt()->son_type();
2009 octree_pt()->father_pt()->object_pt());
2014 for (
unsigned i = 0;
i < 3;
i++)
2029 for (
unsigned i = 1;
i < 4;
i++)
2060 for (
unsigned i = 0;
i < nnode_1d() * nnode_1d();
i++)
2079 2>::dshape_and_dtest_eulerian_at_knot_nst(
const unsigned&
ipt,
2090 for (
unsigned i = 0;
i < nnode_1d() * nnode_1d();
i++)
2120 for (
unsigned i = 0;
i < nnode_1d() * nnode_1d() * nnode_1d();
i++)
2140 3>::dshape_and_dtest_eulerian_at_knot_nst(
const unsigned&
ipt,
2151 for (
unsigned i = 0;
i < nnode_1d() * nnode_1d() * nnode_1d();
i++)
2171 unsigned npres = this->npres_nst();
2208 if (this->npres_nst() == 1)
2214 for (
unsigned i = 0;
i < this->npres_nst();
i++)
test[
i] =
psi[
i];
2226 unsigned npres = this->npres_nst();
2268 if (this->npres_nst() == 1)
2274 for (
unsigned i = 0;
i < this->npres_nst();
i++)
test[
i] =
psi[
i];
bool ALE_is_disabled
Boolean flag to indicate if ALE formulation is disabled when time-derivatives are computed....
AdvectionDiffusionReactionSourceFctPt & source_fct_pt()
Access function: Pointer to source function.
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 unpin(const unsigned &i)
Unpin 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...
unsigned nvalue() const
Return number of values stored in data object (incl pinned ones).
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 ...
long & eqn_number(const unsigned &i)
Return the equation number of the i-th stored variable.
virtual void resize(const unsigned &n_value)
Change (increase) the number of values that may be stored.
Base class for finite elements that can compute the quantities that are required for the Z2 error est...
FaceElements are elements that coincide with the faces of higher-dimensional "bulk" elements....
int & face_index()
Index of the face (a number that uniquely identifies the face in the element)
FaceGeometry class definition: This policy class is used to allow construction of face elements that ...
A general Finite Element class.
virtual double J_eulerian(const Vector< double > &s) const
Return the Jacobian of mapping from local to global coordinates at local position s.
Integral *const & integral_pt() const
Return the pointer to the integration scheme (const version)
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...
virtual Node * get_node_at_local_coordinate(const Vector< double > &s) const
If there is a node at this local coordinate, return the pointer to the node.
virtual unsigned nvertex_node() const
Return the number of vertex nodes in this element. Broken virtual function in "pure" finite elements.
double size() const
Calculate the size of the element (length, area, volume,...) in Eulerian computational coordinates....
static const double Node_location_tolerance
Default value for the tolerance to be used when locating nodes via local coordinates.
virtual void shape(const Vector< double > &s, Shape &psi) const =0
Calculate the geometric shape functions at local coordinate s. This function must be overloaded for e...
unsigned dim() const
Return the spatial dimension of the element, i.e. the number of local coordinates required to paramet...
unsigned nnode() const
Return the number of nodes.
Node *& node_pt(const unsigned &n)
Return a pointer to the local node n.
virtual unsigned nnode_1d() const
Return the number of nodes along one edge of the element Default is to return zero — must be overload...
virtual void set_integration_scheme(Integral *const &integral_pt)
Set the spatial integration scheme.
virtual Node * vertex_node_pt(const unsigned &j) const
Pointer to the j-th vertex node in the element. Broken virtual function in "pure" finite elements.
virtual double local_one_d_fraction_of_node(const unsigned &n1d, const unsigned &i)
Get the local fraction of any node in the n-th position in a one dimensional expansion along the i-th...
A class for elements that allow the imposition of Robin boundary conditions for the pressure advectio...
unsigned long eqn_number(const unsigned &ieqn_local) const
Return the global equation number corresponding to the ieqn_local-th local equation number.
Data *& internal_data_pt(const unsigned &i)
Return a pointer to i-th internal data object.
Class that contains data for hanging nodes.
virtual double knot(const unsigned &i, const unsigned &j) const =0
Return local coordinate s[j] of i-th integration point.
virtual unsigned nweight() const =0
Return the number of integration points of the scheme.
virtual double weight(const unsigned &i) const =0
Return weight of i-th integration point.
A class for elements that solve the cartesian Navier–Stokes equations, templated by the dimension DIM...
double * Viscosity_Ratio_pt
Pointer to the viscosity ratio (relative to the viscosity used in the definition of the Reynolds numb...
NavierStokesSourceFctPt Source_fct_pt
Pointer to volumetric source function.
virtual unsigned u_index_nst(const unsigned &i) const
Return the index at which the i-th unknown velocity component is stored. The default value,...
double * Re_pt
Pointer to global Reynolds number.
void interpolated_u_nst(const Vector< double > &s, Vector< double > &veloc) const
Compute vector of FE interpolated velocity u at local coordinate s.
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)
Vector< double > * G_pt
Pointer to global gravity Vector.
virtual double interpolated_p_nst(const Vector< double > &s) const
Return FE interpolated pressure at local coordinate s.
double * ReInvFr_pt
Pointer to global Reynolds number x inverse Froude number (= Bond number / Capillary number)
double * Density_Ratio_pt
Pointer to the density ratio (relative to the density used in the definition of the Reynolds number)
NavierStokesBodyForceFctPt Body_force_fct_pt
Pointer to body force function.
double * ReSt_pt
Pointer to global Reynolds number x Strouhal number (=Womersley)
bool ALE_is_disabled
Boolean flag to indicate if ALE formulation is disabled when time-derivatives are computed....
Vector< FpPressureAdvDiffRobinBCElementBase * > Pressure_advection_diffusion_robin_element_pt
Storage for FaceElements that apply Robin BC for pressure adv diff equation used in Fp preconditioner...
Nodes are derived from Data, but, in addition, have a definite (Eulerian) position in a space of a gi...
bool is_hanging() const
Test whether the node is geometrically hanging.
HangInfo *const & hanging_pt() const
Return pointer to hanging node data (this refers to the geometric hanging node status) (const version...
static Vector< Vector< int > > Direction_to_vector
For each direction, i.e. a son_type (vertex), a face or an edge, this defines a vector that indicates...
Non-templated class that returns modal hierachical shape functions based on Legendre polynomials.
An OomphLibError object which should be thrown when an run-time error is encountered....
p-refineable version of Crouzeix Raviart elements. Generic class definitions
void rebuild_from_sons(Mesh *&mesh_pt)
Rebuild from sons: Reconstruct pressure from the (merged) sons This must be specialised for each dime...
void pshape_nst(const Vector< double > &s, Shape &psi) const
Pressure shape functions at local coordinate s.
double p_nst(const unsigned &t, const unsigned &i) const
Pressure at local pressure "node" n_p at time level t.
~PRefineableQCrouzeixRaviartElement()
Destructor.
Node * vertex_node_pt(const unsigned &j) const
Pointer to the j-th vertex node in the element.
double p_nst(const unsigned &i) const
Broken assignment operator.
void further_build()
Further build for Crouzeix_Raviart interpolates the internal pressure dofs from father element: Make ...
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 nvertex_node() const
Number of vertex nodes in the element.
PRefineableQCrouzeixRaviartElement(const PRefineableQCrouzeixRaviartElement< DIM > &dummy)=delete
Broken copy constructor.
unsigned required_nvalue(const unsigned &n) const
Number of values (pinned or dofs) required at local node n.
void pshape_nst(const Vector< double > &s, Shape &psi, Shape &test) const
Pressure shape and test functions at local coordinte s.
unsigned npres_nst() const
// Return number of pressure values
void unpin_elemental_pressure_dofs()
Unpin all internal pressure dofs.
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 further_setup_hanging_nodes()
Perform additional hanging node procedures for variables that are not interpolated by all nodes....
unsigned nrecovery_order()
Order of recovery shape functions for Z2 error estimation:
unsigned ncont_interpolated_values() const
Number of continuously interpolated values: DIM (velocities)
PRefineableQCrouzeixRaviartElement()
Constructor.
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...
void get_interpolated_values(const Vector< double > &s, Vector< double > &values)
Get the function value u in Vector. Note: Given the generality of the interface (this function is usu...
void get_interpolated_values(const unsigned &t, const Vector< double > &s, Vector< double > &values)
Get all function values [u,v..,p] at previous timestep t (t=0: present; t>0: previous timestep).
A class that is used to template the p-refineable Q elements by dimension. It's really nothing more t...
Crouzeix_Raviart elements are Navier–Stokes elements with quadratic interpolation for velocities and ...
unsigned npres_nst() const
Return number of pressure values.
unsigned P_nst_internal_index
Internal index that indicates at which internal data the pressure is stored.
Taylor–Hood elements are Navier–Stokes elements with quadratic interpolation for velocities and posit...
void pshape_nst(const Vector< double > &s, Shape &psi) const
Pressure shape functions at local coordinate s.
virtual int p_nodal_index_nst() const
Set the value at which the pressure is stored in the nodes.
static const unsigned Pconv[]
Static array of ints to hold conversion from pressure node numbers to actual node numbers.
unsigned npres_nst() const
Return number of pressure values.
RefineableElements are FiniteElements that may be subdivided into children to provide a better local ...
virtual RefineableElement * father_element_pt() const
Return a pointer to the father element.
A class for elements that allow the imposition of Robin boundary conditions for the pressure advectio...
RefineableFpPressureAdvDiffRobinBCElement(FiniteElement *const &element_pt, const int &face_index)
Constructor, which takes a "bulk" element and the value of the index and its limit.
virtual void fill_in_generic_residual_contribution_fp_press_adv_diff_robin_bc(Vector< double > &residuals, DenseMatrix< double > &jacobian, unsigned flag)
This function returns the residuals for the traction function. flag=1 (or 0): do (or don't) compute t...
Refineable version of the Navier–Stokes equations.
static void unpin_all_pressure_dofs(const Vector< GeneralisedElement * > &element_pt)
Unpin all pressure dofs in elements listed in vector.
RefineableNavierStokesEquations()
Constructor.
virtual void pin_elemental_redundant_nodal_pressure_dofs()
Pin unused nodal pressure dofs (empty by default, because by default pressure dofs are not associated...
void fill_in_generic_residual_contribution_nst(Vector< double > &residuals, DenseMatrix< double > &jacobian, DenseMatrix< double > &mass_matrix, unsigned flag)
Add element's contribution to elemental residual vector and/or Jacobian matrix flag=1: compute both f...
void further_build()
Further build, pass the pointers down to the sons.
void dinterpolated_u_nst_ddata(const Vector< double > &s, const unsigned &i, Vector< double > &du_ddata, Vector< unsigned > &global_eqn_number)
Compute the derivatives of the i-th component of velocity at point s with respect to all data that ca...
unsigned num_Z2_flux_terms()
Number of 'flux' terms for Z2 error estimation.
static void pin_redundant_nodal_pressures(const Vector< GeneralisedElement * > &element_pt)
Loop over all elements in Vector (which typically contains all the elements in a fluid mesh) and pin ...
void get_pressure_and_velocity_mass_matrix_diagonal(Vector< double > &press_mass_diag, Vector< double > &veloc_mass_diag, const unsigned &which_one=0)
Compute the diagonal of the velocity/pressure mass matrices. If which one=0, both are computed,...
void fill_in_generic_pressure_advection_diffusion_contribution_nst(Vector< double > &residuals, DenseMatrix< double > &jacobian, unsigned flag)
Compute the residuals for the associated pressure advection diffusion problem. Used by the Fp precond...
virtual void get_dresidual_dnodal_coordinates(RankThreeTensor< double > &dresidual_dnodal_coordinates)
Compute derivatives of elemental residual vector with respect to nodal coordinates....
virtual void unpin_elemental_pressure_dofs()=0
Unpin all pressure dofs in the element.
virtual Node * pressure_node_pt(const unsigned &n_p)
Pointer to n_p-th pressure node (Default: NULL, indicating that pressure is not based on nodal interp...
void get_Z2_flux(const Vector< double > &s, Vector< double > &flux)
Get 'flux' for Z2 error recovery: Upper triangular entries in strain rate tensor.
Refineable version of Crouzeix Raviart elements. Generic class definitions.
void get_interpolated_values(const unsigned &t, const Vector< double > &s, Vector< double > &values)
Get all function values [u,v..,p] at previous timestep t (t=0: present; t>0: previous timestep).
unsigned ncont_interpolated_values() const
Broken assignment operator.
void unpin_elemental_pressure_dofs()
Unpin all internal pressure dofs.
void get_interpolated_values(const Vector< double > &s, Vector< double > &values)
Get the function value u in Vector. Note: Given the generality of the interface (this function is usu...
unsigned nrecovery_order()
Order of recovery shape functions for Z2 error estimation: Same order as shape functions.
void build_fp_press_adv_diff_robin_bc_element(const unsigned &face_index)
Build FaceElements that apply the Robin boundary condition to the pressure advection diffusion proble...
Node * vertex_node_pt(const unsigned &j) const
Pointer to the j-th vertex node in the element.
RefineableQCrouzeixRaviartElement()
Constructor.
void further_build()
Further build for Crouzeix_Raviart interpolates the internal pressure dofs from father element: Make ...
void further_setup_hanging_nodes()
Perform additional hanging node procedures for variables that are not interpolated by all nodes....
void rebuild_from_sons(Mesh *&mesh_pt)
Rebuild from sons: Reconstruct pressure from the (merged) sons This must be specialised for each dime...
unsigned nvertex_node() const
Number of vertex nodes in the element.
void identify_load_data(std::set< std::pair< Data *, unsigned > > &paired_load_data)
Add to the set paired_load_data pairs containing.
RefineableQCrouzeixRaviartElement(const RefineableQCrouzeixRaviartElement< DIM > &dummy)=delete
Broken copy constructor.
A class that is used to template the refineable Q elements by dimension. It's really nothing more tha...
Refineable version of Taylor Hood elements. These classes can be written in total generality.
unsigned ninterpolating_node_1d(const int &value_id)
The number of 1d pressure nodes is 2, the number of 1d velocity nodes is the same as the number of 1d...
unsigned ninterpolating_node(const int &value_id)
The number of pressure nodes is 2^DIM. The number of velocity nodes is the same as the number of geom...
void get_interpolated_values(const Vector< double > &s, Vector< double > &values)
Get the function value u in Vector. Note: Given the generality of the interface (this function is usu...
void unpin_elemental_pressure_dofs()
Unpin all pressure dofs.
Node * interpolating_node_pt(const unsigned &n, const int &value_id)
The velocities are isoparametric and so the "nodes" interpolating the velocities are the geometric no...
void rebuild_from_sons(Mesh *&mesh_pt)
Rebuild from sons: empty.
unsigned nvertex_node() const
Number of vertex nodes in the element.
RefineableQTaylorHoodElement()
Constructor.
void pin_elemental_redundant_nodal_pressure_dofs()
Pin all nodal pressure dofs that are not required.
unsigned nrecovery_order()
Order of recovery shape functions for Z2 error estimation: Same order as shape functions.
unsigned required_nvalue(const unsigned &n) const
Number of values required at local node n. In order to simplify matters, we allocate storage for pres...
void further_setup_hanging_nodes()
Perform additional hanging node procedures for variables that are not interpolated by all nodes....
double local_one_d_fraction_of_interpolating_node(const unsigned &n1d, const unsigned &i, const int &value_id)
The pressure nodes are the corner nodes, so when n_value==DIM, the fraction is the same as the 1d nod...
unsigned ncont_interpolated_values() const
Number of continuously interpolated values: (DIM velocities + 1 pressure)
void get_interpolated_values(const unsigned &t, const Vector< double > &s, Vector< double > &values)
Get the function value u in Vector. Note: Given the generality of the interface (this function is usu...
Node * get_interpolating_node_at_local_coordinate(const Vector< double > &s, const int &value_id)
The velocity nodes are the same as the geometric nodes. The pressure nodes must be calculated by usin...
void build_fp_press_adv_diff_robin_bc_element(const unsigned &face_index)
Build FaceElements that apply the Robin boundary condition to the pressure advection diffusion proble...
Node * vertex_node_pt(const unsigned &j) const
Pointer to the j-th vertex node in the element.
Node * pressure_node_pt(const unsigned &n_p)
Pointer to n_p-th pressure node.
void interpolating_basis(const Vector< double > &s, Shape &psi, const int &value_id) const
The basis interpolating the pressure is given by pshape(). / The basis interpolating the velocity is ...
void identify_load_data(std::set< std::pair< Data *, unsigned > > &paired_load_data)
Add to the set paired_load_data pairs containing.
A Class for shape functions. In simple cases, the shape functions have only one index that can be tho...
TAdvectionDiffusionReactionElement<NREAGENT,DIM,NNODE_1D> elements are isoparametric triangular DIM-d...
TAdvectionDiffusionReactionElement()
Constructor: Call constructors for TElement and AdvectionDiffusionReaction equations.
DRAIG: Change all instances of (SPATIAL_DIM) to (DIM-1).