11 #include "FEProblem.h"
12 #include "DisplacedProblem.h"
13 #include "AuxiliarySystem.h"
14 #include "PenetrationLocator.h"
15 #include "NearestNodeLocator.h"
23 InputParameters params = validParams<GeneralDamper>();
24 params.addRequiredParam<std::vector<int>>(
25 "master",
"IDs of the master surfaces for which slip reversals should be damped");
26 params.addRequiredParam<std::vector<int>>(
27 "slave",
"IDs of the slave surfaces for which slip reversals should be damped");
28 params.addParam<Real>(
29 "max_iterative_slip", std::numeric_limits<Real>::max(),
"Maximum iterative slip");
30 params.addRangeCheckedParam<Real>(
"min_damping_factor",
32 "min_damping_factor < 1.0",
33 "Minimum permissible value for damping factor");
34 params.addParam<Real>(
"damping_threshold_factor",
36 "If previous iterations's slip is below "
37 "the slip tolerance, only damp a slip "
38 "reversal if the slip magnitude is "
39 "greater than than this factor times "
41 params.addParam<
bool>(
"debug_output",
false,
"Output detailed debugging information");
46 : GeneralDamper(parameters),
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<int> master = parameters.get<std::vector<int>>(
"master");
64 std::vector<int> slave = parameters.get<std::vector<int>>(
"slave");
66 unsigned int num_interactions = master.size();
67 if (num_interactions != slave.size())
68 mooseError(
"Sizes of master surface and slave surface lists must match in ContactSlipDamper");
69 if (num_interactions == 0)
70 mooseError(
"Must define at least one master/slave pair in ContactSlipDamper");
72 for (
unsigned int i = 0; i < master.size(); ++i)
74 std::pair<int, int> ms_pair(master[i], slave[i]);
82 GeometricSearchData & displaced_geom_search_data =
_displaced_problem->geomSearchData();
83 std::map<std::pair<unsigned int, unsigned int>, PenetrationLocator *> * penetration_locators =
84 &displaced_geom_search_data._penetration_locators;
86 for (
pl_iterator plit = penetration_locators->begin(); plit != penetration_locators->end();
89 PenetrationLocator & pen_loc = *plit->second;
93 std::vector<dof_id_type> & slave_nodes = pen_loc._nearest_node._slave_nodes;
95 for (
unsigned int i = 0; i < slave_nodes.size(); i++)
97 dof_id_type slave_node_num = slave_nodes[i];
99 if (pen_loc._penetration_info[slave_node_num])
101 PenetrationInfo & info = *pen_loc._penetration_info[slave_node_num];
102 const Node * node = info._node;
104 if (node->processor_id() == processor_id())
107 info._slip_reversed =
false;
116 const NumericVector<Number> & )
130 GeometricSearchData & displaced_geom_search_data =
_displaced_problem->geomSearchData();
131 std::map<std::pair<unsigned int, unsigned int>, PenetrationLocator *> * penetration_locators =
132 &displaced_geom_search_data._penetration_locators;
134 for (
pl_iterator plit = penetration_locators->begin(); plit != penetration_locators->end();
137 PenetrationLocator & pen_loc = *plit->second;
141 std::vector<dof_id_type> & slave_nodes = pen_loc._nearest_node._slave_nodes;
143 for (
unsigned int i = 0; i < slave_nodes.size(); i++)
145 dof_id_type slave_node_num = slave_nodes[i];
147 if (pen_loc._penetration_info[slave_node_num])
149 PenetrationInfo & info = *pen_loc._penetration_info[slave_node_num];
150 const Node * node = info._node;
152 if (node->processor_id() == processor_id())
154 if (info.isCaptured())
157 if (info._mech_status == PenetrationInfo::MS_STICKING)
159 else if (info._mech_status == PenetrationInfo::MS_SLIPPING)
161 else if (info._mech_status == PenetrationInfo::MS_SLIPPING_FRICTION)
163 if (info._stick_locked_this_step >= 2)
166 RealVectorValue tangential_inc_slip_prev_iter =
167 info._incremental_slip_prev_iter -
168 (info._incremental_slip_prev_iter * info._normal) * info._normal;
169 RealVectorValue tangential_inc_slip =
170 info._incremental_slip - (info._incremental_slip * info._normal) * info._normal;
172 RealVectorValue tangential_it_slip =
173 tangential_inc_slip - tangential_inc_slip_prev_iter;
174 Real node_damping_factor = 1.0;
175 if ((tangential_inc_slip_prev_iter * tangential_inc_slip < 0.0) &&
176 info._mech_status == PenetrationInfo::MS_SLIPPING_FRICTION)
178 info._slip_reversed =
true;
180 Real prev_iter_slip_mag = tangential_inc_slip_prev_iter.norm();
181 RealVectorValue prev_iter_slip_dir =
182 tangential_inc_slip_prev_iter / prev_iter_slip_mag;
183 Real cur_it_slip_in_old_dir = tangential_it_slip * prev_iter_slip_dir;
185 if (prev_iter_slip_mag > info._slip_tol ||
187 node_damping_factor =
188 1.0 - (cur_it_slip_in_old_dir + prev_iter_slip_mag) / cur_it_slip_in_old_dir;
190 if (node_damping_factor < 0.0)
191 mooseError(
"Damping factor can't be negative");
198 node_damping_factor =
202 _console <<
"Damping node: " << node->id()
203 <<
" prev iter slip: " << info._incremental_slip_prev_iter
204 <<
" curr iter slip: " << info._incremental_slip
205 <<
" slip_tol: " << info._slip_tol
206 <<
" damping factor: " << node_damping_factor <<
"\n";
208 if (node_damping_factor < damping)
209 damping = node_damping_factor;
216 _console << std::flush;
223 _communicator.min(damping);
225 _console <<
" ContactSlipDamper: Damping #Cont #Stick #Slip #SlipFric #StickLock "
228 _console << std::right << std::setw(29) << damping << std::setw(10) <<
_num_contact_nodes
232 _console << std::flush;
240 bool operate_on_this_interaction =
false;
241 std::set<std::pair<int, int>>::iterator ipit;
242 std::pair<int, int> ms_pair(pen_loc._master_boundary, pen_loc._slave_boundary);
245 operate_on_this_interaction =
true;
246 return operate_on_this_interaction;