ContactForceT_SDSLinear class
Contents
Description
This is a sub-class of the ContactForceT class for the implementation of the Linear Spring-Dashpot-Slider tangent contact force model.
This model assumes that the tangent contact force has an elastic component
, provided by a linear spring, a viscous component
, provided by a linear dashpot, and a friction component
, provided by a slider, which limits the total force according to Coulomb law.




The tangent stiffness coefficient
can be computed as a function of the normal stiffness coefficient
and the effective Poisson ratio
:

The tangent damping coefficient
can be computes as:
- If the tangent coefficient of restitution is zero:

- If the tangent coefficient of restitution is different than zero:

The tangent coefficient of restitution
and the friction coefficient
must be provided.
Notation:
: Tangent direction between elements
: Tangent overlap
: Time rate of change of tangent overlap
: Normal contact force vector
: Effective mass
References:
- R.D. Mindlin. Compliance of elastic bodies in contact, J. Appl. Mech., 16(3):259-268, 1949 (stiffness coefficient formula)
classdef ContactForceT_SDSLinear < ContactForceT
Public properties
properties (SetAccess = public, GetAccess = public)
% Formulation options
auto_stiff logical = logical.empty; % flag for computing stiffness coefficient automatically
auto_damp logical = logical.empty; % flag for computing damping coefficient automatically
% Contact parameters
stiff double = double.empty; % stiffness coefficient
damp double = double.empty; % damping coefficient
fric double = double.empty; % friction coefficient
end
Constructor method
methods
function this = ContactForceT_SDSLinear()
this = this@ContactForceT(ContactForceT.SDS_LINEAR);
this = this.setDefaultProps();
end
end
Public methods: implementation of super-class declarations
methods
%------------------------------------------------------------------
function this = setDefaultProps(this)
this.auto_stiff = true;
this.auto_damp = false;
end
%------------------------------------------------------------------
function this = setCteParams(this,int)
if (this.auto_stiff)
if (~isempty(int.cforcen))
% Assumption: average poisson ratio
this.stiff = (1-int.avg_poisson)/(1-int.avg_poisson/2) * int.cforcen.stiff;
else
this.stiff = 0;
end
end
if (this.auto_damp)
if (this.restitution == 0)
this.damp = 2 * sqrt(2 * int.eff_mass * this.stiff / 7);
else
ln = log(this.restitution);
this.damp = -2 * ln * sqrt(2 * int.eff_mass * this.stiff / 7) / sqrt(ln^2 + pi^2);
end
end
end
%------------------------------------------------------------------
function this = evalForce(this,int)
% Force modulus (viscoelastic and friction contributions)
fe = this.stiff * int.kinemat.ovlp_t;
fv = this.damp * int.kinemat.vel_t;
if (~isempty(int.cforcen))
ff = this.fric * norm(int.cforcen.total_force);
else
ff = 0;
end
% Limit viscoelastic force by Coulomb law
f = min(abs(fe+fv),abs(ff));
% Total tangential force vector (against deformation and motion)
this.total_force = -f * int.kinemat.dir_t;
end
end
end