23 params.
addParam<std::vector<BoundaryName>>(
24 "primary",
"IDs of the primary surfaces for which slip reversals should be damped");
25 params.
addParam<std::vector<BoundaryName>>(
26 "secondary",
"IDs of the secondary surfaces for which slip reversals should be damped");
28 "max_iterative_slip", std::numeric_limits<Real>::max(),
"Maximum iterative slip");
31 "min_damping_factor < 1.0",
32 "Minimum permissible value for damping factor");
35 "If previous iterations's slip is below the slip tolerance, " 36 "only damp a slip reversal if the slip magnitude is greater " 37 "than than this factor times the old slip.");
38 params.
addParam<
bool>(
"debug_output",
false,
"Output detailed debugging information");
40 "Damp the iterative solution to minimize oscillations in frictional contact " 41 "constriants between nonlinear iterations");
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)
87 for (
const auto & pl : penetration_locators)
102 info._slip_reversed =
false;
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)
157 info._incremental_slip_prev_iter -
158 (
info._incremental_slip_prev_iter *
info._normal) *
info._normal;
160 info._incremental_slip - (
info._incremental_slip *
info._normal) *
info._normal;
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();
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 " 229 bool operate_on_this_interaction =
false;
230 std::set<std::pair<int, int>>::iterator ipit;
234 operate_on_this_interaction =
true;
235 return operate_on_this_interaction;
virtual MooseMesh & mesh()=0
std::map< std::pair< BoundaryID, BoundaryID >, PenetrationLocator *> _penetration_locators
auto norm() const -> decltype(std::norm(Real()))
BoundaryID _secondary_boundary
static InputParameters validParams()
const NumericVector< Number > *const & currentSolution() const override
const Parallel::Communicator & _communicator
std::map< dof_id_type, PenetrationInfo *> & _penetration_info
std::vector< dof_id_type > _secondary_nodes
void min(const T &r, T &o, Request &req) const
unsigned int number() const
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
void mooseError(Args &&... args) const
const ConsoleStream _console
processor_id_type processor_id() const
const Elem & get(const ElemType type_in)
BoundaryID _primary_boundary
BoundaryID getBoundaryID(const BoundaryName &boundary_name) const
NearestNodeLocator & _nearest_node