PeriDEM 0.3.0
PeriDEM -- Peridynamics-based high-fidelity model for granular media
Loading...
Searching...
No Matches
contact::StickSlipPairForce Class Reference

#include <pairForce.h>

Inheritance diagram for contact::StickSlipPairForce:
Collaboration diagram for contact::StickSlipPairForce:

Data Structures

struct  Hist
 

Public Member Functions

void beginStep () override
 
void endStep () override
 
util::Point springForce (const Pair &p) override
 
- Public Member Functions inherited from contact::PairForce
virtual ~PairForce ()=default
 
virtual util::Point nodeDampingForce (const Pair &p)
 
virtual util::Point force (const Pair &p)
 

Static Private Member Functions

static std::uint64_t key (std::size_t i, std::size_t j)
 

Private Attributes

std::unordered_map< std::uint64_t, Histd_hist
 
std::size_t d_stamp = 0
 
std::mutex d_mutex
 

Detailed Description

Stick-slip tangential friction: incremental tangential spring with stiffness Kn, capped by mu * |Fn|. History is per directed pair (i,j).

Definition at line 78 of file pairForce.h.

Member Function Documentation

◆ beginStep()

void contact::StickSlipPairForce::beginStep ( )
overridevirtual

Reimplemented from contact::PairForce.

Definition at line 86 of file pairForce.cpp.

86{ ++d_stamp; }

◆ endStep()

void contact::StickSlipPairForce::endStep ( )
overridevirtual

Reimplemented from contact::PairForce.

Definition at line 88 of file pairForce.cpp.

88 {
89 std::lock_guard<std::mutex> lock(d_mutex);
90 for (auto it = d_hist.begin(); it != d_hist.end();) {
91 if (it->second.stamp != d_stamp)
92 it = d_hist.erase(it);
93 else
94 ++it;
95 }
96}
std::unordered_map< std::uint64_t, Hist > d_hist
Definition pairForce.h:93

◆ key()

static std::uint64_t contact::StickSlipPairForce::key ( std::size_t  i,
std::size_t  j 
)
inlinestaticprivate

Definition at line 89 of file pairForce.h.

89 {
90 return (static_cast<std::uint64_t>(i) << 32) ^
91 static_cast<std::uint64_t>(j);
92 }

◆ springForce()

util::Point contact::StickSlipPairForce::springForce ( const Pair p)
overridevirtual

Spring + friction contribution (force density ∝ volj).

Reimplemented from contact::PairForce.

Definition at line 98 of file pairForce.cpp.

98 {
99 const auto yji = p.yj - p.yi;
100 const auto Rji = yji.length();
101 if (!(Rji > 0.) || !util::isLess(Rji, p.deck.d_contactR))
102 return {};
103
104 auto en = yji / Rji;
105 auto scalar_f = p.deck.d_Kn * (Rji - p.deck.d_contactR) * p.volj;
106 if (scalar_f > 0.)
107 scalar_f = 0.;
108
109 util::Point f = scalar_f * en;
110 if (!p.deck.d_frictionOn)
111 return f;
112
113 const double fn_mag = -scalar_f; // scalar_f <= 0 in contact
114 if (!(fn_mag > 0.) || !(p.dt > 0.))
115 return f;
116
117 const auto vji = p.vj - p.vi;
118 auto vt = vji - (vji * en) * en;
119
120 util::Point ft_trial;
121 {
122 std::lock_guard<std::mutex> lock(d_mutex);
123 auto &hist = d_hist[key(p.i, p.j)];
124 hist.stamp = d_stamp;
125 hist.delta_t += vt * p.dt;
126 // Keep tangential history in the current tangent plane.
127 hist.delta_t -= (hist.delta_t * en) * en;
128
129 // Tangential stiffness taken equal to normal Kn (density form × volj).
130 const double Kt = p.deck.d_Kn;
131 const double kt_vol = Kt * p.volj;
132 ft_trial = hist.delta_t * (-kt_vol);
133 const double ft_mag = ft_trial.length();
134 const double ft_max = p.deck.d_mu * fn_mag;
135
136 if (util::isGreater(ft_mag, ft_max) && ft_mag > 0.) {
137 ft_trial *= (ft_max / ft_mag);
138 if (kt_vol > 0.)
139 hist.delta_t = ft_trial * (-1.0 / kt_vol);
140 }
141 }
142
143 f += ft_trial;
144 return f;
145}
static std::uint64_t key(std::size_t i, std::size_t j)
Definition pairForce.h:89
bool isGreater(const double &a, const double &b)
Returns true if a > b.
Definition function.cpp:15
bool isLess(const double &a, const double &b)
Returns true if a < b.
Definition function.cpp:20
A structure to represent 3d vectors.
Definition point.h:30

References inp::ContactPairDeck::d_contactR, inp::ContactPairDeck::d_frictionOn, inp::ContactPairDeck::d_Kn, inp::ContactPairDeck::d_mu, contact::Pair::deck, contact::Pair::dt, contact::Pair::i, util::isGreater(), util::isLess(), contact::Pair::j, util::Point::length(), contact::Pair::vi, contact::Pair::vj, contact::Pair::volj, contact::Pair::yi, and contact::Pair::yj.

Here is the call graph for this function:

Field Documentation

◆ d_hist

std::unordered_map<std::uint64_t, Hist> contact::StickSlipPairForce::d_hist
private

Definition at line 93 of file pairForce.h.

◆ d_mutex

std::mutex contact::StickSlipPairForce::d_mutex
private

Definition at line 95 of file pairForce.h.

◆ d_stamp

std::size_t contact::StickSlipPairForce::d_stamp = 0
private

Definition at line 94 of file pairForce.h.


The documentation for this class was generated from the following files: