In Chrono, there are different contact force models, and the computation is different when you use material-based property (Young's modulus, CoR and Poisson ratio) or user-input values.
Hertz contact force model refers to the elastic component of the normal force, because Hertz assumes that contact area is circular, bodies in contact are elastic, using elasticity theory, he derives that contact force is proportional to the 1.5 power of penetration (delta in the code). When the model is applied to SMC, researchers need a way to dissipate energy during the contact. Quite a few models are developed over the years to model the dissipation part (see Table 3.1 in this
book).
In your screenshot, the first method is originally proposed by
Tsuji, the second one is from
Silbert. Both are highly cited paper that Chrono used as reference. The first one use sqrt of mass times stiffness, to mimic a critical damping scenario (recall for a one DOF mass-spring-damper system, critical damping ensures mass returns to equilibrium in the shortest amount of time) This is desired in SMC simulation. For the second model, my understanding is that, since the model does not call for CoR, they use mass*velocity to model the change in momentum during the impact. If you are interested in the constitutive law of contact force models, these two papers have a thorough review on
normal and
tangential force models.
Now on the implementation side of things.... In Chrono, when you initialize ChSystemSMC, the default is that material-based parameters are used. If you don't assign any material properties, this is what's being set as default:
ChMaterialSurfaceSMC::ChMaterialSurfaceSMC()
: ChMaterialSurface(),
young_modulus(2e5),
poisson_ratio(0.3f),
constant_adhesion(0),
adhesionMultDMT(0),
adhesionSPerko(0),
kn(2e5),
kt(2e5),
gn(40),
gt(20) {}
Since contact is between a pair of bodies, if you have different materials, some strategies are used to "combine" the properties.
virtual float CombineStiffnessCoefficient(float a1, float a2) const { return (a1 + a2) / 2; }
virtual float CombineDampingCoefficient(float a1, float a2) const { return (a1 + a2) / 2; }
In ChContactSMC.h,
mat.gn and
mat.gt is the value after coefficients are being "combined", which enters force calculation. When you use GetGt(), as an API, what's being returned is the gt of one type of material you set up as a user. If you've never assigned gt to the material, the default is 20. Of course, you have the freedom to modify the "combine strategy" however you want.
Thank you,
Luning