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 48622 : CreateMooseEnumClass(ContactModel, FRICTIONLESS, GLUED, COULOMB); 17 59917 : CreateMooseEnumClass(ContactFormulation, 18 : RANFS, 19 : KINEMATIC, 20 : PENALTY, 21 : AUGMENTED_LAGRANGE, 22 : TANGENTIAL_PENALTY, 23 : MORTAR, 24 : MORTAR_PENALTY); 25 8994 : CreateMooseEnumClass(ProximityMethod, NODE, CENTROID); 26 : 27 : /** 28 : * Action class for creating constraints, kernels, and user objects necessary for mechanical 29 : * contact. 30 : */ 31 : class ContactAction : public Action 32 : { 33 : public: 34 : static InputParameters validParams(); 35 : 36 : ContactAction(const InputParameters & params); 37 : 38 : virtual void act() override; 39 : 40 : using Action::addRelationshipManagers; 41 : virtual void addRelationshipManagers(Moose::RelationshipManagerType input_rm_type) override; 42 : 43 : /** 44 : * Get contact model 45 : * @return enum 46 : */ 47 : static MooseEnum getModelEnum(); 48 : 49 : /** 50 : * Get contact formulation 51 : * @return enum 52 : */ 53 : 54 : static MooseEnum getFormulationEnum(); 55 : /** 56 : * Get contact system 57 : * @return enum 58 : */ 59 : static MooseEnum getSystemEnum(); 60 : 61 : /** 62 : * Get smoothing type 63 : * @return enum 64 : */ 65 : static MooseEnum getSmoothingEnum(); 66 : 67 : /** 68 : * Get proximity method for automatic pairing 69 : * @return enum 70 : */ 71 : static MooseEnum getProximityMethod(); 72 : 73 : /** 74 : * Define parameters used by multiple contact objects 75 : * @return InputParameters object populated with common parameters 76 : */ 77 : static InputParameters commonParameters(); 78 : 79 : protected: 80 : /// Primary/Secondary boundary name pairs for mechanical contact 81 : std::vector<std::pair<BoundaryName, BoundaryName>> _boundary_pairs; 82 : 83 : /// List of all possible boundaries for contact for automatic pairing (optional) 84 : std::vector<BoundaryName> _automatic_pairing_boundaries; 85 : 86 : /// Contact model type enum 87 : const ContactModel _model; 88 : 89 : /// Contact formulation 90 : const ContactFormulation _formulation; 91 : 92 : /// Whether to use the dual Mortar approach 93 : bool _use_dual; 94 : 95 : /// Whether to generate the mortar mesh (useful in a restart simulation e.g.). 96 : const bool _generate_mortar_mesh; 97 : 98 : /// Whether mortar dynamic contact constraints are to be used 99 : const bool _mortar_dynamics; 100 : 101 646 : struct MortarInfo 102 : { 103 : BoundaryID primary_id; 104 : BoundaryID secondary_id; 105 : std::string uo_name; 106 : }; 107 : 108 : /// Map from boundary pair to mortar user object name 109 : std::map<std::pair<BoundaryName, BoundaryName>, const MortarInfo> _bnd_pair_to_mortar_info; 110 : 111 : private: 112 : /** 113 : * Generate mesh and other Moose objects for Mortar contact 114 : */ 115 : void addMortarContact(); 116 : /** 117 : * Generate constraints for node to face contact 118 : */ 119 : void addNodeFaceContact(); 120 : /** 121 : * Add single contact pressure auxiliary kernel for various contact action objects 122 : */ 123 : void addContactPressureAuxKernel(); 124 : /** 125 : * Remove repeated contact pairs from _boundary_pairs. 126 : */ 127 : void removeRepeatedPairs(); 128 : /** 129 : * Create contact pairs between all boundaries whose centroids are within a user-specified 130 : * distance of each other. 131 : */ 132 : void createSidesetPairsFromGeometry(); 133 : /** 134 : * Create contact pairs between all boundaries by determining that _nodes_ on both boundaries are 135 : * close enough. 136 : */ 137 : void createSidesetsFromNodeProximity(); 138 : };