28 #ifndef OOMPH_WAVE_FLUX_ELEMENTS_HEADER
29 #define OOMPH_WAVE_FLUX_ELEMENTS_HEADER
32 #include <oomph-lib-config.h>
36 #include "../generic/Qelements.h"
50 template<
class ELEMENT>
71 "Don't call empty constructor for LinearWaveFluxElement",
72 OOMPH_CURRENT_FUNCTION,
73 OOMPH_EXCEPTION_LOCATION);
106 residuals, jacobian, 1);
116 const unsigned&
i)
const
130 void output(std::ostream& outfile,
const unsigned& n_plot)
145 void output(FILE* file_pt,
const unsigned& n_plot)
160 unsigned n_node =
nnode();
166 for (
unsigned i = 0;
i < n_node;
i++)
188 (*Flux_fct_pt)(time, x, flux);
219 template<
class ELEMENT>
232 ELEMENT* elem_pt =
dynamic_cast<ELEMENT*
>(bulk_el_pt);
235 if (elem_pt->dim() == 3)
244 throw OomphLibError(
"This flux element will not work correctly if "
245 "nodes are hanging\n",
246 OOMPH_CURRENT_FUNCTION,
247 OOMPH_EXCEPTION_LOCATION);
281 "Bulk element must inherit from LinearWaveEquations.";
283 "Nodes are one dimensional, but cannot cast the bulk element to\n";
284 error_string +=
"LinearWaveEquations<1>\n.";
285 error_string +=
"If you desire this functionality, you must "
286 "implement it yourself\n";
289 error_string, OOMPH_CURRENT_FUNCTION, OOMPH_EXCEPTION_LOCATION);
309 "Bulk element must inherit from LinearWaveEquations.";
311 "Nodes are two dimensional, but cannot cast the bulk element to\n";
312 error_string +=
"LinearWaveEquations<2>\n.";
313 error_string +=
"If you desire this functionality, you must "
314 "implement it yourself\n";
317 error_string, OOMPH_CURRENT_FUNCTION, OOMPH_EXCEPTION_LOCATION);
336 "Bulk element must inherit from LinearWaveEquations.";
337 error_string +=
"Nodes are three dimensional, but cannot cast the "
339 error_string +=
"LinearWaveEquations<3>\n.";
340 error_string +=
"If you desire this functionality, you must "
341 "implement it yourself\n";
344 error_string, OOMPH_CURRENT_FUNCTION, OOMPH_EXCEPTION_LOCATION);
356 std::ostringstream error_stream;
357 error_stream <<
"Dimension of node is " <<
Dim
358 <<
". It should be 1,2, or 3!" << std::endl;
361 error_stream.str(), OOMPH_CURRENT_FUNCTION, OOMPH_EXCEPTION_LOCATION);
370 template<
class ELEMENT>
376 const unsigned n_node = nnode();
379 double time = node_pt(0)->time_stepper_pt()->time_pt()->time();
382 Shape psif(n_node), testf(n_node);
385 const unsigned n_intpt = integral_pt()->nweight();
394 const unsigned u_index_lin_wave = U_index_lin_wave;
398 for (
unsigned ipt = 0; ipt < n_intpt; ipt++)
401 for (
unsigned i = 0;
i < (
Dim - 1);
i++)
403 s[
i] = integral_pt()->knot(ipt,
i);
407 double w = integral_pt()->weight(ipt);
411 double J = shape_and_test(
s, psif, testf);
420 for (
unsigned i = 0;
i <
Dim;
i++)
422 interpolated_x[
i] = 0.0;
426 for (
unsigned l = 0; l < n_node; l++)
429 for (
unsigned i = 0;
i <
Dim;
i++)
431 interpolated_x[
i] += nodal_position(l,
i) * psif[l];
437 get_flux(time, interpolated_x, flux);
442 for (
unsigned l = 0; l < n_node; l++)
444 local_eqn = nodal_local_eqn(l, u_index_lin_wave);
449 residuals[local_eqn] -= flux * testf[l] *
W;
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)
double zeta_nodal(const unsigned &n, const unsigned &k, const unsigned &i) const
In a FaceElement, the "global" intrinsic coordinate of the element along the boundary,...
double J_eulerian(const Vector< double > &s) const
Return the Jacobian of mapping from local to global coordinates at local position s....
//////////////////////////////////////////////////////////////////// ////////////////////////////////...
A general Finite Element class.
Node *& node_pt(const unsigned &n)
Return a pointer to the local node n.
virtual void output(std::ostream &outfile)
Output the element data — typically the values at the nodes in a format suitable for post-processing.
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 nnode() const
Return the number of nodes.
virtual void build_face_element(const int &face_index, FaceElement *face_element_pt)
Function for building a lower dimensional FaceElement on the specified face of the FiniteElement....
bool has_hanging_nodes() const
Return boolean to indicate if any of the element's nodes are geometrically hanging.
static DenseMatrix< double > Dummy_matrix
Empty dense matrix used as a dummy argument to combined residual and jacobian functions in the case w...
A class for all isoparametric elements that solve the LinearWave equations.
virtual unsigned u_index_lin_wave() const
Return the index at which the unknown value is stored. The default value, 0, is appropriate for singl...
///////////////////////////////////////////////////////////////////// ///////////////////////////////...
LinearWavePrescribedFluxFctPt & flux_fct_pt()
Access function for the prescribed-flux function pointer.
void output(FILE *file_pt, const unsigned &n_plot)
Output function – forward to broken version in FiniteElement until somebody decides what exactly they...
void fill_in_contribution_to_residuals(Vector< double > &residuals)
Compute the element residual vector.
void(* LinearWavePrescribedFluxFctPt)(const double &time, const Vector< double > &x, double &flux)
Function pointer to the prescribed-flux function fct(x,f(x)) – x is a Vector!
unsigned U_index_lin_wave
The index at which the unknown is stored at the nodes.
LinearWaveFluxElement(const LinearWaveFluxElement &dummy)=delete
Broken copy constructor.
double zeta_nodal(const unsigned &n, const unsigned &k, const unsigned &i) const
Specify the value of nodal zeta from the face geometry The "global" intrinsic coordinate of the eleme...
void fill_in_contribution_to_jacobian(Vector< double > &residuals, DenseMatrix< double > &jacobian)
Compute the element's residual vector and its Jacobian matrix.
unsigned Dim
The spatial dimension of the problem.
void output(FILE *file_pt)
Output function – forward to broken version in FiniteElement until somebody decides what exactly they...
void operator=(const LinearWaveFluxElement &)=delete
Broken assignment operator.
LinearWavePrescribedFluxFctPt Flux_fct_pt
Function pointer to the (global) prescribed-flux function.
void get_flux(const double &time, const Vector< double > &x, double &flux)
Function to calculate the prescribed flux at a given spatial position and at a gien time.
LinearWaveFluxElement()
Broken empty constructor.
void fill_in_generic_residual_contribution_lin_wave_flux(Vector< double > &residuals, DenseMatrix< double > &jacobian, unsigned flag)
Compute the element residual vector. flag=1(or 0): do (or don't) compute the Jacobian as well.
void output(std::ostream &outfile)
Output function – forward to broken version in FiniteElement until somebody decides what exactly they...
void output(std::ostream &outfile, const unsigned &n_plot)
Output function – forward to broken version in FiniteElement until somebody decides what exactly they...
double shape_and_test(const Vector< double > &s, Shape &psi, Shape &test) const
Function to compute the shape and test functions and to return the Jacobian of mapping between local ...
unsigned ndim() const
Return (Eulerian) spatial dimension of the node.
An OomphLibError object which should be thrown when an run-time error is encountered....
RefineableElements are FiniteElements that may be subdivided into children to provide a better local ...
A Class for shape functions. In simple cases, the shape functions have only one index that can be tho...
std::string string(const unsigned &i)
Return the i-th string or "" if the relevant string hasn't been defined.
unsigned Dim
Dimension of zeta tuples (set by get_dim_helper) – needed because we store the scalar coordinates in ...
//////////////////////////////////////////////////////////////////// ////////////////////////////////...