29 #ifndef OOMPH_DISCONTINUOUS_GALERKIN_SPACETIME_FLUID_TRACTION_ELEMENTS_HEADER
30 #define OOMPH_DISCONTINUOUS_GALERKIN_SPACETIME_FLUID_TRACTION_ELEMENTS_HEADER
34 #include <oomph-lib-config.h>
50 template<
class ELEMENT>
51 class NavierStokesSpaceTimeTractionElement
52 :
public virtual FaceGeometry<ELEMENT>,
53 public virtual FaceElement
58 const Vector<double>&
x,
59 const Vector<double>&
n,
60 Vector<double>& result);
68 const bool& called_from_refineable_constructor =
false)
78 if (!called_from_refineable_constructor)
81 if (element_pt->
dim() == 3)
94 std::ostringstream error_message_stream;
98 <<
"This flux element will not work correctly "
99 <<
"if nodes are hanging" << std::endl;
151 residuals, jacobian, 1);
163 void output(std::ostream& outfile,
const unsigned& nplot)
174 const unsigned& flag);
182 const unsigned&
i)
const
231 "Can only deal with 2D space-time traction elements!",
261 test[index] = test_values[0][
i] * test_values[1][
j];
284 for (
unsigned i = 0;
i <
Dim - 1;
i++)
294 (*Traction_fct_pt)(time,
x,
n, result);
311 template<
class ELEMENT>
314 Vector<double>& residuals,
316 const unsigned& flag)
319 unsigned n_node = nnode();
328 unsigned n_intpt = integral_pt()->nweight();
334 for (
unsigned ipt = 0; ipt < n_intpt; ipt++)
337 double w = integral_pt()->weight(ipt);
341 double J = shape_and_test_at_knot(ipt, psif, testf);
347 double interpolated_t = 0.0;
350 Vector<double> interpolated_x(
Dim - 1, 0.0);
353 Vector<double> interpolated_spacetime_n(
Dim, 0.0);
356 Vector<double> interpolated_n(
Dim - 1, 0.0);
359 Vector<double> traction(
Dim - 1, 0.0);
362 for (
unsigned l = 0; l < n_node; l++)
365 interpolated_t += raw_nodal_position(l,
Dim - 1) * psif(l);
368 for (
unsigned i = 0;
i <
Dim - 1;
i++)
371 interpolated_x[
i] += nodal_position(l,
i) * psif(l);
376 outer_unit_normal(ipt, interpolated_spacetime_n);
381 if (
std::fabs(interpolated_spacetime_n[
Dim - 1]) > 1.0e-15)
384 std::ostringstream error_message_stream;
388 <<
"The component of the outer unit normal in the "
389 <<
"time-direction\nshould be zero but the actual "
390 <<
"value is: " << interpolated_spacetime_n[
Dim - 1] << std::endl;
393 throw OomphLibError(error_message_stream.str(),
400 for (
unsigned i = 0;
i <
Dim - 1;
i++)
403 interpolated_n[
i] = interpolated_spacetime_n[
i];
407 get_traction(interpolated_t, interpolated_x, interpolated_n, traction);
412 for (
unsigned l = 0; l < n_node; l++)
415 for (
unsigned i = 0;
i <
Dim - 1;
i++)
418 local_eqn = u_local_eqn(l,
i);
424 residuals[local_eqn] += traction[
i] * testf[l] *
W;
448 template<
class ELEMENT>
449 class RefineableNavierStokesSpaceTimeTractionElement
450 :
public virtual NavierStokesSpaceTimeTractionElement<ELEMENT>,
451 public virtual NonRefineableElementWithHangingNodes
490 residuals, jacobian, 1);
500 const unsigned& flag);
511 template<
class ELEMENT>
516 const unsigned& flag)
519 unsigned u_nodal_index[this->Dim - 1];
522 for (
unsigned i = 0;
i < this->Dim - 1;
i++)
526 dynamic_cast<ELEMENT*
>(this->bulk_element_pt())->u_index_nst(
i);
530 unsigned n_node = nnode();
539 unsigned n_intpt = integral_pt()->nweight();
545 for (
unsigned ipt = 0; ipt < n_intpt; ipt++)
548 double w = integral_pt()->weight(ipt);
552 double J = this->shape_and_test_at_knot(ipt, psif, testf);
558 double interpolated_t = 0.0;
561 Vector<double> interpolated_x(this->Dim - 1, 0.0);
564 Vector<double> interpolated_spacetime_n(this->Dim, 0.0);
567 Vector<double> interpolated_n(this->Dim - 1, 0.0);
570 Vector<double> traction(this->Dim - 1, 0.0);
573 for (
unsigned l = 0; l < n_node; l++)
576 interpolated_t += raw_nodal_position(l, this->Dim - 1) * psif(l);
579 for (
unsigned i = 0;
i < this->Dim - 1;
i++)
582 interpolated_x[
i] += this->nodal_position(l,
i) * psif(l);
587 this->outer_unit_normal(ipt, interpolated_spacetime_n);
592 if (
std::fabs(interpolated_n[this->Dim - 1]) > 1.0e-15)
595 std::ostringstream error_message_stream;
598 error_message_stream <<
"The component of the outer unit normal in the "
599 <<
"time-direction\nshould be zero but the actual "
600 <<
"value is: " << interpolated_n[this->Dim - 1]
604 throw OomphLibError(error_message_stream.str(),
611 for (
unsigned i = 0;
i < this->Dim - 1;
i++)
614 interpolated_n[
i] = interpolated_spacetime_n[
i];
619 interpolated_t, interpolated_x, interpolated_n, traction);
624 unsigned n_master = 1;
627 double hang_weight = 1.0;
630 HangInfo* hang_info_pt = 0;
634 for (
unsigned l = 0; l < n_node; l++)
637 bool is_node_hanging = this->node_pt(l)->is_hanging();
643 hang_info_pt = this->node_pt(l)->hanging_pt();
646 n_master = hang_info_pt->nmaster();
656 for (
unsigned m = 0;
m < n_master;
m++)
659 for (
unsigned i = 0;
i < this->Dim - 1;
i++)
667 local_eqn = this->local_hang_eqn(hang_info_pt->master_node_pt(
m),
671 hang_weight = hang_info_pt->master_weight(
m);
677 local_eqn = this->nodal_local_eqn(l, u_nodal_index[
i]);
687 residuals[local_eqn] += traction[
i] * testf[l] *
W * hang_weight;
Matrix< Scalar, Dynamic, Dynamic > DenseMatrix
Definition: BenchSparseUtil.h:23
int i
Definition: BiCGSTAB_step_by_step.cpp:9
const unsigned n
Definition: CG3DPackingUnitTest.cpp:11
JacobiRotation< float > J
Definition: Jacobi_makeJacobi.cpp:3
RowVector3d w
Definition: Matrix_resize_int.cpp:3
Definition: elements.h:4338
int & face_index()
Definition: elements.h:4626
double zeta_nodal(const unsigned &n, const unsigned &k, const unsigned &i) const
Definition: elements.h:4497
FiniteElement *& bulk_element_pt()
Pointer to higher-dimensional "bulk" element.
Definition: elements.h:4735
double J_eulerian_at_knot(const unsigned &ipt) const
Definition: elements.cc:5328
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
virtual void output(std::ostream &outfile)
Definition: elements.h:3050
virtual void build_face_element(const int &face_index, FaceElement *face_element_pt)
Definition: elements.cc:5132
int nodal_local_eqn(const unsigned &n, const unsigned &i) const
Definition: elements.h:1432
unsigned dim() const
Definition: elements.h:2611
Integral *const & integral_pt() const
Return the pointer to the integration scheme (const version)
Definition: elements.h:1963
virtual unsigned nnode_1d() const
Definition: elements.h:2218
virtual void shape_at_knot(const unsigned &ipt, Shape &psi) const
Definition: elements.cc:3220
bool has_hanging_nodes() const
Definition: elements.h:2470
static DenseMatrix< double > Dummy_matrix
Definition: elements.h:227
virtual double knot(const unsigned &i, const unsigned &j) const =0
Return local coordinate s[j] of i-th integration point.
Definition: discontinuous_galerkin_equal_order_pressure_spacetime_fluid_traction_elements.h:54
virtual int u_local_eqn(const unsigned &n, const unsigned &i)
Definition: discontinuous_galerkin_spacetime_fluid_traction_elements.h:193
unsigned Dim
The highest dimension of the problem.
Definition: discontinuous_galerkin_equal_order_pressure_spacetime_fluid_traction_elements.h:300
void fill_in_contribution_to_residuals(Vector< double > &residuals)
This function returns just the residuals.
Definition: discontinuous_galerkin_spacetime_fluid_traction_elements.h:136
NavierStokesSpaceTimeTractionElement(FiniteElement *const &element_pt, const int &face_index, const bool &called_from_refineable_constructor=false)
Definition: discontinuous_galerkin_spacetime_fluid_traction_elements.h:65
void output(std::ostream &outfile, const unsigned &nplot)
Output function: x,y,[z],u,v,[w],p in tecplot format.
Definition: discontinuous_galerkin_spacetime_fluid_traction_elements.h:163
double shape_and_test_at_knot(const unsigned &ipt, Shape &psi, Shape &test) const
Definition: discontinuous_galerkin_spacetime_fluid_traction_elements.h:200
void fill_in_contribution_to_jacobian(Vector< double > &residuals, DenseMatrix< double > &jacobian)
This function returns the residuals and the jacobian.
Definition: discontinuous_galerkin_spacetime_fluid_traction_elements.h:146
void output(std::ostream &outfile)
Overload the output function.
Definition: discontinuous_galerkin_spacetime_fluid_traction_elements.h:156
double zeta_nodal(const unsigned &n, const unsigned &k, const unsigned &i) const
Definition: discontinuous_galerkin_spacetime_fluid_traction_elements.h:180
~NavierStokesSpaceTimeTractionElement()
Destructor should not delete anything.
Definition: discontinuous_galerkin_spacetime_fluid_traction_elements.h:121
void fill_in_generic_residual_contribution_fluid_traction(Vector< double > &residuals, DenseMatrix< double > &jacobian, const unsigned &flag)
Definition: discontinuous_galerkin_equal_order_pressure_spacetime_fluid_traction_elements.h:313
void(* Traction_fct_pt)(const double &time, const Vector< double > &x, const Vector< double > &n, Vector< double > &result)
Pointer to an imposed traction function.
Definition: discontinuous_galerkin_equal_order_pressure_spacetime_fluid_traction_elements.h:57
void get_traction(const double &time, const Vector< double > &x, const Vector< double > &n, Vector< double > &result)
Function to calculate the traction applied to the fluid.
Definition: discontinuous_galerkin_spacetime_fluid_traction_elements.h:275
void(*&)(const double &t, const Vector< double > &x, const Vector< double > &n, Vector< double > &result) traction_fct_pt()
Access function for the imposed traction pointer.
Definition: discontinuous_galerkin_equal_order_pressure_spacetime_fluid_traction_elements.h:125
unsigned ndim() const
Return (Eulerian) spatial dimension of the node.
Definition: nodes.h:1054
Definition: oomph_definitions.h:222
Definition: refineable_elements.h:97
void fill_in_contribution_to_jacobian(Vector< double > &residuals, DenseMatrix< double > &jacobian)
This function returns the residuals and the Jacobian.
Definition: discontinuous_galerkin_spacetime_fluid_traction_elements.h:485
RefineableNavierStokesSpaceTimeTractionElement(FiniteElement *const &element_pt, const int &face_index)
Constructor, which takes a "bulk" element and the face index.
Definition: discontinuous_galerkin_spacetime_fluid_traction_elements.h:455
void refineable_fill_in_generic_residual_contribution_fluid_traction(Vector< double > &residuals, DenseMatrix< double > &jacobian, const unsigned &flag)
Definition: discontinuous_galerkin_equal_order_pressure_spacetime_fluid_traction_elements.h:513
~RefineableNavierStokesSpaceTimeTractionElement()
Destructor should not delete anything.
Definition: discontinuous_galerkin_spacetime_fluid_traction_elements.h:465
void fill_in_contribution_to_residuals(Vector< double > &residuals)
This function returns just the residuals.
Definition: discontinuous_galerkin_spacetime_fluid_traction_elements.h:477
unsigned ncont_interpolated_values() const
Definition: discontinuous_galerkin_spacetime_fluid_traction_elements.h:470
RealScalar s
Definition: level1_cplx_impl.h:130
int * m
Definition: level2_cplx_impl.h:294
char char char int int * k
Definition: level2_impl.h:374
static const unsigned Dim
Problem dimension.
Definition: two_d_tilted_square.cc:62
Real fabs(const Real &a)
Definition: boostmultiprec.cpp:117
void shape< 3 >(const double &s, double *Psi)
1D shape functions specialised to quadratic order (3 Nodes)
Definition: shape.h:810
void shape< 3 >(const double &s, double *Psi)
1D shape functions specialised to quadratic order (3 Nodes)
Definition: shape.h:635
@ W
Definition: quadtree.h:63
DRAIG: Change all instances of (SPATIAL_DIM) to (DIM-1).
Definition: AnisotropicHookean.h:10
list x
Definition: plotDoE.py:28
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
unsigned el_dim
dimension
Definition: overloaded_cartesian_element_body.h:30
std::ptrdiff_t j
Definition: tut_arithmetic_redux_minmax.cpp:2