oomph::YoungLaplaceContactAngleElement< ELEMENT > Class Template Reference

#include <young_laplace_contact_angle_elements.h>

+ Inheritance diagram for oomph::YoungLaplaceContactAngleElement< ELEMENT >:

Public Member Functions

 YoungLaplaceContactAngleElement (FiniteElement *const &bulk_el_pt, const int &face_index)
 
 YoungLaplaceContactAngleElement ()
 Broken empty constructor. More...
 
 YoungLaplaceContactAngleElement (const YoungLaplaceContactAngleElement &dummy)=delete
 Broken copy constructor. More...
 
void operator= (const YoungLaplaceContactAngleElement &)=delete
 Broken assignment operator. More...
 
doubleprescribed_cos_gamma_pt () const
 
double *& prescribed_cos_gamma_pt ()
 Access function for the pointer to the prescribed contact angle. More...
 
void fill_in_contribution_to_residuals (Vector< double > &residuals)
 Add the element's contribution to its residual vector. More...
 
int u_local_eqn (const unsigned &n)
 
double zeta_nodal (const unsigned &n, const unsigned &k, const unsigned &i) const
 
void output (std::ostream &outfile)
 
void output (std::ostream &outfile, const unsigned &n_plot)
 
void output (FILE *file_pt)
 
void output (FILE *file_pt, const unsigned &n_plot)
 
double actual_cos_contact_angle (const Vector< double > &s)
 Compute cosinus of actual contact angle. More...
 
void contact_line_vectors (const Vector< double > &s, Vector< double > &tangent, Vector< double > &normal)
 Get unit tangent and normal vectors to contact line. More...
 
void contact_line_vectors (const Vector< double > &s, Vector< double > &tangent, Vector< double > &normal, double &norm_of_drds)
 
void contact_line_vectors (const Vector< double > &s, Vector< double > &tangent, Vector< double > &normal, Vector< double > &spine, double &norm_of_drds)
 
- 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 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 (const unsigned &t, std::ostream &outfile, const unsigned &n_plot) const
 
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

doubleu (const unsigned int &n)
 
double prescribed_cos_gamma ()
 Function to calculate the cos of the prescribed contact angle. 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)
 
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

doublePrescribed_cos_gamma_pt
 Pointer to prescribed cos gamma. More...
 

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

template<class ELEMENT>
class oomph::YoungLaplaceContactAngleElement< ELEMENT >

A class for elements that allow the imposition of an contact angle bcs for Young Laplace elements. The element geometry is obtained from the FaceGeometry<ELEMENT> policy class. Jacobian is evaluated by finite differencing.

Constructor & Destructor Documentation

◆ YoungLaplaceContactAngleElement() [1/3]

template<class ELEMENT >
oomph::YoungLaplaceContactAngleElement< ELEMENT >::YoungLaplaceContactAngleElement ( FiniteElement *const &  bulk_el_pt,
const int face_index 
)

Constructor, takes the pointer to the "bulk" element and the index of the face to which the element is attached.

40  : FaceGeometry<ELEMENT>(), FaceElement()
41  {
42  // Let the bulk element build the FaceElement, i.e. setup the pointers
43  // to its nodes (by referring to the appropriate nodes in the bulk
44  // element), etc.
45  bulk_el_pt->build_face_element(face_index, this);
46 
47  // Initialise the prescribed contact angle pointer to zero
49 
50 #ifdef PARANOID
51  // Extract the dimension of the problem from the dimension of
52  // the first node
53  unsigned dim = node_pt(0)->ndim();
54  if (dim != 2)
55  {
56  throw OomphLibError(
57  "YoungLaplaceContactAngleElement only work with 2D nodes",
60  }
61 #endif
62  }
int & face_index()
Definition: elements.h:4626
FaceElement()
Constructor: Initialise all appropriate member data.
Definition: elements.h:4446
Node *& node_pt(const unsigned &n)
Return a pointer to the local node n.
Definition: elements.h:2175
unsigned dim() const
Definition: elements.h:2611
unsigned ndim() const
Return (Eulerian) spatial dimension of the node.
Definition: nodes.h:1054
double * Prescribed_cos_gamma_pt
Pointer to prescribed cos gamma.
Definition: young_laplace_contact_angle_elements.h:211
#define OOMPH_EXCEPTION_LOCATION
Definition: oomph_definitions.h:61
#define OOMPH_CURRENT_FUNCTION
Definition: oomph_definitions.h:86

References oomph::FiniteElement::build_face_element(), oomph::FiniteElement::dim(), oomph::FaceElement::face_index(), oomph::Node::ndim(), oomph::FiniteElement::node_pt(), OOMPH_CURRENT_FUNCTION, OOMPH_EXCEPTION_LOCATION, and oomph::YoungLaplaceContactAngleElement< ELEMENT >::Prescribed_cos_gamma_pt.

◆ YoungLaplaceContactAngleElement() [2/3]

template<class ELEMENT >
oomph::YoungLaplaceContactAngleElement< ELEMENT >::YoungLaplaceContactAngleElement ( )
inline

Broken empty constructor.

62  {
63  throw OomphLibError(
64  "Don't call empty constructor for YoungLaplaceContactAngleElement",
67  }

References OOMPH_CURRENT_FUNCTION, and OOMPH_EXCEPTION_LOCATION.

◆ YoungLaplaceContactAngleElement() [3/3]

template<class ELEMENT >
oomph::YoungLaplaceContactAngleElement< ELEMENT >::YoungLaplaceContactAngleElement ( const YoungLaplaceContactAngleElement< ELEMENT > &  dummy)
delete

Broken copy constructor.

Member Function Documentation

◆ actual_cos_contact_angle()

template<class ELEMENT >
double oomph::YoungLaplaceContactAngleElement< ELEMENT >::actual_cos_contact_angle ( const Vector< double > &  s)

Compute cosinus of actual contact angle.

Get the actual contact angle.

156  {
157  // Get pointer to bulk element
158  ELEMENT* bulk_elem_pt = dynamic_cast<ELEMENT*>(this->bulk_element_pt());
159 
160  double cos_gamma = 0.0;
161 
162  // Spine case
163  if (bulk_elem_pt->use_spines())
164  {
165  // Get various contact line vectors
166  Vector<double> tangent(3);
167  Vector<double> normal(3);
168  Vector<double> spine(3);
169  double norm_of_drds;
170  contact_line_vectors(s, tangent, normal, spine, norm_of_drds);
171 
172  // Get the wall normal: Both the tangent to the contact line
173  // and the spine vector are tangential to the wall:
174  Vector<double> wall_normal(3);
175  Vector<double> axe_ez(3, 0.0);
176  axe_ez[2] = 1.0;
177  ELEMENT::cross_product(axe_ez, tangent, wall_normal);
178 
179  // Normalise
180  double norm = 0.0;
181  for (unsigned i = 0; i < 3; i++) norm += wall_normal[i] * wall_normal[i];
182  for (unsigned i = 0; i < 3; i++)
183  {
184  wall_normal[i] /= sqrt(norm);
185  }
186 
187  // Get the auxiliary unit vector that's normal to
188  // the contact line and tangent to the wall
189  Vector<double> aux(3);
190  ELEMENT::cross_product(tangent, wall_normal, aux);
191 
192  // Cos of contact angle is dot product with wall normal
193  cos_gamma = ELEMENT::scalar_product(aux, normal);
194  }
195 
196  // Cartesian case
197  else
198  {
199  // Get local coordinates in bulk element by copy construction
200  Vector<double> s_bulk(local_coordinate_in_bulk(s));
201 
202  // Number of nodes in bulk element
203  unsigned nnode_bulk = bulk_elem_pt->nnode();
204 
205 
206 #ifdef PARANOID
207  // Dimension of (= number of local coordinates in) bulk element
208  unsigned dim_bulk = bulk_elem_pt->dim();
209 
210  if (dim_bulk != 2)
211  {
212  throw OomphLibError(
213  "YoungLaplaceContactAngleElements only work with 2D bulk elements",
216  }
217 #endif
218 
219  // Set up memory for the shape functions
220  Shape psi(nnode_bulk);
221  DShape dpsidzeta(nnode_bulk, 2);
222 
223  // Call the derivatives of the shape and test functions
224  // in the bulk -- must do this via s because this point
225  // is not an integration point the bulk element!
226  (void)bulk_elem_pt->dshape_eulerian(s_bulk, psi, dpsidzeta);
227 
228  // Get the gradient at s
229  Vector<double> gradient_u(2, 0.0);
230 
231  // Calculate function value and derivatives:
232  //-----------------------------------------
233  // Loop over nodes
234  for (unsigned l = 0; l < nnode_bulk; l++)
235  {
236  // Loop over directions
237  for (unsigned j = 0; j < 2; j++)
238  {
239  gradient_u[j] += bulk_elem_pt->u(l) * dpsidzeta(l, j);
240  }
241  }
242 
243  // Get the outer unit normal to boundary
244  Vector<double> outer_normal(2, 0.0);
245  outer_unit_normal(s, outer_normal);
246 
247  // Compute the cosinus of the angle
248  double gradient_norm_2 =
249  ELEMENT::two_norm(gradient_u) * ELEMENT::two_norm(gradient_u);
250  cos_gamma = ELEMENT::scalar_product(gradient_u, outer_normal) /
251  sqrt(1 + gradient_norm_2);
252  }
253 
254  return cos_gamma;
255  }
AnnoyingScalar sqrt(const AnnoyingScalar &x)
Definition: AnnoyingScalar.h:134
int i
Definition: BiCGSTAB_step_by_step.cpp:9
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
Vector< double > local_coordinate_in_bulk(const Vector< double > &s) const
Definition: elements.cc:6353
FiniteElement *& bulk_element_pt()
Pointer to higher-dimensional "bulk" element.
Definition: elements.h:4735
void contact_line_vectors(const Vector< double > &s, Vector< double > &tangent, Vector< double > &normal)
Get unit tangent and normal vectors to contact line.
Definition: young_laplace_contact_angle_elements.h:149
RealScalar s
Definition: level1_cplx_impl.h:130
void normal(const Vector< double > &x, Vector< double > &normal)
Definition: free_surface_rotation.cc:65
double two_norm(const Vector< double > &a)
Definition: ode_problem.h:41
std::ptrdiff_t j
Definition: tut_arithmetic_redux_minmax.cpp:2

References i, j, WallFunction::normal(), OOMPH_CURRENT_FUNCTION, OOMPH_EXCEPTION_LOCATION, s, sqrt(), and oomph::VectorHelpers::two_norm().

Referenced by RefineableYoungLaplaceProblem< ELEMENT >::doc_solution().

◆ contact_line_vectors() [1/3]

template<class ELEMENT >
void oomph::YoungLaplaceContactAngleElement< ELEMENT >::contact_line_vectors ( const Vector< double > &  s,
Vector< double > &  tangent,
Vector< double > &  normal 
)
inline

Get unit tangent and normal vectors to contact line.

152  {
153  // Dummy
154  double norm_of_drds;
155  Vector<double> spine(3);
156  contact_line_vectors(s, tangent, normal, spine, norm_of_drds);
157  }

References WallFunction::normal(), and s.

Referenced by oomph::YoungLaplaceContactAngleElement< ELEMENT >::contact_line_vectors(), and RefineableYoungLaplaceProblem< ELEMENT >::doc_solution().

◆ contact_line_vectors() [2/3]

template<class ELEMENT >
void oomph::YoungLaplaceContactAngleElement< ELEMENT >::contact_line_vectors ( const Vector< double > &  s,
Vector< double > &  tangent,
Vector< double > &  normal,
double norm_of_drds 
)
inline

Get unit tangent and normal vectors to contact line. Final argument gives the norm of dR/ds where R is the vector to the contact line and s the local coordinate in the element.

166  {
167  // Dummy
168  Vector<double> spine(3);
169  contact_line_vectors(s, tangent, normal, spine, norm_of_drds);
170  }

References oomph::YoungLaplaceContactAngleElement< ELEMENT >::contact_line_vectors(), WallFunction::normal(), and s.

◆ contact_line_vectors() [3/3]

template<class ELEMENT >
void oomph::YoungLaplaceContactAngleElement< ELEMENT >::contact_line_vectors ( const Vector< double > &  s,
Vector< double > &  tangent,
Vector< double > &  normal,
Vector< double > &  spine,
double norm_of_drds 
)

Get tangent and normal vectors to contact line and spine vector (wall normal can then be obtained by cross-product). Final argument gives the norm of dR/ds where R is the vector to the contact line and s the local coordinate in the element.

Get unit tangent and normal to contact line and the spine itself (this allows the wall normal to be worked out by a cross product). Final argument gives the norm of dR/ds where R is the vector to the contact line and s the local coordinate in the element.

271  {
272  // Get pointer to bulk element
273  ELEMENT* bulk_elem_pt = dynamic_cast<ELEMENT*>(this->bulk_element_pt());
274 
275  // Dimension of (= number of local coordinates in) bulk element
276  unsigned dim_bulk = bulk_elem_pt->dim();
277 
278 #ifdef PARANOID
279  if (dim_bulk != 2)
280  {
281  throw OomphLibError(
282  "YoungLaplaceContactAngleElements only work with 2D bulk elements",
285  }
286 #endif
287 
288  // Which local coordinate is const in bulk element?
289  unsigned s_fixed_index_in_bulk;
290 
291  DenseMatrix<double> ds_bulk_ds_face(2, 1);
292  this->get_ds_bulk_ds_face(s, ds_bulk_ds_face, s_fixed_index_in_bulk);
293 
294  // Get local coordinates in bulk element by copy construction
295  Vector<double> s_bulk(local_coordinate_in_bulk(s));
296 
297  // Number of nodes in bulk element
298  unsigned nnode_bulk = bulk_elem_pt->nnode();
299 
300  // Get the shape functions and their derivatives w.r.t.
301  // to the local coordinates in the bulk element
302  Shape psi_bulk(nnode_bulk);
303  DShape dpsi_bulk(nnode_bulk, dim_bulk);
304  bulk_elem_pt->dshape_local(s_bulk, psi_bulk, dpsi_bulk);
305 
306  // Displacement along spine
307  double interpolated_u = 0.0;
308 
309  // Derivative of u w.r.t. tangential and pseudo-normal bulk coordinate
310  double interpolated_du_ds_tangent = 0.0;
311  double interpolated_du_ds_pseudo_normal = 0.0;
312 
313  // Global intrinsic coordinates of current point for evaluation of
314  // spine and spine base
315  Vector<double> interpolated_zeta(dim_bulk, 0.0);
316 
317 
318  // Derivatives of zeta (in bulk) w.r.t. to tangent and pseudo-normal
319  // local coordinate
320  Vector<double> interpolated_dzeta_ds_tangent(dim_bulk);
321  Vector<double> interpolated_dzeta_ds_pseudo_normal(dim_bulk);
322 
323  // Loop over nodes
324  for (unsigned l = 0; l < nnode_bulk; l++)
325  {
326  interpolated_u += bulk_elem_pt->u(l) * psi_bulk(l);
327 
328  // Chain rule for tangent derivative
329  double aux = 0.0;
330  for (unsigned i = 0; i < dim_bulk; i++)
331  {
332  aux += dpsi_bulk(l, i) * ds_bulk_ds_face(i, 0);
333  }
334  interpolated_du_ds_tangent += bulk_elem_pt->u(l) * aux;
335 
336  // Straight derivative w.r.t. one of the bulk coordinates
337  // that's fixed along the face
338  interpolated_du_ds_pseudo_normal +=
339  bulk_elem_pt->u(l) * dpsi_bulk(l, s_fixed_index_in_bulk);
340 
341  // Loop over directions
342  for (unsigned j = 0; j < dim_bulk; j++)
343  {
344  interpolated_zeta[j] +=
345  bulk_elem_pt->nodal_position(l, j) * psi_bulk(l);
346 
347  // Chain rule for tangent derivative
348  double aux = 0.0;
349  for (unsigned i = 0; i < dim_bulk; i++)
350  {
351  aux += dpsi_bulk(l, i) * ds_bulk_ds_face(i, 0);
352  }
353  interpolated_dzeta_ds_tangent[j] +=
354  bulk_elem_pt->nodal_position(l, j) * aux;
355 
356  // Straight derivative w.r.t. one of the bulk coordinates
357  // that's fixed along the face
358  interpolated_dzeta_ds_pseudo_normal[j] +=
359  bulk_elem_pt->nodal_position(l, j) *
360  dpsi_bulk(l, s_fixed_index_in_bulk);
361  }
362  }
363 
364  // Auxiliary vector (tangent to non-fixed bulk coordinate but
365  // not necessarily normal to contact line)
366  Vector<double> aux_vector(3);
367  double tang_norm = 0.0;
368  double aux_norm = 0.0;
369 
370  if (bulk_elem_pt->use_spines())
371  {
372  // Get the spine and spine base vector at this point from the bulk element
373  Vector<double> spine_base(3, 0.0);
374  Vector<Vector<double>> dspine;
375  ELEMENT::allocate_vector_of_vectors(2, 3, dspine);
376  Vector<Vector<double>> dspine_base;
377  ELEMENT::allocate_vector_of_vectors(2, 3, dspine_base);
378  bulk_elem_pt->get_spine(interpolated_zeta, spine, dspine);
379  bulk_elem_pt->get_spine_base(interpolated_zeta, spine_base, dspine_base);
380 
381  // Derivative of spine and spine base w.r.t. local coordinate in
382  // FaceElement:
383  Vector<double> dspine_ds_tangent(3, 0.0);
384  Vector<double> dspine_base_ds_tangent(3, 0.0);
385  Vector<double> dspine_ds_pseudo_normal(3, 0.0);
386  Vector<double> dspine_base_ds_pseudo_normal(3, 0.0);
387  for (unsigned i = 0; i < 3; i++)
388  {
389  dspine_ds_tangent[i] +=
390  dspine[0][i] * interpolated_dzeta_ds_tangent[0] +
391  dspine[1][i] * interpolated_dzeta_ds_tangent[1];
392 
393  dspine_base_ds_tangent[i] +=
394  dspine_base[0][i] * interpolated_dzeta_ds_tangent[0] +
395  dspine_base[1][i] * interpolated_dzeta_ds_tangent[1];
396 
397  dspine_ds_pseudo_normal[i] +=
398  dspine[0][i] * interpolated_dzeta_ds_pseudo_normal[0] +
399  dspine[1][i] * interpolated_dzeta_ds_pseudo_normal[1];
400 
401  dspine_base_ds_pseudo_normal[i] +=
402  dspine_base[0][i] * interpolated_dzeta_ds_pseudo_normal[0] +
403  dspine_base[1][i] * interpolated_dzeta_ds_pseudo_normal[1];
404  }
405 
406  // Auxiliary vector (tangent to non-fixed bulk coordinate but
407  // not necessarily normal to contact line)
408  for (unsigned i = 0; i < 3; i++)
409  {
410  tangent[i] = dspine_base_ds_tangent[i] +
411  interpolated_du_ds_tangent * spine[i] +
412  interpolated_u * dspine_ds_tangent[i];
413  tang_norm += tangent[i] * tangent[i];
414 
415 
416  aux_vector[i] = dspine_base_ds_pseudo_normal[i] +
417  interpolated_du_ds_pseudo_normal * spine[i] +
418  interpolated_u * dspine_ds_pseudo_normal[i];
419  aux_norm += aux_vector[i] * aux_vector[i];
420  }
421  }
422 
423  // Cartesian case
424  else
425  {
426  for (unsigned i = 0; i < 2; i++)
427  {
428  tangent[i] = interpolated_dzeta_ds_tangent[i];
429  tang_norm += tangent[i] * tangent[i];
430  aux_vector[i] = interpolated_dzeta_ds_pseudo_normal[i];
431  aux_norm += aux_vector[i] * aux_vector[i];
432  }
433 
434  tangent[2] = interpolated_du_ds_tangent;
435  tang_norm += tangent[2] * tangent[2];
436  aux_vector[2] = interpolated_du_ds_pseudo_normal;
437  aux_norm += aux_vector[2] * aux_vector[2];
438  }
439 
440  // Norm of the rate of change
441  norm_of_drds = sqrt(tang_norm);
442 
443  // Normalise
444  double tang_norm_fact = 1.0 / sqrt(tang_norm);
445  double aux_norm_fact = 1.0 / sqrt(aux_norm);
446  for (unsigned i = 0; i < 3; i++)
447  {
448  tangent[i] *= tang_norm_fact;
449  aux_vector[i] *= aux_norm_fact;
450  }
451 
452 
453  // Normal to meniscus is the cross product between the
454  // two contact line vectors:
455  Vector<double> meniscus_normal(3);
456  ELEMENT::cross_product(tangent, aux_vector, meniscus_normal);
457 
458  // Calculate the norm
459  double men_norm_fact = 0.0;
460  for (unsigned i = 0; i < 3; i++)
461  {
462  men_norm_fact += meniscus_normal[i] * meniscus_normal[i];
463  }
464 
465  // Normalise and adjust direction
466  double sign = -double(normal_sign());
467  for (unsigned i = 0; i < 3; i++)
468  {
469  meniscus_normal[i] *= sign / sqrt(men_norm_fact);
470  }
471 
472  // The actual (bi) normal to the contact line is given
473  // by another cross product
474  ELEMENT::cross_product(meniscus_normal, tangent, normal);
475  }
void get_ds_bulk_ds_face(const Vector< double > &s, DenseMatrix< double > &dsbulk_dsface, unsigned &interior_direction) const
Definition: elements.cc:6409
int & normal_sign()
Definition: elements.h:4612
void interpolated_zeta(const Vector< double > &s, Vector< double > &zeta) const
Definition: elements.cc:4675
T sign(T x)
Definition: cxx11_tensor_builtins_sycl.cpp:172

References i, j, WallFunction::normal(), OOMPH_CURRENT_FUNCTION, OOMPH_EXCEPTION_LOCATION, s, SYCL::sign(), and sqrt().

◆ fill_in_contribution_to_residuals()

template<class ELEMENT >
void oomph::YoungLaplaceContactAngleElement< ELEMENT >::fill_in_contribution_to_residuals ( Vector< double > &  residuals)
virtual

Add the element's contribution to its residual vector.

Compute the element's contribution to the residual vector.

Reimplemented from oomph::GeneralisedElement.

71  {
72  // Find out how many nodes there are
73  unsigned n_node = nnode();
74 
75  // Set up memory for the shape functions
76  Shape psi(n_node);
77 
78  // Number of integration points
79  unsigned n_intpt = integral_pt()->nweight();
80 
81  // Set the Vector to hold local coordinates
82  // Note: We need the coordinate itself below for the evaluation
83  // of the contact line vectors even though we use the *at_knot
84  // version for the various shape-function-related functions
85  Vector<double> s(1);
86 
87  // Integers to hold the local equation and unknown numbers
88  int local_eqn = 0;
89 
90  // Loop over the integration points
91  for (unsigned ipt = 0; ipt < n_intpt; ipt++)
92  {
93  // Assign value of s
94  s[0] = integral_pt()->knot(ipt, 0);
95 
96  // Get the integral weight
97  double w = integral_pt()->weight(ipt);
98 
99  // Find the shape functions
100  shape_at_knot(ipt, psi);
101 
102  // Get the prescribed cos_gamma
103  double cos_gamma = prescribed_cos_gamma();
104 
105  // Get the various contact line vectors
106  Vector<double> tangent(3);
107  Vector<double> normal(3);
108  Vector<double> spine(3);
109  double norm_of_drds;
110  contact_line_vectors(s, tangent, normal, spine, norm_of_drds);
111 
112  // Get beta factor:
113 
114  // Cross product of spine and tangent to contact line is
115  // the wall normal
116  Vector<double> wall_normal(3);
117  ELEMENT::cross_product(spine, tangent, wall_normal);
118 
119  // Normalise
120  double norm = ELEMENT::two_norm(wall_normal);
121  for (unsigned i = 0; i < 3; i++) wall_normal[i] /= norm;
122 
123  // Take cross product with tangent to get the normal to the
124  // contact line parallel to wall
125  Vector<double> normal_to_contact_line_parallel_to_wall(3);
126  ELEMENT::cross_product(
127  tangent, wall_normal, normal_to_contact_line_parallel_to_wall);
128 
129  double beta =
130  ELEMENT::scalar_product(spine, normal_to_contact_line_parallel_to_wall);
131 
132 
133  // Now add to the appropriate equations
134 
135  // Loop over the test functions
136  for (unsigned l = 0; l < n_node; l++)
137  {
138  local_eqn = u_local_eqn(l);
139  /*IF it's not a boundary condition*/
140  if (local_eqn >= 0)
141  {
142  // Add to residual:
143  residuals[local_eqn] -= beta * cos_gamma * psi[l] * norm_of_drds * w;
144  }
145  }
146  }
147  }
RowVector3d w
Definition: Matrix_resize_int.cpp:3
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
virtual double knot(const unsigned &i, const unsigned &j) const =0
Return local coordinate s[j] of i-th integration point.
virtual unsigned nweight() const =0
Return the number of integration points of the scheme.
virtual double weight(const unsigned &i) const =0
Return weight of i-th integration point.
int u_local_eqn(const unsigned &n)
Definition: young_laplace_contact_angle_elements.h:97
double prescribed_cos_gamma()
Function to calculate the cos of the prescribed contact angle.
Definition: young_laplace_contact_angle_elements.h:194
Scalar beta
Definition: level2_cplx_impl.h:36

References beta, i, WallFunction::normal(), s, oomph::VectorHelpers::two_norm(), and w.

◆ operator=()

template<class ELEMENT >
void oomph::YoungLaplaceContactAngleElement< ELEMENT >::operator= ( const YoungLaplaceContactAngleElement< ELEMENT > &  )
delete

Broken assignment operator.

◆ output() [1/4]

template<class ELEMENT >
void oomph::YoungLaplaceContactAngleElement< ELEMENT >::output ( FILE *  file_pt)
inlinevirtual

C-style output function – forward to broken version in FiniteElement until somebody decides what exactly they want to plot here...

Reimplemented from oomph::FiniteElement.

133  {
134  FiniteElement::output(file_pt);
135  }
virtual void output(std::ostream &outfile)
Definition: elements.h:3050

References oomph::FiniteElement::output().

◆ output() [2/4]

template<class ELEMENT >
void oomph::YoungLaplaceContactAngleElement< ELEMENT >::output ( FILE *  file_pt,
const unsigned n_plot 
)
inlinevirtual

C-style output function – forward to broken version in FiniteElement until somebody decides what exactly they want to plot here...

Reimplemented from oomph::FiniteElement.

141  {
142  FiniteElement::output(file_pt, n_plot);
143  }

References oomph::FiniteElement::output().

◆ output() [3/4]

template<class ELEMENT >
void oomph::YoungLaplaceContactAngleElement< ELEMENT >::output ( std::ostream &  outfile)
inlinevirtual

Output function – forward to broken version in FiniteElement until somebody decides what exactly they want to plot here...

Reimplemented from oomph::FiniteElement.

119  {
120  FiniteElement::output(outfile);
121  }

References oomph::FiniteElement::output().

◆ output() [4/4]

template<class ELEMENT >
void oomph::YoungLaplaceContactAngleElement< ELEMENT >::output ( std::ostream &  outfile,
const unsigned n_plot 
)
inlinevirtual

Output function – forward to broken version in FiniteElement until somebody decides what exactly they want to plot here...

Reimplemented from oomph::FiniteElement.

126  {
127  FiniteElement::output(outfile, n_plot);
128  }

References oomph::FiniteElement::output().

◆ prescribed_cos_gamma()

template<class ELEMENT >
double oomph::YoungLaplaceContactAngleElement< ELEMENT >::prescribed_cos_gamma ( )
inlineprotected

Function to calculate the cos of the prescribed contact angle.

195  {
196  // If the function pointer is zero return zero
197  if (Prescribed_cos_gamma_pt == 0)
198  {
199  return 0.0;
200  }
201  // Otherwise de-reference pointer
202  else
203  {
204  return *Prescribed_cos_gamma_pt;
205  }
206  }

References oomph::YoungLaplaceContactAngleElement< ELEMENT >::Prescribed_cos_gamma_pt.

◆ prescribed_cos_gamma_pt() [1/2]

template<class ELEMENT >
double*& oomph::YoungLaplaceContactAngleElement< ELEMENT >::prescribed_cos_gamma_pt ( )
inline

Access function for the pointer to the prescribed contact angle.

86  {
88  }

References oomph::YoungLaplaceContactAngleElement< ELEMENT >::Prescribed_cos_gamma_pt.

◆ prescribed_cos_gamma_pt() [2/2]

template<class ELEMENT >
double* oomph::YoungLaplaceContactAngleElement< ELEMENT >::prescribed_cos_gamma_pt ( ) const
inline

◆ u()

template<class ELEMENT >
double& oomph::YoungLaplaceContactAngleElement< ELEMENT >::u ( const unsigned int n)
inlineprotected

Define an access function to the first data value stored at each node. In a more general "Equation" element, such abstraction is essential, because different Elements will store the same variables in different locations.

189  {
190  return *this->node_pt(n)->value_pt(0);
191  }
const unsigned n
Definition: CG3DPackingUnitTest.cpp:11
double * value_pt(const unsigned &i) const
Definition: nodes.h:324

References oomph::FiniteElement::node_pt(), and oomph::Data::value_pt().

◆ u_local_eqn()

template<class ELEMENT >
int oomph::YoungLaplaceContactAngleElement< ELEMENT >::u_local_eqn ( const unsigned n)
inline

Get the local equation number of the (one and only) unknown stored at local node n (returns -1 if value is pinned). Can be overloaded in derived multiphysics elements.

98  {
99  // Local equation number is the first value stored at the node
100  return nodal_local_eqn(n, 0);
101  }
int nodal_local_eqn(const unsigned &n, const unsigned &i) const
Definition: elements.h:1432

References n, and oomph::FiniteElement::nodal_local_eqn().

◆ zeta_nodal()

template<class ELEMENT >
double oomph::YoungLaplaceContactAngleElement< ELEMENT >::zeta_nodal ( const unsigned n,
const unsigned k,
const unsigned i 
) const
inlinevirtual

Specify the value of nodal zeta from the face geometry The "global" intrinsic coordinate of the element when viewed as part of a geometric object should be given by the FaceElement representation, by default (needed to break indeterminacy if bulk element is SolidElement)

Reimplemented from oomph::FaceElement.

112  {
113  return FaceElement::zeta_nodal(n, k, i);
114  }
double zeta_nodal(const unsigned &n, const unsigned &k, const unsigned &i) const
Definition: elements.h:4497
char char char int int * k
Definition: level2_impl.h:374

References i, k, n, and oomph::FaceElement::zeta_nodal().

Member Data Documentation

◆ Prescribed_cos_gamma_pt


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