www.mooseframework.org
OneDContactConstraint.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 "OneDContactConstraint.h"
11 
12 // MOOSE includes
13 #include "MooseVariable.h"
14 #include "SystemBase.h"
15 #include "PenetrationLocator.h"
16 
17 #include "libmesh/string_to_enum.h"
18 #include "libmesh/sparse_matrix.h"
19 
21 
22 template <>
23 InputParameters
25 {
26  InputParameters params = validParams<NodeFaceConstraint>();
27  params.set<bool>("use_displaced_mesh") = true;
28  params.addParam<bool>("jacobian_update",
29  false,
30  "Whether or not to update the 'in contact' list "
31  "every jacobian evaluation (by default it will "
32  "happen once per timestep");
33  return params;
34 }
35 
36 OneDContactConstraint::OneDContactConstraint(const InputParameters & parameters)
37  : NodeFaceConstraint(parameters),
38  _residual_copy(_sys.residualGhosted()),
39  _jacobian_update(getParam<bool>("jacobian_update"))
40 {
41 }
42 
43 void
45 {
47 }
48 
49 void
51 {
52  if (_jacobian_update)
54 }
55 
56 void
58 {
59  std::set<dof_id_type> & has_penetrated = _penetration_locator._has_penetrated;
60 
61  std::map<dof_id_type, PenetrationInfo *>::iterator
62  it = _penetration_locator._penetration_info.begin(),
63  end = _penetration_locator._penetration_info.end();
64 
65  for (; it != end; ++it)
66  {
67  PenetrationInfo * pinfo = it->second;
68 
69  // Skip this pinfo if there are no DOFs on this node.
70  if (!pinfo || pinfo->_node->n_comp(_sys.number(), _var.number()) < 1)
71  continue;
72 
73  if (pinfo->_distance > 0)
74  {
75  dof_id_type slave_node_num = it->first;
76  has_penetrated.insert(slave_node_num);
77  }
78  }
79 }
80 
81 bool
83 {
84  std::set<dof_id_type>::iterator hpit =
85  _penetration_locator._has_penetrated.find(_current_node->id());
86  return (hpit != _penetration_locator._has_penetrated.end());
87 }
88 
89 Real
91 {
92  PenetrationInfo * pinfo = _penetration_locator._penetration_info[_current_node->id()];
93  Moose::err << std::endl
94  << "Popping out node: " << _current_node->id() << std::endl
95  << "Closest Point x: " << pinfo->_closest_point(0) << std::endl
96  << "Current Node x: " << (*_current_node)(0) << std::endl
97  << "Current Value: " << _u_slave[_qp] << std::endl
98  << std::endl;
99 
100  return pinfo->_closest_point(0) - ((*_current_node)(0) - _u_slave[_qp]);
101 }
102 
103 Real
104 OneDContactConstraint::computeQpResidual(Moose::ConstraintType type)
105 {
106  PenetrationInfo * pinfo = _penetration_locator._penetration_info[_current_node->id()];
107 
108  switch (type)
109  {
110  case Moose::Slave:
111  // return (_u_slave[_qp] - _u_master[_qp])*_test_slave[_i][_qp];
112  return ((*_current_node)(0) - pinfo->_closest_point(0)) * _test_slave[_i][_qp];
113  case Moose::Master:
114  double slave_resid = _residual_copy(_current_node->dof_number(0, _var.number(), 0));
115  return slave_resid * _test_master[_i][_qp];
116  }
117  return 0;
118 }
119 
120 Real
121 OneDContactConstraint::computeQpJacobian(Moose::ConstraintJacobianType type)
122 {
123  double slave_jac = 0;
124  switch (type)
125  {
126  case Moose::SlaveSlave:
127  return _phi_slave[_j][_qp] * _test_slave[_i][_qp];
128  case Moose::SlaveMaster:
129  return -_phi_master[_j][_qp] * _test_slave[_i][_qp];
130  case Moose::MasterSlave:
131  slave_jac =
132  (*_jacobian)(_current_node->dof_number(0, _var.number(), 0), _connected_dof_indices[_j]);
133  return slave_jac * _test_master[_i][_qp];
134  case Moose::MasterMaster:
135  return 0;
136  default:
137  mooseError("Unhandled ConstraintJacobianType");
138  }
139  return 0;
140 }
OneDContactConstraint::computeQpSlaveValue
virtual Real computeQpSlaveValue()
Definition: OneDContactConstraint.C:90
OneDContactConstraint::updateContactSet
virtual void updateContactSet()
Definition: OneDContactConstraint.C:57
registerMooseObject
registerMooseObject("ContactApp", OneDContactConstraint)
OneDContactConstraint::computeQpResidual
virtual Real computeQpResidual(Moose::ConstraintType type)
Definition: OneDContactConstraint.C:104
OneDContactConstraint::_jacobian_update
bool _jacobian_update
Definition: OneDContactConstraint.h:47
OneDContactConstraint::OneDContactConstraint
OneDContactConstraint(const InputParameters &parameters)
Definition: OneDContactConstraint.C:36
OneDContactConstraint::timestepSetup
virtual void timestepSetup()
Definition: OneDContactConstraint.C:44
OneDContactConstraint::_residual_copy
NumericVector< Number > & _residual_copy
Definition: OneDContactConstraint.h:45
OneDContactConstraint.h
OneDContactConstraint::jacobianSetup
virtual void jacobianSetup()
Definition: OneDContactConstraint.C:50
OneDContactConstraint
A OneDContactConstraint forces the value of a variable to be the same on both sides of an interface.
Definition: OneDContactConstraint.h:25
validParams< OneDContactConstraint >
InputParameters validParams< OneDContactConstraint >()
Definition: OneDContactConstraint.C:24
OneDContactConstraint::computeQpJacobian
virtual Real computeQpJacobian(Moose::ConstraintJacobianType type)
Definition: OneDContactConstraint.C:121
OneDContactConstraint::shouldApply
bool shouldApply()
Definition: OneDContactConstraint.C:82