13 #include "MooseVariable.h"
14 #include "SystemBase.h"
15 #include "PenetrationLocator.h"
17 #include "libmesh/string_to_enum.h"
18 #include "libmesh/sparse_matrix.h"
26 InputParameters params = validParams<NodeFaceConstraint>();
27 params.set<
bool>(
"use_displaced_mesh") =
true;
28 params.addParam<
bool>(
"jacobian_update",
30 "Whether or not to update the 'in contact' list "
31 "every jacobian evaluation (by default it will "
32 "happen once per timestep");
37 : NodeFaceConstraint(parameters),
38 _residual_copy(_sys.residualGhosted()),
39 _jacobian_update(getParam<bool>(
"jacobian_update"))
59 std::set<dof_id_type> & has_penetrated = _penetration_locator._has_penetrated;
61 std::map<dof_id_type, PenetrationInfo *>::iterator
62 it = _penetration_locator._penetration_info.begin(),
63 end = _penetration_locator._penetration_info.end();
65 for (; it != end; ++it)
67 PenetrationInfo * pinfo = it->second;
70 if (!pinfo || pinfo->_node->n_comp(_sys.number(), _var.number()) < 1)
73 if (pinfo->_distance > 0)
75 dof_id_type slave_node_num = it->first;
76 has_penetrated.insert(slave_node_num);
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());
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
100 return pinfo->_closest_point(0) - ((*_current_node)(0) - _u_slave[_qp]);
106 PenetrationInfo * pinfo = _penetration_locator._penetration_info[_current_node->id()];
112 return ((*_current_node)(0) - pinfo->_closest_point(0)) * _test_slave[_i][_qp];
114 double slave_resid =
_residual_copy(_current_node->dof_number(0, _var.number(), 0));
115 return slave_resid * _test_master[_i][_qp];
123 double slave_jac = 0;
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:
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:
137 mooseError(
"Unhandled ConstraintJacobianType");