1 // ============================================================================= 2 // PROJECT CHRONO - http://projectchrono.org 3 // 4 // Copyright (c) 2014 projectchrono.org 5 // All rights reserved. 6 // 7 // Use of this source code is governed by a BSD-style license that can be found 8 // in the LICENSE file at the top level of the distribution and at 9 // http://projectchrono.org/license-chrono.txt. 10 // 11 // ============================================================================= 12 // Authors: Alessandro Tasora, Radu Serban 13 // ============================================================================= 14 15 #ifndef CH_MATERIALSURFACE_SMC_H 16 #define CH_MATERIALSURFACE_SMC_H 17 18 #include "chrono/physics/ChMaterialSurface.h" 19 20 namespace chrono { 21 22 /// Material data for a collision surface for use with smooth (penalty) contact method. 23 class ChApi ChMaterialSurfaceSMC : public ChMaterialSurface { 24 25 public: 26 ChMaterialSurfaceSMC(); 27 ChMaterialSurfaceSMC(const ChMaterialSurfaceSMC& other); ~ChMaterialSurfaceSMC()28 ~ChMaterialSurfaceSMC() {} 29 30 /// "Virtual" copy constructor (covariant return type). Clone()31 virtual ChMaterialSurfaceSMC* Clone() const override { return new ChMaterialSurfaceSMC(*this); } 32 GetContactMethod()33 virtual ChContactMethod GetContactMethod() const override { return ChContactMethod::SMC; } 34 35 /// Young's modulus. SetYoungModulus(float val)36 void SetYoungModulus(float val) { young_modulus = val; } GetYoungModulus()37 float GetYoungModulus() const { return young_modulus; } 38 39 // Poisson ratio. SetPoissonRatio(float val)40 void SetPoissonRatio(float val) { poisson_ratio = val; } GetPoissonRatio()41 float GetPoissonRatio() const { return poisson_ratio; } 42 43 /// Constant cohesion force. SetAdhesion(float val)44 void SetAdhesion(float val) { constant_adhesion = val; } GetAdhesion()45 float GetAdhesion() const { return constant_adhesion; } 46 47 /// Adhesion multiplier in the Derjaguin-Muller-Toporov model. 48 /// <pre> 49 /// In this model, 50 /// adhesion = adhesionMultDMT * sqrt(R_eff) 51 /// given the surface energy, w, 52 /// adhesionMultDMT = 2 * CH_C_PI * w * sqrt(R_eff) 53 /// given the equilibrium penetration distance, y_eq, 54 /// adhesionMultDMT = 4.0 / 3.0 * E_eff * powf(y_eq, 1.5) 55 /// </pre> SetAdhesionMultDMT(float val)56 void SetAdhesionMultDMT(float val) { adhesionMultDMT = val; } GetAdhesionMultDMT()57 float GetAdhesionMultDMT() const { return adhesionMultDMT; } 58 59 /// Coefficient for Perko adhesion model. 60 /// <pre> 61 /// In this model (see Perko et al., 2001), 62 /// adhesion = adhesionSPerko * R 63 /// The coefficient adhesionSPerko is function of the Hamaker constant A and a measure of cleanliness S. 64 /// For lunar regolith, 65 /// adhesionSPerko = 3.6e-2 * S^2 66 /// </pre> SetAdhesionSPerko(float val)67 void SetAdhesionSPerko(float val) { adhesionSPerko = val; } GetAdhesionSPerko()68 float GetAdhesionSPerko() const { return adhesionSPerko; } 69 70 /// Stiffness and damping coefficients SetKn(float val)71 void SetKn(float val) { kn = val; } SetKt(float val)72 void SetKt(float val) { kt = val; } SetGn(float val)73 void SetGn(float val) { gn = val; } SetGt(float val)74 void SetGt(float val) { gt = val; } 75 GetKn()76 float GetKn() const { return kn; } GetKt()77 float GetKt() const { return kt; } GetGn()78 float GetGn() const { return gn; } GetGt()79 float GetGt() const { return gt; } 80 81 /// Method to allow serialization transient data into ASCII. StreamOUT(ChStreamOutAscii & mstream)82 virtual void StreamOUT(ChStreamOutAscii& mstream) { mstream << "Material SMC \n"; } 83 84 /// Method to allow serialization of transient data to archives. 85 virtual void ArchiveOUT(ChArchiveOut& marchive) override; 86 87 /// Method to allow deserialization of transient data from archives. 88 virtual void ArchiveIN(ChArchiveIn& marchive) override; 89 90 float young_modulus; ///< Young's modulus (elastic modulus) 91 float poisson_ratio; ///< Poisson ratio 92 float constant_adhesion; ///< Constant adhesion force, when constant adhesion model is used 93 float adhesionMultDMT; ///< Adhesion multiplier used in DMT model. 94 float adhesionSPerko; ///< Adhesion multiplier used in Perko model. 95 96 float kn; ///< user-specified normal stiffness coefficient 97 float kt; ///< user-specified tangential stiffness coefficient 98 float gn; ///< user-specified normal damping coefficient 99 float gt; ///< user-specified tangential damping coefficient 100 }; 101 102 CH_CLASS_VERSION(ChMaterialSurfaceSMC, 0) 103 104 /// Composite SMC material data for a contact pair. 105 class ChApi ChMaterialCompositeSMC : public ChMaterialComposite { 106 public: 107 float E_eff; ///< Effective elasticity modulus 108 float G_eff; ///< Effective shear modulus 109 float mu_eff; ///< Effective coefficient of friction 110 float muRoll_eff; ///< Effective coefficient of rolling friction 111 float muSpin_eff; ///< Effective coefficient of spinning friction 112 float cr_eff; ///< Effective coefficient of restitution 113 float adhesion_eff; ///< Effective cohesion force 114 float adhesionMultDMT_eff; ///< Effective adhesion multiplier (DMT model) 115 float adhesionSPerko_eff; ///< Effective adhesion multiplier (Perko model) 116 117 float kn; ///< normal stiffness coefficient 118 float kt; ///< tangential stiffness coefficient 119 float gn; ///< normal viscous damping coefficient 120 float gt; ///< tangential viscuous damping coefficient 121 122 ChMaterialCompositeSMC(); 123 124 ChMaterialCompositeSMC(ChMaterialCompositionStrategy* strategy, 125 std::shared_ptr<ChMaterialSurfaceSMC> mat1, 126 std::shared_ptr<ChMaterialSurfaceSMC> mat2); 127 }; 128 129 } // end namespace chrono 130 131 #endif 132