ContactForceT_SpringSlider class

Contents

Description

This is a sub-class of the ContactForceT class for the implementation of the Spring-Slider tangent contact force model.

This model assumes that the tangent contact force has an elastic component $F_{t}^{e}$, provided by a linear spring, and a friction component $F_{t}^{f}$, provided by a slider, which limits the total force according to Coulomb law.

$$\left \{ F_{t} \right \} = min\left ( F_{t}^{e},F_{t}^{f} \right ) \{-\hat{t}\}$$

$$F_{t}^{e} = K_{t} \delta_{t}$$

$$F_{t}^{f} = \mu \left | F_{n} \right |$$

The tangent stiffness coefficient $K_{t}$ can be computed as a function of the normal stiffness coefficient $K_{n}$ and the effective Poisson ratio $\nu_{eff}$:

$$K_{t} = \frac{1-\nu_{eff}}{1-\frac{\nu_{eff}}{2}}K_{n}$$

The friction coefficient $\mu$ must be provided.

Notation:

$\hat{t}$: Tangent direction between elements

$\delta_{t}$: Tangent overlap

$\dot{\delta_{t}}$: Time rate of change of tangent overlap

$F_{n}$: Normal contact force vector

References:

classdef ContactForceT_SpringSlider < ContactForceT

Public properties

    properties (SetAccess = public, GetAccess = public)
        % Formulation options
        auto_stiff logical = logical.empty;   % flag for computing stiffness coefficient automatically

        % Contact parameters
        stiff double = double.empty;   % stiffness coefficient
        fric  double = double.empty;   % friction coefficient
    end

Constructor method

    methods
        function this = ContactForceT_SpringSlider()
            this = this@ContactForceT(ContactForceT.SPRING_SLIDER);
            this = this.setDefaultProps();
        end
    end

Public methods: implementation of super-class declarations

    methods
        %------------------------------------------------------------------
        function this = setDefaultProps(this)
            this.auto_stiff = true;
        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
        end

        %------------------------------------------------------------------
        function this = evalForce(this,int)
            % Force modulus (elastic and friction contributions)
            fe = this.stiff * int.kinemat.ovlp_t;
            if (~isempty(int.cforcen))
                ff = this.fric * norm(int.cforcen.total_force);
            else
                ff = 0;
            end

            % Limit elastic force by Coulomb law
            f = min(abs(fe),abs(ff));

            % Total tangential force vector (against deformation and motion)
            this.total_force = -f * int.kinemat.dir_t;
        end
    end
end