33 #ifndef OOMPH_PSEUDO_SOLID_REMESH_ELEMENTS_HEADER 34 #define OOMPH_PSEUDO_SOLID_REMESH_ELEMENTS_HEADER 45 namespace PseudoSolidHelper
61 template<
class BASIC,
class SOLID>
63 :
public virtual BASIC,
public virtual SOLID
74 Shape_derivs_by_direct_fd(true)
90 BASIC::describe_local_dofs(out,current_string);
91 SOLID::describe_local_dofs(out,current_string);
98 BASIC::compute_norm(el_norm);
103 {
return BASIC::required_nvalue(n) + SOLID::required_nvalue(n);}
112 if(SOLID::solid_p_nodal_index() >= 0)
115 "Cannot handle (non-refineable) continuous solid pressure interpolation",
116 OOMPH_CURRENT_FUNCTION,
117 OOMPH_EXCEPTION_LOCATION);
120 return SOLID::solid_p_nodal_index();
144 fill_in_shape_derivatives(jacobian);
155 residuals,jacobian,mass_matrix);
158 residuals,jacobian,mass_matrix);
161 fill_in_shape_derivatives(jacobian);
167 {Shape_derivs_by_direct_fd =
true;}
171 {Shape_derivs_by_direct_fd =
false;}
179 if(Shape_derivs_by_direct_fd)
181 this->fill_in_shape_derivatives_by_fd(jacobian);
187 const unsigned n_dof = this->ndof();
188 const unsigned n_node = this->nnode();
189 const unsigned nodal_dim = this->nodal_dimension();
192 if((n_dof==0) || (n_node==0)) {
return;}
195 if(this->nnodal_position_type()!=1)
198 "Shape derivatives do not (yet) allow for generalised position dofs\n",
199 OOMPH_CURRENT_FUNCTION,
200 OOMPH_EXCEPTION_LOCATION);
205 n_dof,nodal_dim,n_node,0.0);
208 BASIC::get_dresidual_dnodal_coordinates(dresidual_dnodal_coordinates);
216 for(
unsigned l=0;l<n_dof;l++)
219 for(
unsigned n=0;n<n_node;n++)
224 for(
unsigned i=0;
i<nodal_dim;
i++)
227 local_unknown = this->position_local_eqn(n,k,
i);
230 if(local_unknown >= 0)
232 jacobian(l,local_unknown) +=
233 dresidual_dnodal_coordinates(l,
i,n);
251 const unsigned n_node = this->nnode();
254 if(n_node == 0) {
return;}
258 this->update_before_solid_position_fd();
261 const unsigned n_position_type = this->nnodal_position_type();
262 const unsigned nodal_dim = this->nodal_dimension();
265 const unsigned n_dof = this->ndof();
276 for(
unsigned m=0;m<n_dof;m++) {residuals[m] = 0.0;}
283 std::vector<bool> dof_is_solid(n_dof,
false);
286 for(
unsigned n=0;n<n_node;n++)
288 for(
unsigned k=0;k<n_position_type;k++)
290 for(
unsigned i=0;
i<nodal_dim;
i++)
292 int local_dof = this->position_local_eqn(n,k,
i);
295 dof_is_solid[local_dof] =
true;
303 unsigned n_solid_pres = this->npres_solid();
304 for(
unsigned l=0;l<n_solid_pres;l++)
306 int local_dof = this->solid_p_local_eqn(l);
309 dof_is_solid[local_dof] =
true;
318 const double fd_step = this->Default_fd_jacobian_step;
321 for(
unsigned n=0;n<n_node;n++)
324 for(
unsigned k=0;k<n_position_type;k++)
327 for(
unsigned i=0;
i<nodal_dim;
i++)
330 local_unknown = this->position_local_eqn(n,k,
i);
331 if(local_unknown >= 0)
334 double*
const value_pt = &(this->node_pt(n)->x_gen(k,
i));
337 const double old_var = *value_pt;
340 *value_pt += fd_step;
343 this->node_pt(n)->perform_auxiliary_node_update_fct();
349 for(
unsigned m=0;m<n_dof;m++) {newres[m] = 0.0;}
355 for(
unsigned m=0;m<n_dof;m++)
359 if(dof_is_solid[m] ==
false)
361 jacobian(m,local_unknown) = (newres[m] - residuals[m])/fd_step;
387 this->node_pt(n)->perform_auxiliary_node_update_fct();
395 this->reset_after_solid_position_fd();
406 const unsigned n_node=this->nnode();
407 for(
unsigned j=0;j<n_node;j++)
409 geometric_data_pt.insert(dynamic_cast<SolidNode*>(this->node_pt(j))
410 ->variable_position_pt());
420 void output(std::ostream &outfile,
const unsigned &n_p)
427 void output(FILE* file_pt,
const unsigned &n_p)
439 std::ostream &outfile,
441 double& error,
double& norm)
443 BASIC::compute_exact_Z2_error(outfile, exact_flux_pt,
451 BASIC::get_Z2_flux(s,flux);
456 {
return BASIC::nvertex_node();}
460 {
return BASIC::vertex_node_pt(j);}
471 return BASIC::ndof_types() + SOLID::ndof_types();
478 return BASIC::ndof_types();
485 return SOLID::ndof_types();
497 std::list<std::pair<unsigned long,unsigned> >& dof_lookup_list)
const 500 std::list<std::pair<unsigned long,unsigned> > solid_list;
501 SOLID::get_dof_numbers_for_unknowns(solid_list);
504 BASIC::get_dof_numbers_for_unknowns(dof_lookup_list);
507 unsigned nbasic_dof_types = BASIC::ndof_types();
511 typedef std::list<std::pair<unsigned long,unsigned> >::iterator IT;
512 for (IT it=solid_list.begin();
513 it!=solid_list.end();it++)
515 std::pair<unsigned long,unsigned> new_pair;
516 new_pair.first = it->first;
517 new_pair.second = it->second + nbasic_dof_types;
518 dof_lookup_list.push_front(new_pair);
525 template<
class BASIC,
class SOLID>
538 template<
class BASIC,
class SOLID>
557 template<
class BASIC,
class SOLID>
584 BASIC::describe_local_dofs(out,current_string);
585 SOLID::describe_local_dofs(out,current_string);
590 {
return BASIC::required_nvalue(n) + SOLID::required_nvalue(n);}
595 {
return BASIC::ncont_interpolated_values() +
596 SOLID::ncont_interpolated_values();}
604 int solid_p_index = SOLID::solid_p_nodal_index();
607 if(solid_p_index >= 0)
608 {
return BASIC::ncont_interpolated_values() +
609 SOLID::solid_p_nodal_index();}
610 else {
return solid_p_index;}
635 fill_in_shape_derivatives_by_fd(jacobian);
646 residuals,jacobian,mass_matrix);
649 residuals,jacobian,mass_matrix);
652 fill_in_shape_derivatives_by_fd(jacobian);
663 const unsigned n_node = this->nnode();
666 if(n_node == 0) {
return;}
670 this->update_before_solid_position_fd();
675 const unsigned n_position_type = this->nnodal_position_type();
676 const unsigned nodal_dim = this->nodal_dimension();
679 const unsigned n_dof = this->ndof();
690 for(
unsigned m=0;m<n_dof;m++) {residuals[m] = 0.0;}
697 std::vector<bool> dof_is_solid(n_dof,
false);
702 for(
unsigned n=0;n<n_node;n++)
705 Node*
const local_node_pt = this->node_pt(n);
710 for(
unsigned k=0;k<n_position_type;k++)
712 for(
unsigned i=0;
i<nodal_dim;
i++)
714 int local_dof = this->position_local_eqn(n,k,
i);
717 dof_is_solid[local_dof] =
true;
728 const unsigned n_master = hang_info_pt->
nmaster();
729 for(
unsigned m=0;m<n_master;m++)
736 for(
unsigned k=0;k<n_position_type;k++)
739 for(
unsigned i=0;
i<nodal_dim;
i++)
741 int local_dof = Position_local_eqn_at_node(k,
i);
744 dof_is_solid[local_dof] =
true;
754 unsigned n_solid_pres = this->npres_solid();
756 const int solid_p_index = this->solid_p_nodal_index();
758 std::vector<bool> solid_p_is_hanging(n_solid_pres);
760 if(solid_p_index >= 0)
763 for(
unsigned l=0;l<n_solid_pres;l++)
765 solid_p_is_hanging[l] =
766 this->solid_pressure_node_pt(l)->is_hanging(solid_p_index);
772 for(
unsigned l=0;l<n_solid_pres;l++)
774 solid_p_is_hanging[l] =
false;
780 for(
unsigned l=0;l<n_solid_pres;l++)
784 if(solid_p_is_hanging[l] ==
false)
786 int local_dof = this->solid_p_local_eqn(l);
789 dof_is_solid[local_dof] =
true;
798 this->solid_pressure_node_pt(l)->hanging_pt(solid_p_index);
800 const unsigned n_master = hang_info_pt->
nmaster();
801 for(
unsigned m=0;m<n_master;m++)
804 int local_dof = this->local_hang_eqn(
809 dof_is_solid[local_dof] =
true;
817 const double fd_step = this->Default_fd_jacobian_step;
823 for(
unsigned l=0;l<n_node;l++)
826 Node*
const local_node_pt = this->node_pt(l);
832 for(
unsigned k=0;k<n_position_type;k++)
835 for(
unsigned i=0;
i<nodal_dim;
i++)
837 local_unknown = this->position_local_eqn(l,k,
i);
839 if(local_unknown >= 0)
842 double*
const value_pt = &(local_node_pt->
x_gen(k,
i));
845 const double old_var = *value_pt;
848 *value_pt += fd_step;
857 for(
unsigned m=0;m<n_dof;m++) {newres[m] = 0.0;}
864 for(
unsigned m=0;m<n_dof;m++)
868 if(dof_is_solid[m]==
false)
870 jacobian(m,local_unknown) =
871 (newres[m] - residuals[m])/fd_step;
909 const unsigned n_master = hang_info_pt->
nmaster();
910 for(
unsigned m=0;m<n_master;m++)
917 = this->local_position_hang_eqn(master_node_pt);
920 for(
unsigned k=0;k<n_position_type;k++)
923 for(
unsigned i=0;
i<nodal_dim;
i++)
925 local_unknown = Position_local_eqn_at_node(k,
i);
927 if(local_unknown >= 0)
930 double*
const value_pt = &(master_node_pt->
x_gen(k,
i));
934 const double old_var = *value_pt;
937 *value_pt += fd_step;
946 for(
unsigned m=0;m<n_dof;m++) {newres[m] = 0.0;}
952 for(
unsigned m=0;m<n_dof;m++)
956 if(dof_is_solid[m] ==
false)
958 jacobian(m,local_unknown) =
959 (newres[m] - residuals[m])/fd_step;
997 this->reset_after_solid_position_fd();
1008 const unsigned n_node=this->nnode();
1009 for(
unsigned j=0;j<n_node;j++)
1013 if(this->node_pt(j)->is_hanging())
1016 HangInfo* hang_info_pt = this->node_pt(j)->hanging_pt();
1019 unsigned n_master = hang_info_pt->
nmaster();
1022 for(
unsigned m=0;m<n_master;m++)
1028 geometric_data_pt.insert(
1029 dynamic_cast<SolidNode*>(Master_node_pt)->variable_position_pt());
1036 geometric_data_pt.insert(
1037 dynamic_cast<SolidNode*>(this->node_pt(j))->variable_position_pt());
1048 BASIC::assign_additional_local_eqn_numbers();
1049 SOLID::assign_additional_local_eqn_numbers();
1055 BASIC::rebuild_from_sons(mesh_pt);
1056 SOLID::rebuild_from_sons(mesh_pt);
1064 BASIC::get_interpolated_values(t,s,basic_values);
1066 SOLID::get_interpolated_values(t,s,solid_values);
1070 it!=basic_values.end();++it)
1072 values.push_back(*it);
1076 it!=solid_values.end();++it)
1078 values.push_back(*it);
1087 BASIC::get_interpolated_values(s,basic_values);
1089 SOLID::get_interpolated_values(s,solid_values);
1093 it!=basic_values.end();++it)
1095 values.push_back(*it);
1099 it!=solid_values.end();++it)
1101 values.push_back(*it);
1108 const int &value_id)
1111 int n_basic_values = BASIC::ncont_interpolated_values();
1113 if(value_id < n_basic_values)
1114 {
return BASIC::interpolating_node_pt(n,value_id);}
1118 {
return SOLID::interpolating_node_pt(n,(value_id-n_basic_values));}
1125 const int &value_id)
1128 int n_basic_values = BASIC::ncont_interpolated_values();
1130 if(value_id < n_basic_values)
1132 return BASIC::local_one_d_fraction_of_interpolating_node(n1d,i,value_id);
1139 SOLID::local_one_d_fraction_of_interpolating_node(
1140 n1d,i,(value_id-n_basic_values));
1150 const int &value_id)
1153 int n_basic_values = BASIC::ncont_interpolated_values();
1155 if(value_id < n_basic_values)
1157 return BASIC::get_interpolating_node_at_local_coordinate(s,value_id);
1164 SOLID::get_interpolating_node_at_local_coordinate(
1165 s,(value_id-n_basic_values));
1174 int n_basic_values = BASIC::ncont_interpolated_values();
1176 if(value_id < n_basic_values)
1178 return BASIC::ninterpolating_node_1d(value_id);
1184 return SOLID::ninterpolating_node_1d((value_id-n_basic_values));
1193 int n_basic_values = BASIC::ncont_interpolated_values();
1195 if(value_id < n_basic_values)
1197 return BASIC::ninterpolating_node(value_id);
1203 return SOLID::ninterpolating_node((value_id-n_basic_values));
1211 const int &value_id)
const 1214 int n_basic_values = BASIC::ncont_interpolated_values();
1216 if(value_id < n_basic_values)
1218 return BASIC::interpolating_basis(s,psi,value_id);
1224 return SOLID::interpolating_basis(s,psi,(value_id-n_basic_values));
1237 BASIC::get_Z2_flux(s,flux);
1245 BASIC::further_setup_hanging_nodes();
1246 SOLID::further_setup_hanging_nodes();
1253 bool& was_already_built,
1254 std::ofstream& new_nodes_file)
1256 SOLID::build(mesh_pt,new_node_pt,
1257 was_already_built,new_nodes_file);
1264 bool& was_already_built)
1266 SOLID::build(mesh_pt,new_node_pt,was_already_built);
1273 BASIC::further_build();
1274 SOLID::further_build();
1280 {
return BASIC::nvertex_node();}
1284 {
return BASIC::vertex_node_pt(j);}
1289 BASIC::compute_norm(norm);
1296 std::ostream &outfile,
1298 double& error,
double& norm)
1300 BASIC::compute_exact_Z2_error(outfile, exact_flux_pt,
1312 void output(std::ostream &outfile,
const unsigned &n_p)
1319 void output(FILE* file_pt,
const unsigned &n_p)
1326 return BASIC::ndof_types() + SOLID::ndof_types();
1333 return BASIC::ndof_types();
1340 return SOLID::ndof_types();
1352 std::list<std::pair<unsigned long,unsigned> >& dof_lookup_list)
const 1355 std::list<std::pair<unsigned long,unsigned> > solid_list;
1356 SOLID::get_dof_numbers_for_unknowns(solid_list);
1359 BASIC::get_dof_numbers_for_unknowns(dof_lookup_list);
1362 unsigned nbasic_dof_types = BASIC::ndof_types();
1366 typedef std::list<std::pair<unsigned long,unsigned> >::iterator IT;
1367 for (IT it=solid_list.begin();
1368 it!=solid_list.end();it++)
1370 std::pair<unsigned long,unsigned> new_pair;
1371 new_pair.first = it->first;
1372 new_pair.second = it->second + nbasic_dof_types;
1373 dof_lookup_list.push_front(new_pair);
1380 template<
class BASIC,
class SOLID>
1393 template<
class BASIC,
class SOLID>
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...
unsigned required_nvalue(const unsigned &n) const
The required number of values is the sum of the two.
FaceGeometry()
Constuctor calls the constructor of the SolidQElement (Only the Intel compiler seems to need this!) ...
unsigned nbasic_dof_types() const
return the number of DOF types associated with the BASIC elements in this combined element ...
void fill_in_contribution_to_residuals(Vector< double > &residuals)
Final override for residuals function: adds contributions from both underlying element types...
HangInfo *const & hanging_pt() const
Return pointer to hanging node data (this refers to the geometric hanging node status) (const version...
void output(FILE *file_pt, const unsigned &n_p)
Output function is just the same as the basic equations.
void output(FILE *file_pt)
Overload the output function: Use that of the BASIC element.
void fill_in_contribution_to_residuals(Vector< double > &residuals)
Final override for the residuals function. Contributions are added from both underlying element types...
void get_Z2_flux(const Vector< double > &s, Vector< double > &flux)
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...
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.
void perform_auxiliary_node_update_fct()
Execute auxiliary update function (if any) – this can be used to update any nodal values following t...
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(std::ostream &outfile, const unsigned &n_p)
Output function: Plot at n_p plot points using the basic element's output function.
void fill_in_contribution_to_jacobian_and_mass_matrix(Vector< double > &residuals, DenseMatrix< double > &jacobian, DenseMatrix< double > &mass_matrix)
unsigned nvertex_node() const
Number of vertex nodes in the element.
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...
void evaluate_shape_derivs_by_chain_rule()
Evaluate shape derivatives by chain rule.
Node * interpolating_node_pt(const unsigned &n, const int &value_id)
We must compose the underlying interpolating nodes from the BASIC and SOLID equations, the BASIC ones are first.
Nodes are derived from Data, but, in addition, have a definite (Eulerian) position in a space of a gi...
unsigned nmaster() const
Return the number of master nodes.
bool is_hanging() const
Test whether the node is geometrically hanging.
void assign_additional_local_eqn_numbers()
Final override for the assign__additional_local_eqn_numbers(): Call the version for the 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 ...
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 nrecovery_order()
Order of recovery shape functions for Z2 error estimation: Done for BASIC element since it determines...
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...
PseudoSolidNodeUpdateElement()
Constructor, call the BASIC and SOLID elements' constructors and set the "density" parameter for soli...
void get_interpolated_values(const Vector< double > &s, Vector< double > &values)
Call get_interpolated_values(...) for both of the underlying element types.
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 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.
unsigned nbasic_dof_types() const
return the number of DOF types associated with the BASIC elements in this combined element ...
void(* SteadyExactSolutionFctPt)(const Vector< double > &, Vector< double > &)
Function pointer for function that computes vector-valued steady "exact solution" as ...
double Zero
Static variable to hold the default value for the pseudo-solid's inertia parameter Lambda^2...
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 output(FILE *file_pt)
Overload the output function: Call that of the basic element.
void output(std::ostream &outfile)
Overload the output function: 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.
void fill_in_contribution_to_jacobian(Vector< double > &residuals, DenseMatrix< double > &jacobian)
Add the element's contribution to its residual vector and the element Jacobian matrix (wrapper) ...
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 ...
FaceGeometry()
Constuctor calls the constructor of the SolidQElement (Only the Intel compiler seems to need this!) ...
void output(std::ostream &outfile)
Overload the output function: Call that of the basic element.
void compute_norm(double &norm)
Compute norm of solution. Use version in BASIC element.
unsigned nsolid_dof_types() const
return the number of DOF types associated with the SOLID elements in this combined element ...
void rebuild_from_sons(Mesh *&mesh_pt)
Call rebuild_from_sons() for both of the underlying element types.
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.
unsigned ndof_types() const
The number of "DOF types" that degrees of freedom in this element are sub-divided into...
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...
unsigned ndof_types() const
The number of "DOF types" that degrees of freedom in this element are sub-divided into...
void output(FILE *file_pt, const unsigned &n_p)
Output function: Use that of the BASIC element.
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...
double & x_gen(const unsigned &k, const unsigned &i)
Reference to the generalised position x(k,i).
FaceGeometry()
Constructor calls the constructor of the SolidQElement (Only the Intel compiler seems to need this!) ...
void get_Z2_flux(const Vector< double > &s, Vector< double > &flux)
Node *const & master_node_pt(const unsigned &i) const
Return a pointer to the i-th master node.
void output(std::ostream &outfile)
Output with default number of plot points.
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...
unsigned num_Z2_flux_terms()
Number of 'flux' terms for Z2 error estimation: Error estimation is based on error in BASIC element...
Class that contains data for hanging nodes.
void fill_in_contribution_to_residuals(Vector< double > &residuals)
Add the element's contribution to its residual vector (wrapper)
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...
Refineable version of the PseudoSolidNodeUpdateELement.
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 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...
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...
FaceGeometry()
Constuctor calls the constructor of the SolidQElement (Only the Intel compiler seems to need this!) ...
unsigned nrecovery_order()
Order of recovery shape functions for Z2 error estimation: Done for BASIC element since it determines...
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...
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...
std::string string(const unsigned &i)
Return the i-th string or "" if the relevant string hasn't been defined.
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...
void output(std::ostream &outfile, const unsigned &n_p)
Output function, plotting at n_p points: Use that of the BASIC element.
Node * vertex_node_pt(const unsigned &j) const
Pointer to the j-th vertex node in the element.
RefineablePseudoSolidNodeUpdateElement()
Constructor, call the BASIC and SOLID elements' constructors and set the "density" parameter for soli...
unsigned num_Z2_flux_terms()
Number of 'flux' terms for Z2 error estimation: Error estimation is based on error in BASIC element...
unsigned nvertex_node() const
Number of vertex nodes in the element.
void compute_norm(double &el_norm)
Compute norm of solution: use the version in the BASIC class if there's any ambiguity.
void further_setup_hanging_nodes()
Perform additional hanging node procedures for variables that are not interpolated by all nodes...
void evaluate_shape_derivs_by_direct_fd()
Evaluate shape derivatives by direct finite differencing.
unsigned ninterpolating_node_1d(const int &value_id)
The number of 1d pressure nodes is 2, otherwise we have the positional nodes.
unsigned nsolid_dof_types() const
return the number of DOF types associated with the SOLID elements in this combined element ...
Node * vertex_node_pt(const unsigned &j) const
Pointer to the j-th vertex node in the element.
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 ...
bool Shape_derivs_by_direct_fd
Boolean flag to indicate shape derivative method.