29 #ifndef OOMPH_PSEUDO_SOLID_REMESH_ELEMENTS_HEADER
30 #define OOMPH_PSEUDO_SOLID_REMESH_ELEMENTS_HEADER
39 namespace PseudoSolidHelper
54 template<
class BASIC,
class SOLID>
82 BASIC::describe_local_dofs(out, current_string);
83 SOLID::describe_local_dofs(out, current_string);
90 BASIC::compute_norm(el_norm);
96 return BASIC::required_nvalue(n) + SOLID::required_nvalue(n);
106 if (SOLID::solid_p_nodal_index() >= 0)
108 throw OomphLibError(
"Cannot handle (non-refineable) continuous solid "
109 "pressure interpolation",
110 OOMPH_CURRENT_FUNCTION,
111 OOMPH_EXCEPTION_LOCATION);
114 return SOLID::solid_p_nodal_index();
122 BASIC::fill_in_contribution_to_residuals(residuals);
124 SOLID::fill_in_contribution_to_residuals(residuals);
133 BASIC::fill_in_contribution_to_jacobian(residuals, jacobian);
135 SOLID::fill_in_contribution_to_jacobian(residuals, jacobian);
149 BASIC::fill_in_contribution_to_jacobian_and_mass_matrix(
150 residuals, jacobian, mass_matrix);
152 SOLID::fill_in_contribution_to_jacobian_and_mass_matrix(
153 residuals, jacobian, mass_matrix);
186 const unsigned n_dof = this->ndof();
187 const unsigned n_node = this->nnode();
188 const unsigned nodal_dim = this->nodal_dimension();
191 if ((n_dof == 0) || (n_node == 0))
197 if (this->nnodal_position_type() != 1)
199 throw OomphLibError(
"Shape derivatives do not (yet) allow for "
200 "generalised position dofs\n",
201 OOMPH_CURRENT_FUNCTION,
202 OOMPH_EXCEPTION_LOCATION);
207 n_dof, nodal_dim, n_node, 0.0);
210 BASIC::get_dresidual_dnodal_coordinates(dresidual_dnodal_coordinates);
213 int local_unknown = 0;
218 for (
unsigned l = 0; l < n_dof; l++)
221 for (
unsigned n = 0; n < n_node; n++)
226 for (
unsigned i = 0;
i < nodal_dim;
i++)
229 local_unknown = this->position_local_eqn(n, k,
i);
232 if (local_unknown >= 0)
234 jacobian(l, local_unknown) +=
235 dresidual_dnodal_coordinates(l,
i, n);
252 const unsigned n_node = this->nnode();
262 this->update_before_solid_position_fd();
265 const unsigned n_position_type = this->nnodal_position_type();
266 const unsigned nodal_dim = this->nodal_dimension();
269 const unsigned n_dof = this->ndof();
280 for (
unsigned m = 0; m < n_dof; m++)
284 BASIC::fill_in_contribution_to_residuals(residuals);
290 std::vector<bool> dof_is_solid(n_dof,
false);
293 for (
unsigned n = 0; n < n_node; n++)
295 for (
unsigned k = 0; k < n_position_type; k++)
297 for (
unsigned i = 0;
i < nodal_dim;
i++)
299 int local_dof = this->position_local_eqn(n, k,
i);
302 dof_is_solid[local_dof] =
true;
310 unsigned n_solid_pres = this->npres_solid();
311 for (
unsigned l = 0; l < n_solid_pres; l++)
313 int local_dof = this->solid_p_local_eqn(l);
316 dof_is_solid[local_dof] =
true;
322 int local_unknown = 0;
325 const double fd_step = this->Default_fd_jacobian_step;
328 for (
unsigned n = 0; n < n_node; n++)
331 for (
unsigned k = 0; k < n_position_type; k++)
334 for (
unsigned i = 0;
i < nodal_dim;
i++)
337 local_unknown = this->position_local_eqn(n, k,
i);
338 if (local_unknown >= 0)
341 double*
const value_pt = &(this->node_pt(n)->x_gen(k,
i));
344 const double old_var = *value_pt;
347 *value_pt += fd_step;
350 this->node_pt(n)->perform_auxiliary_node_update_fct();
356 for (
unsigned m = 0; m < n_dof; m++)
360 BASIC::fill_in_contribution_to_residuals(newres);
365 for (
unsigned m = 0; m < n_dof; m++)
369 if (dof_is_solid[m] ==
false)
371 jacobian(m, local_unknown) =
372 (newres[m] - residuals[m]) / fd_step;
399 this->node_pt(n)->perform_auxiliary_node_update_fct();
407 this->reset_after_solid_position_fd();
418 const unsigned n_node = this->nnode();
419 for (
unsigned j = 0; j < n_node; j++)
421 geometric_data_pt.insert(
422 dynamic_cast<SolidNode*
>(this->node_pt(j))->variable_position_pt());
435 void output(std::ostream& outfile,
const unsigned& n_p)
447 void output(FILE* file_pt,
const unsigned& n_p)
456 return BASIC::num_Z2_flux_terms();
464 std::ostream& outfile,
469 BASIC::compute_exact_Z2_error(outfile, exact_flux_pt, error, norm);
476 BASIC::get_Z2_flux(
s, flux);
482 return BASIC::nvertex_node();
488 return BASIC::vertex_node_pt(j);
495 return BASIC::nrecovery_order();
503 return BASIC::ndof_types() + SOLID::ndof_types();
510 return BASIC::ndof_types();
517 return SOLID::ndof_types();
529 std::list<std::pair<unsigned long, unsigned>>& dof_lookup_list)
const
532 std::list<std::pair<unsigned long, unsigned>> solid_list;
533 SOLID::get_dof_numbers_for_unknowns(solid_list);
536 BASIC::get_dof_numbers_for_unknowns(dof_lookup_list);
543 typedef std::list<std::pair<unsigned long, unsigned>>::iterator IT;
544 for (IT it = solid_list.begin(); it != solid_list.end(); it++)
546 std::pair<unsigned long, unsigned> new_pair;
547 new_pair.first = it->first;
549 dof_lookup_list.push_front(new_pair);
555 template<
class BASIC,
class SOLID>
566 template<
class BASIC,
class SOLID>
582 template<
class BASIC,
class SOLID>
606 BASIC::describe_local_dofs(out, current_string);
607 SOLID::describe_local_dofs(out, current_string);
613 return BASIC::required_nvalue(n) + SOLID::required_nvalue(n);
620 return BASIC::ncont_interpolated_values() +
621 SOLID::ncont_interpolated_values();
630 int solid_p_index = SOLID::solid_p_nodal_index();
633 if (solid_p_index >= 0)
635 return BASIC::ncont_interpolated_values() +
636 SOLID::solid_p_nodal_index();
640 return solid_p_index;
649 BASIC::fill_in_contribution_to_residuals(residuals);
651 SOLID::fill_in_contribution_to_residuals(residuals);
660 BASIC::fill_in_contribution_to_jacobian(residuals, jacobian);
663 SOLID::fill_in_contribution_to_jacobian(residuals, jacobian);
677 BASIC::fill_in_contribution_to_jacobian_and_mass_matrix(
678 residuals, jacobian, mass_matrix);
680 SOLID::fill_in_contribution_to_jacobian_and_mass_matrix(
681 residuals, jacobian, mass_matrix);
694 const unsigned n_node = this->nnode();
704 this->update_before_solid_position_fd();
709 const unsigned n_position_type = this->nnodal_position_type();
710 const unsigned nodal_dim = this->nodal_dimension();
713 const unsigned n_dof = this->ndof();
724 for (
unsigned m = 0; m < n_dof; m++)
728 BASIC::fill_in_contribution_to_residuals(residuals);
734 std::vector<bool> dof_is_solid(n_dof,
false);
739 for (
unsigned n = 0; n < n_node; n++)
742 Node*
const local_node_pt = this->node_pt(n);
747 for (
unsigned k = 0; k < n_position_type; k++)
749 for (
unsigned i = 0;
i < nodal_dim;
i++)
751 int local_dof = this->position_local_eqn(n, k,
i);
754 dof_is_solid[local_dof] =
true;
765 const unsigned n_master = hang_info_pt->
nmaster();
766 for (
unsigned m = 0; m < n_master; m++)
773 for (
unsigned k = 0; k < n_position_type; k++)
776 for (
unsigned i = 0;
i < nodal_dim;
i++)
778 int local_dof = Position_local_eqn_at_node(k,
i);
781 dof_is_solid[local_dof] =
true;
791 unsigned n_solid_pres = this->npres_solid();
795 std::vector<bool> solid_p_is_hanging(n_solid_pres);
797 if (solid_p_index >= 0)
800 for (
unsigned l = 0; l < n_solid_pres; l++)
802 solid_p_is_hanging[l] =
803 this->solid_pressure_node_pt(l)->is_hanging(solid_p_index);
809 for (
unsigned l = 0; l < n_solid_pres; l++)
811 solid_p_is_hanging[l] =
false;
817 for (
unsigned l = 0; l < n_solid_pres; l++)
821 if (solid_p_is_hanging[l] ==
false)
823 int local_dof = this->solid_p_local_eqn(l);
826 dof_is_solid[local_dof] =
true;
835 this->solid_pressure_node_pt(l)->hanging_pt(solid_p_index);
837 const unsigned n_master = hang_info_pt->
nmaster();
838 for (
unsigned m = 0; m < n_master; m++)
841 int local_dof = this->local_hang_eqn(
846 dof_is_solid[local_dof] =
true;
854 const double fd_step = this->Default_fd_jacobian_step;
857 int local_unknown = 0;
860 for (
unsigned l = 0; l < n_node; l++)
863 Node*
const local_node_pt = this->node_pt(l);
869 for (
unsigned k = 0; k < n_position_type; k++)
872 for (
unsigned i = 0;
i < nodal_dim;
i++)
874 local_unknown = this->position_local_eqn(l, k,
i);
876 if (local_unknown >= 0)
879 double*
const value_pt = &(local_node_pt->
x_gen(k,
i));
883 const double old_var = *value_pt;
886 *value_pt += fd_step;
895 for (
unsigned m = 0; m < n_dof; m++)
899 BASIC::fill_in_contribution_to_residuals(newres);
905 for (
unsigned m = 0; m < n_dof; m++)
909 if (dof_is_solid[m] ==
false)
911 jacobian(m, local_unknown) =
912 (newres[m] - residuals[m]) / fd_step;
950 const unsigned n_master = hang_info_pt->
nmaster();
951 for (
unsigned m = 0; m < n_master; m++)
958 this->local_position_hang_eqn(master_node_pt);
961 for (
unsigned k = 0; k < n_position_type; k++)
964 for (
unsigned i = 0;
i < nodal_dim;
i++)
966 local_unknown = Position_local_eqn_at_node(k,
i);
968 if (local_unknown >= 0)
972 double*
const value_pt = &(master_node_pt->
x_gen(k,
i));
976 const double old_var = *value_pt;
979 *value_pt += fd_step;
988 for (
unsigned m = 0; m < n_dof; m++)
992 BASIC::fill_in_contribution_to_residuals(newres);
997 for (
unsigned m = 0; m < n_dof; m++)
1001 if (dof_is_solid[m] ==
false)
1003 jacobian(m, local_unknown) =
1004 (newres[m] - residuals[m]) / fd_step;
1031 *value_pt = old_var;
1046 this->reset_after_solid_position_fd();
1057 const unsigned n_node = this->nnode();
1058 for (
unsigned j = 0; j < n_node; j++)
1061 if (this->node_pt(j)->is_hanging())
1064 HangInfo* hang_info_pt = this->node_pt(j)->hanging_pt();
1067 unsigned n_master = hang_info_pt->
nmaster();
1070 for (
unsigned m = 0; m < n_master; m++)
1076 geometric_data_pt.insert(
1077 dynamic_cast<SolidNode*
>(Master_node_pt)->variable_position_pt());
1084 geometric_data_pt.insert(
1085 dynamic_cast<SolidNode*
>(this->node_pt(j))->variable_position_pt());
1095 BASIC::assign_additional_local_eqn_numbers();
1096 SOLID::assign_additional_local_eqn_numbers();
1102 BASIC::rebuild_from_sons(mesh_pt);
1103 SOLID::rebuild_from_sons(mesh_pt);
1113 BASIC::get_interpolated_values(
t,
s, basic_values);
1115 SOLID::get_interpolated_values(
t,
s, solid_values);
1119 it != basic_values.end();
1122 values.push_back(*it);
1126 it != solid_values.end();
1129 values.push_back(*it);
1140 BASIC::get_interpolated_values(
s, basic_values);
1142 SOLID::get_interpolated_values(
s, solid_values);
1146 it != basic_values.end();
1149 values.push_back(*it);
1153 it != solid_values.end();
1156 values.push_back(*it);
1165 int n_basic_values = BASIC::ncont_interpolated_values();
1167 if (value_id < n_basic_values)
1169 return BASIC::interpolating_node_pt(n, value_id);
1175 return SOLID::interpolating_node_pt(n, (value_id - n_basic_values));
1183 const int& value_id)
1186 int n_basic_values = BASIC::ncont_interpolated_values();
1188 if (value_id < n_basic_values)
1190 return BASIC::local_one_d_fraction_of_interpolating_node(
1197 return SOLID::local_one_d_fraction_of_interpolating_node(
1198 n1d,
i, (value_id - n_basic_values));
1208 const int& value_id)
1211 int n_basic_values = BASIC::ncont_interpolated_values();
1213 if (value_id < n_basic_values)
1215 return BASIC::get_interpolating_node_at_local_coordinate(
s, value_id);
1221 return SOLID::get_interpolating_node_at_local_coordinate(
1222 s, (value_id - n_basic_values));
1231 int n_basic_values = BASIC::ncont_interpolated_values();
1233 if (value_id < n_basic_values)
1235 return BASIC::ninterpolating_node_1d(value_id);
1241 return SOLID::ninterpolating_node_1d((value_id - n_basic_values));
1250 int n_basic_values = BASIC::ncont_interpolated_values();
1252 if (value_id < n_basic_values)
1254 return BASIC::ninterpolating_node(value_id);
1260 return SOLID::ninterpolating_node((value_id - n_basic_values));
1268 const int& value_id)
const
1271 int n_basic_values = BASIC::ncont_interpolated_values();
1273 if (value_id < n_basic_values)
1275 return BASIC::interpolating_basis(
s, psi, value_id);
1281 return SOLID::interpolating_basis(
s, psi, (value_id - n_basic_values));
1290 return BASIC::num_Z2_flux_terms();
1297 BASIC::get_Z2_flux(
s, flux);
1305 BASIC::further_setup_hanging_nodes();
1306 SOLID::further_setup_hanging_nodes();
1314 bool& was_already_built,
1315 std::ofstream& new_nodes_file)
1317 SOLID::build(mesh_pt, new_node_pt, was_already_built, new_nodes_file);
1325 bool& was_already_built)
1327 SOLID::build(mesh_pt, new_node_pt, was_already_built);
1334 BASIC::further_build();
1335 SOLID::further_build();
1342 return BASIC::nvertex_node();
1348 return BASIC::vertex_node_pt(j);
1354 BASIC::compute_norm(norm);
1361 std::ostream& outfile,
1366 BASIC::compute_exact_Z2_error(outfile, exact_flux_pt, error, norm);
1373 return BASIC::nrecovery_order();
1383 void output(std::ostream& outfile,
const unsigned& n_p)
1395 void output(FILE* file_pt,
const unsigned& n_p)
1404 return BASIC::ndof_types() + SOLID::ndof_types();
1411 return BASIC::ndof_types();
1418 return SOLID::ndof_types();
1430 std::list<std::pair<unsigned long, unsigned>>& dof_lookup_list)
const
1433 std::list<std::pair<unsigned long, unsigned>> solid_list;
1434 SOLID::get_dof_numbers_for_unknowns(solid_list);
1437 BASIC::get_dof_numbers_for_unknowns(dof_lookup_list);
1444 typedef std::list<std::pair<unsigned long, unsigned>>::iterator IT;
1445 for (IT it = solid_list.begin(); it != solid_list.end(); it++)
1447 std::pair<unsigned long, unsigned> new_pair;
1448 new_pair.first = it->first;
1450 dof_lookup_list.push_front(new_pair);
1457 template<
class BASIC,
class SOLID>
1470 template<
class BASIC,
class SOLID>
FaceGeometry()
Constuctor calls the constructor of the SolidQElement (Only the Intel compiler seems to need this!...
FaceGeometry()
Constuctor calls the constructor of the SolidQElement (Only the Intel compiler seems to need this!...
FaceGeometry()
Constuctor calls the constructor of the SolidQElement (Only the Intel compiler seems to need this!...
FaceGeometry()
Constructor calls the constructor of the SolidQElement (Only the Intel compiler seems to need this!...
//////////////////////////////////////////////////////////////////// ////////////////////////////////...
void(* SteadyExactSolutionFctPt)(const Vector< double > &, Vector< double > &)
Function pointer for function that computes vector-valued steady "exact solution" as .
Class that contains data for hanging nodes.
Node *const & master_node_pt(const unsigned &i) const
Return a pointer to the i-th master node.
unsigned nmaster() const
Return the number of master nodes.
Nodes are derived from Data, but, in addition, have a definite (Eulerian) position in a space of a gi...
double & x_gen(const unsigned &k, const unsigned &i)
Reference to the generalised position x(k,i). ‘Type’: k; Coordinate direction: i.
HangInfo *const & hanging_pt() const
Return pointer to hanging node data (this refers to the geometric hanging node status) (const version...
void perform_auxiliary_node_update_fct()
Execute auxiliary update function (if any) – this can be used to update any nodal values following th...
bool is_hanging() const
Test whether the node is geometrically hanging.
An OomphLibError object which should be thrown when an run-time error is encountered....
A templated class that permits combination two different element types, for the solution of problems ...
bool Shape_derivs_by_direct_fd
Boolean flag to indicate shape derivative method.
void fill_in_contribution_to_residuals(Vector< double > &residuals)
Final override for the residuals function. Contributions are added from both underlying element types...
void describe_local_dofs(std::ostream &out, const std::string ¤t_string) const
Function to describe the local dofs of the element. The ostream specifies the output stream to which ...
void compute_exact_Z2_error(std::ostream &outfile, FiniteElement::SteadyExactSolutionFctPt exact_flux_pt, double &error, double &norm)
Plot the error when compared against a given exact flux. Also calculates the norm of the error and th...
unsigned required_nvalue(const unsigned &n) const
The required number of values is the sum of the two.
unsigned nsolid_dof_types() const
return the number of DOF types associated with the SOLID elements in this combined element
void fill_in_shape_derivatives(DenseMatrix< double > &jacobian)
Fill in the shape derivatives of the BASIC equations w.r.t. the solid position dofs.
void output(std::ostream &outfile, const unsigned &n_p)
Output function: Plot at n_p plot points using the basic element's output function.
void output(std::ostream &outfile)
Overload the output function: Call that of the basic element.
void compute_norm(double &el_norm)
Compute norm of solution: use the version in the BASIC class if there's any ambiguity.
unsigned nrecovery_order()
Order of recovery shape functions for Z2 error estimation: Done for BASIC element since it determines...
void get_Z2_flux(const Vector< double > &s, Vector< double > &flux)
'Flux' vector for Z2 error estimation: Error estimation is based on error in BASIC element
void fill_in_contribution_to_jacobian(Vector< double > &residuals, DenseMatrix< double > &jacobian)
Final override for jacobian function: Contributions are included from both the underlying element typ...
Node * vertex_node_pt(const unsigned &j) const
Pointer to the j-th vertex node in the element.
void fill_in_shape_derivatives_by_fd(DenseMatrix< double > &jacobian)
Fill in the derivatives of the BASIC equations w.r.t. the solid position dofs.
unsigned nbasic_dof_types() const
return the number of DOF types associated with the BASIC elements in this combined element
unsigned nvertex_node() const
Number of vertex nodes in the element.
void evaluate_shape_derivs_by_chain_rule()
Evaluate shape derivatives by chain rule.
void fill_in_contribution_to_jacobian_and_mass_matrix(Vector< double > &residuals, DenseMatrix< double > &jacobian, DenseMatrix< double > &mass_matrix)
Final override for mass matrix function: contributions are included from both the underlying element ...
void output(FILE *file_pt, const unsigned &n_p)
Output function is just the same as the basic equations.
void evaluate_shape_derivs_by_direct_fd()
Evaluate shape derivatives by direct finite differencing.
int solid_p_nodal_index() const
We assume that the solid stuff is stored at the end of the nodes, i.e. its index is the number of con...
unsigned num_Z2_flux_terms()
Number of 'flux' terms for Z2 error estimation: Error estimation is based on error in BASIC element.
void output(FILE *file_pt)
Overload the output function: Call that of the basic element.
void identify_geometric_data(std::set< Data * > &geometric_data_pt)
Specify Data that affects the geometry of the element by adding the position Data to the set that's p...
void get_dof_numbers_for_unknowns(std::list< std::pair< unsigned long, unsigned >> &dof_lookup_list) const
Create a list of pairs for all unknowns in this element, so that the first entry in each pair contain...
unsigned ndof_types() const
The number of "DOF types" that degrees of freedom in this element are sub-divided into.
PseudoSolidNodeUpdateElement()
Constructor, call the BASIC and SOLID elements' constructors and set the "density" parameter for soli...
////////////////////////////////////////////////////////////////// //////////////////////////////////...
RefineableElements are FiniteElements that may be subdivided into children to provide a better local ...
Refineable version of the PseudoSolidNodeUpdateELement.
unsigned nbasic_dof_types() const
return the number of DOF types associated with the BASIC elements in this combined element
void get_interpolated_values(const Vector< double > &s, Vector< double > &values)
Call get_interpolated_values(...) for both of the underlying element types.
unsigned ndof_types() const
The number of "DOF types" that degrees of freedom in this element are sub-divided into.
void get_interpolated_values(const unsigned &t, const Vector< double > &s, Vector< double > &values)
Call get_interpolated_values(...) for both of the underlying element types.
Node * get_interpolating_node_at_local_coordinate(const Vector< double > &s, const int &value_id)
The velocity nodes are the same as the geometric nodes. The pressure nodes must be calculated by usin...
void further_build()
Further build: Done for both of the underlying element types.
Node * interpolating_node_pt(const unsigned &n, const int &value_id)
We must compose the underlying interpolating nodes from the BASIC and SOLID equations,...
void output(FILE *file_pt)
Overload the output function: Use that of the BASIC element.
void compute_norm(double &norm)
Compute norm of solution. Use version in BASIC element.
unsigned nvertex_node() const
Number of vertex nodes in the element.
void fill_in_contribution_to_residuals(Vector< double > &residuals)
Final override for residuals function: adds contributions from both underlying element types.
unsigned nrecovery_order()
Order of recovery shape functions for Z2 error estimation: Done for BASIC element since it determines...
void output(std::ostream &outfile, const unsigned &n_p)
Output function, plotting at n_p points: Use that of the BASIC element.
unsigned ncont_interpolated_values() const
The number of continuously interpolated values is the sum of the SOLID and BASIC values.
int solid_p_nodal_index() const
We assume that the solid stuff is stored at the end of the nodes, i.e. its index is the number of con...
unsigned nsolid_dof_types() const
return the number of DOF types associated with the SOLID elements in this combined element
void interpolating_basis(const Vector< double > &s, Shape &psi, const int &value_id) const
The basis interpolating the pressure is given by pshape(). / The basis interpolating the velocity is ...
void compute_exact_Z2_error(std::ostream &outfile, FiniteElement::SteadyExactSolutionFctPt exact_flux_pt, double &error, double &norm)
Plot the error when compared against a given exact flux. Also calculates the norm of the error and th...
void fill_in_contribution_to_jacobian(Vector< double > &residuals, DenseMatrix< double > &jacobian)
Final override for jacobian function: Calls get_jacobian() for both of the underlying element types.
unsigned num_Z2_flux_terms()
Number of 'flux' terms for Z2 error estimation: Error estimation is based on error in BASIC element.
void get_dof_numbers_for_unknowns(std::list< std::pair< unsigned long, unsigned >> &dof_lookup_list) const
Create a list of pairs for all unknowns in this element, so that the first entry in each pair contain...
RefineablePseudoSolidNodeUpdateElement()
Constructor, call the BASIC and SOLID elements' constructors and set the "density" parameter for soli...
void build(Mesh *&mesh_pt, Vector< Node * > &new_node_pt, bool &was_already_built)
Build function: Call the one for the SOLID element since it calls the one basic build function automa...
unsigned ninterpolating_node_1d(const int &value_id)
The number of 1d pressure nodes is 2, otherwise we have the positional nodes.
void fill_in_contribution_to_jacobian_and_mass_matrix(Vector< double > &residuals, DenseMatrix< double > &jacobian, DenseMatrix< double > &mass_matrix)
Final override for mass matrix function: contributions are included from both the underlying element ...
void further_setup_hanging_nodes()
Perform additional hanging node procedures for variables that are not interpolated by all nodes....
void output(std::ostream &outfile)
Overload the output function: Use that of the BASIC element.
double local_one_d_fraction_of_interpolating_node(const unsigned &n1d, const unsigned &i, const int &value_id)
The pressure nodes are the corner nodes, so when value_id==0, the fraction is the same as the 1d node...
void output(FILE *file_pt, const unsigned &n_p)
Output function: Use that of the BASIC element.
void build(Mesh *&mesh_pt, Vector< Node * > &new_node_pt, bool &was_already_built, std::ofstream &new_nodes_file)
Build function: Call the one for the SOLID element since it calls the one basic build function automa...
void assign_additional_local_eqn_numbers()
Final override for the assign__additional_local_eqn_numbers(): Call the version for the BASIC element...
unsigned ninterpolating_node(const int &value_id)
The number of pressure nodes is 2^DIM. The number of velocity nodes is the same as the number of geom...
Node * vertex_node_pt(const unsigned &j) const
Pointer to the j-th vertex node in the element.
void rebuild_from_sons(Mesh *&mesh_pt)
Call rebuild_from_sons() for both of the underlying element types.
void fill_in_shape_derivatives_by_fd(DenseMatrix< double > &jacobian)
Fill in the derivatives of the BASIC equations w.r.t. to the solid position dofs, taking hanging node...
void get_Z2_flux(const Vector< double > &s, Vector< double > &flux)
'Flux' vector for Z2 error estimation: Error estimation is based on error in BASIC element
void describe_local_dofs(std::ostream &out, const std::string ¤t_string) const
Function to describe the local dofs of the element. The ostream specifies the output stream to which ...
unsigned required_nvalue(const unsigned &n) const
The required number of values is the sum of the two.
void identify_geometric_data(std::set< Data * > &geometric_data_pt)
Specify Data that affects the geometry of the element by adding the position Data to the set that's p...
A Class for shape functions. In simple cases, the shape functions have only one index that can be tho...
A Class for nodes that deform elastically (i.e. position is an unknown in the problem)....
void output()
Doc the command line arguments.
std::string string(const unsigned &i)
Return the i-th string or "" if the relevant string hasn't been defined.
double Zero
Static variable to hold the default value for the pseudo-solid's inertia parameter Lambda^2.
//////////////////////////////////////////////////////////////////// ////////////////////////////////...