www.mooseframework.org
RANFSTieNode.C
Go to the documentation of this file.
1 //* This file is part of the MOOSE framework
2 //* https://www.mooseframework.org
3 //*
4 //* All rights reserved, see COPYRIGHT for full restrictions
5 //* https://github.com/idaholab/moose/blob/master/COPYRIGHT
6 //*
7 //* Licensed under LGPL 2.1, please see LICENSE for details
8 //* https://www.gnu.org/licenses/lgpl-2.1.html
9 
10 #include "RANFSTieNode.h"
11 #include "PenetrationLocator.h"
12 #include "PenetrationInfo.h"
13 #include "SystemBase.h"
14 #include "Assembly.h"
15 #include "NearestNodeLocator.h"
16 
17 #include "libmesh/numeric_vector.h"
18 #include "libmesh/sparse_matrix.h"
19 
20 registerMooseObject("ContactTestApp", RANFSTieNode);
21 
22 template <>
23 InputParameters
25 {
26  InputParameters params = validParams<NodeFaceConstraint>();
27  params.set<bool>("use_displaced_mesh") = true;
28 
29  MooseEnum component("x=0 y=1 z=2");
30  params.addRequiredParam<MooseEnum>(
31  "component", component, "The force component constraint that this object is supplying");
32  params.addRequiredCoupledVar(
33  "displacements",
34  "The displacements appropriate for the simulation geometry and coordinate system");
35  return params;
36 }
37 
38 RANFSTieNode::RANFSTieNode(const InputParameters & parameters)
39  : NodeFaceConstraint(parameters),
40  _component(getParam<MooseEnum>("component")),
41  _mesh_dimension(_mesh.dimension()),
42  _residual_copy(_sys.residualGhosted())
43 {
44  // modern parameter scheme for displacements
45  for (unsigned int i = 0; i < coupledComponents("displacements"); ++i)
46  {
47  _vars.push_back(coupled("displacements", i));
48  _var_objects.push_back(getVar("displacements", i));
49  }
50 
51  if (_vars.size() != _mesh_dimension)
52  mooseError("The number of displacement variables does not match the mesh dimension!");
53 }
54 
55 void
57 {
58  _node_to_lm.clear();
59 }
60 
61 bool
63 {
64  return _nearest_node;
65 }
66 
67 bool
69 {
70  auto & nearest_node_loc = _penetration_locator._nearest_node;
71  _nearest_node = nearest_node_loc.nearestNode(_current_node->id());
72  if (_nearest_node)
73  {
74  auto slave_dof_number = _current_node->dof_number(0, _vars[_component], 0);
75  // We overwrite the slave residual so we cannot use the residual
76  // copy for determining the Lagrange multiplier when computing the Jacobian
77  if (!_subproblem.currentlyComputingJacobian())
78  _node_to_lm.insert(std::make_pair(_current_node->id(),
79  _residual_copy(slave_dof_number) /
80  _var_objects[_component]->scalingFactor()));
81  else
82  {
83  std::vector<dof_id_type> master_cols;
84  std::vector<Number> master_values;
85 
86  _jacobian->get_row(slave_dof_number, master_cols, master_values);
87  mooseAssert(master_cols.size() == master_values.size(),
88  "The size of the dof container and value container are different");
89 
90  _dof_number_to_value.clear();
91 
92  for (MooseIndex(master_cols) i = 0; i < master_cols.size(); ++i)
93  _dof_number_to_value.insert(
94  std::make_pair(master_cols[i], master_values[i] / _var.scalingFactor()));
95  }
96 
97  mooseAssert(_node_to_lm.find(_current_node->id()) != _node_to_lm.end(),
98  "The node " << _current_node->id() << " should map to a lagrange multiplier");
99  _lagrange_multiplier = _node_to_lm[_current_node->id()];
100 
101  _master_index = _current_master->get_node_index(_nearest_node);
102  mooseAssert(_master_index != libMesh::invalid_uint,
103  "nearest node not a node on the current master element");
104 
105  return true;
106  }
107 
108  return false;
109 }
110 
111 Real
112 RANFSTieNode::computeQpResidual(Moose::ConstraintType type)
113 {
114  switch (type)
115  {
116  case Moose::ConstraintType::Slave:
117  return (*_current_node - *_nearest_node)(_component);
118 
119  case Moose::ConstraintType::Master:
120  {
121  if (_i == _master_index)
122  return _lagrange_multiplier;
123 
124  else
125  return 0;
126  }
127 
128  default:
129  return 0;
130  }
131 }
132 
133 Real
134 RANFSTieNode::computeQpJacobian(Moose::ConstraintJacobianType type)
135 {
136  switch (type)
137  {
138  case Moose::ConstraintJacobianType::SlaveSlave:
139  return _phi_slave[_j][_qp];
140 
141  case Moose::ConstraintJacobianType::SlaveMaster:
142  if (_master_index == _j)
143  return -1;
144  else
145  return 0;
146 
147  case Moose::ConstraintJacobianType::MasterSlave:
148  if (_i == _master_index)
149  {
150  mooseAssert(_dof_number_to_value.find(_connected_dof_indices[_j]) !=
151  _dof_number_to_value.end(),
152  "The connected dof index is not found in the _dof_number_to_value container. "
153  "This must mean that insufficient sparsity was allocated");
154  return _dof_number_to_value[_connected_dof_indices[_j]];
155  }
156  else
157  return 0;
158 
159  default:
160  return 0;
161  }
162 }
163 
164 void
165 RANFSTieNode::computeSlaveValue(NumericVector<Number> &)
166 {
167 }
168 
169 Real
171 {
172  mooseError("We overrode commputeSlaveValue so computeQpSlaveValue should never get called");
173 }
RANFSTieNode
Definition: RANFSTieNode.h:31
RANFSTieNode::_master_index
dof_id_type _master_index
Definition: RANFSTieNode.h:56
RANFSTieNode::_mesh_dimension
const unsigned int _mesh_dimension
Definition: RANFSTieNode.h:48
RANFSTieNode.h
registerMooseObject
registerMooseObject("ContactTestApp", RANFSTieNode)
RANFSTieNode::overwriteSlaveResidual
bool overwriteSlaveResidual() override
Definition: RANFSTieNode.C:62
RANFSTieNode::computeSlaveValue
void computeSlaveValue(NumericVector< Number > &solution) override
Definition: RANFSTieNode.C:165
RANFSTieNode::_node_to_lm
std::unordered_map< dof_id_type, Real > _node_to_lm
Definition: RANFSTieNode.h:55
RANFSTieNode::_residual_copy
NumericVector< Number > & _residual_copy
Definition: RANFSTieNode.h:49
RANFSTieNode::residualSetup
void residualSetup() override
Definition: RANFSTieNode.C:56
RANFSTieNode::_vars
std::vector< unsigned int > _vars
Definition: RANFSTieNode.h:51
MaterialTensorCalculatorTools::component
Real component(const SymmTensor &symm_tensor, unsigned int index)
Definition: MaterialTensorCalculatorTools.C:16
RANFSTieNode::RANFSTieNode
RANFSTieNode(const InputParameters &parameters)
Definition: RANFSTieNode.C:38
RANFSTieNode::_var_objects
std::vector< MooseVariable * > _var_objects
Definition: RANFSTieNode.h:52
RANFSTieNode::computeQpJacobian
virtual Real computeQpJacobian(Moose::ConstraintJacobianType type) override
Definition: RANFSTieNode.C:134
RANFSTieNode::shouldApply
bool shouldApply() override
Definition: RANFSTieNode.C:68
RANFSTieNode::_lagrange_multiplier
Real _lagrange_multiplier
Definition: RANFSTieNode.h:53
RANFSTieNode::_nearest_node
const Node * _nearest_node
Definition: RANFSTieNode.h:54
RANFSTieNode::computeQpSlaveValue
virtual Real computeQpSlaveValue() override
Definition: RANFSTieNode.C:170
RANFSTieNode::_dof_number_to_value
std::unordered_map< dof_id_type, Number > _dof_number_to_value
Definition: RANFSTieNode.h:58
validParams< RANFSTieNode >
InputParameters validParams< RANFSTieNode >()
Definition: RANFSTieNode.C:24
RANFSTieNode::computeQpResidual
virtual Real computeQpResidual(Moose::ConstraintType type) override
Definition: RANFSTieNode.C:112
RANFSTieNode::_component
const MooseEnum _component
Definition: RANFSTieNode.h:47