https://mooseframework.inl.gov
Loading...
Searching...
No Matches
Public Types | Public Member Functions | Static Public Member Functions | Public Attributes | Static Public Attributes | Protected Types | Protected Member Functions | Protected Attributes | Private Member Functions | Static Private Member Functions | Private 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
 
std::shared_ptr< MooseObjectgetSharedPtr ()
 
std::shared_ptr< const MooseObjectgetSharedPtr () const
 
bool isKokkosObject () const
 
MooseAppgetMooseApp () const
 
const std::string & type () const
 
const std::string & name () const
 
std::string typeAndName () const
 
MooseObjectParameterName uniqueParameterName (const std::string &parameter_name) const
 
MooseObjectName uniqueName () const
 
const InputParametersparameters () const
 
const hit::Node * getHitNode () const
 
bool hasBase () const
 
const std::string & getBase () const
 
const TgetParam (const std::string &name) const
 
std::vector< std::pair< T1, T2 > > getParam (const std::string &param1, const std::string &param2) const
 
const TqueryParam (const std::string &name) const
 
const TgetRenamedParam (const std::string &old_name, const std::string &new_name) const
 
T getCheckedPointerParam (const std::string &name, const std::string &error_string="") const
 
bool isParamValid (const std::string &name) const
 
bool isParamSetByUser (const std::string &name) const
 
void connectControllableParams (const std::string &parameter, const std::string &object_type, const std::string &object_name, const std::string &object_parameter) const
 
void paramError (const std::string &param, Args... args) const
 
void paramWarning (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
 
std::string messagePrefix (const bool hit_prefix=true) const
 
std::string errorPrefix (const std::string &) const
 
void mooseError (Args &&... args) const
 
void mooseDocumentedError (const std::string &repo_name, const unsigned int issue_num, Args &&... args) const
 
void mooseErrorNonPrefixed (Args &&... args) const
 
void mooseWarning (Args &&... args) const
 
void mooseWarning (Args &&... args) const
 
void mooseWarningNonPrefixed (Args &&... args) const
 
void mooseWarningNonPrefixed (Args &&... args) const
 
void mooseDeprecated (Args &&... args) const
 
void mooseDeprecated (Args &&... args) const
 
void mooseDeprecatedNoTrace (Args &&... args) const
 
void mooseInfo (Args &&... args) const
 
void callMooseError (std::string msg, const bool with_prefix, const hit::Node *node=nullptr, const bool show_trace=true) const
 
std::string getDataFileName (const std::string &param) const
 
std::string getDataFileNameByName (const std::string &relative_path) const
 
std::string getDataFilePath (const std::string &relative_path) 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 ()
 
static void callMooseError (MooseApp *const app, const InputParameters &params, std::string msg, const bool with_prefix, const hit::Node *node, const bool show_trace=true)
 

Public Attributes

 usingCombinedWarningSolutionWarnings
 
const ConsoleStream _console
 

Static Public Attributes

static const std::string type_param
 
static const std::string name_param
 
static const std::string unique_name_param
 
static const std::string app_param
 
static const std::string moose_base_param
 
static const std::string kokkos_object_param
 

Protected Types

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

Protected Member Functions

virtual Real computeDamping (const NumericVector< Number > &solution, const NumericVector< Number > &update)
 Compute the amount of damping.
 
bool operateOnThisInteraction (const PenetrationLocator &pen_loc)
 Determine whether the damper should operate on the interaction corresponding to the supplied PenetrationLocator.
 
void flagInvalidSolutionInternal (const InvalidSolutionID invalid_solution_id) const
 
InvalidSolutionID registerInvalidSolutionInternal (const std::string &message, const bool warning) const
 
TdeclareRestartableData (const std::string &data_name, Args &&... args)
 
ManagedValue< TdeclareManagedRestartableDataWithContext (const std::string &data_name, void *context, Args &&... args)
 
const TgetRestartableData (const std::string &data_name) const
 
TdeclareRestartableDataWithContext (const std::string &data_name, void *context, Args &&... args)
 
TdeclareRecoverableData (const std::string &data_name, Args &&... args)
 
TdeclareRestartableDataWithObjectName (const std::string &data_name, const std::string &object_name, Args &&... args)
 
TdeclareRestartableDataWithObjectNameWithContext (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
 
Factory_factory
 
ActionFactory_action_factory
 
const std::string & _type
 
const std::string & _name
 
const InputParameters_pars
 
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
 

Private Member Functions

RestartableDataValueregisterRestartableDataOnApp (std::unique_ptr< RestartableDataValue > data, THREAD_ID tid) const
 
void registerRestartableNameWithFilterOnApp (const std::string &name, Moose::RESTARTABLE_FILTER filter)
 
RestartableData< T > & declareRestartableDataHelper (const std::string &data_name, void *context, Args &&... args) const
 

Static Private Member Functions

static const hit::Node * getHitNode (const InputParameters &params)
 
static std::string messagePrefix (const InputParameters &params, const bool hit_prefix)
 

Private Attributes

const ParallelParamObject_parent
 
const MooseBase_si_moose_base
 
const FEProblemBase_si_problem
 
ExecFlagEnum _empty_execute_enum
 
const RestartableDataMapName _metaname
 
std::string _restartable_name
 

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<unsignedint,unsignedint>,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()),
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{
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())
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}
MooseSharedPointer< DisplacedProblem > _displaced_problem
std::set< std::pair< int, int > > _interactions
AuxiliarySystem & _aux_sys
SubProblem & _subproblem
std::vector< std::pair< R1, R2 > > get(const std::string &param1, const std::string &param2) const
const InputParameters & parameters() const
void mooseError(Args &&... args) const
BoundaryID getBoundaryID(const BoundaryName &boundary_name) const
virtual MooseMesh & mesh()=0

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
121 _num_sticking = 0;
122 _num_slipping = 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)
149 else if (info._mech_status == PenetrationInfo::MS_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}
const NumericVector< Number > *const & currentSolution() const override
const ConsoleStream _console
bool operateOnThisInteraction(const PenetrationLocator &pen_loc)
Determine whether the damper should operate on the interaction corresponding to the supplied Penetrat...
SystemBase & _sys
std::map< std::pair< BoundaryID, BoundaryID >, PenetrationLocator * > _penetration_locators
std::map< dof_id_type, PenetrationInfo * > & _penetration_info
unsigned int number() const
void min(const T &r, T &o, Request &req) const
const Parallel::Communicator & _communicator
processor_id_type processor_id() const
MPI_Info info
if(subdm)
VectorValue< Real > RealVectorValue
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real

◆ 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.

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}
BoundaryID _secondary_boundary
BoundaryID _primary_boundary

Referenced by computeDamping(), and timestepSetup().

◆ 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}

◆ 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");
40 "Damp the iterative solution to minimize oscillations in frictional contact "
41 "constriants between nonlinear iterations");
42 return params;
43}
static InputParameters validParams()
void addParam(const std::string &name, const std::initializer_list< typename T::value_type > &value, const std::string &doc_string)
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: