29 #ifndef OOMPH_SPECIFIC_NODE_UPDATE_INTERFACE_ELEMENTS_HEADER
30 #define OOMPH_SPECIFIC_NODE_UPDATE_INTERFACE_ELEMENTS_HEADER
34 #include <oomph-lib-config.h>
38 #include "../generic/Qelements.h"
39 #include "../generic/spines.h"
40 #include "../generic/hijacked_elements.h"
53 template<
class ELEMENT>
70 template<
class ELEMENT>
79 <<
"The generic FluidInterfaceAdditionalValues<ELEMENT> class has "
81 <<
"called. This should never happen. If you are creating your own\n"
82 <<
"surface equations you must overload the policy class to specify\n"
83 <<
"how many additional values are required at the surface nodes.\n"
84 <<
"For an example, see "
85 "src/fluid_interface/surfactant_transport_elements.h\n"
151 template<
class EQUATION_CLASS,
class DERIVATIVE_CLASS,
class ELEMENT>
153 :
public virtual Hijacked<SpineElement<FaceGeometry<ELEMENT>>>,
172 it != bulk_node_number.end();
189 DShape& surface_divergence)
191 return DERIVATIVE_CLASS::compute_surface_derivatives(psi,
204 const int& face_index,
205 const unsigned&
id = 0)
222 throw OomphLibError(
"This interface element will not work correctly "
223 "if nodes are hanging\n",
232 ELEMENT* cast_element_pt =
dynamic_cast<ELEMENT*
>(element_pt);
234 const unsigned n_u_index = cast_element_pt->n_u_nst();
235 this->U_index_interface.resize(n_u_index);
236 for (
unsigned i = 0;
i < n_u_index;
i++)
238 this->U_index_interface[
i] = cast_element_pt->u_index_nst(
i);
242 unsigned n_node_face = this->
nnode();
246 interface_additional_values_pt =
251 bool add_values =
false;
255 for (
unsigned i = 0;
i < n_node_face; ++
i)
258 additional_data_values[
i] =
261 add_values |= additional_data_values[
i];
268 this->add_additional_values(additional_data_values,
id);
274 delete interface_additional_values_pt;
275 interface_additional_values_pt = 0;
283 EQUATION_CLASS::fill_in_generic_residual_contribution_interface(
284 residuals, jacobian, 1);
296 const unsigned& flag,
300 const DShape& dpsifdS_div,
307 EQUATION_CLASS::add_additional_residual_contributions_interface(
329 void output(std::ostream& outfile,
const unsigned& n_plot)
341 void output(FILE* file_pt,
const unsigned& n_plot)
353 const int& face_index)
369 face_el_pt->u_index_interface_boundary() = this->U_index_interface;
378 const unsigned n_node_bounding = face_el_pt->nnode();
379 for (
unsigned n = 0;
n < n_node_bounding;
n++)
381 face_el_pt->nbulk_value(
n) = face_el_pt->node_pt(
n)->nvalue();
386 std::set<Data*> unique_additional_geom_data;
392 std::set<Data*> unique_face_geom_data_pt;
393 face_el_pt->assemble_set_of_all_geometric_data(unique_face_geom_data_pt);
396 for (std::set<Data*>::iterator it = unique_face_geom_data_pt.begin();
397 it != unique_face_geom_data_pt.end();
400 unique_additional_geom_data.erase(*it);
404 for (std::set<Data*>::iterator it = unique_additional_geom_data.begin();
405 it != unique_additional_geom_data.end();
408 face_el_pt->add_external_data(*it);
420 template<
class ELEMENT>
422 :
public Hijacked<SpineElement<FaceGeometry<FaceGeometry<ELEMENT>>>>,
441 void output(std::ostream& outfile,
const unsigned& n_plot)
453 void output(FILE* file_pt,
const unsigned& n_plot)
464 residuals, jacobian, 1);
484 template<
class ELEMENT>
486 :
public Hijacked<SpineElement<FaceGeometry<FaceGeometry<ELEMENT>>>>,
505 void output(std::ostream& outfile,
const unsigned& n_plot)
517 void output(FILE* file_pt,
const unsigned& n_plot)
529 residuals, jacobian, 1);
551 template<
class ELEMENT>
569 template<
class ELEMENT>
587 template<
class ELEMENT>
590 AxisymmetricDerivatives,
605 template<
class ELEMENT>
623 template<
class ELEMENT>
640 template<
class ELEMENT>
671 template<
class EQUATION_CLASS,
class DERIVATIVE_CLASS,
class ELEMENT>
673 :
public virtual Hijacked<FaceGeometry<ELEMENT>>,
687 return this->Lagrange_index[
n];
705 it != bulk_node_number.end();
722 DShape& surface_divergence)
724 return DERIVATIVE_CLASS::compute_surface_derivatives(psi,
740 const int& face_index,
741 const unsigned&
id = 0)
755 if (this->has_hanging_nodes())
758 "This flux element will not work correctly if nodes are hanging\n",
767 ELEMENT* cast_element_pt =
dynamic_cast<ELEMENT*
>(element_pt);
768 const unsigned n_u_index = cast_element_pt->n_u_nst();
769 this->U_index_interface.resize(n_u_index);
770 for (
unsigned i = 0;
i < n_u_index;
i++)
772 this->U_index_interface[
i] = cast_element_pt->u_index_nst(
i);
776 unsigned n_node_face = this->nnode();
781 interface_additional_values_pt =
788 for (
unsigned n = 0;
n < n_node_face;
n++)
791 additional_data_values[
n] =
798 this->add_additional_values(additional_data_values,
id);
803 for (
unsigned n = 0;
n < n_node_face; ++
n)
806 additional_data_values[
n] - 1 +
808 ->index_of_first_value_assigned_by_face_element(
id);
815 delete interface_additional_values_pt;
816 interface_additional_values_pt = 0;
824 const unsigned&
i)
const
841 EQUATION_CLASS::fill_in_generic_residual_contribution_interface(
842 residuals, jacobian, 1);
845 this->fill_in_jacobian_from_solid_position_by_fd(jacobian);
855 void output(std::ostream& outfile,
const unsigned& n_plot)
867 void output(FILE* file_pt,
const unsigned& n_plot)
880 const unsigned& flag,
884 const DShape& dpsifdS_div,
891 EQUATION_CLASS::add_additional_residual_contributions_interface(
906 const unsigned n_node = this->nnode();
908 const unsigned nodal_dimension = this->nodal_dimension();
910 double interpolated_lagrange = 0.0;
911 for (
unsigned l = 0; l < n_node; l++)
914 interpolated_lagrange +=
lagrange(l) * psif(l);
917 int local_eqn = 0, local_unknown = 0;
920 for (
unsigned l = 0; l < n_node; l++)
923 for (
unsigned i = 0;
i < nodal_dimension;
i++)
927 local_eqn = this->position_local_eqn(l, 0,
i);
931 residuals[local_eqn] -=
932 interpolated_lagrange * interpolated_n[
i] * psif(l) *
J *
W;
938 for (
unsigned l2 = 0; l2 < n_node; l2++)
943 if (local_unknown >= 0)
945 jacobian(local_eqn, local_unknown) -=
946 psif(l2) * interpolated_n[
i] * psif(l) *
J *
W;
961 const int& face_index)
973 this->build_face_element(face_index, face_el_pt);
976 face_el_pt->u_index_interface_boundary() = this->U_index_interface;
982 const unsigned n_node_bounding = face_el_pt->nnode();
985 for (
unsigned n = 0;
n < n_node_bounding;
n++)
987 face_el_pt->nbulk_value(
n) = face_el_pt->node_pt(
n)->nvalue();
990 local_lagrange_index[
n] =
991 this->Lagrange_index[face_el_pt->bulk_node_number(
n)];
995 face_el_pt->set_lagrange_index(local_lagrange_index);
998 std::set<SolidNode*> set_of_solid_nodes;
999 const unsigned n_node = this->nnode();
1000 for (
unsigned n = 0;
n < n_node;
n++)
1002 set_of_solid_nodes.insert(
static_cast<SolidNode*
>(this->node_pt(
n)));
1007 for (
unsigned n = 0;
n < n_node_bounding;
n++)
1010 face_el_pt->nbulk_value(
n) =
1011 this->nbulk_value(face_el_pt->bulk_node_number(
n));
1014 set_of_solid_nodes.erase(
1015 static_cast<SolidNode*
>(face_el_pt->node_pt(
n)));
1019 for (std::set<SolidNode*>::iterator it = set_of_solid_nodes.begin();
1020 it != set_of_solid_nodes.end();
1023 face_el_pt->add_external_data((*it)->variable_position_pt());
1036 template<
class ELEMENT>
1062 const unsigned&
i)
const
1082 void output(std::ostream& outfile,
const unsigned& n_plot)
1094 void output(FILE* file_pt,
const unsigned& n_plot)
1105 residuals, jacobian, 1);
1125 template<
class ELEMENT>
1155 const unsigned&
i)
const
1168 void output(std::ostream& outfile,
const unsigned& n_plot)
1180 void output(FILE* file_pt,
const unsigned& n_plot)
1191 residuals, jacobian, 1);
1215 template<
class ELEMENT>
1224 const unsigned&
id = 0)
1233 template<
class ELEMENT>
1252 template<
class ELEMENT>
1255 AxisymmetricDerivatives,
1261 const unsigned&
id = 0)
1271 template<
class ELEMENT>
1290 template<
class ELEMENT>
1299 const unsigned&
id = 0)
1309 template<
class ELEMENT>
int i
Definition: BiCGSTAB_step_by_step.cpp:9
const unsigned n
Definition: CG3DPackingUnitTest.cpp:11
JacobiRotation< float > J
Definition: Jacobi_makeJacobi.cpp:3
Definition: interface_elements.h:685
Definition: specific_node_update_interface_elements.h:55
Specialise the Elastic update case to axisymmetric equations.
Definition: specific_node_update_interface_elements.h:1257
ElasticAxisymmetricFluidInterfaceElement(FiniteElement *const &element_pt, const int &face_index, const unsigned &id=0)
Definition: specific_node_update_interface_elements.h:1259
Pseudo-elasticity version of the LineFluidInterfaceBoundingElement.
Definition: specific_node_update_interface_elements.h:1131
void output(FILE *file_pt)
Overload the C-style output function.
Definition: specific_node_update_interface_elements.h:1174
int kinematic_local_eqn(const unsigned &n)
Local eqn number of kinematic bc associated with local node n.
Definition: specific_node_update_interface_elements.h:1202
double zeta_nodal(const unsigned &n, const unsigned &k, const unsigned &i) const
Definition: specific_node_update_interface_elements.h:1153
void output(std::ostream &outfile)
Overload the output function.
Definition: specific_node_update_interface_elements.h:1162
void set_lagrange_index(const Vector< unsigned > &lagrange_index)
Set the Id.
Definition: specific_node_update_interface_elements.h:1137
void output(FILE *file_pt, const unsigned &n_plot)
C-style Output function.
Definition: specific_node_update_interface_elements.h:1180
void fill_in_contribution_to_jacobian(Vector< double > &residuals, DenseMatrix< double > &jacobian)
Calculate the elemental residual vector and Jacobian.
Definition: specific_node_update_interface_elements.h:1186
void output(std::ostream &outfile, const unsigned &n_plot)
Output the element.
Definition: specific_node_update_interface_elements.h:1168
Vector< unsigned > Lagrange_index
Short Storage for the index of Lagrange multiplier.
Definition: specific_node_update_interface_elements.h:1133
ElasticLineFluidInterfaceBoundingElement()
Constructor.
Definition: specific_node_update_interface_elements.h:1143
Specialise the elastic update template class to concrete 1D case.
Definition: specific_node_update_interface_elements.h:1220
ElasticLineFluidInterfaceElement(FiniteElement *const &element_pt, const int &face_index, const unsigned &id=0)
Definition: specific_node_update_interface_elements.h:1222
Pseudo-elasticity version of the PointFluidInterfaceBoundingElement.
Definition: specific_node_update_interface_elements.h:1042
ElasticPointFluidInterfaceBoundingElement()
Constructor.
Definition: specific_node_update_interface_elements.h:1069
void output(std::ostream &outfile, const unsigned &n_plot)
Output the element.
Definition: specific_node_update_interface_elements.h:1082
void output(std::ostream &outfile)
Overload the output function.
Definition: specific_node_update_interface_elements.h:1076
void output(FILE *file_pt, const unsigned &n_plot)
C-style Output function.
Definition: specific_node_update_interface_elements.h:1094
void output(FILE *file_pt)
Overload the C-style output function.
Definition: specific_node_update_interface_elements.h:1088
Vector< unsigned > Lagrange_index
Definition: specific_node_update_interface_elements.h:1046
void fill_in_contribution_to_jacobian(Vector< double > &residuals, DenseMatrix< double > &jacobian)
Calculate the element's residual vector and Jacobian.
Definition: specific_node_update_interface_elements.h:1100
void set_lagrange_index(const Vector< unsigned > &lagrange_index)
Set the Id and offset.
Definition: specific_node_update_interface_elements.h:1050
double zeta_nodal(const unsigned &n, const unsigned &k, const unsigned &i) const
Definition: specific_node_update_interface_elements.h:1060
int kinematic_local_eqn(const unsigned &n)
Set the kinematic local equation.
Definition: specific_node_update_interface_elements.h:1115
Specialise Elastic update case to the concrete 2D case.
Definition: specific_node_update_interface_elements.h:1295
ElasticSurfaceFluidInterfaceElement(FiniteElement *const &element_pt, const int &face_index, const unsigned &id=0)
Definition: specific_node_update_interface_elements.h:1297
Definition: specific_node_update_interface_elements.h:676
void output(FILE *file_pt, const unsigned &n_plot)
C-style Output function.
Definition: specific_node_update_interface_elements.h:867
void add_additional_residual_contributions_interface(Vector< double > &residuals, DenseMatrix< double > &jacobian, const unsigned &flag, const Shape &psif, const DShape &dpsifds, const DShape &dpsifdS, const DShape &dpsifdS_div, const Vector< double > &s, const Vector< double > &interpolated_x, const Vector< double > &interpolated_n, const double &W, const double &J)
Definition: specific_node_update_interface_elements.h:877
unsigned lagrange_index(const unsigned &n)
Definition: specific_node_update_interface_elements.h:685
double zeta_nodal(const unsigned &n, const unsigned &k, const unsigned &i) const
Definition: specific_node_update_interface_elements.h:822
void output(std::ostream &outfile)
Overload the output function.
Definition: specific_node_update_interface_elements.h:849
ElasticUpdateFluidInterfaceElement(FiniteElement *const &element_pt, const int &face_index, const unsigned &id=0)
Definition: specific_node_update_interface_elements.h:739
Vector< unsigned > Lagrange_index
Definition: specific_node_update_interface_elements.h:681
double & lagrange(const unsigned &n)
Return the lagrange multiplier at local node n.
Definition: specific_node_update_interface_elements.h:830
void output(FILE *file_pt)
Overload the C-style output function.
Definition: specific_node_update_interface_elements.h:861
virtual FluidInterfaceBoundingElement * make_bounding_element(const int &face_index)
Definition: specific_node_update_interface_elements.h:960
int kinematic_local_eqn(const unsigned &n)
Definition: specific_node_update_interface_elements.h:692
void output(std::ostream &outfile, const unsigned &n_plot)
Output the element.
Definition: specific_node_update_interface_elements.h:855
void fill_in_contribution_to_jacobian(Vector< double > &residuals, DenseMatrix< double > &jacobian)
Fill in contribution to residuals and Jacobian.
Definition: specific_node_update_interface_elements.h:837
void hijack_kinematic_conditions(const Vector< unsigned > &bulk_node_number)
Definition: specific_node_update_interface_elements.h:701
double compute_surface_derivatives(const Shape &psi, const DShape &dpsids, const DenseMatrix< double > &interpolated_t, const Vector< double > &interpolated_x, DShape &surface_gradient, DShape &surface_divergence)
Definition: specific_node_update_interface_elements.h:716
void assemble_set_of_all_geometric_data(std::set< Data * > &unique_geom_data_pt)
Return a set of all geometric data associated with the element.
Definition: element_with_moving_nodes.cc:43
void fill_in_jacobian_from_geometric_data(Vector< double > &residuals, DenseMatrix< double > &jacobian)
Definition: element_with_moving_nodes.cc:323
int & face_index()
Definition: elements.h:4626
double zeta_nodal(const unsigned &n, const unsigned &k, const unsigned &i) const
Definition: elements.h:4497
Definition: elements.h:4998
Definition: elements.h:1313
virtual void output(std::ostream &outfile)
Definition: elements.h:3050
virtual void build_face_element(const int &face_index, FaceElement *face_element_pt)
Definition: elements.cc:5132
virtual double interpolated_x(const Vector< double > &s, const unsigned &i) const
Return FE interpolated coordinate x[i] at local coordinate s.
Definition: elements.cc:3962
int nodal_local_eqn(const unsigned &n, const unsigned &i) const
Definition: elements.h:1432
unsigned nnode() const
Return the number of nodes.
Definition: elements.h:2210
bool has_hanging_nodes() const
Definition: elements.h:2470
Definition: specific_node_update_interface_elements.h:120
void setup_equation_indices(FluidInterfaceElement *const &element_pt, const unsigned &id)
Definition: specific_node_update_interface_elements.h:135
unsigned nadditional_values(const unsigned &n)
Definition: specific_node_update_interface_elements.h:127
Definition: specific_node_update_interface_elements.h:72
unsigned nadditional_values(const unsigned &n)
Definition: specific_node_update_interface_elements.h:97
void setup_equation_indices(ELEMENT *const &element_pt, const unsigned &id)
Definition: specific_node_update_interface_elements.h:106
void error_message()
Definition: specific_node_update_interface_elements.h:75
Definition: interface_elements.h:54
void output(std::ostream &outfile)
Overload the output function.
Definition: interface_elements.h:247
Definition: interface_elements.h:321
void fill_in_jacobian_from_external_by_fd(Vector< double > &residuals, DenseMatrix< double > &jacobian, const bool &fd_all_data=false)
Definition: elements.cc:1199
Definition: hijacked_elements.h:132
Data * hijack_nodal_spine_value(const unsigned &n, const unsigned &i, const bool &return_data=true)
Definition: hijacked_elements.h:279
Data * hijack_nodal_value(const unsigned &n, const unsigned &i, const bool &return_data=true)
Definition: hijacked_elements.h:214
Definition: interface_elements.h:661
Specialisation of the interface boundary constraint to a line.
Definition: interface_elements.h:297
void fill_in_generic_residual_contribution_interface_boundary(Vector< double > &residuals, DenseMatrix< double > &jacobian, unsigned flag)
Add contribution to element's residual vector and Jacobian.
Definition: interface_elements.cc:224
Definition: oomph_definitions.h:222
Specialisation of the interface boundary constraint to a point.
Definition: interface_elements.h:277
void fill_in_generic_residual_contribution_interface_boundary(Vector< double > &residuals, DenseMatrix< double > &jacobian, unsigned flag)
Add contribution to element's residual vector and Jacobian.
Definition: interface_elements.cc:86
Definition: refineable_elements.h:97
Definition: elements.h:3561
virtual void fill_in_jacobian_from_solid_position_by_fd(Vector< double > &residuals, DenseMatrix< double > &jacobian)
Definition: elements.cc:6985
Definition: specific_node_update_interface_elements.h:592
SpineAxisymmetricFluidInterfaceElement(FiniteElement *const &element_pt, const int &face_index)
Definition: specific_node_update_interface_elements.h:594
int spine_local_eqn(const unsigned &n)
Definition: spines.h:521
Spine version of the LineFluidInterfaceBoundingElement.
Definition: specific_node_update_interface_elements.h:489
int kinematic_local_eqn(const unsigned &n)
Local eqn number of the kinematic bc associated with local node n.
Definition: specific_node_update_interface_elements.h:539
SpineLineFluidInterfaceBoundingElement()
Constructor.
Definition: specific_node_update_interface_elements.h:492
void fill_in_contribution_to_jacobian(Vector< double > &residuals, DenseMatrix< double > &jacobian)
Calculate the jacobian.
Definition: specific_node_update_interface_elements.h:524
void output(std::ostream &outfile)
Overload the output function.
Definition: specific_node_update_interface_elements.h:499
void output(std::ostream &outfile, const unsigned &n_plot)
Output the element.
Definition: specific_node_update_interface_elements.h:505
void output(FILE *file_pt, const unsigned &n_plot)
C-style Output function.
Definition: specific_node_update_interface_elements.h:517
void output(FILE *file_pt)
Overload the C-style output function.
Definition: specific_node_update_interface_elements.h:511
Definition: specific_node_update_interface_elements.h:556
SpineLineFluidInterfaceElement(FiniteElement *const &element_pt, const int &face_index)
Definition: specific_node_update_interface_elements.h:558
Spine version of the PointFluidInterfaceBoundingElement.
Definition: specific_node_update_interface_elements.h:425
void output(std::ostream &outfile, const unsigned &n_plot)
Output the element.
Definition: specific_node_update_interface_elements.h:441
void output(FILE *file_pt)
Overload the C-style output function.
Definition: specific_node_update_interface_elements.h:447
SpinePointFluidInterfaceBoundingElement()
Constructor.
Definition: specific_node_update_interface_elements.h:428
void output(FILE *file_pt, const unsigned &n_plot)
C-style Output function.
Definition: specific_node_update_interface_elements.h:453
int kinematic_local_eqn(const unsigned &n)
Definition: specific_node_update_interface_elements.h:474
void output(std::ostream &outfile)
Overload the output function.
Definition: specific_node_update_interface_elements.h:435
void fill_in_contribution_to_jacobian(Vector< double > &residuals, DenseMatrix< double > &jacobian)
Calculate the elemental residual vector and the Jacobian.
Definition: specific_node_update_interface_elements.h:459
Definition: specific_node_update_interface_elements.h:628
SpineSurfaceFluidInterfaceElement(FiniteElement *const &element_pt, const int &face_index)
Definition: specific_node_update_interface_elements.h:630
Definition: specific_node_update_interface_elements.h:156
SpineUpdateFluidInterfaceElement(FiniteElement *const &element_pt, const int &face_index, const unsigned &id=0)
Definition: specific_node_update_interface_elements.h:203
void add_additional_residual_contributions_interface(Vector< double > &residuals, DenseMatrix< double > &jacobian, const unsigned &flag, const Shape &psif, const DShape &dpsifds, const DShape &dpsifdS, const DShape &dpsifdS_div, const Vector< double > &s, const Vector< double > &interpolated_x, const Vector< double > &interpolated_n, const double &W, const double &J)
Helper function to calculate the additional contributions These are those filled in by the particular...
Definition: specific_node_update_interface_elements.h:293
void output(std::ostream &outfile, const unsigned &n_plot)
Output the element.
Definition: specific_node_update_interface_elements.h:329
void fill_in_contribution_to_jacobian(Vector< double > &residuals, DenseMatrix< double > &jacobian)
Calculate the contribution to the residuals and the jacobian.
Definition: specific_node_update_interface_elements.h:279
double compute_surface_derivatives(const Shape &psi, const DShape &dpsids, const DenseMatrix< double > &interpolated_t, const Vector< double > &interpolated_x, DShape &surface_gradient, DShape &surface_divergence)
Definition: specific_node_update_interface_elements.h:183
virtual FluidInterfaceBoundingElement * make_bounding_element(const int &face_index)
Definition: specific_node_update_interface_elements.h:352
int kinematic_local_eqn(const unsigned &n)
Definition: specific_node_update_interface_elements.h:161
void output(FILE *file_pt)
Overload the C-style output function.
Definition: specific_node_update_interface_elements.h:335
void hijack_kinematic_conditions(const Vector< unsigned > &bulk_node_number)
Definition: specific_node_update_interface_elements.h:168
void output(std::ostream &outfile)
Overload the output function.
Definition: specific_node_update_interface_elements.h:323
void output(FILE *file_pt, const unsigned &n_plot)
C-style Output function.
Definition: specific_node_update_interface_elements.h:341
Definition: interface_elements.h:709
RealScalar s
Definition: level1_cplx_impl.h:130
char char char int int * k
Definition: level2_impl.h:374
@ W
Definition: quadtree.h:63
DRAIG: Change all instances of (SPATIAL_DIM) to (DIM-1).
Definition: AnisotropicHookean.h:10
#define OOMPH_EXCEPTION_LOCATION
Definition: oomph_definitions.h:61
#define OOMPH_CURRENT_FUNCTION
Definition: oomph_definitions.h:86
void output(std::ostream &outfile, const unsigned &nplot)
Overload output function.
Definition: overloaded_element_body.h:490