34 #ifndef OOMPH_NODES_HEADER 35 #define OOMPH_NODES_HEADER 39 #include <oomph-lib-config.h> 66 class BoundaryNodeBase;
152 void range_check(
const unsigned &
t,
const unsigned &
i)
const;
215 Data(
const unsigned &initial_n_value);
225 const bool &allocate_storage=
true);
235 friend std::ostream&
operator<< (std::ostream &out,
const Data& d);
243 const bool &preserve_existing_data);
260 virtual bool is_a_copy(
const unsigned &
i)
const {
return false;}
269 #ifdef RANGE_CHECKING 272 Value[
i][0] = value_;
279 const double &value_)
281 #ifdef RANGE_CHECKING 284 Value[
i][
t] = value_;
293 #ifdef RANGE_CHECKING 303 double value(
const unsigned &
t,
const unsigned &
i)
const 305 #ifdef RANGE_CHECKING 324 #ifdef RANGE_CHECKING 335 double*
value_pt(
const unsigned &t,
const unsigned &
i)
const 337 #ifdef RANGE_CHECKING 350 void dump(std::ostream& dump_file)
const;
353 void read(std::ifstream& restart_file);
358 #ifdef RANGE_CHECKING 361 return &Eqn_number[
i];
367 #ifdef RANGE_CHECKING 370 return Eqn_number[
i];
376 #ifdef RANGE_CHECKING 379 return Eqn_number[
i];
391 const unsigned n_value =
Nvalue;
398 const unsigned n_value =
Nvalue;
404 {
return (Eqn_number[i]==Is_pinned);}
427 const unsigned n_value =
Nvalue;
434 const unsigned n_value =
Nvalue;
440 {
return (Eqn_number[i]==Is_constrained);}
471 virtual void resize(
const unsigned &n_value);
490 bool is_halo()
const {
return (Non_halo_proc_ID!=-1);}
518 const Vector<long> & vector_of_eqn_numbers,
unsigned &index);
568 if(Copied_data_pt) {Copied_data_pt->
remove_copy(
this);}
590 void resize(
const unsigned &n_value);
635 if(Copied_data_pt) {Copied_data_pt->
remove_copy(
this);}
657 void resize(
const unsigned &n_value);
689 HangInfo() : Master_nodes_pt(0), Master_weights(0), Nmaster(0)
697 HangInfo(
const unsigned &n_master) : Nmaster(n_master)
702 Master_nodes_pt =
new Node*[n_master];
703 Master_weights =
new double[n_master];
715 delete[] Master_nodes_pt; Master_nodes_pt=0;
716 delete[] Master_weights; Master_weights=0;
741 throw OomphLibError(
"Hanging node data hasn't been setup yet \n",
742 OOMPH_CURRENT_FUNCTION,
743 OOMPH_EXCEPTION_LOCATION);
746 #ifdef RANGE_CHECKING 749 return Master_nodes_pt[
i];
758 throw OomphLibError(
"Hanging node data hasn't been setup yet \n",
759 OOMPH_CURRENT_FUNCTION,
760 OOMPH_EXCEPTION_LOCATION);
763 #ifdef RANGE_CHECKING 766 return Master_weights[
i];
770 void set_master_node_pt(
const unsigned &
i,
Node*
const &master_node_pt,
771 const double &weight);
775 void add_master_node_pt(
Node*
const &master_node_pt,
const double &weight);
859 typedef void(*AuxNodeUpdateFctPt)(
Node*);
869 void x_gen_range_check(
const unsigned &
t,
const unsigned &k,
870 const unsigned &
i)
const;
930 Node(
const unsigned &n_dim,
const unsigned &n_position_type,
931 const unsigned &initial_n_value,
932 const bool &allocate_x_position=
true);
942 const unsigned &n_position_type,
const unsigned &initial_n_value,
943 const bool &allocate_x_position=
true);
962 friend std::ostream&
operator<< (std::ostream &out,
const Node& d);
973 {
return Position_time_stepper_pt;}
976 virtual void set_position_time_stepper(
TimeStepper*
977 const &position_time_stepper_pt,
978 const bool &preserve_existing_data);
984 double*
const ¶meter_pt) {
return false;}
992 unsigned ndim()
const {
return Ndim;}
995 double &
x(
const unsigned &
i)
997 #ifdef RANGE_CHECKING 998 x_gen_range_check(0,0,i);
1000 return X_position[Nposition_type*
i][0];
1004 const double &
x(
const unsigned &
i)
const 1006 #ifdef RANGE_CHECKING 1007 x_gen_range_check(0,0,i);
1009 return X_position[Nposition_type*
i][0];
1014 double &
x(
const unsigned &
t,
const unsigned &
i)
1016 #ifdef RANGE_CHECKING 1017 x_gen_range_check(t,0,i);
1019 return X_position[Nposition_type*
i][
t];
1024 const double &
x(
const unsigned &
t,
const unsigned &
i)
const 1026 #ifdef RANGE_CHECKING 1027 x_gen_range_check(t,0,i);
1029 return X_position[Nposition_type*
i][
t];
1033 double dx_dt(
const unsigned &
i)
const;
1037 double dx_dt(
const unsigned &j,
const unsigned &i)
const;
1055 double &
x_gen(
const unsigned &k,
const unsigned &i)
1057 #ifdef RANGE_CHECKING 1058 x_gen_range_check(0,k,i);
1060 return X_position[Nposition_type*i + k][0];
1065 const double &
x_gen(
const unsigned &k,
const unsigned &i)
1068 #ifdef RANGE_CHECKING 1069 x_gen_range_check(0,k,i);
1071 return X_position[Nposition_type*i + k][0];
1076 double &
x_gen(
const unsigned &
t,
const unsigned &k,
1079 #ifdef RANGE_CHECKING 1080 x_gen_range_check(t,k,i);
1082 return X_position[Nposition_type*i + k][
t];
1088 const double &
x_gen(
const unsigned &
t,
const unsigned &k,
1089 const unsigned &i)
const 1091 #ifdef RANGE_CHECKING 1092 x_gen_range_check(t,k,i);
1094 return X_position[Nposition_type*i + k][
t];
1099 double dx_gen_dt(
const unsigned &k,
const unsigned &i)
const;
1104 double dx_gen_dt(
const unsigned &j,
const unsigned &k,
1105 const unsigned &i)
const;
1109 double*
x_pt(
const unsigned &
t,
const unsigned &i)
1110 {
return &X_position[Nposition_type*
i][
t];}
1116 virtual void dump(std::ostream& dump_file)
const;
1119 void read(std::ifstream& restart_file);
1135 unsigned hang_code=0;
1137 for (
int i=-1;i<nval;i++)
1140 unsigned(std::pow(2.0,
double(i+1)));
1154 "Vector of pointers to hanging data is not setup yet\n",
1155 OOMPH_CURRENT_FUNCTION,
1156 OOMPH_EXCEPTION_LOCATION);
1159 return Hanging_pt[0];
1168 std::ostringstream error_message;
1170 <<
"Vector of pointers to hanging data is not setup yet\n" 1171 #ifdef OOMPH_HAS_MPI 1172 <<
"I'm on processor " <<
1175 <<
"Coordinates: \n";
1177 unsigned n_dim=ndim();
1178 for (
unsigned i=0;i<n_dim;i++)
1180 error_message << this->x(i) <<
" ";
1183 error_message.str(),
1184 OOMPH_CURRENT_FUNCTION,
1185 OOMPH_EXCEPTION_LOCATION);
1188 #ifdef RANGE_CHECKING 1192 const int n_value =
static_cast<int>(this->
nvalue());
1193 if((i < -1) || (i > n_value) )
1195 std::ostringstream error_message;
1196 error_message <<
"Range Error: Value " << i
1197 <<
" is not in the range (-1," << n_value <<
")";
1199 OOMPH_CURRENT_FUNCTION,
1200 OOMPH_EXCEPTION_LOCATION);
1203 return Hanging_pt[i+1];
1215 return (Hanging_pt[0]!=0);
1222 #ifdef RANGE_CHECKING 1225 const int n_value =
static_cast<int>(this->
nvalue());
1226 if((i < -1) || (i > n_value) )
1228 std::ostringstream error_message;
1229 error_message <<
"Range Error: Value " << i
1230 <<
" is not in the range (-1," << n_value <<
")";
1232 OOMPH_CURRENT_FUNCTION,
1233 OOMPH_EXCEPTION_LOCATION);
1238 if(i==-1) {
return is_hanging();}
1248 return (Hanging_pt[i+1]!=0);
1254 void set_hanging_pt(
HangInfo*
const &hang_pt,
const int &i);
1257 void set_nonhanging();
1260 void resize(
const unsigned &n_value);
1274 virtual void make_periodic(
Node*
const &node_pt);
1278 virtual void make_periodic_nodes(
const Vector<Node*> &periodic_nodes_pt);
1285 {boundaries_pt = 0;}
1299 virtual void add_to_boundary(
const unsigned &b);
1303 virtual void remove_from_boundary(
const unsigned &b);
1308 virtual unsigned ncoordinates_on_boundary(
const unsigned &b);
1312 virtual bool boundary_coordinates_have_been_set_up();
1317 virtual void get_coordinates_on_boundary(
const unsigned &b,
const unsigned& k,
1323 virtual void set_coordinates_on_boundary(
const unsigned &b,
const unsigned& k,
1331 get_coordinates_on_boundary(b,0,boundary_zeta);
1339 set_coordinates_on_boundary(b,0,boundary_zeta);
1375 double value(
const unsigned &i)
const;
1386 double value(
const unsigned &
t,
const unsigned &i)
const;
1437 double position(
const unsigned &i)
const;
1442 double position(
const unsigned &t,
const unsigned &i)
const;
1446 double position_gen(
const unsigned &k,
const unsigned &i)
const;
1451 double position_gen(
const unsigned &t,
const unsigned &k,
1452 const unsigned &i)
const;
1456 double dposition_dt(
const unsigned &i)
const;
1460 double dposition_dt(
const unsigned &j,
const unsigned &i)
const;
1465 double dposition_gen_dt(
const unsigned &k,
const unsigned &i)
const;
1471 double dposition_gen_dt(
const unsigned &j,
const unsigned &k,
1472 const unsigned &i)
const;
1483 update_all_time_levels_for_new_node=
false) { }
1491 aux_node_update_fct_pt)
1494 Aux_node_update_fct_pt=aux_node_update_fct_pt;
1503 return (Aux_node_update_fct_pt!=0);
1512 if (Aux_node_update_fct_pt!=0)
1514 Aux_node_update_fct_pt(
this);
1535 void output(std::ostream &outfile);
1538 #ifdef OOMPH_HAS_MPI 1575 void xi_gen_range_check(
const unsigned &k,
const unsigned &
i)
const;
1605 const unsigned &n_lagrangian_type,
1606 const unsigned &n_dim,
1607 const unsigned &n_position_type,
1608 const unsigned &initial_n_value);
1618 const unsigned &n_lagrangian,
1619 const unsigned &n_lagrangian_type,
1620 const unsigned &n_dim,
1621 const unsigned &Nposition_type,
1622 const unsigned &initial_n_value);
1645 void dump(std::ostream& dump_file)
const;
1649 void read(std::ifstream& restart_file);
1658 void set_external_variable_position_pt(
Data*
const &data_pt);
1664 const &position_time_stepper_pt,
1665 const bool &preserve_existing_data);
1669 bool does_pointer_correspond_to_position_data(
double*
const ¶meter_pt);
1676 {
return Variable_position_pt->
is_a_copy(Nposition_type*i);}
1681 const unsigned &i)
const 1682 {
return Variable_position_pt->
eqn_number(Nposition_type*i+k);}
1686 {
return Variable_position_pt->
is_pinned(Nposition_type*i);}
1691 {
return Variable_position_pt->
is_pinned(Nposition_type*i+k);}
1695 {
return Variable_position_pt->
pin(Nposition_type*i);}
1700 {
return Variable_position_pt->
pin(Nposition_type*i+k);}
1704 {
return Variable_position_pt->
unpin(Nposition_type*i);}
1709 {
return Variable_position_pt->
unpin(Nposition_type*i+k);}
1715 Variable_position_pt->
pin_all();
1741 double &
xi(
const unsigned &i)
1743 #ifdef RANGE_CHECKING 1744 xi_gen_range_check(0,i);
1746 return Xi_position[Nlagrangian_type*
i];
1750 const double &
xi(
const unsigned &i)
const 1752 #ifdef RANGE_CHECKING 1753 xi_gen_range_check(0,i);
1755 return Xi_position[Nlagrangian_type*
i];
1760 double &
xi_gen(
const unsigned &k,
const unsigned &i)
1762 #ifdef RANGE_CHECKING 1763 xi_gen_range_check(k,i);
1765 return Xi_position[Nlagrangian_type*i + k];
1770 const double &
xi_gen(
const unsigned &k,
const unsigned &i)
const 1772 #ifdef RANGE_CHECKING 1773 xi_gen_range_check(k,i);
1775 return Xi_position[Nlagrangian_type*i + k];
1780 double lagrangian_position(
const unsigned &i)
const;
1784 double lagrangian_position_gen(
const unsigned &k,
const unsigned &i)
1805 #ifdef OOMPH_HAS_MPI 1830 const Vector<long> & vector_of_eqn_numbers,
unsigned &index);
1839 void node_update(
const bool& update_all_time_levels_for_new_node=
false)
1841 perform_auxiliary_node_update_fct();
1888 void make_node_periodic(
Node*
const &node_pt,
1889 Node*
const &original_node_pt);
1895 void make_nodes_periodic(
Node*
const &node_pt,
1904 virtual void assign_additional_values_with_face_id(
1905 const unsigned &n_additional_value,
const unsigned &face_id=0)=0;
1909 std::map<unsigned, unsigned>*
1912 return Index_of_first_value_assigned_by_face_element_pt;
1926 const unsigned& face_id=0)
const 1929 if (Index_of_first_value_assigned_by_face_element_pt==0)
1931 std::ostringstream error_message;
1933 <<
"Index_of_first_value_assigned_by_face_element_pt==0;\n" 1934 <<
"Pointer must be set via call to: \n\n" 1935 <<
" BoundaryNode::assign_additional_values_with_face_id(...), \n\n" 1936 <<
"typically from FaceElement::add_additional_values(...).";
1938 OOMPH_CURRENT_FUNCTION,
1939 OOMPH_EXCEPTION_LOCATION);
1943 return (*Index_of_first_value_assigned_by_face_element_pt)[face_id];
1964 const bool& throw_if_no_value_assigned_by_face_element,
1965 const bool& throw_quietly,
1966 const unsigned& face_id=0)
const 1970 bool local_throw_if_no_value_assigned_by_face_element=
1971 throw_if_no_value_assigned_by_face_element;
1973 local_throw_if_no_value_assigned_by_face_element=
true;
1976 if (local_throw_if_no_value_assigned_by_face_element)
1978 if (Index_of_first_value_assigned_by_face_element_pt==0)
1980 std::ostringstream error_message;
1982 <<
"Index_of_first_value_assigned_by_face_element_pt==0;\n" 1983 <<
"Pointer must be set via call to: \n\n" 1984 <<
" BoundaryNode::assign_additional_values_with_face_id(...), \n\n" 1985 <<
"typically from FaceElement::add_additional_values(...).";
1994 error_message.str(),
1995 OOMPH_CURRENT_FUNCTION,
1996 OOMPH_EXCEPTION_LOCATION);
2001 return (*Index_of_first_value_assigned_by_face_element_pt)[face_id];
2014 virtual unsigned nvalue_assigned_by_face_element(
const unsigned& face_id=0)
2019 Boundary_coordinates_pt(0),
2021 Index_of_first_value_assigned_by_face_element_pt(0),
2038 return (Boundary_coordinates_pt!=0);
2044 {boundaries_pt = Boundaries_pt;}
2047 void add_to_boundary(
const unsigned &b);
2050 void remove_from_boundary(
const unsigned &b);
2056 bool is_on_boundary(
const unsigned &b)
const;
2059 unsigned ncoordinates_on_boundary(
const unsigned &b);
2066 get_coordinates_on_boundary(b,0,boundary_zeta);
2075 set_coordinates_on_boundary(b,0,boundary_zeta);
2080 void get_coordinates_on_boundary(
const unsigned &b,
const unsigned& k,
2085 void set_coordinates_on_boundary(
const unsigned &b,
const unsigned& k,
2100 template<
class NODE_TYPE>
2109 if(Copied_node_pt==0)
2112 OOMPH_CURRENT_FUNCTION,
2113 OOMPH_EXCEPTION_LOCATION);
2118 this->
Nvalue = Copied_node_pt->nvalue();
2119 this->
Value = Copied_node_pt->Value;
2120 this->
Eqn_number = Copied_node_pt->Eqn_number;
2129 if(cast_copied_node_pt)
2131 this->index_of_first_value_assigned_by_face_element_pt() =
2136 std::ostringstream error_stream;
2138 <<
"Copied_node_pt is not of type BoundaryNode*" 2141 OOMPH_CURRENT_FUNCTION,
2142 OOMPH_EXCEPTION_LOCATION);
2152 if(this->index_of_first_value_assigned_by_face_element_pt()!=0)
2155 this->index_of_first_value_assigned_by_face_element_pt() =
2156 new std::map<unsigned,unsigned>;
2165 if(cast_copied_node_pt)
2171 std::map<unsigned,unsigned>::const_iterator end =
2172 (*(cast_copied_node_pt->
2173 index_of_first_value_assigned_by_face_element_pt())).end();
2174 for(std::map<unsigned,unsigned>::const_iterator it =
2175 (*(cast_copied_node_pt->
2176 index_of_first_value_assigned_by_face_element_pt())).begin();
2180 index_of_first_value_assigned_by_face_element_pt()))[it->first] =
2196 if(Copied_node_pt==0)
2199 OOMPH_CURRENT_FUNCTION,
2200 OOMPH_EXCEPTION_LOCATION);
2210 const unsigned n_value = this->
nvalue();
2211 const unsigned n_tstorage = this->
ntstorage();
2217 this->
Value =
new double*[n_value];
2220 double *values =
new double[n_value*n_tstorage];
2223 for(
unsigned i=0;
i<n_value;++
i)
2226 this->
Value[
i] = &values[
i*n_tstorage];
2228 for(
unsigned t=0;
t<n_tstorage;++
t)
2229 {this->
Value[
i][
t] = Copied_node_pt->value(
t,
i);}
2251 const unsigned &initial_n_value) :
2264 const unsigned &n_position_type,
2265 const unsigned &initial_n_value) :
2266 NODE_TYPE(time_stepper_pt,n_dim,n_position_type,initial_n_value),
2278 const unsigned &n_lagrangian_type,
2279 const unsigned &n_dim,
2280 const unsigned &n_position_type,
2281 const unsigned &initial_n_value) :
2282 NODE_TYPE(n_lagrangian,n_lagrangian_type,n_dim,n_position_type,
2293 const unsigned &n_lagrangian,
2294 const unsigned &n_lagrangian_type,
2295 const unsigned &n_dim,
2296 const unsigned &n_position_type,
2297 const unsigned &initial_n_value)
2298 : NODE_TYPE(time_stepper_pt,n_lagrangian,n_lagrangian_type,n_dim,
2299 n_position_type,initial_n_value),
2328 "Copy of a BoundaryNode is not a BoundaryNode or HijackedData",
2329 "BoundaryNode::~BoundaryNode",
2330 OOMPH_EXCEPTION_LOCATION);
2341 Copied_node_pt->remove_copy(
this);
2437 if (Index_of_first_value_assigned_by_face_element_pt==0)
2439 std::ostringstream error_message;
2441 <<
"Index_of_first_value_assigned_by_face_element_pt==0;\n" 2442 <<
"Pointer must be set via call to: \n\n" 2443 <<
" BoundaryNode::assign_additional_values_with_face_id(), \n\n" 2444 <<
"typically from FaceElement::add_additional_values(...).";
2446 OOMPH_CURRENT_FUNCTION,
2447 OOMPH_EXCEPTION_LOCATION);
2453 unsigned nval=this->
nvalue();
2456 if(Index_of_first_value_assigned_by_face_element_pt->find(face_id)==
2457 Index_of_first_value_assigned_by_face_element_pt->end())
2466 else if ((*Index_of_first_value_assigned_by_face_element_pt).size()==1)
2469 (*Index_of_first_value_assigned_by_face_element_pt)[face_id];
2474 unsigned next_first_index=nval;
2475 unsigned my_first_index=
2476 (*Index_of_first_value_assigned_by_face_element_pt)[face_id];
2477 for (std::map<unsigned, unsigned>::iterator it=
2478 (*Index_of_first_value_assigned_by_face_element_pt).begin();
2479 it!=(*Index_of_first_value_assigned_by_face_element_pt).end();
2482 unsigned first_index=(*it).second;
2483 if ((first_index>my_first_index)&&(first_index<next_first_index))
2485 next_first_index=first_index;
2488 return next_first_index-my_first_index;
2501 const unsigned &n_additional_value,
const unsigned &face_id=0)
2505 if(n_additional_value == 0)
2507 std::ostringstream warn_message;
2509 <<
"No additional data values are being added to the boundary node " 2511 <<
"by face id " << face_id <<
".\n" 2512 <<
"This means that the function \n" 2513 <<
"BoundaryNode::index_of_first_value_assigned_by_face_element(id) \n" 2514 <<
"will return a value that is equal to the number of values stored at the Node.\n" 2515 <<
"Calling Node::value(...) with this index will lead to an out-of-range error.\n" 2516 <<
"The anticpated usage of a loop from the index over the number of values.\n" 2517 <<
"will not cause any problems, but if you try to do anything else, you may be surprised.\n" 2518 <<
"You have been warned!\n";
2520 OOMPH_CURRENT_FUNCTION,
2521 OOMPH_EXCEPTION_LOCATION);
2527 if(this->Index_of_first_value_assigned_by_face_element_pt==0)
2529 this->Index_of_first_value_assigned_by_face_element_pt =
2530 new std::map<unsigned, unsigned>;
2534 const unsigned n_value = this->
nvalue();
2537 if(this->Index_of_first_value_assigned_by_face_element_pt->find(face_id)
2538 ==this->Index_of_first_value_assigned_by_face_element_pt->end())
2541 (*Index_of_first_value_assigned_by_face_element_pt)[face_id] =
2548 const unsigned n_value_for_id =
2549 this->nvalue_assigned_by_face_element(face_id);
2553 if(n_value_for_id==n_additional_value)
2562 if(((*this->Index_of_first_value_assigned_by_face_element_pt)[face_id]
2563 + n_value_for_id) != n_value)
2566 std::ostringstream warn_message;
2568 <<
"Trying to (resize) number of unknowns associated with face id " << face_id <<
"\n" 2569 <<
"but previous storage for this data is not at the end of the nodal values.\n" 2570 <<
"The anticipated usage here is within constructors that add additional equations\n" 2571 <<
"to existing FaceElements in which case we will always be at the end.\n" 2572 <<
"If you are trying to do something else, then try using a different id.\n" 2573 <<
" FaceElement::add_additional_values(...)." 2574 <<
" For consistency with earlier versions, this will do nothing!\n";
2576 OOMPH_CURRENT_FUNCTION,
2577 OOMPH_EXCEPTION_LOCATION);
2586 this->
resize(n_value + n_additional_value);
2602 {
if(Copied_node_pt) {
return true;}
else{
return false;}}
2608 {
if(Copied_node_pt) {
return true;}
else{
return false;}}
2615 return Copied_node_pt;
2624 if(Copied_node_pt==0)
2625 {NODE_TYPE::assign_eqn_numbers(global_ndof,dof_pt);}
2650 unsigned n_value_new = Copied_node_pt->nvalue();
2652 if(n_value_new != n_value)
2654 std::ostringstream error_stream;
2656 <<
"Call to resize copied node before original has been resized!" 2659 OOMPH_CURRENT_FUNCTION,
2660 OOMPH_EXCEPTION_LOCATION);
2667 NODE_TYPE::resize(n_value);
double & x_gen(const unsigned &t, const unsigned &k, const unsigned &i)
Reference to the generalised position x(k,i) at the previous timestep [t=0: present]. `Type': k; Coordinate direction: i.
double * Xi_position
Storage for the Lagrangian positions.
double raw_value(const unsigned &i) const
Return the i-th value stored at the Node. This interface does NOT take the hanging status of the Node...
void add_to_boundary(const unsigned &b)
Add the node to mesh boundary b, final overload.
bool position_is_pinned(const unsigned &k, const unsigned &i)
Test whether the k-th type of the i-th coordinate is pinned 0: false; 1: true.
TimeStepper *const & time_stepper_pt() const
Return the pointer to the timestepper (const version).
Node(const Node &node)
Broken copy constructor.
void unpin(const unsigned &i)
Unpin the i-th stored variable.
double value(const unsigned &i) const
Return i-th stored value. This function is not virtual so that it can be inlined. This means that if ...
std::map< unsigned, DenseMatrix< double > * > * Boundary_coordinates_pt
Pointer to a map of pointers to intrinsic boundary coordinates of the Node, indexed by the boundary n...
double raw_value(const unsigned &t, const unsigned &i) const
Return the i-th value at time level t (t=0: present, t>0: previous). This interface does NOT take the...
void broken_copy(const std::string &class_name)
Issue error message and terminate execution.
bool Obsolete
Flag to indicate that the Node has become obsolete — usually during mesh refinement process...
TimeStepper *const & position_time_stepper_pt() const
Return a pointer to the position timestepper (const version).
void pin_all()
Pin all the stored variables.
TimeStepper * Time_stepper_pt
Pointer to a Timestepper. The inclusion of a Timestepper pointer in the Data class, ensures that time-derivatives can be calculated and storage can be managed at the low (Data) level.
void delete_value_storage()
Delete all storage allocated by the Data object for values and equation numbers.
~HijackedData()
Destructor informs original object that the copy is being deleted and clears its pointers to the stor...
const double & xi(const unsigned &i) const
Reference to i-th Lagrangian position (const version)
void remove_from_boundary(const unsigned &b)
Remove the node from the mesh boundary b.
bool is_on_boundary(const unsigned &b) const
Test whether the node lies on mesh boundary b Final overload.
void get_coordinates_on_boundary(const unsigned &b, Vector< double > &boundary_zeta)
Return the vector of coordinates on mesh boundary b Final overload.
bool does_pointer_correspond_to_value(double *const ¶meter_pt)
Check whether the pointer parameter_pt addresses internal data values.
void get_coordinates_on_boundary(const unsigned &b, const unsigned &k, Vector< double > &boundary_zeta)
Return the vector of k-th generalised boundary coordinates on mesh boundary b Final overload...
void constrain(const unsigned &i)
Constrain the i-th stored variable when making hanging data If the data is already pinned leave it al...
void operator=(const Data &)
Broken assignment operator.
virtual void unconstrain_positions()
Unconstrain the positions when the node is made non-hanging Empty virtual function that is overloaded...
void resize(const unsigned &n_value)
Resize the number of equations.
Data * Copied_data_pt
Pointer to the Data object from which the values are copied.
void unpin_position(const unsigned &i)
Unpin the nodal position.
bool is_on_boundary() const
Test whether the node lies on a boundary.
virtual Data ** all_geom_data_pt()
Return a pointer to an array of all (geometric) data that affect the nodal position. The default value is zero (node is stationary)
HangInfo *const & hanging_pt() const
Return pointer to hanging node data (this refers to the geometric hanging node status) (const version...
Vector< double > position() const
Return vector of position of node at current time.
long * eqn_number_pt(const unsigned &i)
Return the pointer to the equation number of the i-th stored variable.
void add_to_boundary(const unsigned &b)
Add the node to the mesh boundary b.
double * Master_weights
C-style array of weights for the dofs on the master nodes.
double * value_pt(const unsigned &i) const
Return the pointer to the i-the stored value. Typically this is required when direct access to the st...
bool is_on_boundary() const
Test whether the node lies on a boundary Final overload.
void make_periodic_nodes(const Vector< Node *> &periodic_nodes_pt)
Make the nodes passed in periodic_nodes periodic from this node.
unsigned Nvalue
Number of values stored in the data object.
~HangInfo()
Delete the storage.
void clear_copied_pointers()
Clear pointers to the copied data used when we have periodic nodes. The shallow (pointer) copy is tur...
int Non_halo_proc_ID
Non-halo processor ID for Data; -1 if it's not a halo.
void perform_auxiliary_node_update_fct()
Execute auxiliary update function (if any) – this can be used to update any nodal values following t...
double * value_pt(const unsigned &t, const unsigned &i) const
Return the pointer to the i-th stored value, or any of its history values (const version). Typically this is required when direct access to the stored value is required, e.g. when writing functions that return a reference to a variable that is stored in a Data object.
BoundaryNodeBase()
Default constructor, set the pointers to the storage to NULL.
void operator=(const SolidNode &)
Broken assignment operator.
virtual void constrain_positions()
Constrain the positions when the node is made hanging Empty virtual function that is overloaded in So...
void unpin_position(const unsigned &k, const unsigned &i)
Unpin the generalised nodal position. `Type': k; Coordinate direction: i.
void unpin_all()
Unpin all the stored variables.
virtual void add_value_pt_to_map(std::map< unsigned, double *> &map_of_value_pt)
Add pointers to all unpinned and unconstrained data to a map indexed by (global) equation number...
virtual unsigned ngeom_data() const
Return the number of geometric data that affect the nodal position. The default value is zero (node i...
Data * Variable_position_pt
Pointer to data that will hold variable positions in elastic nodes.
const double & x_gen(const unsigned &t, const unsigned &k, const unsigned &i) const
Reference to the generalised position x(k,i) at the previous timestep [t=0: present]. `Type': k; Coordinate direction: i. (const version)
BoundaryNode(const BoundaryNode< NODE_TYPE > &node)
Broken copy constructor.
static TimeStepper * Default_static_time_stepper_pt
Default (static) timestepper used in steady problems.
Node ** Master_nodes_pt
C-style array of pointers to nodes that this hanging node depends on.
void pin_position(const unsigned &k, const unsigned &i)
Pin the generalised nodal position. `Type': k; Coordinate direction: i.
TimeStepper *& position_time_stepper_pt()
Return a pointer to the position timestepper.
int non_halo_proc_ID()
ID of processor ID that holds non-halo counterpart of halo node; negative if not a halo...
void operator=(const CopiedData &)
Broken assignment operator.
double const & master_weight(const unsigned &i) const
Return weight for dofs on i-th master node.
bool is_hanging(const int &i) const
Test whether the i-th value is hanging.
Custom Data class that is used when HijackingData. The class always contains a single value that is c...
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.
static OomphCommunicator * communicator_pt()
access to the global oomph-lib communicator
unsigned self_test()
Self-test: Have all values been classified as pinned/unpinned? Return 0 if OK.
static long Is_constrained
Static "Magic number" used in place of the equation number to indicate that the value is constrained ...
void make_nodes_periodic(Node *const &node_pt, Vector< Node *> const &periodic_copies_pt)
Helper function that is used to turn BoundaryNodes into periodic boundary nodes by setting the data v...
const double & x(const unsigned &t, const unsigned &i) const
Return the position x(i) at previous timestep t (t=0: present; t>0 previous timestep) (const version)...
double value(const unsigned &t, const unsigned &i) const
Return i-th value at time level t (t=0: present, t>0: previous) This function is not virtual so that ...
BoundaryNode()
Default Constructor.
bool is_hanging() const
Test whether the node is geometrically hanging.
long & eqn_number(const unsigned &i)
Return the equation number of the i-th stored variable.
void get_boundaries_pt(std::set< unsigned > *&boundaries_pt)
Access to pointer to set of mesh boundaries that this node occupies; NULL if the node is not on any b...
unsigned nvalue() const
Return number of values stored in data object (incl pinned ones).
virtual void describe_dofs(std::ostream &out, const std::string ¤t_string) const
Function to describe the dofs of the Node. The ostream specifies the output stream to which the descr...
void clear_additional_copied_pointers()
Copy over additional information so that if the node is periodic it can remain active if the node tha...
unsigned ncoordinates_on_boundary(const unsigned &b)
Get the number of boundary coordinates on mesh boundary b.
bool is_a_copy(const unsigned &i) const
Return a boolean to indicate whether the i-th value is a copied value. If the node is periodic all va...
void get_boundaries_pt(std::set< unsigned > *&boundaries_pt)
Access to pointer to set of mesh boundaries that this node occupies; NULL if the node is not on any b...
AuxNodeUpdateFctPt Aux_node_update_fct_pt
Pointer to auxiliary update function – this can be used to update any nodal values following the upd...
~CopiedData()
Destructor informs original object that the copy is being deleted and clears its pointers to the stor...
void constrain_positions()
Overload the constrain positions function to constrain all position values.
void pin(const unsigned &i)
Pin the i-th stored variable.
virtual void pin_all()
The pin_all() function must be overloaded by SolidNodes, so we put the virtual interface here to avoi...
const double & xi_gen(const unsigned &k, const unsigned &i) const
Reference to the generalised Lagrangian position. `Type': k; 'Coordinate direction: i...
void constrain_all()
Constrain all the stored variables when the data is made hanging.
void set_value(const unsigned &t, const unsigned &i, const double &value_)
Set the t-th history value of the i-th stored data value to specified value.
void set_auxiliary_node_update_fct_pt(AuxNodeUpdateFctPt aux_node_update_fct_pt)
Set pointer to auxiliary update function – this can be used to update any nodal values following the...
CopiedData(const Data &data)
(Shallow) copy constructor
virtual GeomObject ** all_geom_object_pt()
Return a pointer to an array of all (geometric) objects that affect the nodal position. The default value is zero (node is stationary)
void set_obsolete()
Mark node as obsolete.
bool has_auxiliary_node_update_fct_pt()
Boolean to indicate if node has a pointer to and auxiliary update function.
Vector< double > value() const
Return vector of values calculated using value(vector).
virtual unsigned ngeom_object() const
Return the number of geometric objects that affect the nodal position. The default value is zero (nod...
unsigned ndim() const
Return (Eulerian) spatial dimension of the node.
long eqn_number(const unsigned &i) const
Return the equation number of the i-th stored variable.
void get_coordinates_on_boundary(const unsigned &b, Vector< double > &boundary_zeta)
Return the vector of boundary coordinates on mesh boundary b.
HangInfo *const & hanging_pt(const int &i) const
Return pointer to hanging node data for value i (const version)
~BoundaryNode()
Destructor resets pointers if.
unsigned index_of_first_value_assigned_by_face_element(const bool &throw_if_no_value_assigned_by_face_element, const bool &throw_quietly, const unsigned &face_id=0) const
Return the index of the first value associated with the i-th face element value. If no argument id is...
bool is_a_copy(const unsigned &i) const
Return a boolean to indicate whether the i-th value is a copied value. Hijacked data is always a copy...
unsigned Nlagrangian_type
Number of types of Lagrangian coordinates used to interpolate the Lagrangian coordinates within the e...
SolidNode(const SolidNode &solid_node)
Broken copy constructor.
virtual void get_boundaries_pt(std::set< unsigned > *&boundaries_pt)
Return a pointer to set of mesh boundaries that this node occupies; this will be overloaded by Bounda...
void pin_position(const unsigned &i)
Pin the nodal position.
double & x(const unsigned &t, const unsigned &i)
Return the position x(i) at previous timestep t (t=0: present; t>0 previous timestep).
double & x(const unsigned &i)
Return the i-th nodal coordinate.
double & xi(const unsigned &i)
Reference to i-th Lagrangian position.
HangInfo()
Default constructor, initialise vectors to have size zero.
A class that contains the information required by Nodes that are located on Mesh boundaries. A BoundaryNode of a particular type is obtained by combining a given Node with this class. By differentiating between Nodes and BoundaryNodes we avoid a lot of un-necessary storage in the bulk Nodes.
friend std::ostream & operator<<(std::ostream &out, const Data &d)
double & xi_gen(const unsigned &k, const unsigned &i)
Reference to the generalised Lagrangian position. `Type': k; 'Coordinate direction: i...
bool boundary_coordinates_have_been_set_up()
Have boundary coordinates been set up?
void set_coordinates_on_boundary(const unsigned &b, const Vector< double > &boundary_zeta)
Set the vector of boundary coordinates on mesh boundary b.
bool is_a_copy() const
Return a boolean to indicate whether the data contains any copied values. If the node is periodic all...
void set_nonhalo()
Label the node as not being a halo.
virtual void add_values_to_vector(Vector< double > &vector_of_values)
Add all data and time history values to the vector in the internal storage order. ...
unsigned Nposition_type
Number of coordinate types used in the mapping between local and global coordinates (e...
BoundaryNode(TimeStepper *const &time_stepper_pt, const unsigned &n_lagrangian, const unsigned &n_lagrangian_type, const unsigned &n_dim, const unsigned &n_position_type, const unsigned &initial_n_value)
Unsteady constructor for Solid-type boundary nodes Allocates storage for initial_n_value nodal values...
bool is_segregated_solve_pinned(const unsigned &i)
Test whether the i-th variable is temporaily pinned for a segregated solve.
unsigned Ncopies
Number of Data that contain copies of this Data object's values.
void assign_additional_values_with_face_id(const unsigned &n_additional_value, const unsigned &face_id=0)
void node_update(const bool &update_all_time_levels_for_new_node=false)
Overload node update function: Since the position of SolidNodes is determined by unknowns, there's nothing to be done apart from performing the auxiliary node update function (if any)
static long Is_pinned
Static "Magic number" used in place of the equation number to indicate that the value is pinned...
double ** Value
C-style array of pointers to data values and possible history values. The data must be ordered in suc...
A template Class for BoundaryNodes; that is Nodes that MAY live on the boundary of a Mesh...
void add_copy(Data *const &data_pt)
Add the pointer data_pt to the array Copy_of_data_pt. This should be used whenever copies are made of...
long * Eqn_number
C-style array of pointers to the (global) equation numbers of the values.
void set_coordinates_on_boundary(const unsigned &b, const Vector< double > &boundary_zeta)
Set the vector of coordinates on mesh boundary b Final overload.
void copy(Data *orig_data_pt)
Copy Data values from specified Data object.
double * x_pt(const unsigned &t, const unsigned &i)
Direct access to the i-th coordinate at time level t.
void set_value(const unsigned &i, const double &value_)
Set the i-th stored data value to specified value. The only reason that we require an explicit set fu...
void assign_eqn_numbers(unsigned long &global_ndof, Vector< double *> &dof_pt)
Overload the equation assignment operation.
unsigned nposition_type() const
Number of coordinate types needed in the mapping between local and global coordinates.
void set_time_stepper(TimeStepper *const &time_stepper_pt, const bool &preserve_existing_data)
Set a new timestepper by resizing the appropriate storage. If already assigned the equation numbering...
void make_periodic(Node *const &node_pt)
Make the node periodic.
void make_node_periodic(Node *const &node_pt, Node *const &original_node_pt)
Helper function that is used to turn BoundaryNodes into peridic boundary nodes by setting the data va...
unsigned Nmaster
Number of master nodes required by this hanging node.
virtual void unpin_all()
The unpin_all() function must be overloaded by SolidNode, so we put the virtual interface here to avo...
unsigned nvalue_assigned_by_face_element(const unsigned &face_id=0) const
Return the number of values associated with the i-th face element field. If no argument is specified ...
static long Is_segregated_solve_pinned
Static "Magic number" used in place of the equation number to indicate that the value is pinned...
A class that represents a collection of data; each Data object may contain many different individual ...
const double & x(const unsigned &i) const
Return the i-th nodal coordinate (const version).
void unconstrain(const unsigned &i)
Unconstrain the i-th stored variable when make the data nonhanging. Only unconstrain if it was actual...
virtual bool is_a_copy(const unsigned &i) const
Return flag to indicate whether the i-th value is a copy. A base Data object can never be a copy so t...
double & x_gen(const unsigned &k, const unsigned &i)
Reference to the generalised position x(k,i).
virtual void read_values_from_vector(const Vector< double > &vector_of_values, unsigned &index)
Read all data and time history values from the vector starting from index. On return the index will b...
Data *const & variable_position_pt() const
Pointer to variable_position data (const version)
void read(std::ifstream &restart_file)
Read data object from a file.
BoundaryNode(const unsigned &n_lagrangian, const unsigned &n_lagrangian_type, const unsigned &n_dim, const unsigned &n_position_type, const unsigned &initial_n_value)
Steady constructor for Solid-type boundary nodes. The node has n_lagrangian Lagrangian coordinates of...
Node *const & master_node_pt(const unsigned &i) const
Return a pointer to the i-th master node.
void operator=(const BoundaryNodeBase &)
Broken assignment operator.
friend class HijackedData
unsigned Copied_index
Index of the value that is copied from within the Data object.
bool is_constrained(const unsigned &i)
Test whether the i-th variable is constrained (1: true; 0: false).
Custom Data class that is used when making a shallow copy of a data object. The class contains a copy...
Data(const Data &data)
Broken copy constructor.
HangInfo ** Hanging_pt
C-style array of pointers to hanging node info. It's set to NULL if the node isn't hanging...
HangInfo(const unsigned &n_master)
Alternative constructor when the number of master nodes is known.
unsigned nlagrangian_type() const
Number of types of Lagrangian coordinates used to interpolate the Lagrangian coordinates within the e...
virtual void assign_eqn_numbers(unsigned long &global_ndof, Vector< double *> &dof_pt)
Assign global equation numbers; increment global number of unknowns, global_ndof; and add any new dof...
void output(std::ostream &outfile)
Output with default number of plot points.
void dump(std::ostream &dump_file) const
Dump the data object to a file.
Data ** Copy_of_data_pt
C-style array of any Data objects that contain copies of the current Data object's data values...
void operator=(const Node &)
Broken assignment operator.
Class that contains data for hanging nodes.
unsigned ncoordinates_on_boundary(const unsigned &b)
Get the number of boundary coordinates on mesh boundary b.
const double & x_gen(const unsigned &k, const unsigned &i) const
Reference to the generalised position x(k,i). `Type': k; Coordinate direction: i (const version)...
void operator=(const HijackedData &)
Broken assignment operator.
unsigned index_of_first_value_assigned_by_face_element(const unsigned &face_id=0) const
Return the index of the first value associated with the i-th face element value. If no argument is sp...
void pin_all()
Pin all the stored variables (Overloaded)
void operator=(const BoundaryNode< NODE_TYPE > &)
Broken assignment operator.
bool position_is_a_copy(const unsigned &i) const
Return whether the position coordinate i has been copied.
virtual bool is_on_boundary(const unsigned &b) const
Test whether the node lies on mesh boundary b. The "bulk" Node cannot lie on a boundary, so return false. This will be overloaded by BoundaryNodes.
unsigned ntstorage() const
Return total number of doubles stored per value to record time history of each value (one for steady ...
bool is_a_copy() const
Return a boolean to indicate whether the data contains any copied values. Hijacked data is always a c...
std::map< unsigned, unsigned > * Index_of_first_value_assigned_by_face_element_pt
Pointer to a map, indexed by the face element identifier it returns the position of the first face el...
void remove_copy(Data *const &data_pt)
Remove the pointer data_pt from the array Copy_of_data_pt. This should be used whenever copies of the...
void remove_from_boundary(const unsigned &b)
Remover the node from mesh boundary b, final overload.
const long & position_eqn_number(const unsigned &k, const unsigned &i) const
Return the equation number for generalised Eulerian coordinate: type of coordinate: k...
BoundaryNode(TimeStepper *const &time_stepper_pt, const unsigned &n_dim, const unsigned &n_position_type, const unsigned &initial_n_value)
Unsteady constructor for a BoundaryNode of spatial dimension n_dim. Simply passes all arguments throu...
void set_halo(const unsigned &non_halo_proc_ID)
Label the node as halo and specify processor that holds non-halo counterpart.
void assign_eqn_numbers(unsigned long &global_ndof, Vector< double *> &dof_pt)
CopiedData is always a copy, so no equation numbers should be allocated. This function just returns...
void unconstrain_all()
Unconstrain all the stored variables when the data is made nonhanging.
void unconstrain_positions()
Overload the unconstrain positions function to unconstrain all position values.
A Class for nodes that deform elastically (i.e. position is an unknown in the problem). The idea is that the Eulerian positions are stored in a Data object and the Lagrangian coordinates are stored in addition. The pointer that addresses the Eulerian positions is set to the pointer to Value in the Data object. Hence, SolidNode uses knowledge of the internal structure of Data and must be a friend of the Data class. In order to allow a mesh to deform via an elastic-style equation in deforming-domain problems, the positions are stored separately from the values, so that elastic problems may be combined with any other type of problem.
void broken_assign(const std::string &class_name)
Issue error message and terminate execution.
unsigned Ndim
Eulerian dimension of the node.
SolidNode()
Default Constructor.
virtual Node * copied_node_pt() const
Return pointer to copied node (null if the current node is not a copy – always the case here; it's o...
virtual void clear_copied_pointers()
Helper function that should be overloaded derived classes that contain copies of data. The function must unset (NULL out) the internal pointers to the copied data. This is used when destructing data to ensure that all pointers remain valid. The default implementation throws an error because Data cannot be a copy.
virtual void node_update(const bool &update_all_time_levels_for_new_node=false)
Interface for functions that update the nodal position using algebraic remeshing strategies. The interface is common to SpineNodes, AlgebraicNodes and MacroElementNodeUpdateNodes. The default is that the node does not "update itself" i.e. it is fixed in space. When implemented, this function should also execute the Node's auxiliary node update function (if any).
TimeStepper *& time_stepper_pt()
Return the pointer to the timestepper.
TimeStepper * Position_time_stepper_pt
Pointer to the timestepper associated with the position data.
std::string string(const unsigned &i)
Return the i-th string or "" if the relevant string hasn't been defined.
static long Is_unclassified
Static "Magic number" used in place of the equation number to denote a value that hasn't been classif...
bool is_pinned(const unsigned &i) const
Test whether the i-th variable is pinned (1: true; 0: false).
const Data & variable_position() const
Return the variable_position data (const version)
Node * Copied_node_pt
If the BoundaryNode is periodic, this pointer is set to the BoundaryNode whose data it shares...
static unsigned No_independent_position
Static "Magic number" used to indicate that there is no independent position in a periodic node...
virtual void resize(const unsigned &n_value)
Change (increase) the number of values that may be stored.
virtual bool position_is_a_copy() const
Return whether any position coordinate has been copied (always false)
bool is_a_copy() const
Return a boolean to indicate whether the data contains any copied values. Copied data is always a cop...
HangInfo(const HangInfo &)
Broken copy constructor.
Node * copied_node_pt() const
Return pointer to copied node (null if the current node is not a copy)
unsigned Nlagrangian
Number of Lagrangian coordinates of the node.
virtual bool is_on_boundary() const
Test whether the Node lies on a boundary. The "bulk" Node cannot lie on a boundary, so return false. This will be overloaded by BoundaryNodes.
virtual bool position_is_a_copy(const unsigned &i) const
Return whether the position coordinate i has been copied (always false)
bool is_halo() const
Is this Data a halo?
double * x_position_pt(const unsigned &i)
Direct access to the pointer to the i-th stored coordinate data.
bool position_is_a_copy() const
Return whether any position component has been copied.
bool position_is_pinned(const unsigned &i)
Test whether the i-th coordinate is pinned, 0: false; 1: true.
void unpin_all()
Unpin all the stored variables (Overloaded)
void operator=(const HangInfo &)
Broken assignment operator.
std::set< unsigned > * Boundaries_pt
Pointer to set of mesh boundaries occupied by the Node; NULL if the Node is not on any boundaries...
HijackedData(const Data &data)
(Shallow) copy constructor
void range_check(const unsigned &t, const unsigned &i) const
Check that the arguments are within the range of the stored data values and timesteps.
virtual bool does_pointer_correspond_to_position_data(double *const ¶meter_pt)
Check whether the pointer parameter_pt addresses position data values. It never does for a standard n...
BoundaryNodeBase(const BoundaryNodeBase &boundary_node_base)
Broken copy constructor.
unsigned nlagrangian() const
Return number of lagrangian coordinates.
bool boundary_coordinates_have_been_set_up()
Have boundary coordinates been set up?
std::map< unsigned, unsigned > *& index_of_first_value_assigned_by_face_element_pt()
Return pointer to the map giving the index of the first face element value.
Data()
Default: Just set pointer to (steady) timestepper. No storage for values is allocated.
void set_non_obsolete()
Mark node as non-obsolete.
virtual bool is_a_copy() const
Return a boolean to indicate whether the Data objact contains any copied values. A base Data object c...
bool is_a_copy(const unsigned &i) const
Return a boolean to indicate whether the i-th value is a copied value. All copied data is always a co...
unsigned hang_code()
Code that encapsulates the hanging status of the node (incl. the geometric hanging status) as ...
virtual void get_coordinates_on_boundary(const unsigned &b, Vector< double > &boundary_zeta)
Return the vector of coordinates on mesh boundary b Broken virtual interface provides run-time error ...
Base class for time-stepping schemes. Timestepper provides an approximation of the temporal derivativ...
virtual void read_eqn_numbers_from_vector(const Vector< long > &vector_of_eqn_numbers, unsigned &index)
Read all equation numbers from the vector starting from index. On return the index will be set to the...
virtual void add_eqn_numbers_to_vector(Vector< long > &vector_of_eqn_numbers)
Add all equation numbers to the vector in the internal storage order.
void reset_copied_pointers()
Set pointers to the copied data used when we have periodic nodes.
bool is_obsolete()
Test whether node is obsolete.
double ** X_position
Array of pointers to the data holding the Eulerian positions. The storage format must be the same as ...
void assign_eqn_numbers(unsigned long &global_ndof, Vector< double *> &dof_pt)
HijackedData is always a copy, so no equation numbers should be allocated. This function just returns...
virtual ~Data()
Destructor, deallocates memory assigned for data.
Data * Copied_data_pt
Pointer to the Data object from which the value is copied.
BoundaryNode(const unsigned &n_dim, const unsigned &n_position_type, const unsigned &initial_n_value)
Steady constructor, for a BoundaryNode of spatial dimension n_dim. Simply passes all arguments throug...
virtual void set_coordinates_on_boundary(const unsigned &b, const Vector< double > &boundary_zeta)
Set the vector of coordinates on mesh boundary b Broken virtual interface provides run-time error che...
virtual void reset_copied_pointers()
Helper function that should be overloaded in derived classes that can contain copies of Data...
void set_coordinates_on_boundary(const unsigned &b, const unsigned &k, const Vector< double > &boundary_zeta)
Set the vector of k-th generalised boundary coordinates on mesh boundary b. Final overload...