28#ifndef CONTACT_FUNCTIONS_H
29#define CONTACT_FUNCTIONS_H
40 const T denominator = (1 - nu1 * nu1) / E1 + (1 - nu2 * nu2) / E2;
41 return T {1} / denominator;
47 const T initialRelativeVelocityMagnitude)
50 if (initialRelativeVelocityMagnitude <= 0) {
53 return 1.5 * (1 - coefficientOfRestitution) *
54 (11 - coefficientOfRestitution) / (1 + 9 * coefficientOfRestitution) /
55 initialRelativeVelocityMagnitude;
58template <
typename T,
typename PARTICLETYPE>
62 constexpr unsigned D = PARTICLETYPE::d;
64 if constexpr (particles::access::providesContactMaterial<PARTICLETYPE>()) {
65 constexpr T factor = []() {
66 static_assert(D == 2 || D == 3,
"Only D=2 and D=3 are supported");
69 return T {0.5} * (D == 3 ? 1.7320508075688772935 : 1.4142135623730950488);
71 return factor * physDeltaX +
78 __builtin_unreachable();
85 return circumRadius - epsilon +
util::max(epsilon, contactDetectionDistance);
88template <
typename T,
typename PARTICLETYPE>
90 T
const circumRadius, T
const epsilon)
92 const T contactDetectionDistance =
97template <
typename T,
typename PARTICLETYPE>
100 using namespace descriptors;
101 auto sIndicator = particle.template getField<SURFACE, SINDICATOR>();
102 return evalCircumRadius(particle, physDeltaX, sIndicator->getCircumRadius(),
103 sIndicator->getEpsilon());
106template <
typename CONTACTTYPE>
109 contacts.erase(std::remove_if(contacts.begin(), contacts.end(),
110 [](
const CONTACTTYPE& contact) {
111 return contact.isEmpty();
116template <
typename CONTACTTYPE>
119 contact.setResponsibleRank(std::numeric_limits<int>::max());
122template <
typename CONTACTTYPE>
125 return contact.getResponsibleRank() < std::numeric_limits<int>::max();
T getEnlargementForContact(Particle< T, PARTICLETYPE > particle)
void cleanContacts(std::vector< CONTACTTYPE > &contacts)
void resetResponsibleRank(CONTACTTYPE &contact)
bool isResponsibleRankSet(CONTACTTYPE &contact)
T evalCircumRadius(T const contactDetectionDistance, T const circumRadius, T const epsilon)
constexpr T evalEffectiveYoungModulus(T E1, T E2, T nu1, T nu2)
T evalContactDetectionDistance(Particle< T, PARTICLETYPE > &particle, T const physDeltaX)
constexpr T evalDampingFactor(const T coefficientOfRestitution, const T initialRelativeVelocityMagnitude)
Calculates the damping factor according to Carvalho & Martins (2019) (10.1016/j.mechmachtheory....
cpu::simd::Pack< T > max(cpu::simd::Pack< T > rhs, cpu::simd::Pack< T > lhs)
Top level namespace for all of OpenLB.