24#ifndef CONTACT_PROPERTIES_HH
25#define CONTACT_PROPERTIES_HH
35template <
typename T,
unsigned N,
bool ENABLE_RANGE_CHECK>
36constexpr inline unsigned
37ContactProperties<T, N, ENABLE_RANGE_CHECK>::getIndex(
unsigned materialA,
38 unsigned materialB)
const
40 const unsigned minMat {
util::min(materialA, materialB)};
41 const unsigned maxMat {
util::max(materialA, materialB)};
42 const unsigned index {(maxMat + 1) * maxMat / 2 + minMat};
45 if constexpr (ENABLE_RANGE_CHECK) {
47 "ERROR: ContactProperties material is not defined");
53template <
typename T,
unsigned N,
bool ENABLE_RANGE_CHECK>
55 const unsigned materialA,
const unsigned materialB,
56 const T effectiveYoungsModulus,
const T coefficientOfRestitution,
57 const T coefficientKineticFriction,
const T coefficientStaticFriction,
58 const T staticKineticTransitionVelocity)
60 if (materialA >= N || materialB >= N) {
61 std::cerr <<
"WARNING: At least one of the provided materials exceeds the "
62 "total number of materials."
66 data[getIndex(materialA, materialB)] =
68 coefficientKineticFriction, coefficientStaticFriction,
69 staticKineticTransitionVelocity);
72template <
typename T,
unsigned N,
bool ENABLE_RANGE_CHECK>
75 const unsigned materialA,
const unsigned materialB)
const
77 return data[getIndex(materialA, materialB)].effectiveYoungsModulus;
80template <
typename T,
unsigned N,
bool ENABLE_RANGE_CHECK>
83 const unsigned materialA,
const unsigned materialB)
const
85 return data[getIndex(materialA, materialB)].coefficientOfRestitution;
88template <
typename T,
unsigned N,
bool ENABLE_RANGE_CHECK>
91 const unsigned materialA,
const unsigned materialB)
const
93 return data[getIndex(materialA, materialB)].coefficientOfKineticFriction;
96template <
typename T,
unsigned N,
bool ENABLE_RANGE_CHECK>
99 const unsigned materialA,
const unsigned materialB)
const
101 return data[getIndex(materialA, materialB)].coefficientOfStaticFriction;
104template <
typename T,
unsigned N,
bool ENABLE_RANGE_CHECK>
107 const unsigned materialA,
const unsigned materialB)
const
109 return data[getIndex(materialA, materialB)].staticKineticTransitionVelocity;
cpu::simd::Pack< T > min(cpu::simd::Pack< T > rhs, cpu::simd::Pack< T > lhs)
cpu::simd::Pack< T > max(cpu::simd::Pack< T > rhs, cpu::simd::Pack< T > lhs)
Top level namespace for all of OpenLB.
#define OLB_ASSERT(COND, MESSAGE)
constexpr T getKineticFrictionCoefficient(const unsigned materialA, const unsigned materialB) const
Get coefficient of kinetic friction.
constexpr T getStaticKineticTransitionVelocity(const unsigned materialA, const unsigned materialB) const
Get transition velocity (static to kinetic)
constexpr T getStaticFrictionCoefficient(const unsigned materialA, const unsigned materialB) const
Get coefficient of static friction.
constexpr void set(const unsigned materialA, const unsigned materialB, const T effectiveYoungsModulus, const T coefficientOfRestitution, const T coefficientKineticFriction, const T coefficientStaticFriction, const T staticKineticTransitionVelocity=T {0.01})
Set contact properties.
constexpr T getCoefficientOfRestitution(const unsigned materialA, const unsigned materialB) const
Get damping constant.
constexpr T getEffectiveYoungsModulus(const unsigned materialA, const unsigned materialB) const
Get effective modulus of elasticity.