27 #ifndef OOMPH_REFINEABLE_DISCONTINUOUS_GALERKIN_SPACE_TIME_NAVIER_STOKES_ELEMENTS_HEADER
28 #define OOMPH_REFINEABLE_DISCONTINUOUS_GALERKIN_SPACE_TIME_NAVIER_STOKES_ELEMENTS_HEADER
32 #include <oomph-lib-config.h>
52 template<
class ELEMENT>
53 class RefineableFpPressureAdvDiffRobinBCSpaceTimeElement
54 :
public virtual FpPressureAdvDiffRobinBCSpaceTimeElement<ELEMENT>
74 const unsigned& construct_jacobian_flag);
82 template<
class ELEMENT>
102 unsigned my_dim = this->dim();
119 unsigned n_intpt = this->integral_pt()->nweight();
125 int local_unknown = 0;
128 ELEMENT* bulk_el_pt =
dynamic_cast<ELEMENT*
>(this->bulk_element_pt());
131 unsigned n_pres = bulk_el_pt->npres_nst();
135 int p_index = bulk_el_pt->p_nodal_index_nst();
139 bool pressure_dof_is_hanging[n_pres];
145 for (
unsigned l = 0; l < n_pres; ++l)
148 pressure_dof_is_hanging[l] =
149 bulk_el_pt->pressure_node_pt(l)->is_hanging(p_index);
156 std::ostringstream error_message_stream;
159 error_message_stream <<
"Pressure advection diffusion does not work "
160 <<
"in this case!" << std::endl;
163 throw OomphLibError(error_message_stream.str(),
168 for (
unsigned l = 0; l < n_pres; ++l)
171 pressure_dof_is_hanging[l] =
false;
176 double re = bulk_el_pt->re();
179 Shape psip(n_pres), testp(n_pres);
182 for (
unsigned ipt = 0; ipt < n_intpt; ipt++)
185 double w = this->integral_pt()->weight(ipt);
188 for (
unsigned i = 0;
i < my_dim;
i++)
189 s[
i] = this->integral_pt()->knot(ipt,
i);
192 s_bulk = this->local_coordinate_in_bulk(
s);
195 this->outer_unit_normal(ipt, unit_normal);
198 bulk_el_pt->interpolated_u_nst(s_bulk,
velocity);
202 for (
unsigned i = 0;
i < my_dim + 1;
i++)
211 double interpolated_press = bulk_el_pt->interpolated_p_nst(s_bulk);
214 bulk_el_pt->pshape_nst(s_bulk, psip, testp);
217 double J = this->J_eulerian(
s);
224 unsigned n_master = 1;
225 double hang_weight = 1.0;
228 for (
unsigned l = 0; l < n_pres; l++)
231 if (pressure_dof_is_hanging[l])
235 hang_info_pt = bulk_el_pt->pressure_node_pt(l)->hanging_pt(p_index);
238 n_master = hang_info_pt->
nmaster();
247 for (
unsigned m = 0;
m < n_master;
m++)
251 if (pressure_dof_is_hanging[l])
254 local_eqn = bulk_el_pt->local_hang_eqn(
261 local_eqn = bulk_el_pt->p_local_eqn(l);
268 residuals[local_eqn] -=
269 re *
flux * interpolated_press * testp[l] *
W * hang_weight;
275 unsigned n_master2 = 1;
276 double hang_weight2 = 1.0;
279 for (
unsigned l2 = 0; l2 < n_pres; l2++)
282 if (pressure_dof_is_hanging[l2])
285 bulk_el_pt->pressure_node_pt(l2)->hanging_pt(p_index);
288 n_master2 = hang_info2_pt->
nmaster();
297 for (
unsigned m2 = 0;
m2 < n_master2;
m2++)
301 if (pressure_dof_is_hanging[l2])
304 local_unknown = bulk_el_pt->local_hang_eqn(
311 local_unknown = bulk_el_pt->p_local_eqn(l2);
316 if (local_unknown >= 0)
318 jacobian(local_eqn, local_unknown) -=
319 (re *
flux * psip[l2] * testp[l] *
W * hang_weight *
338 template<
unsigned DIM>
339 class RefineableSpaceTimeNavierStokesEquations
340 :
public virtual SpaceTimeNavierStokesEquations<DIM>,
341 public virtual RefineableElement,
342 public virtual ElementWithZ2ErrorEstimator
376 unsigned n_element = element_pt.size();
379 for (
unsigned e = 0;
e < n_element;
e++)
394 unsigned n_element = element_pt.size();
397 for (
unsigned e = 0;
e < n_element;
e++)
423 const unsigned& which_one = 0);
441 unsigned num_entries = (
DIM + (
DIM * (
DIM - 1)) / 2) +
DIM;
444 if (
flux.size() < num_entries)
446 std::ostringstream error_message;
447 error_message <<
"The flux vector has the wrong number of entries, "
448 <<
flux.size() <<
", whereas it should be at least "
449 << num_entries << std::endl;
466 for (
unsigned i = 0;
i <
DIM;
i++)
469 flux[icount] = strainrate(
i,
i);
476 for (
unsigned i = 0;
i <
DIM;
i++)
479 for (
unsigned j =
i + 1;
j <
DIM;
j++)
482 flux[icount] = strainrate(
i,
j);
490 unsigned n_node = this->
nnode();
502 for (
unsigned j = 0;
j <
DIM;
j++)
508 for (
unsigned l = 0; l < n_node; l++)
535 this->
Re_pt = cast_father_element_pt->re_pt();
538 this->
St_pt = cast_father_element_pt->st_pt();
543 cast_father_element_pt->is_strouhal_stored_as_external_data();
549 unsigned data_index = 0;
553 cast_father_element_pt->external_data_pt(data_index));
557 this->
ReInvFr_pt = cast_father_element_pt->re_invfr_pt();
560 this->
G_pt = cast_father_element_pt->g_pt();
566 this->
Source_fct_pt = cast_father_element_pt->source_fct_pt();
585 unsigned n_node = this->
nnode();
592 const unsigned u_nodal_index = this->
u_index_nst(i);
600 unsigned n_u_dof = 0;
601 for (
unsigned l = 0; l < n_node; l++)
603 unsigned n_master = 1;
612 n_master = hang_info_pt->
nmaster();
621 for (
unsigned m = 0;
m < n_master;
m++)
645 du_ddata.resize(n_u_dof, 0.0);
646 global_eqn_number.resize(n_u_dof, 0);
652 for (
unsigned l = 0; l < n_node; l++)
655 unsigned n_master = 1;
658 double hang_weight = 1.0;
670 n_master = hang_info_pt->
nmaster();
680 for (
unsigned m = 0;
m < n_master;
m++)
711 global_eqn_number[count] = global_eqn;
714 du_ddata[count] = psi[l] * hang_weight;
732 const unsigned& compute_jacobian_flag);
741 const unsigned& compute_jacobian_flag);
757 template<
unsigned DIM>
829 values.resize(
DIM + 1, 0.0);
832 for (
unsigned i = 0;
i <
DIM;
i++)
860 std::ostringstream error_message_stream;
863 error_message_stream <<
"History values don't make sense in "
864 <<
"space-time elements!" << std::endl;
946 unsigned total_index = 0;
955 for (
unsigned i = 0;
i <
DIM + 1;
i++)
965 else if (
s[
i] == 1.0)
975 double float_index = 0.5 * (1.0 +
s[
i]) * (
nnode_1d - 1);
978 index[
i] =
int(float_index);
982 double excess = float_index - index[
i];
995 index[
i] *
static_cast<unsigned>(
pow(
static_cast<float>(
nnode_1d),
996 static_cast<int>(
i)));
1016 if (value_id ==
DIM)
1035 if (value_id ==
DIM)
1038 return static_cast<unsigned>(
pow(2.0,
static_cast<int>(
DIM + 1)));
1044 return this->
nnode();
1053 const int& value_id)
const
1056 if (value_id ==
DIM)
1065 return this->
shape(s, psi);
1091 std::set<std::pair<Data*, unsigned>>& paired_load_data)
1094 unsigned u_index[
DIM];
1097 for (
unsigned i = 0;
i <
DIM;
i++)
1104 unsigned n_node = this->
nnode();
1107 for (
unsigned n = 0;
n < n_node;
n++)
1119 for (
unsigned j = 0;
j < nmaster;
j++)
1126 for (
unsigned i = 0;
i <
DIM;
i++)
1129 paired_load_data.insert(
1130 std::make_pair(master_nod_pt, u_index[
i]));
1139 for (
unsigned i = 0;
i <
DIM;
i++)
1142 paired_load_data.insert(
1143 std::make_pair(this->
node_pt(
n), u_index[
i]));
1155 for (
unsigned l = 0; l < n_pres; l++)
1168 unsigned nmaster = hang_info_pt->
nmaster();
1171 for (
unsigned m = 0;
m < nmaster;
m++)
1175 paired_load_data.insert(
1184 paired_load_data.insert(std::make_pair(pres_node_pt, p_index));
1197 unsigned n_node = this->
nnode();
1200 for (
unsigned n = 0;
n < n_node;
n++)
1215 unsigned n_node = this->
nnode();
1218 for (
unsigned n = 0;
n < n_node;
n++)
1228 for (
unsigned l = 0; l < n_pres; l++)
1237 nod_pt->
unpin(p_index);
1248 template<
unsigned DIM>
1249 class FaceGeometry<RefineableQTaylorHoodSpaceTimeElement<
DIM>>
1250 :
public virtual FaceGeometry<QTaylorHoodSpaceTimeElement<DIM>>
1263 template<
unsigned DIM>
1264 class FaceGeometry<FaceGeometry<RefineableQTaylorHoodSpaceTimeElement<
DIM>>>
1265 :
public virtual FaceGeometry<
1266 FaceGeometry<QTaylorHoodSpaceTimeElement<DIM>>>
int i
Definition: BiCGSTAB_step_by_step.cpp:9
const unsigned n
Definition: CG3DPackingUnitTest.cpp:11
Array< double, 1, 3 > e(1./3., 0.5, 2.)
JacobiRotation< float > J
Definition: Jacobi_makeJacobi.cpp:3
RowVector3d w
Definition: Matrix_resize_int.cpp:3
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
void unpin(const unsigned &i)
Unpin the i-th stored variable.
Definition: nodes.h:391
Definition: error_estimator.h:79
Definition: elements.h:4338
int & face_index()
Definition: elements.h:4626
FaceGeometry()
Constructor; empty.
Definition: refineable_discontinuous_galerkin_spacetime_navier_stokes_elements.h:1270
FaceGeometry()
Constructor; empty.
Definition: refineable_discontinuous_galerkin_spacetime_navier_stokes_elements.h:1254
Definition: elements.h:4998
Definition: elements.h:1313
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
static const double Node_location_tolerance
Definition: elements.h:1374
virtual unsigned nvertex_node() const
Definition: elements.h:2491
virtual void shape(const Vector< double > &s, Shape &psi) const =0
unsigned nnode() const
Return the number of nodes.
Definition: elements.h:2210
virtual Node * get_node_at_local_coordinate(const Vector< double > &s) const
Definition: elements.cc:3882
virtual Node * vertex_node_pt(const unsigned &j) const
Definition: elements.h:2500
virtual unsigned nnode_1d() const
Definition: elements.h:2218
double dshape_eulerian(const Vector< double > &s, Shape &psi, DShape &dpsidx) const
Definition: elements.cc:3298
virtual double local_one_d_fraction_of_node(const unsigned &n1d, const unsigned &i)
Definition: elements.h:1858
Definition: discontinuous_galerkin_equal_order_pressure_spacetime_navier_stokes_elements.h:81
double const & master_weight(const unsigned &i) const
Return weight for dofs on i-th master node.
Definition: nodes.h:808
Node *const & master_node_pt(const unsigned &i) const
Return a pointer to the i-th master node.
Definition: nodes.h:791
unsigned nmaster() const
Return the number of master nodes.
Definition: nodes.h:785
HangInfo *const & hanging_pt() const
Definition: nodes.h:1228
bool is_hanging() const
Test whether the node is geometrically hanging.
Definition: nodes.h:1285
Definition: oomph_definitions.h:222
Definition: discontinuous_galerkin_equal_order_pressure_spacetime_navier_stokes_elements.h:2120
virtual int p_nodal_index_nst() const
Set the value at which the pressure is stored in the nodes.
Definition: discontinuous_galerkin_equal_order_pressure_spacetime_navier_stokes_elements.h:2221
void pshape_nst(const Vector< double > &s, Shape &psi) const
Pressure shape functions at local coordinate s.
static const unsigned Pconv[]
Definition: discontinuous_galerkin_equal_order_pressure_spacetime_navier_stokes_elements.h:2128
unsigned npres_nst() const
Return number of pressure values.
Definition: discontinuous_galerkin_equal_order_pressure_spacetime_navier_stokes_elements.h:2255
A Rank 3 Tensor class.
Definition: matrices.h:1370
Definition: refineable_elements.h:97
virtual RefineableElement * father_element_pt() const
Return a pointer to the father element.
Definition: refineable_elements.h:539
Definition: refineable_discontinuous_galerkin_equal_order_pressure_spacetime_navier_stokes_elements.h:55
virtual void fill_in_generic_residual_contribution_fp_press_adv_diff_robin_bc(Vector< double > &residuals, DenseMatrix< double > &jacobian, const unsigned &construct_jacobian_flag)
virtual void fill_in_generic_residual_contribution_fp_press_adv_diff_robin_bc(Vector< double > &residuals, DenseMatrix< double > &jacobian, const unsigned &construct_jacobian_flag)
Definition: refineable_discontinuous_galerkin_equal_order_pressure_spacetime_navier_stokes_elements.h:84
RefineableFpPressureAdvDiffRobinBCSpaceTimeElement(FiniteElement *const &element_pt, const int &face_index)
Definition: refineable_discontinuous_galerkin_spacetime_navier_stokes_elements.h:59
Definition: Qelements.h:2259
Definition: refineable_discontinuous_galerkin_equal_order_pressure_spacetime_navier_stokes_elements.h:762
void further_setup_hanging_nodes()
Definition: refineable_discontinuous_galerkin_spacetime_navier_stokes_elements.h:877
void interpolating_basis(const Vector< double > &s, Shape &psi, const int &value_id) const
Definition: refineable_discontinuous_galerkin_spacetime_navier_stokes_elements.h:1051
void build_fp_press_adv_diff_robin_bc_element(const unsigned &face_index)
Definition: refineable_discontinuous_galerkin_spacetime_navier_stokes_elements.h:1073
unsigned ncont_interpolated_values() const
Number of continuously interpolated values.
Definition: refineable_discontinuous_galerkin_spacetime_navier_stokes_elements.h:785
Node * pressure_node_pt(const unsigned &n_p)
Pointer to n_p-th pressure node.
Definition: refineable_discontinuous_galerkin_spacetime_navier_stokes_elements.h:885
RefineableQTaylorHoodSpaceTimeElement()
Constructor.
Definition: refineable_discontinuous_galerkin_spacetime_navier_stokes_elements.h:765
double local_one_d_fraction_of_interpolating_node(const unsigned &n_1d, const unsigned &i, const int &value_id)
Definition: refineable_discontinuous_galerkin_spacetime_navier_stokes_elements.h:916
unsigned ninterpolating_node(const int &value_id)
Definition: refineable_discontinuous_galerkin_spacetime_navier_stokes_elements.h:1032
void rebuild_from_sons(Mesh *&mesh_pt)
Rebuild from sons: empty.
Definition: refineable_discontinuous_galerkin_spacetime_navier_stokes_elements.h:793
unsigned nrecovery_order()
Definition: refineable_discontinuous_galerkin_spacetime_navier_stokes_elements.h:798
void get_interpolated_values(const Vector< double > &s, Vector< double > &values)
Definition: refineable_discontinuous_galerkin_spacetime_navier_stokes_elements.h:825
unsigned nvertex_node() const
Number of vertex nodes in the element.
Definition: refineable_discontinuous_galerkin_spacetime_navier_stokes_elements.h:806
void get_interpolated_values(const unsigned &t, const Vector< double > &s, Vector< double > &values)
Definition: refineable_discontinuous_galerkin_spacetime_navier_stokes_elements.h:847
Node * interpolating_node_pt(const unsigned &n, const int &value_id)
Definition: refineable_discontinuous_galerkin_spacetime_navier_stokes_elements.h:896
unsigned required_nvalue(const unsigned &n) const
Definition: refineable_discontinuous_galerkin_spacetime_navier_stokes_elements.h:777
Node * get_interpolating_node_at_local_coordinate(const Vector< double > &s, const int &value_id)
Definition: refineable_discontinuous_galerkin_spacetime_navier_stokes_elements.h:939
unsigned ninterpolating_node_1d(const int &value_id)
Definition: refineable_discontinuous_galerkin_spacetime_navier_stokes_elements.h:1013
Node * vertex_node_pt(const unsigned &j) const
Pointer to the j-th vertex node in the element.
Definition: refineable_discontinuous_galerkin_spacetime_navier_stokes_elements.h:814
void identify_load_data(std::set< std::pair< Data *, unsigned >> &paired_load_data)
Definition: refineable_discontinuous_galerkin_spacetime_navier_stokes_elements.h:1090
void unpin_elemental_pressure_dofs()
Unpin all pressure dofs.
Definition: refineable_discontinuous_galerkin_spacetime_navier_stokes_elements.h:1191
void pin_elemental_redundant_nodal_pressure_dofs()
Pin all nodal pressure dofs that are not required.
Definition: refineable_discontinuous_galerkin_spacetime_navier_stokes_elements.h:1209
Refineable version of the Navier-Stokes equations.
Definition: refineable_discontinuous_galerkin_equal_order_pressure_spacetime_navier_stokes_elements.h:343
virtual Node * pressure_node_pt(const unsigned &n_p)
Definition: refineable_discontinuous_galerkin_spacetime_navier_stokes_elements.h:409
static void pin_redundant_nodal_pressures(const Vector< GeneralisedElement * > &element_pt)
Definition: refineable_discontinuous_galerkin_spacetime_navier_stokes_elements.h:372
void get_Z2_flux(const Vector< double > &s, Vector< double > &flux)
Definition: refineable_discontinuous_galerkin_spacetime_navier_stokes_elements.h:437
unsigned num_Z2_flux_terms()
Number of 'flux' terms for Z2 error estimation.
Definition: refineable_discontinuous_galerkin_spacetime_navier_stokes_elements.h:427
void get_pressure_and_velocity_mass_matrix_diagonal(Vector< double > &press_mass_diag, Vector< double > &veloc_mass_diag, const unsigned &which_one=0)
RefineableSpaceTimeNavierStokesEquations()
Constructor.
Definition: refineable_discontinuous_galerkin_spacetime_navier_stokes_elements.h:354
virtual void get_dresidual_dnodal_coordinates(RankThreeTensor< double > &dresidual_dnodal_coordinates)
void fill_in_generic_pressure_advection_diffusion_contribution_nst(Vector< double > &residuals, DenseMatrix< double > &jacobian, const unsigned &compute_jacobian_flag)
virtual void unpin_elemental_pressure_dofs()=0
Unpin all pressure dofs in the element.
void fill_in_generic_residual_contribution_nst(Vector< double > &residuals, DenseMatrix< double > &jacobian, DenseMatrix< double > &mass_matrix, const unsigned &compute_jacobian_flag)
static void unpin_all_pressure_dofs(const Vector< GeneralisedElement * > &element_pt)
Unpin all pressure dofs in elements listed in vector.
Definition: refineable_discontinuous_galerkin_spacetime_navier_stokes_elements.h:390
virtual void pin_elemental_redundant_nodal_pressure_dofs()
Definition: refineable_discontinuous_galerkin_spacetime_navier_stokes_elements.h:350
void further_build()
Further build, pass the pointers down to the sons.
Definition: refineable_discontinuous_galerkin_spacetime_navier_stokes_elements.h:521
void dinterpolated_u_nst_ddata(const Vector< double > &s, const unsigned &i, Vector< double > &du_ddata, Vector< unsigned > &global_eqn_number)
Definition: refineable_discontinuous_galerkin_spacetime_navier_stokes_elements.h:579
Definition: discontinuous_galerkin_equal_order_pressure_spacetime_navier_stokes_elements.h:466
double * ReInvFr_pt
Definition: discontinuous_galerkin_equal_order_pressure_spacetime_navier_stokes_elements.h:525
NavierStokesBodyForceFctPt Body_force_fct_pt
Pointer to body force function.
Definition: discontinuous_galerkin_equal_order_pressure_spacetime_navier_stokes_elements.h:531
double * St_pt
Pointer to global Reynolds number x Strouhal number (=Womersley)
Definition: discontinuous_galerkin_equal_order_pressure_spacetime_navier_stokes_elements.h:517
double * Density_Ratio_pt
Definition: discontinuous_galerkin_equal_order_pressure_spacetime_navier_stokes_elements.h:509
Vector< double > * G_pt
Pointer to global gravity Vector.
Definition: discontinuous_galerkin_equal_order_pressure_spacetime_navier_stokes_elements.h:528
virtual double interpolated_p_nst(const Vector< double > &s) const
Return FE interpolated pressure at local coordinate s.
Definition: discontinuous_galerkin_equal_order_pressure_spacetime_navier_stokes_elements.h:2037
void store_strouhal_as_external_data(Data *strouhal_data_pt)
Function that tells us whether the period is stored as external data.
Definition: discontinuous_galerkin_equal_order_pressure_spacetime_navier_stokes_elements.h:837
Vector< FpPressureAdvDiffRobinBCSpaceTimeElementBase * > Pressure_advection_diffusion_robin_element_pt
Definition: discontinuous_galerkin_equal_order_pressure_spacetime_navier_stokes_elements.h:548
double * Viscosity_Ratio_pt
Definition: discontinuous_galerkin_equal_order_pressure_spacetime_navier_stokes_elements.h:505
double * Re_pt
Pointer to global Reynolds number.
Definition: discontinuous_galerkin_equal_order_pressure_spacetime_navier_stokes_elements.h:514
NavierStokesSourceFctPt Source_fct_pt
Pointer to volumetric source function.
Definition: discontinuous_galerkin_equal_order_pressure_spacetime_navier_stokes_elements.h:534
void interpolated_u_nst(const Vector< double > &s, Vector< double > &velocity) const
Compute vector of FE interpolated velocity u at local coordinate s.
Definition: discontinuous_galerkin_equal_order_pressure_spacetime_navier_stokes_elements.h:1892
virtual unsigned u_index_nst(const unsigned &i) const
Definition: discontinuous_galerkin_equal_order_pressure_spacetime_navier_stokes_elements.h:1102
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: discontinuous_galerkin_equal_order_pressure_spacetime_navier_stokes_elements.cc:1468
bool Strouhal_is_stored_as_external_data
Definition: discontinuous_galerkin_equal_order_pressure_spacetime_navier_stokes_elements.h:521
bool ALE_is_disabled
Definition: discontinuous_galerkin_equal_order_pressure_spacetime_navier_stokes_elements.h:543
RealScalar s
Definition: level1_cplx_impl.h:130
int * m
Definition: level2_cplx_impl.h:294
#define DIM
Definition: linearised_navier_stokes_elements.h:44
EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC bfloat16 pow(const bfloat16 &a, const bfloat16 &b)
Definition: BFloat16.h:625
double velocity(const double &t)
Angular velocity as function of time t.
Definition: jeffery_orbit.cc:107
void flux(const double &time, const Vector< double > &x, double &flux)
Get flux applied along boundary x=0.
Definition: pretend_melt.cc:59
@ W
Definition: quadtree.h:63
DRAIG: Change all instances of (SPATIAL_DIM) to (DIM-1).
Definition: AnisotropicHookean.h:10
t
Definition: plotPSD.py:36
#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