oomph::LinearisedAxisymPoroelasticBJS_FSIElement< FLUID_BULK_ELEMENT, POROELASTICITY_BULK_ELEMENT > Class Template Reference

#include <axisym_poroelastic_fsi_face_elements.h>

+ Inheritance diagram for oomph::LinearisedAxisymPoroelasticBJS_FSIElement< FLUID_BULK_ELEMENT, POROELASTICITY_BULK_ELEMENT >:

Public Member Functions

 LinearisedAxisymPoroelasticBJS_FSIElement (FiniteElement *const &bulk_el_pt, const int &face_index, const unsigned &id=0)
 
 LinearisedAxisymPoroelasticBJS_FSIElement ()
 Default constructor. More...
 
 LinearisedAxisymPoroelasticBJS_FSIElement (const LinearisedAxisymPoroelasticBJS_FSIElement &dummy)=delete
 Broken copy constructor. More...
 
void operator= (const LinearisedAxisymPoroelasticBJS_FSIElement &)=delete
 Broken assignment operator. More...
 
double *& st_pt ()
 
double st () const
 Access function for the fluid Strouhal number. More...
 
double inverse_slip_rate_coefficient () const
 Inverse slip rate coefficient. More...
 
double *& inverse_slip_rate_coefficient_pt ()
 Pointer to inverse slip rate coefficient. More...
 
void fill_in_contribution_to_residuals (Vector< double > &residuals)
 Add the element's contribution to its residual vector. More...
 
double contribution_to_enclosed_volume ()
 
void output (std::ostream &outfile)
 Output function. More...
 
void output (std::ostream &outfile, const unsigned &n_plot)
 Output function: Output at Gauss points; n_plot is ignored. More...
 
void contribution_to_total_porous_flux (double &skeleton_flux_contrib, double &seepage_flux_contrib, double &nst_flux_contrib)
 
void output (FILE *file_pt)
 C-style output function. More...
 
void output (FILE *file_pt, const unsigned &n_plot)
 C-style output function. 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_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
 
- Public Member Functions inherited from oomph::ElementWithExternalElement
 ElementWithExternalElement ()
 
virtual ~ElementWithExternalElement ()
 The destructor, clean up any allocated memory. More...
 
 ElementWithExternalElement (const ElementWithExternalElement &)=delete
 Broken copy constructor. More...
 
void operator= (const ElementWithExternalElement &)=delete
 Broken assignment operator. More...
 
bool storage_has_been_allocated () const
 Helper function to check if storage has actually been allocated. More...
 
FiniteElement *& external_element_pt (const unsigned &interaction_index, const unsigned &ipt)
 
FiniteElement *const & external_element_pt (const unsigned &interaction_index, const unsigned &ipt) const
 Access function to source element, const version. More...
 
Vector< double > & external_element_local_coord (const unsigned &interaction_index, const unsigned &ipt)
 
Vector< double > const & external_element_local_coord (const unsigned &interaction_index, const unsigned &ipt) const
 Access function to get source element's coords, const version. More...
 
void output_external_elements (std::ostream &outfile, const unsigned &interaction_index)
 
void initialise_external_element_storage ()
 
void flush_all_external_element_storage ()
 Flush the storage for external elements. More...
 
void set_ninteraction (const unsigned &n_interaction)
 
unsigned ninteraction () const
 Return the number of interactions in the element. More...
 
virtual void identify_all_field_data_for_external_interaction (Vector< std::set< FiniteElement * >> const &external_elements_pt, std::set< std::pair< Data *, unsigned >> &paired_interaction_data)
 
virtual void identify_all_geometric_data_for_external_interaction (Vector< std::set< FiniteElement * >> const &external_elements_pt, std::set< Data * > &external_geometric_data_pt)
 
unsigned nexternal_interaction_field_data () const
 
Vector< Data * > external_interaction_field_data_pt () const
 
unsigned nexternal_interaction_geometric_data () const
 
bool add_external_geometric_data ()
 Are we including external geometric data in the element's Jacobian. More...
 
bool add_external_interaction_data ()
 Are we including external data in the element's Jacobian. More...
 
Vector< Data * > external_interaction_geometric_data_pt () const
 
void ignore_external_geometric_data ()
 
void ignore_external_interaction_data ()
 
void include_external_geometric_data ()
 
void include_external_interaction_data ()
 
bool external_geometric_data_is_included () const
 
void describe_local_dofs (std::ostream &out, const std::string &curr_string) const
 

Protected Member Functions

double shape_and_test (const Vector< double > &s, Shape &psi, Shape &test) const
 
double shape_and_test_at_knot (const unsigned &ipt, Shape &psi, Shape &test) const
 
- 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_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)
 
- Protected Member Functions inherited from oomph::ElementWithExternalElement
void assign_internal_and_external_local_eqn_numbers (const bool &store_local_dof_pt)
 
void assign_external_interaction_data_local_eqn_numbers (const bool &store_local_dof_pt)
 
void fill_in_jacobian_from_external_interaction_by_fd (Vector< double > &residuals, DenseMatrix< double > &jacobian)
 
void fill_in_jacobian_from_external_interaction_by_fd (DenseMatrix< double > &jacobian)
 
void fill_in_jacobian_from_external_interaction_field_by_fd (Vector< double > &residuals, DenseMatrix< double > &jacobian)
 
void fill_in_jacobian_from_external_interaction_field_by_fd (DenseMatrix< double > &jacobian)
 
void fill_in_jacobian_from_external_interaction_geometric_by_fd (Vector< double > &residuals, DenseMatrix< double > &jacobian)
 
void fill_in_jacobian_from_external_interaction_geometric_by_fd (DenseMatrix< double > &jacobian)
 
void fill_in_contribution_to_jacobian (Vector< double > &residuals, DenseMatrix< double > &jacobian)
 
virtual void update_before_external_interaction_field_fd ()
 
virtual void reset_after_external_interaction_field_fd ()
 
virtual void update_in_external_interaction_field_fd (const unsigned &i)
 
virtual void reset_in_external_interaction_field_fd (const unsigned &i)
 
virtual void update_before_external_interaction_geometric_fd ()
 
virtual void reset_after_external_interaction_geometric_fd ()
 
virtual void update_in_external_interaction_geometric_fd (const unsigned &i)
 
virtual void reset_in_external_interaction_geometric_fd (const unsigned &i)
 

Private Member Functions

void fill_in_generic_residual_contribution_axisym_poroelastic_fsi (Vector< double > &residuals, DenseMatrix< double > &jacobian, const unsigned &flag)
 

Private Attributes

unsigned Dim
 The spatial dimension of the problem. More...
 
Vector< unsignedU_index_axisym_poroelastic_fsi
 The index at which the velocity unknowns are stored at the nodes. More...
 
unsigned Id
 Lagrange Id. More...
 
doubleSt_pt
 Pointer to fluid Strouhal number. More...
 
doubleInverse_slip_rate_coeff_pt
 Pointer to inverse slip rate coefficient. 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
 
- Protected Attributes inherited from oomph::ElementWithExternalElement
bool Add_external_interaction_data
 Boolean flag to indicate whether to include the external data. More...
 
bool Add_external_geometric_data
 Boolean flag to indicate whether to include the external geometric data. More...
 
Data ** External_interaction_field_data_pt
 
Data ** External_interaction_geometric_data_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 FLUID_BULK_ELEMENT, class POROELASTICITY_BULK_ELEMENT>
class oomph::LinearisedAxisymPoroelasticBJS_FSIElement< FLUID_BULK_ELEMENT, POROELASTICITY_BULK_ELEMENT >

A class for elements that allow the imposition of the linearised poroelastic FSI slip condition (according to the Beavers-Joseph-Saffman condition) from an adjacent poroelastic axisymmetric medium. The element geometry is obtained from the FaceGeometry<ELEMENT> policy class.

Constructor & Destructor Documentation

◆ LinearisedAxisymPoroelasticBJS_FSIElement() [1/3]

template<class FLUID_BULK_ELEMENT , class POROELASTICITY_BULK_ELEMENT >
oomph::LinearisedAxisymPoroelasticBJS_FSIElement< FLUID_BULK_ELEMENT, POROELASTICITY_BULK_ELEMENT >::LinearisedAxisymPoroelasticBJS_FSIElement ( FiniteElement *const &  bulk_el_pt,
const int face_index,
const unsigned id = 0 
)

Constructor, takes the pointer to the "bulk" element and the face index identifying the face to which the element is attached. The optional identifier can be used to distinguish the additional nodal values created by this element from thos created by other FaceElements.

/////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// Constructor, takes the pointer to the "bulk" element, and the face index that identifies the face of the bulk element to which this face element is to be attached. The optional identifier can be used to distinguish the additional nodal values created by this element from thos created by other FaceElements.

737  : FaceGeometry<FLUID_BULK_ELEMENT>(), FaceElement()
738  {
739  // Set source element storage: one interaction with an external element
740  // that provides the velocity of the adjacent linear elasticity
741  // element; one with the associated face element that provides
742  // the geometric normalisation.
743  this->set_ninteraction(2);
744 
745  // Store the ID of the FaceElement -- this is used to distinguish
746  // it from any others
747  Id = id;
748 
749  // Initialise pointer to fluid Strouhal number. Defaults to 1
751 
752  // Initialise pointer to inverse slip rate coefficient. Defaults to 0 (no
753  // slip)
756 
757  // Let the bulk element build the FaceElement, i.e. setup the pointers
758  // to its nodes (by referring to the appropriate nodes in the bulk
759  // element), etc.
760  bulk_el_pt->build_face_element(face_index, this);
761 
762  // Extract the dimension of the problem from the dimension of
763  // the first node
764  Dim = this->node_pt(0)->ndim();
765 
766  // Upcast pointer to bulk element
767  FLUID_BULK_ELEMENT* cast_bulk_el_pt =
768  dynamic_cast<FLUID_BULK_ELEMENT*>(bulk_el_pt);
769 
770  // Read the index from the (cast) bulk element.
772  for (unsigned i = 0; i < 3; i++)
773  {
774  U_index_axisym_poroelastic_fsi[i] = cast_bulk_el_pt->u_index_axi_nst(i);
775  }
776 
777  // The velocities in the bulk affect the shear stress acting
778  // here so we must include them as external data
779  unsigned n = cast_bulk_el_pt->nnode();
780  for (unsigned j = 0; j < n; j++)
781  {
782  Node* nod_pt = cast_bulk_el_pt->node_pt(j);
783  bool do_it = true;
784  unsigned nn = nnode();
785  for (unsigned jj = 0; jj < nn; jj++)
786  {
787  if (nod_pt == node_pt(jj))
788  {
789  do_it = false;
790  break;
791  }
792  }
793  if (do_it) add_external_data(cast_bulk_el_pt->node_pt(j));
794  }
795 
796  // We need Dim+1 additional values for each FaceElement node to store the
797  // Lagrange multipliers.
798  Vector<unsigned> n_additional_values(nnode(), Dim + 1);
799 
800  // Now add storage for Lagrange multipliers and set the map containing the
801  // position of the first entry of this face element's additional values.
802  add_additional_values(n_additional_values, id);
803  }
int i
Definition: BiCGSTAB_step_by_step.cpp:9
const unsigned n
Definition: CG3DPackingUnitTest.cpp:11
void set_ninteraction(const unsigned &n_interaction)
Definition: element_with_external_element.h:178
int & face_index()
Definition: elements.h:4626
FaceElement()
Constructor: Initialise all appropriate member data.
Definition: elements.h:4446
void add_additional_values(const Vector< unsigned > &nadditional_values, const unsigned &id)
Definition: elements.h:4428
Node *& node_pt(const unsigned &n)
Return a pointer to the local node n.
Definition: elements.h:2175
unsigned nnode() const
Return the number of nodes.
Definition: elements.h:2210
unsigned add_external_data(Data *const &data_pt, const bool &fd=true)
Definition: elements.cc:307
double * St_pt
Pointer to fluid Strouhal number.
Definition: axisym_poroelastic_fsi_face_elements.h:712
unsigned Id
Lagrange Id.
Definition: axisym_poroelastic_fsi_face_elements.h:709
double * Inverse_slip_rate_coeff_pt
Pointer to inverse slip rate coefficient.
Definition: axisym_poroelastic_fsi_face_elements.h:715
Vector< unsigned > U_index_axisym_poroelastic_fsi
The index at which the velocity unknowns are stored at the nodes.
Definition: axisym_poroelastic_fsi_face_elements.h:706
unsigned Dim
The spatial dimension of the problem.
Definition: axisym_poroelastic_fsi_face_elements.h:703
unsigned ndim() const
Return (Eulerian) spatial dimension of the node.
Definition: nodes.h:1054
double Default_strouhal_number
Default for fluid Strouhal number.
Definition: axisym_poroelastic_fsi_face_elements.h:53
double Default_inverse_slip_rate_coefficient
Default for inverse slip rate coefficient: no slip.
Definition: axisym_poroelastic_fsi_face_elements.h:56
std::ptrdiff_t j
Definition: tut_arithmetic_redux_minmax.cpp:2

References oomph::FaceElement::add_additional_values(), oomph::GeneralisedElement::add_external_data(), oomph::FiniteElement::build_face_element(), oomph::LinearisedAxisymPoroelasticBJS_FSIHelper::Default_inverse_slip_rate_coefficient, oomph::LinearisedAxisymPoroelasticBJS_FSIHelper::Default_strouhal_number, oomph::LinearisedAxisymPoroelasticBJS_FSIElement< FLUID_BULK_ELEMENT, POROELASTICITY_BULK_ELEMENT >::Dim, oomph::FaceElement::face_index(), i, oomph::LinearisedAxisymPoroelasticBJS_FSIElement< FLUID_BULK_ELEMENT, POROELASTICITY_BULK_ELEMENT >::Id, oomph::LinearisedAxisymPoroelasticBJS_FSIElement< FLUID_BULK_ELEMENT, POROELASTICITY_BULK_ELEMENT >::Inverse_slip_rate_coeff_pt, j, n, oomph::Node::ndim(), oomph::FiniteElement::nnode(), oomph::FiniteElement::node_pt(), oomph::ElementWithExternalElement::set_ninteraction(), oomph::LinearisedAxisymPoroelasticBJS_FSIElement< FLUID_BULK_ELEMENT, POROELASTICITY_BULK_ELEMENT >::St_pt, and oomph::LinearisedAxisymPoroelasticBJS_FSIElement< FLUID_BULK_ELEMENT, POROELASTICITY_BULK_ELEMENT >::U_index_axisym_poroelastic_fsi.

◆ LinearisedAxisymPoroelasticBJS_FSIElement() [2/3]

template<class FLUID_BULK_ELEMENT , class POROELASTICITY_BULK_ELEMENT >
oomph::LinearisedAxisymPoroelasticBJS_FSIElement< FLUID_BULK_ELEMENT, POROELASTICITY_BULK_ELEMENT >::LinearisedAxisymPoroelasticBJS_FSIElement ( )
inline

Default constructor.

84 {}

◆ LinearisedAxisymPoroelasticBJS_FSIElement() [3/3]

template<class FLUID_BULK_ELEMENT , class POROELASTICITY_BULK_ELEMENT >
oomph::LinearisedAxisymPoroelasticBJS_FSIElement< FLUID_BULK_ELEMENT, POROELASTICITY_BULK_ELEMENT >::LinearisedAxisymPoroelasticBJS_FSIElement ( const LinearisedAxisymPoroelasticBJS_FSIElement< FLUID_BULK_ELEMENT, POROELASTICITY_BULK_ELEMENT > &  dummy)
delete

Broken copy constructor.

Member Function Documentation

◆ contribution_to_enclosed_volume()

template<class FLUID_BULK_ELEMENT , class POROELASTICITY_BULK_ELEMENT >
double oomph::LinearisedAxisymPoroelasticBJS_FSIElement< FLUID_BULK_ELEMENT, POROELASTICITY_BULK_ELEMENT >::contribution_to_enclosed_volume ( )
inline

Return this element's contribution to the total volume enclosed by collection of these elements

152  {
153  // Initialise
154  double vol = 0.0;
155 
156  // Find out how many nodes there are
157  const unsigned n_node = this->nnode();
158 
159  // Set up memeory for the shape functions
160  Shape psi(n_node);
161  DShape dpsids(n_node, 1);
162 
163  // Set the value of n_intpt
164  const unsigned n_intpt = this->integral_pt()->nweight();
165 
166  // Storage for the local coordinate
167  Vector<double> s(1);
168 
169  // Loop over the integration points
170  for (unsigned ipt = 0; ipt < n_intpt; ipt++)
171  {
172  // Get the local coordinate at the integration point
173  s[0] = this->integral_pt()->knot(ipt, 0);
174 
175  // Get the integral weight
176  double W = this->integral_pt()->weight(ipt);
177 
178  // Call the derivatives of the shape function at the knot point
179  this->dshape_local_at_knot(ipt, psi, dpsids);
180 
181  // Get position and tangent vector
182  Vector<double> interpolated_t1(2, 0.0);
183  Vector<double> interpolated_x(2, 0.0);
184  for (unsigned l = 0; l < n_node; l++)
185  {
186  // Loop over directional components
187  for (unsigned i = 0; i < 2; i++)
188  {
189  interpolated_x[i] += this->nodal_position(l, i) * psi(l);
190  interpolated_t1[i] += this->nodal_position(l, i) * dpsids(l, 0);
191  }
192  }
193 
194  // Calculate the length of the tangent Vector
195  double tlength = interpolated_t1[0] * interpolated_t1[0] +
196  interpolated_t1[1] * interpolated_t1[1];
197 
198  // Set the Jacobian of the line element
199  double J = sqrt(tlength) * interpolated_x[0];
200 
201  // Now calculate the normal Vector
202  Vector<double> interpolated_n(2);
203  this->outer_unit_normal(ipt, interpolated_n);
204 
205  // Assemble dot product
206  double dot = 0.0;
207  for (unsigned k = 0; k < 2; k++)
208  {
209  dot += interpolated_x[k] * interpolated_n[k];
210  }
211 
212  // Add to volume with sign chosen so that...
213 
214  // Factor of 1/3 comes from div trick
215  vol += 2.0 * MathematicalConstants::Pi * dot * W * J / 3.0;
216  }
217 
218  return vol;
219  }
AnnoyingScalar sqrt(const AnnoyingScalar &x)
Definition: AnnoyingScalar.h:134
JacobiRotation< float > J
Definition: Jacobi_makeJacobi.cpp:3
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 interpolated_x(const Vector< double > &s, const unsigned &i) const
Definition: elements.h:4528
virtual void dshape_local_at_knot(const unsigned &ipt, Shape &psi, DShape &dpsids) const
Definition: elements.cc:3239
Integral *const & integral_pt() const
Return the pointer to the integration scheme (const version)
Definition: elements.h:1963
double nodal_position(const unsigned &n, const unsigned &i) const
Definition: elements.h:2317
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.
RealScalar s
Definition: level1_cplx_impl.h:130
Scalar EIGEN_BLAS_FUNC_NAME() dot(int *n, Scalar *px, int *incx, Scalar *py, int *incy)
Definition: level1_real_impl.h:52
char char char int int * k
Definition: level2_impl.h:374
const double Pi
50 digits from maple
Definition: oomph_utilities.h:157
@ W
Definition: quadtree.h:63

References dot(), oomph::FiniteElement::dshape_local_at_knot(), i, oomph::FiniteElement::integral_pt(), oomph::FaceElement::interpolated_x(), J, k, oomph::Integral::knot(), oomph::FiniteElement::nnode(), oomph::FiniteElement::nodal_position(), oomph::Integral::nweight(), oomph::FaceElement::outer_unit_normal(), oomph::MathematicalConstants::Pi, s, sqrt(), oomph::QuadTreeNames::W, and oomph::Integral::weight().

◆ contribution_to_total_porous_flux()

template<class FLUID_BULK_ELEMENT , class POROELASTICITY_BULK_ELEMENT >
void oomph::LinearisedAxisymPoroelasticBJS_FSIElement< FLUID_BULK_ELEMENT, POROELASTICITY_BULK_ELEMENT >::contribution_to_total_porous_flux ( double skeleton_flux_contrib,
double seepage_flux_contrib,
double nst_flux_contrib 
)
inline

Compute contributions to integrated porous flux over boundary: q_skeleton = \int \partial u_displ / \partial t \cdot n ds q_seepage = \int k q \cdot n ds q_nst = \int u \cdot n ds

450  {
451  // Get the value of Nintpt
452  const unsigned n_intpt = integral_pt()->nweight();
453 
454  // Set the Vector to hold local coordinates
455  Vector<double> s(Dim - 1);
456  Vector<double> x_bulk(Dim);
457 
458  // Find out how many nodes there are
459  const unsigned n_node = this->nnode();
460 
461  // Set up memeory for the shape functions
462  Shape psi(n_node);
463  DShape dpsids(n_node, 1);
464 
465  // Loop over the integration points
466  skeleton_flux_contrib = 0.0;
467  seepage_flux_contrib = 0.0;
468  nst_flux_contrib = 0.0;
469  for (unsigned ipt = 0; ipt < n_intpt; ipt++)
470  {
471  // Assign values of s
472  for (unsigned i = 0; i < (Dim - 1); i++)
473  {
474  s[i] = integral_pt()->knot(ipt, i);
475  }
476 
477  // Get the outer unit normal
478  Vector<double> interpolated_normal(Dim);
479  outer_unit_normal(ipt, interpolated_normal);
480 
481  // Get the integral weight
482  double W = this->integral_pt()->weight(ipt);
483 
484  // Call the derivatives of the shape function at the knot point
485  this->dshape_local_at_knot(ipt, psi, dpsids);
486 
487  // Get position and tangent vector
488  Vector<double> interpolated_t1(2, 0.0);
489  Vector<double> interpolated_x(2, 0.0);
490  for (unsigned l = 0; l < n_node; l++)
491  {
492  // Loop over directional components
493  for (unsigned i = 0; i < 2; i++)
494  {
495  interpolated_x[i] += this->nodal_position(l, i) * psi(l);
496  interpolated_t1[i] += this->nodal_position(l, i) * dpsids(l, 0);
497  }
498  }
499 
500  // Calculate the length of the tangent Vector
501  double tlength = interpolated_t1[0] * interpolated_t1[0] +
502  interpolated_t1[1] * interpolated_t1[1];
503 
504  // Set the Jacobian of the line element
505  double J = sqrt(tlength) * interpolated_x[0];
506 
507  // Get solid velocity and porous flux from adjacent solid
508  POROELASTICITY_BULK_ELEMENT* ext_el_pt =
509  dynamic_cast<POROELASTICITY_BULK_ELEMENT*>(
510  external_element_pt(0, ipt));
511  Vector<double> s_ext(external_element_local_coord(0, ipt));
512  Vector<double> du_dt(3);
513  Vector<double> q(2);
514  ext_el_pt->interpolated_du_dt(s_ext, du_dt);
515  ext_el_pt->interpolated_q(s_ext, q);
516  x_bulk[0] = ext_el_pt->interpolated_x(s_ext, 0);
517  x_bulk[1] = ext_el_pt->interpolated_x(s_ext, 1);
518 
519 
520 #ifdef PARANOID
522  {
523  // Get own coordinates:
524  Vector<double> x(Dim);
525  this->interpolated_x(s, x);
526 
527  double error = sqrt(
528  (interpolated_x[0] - x_bulk[0]) * (interpolated_x[0] - x_bulk[0]) +
529  (interpolated_x[1] - x_bulk[1]) * (interpolated_x[1] - x_bulk[1]));
530  double tol = 1.0e-10;
531  if (error > tol)
532  {
533  std::stringstream junk;
534  junk << "Gap between external and face element coordinate\n"
535  << "is suspiciously large: " << error
536  << "\nBulk/external at: " << x_bulk[0] << " " << x_bulk[1]
537  << "\n"
538  << "Face at: " << x[0] << " " << x[1] << "\n";
539  OomphLibWarning(
541  }
542  }
543 #endif
544 
545 
546  // Default geometry; evaluate everything in deformed (Nst) config.
547  double lagrangian_eulerian_translation_factor = 1.0;
548 
549  // Get the outer unit normal for poro
550  Vector<double> poro_normal(interpolated_normal);
551 
552 
553  // Get pointer to associated face element to get geometric information
554  // from (if set up)
555  FSILinearisedAxisymPoroelasticTractionElement<
556  POROELASTICITY_BULK_ELEMENT,
557  FLUID_BULK_ELEMENT>* ext_face_el_pt =
558  dynamic_cast<FSILinearisedAxisymPoroelasticTractionElement<
559  POROELASTICITY_BULK_ELEMENT,
560  FLUID_BULK_ELEMENT>*>(external_element_pt(1, ipt));
561 
562  // Update geometry
563  if (ext_face_el_pt != 0)
564  {
565  Vector<double> s_ext_face(external_element_local_coord(1, ipt));
566 
567 #ifdef PARANOID
568 
569  Vector<double> x_face(2);
570  x_face[0] = ext_face_el_pt->interpolated_x(s_ext_face, 0);
571  x_face[1] = ext_face_el_pt->interpolated_x(s_ext_face, 1);
572 
573  double tol = 1.0e-10;
574  double error =
575  std::fabs(x_bulk[0] - x_face[0]) + std::fabs(x_bulk[1] - x_face[1]);
576  if (error > tol)
577  {
578  std::stringstream junk;
579  junk << "Difference in Eulerian coordinates: " << error
580  << " is suspiciously large: "
581  << "Bulk: " << x_bulk[0] << " " << x_bulk[1] << " "
582  << "Face: " << x_face[0] << " " << x_face[1] << "\n";
583  OomphLibWarning(
585  }
586 
587 #endif
588 
589  // Get correction factor for geometry
590  lagrangian_eulerian_translation_factor =
591  ext_face_el_pt->lagrangian_eulerian_translation_factor(s_ext_face);
592 
593  // Get the outer unit normal
594  ext_face_el_pt->outer_unit_normal(s_ext_face, poro_normal);
595  poro_normal[0] = -poro_normal[0];
596  poro_normal[1] = -poro_normal[1];
597  }
598 
599  // Get permeability from the bulk poroelasticity element
600  const double permeability = ext_el_pt->permeability();
601 
602  // Local coordinate in bulk element
603  Vector<double> s_bulk(Dim);
604  s_bulk = local_coordinate_in_bulk(s);
605 
606  // Get fluid velocity from bulk element
607  Vector<double> fluid_veloc(Dim + 1, 0.0);
608  dynamic_cast<FLUID_BULK_ELEMENT*>(bulk_element_pt())
609  ->interpolated_u_axi_nst(s_bulk, fluid_veloc);
610 
611  // Get net flux through boundary
612  double q_flux = 0.0;
613  double dudt_flux = 0.0;
614  double nst_flux = 0.0;
615  for (unsigned i = 0; i < 2; i++)
616  {
617  q_flux += permeability * q[i] * poro_normal[i];
618  dudt_flux += du_dt[i] * interpolated_normal[i];
619  nst_flux += fluid_veloc[i] * interpolated_normal[i];
620  }
621 
622  // Add
623  seepage_flux_contrib += 2.0 * MathematicalConstants::Pi * q_flux *
624  lagrangian_eulerian_translation_factor * W * J;
625  skeleton_flux_contrib +=
626  2.0 * MathematicalConstants::Pi * dudt_flux * W * J;
627  nst_flux_contrib += 2.0 * MathematicalConstants::Pi * nst_flux * W * J;
628  }
629  }
Vector< double > & external_element_local_coord(const unsigned &interaction_index, const unsigned &ipt)
Definition: element_with_external_element.h:136
FiniteElement *& external_element_pt(const unsigned &interaction_index, const unsigned &ipt)
Definition: element_with_external_element.h:107
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
EIGEN_DEVICE_FUNC const Scalar & q
Definition: SpecialFunctionsImpl.h:2019
Real fabs(const Real &a)
Definition: boostmultiprec.cpp:117
int error
Definition: calibrate.py:297
bool Allow_gap_in_FSI
Definition: axisym_poroelasticity_face_elements.h:79
list x
Definition: plotDoE.py:28
#define OOMPH_EXCEPTION_LOCATION
Definition: oomph_definitions.h:61
#define OOMPH_CURRENT_FUNCTION
Definition: oomph_definitions.h:86

References oomph::AxisymmetricPoroelasticityTractionElementHelper::Allow_gap_in_FSI, oomph::FaceElement::bulk_element_pt(), oomph::LinearisedAxisymPoroelasticBJS_FSIElement< FLUID_BULK_ELEMENT, POROELASTICITY_BULK_ELEMENT >::Dim, oomph::FiniteElement::dshape_local_at_knot(), calibrate::error, oomph::ElementWithExternalElement::external_element_local_coord(), oomph::ElementWithExternalElement::external_element_pt(), boost::multiprecision::fabs(), i, oomph::FiniteElement::integral_pt(), oomph::FaceElement::interpolated_x(), J, oomph::Integral::knot(), oomph::FaceElement::local_coordinate_in_bulk(), oomph::FiniteElement::nnode(), oomph::FiniteElement::nodal_position(), oomph::Integral::nweight(), OOMPH_CURRENT_FUNCTION, OOMPH_EXCEPTION_LOCATION, oomph::FaceElement::outer_unit_normal(), oomph::MathematicalConstants::Pi, Eigen::numext::q, s, sqrt(), oomph::QuadTreeNames::W, oomph::Integral::weight(), and plotDoE::x.

◆ fill_in_contribution_to_residuals()

template<class FLUID_BULK_ELEMENT , class POROELASTICITY_BULK_ELEMENT >
void oomph::LinearisedAxisymPoroelasticBJS_FSIElement< FLUID_BULK_ELEMENT, POROELASTICITY_BULK_ELEMENT >::fill_in_contribution_to_residuals ( Vector< double > &  residuals)
inlinevirtual

Add the element's contribution to its residual vector.

Reimplemented from oomph::GeneralisedElement.

122  {
123  // Call the generic residuals function with flag set to 0
124  // using a dummy matrix argument
126  residuals, GeneralisedElement::Dummy_matrix, 0);
127  }
static DenseMatrix< double > Dummy_matrix
Definition: elements.h:227
void fill_in_generic_residual_contribution_axisym_poroelastic_fsi(Vector< double > &residuals, DenseMatrix< double > &jacobian, const unsigned &flag)
Definition: axisym_poroelastic_fsi_face_elements.h:812

References oomph::GeneralisedElement::Dummy_matrix, and oomph::LinearisedAxisymPoroelasticBJS_FSIElement< FLUID_BULK_ELEMENT, POROELASTICITY_BULK_ELEMENT >::fill_in_generic_residual_contribution_axisym_poroelastic_fsi().

◆ fill_in_generic_residual_contribution_axisym_poroelastic_fsi()

template<class FLUID_BULK_ELEMENT , class POROELASTICITY_BULK_ELEMENT >
void oomph::LinearisedAxisymPoroelasticBJS_FSIElement< FLUID_BULK_ELEMENT, POROELASTICITY_BULK_ELEMENT >::fill_in_generic_residual_contribution_axisym_poroelastic_fsi ( Vector< double > &  residuals,
DenseMatrix< double > &  jacobian,
const unsigned flag 
)
private

Add the element's contribution to its residual vector. flag=1(or 0): do (or don't) compute the contribution to the Jacobian as well.

Helper function to compute the element's residual vector and the Jacobian matrix.

816  {
817  // Find out how many nodes there are
818  const unsigned n_node = nnode();
819 
820  // Set up memory for the shape and test functions
821  Shape psif(n_node), testf(n_node);
822 
823  // Set the value of Nintpt
824  const unsigned n_intpt = integral_pt()->nweight();
825 
826  // Set the Vector to hold local coordinates
827  Vector<double> s(Dim - 1);
828 
829  // Cache the Strouhal number
830  const double local_st = st();
831 
832  // Cache the slip rate coefficient
833  const double local_inverse_slip_rate_coeff =
835 
836  // Integers to hold the local equation and unknown numbers
837  int local_eqn = 0;
838 
839  // Loop over the integration points
840  // --------------------------------
841  for (unsigned ipt = 0; ipt < n_intpt; ipt++)
842  {
843  // Assign values of s
844  for (unsigned i = 0; i < (Dim - 1); i++)
845  {
846  s[i] = integral_pt()->knot(ipt, i);
847  }
848 
849  // Get the integral weight
850  double w = integral_pt()->weight(ipt);
851 
852  // Find the shape and test functions and return the Jacobian
853  // of the mapping
854  double J = shape_and_test(s, psif, testf);
855 
856  // Calculate the coordinates
857  double interpolated_r = 0;
858 
859  // Premultiply the weights and the Jacobian
860  double W = w * J;
861 
862  // Calculate the Lagrange multiplier and the fluid veloc
863  Vector<double> lambda(Dim + 1, 0.0);
864  Vector<double> fluid_veloc(Dim + 1, 0.0);
865 
866  // Loop over nodes
867  for (unsigned j = 0; j < n_node; j++)
868  {
869  Node* nod_pt = node_pt(j);
870 
871  // Cast to a boundary node
872  BoundaryNodeBase* bnod_pt = dynamic_cast<BoundaryNodeBase*>(node_pt(j));
873 
874  // Get the index of the first nodal value associated with
875  // this FaceElement
876  unsigned first_index =
877  bnod_pt->index_of_first_value_assigned_by_face_element(Id);
878 
879  // Work out radius
880  interpolated_r += nodal_position(j, 0) * psif(j);
881 
882  // Assemble
883  for (unsigned i = 0; i < Dim + 1; i++)
884  {
885  lambda[i] += nod_pt->value(first_index + i) * psif(j);
886  fluid_veloc[i] +=
887  nod_pt->value(U_index_axisym_poroelastic_fsi[i]) * psif(j);
888  }
889  }
890 
891  // Local coordinate in bulk element
892  Vector<double> s_bulk(Dim);
893  s_bulk = local_coordinate_in_bulk(s);
894 
895 #ifdef PARANOID
896  {
897  // Get fluid velocity from bulk element
898  Vector<double> fluid_veloc_from_bulk(Dim + 1, 0.0);
899  dynamic_cast<FLUID_BULK_ELEMENT*>(bulk_element_pt())
900  ->interpolated_u_axi_nst(s_bulk, fluid_veloc_from_bulk);
901 
902  double error = 0.0;
903  for (unsigned i = 0; i < Dim + 1; i++)
904  {
905  error += (fluid_veloc[i] - fluid_veloc_from_bulk[i]) *
906  (fluid_veloc[i] - fluid_veloc_from_bulk[i]);
907  }
908  error = sqrt(error);
909  double tol = 1.0e-15;
910  if (error > tol)
911  {
912  std::stringstream junk;
913  junk << "Difference in Navier-Stokes velocities\n"
914  << "is suspiciously large: " << error
915  << "\nVeloc from bulk: " << fluid_veloc_from_bulk[0] << " "
916  << fluid_veloc_from_bulk[1] << "\n"
917  << "Veloc from face: " << fluid_veloc[0] << " " << fluid_veloc[1]
918  << "\n";
919  OomphLibWarning(
921  }
922  }
923 #endif
924 
925  // Get solid velocity from adjacent solid
926  POROELASTICITY_BULK_ELEMENT* ext_el_pt =
927  dynamic_cast<POROELASTICITY_BULK_ELEMENT*>(external_element_pt(0, ipt));
928  Vector<double> s_ext(external_element_local_coord(0, ipt));
929  Vector<double> du_dt(2), q(2);
930  ext_el_pt->interpolated_du_dt(s_ext, du_dt);
931  ext_el_pt->interpolated_q(s_ext, q);
932 
933  // Get the outer unit normal
934  Vector<double> interpolated_normal(Dim);
935  outer_unit_normal(ipt, interpolated_normal);
936 
937  // Calculate the unit tangent vector
938  Vector<double> interpolated_tangent(Dim);
939  interpolated_tangent[0] = -interpolated_normal[1];
940  interpolated_tangent[1] = interpolated_normal[0];
941 
942  // Normal for poroelastic solid
943  Vector<double> poro_normal(interpolated_normal);
944 
945  // Default geometry; evaluate everything in deformed (Nst) config.
946  double lagrangian_eulerian_translation_factor = 1.0;
947 
948  // Get pointer to associated face element to get geometric information
949  // from (if set up)
950  FSILinearisedAxisymPoroelasticTractionElement<POROELASTICITY_BULK_ELEMENT,
951  FLUID_BULK_ELEMENT>*
952  ext_face_el_pt =
953  dynamic_cast<FSILinearisedAxisymPoroelasticTractionElement<
954  POROELASTICITY_BULK_ELEMENT,
955  FLUID_BULK_ELEMENT>*>(external_element_pt(1, ipt));
956 
957  // Update geometry
958  if (ext_face_el_pt != 0)
959  {
960  Vector<double> s_ext_face(external_element_local_coord(1, ipt));
961 
962  /* #ifdef PARANOID */
963 
964  /* Vector<double> x_face(2); */
965  /* x_face[0]=ext_face_el_pt->interpolated_x(s_ext_face,0); */
966  /* x_face[1]=ext_face_el_pt->interpolated_x(s_ext_face,1); */
967 
968  /* Vector<double> x_bulk(2); */
969  /* x_bulk[0]=this->interpolated_x(s,0); */
970  /* x_bulk[1]=this->interpolated_x(s,1); */
971 
972  /* double tol=1.0e-10; */
973  /* double
974  * error=std::fabs(x_bulk[0]-x_face[0])+std::fabs(x_bulk[1]-x_face[1]);
975  */
976  /* if (error>tol) */
977  /* { */
978  /* std::stringstream junk; */
979  /* junk */
980  /* << "Difference in Eulerian coordinates: " << error */
981  /* << " is suspiciously large: " */
982  /* << "Bulk: " << x_bulk[0] << " " << x_bulk[1] << " " */
983  /* << "Face: " << x_face[0] << " " << x_face[1] << "\n"; */
984  /* OomphLibWarning(junk.str(), */
985  /* OOMPH_CURRENT_FUNCTION, */
986  /* OOMPH_EXCEPTION_LOCATION); */
987  /* } */
988 
989  /* #endif */
990 
991  // Get correction factor for geometry
992  lagrangian_eulerian_translation_factor =
993  ext_face_el_pt->lagrangian_eulerian_translation_factor(s_ext_face);
994 
995  // Get the outer unit normal
996  ext_face_el_pt->outer_unit_normal(s_ext_face, poro_normal);
997  poro_normal[0] = -poro_normal[0];
998  poro_normal[1] = -poro_normal[1];
999  }
1000 
1001 
1002  // Get permeability from the bulk poroelasticity element
1003  const double permeability = ext_el_pt->permeability();
1004  const double local_permeability_ratio = ext_el_pt->permeability_ratio();
1005 
1006  // We are given the normal and tangential components of the combined
1007  // poroelasticity "velocity" at the boundary from the BJS condition ---
1008  // calculate the vector in r-z coords from these
1009  double poro_normal_component = 0.0;
1010  double poro_tangential_component = 0.0;
1011 
1012  // Get the fluid traction from the NSt bulk element
1013  Vector<double> traction_nst(3);
1014  dynamic_cast<FLUID_BULK_ELEMENT*>(bulk_element_pt())
1015  ->traction(s_bulk, interpolated_normal, traction_nst);
1016 
1017  // Calculate the normal and tangential components
1018  for (unsigned i = 0; i < Dim; i++)
1019  {
1020  // Normal component computed with scaling factor for mass conservation
1021  poro_normal_component +=
1022  local_st *
1023  (du_dt[i] * interpolated_normal[i] +
1024  permeability * q[i] * lagrangian_eulerian_translation_factor *
1025  poro_normal[i]);
1026 
1027  // Leave this one alone... There isn't really much point
1028  // in trying to correct this.
1029  poro_tangential_component +=
1030  (local_st * du_dt[i] - traction_nst[i] *
1031  sqrt(local_permeability_ratio) *
1032  local_inverse_slip_rate_coeff) *
1033  interpolated_tangent[i];
1034  }
1035 
1036  // Get the normal and tangential nst components
1037  double nst_normal_component = 0.0;
1038  double nst_tangential_component = 0.0;
1039  for (unsigned i = 0; i < Dim; i++)
1040  {
1041  nst_normal_component += fluid_veloc[i] * interpolated_normal[i];
1042  nst_tangential_component += fluid_veloc[i] * interpolated_tangent[i];
1043  }
1044 
1045  // Setup bjs terms
1046  Vector<double> bjs_term(2);
1047  bjs_term[0] = nst_normal_component - poro_normal_component;
1048  bjs_term[1] = nst_tangential_component - poro_tangential_component;
1049 
1050  // Now add to the appropriate equations
1051 
1052  // Loop over the test functions
1053  for (unsigned l = 0; l < n_node; l++)
1054  {
1055  // Loop over directions
1056  for (unsigned i = 0; i < Dim + 1; i++)
1057  {
1058  // Add contribution to bulk Navier Stokes equations where
1059  // ------------------------------------------------------
1060  // the Lagrange multiplier acts as a traction
1061  // ------------------------------------------
1063 
1064  /*IF it's not a boundary condition*/
1065  if (local_eqn >= 0)
1066  {
1067  // Add the Lagrange multiplier "traction" to the bulk
1068  residuals[local_eqn] -= lambda[i] * testf[l] * interpolated_r * W;
1069 
1070  // Jacobian entries
1071  if (flag)
1072  {
1073  throw OomphLibError("Jacobian not done yet",
1076 
1077  // Loop over the lagrange multiplier unknowns
1078  for (unsigned l2 = 0; l2 < n_node; l2++)
1079  {
1080  // Cast to a boundary node
1081  BoundaryNodeBase* bnod_pt =
1082  dynamic_cast<BoundaryNodeBase*>(node_pt(l2));
1083 
1084  // Local unknown
1085  int local_unknown = nodal_local_eqn(
1086  l2,
1087  bnod_pt->index_of_first_value_assigned_by_face_element(Id) +
1088  i);
1089 
1090  // If it's not pinned
1091  if (local_unknown >= 0)
1092  {
1093  jacobian(local_eqn, local_unknown) -=
1094  psif[l2] * testf[l] * interpolated_r * W;
1095  }
1096  }
1097  }
1098  }
1099 
1100  // Now do the Lagrange multiplier equations
1101  //-----------------------------------------
1102  // Cast to a boundary node
1103  BoundaryNodeBase* bnod_pt =
1104  dynamic_cast<BoundaryNodeBase*>(node_pt(l));
1105 
1106  // Local eqn number:
1107  int local_eqn = nodal_local_eqn(
1108  l, bnod_pt->index_of_first_value_assigned_by_face_element(Id) + i);
1109 
1110  // If it's not pinned
1111  if (local_eqn >= 0)
1112  {
1113 #ifdef PARANOID
1114  if (i == Dim)
1115  {
1116  std::stringstream junk;
1117  junk << "Elements have not been validated for nonzero swirl!\n";
1118  OomphLibWarning(
1120  }
1121 #endif
1122 
1123  residuals[local_eqn] += bjs_term[i] * testf(l) * interpolated_r * W;
1124 
1125  // Jacobian entries
1126  if (flag)
1127  {
1128  throw OomphLibError("Jacobian not done yet",
1131 
1132  // Loop over the velocity unknowns [derivs w.r.t. to
1133  // wall velocity taken care of by fd-ing
1134  for (unsigned l2 = 0; l2 < n_node; l2++)
1135  {
1136  int local_unknown =
1138 
1139  /*IF it's not a boundary condition*/
1140  if (local_unknown >= 0)
1141  {
1142  jacobian(local_eqn, local_unknown) -=
1143  psif[l2] * testf[l] * interpolated_r * W;
1144  }
1145  }
1146  }
1147  }
1148  }
1149  }
1150  }
1151  }
cout<< "The eigenvalues of A are:"<< endl<< ces.eigenvalues()<< endl;cout<< "The matrix of eigenvectors, V, is:"<< endl<< ces.eigenvectors()<< endl<< endl;complex< float > lambda
Definition: ComplexEigenSolver_compute.cpp:9
RowVector3d w
Definition: Matrix_resize_int.cpp:3
int nodal_local_eqn(const unsigned &n, const unsigned &i) const
Definition: elements.h:1432
double inverse_slip_rate_coefficient() const
Inverse slip rate coefficient.
Definition: axisym_poroelastic_fsi_face_elements.h:107
double st() const
Access function for the fluid Strouhal number.
Definition: axisym_poroelastic_fsi_face_elements.h:101
double shape_and_test(const Vector< double > &s, Shape &psi, Shape &test) const
Definition: axisym_poroelastic_fsi_face_elements.h:649

References Global_Variables::Dim, calibrate::error, i, oomph::BoundaryNodeBase::index_of_first_value_assigned_by_face_element(), J, j, lambda, OOMPH_CURRENT_FUNCTION, OOMPH_EXCEPTION_LOCATION, Eigen::numext::q, s, sqrt(), oomph::Node::value(), w, and oomph::QuadTreeNames::W.

Referenced by oomph::LinearisedAxisymPoroelasticBJS_FSIElement< FLUID_BULK_ELEMENT, POROELASTICITY_BULK_ELEMENT >::fill_in_contribution_to_residuals().

◆ inverse_slip_rate_coefficient()

template<class FLUID_BULK_ELEMENT , class POROELASTICITY_BULK_ELEMENT >
double oomph::LinearisedAxisymPoroelasticBJS_FSIElement< FLUID_BULK_ELEMENT, POROELASTICITY_BULK_ELEMENT >::inverse_slip_rate_coefficient ( ) const
inline

◆ inverse_slip_rate_coefficient_pt()

template<class FLUID_BULK_ELEMENT , class POROELASTICITY_BULK_ELEMENT >
double*& oomph::LinearisedAxisymPoroelasticBJS_FSIElement< FLUID_BULK_ELEMENT, POROELASTICITY_BULK_ELEMENT >::inverse_slip_rate_coefficient_pt ( )
inline

◆ operator=()

template<class FLUID_BULK_ELEMENT , class POROELASTICITY_BULK_ELEMENT >
void oomph::LinearisedAxisymPoroelasticBJS_FSIElement< FLUID_BULK_ELEMENT, POROELASTICITY_BULK_ELEMENT >::operator= ( const LinearisedAxisymPoroelasticBJS_FSIElement< FLUID_BULK_ELEMENT, POROELASTICITY_BULK_ELEMENT > &  )
delete

Broken assignment operator.

◆ output() [1/4]

template<class FLUID_BULK_ELEMENT , class POROELASTICITY_BULK_ELEMENT >
void oomph::LinearisedAxisymPoroelasticBJS_FSIElement< FLUID_BULK_ELEMENT, POROELASTICITY_BULK_ELEMENT >::output ( FILE *  file_pt)
inlinevirtual

C-style output function.

Reimplemented from oomph::FiniteElement.

634  {
636  }
void output(std::ostream &outfile, const unsigned &nplot)
Overload output function.
Definition: overloaded_element_body.h:490

References output().

◆ output() [2/4]

template<class FLUID_BULK_ELEMENT , class POROELASTICITY_BULK_ELEMENT >
void oomph::LinearisedAxisymPoroelasticBJS_FSIElement< FLUID_BULK_ELEMENT, POROELASTICITY_BULK_ELEMENT >::output ( FILE *  file_pt,
const unsigned n_plot 
)
inlinevirtual

C-style output function.

Reimplemented from oomph::FiniteElement.

640  {
642  }

References output().

◆ output() [3/4]

template<class FLUID_BULK_ELEMENT , class POROELASTICITY_BULK_ELEMENT >
void oomph::LinearisedAxisymPoroelasticBJS_FSIElement< FLUID_BULK_ELEMENT, POROELASTICITY_BULK_ELEMENT >::output ( std::ostream &  outfile)
inlinevirtual

Output function.

Reimplemented from oomph::FiniteElement.

224  {
225  // Dummy
226  unsigned nplot = 0;
227  output(outfile, nplot);
228  }
void output(std::ostream &outfile)
Output function.
Definition: axisym_poroelastic_fsi_face_elements.h:223

◆ output() [4/4]

template<class FLUID_BULK_ELEMENT , class POROELASTICITY_BULK_ELEMENT >
void oomph::LinearisedAxisymPoroelasticBJS_FSIElement< FLUID_BULK_ELEMENT, POROELASTICITY_BULK_ELEMENT >::output ( std::ostream &  outfile,
const unsigned n_plot 
)
inlinevirtual

Output function: Output at Gauss points; n_plot is ignored.

Reimplemented from oomph::FiniteElement.

232  {
233  // Find out how many nodes there are
234  unsigned n_node = nnode();
235 
236  // Get the value of Nintpt
237  const unsigned n_intpt = integral_pt()->nweight();
238 
239  // Tecplot header info
240  outfile << this->tecplot_zone_string(n_intpt);
241 
242  // Set the Vector to hold local coordinates
243  Vector<double> s(Dim - 1);
244  Vector<double> x_bulk(Dim);
245  Shape psi(n_node);
246  DShape dpsids(n_node, Dim - 1);
247 
248  // Cache the Strouhal number
249  const double local_st = st();
250 
251  // Cache the slip rate coefficient
252  const double local_inverse_slip_rate_coeff =
254 
255  // Loop over the integration points
256  for (unsigned ipt = 0; ipt < n_intpt; ipt++)
257  {
258  // Assign values of s
259  for (unsigned i = 0; i < (Dim - 1); i++)
260  {
261  s[i] = integral_pt()->knot(ipt, i);
262  }
263 
264  // Get the outer unit normal
265  Vector<double> interpolated_normal(Dim);
266  outer_unit_normal(ipt, interpolated_normal);
267 
268  // Calculate the unit tangent vector
269  Vector<double> interpolated_tangent(Dim);
270  interpolated_tangent[0] = -interpolated_normal[1];
271  interpolated_tangent[1] = interpolated_normal[0];
272 
273  // Get solid velocity and porous flux from adjacent solid
274  POROELASTICITY_BULK_ELEMENT* ext_el_pt =
275  dynamic_cast<POROELASTICITY_BULK_ELEMENT*>(
276  external_element_pt(0, ipt));
277  Vector<double> s_ext(external_element_local_coord(0, ipt));
278  Vector<double> du_dt(3);
279  Vector<double> q(2);
280  ext_el_pt->interpolated_du_dt(s_ext, du_dt);
281  ext_el_pt->interpolated_q(s_ext, q);
282  x_bulk[0] = ext_el_pt->interpolated_x(s_ext, 0);
283  x_bulk[1] = ext_el_pt->interpolated_x(s_ext, 1);
284 
285  // Get own coordinates:
286  Vector<double> x(Dim);
287  this->interpolated_x(s, x);
288 
289 #ifdef PARANOID
291  {
292  double error = sqrt((x[0] - x_bulk[0]) * (x[0] - x_bulk[0]) +
293  (x[1] - x_bulk[1]) * (x[1] - x_bulk[1]));
294  double tol = 1.0e-10;
295  if (error > tol)
296  {
297  std::stringstream junk;
298  junk << "Gap between external and face element coordinate\n"
299  << "is suspiciously large: " << error
300  << "\nBulk/external at: " << x_bulk[0] << " " << x_bulk[1]
301  << "\n"
302  << "Face at: " << x[0] << " " << x[1] << "\n";
303  OomphLibWarning(
305  }
306  }
307 #endif
308 
309  // Get permeability from the bulk poroelasticity element
310  const double permeability = ext_el_pt->permeability();
311  const double local_permeability_ratio = ext_el_pt->permeability_ratio();
312 
313  // Local coordinate in bulk element
314  Vector<double> s_bulk(Dim);
315  s_bulk = local_coordinate_in_bulk(s);
316 
317  // Get the fluid traction from the NSt bulk element
318  Vector<double> traction_nst(3);
319  dynamic_cast<FLUID_BULK_ELEMENT*>(bulk_element_pt())
320  ->traction(s_bulk, interpolated_normal, traction_nst);
321 
322  // Get fluid velocity from bulk element
323  Vector<double> fluid_veloc(Dim + 1, 0.0);
324  dynamic_cast<FLUID_BULK_ELEMENT*>(bulk_element_pt())
325  ->interpolated_u_axi_nst(s_bulk, fluid_veloc);
326 
327  // Get fluid pressure from bulk element
328  double p_fluid = dynamic_cast<FLUID_BULK_ELEMENT*>(bulk_element_pt())
329  ->interpolated_p_axi_nst(s_bulk);
330 
331  // Calculate the normal components
332  double scaled_normal_wall_veloc = 0.0;
333  double scaled_normal_poro_veloc = 0.0;
334  double scaled_tangential_wall_veloc = 0.0;
335  double scaled_tangential_poro_veloc = 0.0;
336  double normal_nst_veloc = 0.0;
337  for (unsigned i = 0; i < Dim; i++)
338  {
339  scaled_normal_wall_veloc +=
340  local_st * du_dt[i] * interpolated_normal[i];
341 
342  scaled_normal_poro_veloc +=
343  local_st * permeability * q[i] * interpolated_normal[i];
344 
345  scaled_tangential_wall_veloc +=
346  local_st * du_dt[i] * interpolated_tangent[i];
347 
348  scaled_tangential_poro_veloc +=
349  -traction_nst[i] * sqrt(local_permeability_ratio) *
350  local_inverse_slip_rate_coeff * interpolated_tangent[i];
351 
352  normal_nst_veloc += fluid_veloc[i] * interpolated_normal[i];
353  }
354 
355  // Calculate the combined poroelasticity "velocity" (RHS of BJS BC).
356  double total_poro_normal_component =
357  scaled_normal_wall_veloc + scaled_normal_poro_veloc;
358  double total_poro_tangential_component =
359  scaled_tangential_wall_veloc + scaled_tangential_poro_veloc;
360  Vector<double> poro_veloc(2, 0.0);
361  for (unsigned i = 0; i < Dim; i++)
362  {
363  poro_veloc[i] +=
364  total_poro_normal_component * interpolated_normal[i] +
365  total_poro_tangential_component * interpolated_tangent[i];
366  }
367 
368 
369  // Call the derivatives of the shape function at the knot point
370  this->dshape_local_at_knot(ipt, psi, dpsids);
371 
372  // Get tangent vector
373  Vector<double> interpolated_t1(2, 0.0);
374  for (unsigned l = 0; l < n_node; l++)
375  {
376  // Loop over directional components
377  for (unsigned i = 0; i < 2; i++)
378  {
379  interpolated_t1[i] += this->nodal_position(l, i) * dpsids(l, 0);
380  }
381  }
382 
383  // Set the Jacobian of the line element
384  double J = sqrt(1.0 + (interpolated_t1[0] * interpolated_t1[0]) /
385  (interpolated_t1[1] * interpolated_t1[1])) *
386  x[0];
387 
388 
389  // Default geometry; evaluate everything in deformed (Nst) config.
390  double lagrangian_eulerian_translation_factor = 1.0;
391 
392  // Get pointer to associated face element to get geometric information
393  // from (if set up)
394  FSILinearisedAxisymPoroelasticTractionElement<
395  POROELASTICITY_BULK_ELEMENT,
396  FLUID_BULK_ELEMENT>* ext_face_el_pt =
397  dynamic_cast<FSILinearisedAxisymPoroelasticTractionElement<
398  POROELASTICITY_BULK_ELEMENT,
399  FLUID_BULK_ELEMENT>*>(external_element_pt(1, ipt));
400 
401  // Update geometry
402  if (ext_face_el_pt != 0)
403  {
404  Vector<double> s_ext_face(external_element_local_coord(1, ipt));
405 
406  // Get correction factor for geometry
407  lagrangian_eulerian_translation_factor =
408  ext_face_el_pt->lagrangian_eulerian_translation_factor(s_ext_face);
409  }
410 
411 
412  // Output
413  outfile << x_bulk[0] << " " // column 1
414  << x_bulk[1] << " " // column 2
415  << fluid_veloc[0] << " " // column 3
416  << fluid_veloc[1] << " " // column 4
417  << poro_veloc[0] << " " // column 5
418  << poro_veloc[1] << " " // column 6
419  << normal_nst_veloc * interpolated_normal[0] << " " // column 7
420  << normal_nst_veloc * interpolated_normal[1] << " " // column 8
421  << total_poro_normal_component * interpolated_normal[0]
422  << " " // column 9
423  << total_poro_normal_component * interpolated_normal[1]
424  << " " // column 10
425  << scaled_normal_wall_veloc * interpolated_normal[0]
426  << " " // column 11
427  << scaled_normal_wall_veloc * interpolated_normal[1]
428  << " " // column 12
429  << scaled_normal_poro_veloc * interpolated_normal[0]
430  << " " // column 13
431  << scaled_normal_poro_veloc * interpolated_normal[1]
432  << " " // column 14
433  << p_fluid << " " // column 15
434  << du_dt[0] << " " // column 16
435  << du_dt[1] << " " // column 17
436  << J << " " // column 18
437  << lagrangian_eulerian_translation_factor << " " // column 19
438  << std::endl;
439  }
440  }
virtual std::string tecplot_zone_string(const unsigned &nplot) const
Definition: elements.h:3161

References oomph::AxisymmetricPoroelasticityTractionElementHelper::Allow_gap_in_FSI, oomph::FaceElement::bulk_element_pt(), oomph::LinearisedAxisymPoroelasticBJS_FSIElement< FLUID_BULK_ELEMENT, POROELASTICITY_BULK_ELEMENT >::Dim, oomph::FiniteElement::dshape_local_at_knot(), calibrate::error, oomph::ElementWithExternalElement::external_element_local_coord(), oomph::ElementWithExternalElement::external_element_pt(), i, oomph::FiniteElement::integral_pt(), oomph::FaceElement::interpolated_x(), oomph::LinearisedAxisymPoroelasticBJS_FSIElement< FLUID_BULK_ELEMENT, POROELASTICITY_BULK_ELEMENT >::inverse_slip_rate_coefficient(), J, oomph::Integral::knot(), oomph::FaceElement::local_coordinate_in_bulk(), oomph::FiniteElement::nnode(), oomph::FiniteElement::nodal_position(), oomph::Integral::nweight(), OOMPH_CURRENT_FUNCTION, OOMPH_EXCEPTION_LOCATION, oomph::FaceElement::outer_unit_normal(), Eigen::numext::q, s, sqrt(), oomph::LinearisedAxisymPoroelasticBJS_FSIElement< FLUID_BULK_ELEMENT, POROELASTICITY_BULK_ELEMENT >::st(), oomph::FiniteElement::tecplot_zone_string(), and plotDoE::x.

◆ shape_and_test()

template<class FLUID_BULK_ELEMENT , class POROELASTICITY_BULK_ELEMENT >
double oomph::LinearisedAxisymPoroelasticBJS_FSIElement< FLUID_BULK_ELEMENT, POROELASTICITY_BULK_ELEMENT >::shape_and_test ( const Vector< double > &  s,
Shape psi,
Shape test 
) const
inlineprotected

Function to compute the shape and test functions and to return the Jacobian of mapping between local and global (Eulerian) coordinates

652  {
653  // Find number of nodes
654  unsigned n_node = nnode();
655 
656  // Get the shape functions
657  shape(s, psi);
658 
659  // Set the test functions to be the same as the shape functions
660  for (unsigned i = 0; i < n_node; i++)
661  {
662  test[i] = psi[i];
663  }
664 
665  // Return the value of the jacobian
666  return J_eulerian(s);
667  }
double J_eulerian(const Vector< double > &s) const
Definition: elements.cc:5242
virtual void shape(const Vector< double > &s, Shape &psi) const =0
Definition: indexed_view.cpp:20

References i, oomph::FaceElement::J_eulerian(), oomph::FiniteElement::nnode(), s, and oomph::FiniteElement::shape().

◆ shape_and_test_at_knot()

template<class FLUID_BULK_ELEMENT , class POROELASTICITY_BULK_ELEMENT >
double oomph::LinearisedAxisymPoroelasticBJS_FSIElement< FLUID_BULK_ELEMENT, POROELASTICITY_BULK_ELEMENT >::shape_and_test_at_knot ( const unsigned ipt,
Shape psi,
Shape test 
) const
inlineprotected

Function to compute the shape and test functions and to return the Jacobian of mapping between local and global (Eulerian) coordinates

676  {
677  // Find number of nodes
678  unsigned n_node = nnode();
679 
680  // Get the shape functions
681  shape_at_knot(ipt, psi);
682 
683  // Set the test functions to be the same as the shape functions
684  for (unsigned i = 0; i < n_node; i++)
685  {
686  test[i] = psi[i];
687  }
688 
689  // Return the value of the jacobian
690  return J_eulerian_at_knot(ipt);
691  }
double J_eulerian_at_knot(const unsigned &ipt) const
Definition: elements.cc:5328
virtual void shape_at_knot(const unsigned &ipt, Shape &psi) const
Definition: elements.cc:3220

References i, oomph::FaceElement::J_eulerian_at_knot(), oomph::FiniteElement::nnode(), and oomph::FiniteElement::shape_at_knot().

◆ st()

template<class FLUID_BULK_ELEMENT , class POROELASTICITY_BULK_ELEMENT >
double oomph::LinearisedAxisymPoroelasticBJS_FSIElement< FLUID_BULK_ELEMENT, POROELASTICITY_BULK_ELEMENT >::st ( ) const
inline

◆ st_pt()

template<class FLUID_BULK_ELEMENT , class POROELASTICITY_BULK_ELEMENT >
double*& oomph::LinearisedAxisymPoroelasticBJS_FSIElement< FLUID_BULK_ELEMENT, POROELASTICITY_BULK_ELEMENT >::st_pt ( )
inline

Access function for the pointer to the fluid Strouhal number (if not set, St defaults to 1)

96  {
97  return St_pt;
98  }

References oomph::LinearisedAxisymPoroelasticBJS_FSIElement< FLUID_BULK_ELEMENT, POROELASTICITY_BULK_ELEMENT >::St_pt.

Member Data Documentation

◆ Dim

◆ Id

template<class FLUID_BULK_ELEMENT , class POROELASTICITY_BULK_ELEMENT >
unsigned oomph::LinearisedAxisymPoroelasticBJS_FSIElement< FLUID_BULK_ELEMENT, POROELASTICITY_BULK_ELEMENT >::Id
private

◆ Inverse_slip_rate_coeff_pt

◆ St_pt

◆ U_index_axisym_poroelastic_fsi

template<class FLUID_BULK_ELEMENT , class POROELASTICITY_BULK_ELEMENT >
Vector<unsigned> oomph::LinearisedAxisymPoroelasticBJS_FSIElement< FLUID_BULK_ELEMENT, POROELASTICITY_BULK_ELEMENT >::U_index_axisym_poroelastic_fsi
private

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