30 #ifndef OOMPH_ELEMENT_WITH_MOVING_NODES 
   31 #define OOMPH_ELEMENT_WITH_MOVING_NODES 
  128 #ifdef RANGE_CHECKING 
  132         std::ostringstream error_message;
 
  133         error_message << 
"Range Error:  Data number " << n
 
  134                       << 
" is not in the range (0," << n_data - 1 << 
")";
 
  136                             OOMPH_CURRENT_FUNCTION,
 
  137                             OOMPH_EXCEPTION_LOCATION);
 
  144           std::ostringstream error_message;
 
  145           error_message << 
"Range Error: value " << 
i << 
" at data " << n
 
  146                         << 
" is not in the range (0," << n_value - 1 << 
")";
 
  148                               OOMPH_CURRENT_FUNCTION,
 
  149                               OOMPH_EXCEPTION_LOCATION);
 
  158           "Geometric data local equation numbers have not been allocated",
 
  159           OOMPH_CURRENT_FUNCTION,
 
  160           OOMPH_EXCEPTION_LOCATION);
 
  169       std::set<Data*>& unique_geom_data_pt);
 
  179       for (
unsigned n = 0; n < n_geom_data; n++)
 
  221       const bool& i_know_what_i_am_doing = 
false)
 
  223       if (!i_know_what_i_am_doing)
 
  225         std::ostringstream error_message;
 
  227           << 
"Evaluation of shape derivatives by chain rule is currently \n" 
  228           << 
"disabled because it's broken, at least for refineable \n" 
  229           << 
"elements. This all needs to be checked again very carefully\n" 
  230           << 
"following the instructions in the commit log\n" 
  231           << 
"If you know what you're doing and want to force this " 
  233           << 
"call this function with the optional boolean set to true.\n";
 
  236           "ElementWithMovingNodes::evaluate_shape_derivs_by_chain_rule()",
 
  237           OOMPH_EXCEPTION_LOCATION);
 
  246       const bool& i_know_what_i_am_doing = 
false)
 
  248       if (!i_know_what_i_am_doing)
 
  250         std::ostringstream error_message;
 
  252           << 
"Evaluation of shape derivatives by fastest method is currently \n" 
  253           << 
"disabled because it's broken, at least for refineable \n" 
  254           << 
"elements. This all needs to be checked again very carefully\n" 
  255           << 
"following the instructions in the commit log\n" 
  256           << 
"If you know what you're doing and want to force this " 
  258           << 
"call this function with the optional boolean set to true.\n";
 
  261           "ElementWithMovingNodes::evaluate_shape_derivs_by_fastest_method()",
 
  262           OOMPH_EXCEPTION_LOCATION);
 
  307       const bool& store_local_dof_pt);
 
  325         const unsigned n_dof = 
ndof();
 
  379   template<
class ELEMENT, 
class NODE_TYPE>
 
  395       ELEMENT::describe_local_dofs(out, current_string);
 
  404                                    const int& face_index)
 
  416       ELEMENT::describe_local_dofs(out, curr_str);
 
  488       ELEMENT::complete_setup_of_dependencies();
 
  500       ELEMENT::assign_all_generic_local_eqn_numbers(store_local_dof_pt);
 
  509       ELEMENT::get_jacobian(residuals, jacobian);
 
  521       ELEMENT::get_jacobian_and_mass_matrix(residuals, jacobian, mass_matrix);
 
A template Class for BoundaryNodes; that is Nodes that MAY live on the boundary of a Mesh....
/////////////////////////////////////////////////////////////////////// /////////////////////////////...
unsigned ngeom_dof() const
Number of geometric dofs.
Vector< Data * > Geom_data_pt
Vector that stores pointers to all Data that affect the node update operations, i....
int geometric_data_local_eqn(const unsigned &n, const unsigned &i)
Return the local equation number corresponding to the i-th value at the n-th geometric data object.
unsigned Ngeom_dof
Number of geometric dofs (computed on the fly when equation numbers are set up)
bool are_dresidual_dnodal_coordinates_always_evaluated_by_fd() const
Return whether shape derivatives are evaluated by fd.
void operator=(const ElementWithMovingNodes &)=delete
Broken assignment operator.
virtual ~ElementWithMovingNodes()
Virtual destructor (clean up and allocated memory)
bool Evaluate_dresidual_dnodal_coordinates_by_fd
Boolean to decide if shape derivatives are to be evaluated by fd (using FiniteElement::get_dresidual_...
ElementWithMovingNodes()
Constructor.
ElementWithMovingNodes(const ElementWithMovingNodes &)=delete
Broken copy constructor.
void disable_bypass_fill_in_jacobian_from_geometric_data()
Do not bypass the call to fill_in_jacobian_from_geometric_data.
void enable_bypass_fill_in_jacobian_from_geometric_data()
Bypass the call to fill_in_jacobian_from_geometric_data.
virtual void assign_all_generic_local_eqn_numbers(const bool &store_local_dof_pt)
Assign local equation numbers for the geometric Data in the element If the boolean argument is true t...
int & method_for_shape_derivs()
Access to method (enumerated flag) for determination of shape derivs.
virtual void get_dnodal_coordinates_dgeom_dofs(RankThreeTensor< double > &dnodal_coordinates_dgeom_dofs)
Compute derivatives of the nodal coordinates w.r.t. to the geometric dofs. Default implementation by ...
bool Bypass_fill_in_jacobian_from_geometric_data
Set flag to true to bypass calculation of Jacobain entries resulting from geometric data.
void complete_setup_of_dependencies()
Construct the vector of (unique) geometric data.
int Method_for_shape_derivs
Choose method for evaluation of shape derivatives (this takes one of the values in the enumeration)
@ Shape_derivs_by_chain_rule
@ Shape_derivs_by_fastest_method
@ Shape_derivs_by_direct_fd
bool is_fill_in_jacobian_from_geometric_data_bypassed() const
Test whether the call to fill_in_jacobian_from_geometric_data is bypassed.
void evaluate_shape_derivs_by_direct_fd()
Evaluate shape derivatives by direct finite differencing.
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 evaluate_shape_derivs_by_chain_rule(const bool &i_know_what_i_am_doing=false)
Evaluate shape derivatives by chain rule. Currently disabled by default because it's broken; can re-e...
void identify_geometric_data(std::set< Data * > &geometric_data_pt)
Specify Data that affects the geometry of the element by adding the element's geometric Data to the s...
void fill_in_jacobian_from_geometric_data(DenseMatrix< double > &jacobian)
Calculate the contributions to the Jacobian matrix from the geometric data. This version computes the...
unsigned ngeom_data() const
Return the number of geometric data upon which the shape of the element depends.
void assemble_set_of_all_geometric_data(std::set< Data * > &unique_geom_data_pt)
Return a set of all geometric data associated with the element.
void fill_in_jacobian_from_geometric_data(Vector< double > &residuals, DenseMatrix< double > &jacobian)
Calculate the contributions to the Jacobian matrix from the geometric data. This version assumes that...
int ** Geometric_data_local_eqn
Array to hold local eqn number information for the geometric Data variables.
void disable_always_evaluate_dresidual_dnodal_coordinates_by_fd()
Insist that shape derivatives are always evaluated using the overloaded version of this function that...
void evaluate_shape_derivs_by_fastest_method(const bool &i_know_what_i_am_doing=false)
Evaluate shape derivatives by (anticipated) fastest method. Currently disabled by default because it'...
void enable_always_evaluate_dresidual_dnodal_coordinates_by_fd()
Insist that shape derivatives are always evaluated by fd (using FiniteElement::get_dresidual_dnodal_c...
Specific implementation of the class for specified element and node type.
void get_jacobian_and_mass_matrix(Vector< double > &residuals, DenseMatrix< double > &jacobian, DenseMatrix< double > &mass_matrix)
Compute the element's residuals vector and jacobian matrix.
ElementWithSpecificMovingNodes(FiniteElement *const &element_pt, const int &face_index)
Constructor used for face elements.
Node * construct_node(const unsigned &n)
Overload the node assignment routine to assign nodes of the appropriate type.
void assign_all_generic_local_eqn_numbers(const bool &store_local_dof_pt)
Assign local equation numbers for the underlying element, then deal with the additional geometric dof...
void describe_local_dofs(std::ostream &out, std::string &curr_str)
Unique final overrider for describe_dofs.
~ElementWithSpecificMovingNodes()
Empty Destructor,.
Node * construct_boundary_node(const unsigned &n)
Overload the node assignment routine to assign boundary nodes.
ElementWithSpecificMovingNodes()
Constructor, call the constructor of the base 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 get_jacobian(Vector< double > &residuals, DenseMatrix< double > &jacobian)
Compute the element's residuals vector and jacobian matrix.
Node * construct_boundary_node(const unsigned &n, TimeStepper *const &time_stepper_pt)
Overloaded boundary node allocation for unsteady problems.
void complete_setup_of_dependencies()
Complete the setup of additional dependencies. Overloads empty virtual function in GeneralisedElement...
Node * construct_node(const unsigned &n, TimeStepper *const &time_stepper_pt)
Overloaded node allocation for unsteady problems.
A general Finite Element class.
Node *& node_pt(const unsigned &n)
Return a pointer to the local node n.
unsigned nnodal_position_type() const
Return the number of coordinate types that the element requires to interpolate the geometry between t...
virtual unsigned required_nvalue(const unsigned &n) const
Number of values that must be stored at local node n by the element. The default is 0,...
unsigned nodal_dimension() const
Return the required Eulerian dimension of the nodes in this element.
unsigned ndof() const
Return the number of equations/dofs in the element.
virtual void get_residuals(Vector< double > &residuals)
Calculate the vector of residuals of the equations in the element. By default initialise the vector t...
TimeStepper *& time_stepper_pt()
Access function for pointer to time stepper: Null if object is not time-dependent.
Nodes are derived from Data, but, in addition, have a definite (Eulerian) position in a space of a gi...
An OomphLibError object which should be thrown when an run-time error is encountered....
////////////////////////////////////////////////////////////////// //////////////////////////////////...
////////////////////////////////////////////////////////////////////// //////////////////////////////...
std::string string(const unsigned &i)
Return the i-th string or "" if the relevant string hasn't been defined.
//////////////////////////////////////////////////////////////////// ////////////////////////////////...