Compute the amount of damping.
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;