oomph::DGFaceElement Class Reference

#include <dg_elements.h>

+ Inheritance diagram for oomph::DGFaceElement:

Public Member Functions

 DGFaceElement ()
 Empty Constructor. More...
 
virtual ~DGFaceElement ()
 Empty Destructor. More...
 
FaceElementneighbour_face_pt (const unsigned &i)
 Access function for neighbouring face information. More...
 
void setup_neighbour_info (const bool &add_neighbour_data_to_bulk)
 
void report_info ()
 Output information about the present element and its neighbour. More...
 
virtual void interpolated_u (const Vector< double > &s, Vector< double > &f)
 Return the interpolated values of the unknown fluxes. More...
 
virtual void get_interpolation_data (Vector< Data * > &interpolation_data)
 
virtual void numerical_flux_at_knot (const unsigned &ipt, const Shape &psi, Vector< double > &flux, DenseMatrix< double > &dflux_du_int, DenseMatrix< double > &dflux_du_ext, unsigned flag)
 
virtual void numerical_flux (const Vector< double > &n_out, const Vector< double > &u_int, const Vector< double > &u_ext, Vector< double > &flux)
 
virtual void dnumerical_flux_du (const Vector< double > &n_out, const Vector< double > &u_int, const Vector< double > &u_ext, DenseMatrix< double > &dflux_du_int, DenseMatrix< double > &dflux_du_ext)
 
void add_flux_contributions (Vector< double > &residuals, DenseMatrix< double > &jacobian, unsigned flag)
 Add the contribution from integrating the numerical flux. More...
 
- Public Member Functions inherited from oomph::FaceElement
 FaceElement ()
 Constructor: Initialise all appropriate member data. More...
 
virtual ~FaceElement ()
 Empty virtual destructor. More...
 
 FaceElement (const FaceElement &)=delete
 Broken copy constructor. More...
 
const unsignedboundary_number_in_bulk_mesh () const
 Broken assignment operator. More...
 
void set_boundary_number_in_bulk_mesh (const unsigned &b)
 Set function for the boundary number in bulk mesh. More...
 
double zeta_nodal (const unsigned &n, const unsigned &k, const unsigned &i) const
 
double J_eulerian (const Vector< double > &s) const
 
double J_eulerian_at_knot (const unsigned &ipt) const
 
void check_J_eulerian_at_knots (bool &passed) const
 
double interpolated_x (const Vector< double > &s, const unsigned &i) const
 
double interpolated_x (const unsigned &t, const Vector< double > &s, const unsigned &i) const
 
void interpolated_x (const Vector< double > &s, Vector< double > &x) const
 
void interpolated_x (const unsigned &t, const Vector< double > &s, Vector< double > &x) const
 
double interpolated_dxdt (const Vector< double > &s, const unsigned &i, const unsigned &t)
 
void interpolated_dxdt (const Vector< double > &s, const unsigned &t, Vector< double > &dxdt)
 
intnormal_sign ()
 
int normal_sign () const
 
intface_index ()
 
int face_index () const
 
const Vector< double > * tangent_direction_pt () const
 Public access function for the tangent direction pointer. More...
 
void set_tangent_direction (Vector< double > *tangent_direction_pt)
 Set the tangent direction vector. More...
 
void turn_on_warning_for_discontinuous_tangent ()
 
void turn_off_warning_for_discontinuous_tangent ()
 
void continuous_tangent_and_outer_unit_normal (const Vector< double > &s, Vector< Vector< double >> &tang_vec, Vector< double > &unit_normal) const
 
void continuous_tangent_and_outer_unit_normal (const unsigned &ipt, Vector< Vector< double >> &tang_vec, Vector< double > &unit_normal) const
 
void outer_unit_normal (const Vector< double > &s, Vector< double > &unit_normal) const
 Compute outer unit normal at the specified local coordinate. More...
 
void outer_unit_normal (const unsigned &ipt, Vector< double > &unit_normal) const
 Compute outer unit normal at ipt-th integration point. More...
 
FiniteElement *& bulk_element_pt ()
 Pointer to higher-dimensional "bulk" element. More...
 
FiniteElementbulk_element_pt () const
 Pointer to higher-dimensional "bulk" element (const version) More...
 
CoordinateMappingFctPtface_to_bulk_coordinate_fct_pt ()
 
CoordinateMappingFctPt face_to_bulk_coordinate_fct_pt () const
 
BulkCoordinateDerivativesFctPtbulk_coordinate_derivatives_fct_pt ()
 
BulkCoordinateDerivativesFctPt bulk_coordinate_derivatives_fct_pt () const
 
Vector< doublelocal_coordinate_in_bulk (const Vector< double > &s) const
 
void get_local_coordinate_in_bulk (const Vector< double > &s, Vector< double > &s_bulk) const
 
void get_ds_bulk_ds_face (const Vector< double > &s, DenseMatrix< double > &dsbulk_dsface, unsigned &interior_direction) const
 
unsignedbulk_position_type (const unsigned &i)
 
const unsignedbulk_position_type (const unsigned &i) const
 
void bulk_node_number_resize (const unsigned &i)
 Resize the storage for the bulk node numbers. More...
 
unsignedbulk_node_number (const unsigned &n)
 
const unsignedbulk_node_number (const unsigned &n) const
 
void bulk_position_type_resize (const unsigned &i)
 Resize the storage for bulk_position_type to i entries. More...
 
unsignednbulk_value (const unsigned &n)
 
unsigned nbulk_value (const unsigned &n) const
 
void nbulk_value_resize (const unsigned &i)
 
void resize_nodes (Vector< unsigned > &nadditional_data_values)
 
void output_zeta (std::ostream &outfile, const unsigned &nplot)
 Output boundary coordinate zeta. More...
 
- Public Member Functions inherited from oomph::FiniteElement
void set_dimension (const unsigned &dim)
 
void set_nodal_dimension (const unsigned &nodal_dim)
 
void set_nnodal_position_type (const unsigned &nposition_type)
 Set the number of types required to interpolate the coordinate. More...
 
void set_n_node (const unsigned &n)
 
int nodal_local_eqn (const unsigned &n, const unsigned &i) const
 
double dJ_eulerian_at_knot (const unsigned &ipt, Shape &psi, DenseMatrix< double > &djacobian_dX) const
 
 FiniteElement ()
 Constructor. More...
 
virtual ~FiniteElement ()
 
 FiniteElement (const FiniteElement &)=delete
 Broken copy constructor. More...
 
virtual bool local_coord_is_valid (const Vector< double > &s)
 Broken assignment operator. More...
 
virtual void move_local_coord_back_into_element (Vector< double > &s) const
 
void get_centre_of_gravity_and_max_radius_in_terms_of_zeta (Vector< double > &cog, double &max_radius) const
 
virtual void local_coordinate_of_node (const unsigned &j, Vector< double > &s) const
 
virtual void local_fraction_of_node (const unsigned &j, Vector< double > &s_fraction)
 
virtual double local_one_d_fraction_of_node (const unsigned &n1d, const unsigned &i)
 
virtual void set_macro_elem_pt (MacroElement *macro_elem_pt)
 
MacroElementmacro_elem_pt ()
 Access function to pointer to macro element. More...
 
void get_x (const Vector< double > &s, Vector< double > &x) const
 
void get_x (const unsigned &t, const Vector< double > &s, Vector< double > &x)
 
virtual void get_x_from_macro_element (const Vector< double > &s, Vector< double > &x) const
 
virtual void get_x_from_macro_element (const unsigned &t, const Vector< double > &s, Vector< double > &x)
 
virtual void set_integration_scheme (Integral *const &integral_pt)
 Set the spatial integration scheme. More...
 
Integral *const & integral_pt () const
 Return the pointer to the integration scheme (const version) More...
 
virtual void shape (const Vector< double > &s, Shape &psi) const =0
 
virtual void shape_at_knot (const unsigned &ipt, Shape &psi) const
 
virtual void dshape_local (const Vector< double > &s, Shape &psi, DShape &dpsids) const
 
virtual void dshape_local_at_knot (const unsigned &ipt, Shape &psi, DShape &dpsids) const
 
virtual void d2shape_local (const Vector< double > &s, Shape &psi, DShape &dpsids, DShape &d2psids) const
 
virtual void d2shape_local_at_knot (const unsigned &ipt, Shape &psi, DShape &dpsids, DShape &d2psids) const
 
void check_J_eulerian_at_knots (bool &passed) const
 
void check_jacobian (const double &jacobian) const
 
double dshape_eulerian (const Vector< double > &s, Shape &psi, DShape &dpsidx) const
 
virtual double dshape_eulerian_at_knot (const unsigned &ipt, Shape &psi, DShape &dpsidx) const
 
virtual double dshape_eulerian_at_knot (const unsigned &ipt, Shape &psi, DShape &dpsi, DenseMatrix< double > &djacobian_dX, RankFourTensor< double > &d_dpsidx_dX) const
 
double d2shape_eulerian (const Vector< double > &s, Shape &psi, DShape &dpsidx, DShape &d2psidx) const
 
virtual double d2shape_eulerian_at_knot (const unsigned &ipt, Shape &psi, DShape &dpsidx, DShape &d2psidx) const
 
virtual void assign_nodal_local_eqn_numbers (const bool &store_local_dof_pt)
 
virtual void describe_local_dofs (std::ostream &out, const std::string &current_string) const
 
virtual void describe_nodal_local_dofs (std::ostream &out, const std::string &current_string) const
 
virtual void assign_all_generic_local_eqn_numbers (const bool &store_local_dof_pt)
 
Node *& node_pt (const unsigned &n)
 Return a pointer to the local node n. More...
 
Node *const & node_pt (const unsigned &n) const
 Return a pointer to the local node n (const version) More...
 
unsigned nnode () const
 Return the number of nodes. More...
 
virtual unsigned nnode_1d () const
 
double raw_nodal_position (const unsigned &n, const unsigned &i) const
 
double raw_nodal_position (const unsigned &t, const unsigned &n, const unsigned &i) const
 
double raw_dnodal_position_dt (const unsigned &n, const unsigned &i) const
 
double raw_dnodal_position_dt (const unsigned &n, const unsigned &j, const unsigned &i) const
 
double raw_nodal_position_gen (const unsigned &n, const unsigned &k, const unsigned &i) const
 
double raw_nodal_position_gen (const unsigned &t, const unsigned &n, const unsigned &k, const unsigned &i) const
 
double raw_dnodal_position_gen_dt (const unsigned &n, const unsigned &k, const unsigned &i) const
 
double raw_dnodal_position_gen_dt (const unsigned &j, const unsigned &n, const unsigned &k, const unsigned &i) const
 
double nodal_position (const unsigned &n, const unsigned &i) const
 
double nodal_position (const unsigned &t, const unsigned &n, const unsigned &i) const
 
double dnodal_position_dt (const unsigned &n, const unsigned &i) const
 Return the i-th component of nodal velocity: dx/dt at local node n. More...
 
double dnodal_position_dt (const unsigned &n, const unsigned &j, const unsigned &i) const
 
double nodal_position_gen (const unsigned &n, const unsigned &k, const unsigned &i) const
 
double nodal_position_gen (const unsigned &t, const unsigned &n, const unsigned &k, const unsigned &i) const
 
double dnodal_position_gen_dt (const unsigned &n, const unsigned &k, const unsigned &i) const
 
double dnodal_position_gen_dt (const unsigned &j, const unsigned &n, const unsigned &k, const unsigned &i) const
 
virtual void get_dresidual_dnodal_coordinates (RankThreeTensor< double > &dresidual_dnodal_coordinates)
 
virtual void disable_ALE ()
 
virtual void enable_ALE ()
 
virtual unsigned required_nvalue (const unsigned &n) const
 
unsigned nnodal_position_type () const
 
bool has_hanging_nodes () const
 
unsigned nodal_dimension () const
 Return the required Eulerian dimension of the nodes in this element. More...
 
virtual unsigned nvertex_node () const
 
virtual Nodevertex_node_pt (const unsigned &j) const
 
virtual Nodeconstruct_node (const unsigned &n)
 
virtual Nodeconstruct_node (const unsigned &n, TimeStepper *const &time_stepper_pt)
 
virtual Nodeconstruct_boundary_node (const unsigned &n)
 
virtual Nodeconstruct_boundary_node (const unsigned &n, TimeStepper *const &time_stepper_pt)
 
int get_node_number (Node *const &node_pt) const
 
virtual Nodeget_node_at_local_coordinate (const Vector< double > &s) const
 
double raw_nodal_value (const unsigned &n, const unsigned &i) const
 
double raw_nodal_value (const unsigned &t, const unsigned &n, const unsigned &i) const
 
double nodal_value (const unsigned &n, const unsigned &i) const
 
double nodal_value (const unsigned &t, const unsigned &n, const unsigned &i) const
 
unsigned dim () const
 
virtual ElementGeometry::ElementGeometry element_geometry () const
 Return the geometry type of the element (either Q or T usually). More...
 
unsigned ngeom_data () const
 
Datageom_data_pt (const unsigned &j)
 
void position (const Vector< double > &zeta, Vector< double > &r) const
 
void position (const unsigned &t, const Vector< double > &zeta, Vector< double > &r) const
 
void dposition_dt (const Vector< double > &zeta, const unsigned &t, Vector< double > &drdt)
 
void interpolated_zeta (const Vector< double > &s, Vector< double > &zeta) const
 
void locate_zeta (const Vector< double > &zeta, GeomObject *&geom_object_pt, Vector< double > &s, const bool &use_coordinate_as_initial_guess=false)
 
virtual void node_update ()
 
virtual void identify_field_data_for_interactions (std::set< std::pair< Data *, unsigned >> &paired_field_data)
 
virtual void identify_geometric_data (std::set< Data * > &geometric_data_pt)
 
virtual double s_min () const
 Min value of local coordinate. More...
 
virtual double s_max () const
 Max. value of local coordinate. More...
 
double size () const
 
virtual double compute_physical_size () const
 
virtual void point_output_data (const Vector< double > &s, Vector< double > &data)
 
void point_output (std::ostream &outfile, const Vector< double > &s)
 
virtual unsigned nplot_points_paraview (const unsigned &nplot) const
 
virtual unsigned nsub_elements_paraview (const unsigned &nplot) const
 
void output_paraview (std::ofstream &file_out, const unsigned &nplot) const
 
virtual void write_paraview_output_offset_information (std::ofstream &file_out, const unsigned &nplot, unsigned &counter) const
 
virtual void write_paraview_type (std::ofstream &file_out, const unsigned &nplot) const
 
virtual void write_paraview_offsets (std::ofstream &file_out, const unsigned &nplot, unsigned &offset_sum) const
 
virtual unsigned nscalar_paraview () const
 
virtual void scalar_value_paraview (std::ofstream &file_out, const unsigned &i, const unsigned &nplot) const
 
virtual void scalar_value_fct_paraview (std::ofstream &file_out, const unsigned &i, const unsigned &nplot, FiniteElement::SteadyExactSolutionFctPt exact_soln_pt) const
 
virtual void scalar_value_fct_paraview (std::ofstream &file_out, const unsigned &i, const unsigned &nplot, const double &time, FiniteElement::UnsteadyExactSolutionFctPt exact_soln_pt) const
 
virtual std::string scalar_name_paraview (const unsigned &i) const
 
virtual void output (std::ostream &outfile)
 
virtual void output (std::ostream &outfile, const unsigned &n_plot)
 
virtual void output (const unsigned &t, std::ostream &outfile, const unsigned &n_plot) const
 
virtual void output (FILE *file_pt)
 
virtual void output (FILE *file_pt, const unsigned &n_plot)
 
virtual void output_fct (std::ostream &outfile, const unsigned &n_plot, FiniteElement::SteadyExactSolutionFctPt exact_soln_pt)
 Output an exact solution over the element. More...
 
virtual void output_fct (std::ostream &outfile, const unsigned &n_plot, const double &time, FiniteElement::UnsteadyExactSolutionFctPt exact_soln_pt)
 Output a time-dependent exact solution over the element. More...
 
virtual void output_fct (std::ostream &outfile, const unsigned &n_plot, const double &time, const SolutionFunctorBase &exact_soln) const
 Output a time-dependent exact solution over the element. More...
 
virtual void get_s_plot (const unsigned &i, const unsigned &nplot, Vector< double > &s, const bool &shifted_to_interior=false) const
 
virtual std::string tecplot_zone_string (const unsigned &nplot) const
 
virtual void write_tecplot_zone_footer (std::ostream &outfile, const unsigned &nplot) const
 
virtual void write_tecplot_zone_footer (FILE *file_pt, const unsigned &nplot) const
 
virtual unsigned nplot_points (const unsigned &nplot) const
 
virtual void compute_error (FiniteElement::SteadyExactSolutionFctPt exact_soln_pt, double &error, double &norm)
 Calculate the norm of the error and that of the exact solution. More...
 
virtual void compute_error (FiniteElement::UnsteadyExactSolutionFctPt exact_soln_pt, const double &time, double &error, double &norm)
 Calculate the norm of the error and that of the exact solution. More...
 
virtual void compute_error (FiniteElement::SteadyExactSolutionFctPt exact_soln_pt, Vector< double > &error, Vector< double > &norm)
 
virtual void compute_error (FiniteElement::UnsteadyExactSolutionFctPt exact_soln_pt, const double &time, Vector< double > &error, Vector< double > &norm)
 
virtual void compute_error (std::ostream &outfile, FiniteElement::SteadyExactSolutionFctPt exact_soln_pt, double &error, double &norm)
 
virtual void compute_error (std::ostream &outfile, FiniteElement::UnsteadyExactSolutionFctPt exact_soln_pt, const double &time, double &error, double &norm)
 
virtual void compute_error (std::ostream &outfile, FiniteElement::SteadyExactSolutionFctPt exact_soln_pt, Vector< double > &error, Vector< double > &norm)
 
virtual void compute_error (std::ostream &outfile, FiniteElement::UnsteadyExactSolutionFctPt exact_soln_pt, const double &time, Vector< double > &error, Vector< double > &norm)
 
virtual void compute_abs_error (std::ostream &outfile, FiniteElement::SteadyExactSolutionFctPt exact_soln_pt, double &error)
 
void integrate_fct (FiniteElement::SteadyExactSolutionFctPt integrand_fct_pt, Vector< double > &integral)
 Integrate Vector-valued function over element. More...
 
void integrate_fct (FiniteElement::UnsteadyExactSolutionFctPt integrand_fct_pt, const double &time, Vector< double > &integral)
 Integrate Vector-valued time-dep function over element. More...
 
virtual void build_face_element (const int &face_index, FaceElement *face_element_pt)
 
virtual unsigned self_test ()
 
virtual unsigned get_bulk_node_number (const int &face_index, const unsigned &i) const
 
virtual int face_outer_unit_normal_sign (const int &face_index) const
 Get the sign of the outer unit normal on the face given by face_index. More...
 
virtual unsigned nnode_on_face () const
 
void face_node_number_error_check (const unsigned &i) const
 Range check for face node numbers. More...
 
virtual CoordinateMappingFctPt face_to_bulk_coordinate_fct_pt (const int &face_index) const
 
virtual BulkCoordinateDerivativesFctPt bulk_coordinate_derivatives_fct_pt (const int &face_index) const
 
- Public Member Functions inherited from oomph::GeneralisedElement
 GeneralisedElement ()
 Constructor: Initialise all pointers and all values to zero. More...
 
virtual ~GeneralisedElement ()
 Virtual destructor to clean up any memory allocated by the object. More...
 
 GeneralisedElement (const GeneralisedElement &)=delete
 Broken copy constructor. More...
 
void operator= (const GeneralisedElement &)=delete
 Broken assignment operator. More...
 
Data *& internal_data_pt (const unsigned &i)
 Return a pointer to i-th internal data object. More...
 
Data *const & internal_data_pt (const unsigned &i) const
 Return a pointer to i-th internal data object (const version) More...
 
Data *& external_data_pt (const unsigned &i)
 Return a pointer to i-th external data object. More...
 
Data *const & external_data_pt (const unsigned &i) const
 Return a pointer to i-th external data object (const version) More...
 
unsigned long eqn_number (const unsigned &ieqn_local) const
 
int local_eqn_number (const unsigned long &ieqn_global) const
 
unsigned add_external_data (Data *const &data_pt, const bool &fd=true)
 
bool external_data_fd (const unsigned &i) const
 
void exclude_external_data_fd (const unsigned &i)
 
void include_external_data_fd (const unsigned &i)
 
void flush_external_data ()
 Flush all external data. More...
 
void flush_external_data (Data *const &data_pt)
 Flush the object addressed by data_pt from the external data array. More...
 
unsigned ninternal_data () const
 Return the number of internal data objects. More...
 
unsigned nexternal_data () const
 Return the number of external data objects. More...
 
unsigned ndof () const
 Return the number of equations/dofs in the element. More...
 
void dof_vector (const unsigned &t, Vector< double > &dof)
 Return the vector of dof values at time level t. More...
 
void dof_pt_vector (Vector< double * > &dof_pt)
 Return the vector of pointers to dof values. More...
 
void set_internal_data_time_stepper (const unsigned &i, TimeStepper *const &time_stepper_pt, const bool &preserve_existing_data)
 
void assign_internal_eqn_numbers (unsigned long &global_number, Vector< double * > &Dof_pt)
 
void describe_dofs (std::ostream &out, const std::string &current_string) const
 
void add_internal_value_pt_to_map (std::map< unsigned, double * > &map_of_value_pt)
 
virtual void assign_local_eqn_numbers (const bool &store_local_dof_pt)
 
virtual void complete_setup_of_dependencies ()
 
virtual void get_residuals (Vector< double > &residuals)
 
virtual void get_jacobian (Vector< double > &residuals, DenseMatrix< double > &jacobian)
 
virtual void get_mass_matrix (Vector< double > &residuals, DenseMatrix< double > &mass_matrix)
 
virtual void get_jacobian_and_mass_matrix (Vector< double > &residuals, DenseMatrix< double > &jacobian, DenseMatrix< double > &mass_matrix)
 
virtual void get_dresiduals_dparameter (double *const &parameter_pt, Vector< double > &dres_dparam)
 
virtual void get_djacobian_dparameter (double *const &parameter_pt, Vector< double > &dres_dparam, DenseMatrix< double > &djac_dparam)
 
virtual void get_djacobian_and_dmass_matrix_dparameter (double *const &parameter_pt, Vector< double > &dres_dparam, DenseMatrix< double > &djac_dparam, DenseMatrix< double > &dmass_matrix_dparam)
 
virtual void get_hessian_vector_products (Vector< double > const &Y, DenseMatrix< double > const &C, DenseMatrix< double > &product)
 
virtual void get_inner_products (Vector< std::pair< unsigned, unsigned >> const &history_index, Vector< double > &inner_product)
 
virtual void get_inner_product_vectors (Vector< unsigned > const &history_index, Vector< Vector< double >> &inner_product_vector)
 
virtual void compute_norm (Vector< double > &norm)
 
virtual void compute_norm (double &norm)
 
virtual unsigned ndof_types () const
 
virtual void get_dof_numbers_for_unknowns (std::list< std::pair< unsigned long, unsigned >> &dof_lookup_list) const
 
- Public Member Functions inherited from oomph::GeomObject
 GeomObject ()
 Default constructor. More...
 
 GeomObject (const unsigned &ndim)
 
 GeomObject (const unsigned &nlagrangian, const unsigned &ndim)
 
 GeomObject (const unsigned &nlagrangian, const unsigned &ndim, TimeStepper *time_stepper_pt)
 
 GeomObject (const GeomObject &dummy)=delete
 Broken copy constructor. More...
 
void operator= (const GeomObject &)=delete
 Broken assignment operator. More...
 
virtual ~GeomObject ()
 (Empty) destructor More...
 
unsigned nlagrangian () const
 Access function to # of Lagrangian coordinates. More...
 
unsigned ndim () const
 Access function to # of Eulerian coordinates. More...
 
void set_nlagrangian_and_ndim (const unsigned &n_lagrangian, const unsigned &n_dim)
 Set # of Lagrangian and Eulerian coordinates. More...
 
TimeStepper *& time_stepper_pt ()
 
TimeSteppertime_stepper_pt () const
 
virtual void position (const double &t, const Vector< double > &zeta, Vector< double > &r) const
 
virtual void dposition (const Vector< double > &zeta, DenseMatrix< double > &drdzeta) const
 
virtual void d2position (const Vector< double > &zeta, RankThreeTensor< double > &ddrdzeta) const
 
virtual void d2position (const Vector< double > &zeta, Vector< double > &r, DenseMatrix< double > &drdzeta, RankThreeTensor< double > &ddrdzeta) const
 

Protected Member Functions

virtual unsigned flux_index (const unsigned &i) const
 Return the index at which the i-th unknown flux is stored. More...
 
virtual unsigned required_nflux ()
 Set the number of flux components. More...
 
- Protected Member Functions inherited from oomph::FaceElement
void add_additional_values (const Vector< unsigned > &nadditional_values, const unsigned &id)
 
- Protected Member Functions inherited from oomph::FiniteElement
virtual void assemble_local_to_eulerian_jacobian (const DShape &dpsids, DenseMatrix< double > &jacobian) const
 
virtual void assemble_local_to_eulerian_jacobian2 (const DShape &d2psids, DenseMatrix< double > &jacobian2) const
 
virtual void assemble_eulerian_base_vectors (const DShape &dpsids, DenseMatrix< double > &interpolated_G) const
 
template<unsigned DIM>
double invert_jacobian (const DenseMatrix< double > &jacobian, DenseMatrix< double > &inverse_jacobian) const
 
virtual double invert_jacobian_mapping (const DenseMatrix< double > &jacobian, DenseMatrix< double > &inverse_jacobian) const
 
virtual double local_to_eulerian_mapping (const DShape &dpsids, DenseMatrix< double > &jacobian, DenseMatrix< double > &inverse_jacobian) const
 
double local_to_eulerian_mapping (const DShape &dpsids, DenseMatrix< double > &inverse_jacobian) const
 
virtual double local_to_eulerian_mapping_diagonal (const DShape &dpsids, DenseMatrix< double > &jacobian, DenseMatrix< double > &inverse_jacobian) const
 
virtual void dJ_eulerian_dnodal_coordinates (const DenseMatrix< double > &jacobian, const DShape &dpsids, DenseMatrix< double > &djacobian_dX) const
 
template<unsigned DIM>
void dJ_eulerian_dnodal_coordinates_templated_helper (const DenseMatrix< double > &jacobian, const DShape &dpsids, DenseMatrix< double > &djacobian_dX) const
 
virtual void d_dshape_eulerian_dnodal_coordinates (const double &det_jacobian, const DenseMatrix< double > &jacobian, const DenseMatrix< double > &djacobian_dX, const DenseMatrix< double > &inverse_jacobian, const DShape &dpsids, RankFourTensor< double > &d_dpsidx_dX) const
 
template<unsigned DIM>
void d_dshape_eulerian_dnodal_coordinates_templated_helper (const double &det_jacobian, const DenseMatrix< double > &jacobian, const DenseMatrix< double > &djacobian_dX, const DenseMatrix< double > &inverse_jacobian, const DShape &dpsids, RankFourTensor< double > &d_dpsidx_dX) const
 
virtual void transform_derivatives (const DenseMatrix< double > &inverse_jacobian, DShape &dbasis) const
 
void transform_derivatives_diagonal (const DenseMatrix< double > &inverse_jacobian, DShape &dbasis) const
 
virtual void transform_second_derivatives (const DenseMatrix< double > &jacobian, const DenseMatrix< double > &inverse_jacobian, const DenseMatrix< double > &jacobian2, DShape &dbasis, DShape &d2basis) const
 
template<unsigned DIM>
void transform_second_derivatives_template (const DenseMatrix< double > &jacobian, const DenseMatrix< double > &inverse_jacobian, const DenseMatrix< double > &jacobian2, DShape &dbasis, DShape &d2basis) const
 
template<unsigned DIM>
void transform_second_derivatives_diagonal (const DenseMatrix< double > &jacobian, const DenseMatrix< double > &inverse_jacobian, const DenseMatrix< double > &jacobian2, DShape &dbasis, DShape &d2basis) const
 
virtual void fill_in_jacobian_from_nodal_by_fd (Vector< double > &residuals, DenseMatrix< double > &jacobian)
 
void fill_in_jacobian_from_nodal_by_fd (DenseMatrix< double > &jacobian)
 
virtual void update_before_nodal_fd ()
 
virtual void reset_after_nodal_fd ()
 
virtual void update_in_nodal_fd (const unsigned &i)
 
virtual void reset_in_nodal_fd (const unsigned &i)
 
void fill_in_contribution_to_jacobian (Vector< double > &residuals, DenseMatrix< double > &jacobian)
 
template<>
double invert_jacobian (const DenseMatrix< double > &jacobian, DenseMatrix< double > &inverse_jacobian) const
 Zero-d specialisation of function to calculate inverse of jacobian mapping. More...
 
template<>
double invert_jacobian (const DenseMatrix< double > &jacobian, DenseMatrix< double > &inverse_jacobian) const
 One-d specialisation of function to calculate inverse of jacobian mapping. More...
 
template<>
double invert_jacobian (const DenseMatrix< double > &jacobian, DenseMatrix< double > &inverse_jacobian) const
 Two-d specialisation of function to calculate inverse of jacobian mapping. More...
 
template<>
double invert_jacobian (const DenseMatrix< double > &jacobian, DenseMatrix< double > &inverse_jacobian) const
 
template<>
void dJ_eulerian_dnodal_coordinates_templated_helper (const DenseMatrix< double > &jacobian, const DShape &dpsids, DenseMatrix< double > &djacobian_dX) const
 
template<>
void dJ_eulerian_dnodal_coordinates_templated_helper (const DenseMatrix< double > &jacobian, const DShape &dpsids, DenseMatrix< double > &djacobian_dX) const
 
template<>
void dJ_eulerian_dnodal_coordinates_templated_helper (const DenseMatrix< double > &jacobian, const DShape &dpsids, DenseMatrix< double > &djacobian_dX) const
 
template<>
void dJ_eulerian_dnodal_coordinates_templated_helper (const DenseMatrix< double > &jacobian, const DShape &dpsids, DenseMatrix< double > &djacobian_dX) const
 
template<>
void d_dshape_eulerian_dnodal_coordinates_templated_helper (const double &det_jacobian, const DenseMatrix< double > &jacobian, const DenseMatrix< double > &djacobian_dX, const DenseMatrix< double > &inverse_jacobian, const DShape &dpsids, RankFourTensor< double > &d_dpsidx_dX) const
 
template<>
void d_dshape_eulerian_dnodal_coordinates_templated_helper (const double &det_jacobian, const DenseMatrix< double > &jacobian, const DenseMatrix< double > &djacobian_dX, const DenseMatrix< double > &inverse_jacobian, const DShape &dpsids, RankFourTensor< double > &d_dpsidx_dX) const
 
template<>
void d_dshape_eulerian_dnodal_coordinates_templated_helper (const double &det_jacobian, const DenseMatrix< double > &jacobian, const DenseMatrix< double > &djacobian_dX, const DenseMatrix< double > &inverse_jacobian, const DShape &dpsids, RankFourTensor< double > &d_dpsidx_dX) const
 
template<>
void d_dshape_eulerian_dnodal_coordinates_templated_helper (const double &det_jacobian, const DenseMatrix< double > &jacobian, const DenseMatrix< double > &djacobian_dX, const DenseMatrix< double > &inverse_jacobian, const DShape &dpsids, RankFourTensor< double > &d_dpsidx_dX) const
 
template<>
void transform_second_derivatives_template (const DenseMatrix< double > &jacobian, const DenseMatrix< double > &inverse_jacobian, const DenseMatrix< double > &jacobian2, DShape &dbasis, DShape &d2basis) const
 
template<>
void transform_second_derivatives_template (const DenseMatrix< double > &jacobian, const DenseMatrix< double > &inverse_jacobian, const DenseMatrix< double > &jacobian2, DShape &dbasis, DShape &d2basis) const
 
template<>
void transform_second_derivatives_diagonal (const DenseMatrix< double > &jacobian, const DenseMatrix< double > &inverse_jacobian, const DenseMatrix< double > &jacobian2, DShape &dbasis, DShape &d2basis) const
 
template<>
void transform_second_derivatives_diagonal (const DenseMatrix< double > &jacobian, const DenseMatrix< double > &inverse_jacobian, const DenseMatrix< double > &jacobian2, DShape &dbasis, DShape &d2basis) const
 
- Protected Member Functions inherited from oomph::GeneralisedElement
unsigned add_internal_data (Data *const &data_pt, const bool &fd=true)
 
bool internal_data_fd (const unsigned &i) const
 
void exclude_internal_data_fd (const unsigned &i)
 
void include_internal_data_fd (const unsigned &i)
 
void clear_global_eqn_numbers ()
 
void add_global_eqn_numbers (std::deque< unsigned long > const &global_eqn_numbers, std::deque< double * > const &global_dof_pt)
 
virtual void assign_internal_and_external_local_eqn_numbers (const bool &store_local_dof_pt)
 
virtual void assign_additional_local_eqn_numbers ()
 
int internal_local_eqn (const unsigned &i, const unsigned &j) const
 
int external_local_eqn (const unsigned &i, const unsigned &j)
 
virtual void fill_in_contribution_to_residuals (Vector< double > &residuals)
 
void fill_in_jacobian_from_internal_by_fd (Vector< double > &residuals, DenseMatrix< double > &jacobian, const bool &fd_all_data=false)
 
void fill_in_jacobian_from_internal_by_fd (DenseMatrix< double > &jacobian, const bool &fd_all_data=false)
 
void fill_in_jacobian_from_external_by_fd (Vector< double > &residuals, DenseMatrix< double > &jacobian, const bool &fd_all_data=false)
 
void fill_in_jacobian_from_external_by_fd (DenseMatrix< double > &jacobian, const bool &fd_all_data=false)
 
virtual void update_before_internal_fd ()
 
virtual void reset_after_internal_fd ()
 
virtual void update_in_internal_fd (const unsigned &i)
 
virtual void reset_in_internal_fd (const unsigned &i)
 
virtual void update_before_external_fd ()
 
virtual void reset_after_external_fd ()
 
virtual void update_in_external_fd (const unsigned &i)
 
virtual void reset_in_external_fd (const unsigned &i)
 
virtual void fill_in_contribution_to_mass_matrix (Vector< double > &residuals, DenseMatrix< double > &mass_matrix)
 
virtual void fill_in_contribution_to_jacobian_and_mass_matrix (Vector< double > &residuals, DenseMatrix< double > &jacobian, DenseMatrix< double > &mass_matrix)
 
virtual void fill_in_contribution_to_dresiduals_dparameter (double *const &parameter_pt, Vector< double > &dres_dparam)
 
virtual void fill_in_contribution_to_djacobian_dparameter (double *const &parameter_pt, Vector< double > &dres_dparam, DenseMatrix< double > &djac_dparam)
 
virtual void fill_in_contribution_to_djacobian_and_dmass_matrix_dparameter (double *const &parameter_pt, Vector< double > &dres_dparam, DenseMatrix< double > &djac_dparam, DenseMatrix< double > &dmass_matrix_dparam)
 
virtual void fill_in_contribution_to_hessian_vector_products (Vector< double > const &Y, DenseMatrix< double > const &C, DenseMatrix< double > &product)
 
virtual void fill_in_contribution_to_inner_products (Vector< std::pair< unsigned, unsigned >> const &history_index, Vector< double > &inner_product)
 
virtual void fill_in_contribution_to_inner_product_vectors (Vector< unsigned > const &history_index, Vector< Vector< double >> &inner_product_vector)
 

Private Attributes

Vector< FaceElement * > Neighbour_face_pt
 Vector of neighbouring face elements at the integration points. More...
 
Vector< Vector< double > > Neighbour_local_coordinate
 Vector of neighbouring local coordinates at the integration points. More...
 
Vector< Vector< unsigned > > Neighbour_external_data
 

Additional Inherited Members

- Public Types inherited from oomph::FiniteElement
typedef void(* SteadyExactSolutionFctPt) (const Vector< double > &, Vector< double > &)
 
typedef void(* UnsteadyExactSolutionFctPt) (const double &, const Vector< double > &, Vector< double > &)
 
- Static Public Attributes inherited from oomph::FiniteElement
static double Tolerance_for_singular_jacobian = 1.0e-16
 Tolerance below which the jacobian is considered singular. More...
 
static bool Accept_negative_jacobian = false
 
static bool Suppress_output_while_checking_for_inverted_elements
 
- Static Public Attributes inherited from oomph::GeneralisedElement
static bool Suppress_warning_about_repeated_internal_data
 
static bool Suppress_warning_about_repeated_external_data = true
 
static double Default_fd_jacobian_step = 1.0e-8
 
- Protected Attributes inherited from oomph::FaceElement
unsigned Boundary_number_in_bulk_mesh
 The boundary number in the bulk mesh to which this element is attached. More...
 
FiniteElementBulk_element_pt
 Pointer to the associated higher-dimensional "bulk" element. More...
 
Vector< unsignedBulk_node_number
 
Vector< unsignedNbulk_value
 
Vector< double > * Tangent_direction_pt
 
- Protected Attributes inherited from oomph::FiniteElement
MacroElementMacro_elem_pt
 Pointer to the element's macro element (NULL by default) More...
 
- Protected Attributes inherited from oomph::GeomObject
unsigned NLagrangian
 Number of Lagrangian (intrinsic) coordinates. More...
 
unsigned Ndim
 Number of Eulerian coordinates. More...
 
TimeStepperGeom_object_time_stepper_pt
 
- Static Protected Attributes inherited from oomph::FiniteElement
static const unsigned Default_Initial_Nvalue = 0
 Default value for the number of values at a node. More...
 
static const double Node_location_tolerance = 1.0e-14
 
static const unsigned N2deriv [] = {0, 1, 3, 6}
 
- Static Protected Attributes inherited from oomph::GeneralisedElement
static DenseMatrix< doubleDummy_matrix
 
static std::deque< double * > Dof_pt_deque
 

Detailed Description

Base class for Discontinuous Galerkin Faces. These are responsible for calculating the normal fluxes that provide the communication between the discontinuous elements.

Constructor & Destructor Documentation

◆ DGFaceElement()

oomph::DGFaceElement::DGFaceElement ( )
inline

Empty Constructor.

81 : FaceElement() {}
FaceElement()
Constructor: Initialise all appropriate member data.
Definition: elements.h:4446

◆ ~DGFaceElement()

virtual oomph::DGFaceElement::~DGFaceElement ( )
inlinevirtual

Empty Destructor.

84 {}

Member Function Documentation

◆ add_flux_contributions()

void oomph::DGFaceElement::add_flux_contributions ( Vector< double > &  residuals,
DenseMatrix< double > &  jacobian,
unsigned  flag 
)

Add the contribution from integrating the numerical flux.

Calculate the integrated (numerical) flux out of the face and add it to the residuals vector

419  {
420 // Check that we have set up the coupling data if we are computing the jacobin
421 #ifdef PARANOID
422  if (flag && (flag < 3))
423  {
424  if (Neighbour_external_data.size() == 0)
425  {
426  std::ostringstream error_stream;
427  error_stream
428  << "Coupling data between elements not included in jacobian\n"
429  << "You should call DGMesh::setup_face_neighbour_info(true) to "
430  "ensure\n"
431  << "that this information is included in the jacobian\n";
432 
433  throw OomphLibError(
434  error_stream.str(), OOMPH_CURRENT_FUNCTION, OOMPH_EXCEPTION_LOCATION);
435  }
436  }
437 #endif
438 
439 
440  // Find the number of nodes
441  const unsigned n_node = nnode();
442  // Dimension of the face
443  const unsigned el_dim = dim();
444  // Storage for the shape functions
445  Shape psi(n_node);
446 
447  // Number of integration points
448  const unsigned n_intpt = this->integral_pt()->nweight();
449  // Number of fluxes
450  const unsigned n_flux = this->required_nflux();
451  // Find the indices at which the local fluxes are stored
452  Vector<unsigned> flux_nodal_index(n_flux);
453  for (unsigned i = 0; i < n_flux; i++)
454  {
455  flux_nodal_index[i] = this->flux_index(i);
456  }
457 
458  // Cache the bulk element
459  DGElement* bulk_elem_pt = dynamic_cast<DGElement*>(this->bulk_element_pt());
460 
461  // Storage for the flux and its derivatives
462  Vector<double> F(n_flux);
463  DenseMatrix<double> dF_du_int(n_flux, n_flux);
464  DenseMatrix<double> dF_du_ext(n_flux, n_flux);
465 
466  // Loop over the integration points
467  for (unsigned ipt = 0; ipt < n_intpt; ipt++)
468  {
469  // Get the integral weight
470  double W = this->integral_pt()->weight(ipt);
471  // Get the shape functions at the knot
472  this->shape_at_knot(ipt, psi);
473 
474  // Calculate the Jacobian
475  // For a point element, it's one
476  double J = W;
477  // Otherwise calculate for the element
478  if (el_dim != 0)
479  {
480  J *= this->J_eulerian_at_knot(ipt);
481  }
482 
483  // Now calculate the numerical flux (and derivatives)
484  this->numerical_flux_at_knot(ipt, psi, F, dF_du_int, dF_du_ext, flag);
485 
486  // Limit if desired here
487 
488  // Cache the pointer to the neighbour
489  DGFaceElement* neighbour_element_pt =
490  dynamic_cast<DGFaceElement*>(Neighbour_face_pt[ipt]);
491 
492  // Finally we need to assemble the appropriate contributions
493  // to the residuals
494  for (unsigned l = 0; l < n_node; l++)
495  {
496  // Loop over the fluxes
497  for (unsigned i = 0; i < n_flux; i++)
498  {
499  // Get the local equation number in the bulk
500  int local_eqn = bulk_elem_pt->nodal_local_eqn(bulk_node_number(l),
501  flux_nodal_index[i]);
502 
503  // If it's not a boundary condition
504  if (local_eqn >= 0)
505  {
506  // Add the flux multiplied by the shape function and the jacobian
507  residuals[local_eqn] -= psi(l) * F[i] * J;
508 
509  // Add the jacobian contributions
510  if (flag)
511  {
512  // If we are assembling the jacobian
513  if (flag < 3)
514  {
515  // Loop over the internal nodes and fluxes again
516  for (unsigned l2 = 0; l2 < n_node; l2++)
517  {
518  for (unsigned i2 = 0; i2 < n_flux; i2++)
519  {
520  // Get the local unknown equation number in the bulk
521  int local_unknown = bulk_elem_pt->nodal_local_eqn(
522  bulk_node_number(l2), flux_nodal_index[i2]);
523 
524  // If it's not a boundary condition
525  if (local_unknown >= 0)
526  {
527  // Add the flux multiplied by the shape function a
528  // nd the jacobian
529  jacobian(local_eqn, local_unknown) -=
530  psi(l) * dF_du_int(i, i2) * psi(l2) * J;
531  }
532  }
533  }
534 
535  // How many nodes does it have
536  unsigned neigh_n_node = neighbour_element_pt->nnode();
537 
538  // Get the flux indices from the neighbour
539  Vector<unsigned> neigh_flux_index(n_flux);
540  for (unsigned i2 = 0; i2 < n_flux; i2++)
541  {
542  neigh_flux_index[i2] = neighbour_element_pt->flux_index(i2);
543  }
544 
545  // Loop over the neighbours nodes
546  for (unsigned l2 = 0; l2 < neigh_n_node; l2++)
547  {
548  // Loop over the fluxed
549  for (unsigned i2 = 0; i2 < n_flux; i2++)
550  {
551  // Get the local unknown equation number in the bulk
552  int local_unknown =
553  dynamic_cast<DGElement*>(this->bulk_element_pt())
555  flux_nodal_index[i2]);
556 
557  // If it's not a boundary condition
558  if (local_unknown >= 0)
559  {
560  // Add the flux multiplied by the shape function
561  // and the jacobian
562  jacobian(local_eqn, local_unknown) -=
563  psi(l) * dF_du_ext(i, i2) * psi(l2) * J;
564  }
565  }
566  }
567  }
568  } // End of jacobian calculation
569  }
570  }
571  }
572  }
573  }
int i
Definition: BiCGSTAB_step_by_step.cpp:9
JacobiRotation< float > J
Definition: Jacobi_makeJacobi.cpp:3
Vector< FaceElement * > Neighbour_face_pt
Vector of neighbouring face elements at the integration points.
Definition: dg_elements.h:52
DGFaceElement()
Empty Constructor.
Definition: dg_elements.h:81
Vector< Vector< unsigned > > Neighbour_external_data
Definition: dg_elements.h:63
virtual void numerical_flux_at_knot(const unsigned &ipt, const Shape &psi, Vector< double > &flux, DenseMatrix< double > &dflux_du_int, DenseMatrix< double > &dflux_du_ext, unsigned flag)
Definition: dg_elements.cc:266
virtual unsigned flux_index(const unsigned &i) const
Return the index at which the i-th unknown flux is stored.
Definition: dg_elements.h:68
virtual unsigned required_nflux()
Set the number of flux components.
Definition: dg_elements.h:74
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
unsigned & bulk_node_number(const unsigned &n)
Definition: elements.h:4825
unsigned dim() const
Definition: elements.h:2611
unsigned nnode() const
Return the number of nodes.
Definition: elements.h:2210
Integral *const & integral_pt() const
Return the pointer to the integration scheme (const version)
Definition: elements.h:1963
virtual void shape_at_knot(const unsigned &ipt, Shape &psi) const
Definition: elements.cc:3220
int external_local_eqn(const unsigned &i, const unsigned &j)
Definition: elements.h:311
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.
@ F
Definition: octree.h:74
@ W
Definition: quadtree.h:63
#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

References oomph::FaceElement::bulk_element_pt(), oomph::FaceElement::bulk_node_number(), oomph::FiniteElement::dim(), el_dim, oomph::GeneralisedElement::external_local_eqn(), oomph::OcTreeNames::F, flux_index(), i, oomph::FiniteElement::integral_pt(), J, oomph::FaceElement::J_eulerian_at_knot(), Neighbour_external_data, Neighbour_face_pt, oomph::FiniteElement::nnode(), oomph::FiniteElement::nodal_local_eqn(), numerical_flux_at_knot(), oomph::Integral::nweight(), OOMPH_CURRENT_FUNCTION, OOMPH_EXCEPTION_LOCATION, required_nflux(), oomph::FiniteElement::shape_at_knot(), oomph::QuadTreeNames::W, and oomph::Integral::weight().

Referenced by oomph::DGElement::add_flux_contributions_to_residuals().

◆ dnumerical_flux_du()

void oomph::DGFaceElement::dnumerical_flux_du ( const Vector< double > &  n_out,
const Vector< double > &  u_int,
const Vector< double > &  u_ext,
DenseMatrix< double > &  dflux_du_int,
DenseMatrix< double > &  dflux_du_ext 
)
virtual

Calculate the derivative of the normal flux, which is the dot product of our approximation to the flux with the outer unit normal, with respect to the interior and exterior variables Default is to use finite differences

343  {
344  // Find the number of fluxes
345  const unsigned n_flux = this->required_nflux();
346 
347  // Get a local copy of the unknowns
348  Vector<double> u_int_local = u_int;
349  Vector<double> u_ext_local = u_ext;
350 
351  // Storage for incremented and decremented fluxes
352  Vector<double> flux_plus(n_flux), flux_minus(n_flux);
353 
354  const double fd_step = GeneralisedElement::Default_fd_jacobian_step;
355 
356  // Now loop over all the fluxes
357  for (unsigned n = 0; n < n_flux; n++)
358  {
359  // Increase internal value
360 
361  // Store the old value
362  double old_var = u_int_local[n];
363  // Increment the value
364  u_int_local[n] += fd_step;
365  // Get the new values
366  this->numerical_flux(n_out, u_int_local, u_ext_local, flux_plus);
367 
368  // Reset the value
369  u_int_local[n] = old_var;
370  // Decrement the value
371  u_int_local[n] -= fd_step;
372  // Get the new values
373  this->numerical_flux(n_out, u_int_local, u_ext_local, flux_minus);
374 
375  // Assemble the column of the jacobian
376  for (unsigned m = 0; m < n_flux; m++)
377  {
378  dflux_du_int(m, n) = (flux_plus[m] - flux_minus[m]) / (2.0 * fd_step);
379  }
380 
381  // Reset the value
382  u_int_local[n] = old_var;
383 
384  // Increase external value
385 
386  // Store the old value
387  old_var = u_ext_local[n];
388  // Increment the value
389  u_ext_local[n] += fd_step;
390  // Get the new values
391  this->numerical_flux(n_out, u_int_local, u_ext_local, flux_plus);
392 
393  // Reset the value
394  u_ext_local[n] = old_var;
395  // Decrement the value
396  u_ext_local[n] -= fd_step;
397  // Get the new values
398  this->numerical_flux(n_out, u_int_local, u_ext_local, flux_minus);
399 
400  // Assemble the column of the jacobian
401  for (unsigned m = 0; m < n_flux; m++)
402  {
403  dflux_du_ext(m, n) = (flux_plus[m] - flux_minus[m]) / (2.0 * fd_step);
404  }
405 
406  // Reset the value
407  u_ext_local[n] = old_var;
408  }
409  }
const unsigned n
Definition: CG3DPackingUnitTest.cpp:11
virtual void numerical_flux(const Vector< double > &n_out, const Vector< double > &u_int, const Vector< double > &u_ext, Vector< double > &flux)
Definition: dg_elements.h:121
static double Default_fd_jacobian_step
Definition: elements.h:1198
int * m
Definition: level2_cplx_impl.h:294

References oomph::GeneralisedElement::Default_fd_jacobian_step, m, n, numerical_flux(), and required_nflux().

Referenced by numerical_flux_at_knot().

◆ flux_index()

virtual unsigned oomph::DGFaceElement::flux_index ( const unsigned i) const
inlineprotectedvirtual

Return the index at which the i-th unknown flux is stored.

69  {
70  return i;
71  }

References i.

Referenced by add_flux_contributions(), interpolated_u(), and numerical_flux_at_knot().

◆ get_interpolation_data()

void oomph::DGFaceElement::get_interpolation_data ( Vector< Data * > &  interpolation_data)
virtual

Get the data that are used to interpolate the unkowns in the element. These must be returned in order.

Add all the data that are used to interpolate the unknowns. This must be consistent with the interpolated_u function above and the default implementation assumes pure nodal interpolaton.

242  {
243  // Find the number of nodes
244  const unsigned n_node = nnode();
245  // Now resize the vector
246  interpolation_data.resize(n_node);
247 
248  // If there are no nodes then return immediately
249  if (n_node == 0)
250  {
251  return;
252  }
253 
254  // Otherwise loop over the nodes and add to the vector in order
255  for (unsigned n = 0; n < n_node; n++)
256  {
257  interpolation_data[n] = this->node_pt(n);
258  }
259  }
Node *& node_pt(const unsigned &n)
Return a pointer to the local node n.
Definition: elements.h:2175

References n, oomph::FiniteElement::nnode(), and oomph::FiniteElement::node_pt().

Referenced by setup_neighbour_info().

◆ interpolated_u()

void oomph::DGFaceElement::interpolated_u ( const Vector< double > &  s,
Vector< double > &  f 
)
virtual

Return the interpolated values of the unknown fluxes.

Reimplemented in oomph::DGEulerFaceReflectionElement< ELEMENT >.

197  {
198  // Find the number of nodes
199  const unsigned n_node = nnode();
200  // If there are no nodes then return immediately
201  if (n_node == 0)
202  {
203  return;
204  }
205 
206  // Get the shape functions at the local coordinate
207  Shape psi(n_node);
208  this->shape(s, psi);
209 
210  // Find the number of fluxes
211  const unsigned n_flux = this->required_nflux();
212 
213  // Find the indices at which the local fluxes are stored
214  Vector<unsigned> flux_nodal_index(n_flux);
215  for (unsigned i = 0; i < n_flux; i++)
216  {
217  flux_nodal_index[i] = this->flux_index(i);
218  }
219  // Initialise the fluxes to zero
220  for (unsigned i = 0; i < n_flux; i++)
221  {
222  u[i] = 0.0;
223  }
224 
225  // Loop over the nodes
226  for (unsigned n = 0; n < n_node; n++)
227  {
228  const double psi_ = psi[n];
229  for (unsigned i = 0; i < n_flux; i++)
230  {
231  u[i] += this->node_pt(n)->value(flux_nodal_index[i]) * psi_;
232  }
233  }
234  }
virtual void shape(const Vector< double > &s, Shape &psi) const =0
double value(const unsigned &i) const
Definition: nodes.cc:2408

References flux_index(), i, n, oomph::FiniteElement::nnode(), oomph::FiniteElement::node_pt(), required_nflux(), oomph::FiniteElement::shape(), and oomph::Node::value().

Referenced by TwoDDGProblem< ELEMENT >::limit(), and numerical_flux_at_knot().

◆ neighbour_face_pt()

FaceElement* oomph::DGFaceElement::neighbour_face_pt ( const unsigned i)
inline

Access function for neighbouring face information.

88  {
89  return Neighbour_face_pt[i];
90  }

References i, and Neighbour_face_pt.

◆ numerical_flux()

virtual void oomph::DGFaceElement::numerical_flux ( const Vector< double > &  n_out,
const Vector< double > &  u_int,
const Vector< double > &  u_ext,
Vector< double > &  flux 
)
inlinevirtual

Calculate the normal flux, which is the dot product of our approximation to the flux with the outer unit normal

Reimplemented in oomph::DGScalarAdvectionFaceElement< ELEMENT >, and oomph::DGEulerFaceElement< ELEMENT >.

125  {
126  std::ostringstream error_stream;
127  error_stream
128  << "Empty numerical flux function called\n"
129  << "This function should be overloaded with a specific flux\n"
130  << "that is appropriate to the equations being solved.\n";
131  throw OomphLibError(
132  error_stream.str(), OOMPH_CURRENT_FUNCTION, OOMPH_EXCEPTION_LOCATION);
133  }

References OOMPH_CURRENT_FUNCTION, and OOMPH_EXCEPTION_LOCATION.

Referenced by dnumerical_flux_du(), and numerical_flux_at_knot().

◆ numerical_flux_at_knot()

void oomph::DGFaceElement::numerical_flux_at_knot ( const unsigned ipt,
const Shape psi,
Vector< double > &  flux,
DenseMatrix< double > &  dflux_du_int,
DenseMatrix< double > &  dflux_du_ext,
unsigned  flag 
)
virtual

Calculate the normal numerical flux at the integration point. This is the most general interface that can be overloaded if desired

Calculate the numerical flux at the knot point ipt. This is the most general interface than can be overloaded if desired. The shape functions at the knot point will be passed into this function.

272  {
273  // Find the number of nodes
274  const unsigned n_node = this->nnode();
275  // Find the nodal dimension
276  const unsigned nodal_dim = this->nodal_dimension();
277  // Number of fluxes
278  const unsigned n_flux = this->required_nflux();
279  // Find the indices at which the local fluxes are stored
280  Vector<unsigned> flux_nodal_index(n_flux);
281  for (unsigned i = 0; i < n_flux; i++)
282  {
283  flux_nodal_index[i] = this->flux_index(i);
284  }
285 
286  // Calculate the local unknowns
287  Vector<double> interpolated_u(n_flux, 0.0);
288 
289  // Loop over the shape functions
290  for (unsigned l = 0; l < n_node; l++)
291  {
292  // Cache the shape functions
293  const double psi_ = psi(l);
294  // Loop over the fluxes
295  for (unsigned i = 0; i < n_flux; i++)
296  {
297  // Calculate the velocity from the most recent nodal values
298  interpolated_u[i] += this->nodal_value(l, flux_nodal_index[i]) * psi_;
299  }
300  }
301 
302  // Now calculate the outer unit normal Vector
303  Vector<double> interpolated_n(nodal_dim);
304  this->outer_unit_normal(ipt, interpolated_n);
305 
306  // Get the pointer to the neighbour
307  DGFaceElement* neighbour_element_pt =
308  dynamic_cast<DGFaceElement*>(Neighbour_face_pt[ipt]);
309 
310  // Get the neighbour's fluxes
311  Vector<double> interpolated_u_neigh(n_flux);
312 
313  neighbour_element_pt->interpolated_u(Neighbour_local_coordinate[ipt],
314  interpolated_u_neigh);
315 
316  // Call the "standard" numerical flux function
317  this->numerical_flux(
318  interpolated_n, interpolated_u, interpolated_u_neigh, flux);
319 
320  // If we are calculating the jacobian add this term
321  if (flag && (flag < 3))
322  {
323  this->dnumerical_flux_du(interpolated_n,
325  interpolated_u_neigh,
326  dflux_du_int,
327  dflux_du_ext);
328  }
329  }
virtual void dnumerical_flux_du(const Vector< double > &n_out, const Vector< double > &u_int, const Vector< double > &u_ext, DenseMatrix< double > &dflux_du_int, DenseMatrix< double > &dflux_du_ext)
Definition: dg_elements.cc:338
virtual void interpolated_u(const Vector< double > &s, Vector< double > &f)
Return the interpolated values of the unknown fluxes.
Definition: dg_elements.cc:196
Vector< Vector< double > > Neighbour_local_coordinate
Vector of neighbouring local coordinates at the integration points.
Definition: dg_elements.h:55
void outer_unit_normal(const Vector< double > &s, Vector< double > &unit_normal) const
Compute outer unit normal at the specified local coordinate.
Definition: elements.cc:6006
double nodal_value(const unsigned &n, const unsigned &i) const
Definition: elements.h:2593
unsigned nodal_dimension() const
Return the required Eulerian dimension of the nodes in this element.
Definition: elements.h:2484
void flux(const double &time, const Vector< double > &x, double &flux)
Get flux applied along boundary x=0.
Definition: pretend_melt.cc:59

References dnumerical_flux_du(), ProblemParameters::flux(), flux_index(), i, interpolated_u(), Neighbour_face_pt, Neighbour_local_coordinate, oomph::FiniteElement::nnode(), oomph::FiniteElement::nodal_dimension(), oomph::FiniteElement::nodal_value(), numerical_flux(), oomph::FaceElement::outer_unit_normal(), and required_nflux().

Referenced by add_flux_contributions().

◆ report_info()

void oomph::DGFaceElement::report_info ( )

Output information about the present element and its neighbour.

124  {
125  // Find the number of nodes
126  const unsigned n_node = this->nnode();
127  // Allocate storage for the shape functions
128  Shape psi(n_node);
129 
130  // Find the dimension of the problem
131  const unsigned dim = this->nodal_dimension();
132  // Storage for local coordinates in this face and its neighbour
133  Vector<double> x(dim), face_x(dim);
134 
135  // Find the dimension of the element
136  const unsigned el_dim = this->dim();
137  // Storage for local coordinate
138  Vector<double> s(el_dim);
139 
140  // Calculate the number of integration points from the array
141  const unsigned n_intpt = this->integral_pt()->nweight();
142  // Loop over the integration points
143  for (unsigned ipt = 0; ipt < n_intpt; ipt++)
144  {
145  // Find the local coordinate at the knot point
146  for (unsigned i = 0; i < el_dim; i++)
147  {
148  s[i] = this->integral_pt()->knot(ipt, i);
149  }
150  // Get the value of the global coordinate in the present face
151  this->interpolated_x(s, x);
152 
153  // Get the value of x in the neighbouring face
154  Neighbour_face_pt[ipt]->interpolated_x(Neighbour_local_coordinate[ipt],
155  face_x);
156 
157  // Let's compare
158  oomph_info << "In Face In Neighbour\n";
159  for (unsigned i = 0; i < dim; i++)
160  {
161  if (i == 0)
162  {
163  oomph_info << "(";
164  }
165  else
166  {
167  oomph_info << ", ";
168  }
169  oomph_info << std::setw(5) << std::left << x[i];
170  }
171  oomph_info << ")";
172 
173  oomph_info << " ";
174 
175  for (unsigned i = 0; i < dim; i++)
176  {
177  if (i == 0)
178  {
179  oomph_info << "(";
180  }
181  else
182  {
183  oomph_info << ", ";
184  }
185  oomph_info << std::setw(5) << std::left << face_x[i];
186  }
187  oomph_info << ")";
188  oomph_info << std::endl;
189  }
190  }
double interpolated_x(const Vector< double > &s, const unsigned &i) const
Definition: elements.h:4528
virtual double knot(const unsigned &i, const unsigned &j) const =0
Return local coordinate s[j] of i-th integration point.
RealScalar s
Definition: level1_cplx_impl.h:130
OomphInfo oomph_info
Definition: oomph_definitions.cc:319
list x
Definition: plotDoE.py:28

References oomph::FiniteElement::dim(), el_dim, i, oomph::FiniteElement::integral_pt(), oomph::FaceElement::interpolated_x(), oomph::Integral::knot(), Neighbour_face_pt, Neighbour_local_coordinate, oomph::FiniteElement::nnode(), oomph::FiniteElement::nodal_dimension(), oomph::Integral::nweight(), oomph::oomph_info, s, and plotDoE::x.

Referenced by oomph::DGElement::setup_face_neighbour_info().

◆ required_nflux()

virtual unsigned oomph::DGFaceElement::required_nflux ( )
inlineprotectedvirtual

◆ setup_neighbour_info()

void oomph::DGFaceElement::setup_neighbour_info ( const bool add_neighbour_data_to_bulk)

Setup information from the neighbouring face, return a set of nodes (as data) in the neighour. The boolean flag is used to determine whether the data in the neighbour are added as external data to the bulk element — required when computing the jacobian of the system

Find pointers to neighbouring faces and the local coordinates in those faces that correspond to the integration points in the present face. This is achieved by moving up to the bulk element and thence the mesh which MUST have implemented a neighbour finding scheme

44  {
45  // Cache the pointer to the bulk element
46  DGElement* const bulk_element_pt =
47  dynamic_cast<DGElement*>(this->bulk_element_pt());
48 
49  // Find the number of points in the integration scheme
50  const unsigned n_intpt = integral_pt()->nweight();
51  // Resize the storage in the element
52  Neighbour_face_pt.resize(n_intpt);
53  Neighbour_local_coordinate.resize(n_intpt);
54 
55  // If we are adding the neighbour data to the bulk element
56  // then resize this storage
57  if (add_neighbour_data_to_bulk)
58  {
59  Neighbour_external_data.resize(n_intpt);
60  }
61 
62 
63  // Get the dimension of the present element
64  const unsigned el_dim = this->dim();
65  // Local coordinate in the face element
66  Vector<double> s(el_dim);
67 
68  // Get the dimension of the bulk element
69  const unsigned n_dim = bulk_element_pt->dim();
70  // Local coordinate in the bulk element
71  Vector<double> s_bulk(n_dim);
72 
73  // Storage for the interpolation data in the neighbour
74  Vector<Data*> neighbour_data;
75 
76  // Now loop over the integration points
77  for (unsigned ipt = 0; ipt < n_intpt; ipt++)
78  {
79  // Get the local coordinate of the integration points
80  for (unsigned i = 0; i < el_dim; i++)
81  {
82  s[i] = integral_pt()->knot(ipt, i);
83  }
84 
85  // Now get the bulk coordinate
86  this->get_local_coordinate_in_bulk(s, s_bulk);
87 
88  // Now we find the neighbouring face via the bulk element's member
89  // function which calls the Mesh's member function
90  bulk_element_pt->get_neighbouring_face_and_local_coordinate(
91  this->face_index(),
92  s_bulk,
93  Neighbour_face_pt[ipt],
95 
96  // If we are adding the external data to the bulk
97  if (add_neighbour_data_to_bulk)
98  {
99  // Throw the appropriate data from the neighbour face to the set
100  dynamic_cast<DGFaceElement*>(Neighbour_face_pt[ipt])
101  ->get_interpolation_data(neighbour_data);
102 
103  // Find the number of data
104  unsigned n_neighbour_data = neighbour_data.size();
105  // Resize the storage accordingly
106  Neighbour_external_data.resize(n_neighbour_data);
107 
108  // Add the data to the external data of the bulk element
109  for (unsigned n = 0; n < n_neighbour_data; n++)
110  {
111  Neighbour_external_data[ipt][n] =
112  bulk_element_pt->add_external_data(neighbour_data[n]);
113  }
114  }
115  }
116  }
virtual void get_interpolation_data(Vector< Data * > &interpolation_data)
Definition: dg_elements.cc:241
int & face_index()
Definition: elements.h:4626
void get_local_coordinate_in_bulk(const Vector< double > &s, Vector< double > &s_bulk) const
Definition: elements.cc:6384
unsigned add_external_data(Data *const &data_pt, const bool &fd=true)
Definition: elements.cc:307

References oomph::GeneralisedElement::add_external_data(), oomph::FaceElement::bulk_element_pt(), oomph::FiniteElement::dim(), el_dim, oomph::FaceElement::face_index(), get_interpolation_data(), oomph::FaceElement::get_local_coordinate_in_bulk(), i, oomph::FiniteElement::integral_pt(), oomph::Integral::knot(), n, Neighbour_external_data, Neighbour_face_pt, Neighbour_local_coordinate, oomph::Integral::nweight(), and s.

Referenced by oomph::DGElement::setup_face_neighbour_info().

Member Data Documentation

◆ Neighbour_external_data

Vector<Vector<unsigned> > oomph::DGFaceElement::Neighbour_external_data
private

Vector of the vectors that will store the number of the bulk external data that correspond to the dofs in the neighbouring face This is only used if we are using implict timestepping and wish to assemble the jacobian matrix. In order that the data be correctly set up DGMesh::setup_face_neighbour_info() must be called with the boolean flag set to true.

Referenced by add_flux_contributions(), and setup_neighbour_info().

◆ Neighbour_face_pt

Vector<FaceElement*> oomph::DGFaceElement::Neighbour_face_pt
private

Vector of neighbouring face elements at the integration points.

Referenced by add_flux_contributions(), neighbour_face_pt(), numerical_flux_at_knot(), report_info(), and setup_neighbour_info().

◆ Neighbour_local_coordinate

Vector<Vector<double> > oomph::DGFaceElement::Neighbour_local_coordinate
private

Vector of neighbouring local coordinates at the integration points.

Referenced by numerical_flux_at_knot(), report_info(), and setup_neighbour_info().


The documentation for this class was generated from the following files: