47 _aux_sys(parameters.get<
FEProblemBase *>(
"_fe_problem_base")->getAuxiliarySystem()),
48 _displaced_problem(parameters.get<
FEProblemBase *>(
"_fe_problem_base")->getDisplacedProblem()),
49 _num_contact_nodes(0),
52 _num_slipping_friction(0),
54 _num_slip_reversed(0),
55 _max_iterative_slip(parameters.get<Real>(
"max_iterative_slip")),
56 _min_damping_factor(parameters.get<Real>(
"min_damping_factor")),
57 _damping_threshold_factor(parameters.get<Real>(
"damping_threshold_factor")),
58 _debug_output(parameters.get<bool>(
"debug_output"))
61 mooseError(
"Must have displaced problem to use ContactSlipDamper");
63 std::vector<BoundaryName> primary = getParam<std::vector<BoundaryName>>(
"primary");
64 std::vector<BoundaryName> secondary = getParam<std::vector<BoundaryName>>(
"secondary");
66 unsigned int num_interactions = primary.size();
67 if (num_interactions != secondary.size())
69 "Sizes of primary surface and secondary surface lists must match in ContactSlipDamper");
70 if (num_interactions == 0)
71 mooseError(
"Must define at least one primary/secondary pair in ContactSlipDamper");
73 for (
unsigned int i = 0; i < primary.size(); ++i)
110 const NumericVector<Number> & )
112 std::map<unsigned int, const NumericVector<Number> *> nl_soln;
130 for (
const auto & pl : penetration_locators)
144 if (info.isCaptured())
153 if (info._stick_locked_this_step >= 2)
156 RealVectorValue tangential_inc_slip_prev_iter =
157 info._incremental_slip_prev_iter -
158 (info._incremental_slip_prev_iter * info._normal) * info._normal;
159 RealVectorValue tangential_inc_slip =
160 info._incremental_slip - (info._incremental_slip * info._normal) * info._normal;
162 RealVectorValue tangential_it_slip =
163 tangential_inc_slip - tangential_inc_slip_prev_iter;
164 Real node_damping_factor = 1.0;
165 if ((tangential_inc_slip_prev_iter * tangential_inc_slip < 0.0) &&
168 info._slip_reversed =
true;
170 Real prev_iter_slip_mag = tangential_inc_slip_prev_iter.norm();
171 RealVectorValue prev_iter_slip_dir =
172 tangential_inc_slip_prev_iter / prev_iter_slip_mag;
173 Real cur_it_slip_in_old_dir = tangential_it_slip * prev_iter_slip_dir;
175 if (prev_iter_slip_mag > info._slip_tol ||
177 node_damping_factor =
178 1.0 - (cur_it_slip_in_old_dir + prev_iter_slip_mag) / cur_it_slip_in_old_dir;
180 if (node_damping_factor < 0.0)
181 mooseError(
"Damping factor can't be negative");
188 node_damping_factor =
192 _console <<
"Damping node: " << node.id()
193 <<
" prev iter slip: " << info._incremental_slip_prev_iter
194 <<
" curr iter slip: " << info._incremental_slip
195 <<
" slip_tol: " << info._slip_tol
196 <<
" damping factor: " << node_damping_factor << std::endl;
198 if (node_damping_factor < damping)
199 damping = node_damping_factor;
214 _console <<
" ContactSlipDamper: Damping #Cont #Stick #Slip #SlipFric #StickLock "