Line data Source code
1 : //* This file is part of the MOOSE framework 2 : //* https://mooseframework.inl.gov 3 : //* 4 : //* All rights reserved, see COPYRIGHT for full restrictions 5 : //* https://github.com/idaholab/moose/blob/master/COPYRIGHT 6 : //* 7 : //* Licensed under LGPL 2.1, please see LICENSE for details 8 : //* https://www.gnu.org/licenses/lgpl-2.1.html 9 : 10 : #pragma once 11 : 12 : #include "Action.h" 13 : #include "MooseTypes.h" 14 : #include "MooseEnum.h" 15 : 16 : enum class ContactModel 17 : { 18 : FRICTIONLESS, 19 : GLUED, 20 : COULOMB 21 : }; 22 : 23 : enum class ContactFormulation 24 : { 25 : RANFS, 26 : KINEMATIC, 27 : PENALTY, 28 : AUGMENTED_LAGRANGE, 29 : TANGENTIAL_PENALTY, 30 : MORTAR, 31 : MORTAR_PENALTY 32 : }; 33 : 34 : enum class ProximityMethod 35 : { 36 : NODE, 37 : CENTROID 38 : }; 39 : 40 : /** 41 : * Action class for creating constraints, kernels, and user objects necessary for mechanical 42 : * contact. 43 : */ 44 : class ContactAction : public Action 45 : { 46 : public: 47 : static InputParameters validParams(); 48 : 49 : ContactAction(const InputParameters & params); 50 : 51 : virtual void act() override; 52 : 53 : using Action::addRelationshipManagers; 54 : virtual void addRelationshipManagers(Moose::RelationshipManagerType input_rm_type) override; 55 : 56 : /** 57 : * Get contact model 58 : * @return enum 59 : */ 60 : static MooseEnum getModelEnum(); 61 : 62 : /** 63 : * Get contact formulation 64 : * @return enum 65 : */ 66 : 67 : static MooseEnum getFormulationEnum(); 68 : /** 69 : * Get contact system 70 : * @return enum 71 : */ 72 : static MooseEnum getSystemEnum(); 73 : 74 : /** 75 : * Get smoothing type 76 : * @return enum 77 : */ 78 : static MooseEnum getSmoothingEnum(); 79 : 80 : /** 81 : * Get proximity method for automatic pairing 82 : * @return enum 83 : */ 84 : static MooseEnum getProximityMethod(); 85 : 86 : /** 87 : * Define parameters used by multiple contact objects 88 : * @return InputParameters object populated with common parameters 89 : */ 90 : static InputParameters commonParameters(); 91 : 92 : protected: 93 : /// Primary/Secondary boundary name pairs for mechanical contact 94 : std::vector<std::pair<BoundaryName, BoundaryName>> _boundary_pairs; 95 : 96 : /// List of all possible boundaries for contact for automatic pairing (optional) 97 : std::vector<BoundaryName> _automatic_pairing_boundaries; 98 : 99 : /// Contact model type enum 100 : const ContactModel _model; 101 : 102 : /// Contact formulation 103 : const ContactFormulation _formulation; 104 : 105 : /// Whether to use the dual Mortar approach 106 : bool _use_dual; 107 : 108 : /// Whether to generate the mortar mesh (useful in a restart simulation e.g.). 109 : const bool _generate_mortar_mesh; 110 : 111 : /// Whether mortar dynamic contact constraints are to be used 112 : const bool _mortar_dynamics; 113 : 114 1080 : struct MortarInfo 115 : { 116 : BoundaryID primary_id; 117 : BoundaryID secondary_id; 118 : std::string uo_name; 119 : }; 120 : 121 : /// Map from boundary pair to mortar user object name 122 : std::map<std::pair<BoundaryName, BoundaryName>, const MortarInfo> _bnd_pair_to_mortar_info; 123 : 124 : private: 125 : /** 126 : * Generate mesh and other Moose objects for Mortar contact 127 : */ 128 : void addMortarContact(); 129 : /** 130 : * Generate constraints for node to face contact 131 : */ 132 : void addNodeFaceContact(); 133 : /** 134 : * Add single contact pressure auxiliary kernel for various contact action objects 135 : */ 136 : void addContactPressureAuxKernel(); 137 : /** 138 : * Remove repeated contact pairs from _boundary_pairs. 139 : */ 140 : void removeRepeatedPairs(); 141 : /** 142 : * Create contact pairs between all boundaries whose centroids are within a user-specified 143 : * distance of each other. 144 : */ 145 : void createSidesetPairsFromGeometry(); 146 : /** 147 : * Create contact pairs between all boundaries by determining that _nodes_ on both boundaries are 148 : * close enough. 149 : */ 150 : void createSidesetsFromNodeProximity(); 151 : };