OpenLB 1.7
Loading...
Searching...
No Matches
Static Public Member Functions | List of all members
olb::particles::contact::particle_wall< T, PARTICLETYPE, PARTICLECONTACTTYPE, WallContactArbitraryFromOverlapVolume< T, PARTICLETYPE::d, CONVEX >, BBCORRECTIONMETHOD, CONVEX, useSDF > Struct Template Reference

#include <particleContactForceFunctions.h>

+ Collaboration diagram for olb::particles::contact::particle_wall< T, PARTICLETYPE, PARTICLECONTACTTYPE, WallContactArbitraryFromOverlapVolume< T, PARTICLETYPE::d, CONVEX >, BBCORRECTIONMETHOD, CONVEX, useSDF >:

Static Public Member Functions

static void resetContainer (ContactContainer< T, PARTICLECONTACTTYPE, WallContactArbitraryFromOverlapVolume< T, PARTICLETYPE::d, CONVEX > > &contactContainer)
 
static void processCell (WallContactArbitraryFromOverlapVolume< T, PARTICLETYPE::d, CONVEX > &contact, Particle< T, PARTICLETYPE > &particle, SolidBoundary< T, PARTICLETYPE::d > &solidBoundary, Vector< T, PARTICLETYPE::d > &contactNormal, Vector< T, PARTICLETYPE::d > &center, unsigned &volumeCellCount, T &surfaceCellCount, const Vector< T, PARTICLETYPE::d > &pos, const Vector< T, PARTICLETYPE::d > &contactPhysDeltaX)
 
template<typename CONTACTPROPERTIES , typename F = decltype(defaults::processContactForce<T, PARTICLETYPE::d>)>
static void apply (std::multimap< int, std::unique_ptr< std::uint8_t[]> > &dataMap, XParticleSystem< T, PARTICLETYPE > &particleSystem, std::vector< SolidBoundary< T, PARTICLETYPE::d > > &solidBoundaries, WallContactArbitraryFromOverlapVolume< T, PARTICLETYPE::d, CONVEX > &contact, const CONTACTPROPERTIES &contactProperties, const T physDeltaX, const unsigned contactBoxResolutionPerDirection, const T k, F processContactForce=defaults::processContactForce< T, PARTICLETYPE::d >)
 
static void correctBoundingBoxNewContact (XParticleSystem< T, PARTICLETYPE > &particleSystem, std::vector< SolidBoundary< T, PARTICLETYPE::d > > &solidBoundaries, WallContactArbitraryFromOverlapVolume< T, PARTICLETYPE::d, CONVEX > &contact, const T physDeltaX, const unsigned contactBoxResolutionPerDirection)
 
static void correctBoundingBox (XParticleSystem< T, PARTICLETYPE > &particleSystem, std::vector< SolidBoundary< T, PARTICLETYPE::d > > &solidBoundaries, WallContactArbitraryFromOverlapVolume< T, PARTICLETYPE::d, CONVEX > &contact, const T physDeltaX, const unsigned contactBoxResolutionPerDirection)
 
static void correctBoundingBoxExistingContact (XParticleSystem< T, PARTICLETYPE > &particleSystem, std::vector< SolidBoundary< T, PARTICLETYPE::d > > &solidBoundaries, WallContactArbitraryFromOverlapVolume< T, PARTICLETYPE::d, CONVEX > &contact, const T physDeltaX, const unsigned contactBoxResolutionPerDirection)
 
template<typename CONTACTPROPERTIES , typename F1 = decltype(defaults::periodicity<PARTICLETYPE::d>), typename F2 = decltype(defaults::processContactForce<T, PARTICLETYPE::d>)>
static void apply (XParticleSystem< T, PARTICLETYPE > &particleSystem, std::vector< SolidBoundary< T, PARTICLETYPE::d > > &solidBoundaries, ContactContainer< T, PARTICLECONTACTTYPE, WallContactArbitraryFromOverlapVolume< T, PARTICLETYPE::d, CONVEX > > &contactContainer, const CONTACTPROPERTIES &contactProperties, const SuperGeometry< T, PARTICLETYPE::d > &sGeometry, std::multimap< int, std::unique_ptr< std::uint8_t[]> > &dataMap, const unsigned contactBoxResolutionPerDirection=8, const T k=T {4./(3 *util::sqrt(M_PI))}, F1 getSetupPeriodicity=defaults::periodicity< PARTICLETYPE::d >, F2 processContactForce=defaults::processContactForce< T, PARTICLETYPE::d >)
 

Detailed Description

template<typename T, typename PARTICLETYPE, typename PARTICLECONTACTTYPE, unsigned BBCORRECTIONMETHOD, bool CONVEX, bool useSDF>
struct olb::particles::contact::particle_wall< T, PARTICLETYPE, PARTICLECONTACTTYPE, WallContactArbitraryFromOverlapVolume< T, PARTICLETYPE::d, CONVEX >, BBCORRECTIONMETHOD, CONVEX, useSDF >

Definition at line 1228 of file particleContactForceFunctions.h.

Member Function Documentation

◆ apply() [1/2]

template<typename T , typename PARTICLETYPE , typename PARTICLECONTACTTYPE , unsigned BBCORRECTIONMETHOD, bool CONVEX, bool useSDF>
template<typename CONTACTPROPERTIES , typename F = decltype(defaults::processContactForce<T, PARTICLETYPE::d>)>
static void olb::particles::contact::particle_wall< T, PARTICLETYPE, PARTICLECONTACTTYPE, WallContactArbitraryFromOverlapVolume< T, PARTICLETYPE::d, CONVEX >, BBCORRECTIONMETHOD, CONVEX, useSDF >::apply ( std::multimap< int, std::unique_ptr< std::uint8_t[]> > & dataMap,
XParticleSystem< T, PARTICLETYPE > & particleSystem,
std::vector< SolidBoundary< T, PARTICLETYPE::d > > & solidBoundaries,
WallContactArbitraryFromOverlapVolume< T, PARTICLETYPE::d, CONVEX > & contact,
const CONTACTPROPERTIES & contactProperties,
const T physDeltaX,
const unsigned contactBoxResolutionPerDirection,
const T k,
F processContactForce = defaults::processContactForce<T, PARTICLETYPE::d> )
inlinestatic

Definition at line 1319 of file particleContactForceFunctions.h.

1328 {
1329 using namespace descriptors;
1330 constexpr unsigned D = PARTICLETYPE::d;
1331
1332 // indentation depth
1333 T indentationDepth = T(0.);
1334
1335 if (!contact.isEmpty()) {
1336 // particle and wall in contact
1337 auto particle = particleSystem.get(contact.getParticleID());
1338 SolidBoundary<T, D>& solidBoundary = solidBoundaries[contact.getWallID()];
1339
1340 // function to reset min & max of bounding box
1341 const std::function<void()> resetMinMax = [&contact]() {
1342 contact.resetMinMax();
1343 };
1344 // wrapper for cell processing to calculate contact point and normal
1345 const std::function<void(Vector<T, D>&, Vector<T, D>&, unsigned&, T&,
1346 const Vector<T, D>&, const Vector<T, D>&)>
1347 processCellWrapped =
1348 [&](Vector<T, D>& contactNormal, Vector<T, D>& center,
1349 unsigned& volumeCellCount, T& surfaceCellCount,
1350 const Vector<T, D>& physPos,
1351 const Vector<T, D>& contactPhysDeltaX) {
1352 processCell(contact, particle, solidBoundary, contactNormal,
1353 center, volumeCellCount, surfaceCellCount, physPos,
1354 contactPhysDeltaX);
1355 };
1356 // function to calculate indendation depth
1357 const std::function<T(const Vector<T, D>&, const Vector<T, D>&, const T)>
1358 calculateIndentation = [&](const Vector<T, D>& center,
1359 const Vector<T, D>& contactNormal,
1360 const T distancePrecision) {
1361 T indentation =
1363 center) +
1365 if (!util::nearZero(indentation)) {
1366 const PhysR<T, D> origin =
1367 center -
1368 contactNormal *
1371 particle, origin, contactNormal, distancePrecision);
1372 }
1373 T distToWall;
1374 if (solidBoundary.getIndicator()->distance(distToWall, center,
1375 distancePrecision,
1376 -1 * contactNormal)) {
1377 indentation +=
1378 distToWall + solidBoundary.getEnlargementForContact();
1379 }
1380#ifdef OLB_DEBUG
1381 else if (!util::nearZero(
1382 solidBoundary.getIndicator()->signedDistance(
1383 center))) {
1384 OstreamManager clout(std::cout, "forceApplication");
1385 clout << "WARNING: No distance to wall determined." << std::endl;
1386 }
1387#endif
1388 return indentation;
1389 };
1390 // function to apply force on particles
1391 const std::function<void(const Vector<T, D>&, const Vector<T, D>&, T, T)>
1392 applyForce = [&](const Vector<T, D>& center,
1393 const Vector<T, D>& contactNormal, T indentation,
1394 T overlapVolume) {
1395 const unsigned particleMaterial =
1396 particle.template getField<MECHPROPERTIES, MATERIAL>();
1397 const unsigned wallMaterial = solidBoundary.getContactMaterial();
1398
1399 indentationDepth = indentation;
1400 const Vector<T, D> relVel = evalRelativeVelocity(particle, center);
1401 const T dampingFactor = evalCurrentDampingFactor(
1402 contact,
1403 contactProperties.getCoefficientOfRestitution(particleMaterial,
1404 wallMaterial),
1405 evalRelativeNormalVelocity(contactNormal, relVel));
1406
1408 dataMap, particle, particleSystem, solidBoundary, center,
1409 contactNormal, indentation, overlapVolume, relVel,
1410 dampingFactor, contactProperties, k, contact.getParticleID(),
1411 contact.getWallID(), processContactForce);
1412 };
1413
1414 processContactViaVolume(contact.getMin(), contact.getMax(), physDeltaX,
1415 contactBoxResolutionPerDirection, resetMinMax,
1416 processCellWrapped, calculateIndentation,
1417 applyForce);
1418 }
1419 }
T getEnlargementForContact(Particle< T, PARTICLETYPE > particle)
constexpr T evalCurrentDampingFactor(CONTACTTYPE &contact, const T coefficientOfRestitution, const Vector< T, D > &initialRelativeNormalVelocity)
constexpr Vector< T, PARTICLETYPE::d > evalRelativeVelocity(Particle< T, PARTICLETYPE > &particleA, Particle< T, PARTICLETYPE > &particleB, const Vector< T, PARTICLETYPE::d > &position)
Returns the relative velocity of two particles at a defined position.
void applyForceFromOverlapVolume(std::multimap< int, std::unique_ptr< std::uint8_t[]> > &dataMap, Particle< T, PARTICLETYPE > &particleA, Particle< T, PARTICLETYPE > &particleB, XParticleSystem< T, PARTICLETYPE > &particleSystem, const PhysR< T, PARTICLETYPE::d > &contactPoint, const Vector< T, PARTICLETYPE::d > &contactNormal, const T indentation, const T overlapVolume, const Vector< T, PARTICLETYPE::d > &relVel, const T dampingFactor, const CONTACTPROPERTIES &contactProperties, T k, const std::size_t &particleAID, const std::size_t &particleBID, F processContactForce=defaults::processContactForce< T, PARTICLETYPE::d >)
constexpr Vector< T, D > evalRelativeNormalVelocity(const Vector< T, D > &contactNormal, const Vector< T, D > &relVel)
void processContactViaVolume(const Vector< T, D > &min, const Vector< T, D > &max, T physDeltaX, unsigned contactBoxResolutionPerDirection, F1 resetContactBox, F2 processCellWrapped, F3 calculateIndentation, F4 applyForce)
const S distanceToParticle(Particle< T, PARTICLETYPE > &particle, const Vector< S, PARTICLETYPE::d > &origin, const Vector< S, PARTICLETYPE::d > &direction, S precision, S pitch)
const S signedDistanceToParticle(Particle< T, PARTICLETYPE > &particle, const PhysR< S, PARTICLETYPE::d > &input)
bool nearZero(const ADf< T, DIM > &a)
Definition aDiff.h:1087
static void processCell(WallContactArbitraryFromOverlapVolume< T, PARTICLETYPE::d, CONVEX > &contact, Particle< T, PARTICLETYPE > &particle, SolidBoundary< T, PARTICLETYPE::d > &solidBoundary, Vector< T, PARTICLETYPE::d > &contactNormal, Vector< T, PARTICLETYPE::d > &center, unsigned &volumeCellCount, T &surfaceCellCount, const Vector< T, PARTICLETYPE::d > &pos, const Vector< T, PARTICLETYPE::d > &contactPhysDeltaX)

References olb::particles::contact::applyForceFromOverlapVolume(), olb::particles::resolved::distanceToParticle(), olb::particles::contact::evalCurrentDampingFactor(), olb::particles::contact::evalRelativeNormalVelocity(), olb::particles::contact::evalRelativeVelocity(), olb::SolidBoundary< T, D >::getContactMaterial(), olb::SolidBoundary< T, D >::getEnlargementForContact(), olb::particles::access::getEnlargementForContact(), olb::SolidBoundary< T, D >::getIndicator(), olb::particles::contact::WallContactArbitraryFromOverlapVolume< T, D, CONVEX >::getMax(), olb::particles::contact::WallContactArbitraryFromOverlapVolume< T, D, CONVEX >::getMin(), olb::particles::contact::WallContactArbitraryFromOverlapVolume< T, D, CONVEX >::getParticleID(), olb::particles::contact::WallContactArbitraryFromOverlapVolume< T, D, CONVEX >::getWallID(), olb::particles::contact::WallContactArbitraryFromOverlapVolume< T, D, CONVEX >::isEmpty(), olb::util::nearZero(), olb::particles::contact::processCell(), olb::particles::contact::processContactViaVolume(), olb::particles::contact::WallContactArbitraryFromOverlapVolume< T, D, CONVEX >::resetMinMax(), and olb::particles::resolved::signedDistanceToParticle().

+ Here is the call graph for this function:

◆ apply() [2/2]

template<typename T , typename PARTICLETYPE , typename PARTICLECONTACTTYPE , unsigned BBCORRECTIONMETHOD, bool CONVEX, bool useSDF>
template<typename CONTACTPROPERTIES , typename F1 = decltype(defaults::periodicity<PARTICLETYPE::d>), typename F2 = decltype(defaults::processContactForce<T, PARTICLETYPE::d>)>
static void olb::particles::contact::particle_wall< T, PARTICLETYPE, PARTICLECONTACTTYPE, WallContactArbitraryFromOverlapVolume< T, PARTICLETYPE::d, CONVEX >, BBCORRECTIONMETHOD, CONVEX, useSDF >::apply ( XParticleSystem< T, PARTICLETYPE > & particleSystem,
std::vector< SolidBoundary< T, PARTICLETYPE::d > > & solidBoundaries,
ContactContainer< T, PARTICLECONTACTTYPE, WallContactArbitraryFromOverlapVolume< T, PARTICLETYPE::d, CONVEX > > & contactContainer,
const CONTACTPROPERTIES & contactProperties,
const SuperGeometry< T, PARTICLETYPE::d > & sGeometry,
std::multimap< int, std::unique_ptr< std::uint8_t[]> > & dataMap,
const unsigned contactBoxResolutionPerDirection = 8,
const T k = T {4. / (3 * util::sqrt(M_PI))},
F1 getSetupPeriodicity = defaults::periodicity<PARTICLETYPE::d>,
F2 processContactForce = defaults::processContactForce<T, PARTICLETYPE::d> )
inlinestatic

Definition at line 1512 of file particleContactForceFunctions.h.

1522 {4. / (3 * util::sqrt(M_PI))},
1523 F1 getSetupPeriodicity = defaults::periodicity<PARTICLETYPE::d>,
1525 defaults::processContactForce<T, PARTICLETYPE::d>)
1526 {
1527 using namespace descriptors;
1528 const T physDeltaX =
1529 sGeometry.getCuboidGeometry().getMotherCuboid().getDeltaR();
1530
1531 for (auto& wallContact : contactContainer.wallContacts) {
1532 if (!wallContact.isEmpty()) {
1533 bool isResponsible = true;
1534
1535 if constexpr (access::providesParallelization<PARTICLETYPE>()) {
1536 isResponsible =
1537 singleton::mpi().getRank() == wallContact.getResponsibleRank();
1538 }
1539
1540 if (isResponsible) {
1541 // Check if contact should be computed
1542 bool computeContact = true;
1543 if constexpr (access::providesComputeContact<PARTICLETYPE>()) {
1544 auto particle = particleSystem.get(wallContact.getParticleID());
1545 computeContact = access::isContactComputationEnabled(particle);
1546 }
1547
1548 if (computeContact) {
1549 PhysR<T, PARTICLETYPE::d> originalPos;
1550 if constexpr (isPeriodic(getSetupPeriodicity())) {
1551 auto particle = particleSystem.get(wallContact.getParticleID());
1552 originalPos = particle.template getField<GENERAL, POSITION>();
1553 particle.template setField<GENERAL, POSITION>(
1554 wallContact.getParticlePosition());
1555 }
1556
1557 if (wallContact.isNew()) {
1558 correctBoundingBoxNewContact(particleSystem, solidBoundaries,
1559 wallContact, physDeltaX,
1560 contactBoxResolutionPerDirection);
1561 wallContact.isNew(wallContact.isEmpty());
1562 }
1563 else {
1564 if constexpr (BBCORRECTIONMETHOD == 1) {
1566 particleSystem, solidBoundaries, wallContact, physDeltaX,
1567 contactBoxResolutionPerDirection);
1568 }
1569 else {
1570 correctBoundingBox(particleSystem, solidBoundaries, wallContact,
1571 physDeltaX,
1572 contactBoxResolutionPerDirection);
1573 }
1574 }
1575 apply(dataMap, particleSystem, solidBoundaries, wallContact,
1576 contactProperties, physDeltaX,
1577 contactBoxResolutionPerDirection, k, processContactForce);
1578
1579 if constexpr (isPeriodic(getSetupPeriodicity())) {
1580 particleSystem.get(wallContact.getParticleID())
1581 .template setField<GENERAL, POSITION>(originalPos);
1582 // TODO: Set that unfied position is not set anymore
1583 }
1584 wallContact.setParticlePositionUpdated(false);
1585 }
1586 else {
1587 // if contact should be ignored, reset min and max so that it counts
1588 // as empty and can be deleted during the next cleanContact() call.
1589 wallContact.resetMinMax();
1590 }
1591 }
1592 }
1593 }
1594 }
#define M_PI
int getRank() const
Returns the process ID.
bool isContactComputationEnabled(Particle< T, PARTICLETYPE > &particle)
Check if contact should be regarded (specification for a single particle)
constexpr bool isPeriodic(const Vector< bool, D > &periodic)
MpiManager & mpi()
cpu::simd::Pack< T > sqrt(cpu::simd::Pack< T > value)
Definition pack.h:100
static void correctBoundingBoxExistingContact(XParticleSystem< T, PARTICLETYPE > &particleSystem, std::vector< SolidBoundary< T, PARTICLETYPE::d > > &solidBoundaries, WallContactArbitraryFromOverlapVolume< T, PARTICLETYPE::d, CONVEX > &contact, const T physDeltaX, const unsigned contactBoxResolutionPerDirection)
static void correctBoundingBox(XParticleSystem< T, PARTICLETYPE > &particleSystem, std::vector< SolidBoundary< T, PARTICLETYPE::d > > &solidBoundaries, WallContactArbitraryFromOverlapVolume< T, PARTICLETYPE::d, CONVEX > &contact, const T physDeltaX, const unsigned contactBoxResolutionPerDirection)
static void apply(std::multimap< int, std::unique_ptr< std::uint8_t[]> > &dataMap, XParticleSystem< T, PARTICLETYPE > &particleSystem, std::vector< SolidBoundary< T, PARTICLETYPE::d > > &solidBoundaries, WallContactArbitraryFromOverlapVolume< T, PARTICLETYPE::d, CONVEX > &contact, const CONTACTPROPERTIES &contactProperties, const T physDeltaX, const unsigned contactBoxResolutionPerDirection, const T k, F processContactForce=defaults::processContactForce< T, PARTICLETYPE::d >)
static void correctBoundingBoxNewContact(XParticleSystem< T, PARTICLETYPE > &particleSystem, std::vector< SolidBoundary< T, PARTICLETYPE::d > > &solidBoundaries, WallContactArbitraryFromOverlapVolume< T, PARTICLETYPE::d, CONVEX > &contact, const T physDeltaX, const unsigned contactBoxResolutionPerDirection)

References M_PI, and olb::util::sqrt().

+ Here is the call graph for this function:

◆ correctBoundingBox()

template<typename T , typename PARTICLETYPE , typename PARTICLECONTACTTYPE , unsigned BBCORRECTIONMETHOD, bool CONVEX, bool useSDF>
static void olb::particles::contact::particle_wall< T, PARTICLETYPE, PARTICLECONTACTTYPE, WallContactArbitraryFromOverlapVolume< T, PARTICLETYPE::d, CONVEX >, BBCORRECTIONMETHOD, CONVEX, useSDF >::correctBoundingBox ( XParticleSystem< T, PARTICLETYPE > & particleSystem,
std::vector< SolidBoundary< T, PARTICLETYPE::d > > & solidBoundaries,
WallContactArbitraryFromOverlapVolume< T, PARTICLETYPE::d, CONVEX > & contact,
const T physDeltaX,
const unsigned contactBoxResolutionPerDirection )
inlinestatic

Definition at line 1455 of file particleContactForceFunctions.h.

1461 {
1462 using namespace descriptors;
1463 constexpr unsigned D = PARTICLETYPE::d;
1464
1465 Vector<T, D> contactPhysDeltaX =
1466 evalContactDeltaX(contact.getMin(), contact.getMax(), physDeltaX,
1467 contactBoxResolutionPerDirection);
1468 contact.increaseMinMax(T {0.5} * util::sqrt(D) * contactPhysDeltaX);
1469 correctBoundingBoxNewContact(particleSystem, solidBoundaries, contact,
1470 physDeltaX, contactBoxResolutionPerDirection);
1471 }
constexpr Vector< T, D > evalContactDeltaX(const Vector< T, D > &min, const Vector< T, D > &max, const T physDeltaX, const unsigned contactBoxResolutionPerDirection)

References olb::particles::contact::correctBoundingBoxNewContact(), olb::particles::contact::evalContactDeltaX(), olb::particles::contact::WallContactArbitraryFromOverlapVolume< T, D, CONVEX >::getMax(), olb::particles::contact::WallContactArbitraryFromOverlapVolume< T, D, CONVEX >::getMin(), olb::particles::contact::WallContactArbitraryFromOverlapVolume< T, D, CONVEX >::increaseMinMax(), and olb::util::sqrt().

+ Here is the call graph for this function:

◆ correctBoundingBoxExistingContact()

template<typename T , typename PARTICLETYPE , typename PARTICLECONTACTTYPE , unsigned BBCORRECTIONMETHOD, bool CONVEX, bool useSDF>
static void olb::particles::contact::particle_wall< T, PARTICLETYPE, PARTICLECONTACTTYPE, WallContactArbitraryFromOverlapVolume< T, PARTICLETYPE::d, CONVEX >, BBCORRECTIONMETHOD, CONVEX, useSDF >::correctBoundingBoxExistingContact ( XParticleSystem< T, PARTICLETYPE > & particleSystem,
std::vector< SolidBoundary< T, PARTICLETYPE::d > > & solidBoundaries,
WallContactArbitraryFromOverlapVolume< T, PARTICLETYPE::d, CONVEX > & contact,
const T physDeltaX,
const unsigned contactBoxResolutionPerDirection )
inlinestatic

Definition at line 1473 of file particleContactForceFunctions.h.

1479 {
1480 using namespace descriptors;
1481 constexpr unsigned D = PARTICLETYPE::d;
1482
1483 auto particle = particleSystem.get(contact.getParticleID());
1484 SolidBoundary<T, D>& solidBoundary = solidBoundaries[contact.getWallID()];
1485
1486 const std::function<bool(const PhysR<T, D>&)> isInsideContact =
1487 [&](const Vector<T, D>& pos) {
1488 bool isInsideWall;
1489 solidBoundary.getIndicator()->operator()(&isInsideWall, pos.data());
1490 return particles::resolved::isInsideParticle(particle, pos) &&
1491 isInsideWall;
1492 };
1493 const std::function<void()> resetMinMax = [&contact]() {
1494 contact.resetMinMax();
1495 };
1496 const std::function<void(const PhysR<T, D>&)> updateMinMax =
1497 [&contact](const PhysR<T, D>& pos) {
1498 contact.updateMinMax(pos);
1499 };
1500
1502 contact.getMin(), contact.getMax(), physDeltaX,
1503 contactBoxResolutionPerDirection, isInsideContact, resetMinMax,
1504 updateMinMax);
1505 }
void correctBoundingBox(const PhysR< T, D > &min, const PhysR< T, D > &max, const T physDeltaX, const unsigned contactBoxResolutionPerDirection, F1 isInsideContact, F2 resetContactBox, F3 updateMinMax)
void updateMinMax(PhysR< T, D > &min, PhysR< T, D > &max, const PhysR< T, D > &pos)
bool isInsideParticle(Particle< T, PARTICLETYPE > &particle, const PhysR< S, PARTICLETYPE::d > &input)

References olb::particles::contact::correctBoundingBox(), olb::SolidBoundary< T, D >::getIndicator(), olb::particles::contact::WallContactArbitraryFromOverlapVolume< T, D, CONVEX >::getMax(), olb::particles::contact::WallContactArbitraryFromOverlapVolume< T, D, CONVEX >::getMin(), olb::particles::contact::WallContactArbitraryFromOverlapVolume< T, D, CONVEX >::getParticleID(), olb::particles::contact::WallContactArbitraryFromOverlapVolume< T, D, CONVEX >::getWallID(), olb::particles::resolved::isInsideParticle(), olb::particles::contact::WallContactArbitraryFromOverlapVolume< T, D, CONVEX >::resetMinMax(), olb::particles::contact::WallContactArbitraryFromOverlapVolume< T, D, CONVEX >::updateMinMax(), and olb::particles::contact::updateMinMax().

+ Here is the call graph for this function:

◆ correctBoundingBoxNewContact()

template<typename T , typename PARTICLETYPE , typename PARTICLECONTACTTYPE , unsigned BBCORRECTIONMETHOD, bool CONVEX, bool useSDF>
static void olb::particles::contact::particle_wall< T, PARTICLETYPE, PARTICLECONTACTTYPE, WallContactArbitraryFromOverlapVolume< T, PARTICLETYPE::d, CONVEX >, BBCORRECTIONMETHOD, CONVEX, useSDF >::correctBoundingBoxNewContact ( XParticleSystem< T, PARTICLETYPE > & particleSystem,
std::vector< SolidBoundary< T, PARTICLETYPE::d > > & solidBoundaries,
WallContactArbitraryFromOverlapVolume< T, PARTICLETYPE::d, CONVEX > & contact,
const T physDeltaX,
const unsigned contactBoxResolutionPerDirection )
inlinestatic

Definition at line 1421 of file particleContactForceFunctions.h.

1427 {
1428 using namespace descriptors;
1429 constexpr unsigned D = PARTICLETYPE::d;
1430
1431 Particle<T, PARTICLETYPE> particle =
1432 particleSystem.get(contact.getParticleID());
1433 SolidBoundary<T, D>& solidBoundary = solidBoundaries[contact.getWallID()];
1434
1435 // TODO: Is there a better way to increase the particle size than sdf::rounding?
1437 contact.getMin(), contact.getMax(), physDeltaX,
1438 contactBoxResolutionPerDirection,
1439 [&](const PhysR<T, D>& pos) {
1440 return sdf::intersection(
1441 sdf::rounding(
1442 particles::resolved::signedDistanceToParticle(particle, pos),
1443 particles::access::getEnlargementForContact(particle)),
1444 sdf::rounding(solidBoundary.getIndicator()->signedDistance(pos),
1445 solidBoundary.getEnlargementForContact()));
1446 },
1447 [&contact]() {
1448 contact.resetMinMax();
1449 },
1450 [&contact](const PhysR<T, D>& pos) {
1451 contact.updateMinMax(pos);
1452 });
1453 }
void correctBoundingBoxNewContact(PhysR< T, D > min, PhysR< T, D > max, T physDeltaX, unsigned contactBoxResolutionPerDirection, F1 signedDistanceToIntersection, F2 resetContactBox, F3 updateMinMax)

References olb::particles::contact::correctBoundingBoxNewContact(), olb::particles::contact::WallContactArbitraryFromOverlapVolume< T, D, CONVEX >::getMax(), olb::particles::contact::WallContactArbitraryFromOverlapVolume< T, D, CONVEX >::getMin(), olb::particles::contact::WallContactArbitraryFromOverlapVolume< T, D, CONVEX >::getParticleID(), and olb::particles::contact::WallContactArbitraryFromOverlapVolume< T, D, CONVEX >::getWallID().

+ Here is the call graph for this function:

◆ processCell()

template<typename T , typename PARTICLETYPE , typename PARTICLECONTACTTYPE , unsigned BBCORRECTIONMETHOD, bool CONVEX, bool useSDF>
static void olb::particles::contact::particle_wall< T, PARTICLETYPE, PARTICLECONTACTTYPE, WallContactArbitraryFromOverlapVolume< T, PARTICLETYPE::d, CONVEX >, BBCORRECTIONMETHOD, CONVEX, useSDF >::processCell ( WallContactArbitraryFromOverlapVolume< T, PARTICLETYPE::d, CONVEX > & contact,
Particle< T, PARTICLETYPE > & particle,
SolidBoundary< T, PARTICLETYPE::d > & solidBoundary,
Vector< T, PARTICLETYPE::d > & contactNormal,
Vector< T, PARTICLETYPE::d > & center,
unsigned & volumeCellCount,
T & surfaceCellCount,
const Vector< T, PARTICLETYPE::d > & pos,
const Vector< T, PARTICLETYPE::d > & contactPhysDeltaX )
inlinestatic

Definition at line 1244 of file particleContactForceFunctions.h.

1252 {
1253 /* OstreamManager clout(std::cout, "cellProcessingForContactForce"); */
1254 constexpr unsigned D = PARTICLETYPE::d;
1255
1256 // Check if pos is inside contact
1257 const std::function<bool(const PhysR<T, D>&)> isInside =
1258 [&](const PhysR<T, D>& pos) {
1259 bool const isInsideIndicator =
1260 solidBoundary.getIndicator()->signedDistance(pos.data()) <=
1261 solidBoundary.getEnlargementForContact();
1262 bool const isInsideParticle =
1265 return isInsideParticle && isInsideIndicator;
1266 };
1267
1268 // Check if pos is on surface
1269 const std::function<bool(const PhysR<T, D>&, const PhysR<T, D>&, bool&,
1270 bool&, const Vector<T, D>&, const Vector<T, D>&)>
1271 isOnSurface = [&](const PhysR<T, D>& pos,
1272 const PhysR<T, D>& contactPhysDeltaX,
1273 bool& onSurfaceA, bool& onSurfaceB,
1274 const Vector<T, D>& normalA,
1275 const Vector<T, D>& normalB) {
1276 Vector<T, D> neighbor;
1277 for (unsigned iD = 0; iD < D; ++iD) {
1278 neighbor[iD] = -normalA[iD] * contactPhysDeltaX[iD];
1279 }
1281 particle, pos + neighbor) <=
1283 for (unsigned iD = 0; iD < D; ++iD) {
1284 neighbor[iD] = -normalB[iD] * contactPhysDeltaX[iD];
1285 }
1286 onSurfaceB = solidBoundary.getIndicator()->signedDistance(
1287 (pos + neighbor).data()) <=
1288 solidBoundary.getEnlargementForContact();
1289 return onSurfaceA || onSurfaceB;
1290 };
1291
1292 // Calculate normal to particle surface
1293 const std::function<Vector<T, D>(const PhysR<T, D>&, const T)> calcNormalA =
1294 [&](const PhysR<T, D>& pos, const T meshSize) {
1295 // also with an enlarged particle, the normal should still point the same way, since we apply an equal layer to the whole surface
1297 meshSize);
1298 };
1299 // Calculate normal to indicator surface
1300 const std::function<Vector<T, D>(const PhysR<T, D>&, const T)> calcNormalB =
1301 [&](const PhysR<T, D>& pos, const T meshSize) {
1302 return solidBoundary.getIndicator()->surfaceNormal(pos, meshSize);
1303 };
1304 // Wrapper for update of min and max
1305 const std::function<void(const PhysR<T, D>&)> updateMinMax =
1306 [&contact](const PhysR<T, D>& pos) {
1307 contact.updateMinMax(pos);
1308 };
1309
1310 particles::contact::processCell(pos, contactPhysDeltaX, center,
1311 contactNormal, volumeCellCount,
1312 surfaceCellCount, isInside, isOnSurface,
1313 calcNormalA, calcNormalB, updateMinMax);
1314 }
constexpr const T * data() const any_platform
Definition vector.h:161
void processCell(const PhysR< T, D > &pos, const PhysR< T, D > &contactPhysDeltaX, PhysR< T, D > &center, Vector< T, D > &contactNormal, unsigned &volumeCellCount, T &surfaceCellCount, F1 isInside, F2 isOnSurface, F3 calcNormalA, F4 calcNormalB, F5 updateMinMax)
Vector< S, PARTICLETYPE::d > normalOnParticleSurface(Particle< T, PARTICLETYPE > &particle, const Vector< S, PARTICLETYPE::d > &pos, const T meshSize)
constexpr T getEnlargementForContact() const
Definition wall.hh:60
IndicatorF< T, D > * getIndicator()
Definition wall.hh:42

References olb::Vector< T, D >::data(), olb::SolidBoundary< T, D >::getEnlargementForContact(), olb::particles::access::getEnlargementForContact(), olb::SolidBoundary< T, D >::getIndicator(), olb::particles::resolved::normalOnParticleSurface(), olb::particles::contact::processCell(), olb::particles::resolved::signedDistanceToParticle(), olb::particles::contact::WallContactArbitraryFromOverlapVolume< T, D, CONVEX >::updateMinMax(), and olb::particles::contact::updateMinMax().

+ Here is the call graph for this function:

◆ resetContainer()

template<typename T , typename PARTICLETYPE , typename PARTICLECONTACTTYPE , unsigned BBCORRECTIONMETHOD, bool CONVEX, bool useSDF>
static void olb::particles::contact::particle_wall< T, PARTICLETYPE, PARTICLECONTACTTYPE, WallContactArbitraryFromOverlapVolume< T, PARTICLETYPE::d, CONVEX >, BBCORRECTIONMETHOD, CONVEX, useSDF >::resetContainer ( ContactContainer< T, PARTICLECONTACTTYPE, WallContactArbitraryFromOverlapVolume< T, PARTICLETYPE::d, CONVEX > > & contactContainer)
inlinestatic

Definition at line 1232 of file particleContactForceFunctions.h.

1237 {
1238 for (auto& contact : contactContainer.wallContacts) {
1239 contact.resetMinMax();
1240 }
1241 }

References olb::particles::contact::ParticleContactArbitraryFromOverlapVolume< T, D, CONVEX >::resetMinMax().

+ Here is the call graph for this function:

The documentation for this struct was generated from the following file: