oomph::NodeNodeMortaringElement Class Reference

#include <node_node_constraint_elements.h>

+ Inheritance diagram for oomph::NodeNodeMortaringElement:

Public Member Functions

 NodeNodeMortaringElement (Node *node0_pt, Node *node1_pt, const Vector< int > &mortared_indices={-1})
 
 NodeNodeMortaringElement (SolidNode *node0_pt, SolidNode *node1_pt, const Vector< int > &mortared_indices={-1}, const Vector< int > &mortared_solid_indices={-1})
 
void construct_lagrange_multipliers () override
 
void fill_in_contribution_to_residuals (Vector< double > &residuals) override
 
void fill_in_contribution_to_jacobian (Vector< double > &residuals, DenseMatrix< double > &jacobian) override
 
- Public Member Functions inherited from oomph::NodeNodeConstraintElement
 NodeNodeConstraintElement (Node *node0_pt, Node *node1_pt)
 
 NodeNodeConstraintElement (SolidNode *node0_pt, SolidNode *node1_pt)
 
Datanode_pt (const unsigned &i)
 
SolidNodesolid_node_pt (const unsigned &i)
 
- Public Member Functions inherited from oomph::ConstraintElement
 ConstraintElement (Vector< Data * > &data_pt)
 
 ConstraintElement (Vector< Data * > data_pt)
 
- Public Member Functions inherited from oomph::GeneralisedElement
 GeneralisedElement ()
 Constructor: Initialise all pointers and all values to zero. More...
 
virtual ~GeneralisedElement ()
 Virtual destructor to clean up any memory allocated by the object. More...
 
 GeneralisedElement (const GeneralisedElement &)=delete
 Broken copy constructor. More...
 
void operator= (const GeneralisedElement &)=delete
 Broken assignment operator. More...
 
Data *& internal_data_pt (const unsigned &i)
 Return a pointer to i-th internal data object. More...
 
Data *const & internal_data_pt (const unsigned &i) const
 Return a pointer to i-th internal data object (const version) More...
 
Data *& external_data_pt (const unsigned &i)
 Return a pointer to i-th external data object. More...
 
Data *const & external_data_pt (const unsigned &i) const
 Return a pointer to i-th external data object (const version) More...
 
unsigned long eqn_number (const unsigned &ieqn_local) const
 
int local_eqn_number (const unsigned long &ieqn_global) const
 
unsigned add_external_data (Data *const &data_pt, const bool &fd=true)
 
bool external_data_fd (const unsigned &i) const
 
void exclude_external_data_fd (const unsigned &i)
 
void include_external_data_fd (const unsigned &i)
 
void flush_external_data ()
 Flush all external data. More...
 
void flush_external_data (Data *const &data_pt)
 Flush the object addressed by data_pt from the external data array. More...
 
unsigned ninternal_data () const
 Return the number of internal data objects. More...
 
unsigned nexternal_data () const
 Return the number of external data objects. More...
 
unsigned ndof () const
 Return the number of equations/dofs in the element. More...
 
void dof_vector (const unsigned &t, Vector< double > &dof)
 Return the vector of dof values at time level t. More...
 
void dof_pt_vector (Vector< double * > &dof_pt)
 Return the vector of pointers to dof values. More...
 
void set_internal_data_time_stepper (const unsigned &i, TimeStepper *const &time_stepper_pt, const bool &preserve_existing_data)
 
void assign_internal_eqn_numbers (unsigned long &global_number, Vector< double * > &Dof_pt)
 
void describe_dofs (std::ostream &out, const std::string &current_string) const
 
virtual void describe_local_dofs (std::ostream &out, const std::string &current_string) const
 
void add_internal_value_pt_to_map (std::map< unsigned, double * > &map_of_value_pt)
 
virtual void assign_local_eqn_numbers (const bool &store_local_dof_pt)
 
virtual void complete_setup_of_dependencies ()
 
virtual void get_residuals (Vector< double > &residuals)
 
virtual void get_jacobian (Vector< double > &residuals, DenseMatrix< double > &jacobian)
 
virtual void get_mass_matrix (Vector< double > &residuals, DenseMatrix< double > &mass_matrix)
 
virtual void get_jacobian_and_mass_matrix (Vector< double > &residuals, DenseMatrix< double > &jacobian, DenseMatrix< double > &mass_matrix)
 
virtual void get_dresiduals_dparameter (double *const &parameter_pt, Vector< double > &dres_dparam)
 
virtual void get_djacobian_dparameter (double *const &parameter_pt, Vector< double > &dres_dparam, DenseMatrix< double > &djac_dparam)
 
virtual void get_djacobian_and_dmass_matrix_dparameter (double *const &parameter_pt, Vector< double > &dres_dparam, DenseMatrix< double > &djac_dparam, DenseMatrix< double > &dmass_matrix_dparam)
 
virtual void get_hessian_vector_products (Vector< double > const &Y, DenseMatrix< double > const &C, DenseMatrix< double > &product)
 
virtual void get_inner_products (Vector< std::pair< unsigned, unsigned >> const &history_index, Vector< double > &inner_product)
 
virtual void get_inner_product_vectors (Vector< unsigned > const &history_index, Vector< Vector< double >> &inner_product_vector)
 
virtual unsigned self_test ()
 
virtual void compute_norm (Vector< double > &norm)
 
virtual void compute_norm (double &norm)
 
virtual unsigned ndof_types () const
 
virtual void get_dof_numbers_for_unknowns (std::list< std::pair< unsigned long, unsigned >> &dof_lookup_list) const
 

Private Member Functions

void fill_in_contribution_to_jacobian_mortared_nodes (Vector< double > &residuals, DenseMatrix< double > &jacobian, const bool &flag)
 

Private Attributes

Vector< intMortared_Indices
 
Vector< intMortared_Solid_Indices
 

Additional Inherited Members

- Static Public Attributes inherited from oomph::GeneralisedElement
static bool Suppress_warning_about_repeated_internal_data
 
static bool Suppress_warning_about_repeated_external_data = true
 
static double Default_fd_jacobian_step = 1.0e-8
 
- Protected Member Functions inherited from oomph::ConstraintElement
virtual void evaluate_constraint_functions (Vector< double > &error)
 
Vector< unsignedget_constrained_data_local_index ()
 
unsigned get_lagrange_multiplier_index ()
 
Datalagrange_multiplier ()
 
const int lagrange_eqn (const unsigned &i)
 
Dataext_data_pt (const unsigned &i)
 
const int ext_eqn (const unsigned &i, const unsigned &j)
 
- Protected Member Functions inherited from oomph::GeneralisedElement
unsigned add_internal_data (Data *const &data_pt, const bool &fd=true)
 
bool internal_data_fd (const unsigned &i) const
 
void exclude_internal_data_fd (const unsigned &i)
 
void include_internal_data_fd (const unsigned &i)
 
void clear_global_eqn_numbers ()
 
void add_global_eqn_numbers (std::deque< unsigned long > const &global_eqn_numbers, std::deque< double * > const &global_dof_pt)
 
virtual void assign_internal_and_external_local_eqn_numbers (const bool &store_local_dof_pt)
 
virtual void assign_all_generic_local_eqn_numbers (const bool &store_local_dof_pt)
 
virtual void assign_additional_local_eqn_numbers ()
 
int internal_local_eqn (const unsigned &i, const unsigned &j) const
 
int external_local_eqn (const unsigned &i, const unsigned &j)
 
void fill_in_jacobian_from_internal_by_fd (Vector< double > &residuals, DenseMatrix< double > &jacobian, const bool &fd_all_data=false)
 
void fill_in_jacobian_from_internal_by_fd (DenseMatrix< double > &jacobian, const bool &fd_all_data=false)
 
void fill_in_jacobian_from_external_by_fd (Vector< double > &residuals, DenseMatrix< double > &jacobian, const bool &fd_all_data=false)
 
void fill_in_jacobian_from_external_by_fd (DenseMatrix< double > &jacobian, const bool &fd_all_data=false)
 
virtual void update_before_internal_fd ()
 
virtual void reset_after_internal_fd ()
 
virtual void update_in_internal_fd (const unsigned &i)
 
virtual void reset_in_internal_fd (const unsigned &i)
 
virtual void update_before_external_fd ()
 
virtual void reset_after_external_fd ()
 
virtual void update_in_external_fd (const unsigned &i)
 
virtual void reset_in_external_fd (const unsigned &i)
 
virtual void fill_in_contribution_to_mass_matrix (Vector< double > &residuals, DenseMatrix< double > &mass_matrix)
 
virtual void fill_in_contribution_to_jacobian_and_mass_matrix (Vector< double > &residuals, DenseMatrix< double > &jacobian, DenseMatrix< double > &mass_matrix)
 
virtual void fill_in_contribution_to_dresiduals_dparameter (double *const &parameter_pt, Vector< double > &dres_dparam)
 
virtual void fill_in_contribution_to_djacobian_dparameter (double *const &parameter_pt, Vector< double > &dres_dparam, DenseMatrix< double > &djac_dparam)
 
virtual void fill_in_contribution_to_djacobian_and_dmass_matrix_dparameter (double *const &parameter_pt, Vector< double > &dres_dparam, DenseMatrix< double > &djac_dparam, DenseMatrix< double > &dmass_matrix_dparam)
 
virtual void fill_in_contribution_to_hessian_vector_products (Vector< double > const &Y, DenseMatrix< double > const &C, DenseMatrix< double > &product)
 
virtual void fill_in_contribution_to_inner_products (Vector< std::pair< unsigned, unsigned >> const &history_index, Vector< double > &inner_product)
 
virtual void fill_in_contribution_to_inner_product_vectors (Vector< unsigned > const &history_index, Vector< Vector< double >> &inner_product_vector)
 
- Protected Attributes inherited from oomph::ConstraintElement
Vector< unsignedConstrained_Data_Local_Index
 
unsigned Num_Constrained_Data
 
unsigned Lagrange_Multiplier_Index
 
unsigned Num_Constraints
 
- Static Protected Attributes inherited from oomph::GeneralisedElement
static DenseMatrix< doubleDummy_matrix
 
static std::deque< double * > Dof_pt_deque
 

Constructor & Destructor Documentation

◆ NodeNodeMortaringElement() [1/2]

oomph::NodeNodeMortaringElement::NodeNodeMortaringElement ( Node node0_pt,
Node node1_pt,
const Vector< int > &  mortared_indices = {-1} 
)
inline
79  {-1}) :
81  ConstraintElement({node0_pt, node1_pt}),
82  NodeNodeConstraintElement(node0_pt, node1_pt),
83  Mortared_Indices(mortared_indices),
85  {
87  }
ConstraintElement(Vector< Data * > &data_pt)
Definition: constraint_elements.h:85
GeneralisedElement()
Constructor: Initialise all pointers and all values to zero.
Definition: elements.h:596
NodeNodeConstraintElement(Node *node0_pt, Node *node1_pt)
Definition: node_node_constraint_elements.h:24
void construct_lagrange_multipliers() override
Definition: node_node_constraint_elements.cc:18
Vector< int > Mortared_Solid_Indices
Definition: node_node_constraint_elements.h:112
Vector< int > Mortared_Indices
Definition: node_node_constraint_elements.h:111

◆ NodeNodeMortaringElement() [2/2]

oomph::NodeNodeMortaringElement::NodeNodeMortaringElement ( SolidNode node0_pt,
SolidNode node1_pt,
const Vector< int > &  mortared_indices = {-1},
const Vector< int > &  mortared_solid_indices = {-1} 
)
inline
93  {-1},
94  const Vector<int>& mortared_solid_indices = {-1}) : // Set to {-1} - this implies we want to mortar all solid dofs
96  ConstraintElement({node0_pt, node1_pt, node0_pt->variable_position_pt(), node1_pt->variable_position_pt()}),
97  NodeNodeConstraintElement(node0_pt, node1_pt),
98  Mortared_Indices(mortared_indices),
99  Mortared_Solid_Indices(mortared_solid_indices)
100  {
102  }

Member Function Documentation

◆ construct_lagrange_multipliers()

void oomph::NodeNodeMortaringElement::construct_lagrange_multipliers ( )
overridevirtual

Reimplemented from oomph::ConstraintElement.

19  {
20  // If the only specified mortared index is -1 then that indicates that we don't need to mortar anything
21  if(Mortared_Indices[0] == -1)
22  {
23  Mortared_Indices.clear();
24  }
25  // Otherwise we will be mortaring something
26  else
27  {
28  // If no mortared indices were specified then assume all indices are to be mortared
29  if(Mortared_Indices.size()==0)
30  {
31  // Check that both nodes have the same number of degrees of freedom
32  if(node_pt(0)->nvalue() != node_pt(1)->nvalue())
33  {
34  // Throw an error
35  throw OomphLibError("It was requested that all degrees of freedom of nodes is mortared but the nodes have different numbers of degrees of freedom",
38  }
39  Mortared_Indices.resize(node_pt(0)->nvalue());
40  // Set the mortared index numbers
41  for(unsigned i=0; i<node_pt(0)->nvalue(); i++)
42  {
43  Mortared_Indices[i] = i;
44  }
45  }
46  #ifdef RANGE_CHECKING
47  // Check that the specified indices are valid
48  for(unsigned i=0; i<Mortared_Indices.size(); i++)
49  {
51  {
52  // Throw an error
53  throw OomphLibError("A constrained index is not valid for a constrained data",
56  }
57  }
58  #endif
59  }
60 
61  // Now do the same for the solid dofs:
62 
63 
64  // If Mortared_Solid_Indices = {-1} that means we mortar in every dimension
65  if(Mortared_Solid_Indices.size() == 1 && Mortared_Solid_Indices[0] == -1)
66  {
67  // Check that both nodes have the same number of dimensions
68  if(solid_node_pt(0)->variable_position_pt()->nvalue() != solid_node_pt(1)->variable_position_pt()->nvalue())
69  {
70  // Throw an error
71  throw OomphLibError("Nodes have different dimensions",
74  }
75  // resize and fill in the mortared solid indices
76  Mortared_Solid_Indices.resize(solid_node_pt(0)->variable_position_pt()->nvalue());
77  for(unsigned i=0; i<solid_node_pt(0)->variable_position_pt()->nvalue(); i++) Mortared_Solid_Indices[i] = i;
78  }
79  #ifdef RANGE_CHECKING
80  // Check that the specified indices are valid for both nodes
81  for(unsigned i=0; i<Mortared_Solid_Indices.size(); i++)
82  {
84  {
85  // Throw an error
86  throw OomphLibError("A constrained index is not valid for a constrained data",
89  }
90  }
91  #endif
92 
94  // Create the lagrange multipliers
96 
97  // Check if any constraints are unenforcible and the corresponding lagrange multiplier needs
98  // to be pinned
99  for(unsigned i=0; i<Mortared_Indices.size(); i++)
100  {
101  if(node_pt(0)->is_pinned(i) && node_pt(1)->is_pinned(i))
102  {
104  }
105  }
106  // Check for the solid dofs
107  for(unsigned i=0; i<Mortared_Solid_Indices.size(); i++)
108  {
109  if(solid_node_pt(0)->variable_position_pt()->is_pinned(i) && solid_node_pt(1)->variable_position_pt()->is_pinned(i))
110  {
112  }
113  }
114  }
int i
Definition: BiCGSTAB_step_by_step.cpp:9
unsigned Num_Constraints
Definition: constraint_elements.h:180
Data * lagrange_multiplier()
Definition: constraint_elements.h:131
unsigned Lagrange_Multiplier_Index
Definition: constraint_elements.h:178
void pin(const unsigned &i)
Pin the i-th stored variable.
Definition: nodes.h:385
unsigned nvalue() const
Return number of values stored in data object (incl pinned ones).
Definition: nodes.h:483
unsigned add_internal_data(Data *const &data_pt, const bool &fd=true)
Definition: elements.cc:62
Data * node_pt(const unsigned &i)
Definition: node_node_constraint_elements.h:42
SolidNode * solid_node_pt(const unsigned &i)
Definition: node_node_constraint_elements.h:56
Data *const & variable_position_pt() const
Pointer to variable_position data (const version)
Definition: nodes.h:1765
#define OOMPH_EXCEPTION_LOCATION
Definition: oomph_definitions.h:61
#define OOMPH_CURRENT_FUNCTION
Definition: oomph_definitions.h:86

References oomph::GeneralisedElement::add_internal_data(), i, oomph::ConstraintElement::lagrange_multiplier(), oomph::ConstraintElement::Lagrange_Multiplier_Index, Mortared_Indices, Mortared_Solid_Indices, oomph::NodeNodeConstraintElement::node_pt(), oomph::ConstraintElement::Num_Constraints, oomph::Data::nvalue(), OOMPH_CURRENT_FUNCTION, OOMPH_EXCEPTION_LOCATION, oomph::Data::pin(), oomph::NodeNodeConstraintElement::solid_node_pt(), and oomph::SolidNode::variable_position_pt().

◆ fill_in_contribution_to_jacobian()

void oomph::NodeNodeMortaringElement::fill_in_contribution_to_jacobian ( Vector< double > &  residuals,
DenseMatrix< double > &  jacobian 
)
overridevirtual

Add the elemental contribution to the jacobian matrix. and the residuals vector. Note that this function will NOT initialise the residuals vector or the jacobian matrix. It must be called after the residuals vector and jacobian matrix have been initialised to zero. The default is to use finite differences to calculate the jacobian

Reimplemented from oomph::GeneralisedElement.

122  {
123  fill_in_contribution_to_jacobian_mortared_nodes(residuals, jacobian, 1);
124  }
void fill_in_contribution_to_jacobian_mortared_nodes(Vector< double > &residuals, DenseMatrix< double > &jacobian, const bool &flag)
Definition: node_node_constraint_elements.cc:126

References fill_in_contribution_to_jacobian_mortared_nodes().

◆ fill_in_contribution_to_jacobian_mortared_nodes()

void oomph::NodeNodeMortaringElement::fill_in_contribution_to_jacobian_mortared_nodes ( Vector< double > &  residuals,
DenseMatrix< double > &  jacobian,
const bool flag 
)
private
129  {
130  for(unsigned i=0; i<Num_Constraints; i++)
131  {
132  bool handling_solid_constraint = false;
133  if(i >= Mortared_Indices.size()) handling_solid_constraint = true;
134  // Get the nodal values
135  Vector<double> nodal_values;
136  // Get the nodal values from the solid data
137  if(handling_solid_constraint) nodal_values = {solid_node_pt(0)->variable_position_pt()->value(i - Mortared_Indices.size()),
139 
140  // Get the lagrange multiplier value
141  const double lambda = lagrange_multiplier()->value(i);
142 
143  // Lagrange multiplier eqn number
144  const int lambda_eqn = lagrange_eqn(i);
145 
146  // Nodal eqn number
147  Vector<int> node_eqn{ext_eqn(0,i),
148  ext_eqn(1,i)};
149  // Get the eqn number from the solid data
150  if(handling_solid_constraint) node_eqn = {ext_eqn(2, i - Mortared_Indices.size()),
151  ext_eqn(3, i - Mortared_Indices.size())};
152 
153  #ifdef PARANOID
154  if(node_eqn[0] < 0 && node_eqn[1] < 0 && lambda_eqn>=0)
155  {
156  throw OomphLibError("Both mutually constrained dofs are pinned. Dof type " + std::to_string(dof_type) + ". " + std::to_string(node_eqn[0]) + " " + std::to_string(node_eqn[1]),
159  }
160  #endif
161  // Residual and jacobian of lagrange multiplier
162  if(lambda_eqn>=0)
163  {
164  // add to the lagrange multiplier residual
165  residuals[lambda_eqn] += (nodal_values[0] - nodal_values[1]);
166 
167  if(flag)
168  {
169  if(node_eqn[0]>=0)
170  {
171  jacobian(lambda_eqn, node_eqn[0]) += 1.0;
172  }
173  if(node_eqn[1]>=0)
174  {
175  jacobian(lambda_eqn, node_eqn[1]) += -1.0;
176  }
177  }
178  }
179  // Residual and jacobian of nodal values
180  if(node_eqn[0]>=0)
181  {
182  residuals[node_eqn[0]] += lambda;
183 
184  if(flag)
185  {
186  if(lambda_eqn>=0)
187  {
188  jacobian(node_eqn[0], lambda_eqn) += 1.0;
189  }
190  }
191  }
192  if(node_eqn[1]>=0)
193  {
194  residuals[node_eqn[1]] += -lambda;
195 
196  if(flag)
197  {
198  if(lambda_eqn>=0)
199  {
200  jacobian(node_eqn[1], lambda_eqn) += -1.0;
201  }
202  }
203  }
204  }
205  }
cout<< "The eigenvalues of A are:"<< endl<< ces.eigenvalues()<< endl;cout<< "The matrix of eigenvectors, V, is:"<< endl<< ces.eigenvectors()<< endl<< endl;complex< float > lambda
Definition: ComplexEigenSolver_compute.cpp:9
const int lagrange_eqn(const unsigned &i)
Definition: constraint_elements.h:135
const int ext_eqn(const unsigned &i, const unsigned &j)
Definition: constraint_elements.h:160
double value(const unsigned &i) const
Definition: nodes.h:293
std::string to_string(T object, unsigned float_precision=8)
Definition: oomph_utilities.h:189

References oomph::ConstraintElement::ext_eqn(), i, oomph::ConstraintElement::lagrange_eqn(), oomph::ConstraintElement::lagrange_multiplier(), lambda, Mortared_Indices, oomph::ConstraintElement::Num_Constraints, OOMPH_CURRENT_FUNCTION, OOMPH_EXCEPTION_LOCATION, oomph::NodeNodeConstraintElement::solid_node_pt(), oomph::StringConversion::to_string(), oomph::Data::value(), and oomph::SolidNode::variable_position_pt().

Referenced by fill_in_contribution_to_jacobian(), and fill_in_contribution_to_residuals().

◆ fill_in_contribution_to_residuals()

void oomph::NodeNodeMortaringElement::fill_in_contribution_to_residuals ( Vector< double > &  residuals)
overridevirtual

Add the elemental contribution to the residuals vector. Note that this function will NOT initialise the residuals vector. It must be called after the residuals vector has been initialised to zero.

Reimplemented from oomph::ConstraintElement.

117  {
119  }
static DenseMatrix< double > Dummy_matrix
Definition: elements.h:227

References oomph::GeneralisedElement::Dummy_matrix, and fill_in_contribution_to_jacobian_mortared_nodes().

Member Data Documentation

◆ Mortared_Indices

Vector<int> oomph::NodeNodeMortaringElement::Mortared_Indices
private

◆ Mortared_Solid_Indices

Vector<int> oomph::NodeNodeMortaringElement::Mortared_Solid_Indices
private

The documentation for this class was generated from the following files: