www.mooseframework.org
Public Types | Public Member Functions | Static Public Member Functions | Public Attributes | Protected Types | Protected Member Functions | Protected Attributes | List of all members
ContactSlipDamper Class Reference

Simple constant damper. More...

#include <ContactSlipDamper.h>

Inheritance diagram for ContactSlipDamper:
[legend]

Public Types

typedef DataFileName DataFileParameterType
 

Public Member Functions

 ContactSlipDamper (const InputParameters &parameters)
 
virtual void timestepSetup ()
 
void checkMinDamping (const Real cur_damping) const
 
virtual bool enabled () const
 
MooseAppgetMooseApp () const
 
const std::string & type () const
 
virtual const std::string & name () const
 
std::string typeAndName () const
 
std::string errorPrefix (const std::string &error_type) const
 
void callMooseError (std::string msg, const bool with_prefix) const
 
MooseObjectParameterName uniqueParameterName (const std::string &parameter_name) const
 
const InputParametersparameters () const
 
MooseObjectName uniqueName () const
 
const T & getParam (const std::string &name) const
 
std::vector< std::pair< T1, T2 > > getParam (const std::string &param1, const std::string &param2) const
 
const T & getRenamedParam (const std::string &old_name, const std::string &new_name) const
 
getCheckedPointerParam (const std::string &name, const std::string &error_string="") const
 
bool isParamValid (const std::string &name) const
 
bool isParamSetByUser (const std::string &nm) const
 
void paramError (const std::string &param, Args... args) const
 
void paramWarning (const std::string &param, Args... args) const
 
void paramInfo (const std::string &param, Args... args) const
 
void connectControllableParams (const std::string &parameter, const std::string &object_type, const std::string &object_name, const std::string &object_parameter) const
 
void mooseError (Args &&... args) const
 
void mooseErrorNonPrefixed (Args &&... args) const
 
void mooseWarning (Args &&... args) const
 
void mooseWarningNonPrefixed (Args &&... args) const
 
void mooseDeprecated (Args &&... args) const
 
void mooseInfo (Args &&... args) const
 
std::string getDataFileName (const std::string &param) const
 
std::string getDataFileNameByName (const std::string &name, const std::string *param=nullptr) const
 
virtual void initialSetup ()
 
virtual void jacobianSetup ()
 
virtual void residualSetup ()
 
virtual void subdomainSetup ()
 
virtual void customSetup (const ExecFlagType &)
 
const ExecFlagEnumgetExecuteOnEnum () const
 
virtual void meshChanged ()
 
const Parallel::Communicator & comm () const
 
processor_id_type n_processors () const
 
processor_id_type processor_id () const
 

Static Public Member Functions

static InputParameters validParams ()
 

Public Attributes

const ConsoleStream _console
 

Protected Types

typedef std::map< std::pair< unsigned int, unsigned int >, PenetrationLocator * >::iterator pl_iterator
 Convenient typedef for frequently used iterator. More...
 

Protected Member Functions

virtual Real computeDamping (const NumericVector< Number > &solution, const NumericVector< Number > &update)
 Compute the amount of damping. More...
 
bool operateOnThisInteraction (const PenetrationLocator &pen_loc)
 Determine whether the damper should operate on the interaction corresponding to the supplied PenetrationLocator. More...
 
T & declareRestartableData (const std::string &data_name, Args &&... args)
 
ManagedValue< T > declareManagedRestartableDataWithContext (const std::string &data_name, void *context, Args &&... args)
 
const T & getRestartableData (const std::string &data_name) const
 
T & declareRestartableDataWithContext (const std::string &data_name, void *context, Args &&... args)
 
T & declareRecoverableData (const std::string &data_name, Args &&... args)
 
T & declareRestartableDataWithObjectName (const std::string &data_name, const std::string &object_name, Args &&... args)
 
T & declareRestartableDataWithObjectNameWithContext (const std::string &data_name, const std::string &object_name, void *context, Args &&... args)
 
std::string restartableName (const std::string &data_name) const
 

Protected Attributes

AuxiliarySystem_aux_sys
 
MooseSharedPointer< DisplacedProblem_displaced_problem
 
std::set< std::pair< int, int > > _interactions
 
int _num_contact_nodes
 
int _num_sticking
 
int _num_slipping
 
int _num_slipping_friction
 
int _num_stick_locked
 
int _num_slip_reversed
 
Real _max_iterative_slip
 
Real _min_damping_factor
 
Real _damping_threshold_factor
 
bool _debug_output
 
SubProblem_subproblem
 
SystemBase_sys
 
const Real_min_damping
 
const bool & _enabled
 
MooseApp_app
 
const std::string _type
 
const std::string _name
 
const InputParameters_pars
 
Factory_factory
 
ActionFactory_action_factory
 
const ExecFlagEnum_execute_enum
 
const ExecFlagType_current_execute_flag
 
MooseApp_restartable_app
 
const std::string _restartable_system_name
 
const THREAD_ID _restartable_tid
 
const bool _restartable_read_only
 
FEProblemBase_mci_feproblem
 
const Parallel::Communicator & _communicator
 

Detailed Description

Simple constant damper.

Modifies the non-linear step by applying a constant damping factor

Definition at line 25 of file ContactSlipDamper.h.

Member Typedef Documentation

◆ pl_iterator

typedef std::map<std::pair<unsigned int, unsigned int>, PenetrationLocator *>::iterator ContactSlipDamper::pl_iterator
protected

Convenient typedef for frequently used iterator.

Definition at line 65 of file ContactSlipDamper.h.

Constructor & Destructor Documentation

◆ ContactSlipDamper()

ContactSlipDamper::ContactSlipDamper ( const InputParameters parameters)

Definition at line 45 of file ContactSlipDamper.C.

47  _aux_sys(parameters.get<FEProblemBase *>("_fe_problem_base")->getAuxiliarySystem()),
48  _displaced_problem(parameters.get<FEProblemBase *>("_fe_problem_base")->getDisplacedProblem()),
50  _num_sticking(0),
51  _num_slipping(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"))
59 {
60  if (!_displaced_problem)
61  mooseError("Must have displaced problem to use ContactSlipDamper");
62 
63  std::vector<BoundaryName> primary = getParam<std::vector<BoundaryName>>("primary");
64  std::vector<BoundaryName> secondary = getParam<std::vector<BoundaryName>>("secondary");
65 
66  unsigned int num_interactions = primary.size();
67  if (num_interactions != secondary.size())
68  mooseError(
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");
72 
73  for (unsigned int i = 0; i < primary.size(); ++i)
74  {
75  std::pair<int, int> ms_pair(_subproblem.mesh().getBoundaryID(primary[i]),
76  _subproblem.mesh().getBoundaryID(secondary[i]));
77  _interactions.insert(ms_pair);
78  }
79 }
virtual MooseMesh & mesh()=0
std::set< std::pair< int, int > > _interactions
std::vector< std::pair< R1, R2 > > get(const std::string &param1, const std::string &param2) const
MooseSharedPointer< DisplacedProblem > _displaced_problem
void mooseError(Args &&... args) const
const InputParameters & parameters() const
AuxiliarySystem & _aux_sys
SubProblem & _subproblem
GeneralDamper(const InputParameters &parameters)
BoundaryID getBoundaryID(const BoundaryName &boundary_name) const

Member Function Documentation

◆ computeDamping()

Real ContactSlipDamper::computeDamping ( const NumericVector< Number > &  solution,
const NumericVector< Number > &  update 
)
protectedvirtual

Compute the amount of damping.

Implements GeneralDamper.

Definition at line 109 of file ContactSlipDamper.C.

111 {
112  std::map<unsigned int, const NumericVector<Number> *> nl_soln;
113  nl_soln.emplace(_sys.number(), &solution);
114 
115  // Do new contact search to update positions of slipped nodes
116  _displaced_problem->updateMesh(nl_soln, *_aux_sys.currentSolution());
117 
118  Real damping = 1.0;
119 
120  _num_contact_nodes = 0;
121  _num_sticking = 0;
122  _num_slipping = 0;
124  _num_stick_locked = 0;
125  _num_slip_reversed = 0;
126 
127  GeometricSearchData & displaced_geom_search_data = _displaced_problem->geomSearchData();
128  const auto & penetration_locators = displaced_geom_search_data._penetration_locators;
129 
130  for (const auto & pl : penetration_locators)
131  {
132  PenetrationLocator & pen_loc = *pl.second;
133 
134  if (operateOnThisInteraction(pen_loc))
135  {
136  for (const auto & secondary_node_num : pen_loc._nearest_node._secondary_nodes)
137  if (pen_loc._penetration_info[secondary_node_num])
138  {
139  PenetrationInfo & info = *pen_loc._penetration_info[secondary_node_num];
140  const Node & node = _displaced_problem->mesh().nodeRef(secondary_node_num);
141 
142  if (node.processor_id() == processor_id())
143  {
144  if (info.isCaptured())
145  {
147  if (info._mech_status == PenetrationInfo::MS_STICKING)
148  _num_sticking++;
149  else if (info._mech_status == PenetrationInfo::MS_SLIPPING)
150  _num_slipping++;
151  else if (info._mech_status == PenetrationInfo::MS_SLIPPING_FRICTION)
153  if (info._stick_locked_this_step >= 2) // TODO get from contact interaction
155 
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;
161 
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) &&
167  {
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;
174 
175  if (prev_iter_slip_mag > info._slip_tol ||
176  cur_it_slip_in_old_dir > -_damping_threshold_factor * prev_iter_slip_mag)
177  node_damping_factor =
178  1.0 - (cur_it_slip_in_old_dir + prev_iter_slip_mag) / cur_it_slip_in_old_dir;
179 
180  if (node_damping_factor < 0.0)
181  mooseError("Damping factor can't be negative");
182 
183  if (node_damping_factor < _min_damping_factor)
184  node_damping_factor = _min_damping_factor;
185  }
186 
187  if (tangential_it_slip.norm() > _max_iterative_slip)
188  node_damping_factor =
189  (tangential_it_slip.norm() - _max_iterative_slip) / tangential_it_slip.norm();
190 
191  if (_debug_output && node_damping_factor < 1.0)
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;
197 
198  if (node_damping_factor < damping)
199  damping = node_damping_factor;
200  }
201  }
202  }
203  }
204  }
205  _console << std::flush;
212  _communicator.min(damping);
213 
214  _console << " ContactSlipDamper: Damping #Cont #Stick #Slip #SlipFric #StickLock "
215  "#SlipRev\n";
216 
217  _console << std::right << std::setw(29) << damping << std::setw(10) << _num_contact_nodes
218  << std::setw(10) << _num_sticking << std::setw(10) << _num_slipping << std::setw(10)
219  << _num_slipping_friction << std::setw(11) << _num_stick_locked << std::setw(10)
220  << _num_slip_reversed << "\n\n";
221  _console << std::flush;
222 
223  return damping;
224 }
std::map< std::pair< BoundaryID, BoundaryID >, PenetrationLocator *> _penetration_locators
auto norm() const -> decltype(std::norm(Real()))
MPI_Info info
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
MooseSharedPointer< DisplacedProblem > _displaced_problem
unsigned int number() const
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
void mooseError(Args &&... args) const
const ConsoleStream _console
AuxiliarySystem & _aux_sys
processor_id_type processor_id() const
bool operateOnThisInteraction(const PenetrationLocator &pen_loc)
Determine whether the damper should operate on the interaction corresponding to the supplied Penetrat...
SystemBase & _sys
NearestNodeLocator & _nearest_node

◆ operateOnThisInteraction()

bool ContactSlipDamper::operateOnThisInteraction ( const PenetrationLocator pen_loc)
protected

Determine whether the damper should operate on the interaction corresponding to the supplied PenetrationLocator.

Definition at line 227 of file ContactSlipDamper.C.

Referenced by computeDamping(), and timestepSetup().

228 {
229  bool operate_on_this_interaction = false;
230  std::set<std::pair<int, int>>::iterator ipit;
231  std::pair<int, int> ms_pair(pen_loc._primary_boundary, pen_loc._secondary_boundary);
232  ipit = _interactions.find(ms_pair);
233  if (ipit != _interactions.end())
234  operate_on_this_interaction = true;
235  return operate_on_this_interaction;
236 }
std::set< std::pair< int, int > > _interactions
BoundaryID _secondary_boundary
BoundaryID _primary_boundary

◆ timestepSetup()

void ContactSlipDamper::timestepSetup ( )
virtual

Reimplemented from GeneralDamper.

Definition at line 82 of file ContactSlipDamper.C.

83 {
84  GeometricSearchData & displaced_geom_search_data = _displaced_problem->geomSearchData();
85  const auto & penetration_locators = displaced_geom_search_data._penetration_locators;
86 
87  for (const auto & pl : penetration_locators)
88  {
89  PenetrationLocator & pen_loc = *pl.second;
90 
91  if (operateOnThisInteraction(pen_loc))
92  {
93  for (const auto & secondary_node_num : pen_loc._nearest_node._secondary_nodes)
94  if (pen_loc._penetration_info[secondary_node_num])
95  {
96  PenetrationInfo & info = *pen_loc._penetration_info[secondary_node_num];
97  const Node & node = _displaced_problem->mesh().nodeRef(secondary_node_num);
98 
99  if (node.processor_id() == processor_id())
100  // && info.isCaptured()) //TODO maybe just set this
101  // everywhere?
102  info._slip_reversed = false;
103  }
104  }
105  }
106 }
std::map< std::pair< BoundaryID, BoundaryID >, PenetrationLocator *> _penetration_locators
MPI_Info info
std::map< dof_id_type, PenetrationInfo *> & _penetration_info
std::vector< dof_id_type > _secondary_nodes
MooseSharedPointer< DisplacedProblem > _displaced_problem
processor_id_type processor_id() const
bool operateOnThisInteraction(const PenetrationLocator &pen_loc)
Determine whether the damper should operate on the interaction corresponding to the supplied Penetrat...
NearestNodeLocator & _nearest_node

◆ validParams()

InputParameters ContactSlipDamper::validParams ( )
static

Definition at line 20 of file ContactSlipDamper.C.

21 {
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");
27  params.addParam<Real>(
28  "max_iterative_slip", std::numeric_limits<Real>::max(), "Maximum iterative slip");
29  params.addRangeCheckedParam<Real>("min_damping_factor",
30  0.0,
31  "min_damping_factor < 1.0",
32  "Minimum permissible value for damping factor");
33  params.addParam<Real>("damping_threshold_factor",
34  1.0e3,
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");
39  params.addClassDescription(
40  "Damp the iterative solution to minimize oscillations in frictional contact "
41  "constriants between nonlinear iterations");
42  return params;
43 }
void addParam(const std::string &name, const std::initializer_list< typename T::value_type > &value, const std::string &doc_string)
static InputParameters validParams()
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
void addClassDescription(const std::string &doc_string)
void addRangeCheckedParam(const std::string &name, const T &value, const std::string &parsed_function, const std::string &doc_string)

Member Data Documentation

◆ _aux_sys

AuxiliarySystem& ContactSlipDamper::_aux_sys
protected

Definition at line 35 of file ContactSlipDamper.h.

Referenced by computeDamping().

◆ _damping_threshold_factor

Real ContactSlipDamper::_damping_threshold_factor
protected

Definition at line 60 of file ContactSlipDamper.h.

Referenced by computeDamping().

◆ _debug_output

bool ContactSlipDamper::_debug_output
protected

Definition at line 61 of file ContactSlipDamper.h.

Referenced by computeDamping().

◆ _displaced_problem

MooseSharedPointer<DisplacedProblem> ContactSlipDamper::_displaced_problem
protected

Definition at line 36 of file ContactSlipDamper.h.

Referenced by computeDamping(), ContactSlipDamper(), and timestepSetup().

◆ _interactions

std::set<std::pair<int, int> > ContactSlipDamper::_interactions
protected

Definition at line 50 of file ContactSlipDamper.h.

Referenced by ContactSlipDamper(), and operateOnThisInteraction().

◆ _max_iterative_slip

Real ContactSlipDamper::_max_iterative_slip
protected

Definition at line 58 of file ContactSlipDamper.h.

Referenced by computeDamping().

◆ _min_damping_factor

Real ContactSlipDamper::_min_damping_factor
protected

Definition at line 59 of file ContactSlipDamper.h.

Referenced by computeDamping().

◆ _num_contact_nodes

int ContactSlipDamper::_num_contact_nodes
protected

Definition at line 52 of file ContactSlipDamper.h.

Referenced by computeDamping().

◆ _num_slip_reversed

int ContactSlipDamper::_num_slip_reversed
protected

Definition at line 57 of file ContactSlipDamper.h.

Referenced by computeDamping().

◆ _num_slipping

int ContactSlipDamper::_num_slipping
protected

Definition at line 54 of file ContactSlipDamper.h.

Referenced by computeDamping().

◆ _num_slipping_friction

int ContactSlipDamper::_num_slipping_friction
protected

Definition at line 55 of file ContactSlipDamper.h.

Referenced by computeDamping().

◆ _num_stick_locked

int ContactSlipDamper::_num_stick_locked
protected

Definition at line 56 of file ContactSlipDamper.h.

Referenced by computeDamping().

◆ _num_sticking

int ContactSlipDamper::_num_sticking
protected

Definition at line 53 of file ContactSlipDamper.h.

Referenced by computeDamping().


The documentation for this class was generated from the following files: