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