31#ifndef PARTICLE_DATA_ACCESS_WRAPPERS_H
32#define PARTICLE_DATA_ACCESS_WRAPPERS_H
49 {momentOfInertia[0], T {0}, T {0}},
50 { T {0}, momentOfInertia[1], T {0}},
51 { T {0}, T {0}, momentOfInertia[2]}
54 inertiaTensor = (rotationMatrix * inertiaTensor) * (rotationMatrix.
transpose());
69 const T denominator =
util::pow(inertiaTensor[0][2], 2) * inertiaTensor[1][1]
70 + inertiaTensor[0][0] *
util::pow(inertiaTensor[1][2], 2)
71 - 2 * inertiaTensor[0][1] * inertiaTensor[0][2] * inertiaTensor[1][2]
72 +
util::pow(inertiaTensor[0][1], 2) * inertiaTensor[2][2]
73 - inertiaTensor[0][0] * inertiaTensor[1][1] * inertiaTensor[2][2];
74 const T factor = T{1} / denominator;
77 angularAcceleration[0] = (
util::pow(inertiaTensor[1][2], 2) - inertiaTensor[1][1] * inertiaTensor[2][2]) * left[0]
78 + (- inertiaTensor[0][2] * inertiaTensor[1][2] + inertiaTensor[0][1] * inertiaTensor[2][2]) * left[1]
79 + (inertiaTensor[0][2] * inertiaTensor[1][1] - inertiaTensor[0][1] * inertiaTensor[1][2]) * left[2];
80 angularAcceleration[1] = (- inertiaTensor[0][2] * inertiaTensor[1][2] + inertiaTensor[0][1] * inertiaTensor[2][2]) * left[0]
81 + (
util::pow(inertiaTensor[0][2], 2) - inertiaTensor[0][0] * inertiaTensor[2][2]) * left[1]
82 + (- inertiaTensor[0][1] * inertiaTensor[0][2] + inertiaTensor[0][0] * inertiaTensor[1][2]) * left[2];
83 angularAcceleration[2] = (inertiaTensor[0][2] * inertiaTensor[1][1] - inertiaTensor[0][1] * inertiaTensor[1][2]) * left[0]
84 + (- inertiaTensor[0][1] * inertiaTensor[0][2] + inertiaTensor[0][0] * inertiaTensor[1][2]) * left[1]
85 + (
util::pow(inertiaTensor[0][1], 2) - inertiaTensor[0][0] * inertiaTensor[1][1]) * left[2];
87 for(
unsigned iDim = 0; iDim < 3; ++iDim) {
88 angularAcceleration[iDim] *= factor;
91 return angularAcceleration;
97template<
typename PARTICLETYPE>
100 using namespace descriptors;
101 return PARTICLETYPE::template providesNested<PARALLELIZATION,ID>();
103template<
typename T,
typename PARTICLETYPE>
109template<
typename PARTICLETYPE>
112 using namespace descriptors;
113 return PARTICLETYPE::template providesNested<GENERAL,INVALID>();
115template<
typename T,
typename PARTICLETYPE>
121template<
typename PARTICLETYPE>
124 using namespace descriptors;
125 return PARTICLETYPE::template providesNested<GENERAL,POSITION>();
127template<
typename T,
typename PARTICLETYPE>
133template<
typename PARTICLETYPE>
136 using namespace descriptors;
137 return PARTICLETYPE::template providesNested<PHYSPROPERTIES,RADIUS>();
139template<
typename T,
typename PARTICLETYPE>
145template<
typename PARTICLETYPE>
148 using namespace descriptors;
149 return PARTICLETYPE::template providesNested<PHYSPROPERTIES,DENSITY>();
151template<
typename T,
typename PARTICLETYPE>
157template<
typename PARTICLETYPE>
160 using namespace descriptors;
161 return PARTICLETYPE::template providesNested<PHYSPROPERTIES,MASS>();
163template<
typename T,
typename PARTICLETYPE>
169template<
typename PARTICLETYPE>
172 using namespace descriptors;
175template<
typename T,
typename PARTICLETYPE>
181template<
typename PARTICLETYPE>
184 using namespace descriptors;
185 return PARTICLETYPE::template providesNested<SURFACE,ANGLE>();
187template<
typename T,
typename PARTICLETYPE>
193template<
typename PARTICLETYPE>
196 using namespace descriptors;
197 return PARTICLETYPE::template providesNested<MOBILITY,VELOCITY>();
199template<
typename T,
typename PARTICLETYPE>
205template<
typename PARTICLETYPE>
208 using namespace descriptors;
209 return PARTICLETYPE::template providesNested<MOBILITY,ANG_VELOCITY>();
211template<
typename T,
typename PARTICLETYPE>
217template<
typename PARTICLETYPE>
220 using namespace descriptors;
221 return PARTICLETYPE::template providesNested<FORCING,FORCE>();
223template<
typename T,
typename PARTICLETYPE>
229template<
typename PARTICLETYPE>
232 using namespace descriptors;
233 return PARTICLETYPE::template providesNested<FORCING,TORQUE>();
235template<
typename T,
typename PARTICLETYPE>
241template<
typename PARTICLETYPE>
244 using namespace descriptors;
245 return PARTICLETYPE::template providesNested<FORCING,ADHESION>();
247template<
typename T,
typename PARTICLETYPE>
253template<
typename PARTICLETYPE>
256 using namespace descriptors;
257 return PARTICLETYPE::template providesNested<PHYSPROPERTIES,MOFI>();
259template<
typename T,
typename PARTICLETYPE>
265template<
typename PARTICLETYPE>
268 using namespace descriptors;
269 return PARTICLETYPE::template providesNested<GENERAL,INVALID>();
271template<
typename T,
typename PARTICLETYPE>
277template<
typename PARTICLETYPE>
280 using namespace descriptors;
281 return PARTICLETYPE::template providesNested<DYNBEHAVIOUR,DYNAMICS_ID>();
283template<
typename T,
typename PARTICLETYPE>
289template<
typename PARTICLETYPE>
292 using namespace descriptors;
293 return PARTICLETYPE::template providesNested<DYNBEHAVIOUR,ACTIVE>();
295template<
typename T,
typename PARTICLETYPE>
301template<
typename PARTICLETYPE>
304 using namespace descriptors;
305 return PARTICLETYPE::template providesNested<DYNBEHAVIOUR,COMPUTE_MOTION>();
307template<
typename T,
typename PARTICLETYPE>
313template<
typename PARTICLETYPE>
316 using namespace descriptors;
317 return PARTICLETYPE::template providesNested<DYNBEHAVIOUR,COMPUTE_CONTACT>();
319template<
typename T,
typename PARTICLETYPE>
325template<
typename PARTICLETYPE>
328 using namespace descriptors;
329 return PARTICLETYPE::template providesNested<SURFACE,ROT_MATRIX>();
331template<
typename T,
typename PARTICLETYPE>
337template<
typename PARTICLETYPE>
340 using namespace descriptors;
341 return PARTICLETYPE::template providesNested<SURFACE>();
343template<
typename T,
typename PARTICLETYPE>
349template<
typename PARTICLETYPE>
352 using namespace descriptors;
353 return PARTICLETYPE::template providesNested<SURFACE,SINDICATOR>();
355template<
typename T,
typename PARTICLETYPE>
362template<
typename PARTICLETYPE>
365 using namespace descriptors;
366 return PARTICLETYPE::template providesNested<PARALLELIZATION>();
368template<
typename T,
typename PARTICLETYPE>
373template<
typename PARTICLETYPE>
376 using namespace descriptors;
377 return PARTICLETYPE::template providesNested<PHYSPROPERTIES,SPECIES>();
379template<
typename T,
typename PARTICLETYPE>
384template<
typename PARTICLETYPE>
387 using namespace descriptors;
388 return PARTICLETYPE::template providesNested<DYNBEHAVIOUR,DETACHING>();
390template<
typename T,
typename PARTICLETYPE>
395template<
typename PARTICLETYPE>
398 using namespace descriptors;
399 return PARTICLETYPE::template providesNested<SURFACE,COR_OFFSET>();
401template<
typename T,
typename PARTICLETYPE>
406template<
typename PARTICLETYPE>
409 using namespace descriptors;
410 return PARTICLETYPE::template providesNested<SURFACE,ELONGATION>();
412template<
typename T,
typename PARTICLETYPE>
417template<
typename PARTICLETYPE>
420 using namespace descriptors;
421 return PARTICLETYPE::template providesNested<MOBILITY,ACCELERATION_STRD>();
423template<
typename T,
typename PARTICLETYPE>
428template<
typename PARTICLETYPE>
431 using namespace descriptors;
432 return PARTICLETYPE::template providesNested<MOBILITY,ANG_ACC_STRD>();
434template<
typename T,
typename PARTICLETYPE>
439template<
typename PARTICLETYPE>
442 using namespace descriptors;
443 return PARTICLETYPE::template providesNested<NUMERICPROPERTIES,ENLARGEMENT_FOR_CONTACT>();
445template<
typename T,
typename PARTICLETYPE>
450template<
typename PARTICLETYPE>
453 using namespace descriptors;
454 return PARTICLETYPE::template providesNested<NUMERICPROPERTIES,IS_IN_CONTACT>();
456template<
typename T,
typename PARTICLETYPE>
461template<
typename PARTICLETYPE>
464 using namespace descriptors;
465 return PARTICLETYPE::template providesNested<MECHPROPERTIES,MATERIAL>();
467template<
typename T,
typename PARTICLETYPE>
472template<
typename PARTICLETYPE>
475 return (PARTICLETYPE::d==2);
477template<
typename T,
typename PARTICLETYPE>
482template<
typename PARTICLETYPE>
485 return (PARTICLETYPE::d==3);
487template<
typename T,
typename PARTICLETYPE>
494template<
typename T,
typename PARTICLETYPE>
497 using namespace descriptors;
498 constexpr unsigned D = PARTICLETYPE::d;
500 "Field GENERAL:POSITION has to be provided");
501 Vector<T,D> position( particle.template getField<GENERAL,POSITION>() );
505template<
bool ensureAngularBounds=false,
typename T,
typename PARTICLETYPE>
508 using namespace descriptors;
511 Vector<T,Drot> angle( particle.template getField<SURFACE,ANGLE>() );
512 if constexpr (ensureAngularBounds){
513 for (
unsigned iRot=0; iRot<Drot; ++iRot) {
520template<
typename T,
typename PARTICLETYPE>
523 using namespace descriptors;
526 Vector<T,DrotMat> rotationMatrix( particle.template getField<SURFACE,ROT_MATRIX>() );
527 return rotationMatrix;
530template<
unsigned dir=2,
typename T,
typename PARTICLETYPE>
533 using namespace descriptors;
534 constexpr unsigned D = PARTICLETYPE::d;
538 for (
unsigned iDim=0; iDim<D; ++iDim) {
539 unsigned iMat = D*iDim+dir;
540 normal[iDim] = rotationMatrix[iMat];
545template<
typename T,
typename PARTICLETYPE>
548 using namespace descriptors;
549 constexpr unsigned D = PARTICLETYPE::d;
551 Vector<T,D> velocity( particle.template getField<MOBILITY,VELOCITY>() );
555template<
typename T,
typename PARTICLETYPE>
558 using namespace descriptors;
561 Vector<T,Drot> angVelocity( particle.template getField<MOBILITY,ANG_VELOCITY>() );
565template<
typename T,
typename PARTICLETYPE>
568 using namespace descriptors;
569 constexpr unsigned D = PARTICLETYPE::d;
571 Vector<T,D> force( particle.template getField<FORCING,FORCE>() );
575template<
typename T,
typename PARTICLETYPE>
578 using namespace descriptors;
581 Vector<T,Drot> torque( particle.template getField<FORCING,TORQUE>() );
585template<
typename T,
typename PARTICLETYPE>
588 using namespace descriptors;
591 Vector<T,Drot> mofi( particle.template getField<PHYSPROPERTIES,MOFI>() );
596template<
typename T,
typename PARTICLETYPE>
599 using namespace descriptors;
602 Vector<T,2> adhesion( particle.template getField<FORCING,ADHESION>() );
606template<
typename T,
typename PARTICLETYPE>
609 using namespace descriptors;
612 valid = !particle.template getField<GENERAL,INVALID>();
617template<
typename T,
typename PARTICLETYPE>
620 using namespace descriptors;
623 active = particle.template getField<DYNBEHAVIOUR,ACTIVE>();
629template<
typename T,
typename PARTICLETYPE>
632 using namespace descriptors;
634 auto sIndicatorPtr = particle.template getField<SURFACE,SINDICATOR>();
635 return sIndicatorPtr;
639template<
typename T,
typename PARTICLETYPE>
642 using namespace descriptors;
648 radius = particle.template getField<PHYSPROPERTIES,RADIUS>();
651 std::cerr <<
"ERROR: no Field found providing radius!" << std::endl;
658template<
typename T,
typename PARTICLETYPE>
661 using namespace descriptors;
662 constexpr unsigned D = PARTICLETYPE::d;
665 if constexpr (D == 3) {
674 if constexpr(D == 3) {
680 volume *= shapeFactor;
685template<
typename T,
typename PARTICLETYPE>
688 using namespace descriptors;
690 "Field PHYSPROPERTIES:MASS or PHYSPROPERTIES:DENSITY has to be provided");
694 density = particle.template getField<PHYSPROPERTIES, DENSITY>();
697 const T mass = particle.template getField<PHYSPROPERTIES, MASS>();
698 density = mass /
getVolume(particle, shapeFactor);
703template<
typename T,
typename PARTICLETYPE>
706 using namespace descriptors;
708 "Field PHYSPROPERTIES:MASS or PHYSPROPERTIES:DENSITY has to be provided");
712 mass = particle.template getField<PHYSPROPERTIES, MASS>();
715 const T density = particle.template getField<PHYSPROPERTIES, DENSITY>();
716 mass = density *
getVolume(particle, shapeFactor);
721template<
typename T,
typename PARTICLETYPE>
724 using namespace descriptors;
727 return particle.template getField<MOBILITY,ACCELERATION_STRD>();
731template<
typename T,
typename PARTICLETYPE>
734 using namespace descriptors;
737 particle.template setField<MOBILITY, ACCELERATION_STRD>(acceleration);
741template<
typename T,
typename PARTICLETYPE>
744 using namespace descriptors;
745 constexpr unsigned D = PARTICLETYPE::d;
753 for (
unsigned iDim=0; iDim<D; ++iDim) {
754 acceleration[iDim] = force[iDim] / mass;
761template<
typename T,
typename PARTICLETYPE>
765 using namespace descriptors;
777 for (
unsigned iRot=0; iRot<Drot; ++iRot) {
778 angularAcceleration[iRot] = torque[iRot] / momentOfInertia[iRot];
781 return angularAcceleration;
784template<
typename T,
typename PARTICLETYPE>
787 using namespace descriptors;
790 return particle.template getField<MOBILITY,ANG_ACC_STRD>();
795template<
typename T,
typename PARTICLETYPE>
798 using namespace descriptors;
800 auto globalID = particle.template getField<PARALLELIZATION,ID>();
805template<
typename T,
typename PARTICLETYPE>
808 using namespace descriptors;
810 auto globalIC = particle.template getField<PARALLELIZATION,IC>();
815template<
typename T,
typename PARTICLETYPE>
818 using namespace descriptors;
820 "Field DYNBEHAVIOUR:DYNAMICS_ID has to be provided");
821 unsigned short dynamicsID = particle.template getField<DYNBEHAVIOUR,DYNAMICS_ID>();
826template<
typename T,
typename PARTICLETYPE>
829 using namespace descriptors;
831 "Field DYNBEHAVIOUR:DETACHING has to be provided");
832 bool detaching = particle.template getField<DYNBEHAVIOUR,DETACHING>();
838template<
typename T,
typename PARTICLETYPE>
841 using namespace descriptors;
842 constexpr unsigned D = PARTICLETYPE::d;
844 using SIndicatorType = std::conditional_t<
851 auto sIndicatorCuboidPtr =
static_cast<SIndicatorType*
>(sIndicatorPtr);
852 auto& indicatorCuboid = sIndicatorCuboidPtr->getIndicator();
856 indicatorCuboid.getxLength(),
857 indicatorCuboid.getyLength()
862 indicatorCuboid.getxLength(),
863 indicatorCuboid.getyLength(),
864 indicatorCuboid.getzLength()
870template<
typename T,
typename PARTICLETYPE>
873 using namespace descriptors;
874 constexpr unsigned D = PARTICLETYPE::d;
876 Vector<T,D> offsetCOR( particle.template getField<SURFACE,COR_OFFSET>() );
880template<
typename T,
typename PARTICLETYPE>
883 using namespace descriptors;
884 constexpr unsigned D = PARTICLETYPE::d;
886 Vector<T,D> elongation( particle.template getField<SURFACE,ELONGATION>() );
891template<
typename T,
typename PARTICLETYPE>
894 using namespace descriptors;
896 return particle.template getField<NUMERICPROPERTIES,ENLARGEMENT_FOR_CONTACT>();
902 __builtin_unreachable();
905template<
typename T,
typename PARTICLETYPE>
908 using namespace descriptors;
910 "Field MECHPROPERTIES::MATERIAL has to be provided");
911 return particle.template getField<MECHPROPERTIES, MATERIAL>();
916template<
typename T,
typename PARTICLETYPE>
919 using namespace descriptors;
921 "Field PHYSPROPERTIES:MASS or PHYSPROPERTIES:DENSITY has to be provided");
924 particle.template setField<PHYSPROPERTIES, DENSITY>(density);
927 const T mass = density *
getVolume(particle, shapeFactor);
928 particle.template setField<PHYSPROPERTIES, MASS>(mass);
932template<
typename T,
typename PARTICLETYPE>
935 using namespace descriptors;
937 "Field PHYSPROPERTIES:MASS or PHYSPROPERTIES:DENSITY has to be provided");
940 particle.template setField<PHYSPROPERTIES, MASS>(mass);
943 const T density = mass /
getVolume(particle, shapeFactor);
944 particle.template setField<PHYSPROPERTIES, DENSITY>(density);
948template<
typename T,
typename PARTICLETYPE>
951 using namespace descriptors;
953 "Field GENERAL:POSITION has to be provided");
954 particle.template setField<GENERAL, POSITION>(position);
957template<
typename T,
typename PARTICLETYPE>
960 using namespace descriptors;
962 "Field MECHPROPERTIES::MATERIAL has to be provided");
963 particle.template setField<MECHPROPERTIES, MATERIAL>(material);
966template<
typename T,
typename PARTICLETYPE>
969 using namespace descriptors;
972 PARTICLETYPE::d>::serialize_rotation(angle));
975template<
typename T,
typename PARTICLETYPE>
978 using namespace descriptors;
980 particle.template setField<SURFACE,ROT_MATRIX>(rotMatrix);
983template<
typename T,
typename PARTICLETYPE>
986 using namespace descriptors;
988 particle.template setField<MOBILITY,VELOCITY>(velocity);
991template<
typename T,
typename PARTICLETYPE>
994 using namespace descriptors;
997 PARTICLETYPE::d>::serialize_rotation(angVelocity));
1000template<
typename T,
typename PARTICLETYPE>
1003 using namespace descriptors;
1006 PARTICLETYPE::d>::serialize_rotation(angAcceleration));
1011template<
typename T,
typename PARTICLETYPE>
1014 using namespace descriptors;
1016 particle.template setField<FORCING,FORCE>(force);
1019template<
typename T,
typename PARTICLETYPE>
1022 using namespace descriptors;
1025 PARTICLETYPE::d>::serialize_rotation(torque));
1028template<
typename T,
typename PARTICLETYPE>
1031 using namespace descriptors;
1034 PARTICLETYPE::d>::serialize_rotation(mofi));
1038template<
typename T,
typename PARTICLETYPE>
1041 using namespace descriptors;
1043 particle.template setField<FORCING,ADHESION>(adhesion);
1046template<
typename T,
typename PARTICLETYPE>
1049 using namespace descriptors;
1051 particle.template setField<GENERAL,INVALID>( value );
1054template<
typename T,
typename PARTICLETYPE>
1060template<
typename T,
typename PARTICLETYPE>
1063 using namespace descriptors;
1065 particle.template setField<DYNBEHAVIOUR,ACTIVE>( value );
1068template<
typename T,
typename PARTICLETYPE>
1075template<
typename T,
typename PARTICLETYPE>
1079 using namespace descriptors;
1081 particle.template setField<SURFACE,SINDICATOR>(sindicator);
1085template<
typename T,
typename PARTICLETYPE>
1088 using namespace descriptors;
1090 particle.template setField<PHYSPROPERTIES,RADIUS>(radius);
1093template<
typename T,
typename PARTICLETYPE>
1096 using namespace descriptors;
1098 particle.template setField<PARALLELIZATION,ID>(
id);
1101template<
typename T,
typename PARTICLETYPE>
1104 using namespace descriptors;
1106 particle.template setField<PARALLELIZATION,IC>(
id);
1109template<
typename T,
typename PARTICLETYPE>
1112 using namespace descriptors;
1114 "Field DYNBEHAVIOUR:DYNAMICS_ID has to be provided");
1115 particle.template setField<DYNBEHAVIOUR,DYNAMICS_ID>(dynamicsID);
1118template<
typename T,
typename PARTICLETYPE>
1121 using namespace descriptors;
1123 "Field DYNBEHAVIOUR:DETACHING has to be provided");
1124 particle.template setField<DYNBEHAVIOUR,DETACHING>(value);
1127template<
typename T,
typename PARTICLETYPE>
1130 using namespace descriptors;
1132 particle.template setField<SURFACE,COR_OFFSET>(offsetCOR);
1135template<
typename T,
typename PARTICLETYPE>
1138 using namespace descriptors;
1140 particle.template setField<SURFACE,ELONGATION>(elongation);
1143template<
typename T,
typename PARTICLETYPE>
1146 using namespace descriptors;
1148 particle.template setField<NUMERICPROPERTIES, ENLARGEMENT_FOR_CONTACT>(value);
1152template<
typename T,
typename PARTICLETYPE>
1155 using namespace descriptors;
1162 return particle.template getField<DYNBEHAVIOUR,COMPUTE_MOTION>();
1165 __builtin_unreachable();
1169template<
typename T,
typename PARTICLETYPE>
1172 using namespace descriptors;
1180 return particle.template getField<DYNBEHAVIOUR,COMPUTE_CONTACT>();
1183 __builtin_unreachable();
1187template<
typename T,
typename PARTICLETYPE>
1194template<
typename T,
typename PARTICLETYPE>
1197 using namespace descriptors;
1199 particle.template setField<DYNBEHAVIOUR, COMPUTE_MOTION>(value);
1202template<
typename T,
typename PARTICLETYPE>
1205 using namespace descriptors;
1207 particle.template setField<DYNBEHAVIOUR, COMPUTE_CONTACT>(value);
1210template<
typename T,
typename PARTICLETYPE>
1216template<
typename T,
typename PARTICLETYPE>
1222template<
typename T,
typename PARTICLETYPE>
Matrix with a defined number of ROWS and columns (COLS)
constexpr Matrix< T, COLS, ROWS > transpose() const
implements a smooth cuboid in 2D with an _epsilon sector.
implements a smooth particle cuboid in 3D with an _epsilon sector.
void setRotationMatrix(Particle< T, PARTICLETYPE > particle, Vector< T, utilities::dimensions::convert< PARTICLETYPE::d >::matrix > rotMatrix)
void setAccelerationStrd(Particle< T, PARTICLETYPE > particle, Vector< T, PARTICLETYPE::d > acceleration)
constexpr bool providesInvalid()
Provides field ID.
constexpr bool providesPosition()
Provides field POSITION.
constexpr bool providesParallelization()
Provides group PARALLELIZATION.
Vector< T, utilities::dimensions::convert< PARTICLETYPE::d >::matrix > getRotationMatrix(Particle< T, PARTICLETYPE > particle)
constexpr bool providesMassOrDensity()
Provides field MASS or DENSITY.
void setRadius(Particle< T, PARTICLETYPE > &particle, T radius)
void setAngAccelerationStrd(Particle< T, PARTICLETYPE > particle, Vector< T, utilities::dimensions::convert< PARTICLETYPE::d >::rotation > angAcceleration)
constexpr bool providesTorque()
Provides field TORQUE.
constexpr bool providesAccelerationStrd()
constexpr bool providesValid()
Provides field INVALID.
constexpr bool providesComputeContact()
Provides field COMPUTE_CONTACT.
Vector< T, PARTICLETYPE::d > getForce(Particle< T, PARTICLETYPE > particle)
constexpr bool providesComputeMotion()
Provides field COMPUTE_MOTION.
void setDynamicsID(Particle< T, PARTICLETYPE > &particle, unsigned short dynamicsID)
void disableContactComputation(Particle< T, PARTICLETYPE > &particle, bool value=true)
constexpr bool providesSurface()
Provides group SURFACE.
T getDensity(Particle< T, PARTICLETYPE > particle, T shapeFactor=T{1})
void setMass(Particle< T, PARTICLETYPE > particle, T mass, T shapeFactor=T{1})
void setAngularVelocity(Particle< T, PARTICLETYPE > particle, Vector< T, utilities::dimensions::convert< PARTICLETYPE::d >::rotation > angVelocity)
void setAngle(Particle< T, PARTICLETYPE > particle, Vector< T, utilities::dimensions::convert< PARTICLETYPE::d >::rotation > angle)
constexpr bool providesMass()
Provides field MASS.
Vector< T, PARTICLETYPE::d > getCORoffset(Particle< T, PARTICLETYPE > particle)
constexpr bool providesRadius()
Provides field RADIUS.
bool isMotionComputationEnabled(Particle< T, PARTICLETYPE > &particle)
Check if motion is enabled.
bool isActive(Particle< T, PARTICLETYPE > particle)
void setInvalid(Particle< T, PARTICLETYPE > particle, bool value=true)
auto getGlobalID(Particle< T, PARTICLETYPE > particle)
constexpr bool providesAngle()
Provides field ANGLE.
void setValid(Particle< T, PARTICLETYPE > particle, bool value=true)
bool isValid(Particle< T, PARTICLETYPE > particle)
Vector< T, utilities::dimensions::convert< PARTICLETYPE::d >::rotation > getAngAcceleration(Particle< T, PARTICLETYPE > particle)
auto getGlobalIC(Particle< T, PARTICLETYPE > particle)
unsigned short getDynamicsID(Particle< T, PARTICLETYPE > &particle)
Vector< T, utilities::dimensions::convert< PARTICLETYPE::d >::rotation > getMomentOfInertia(Particle< T, PARTICLETYPE > particle)
Vector< T, 3 > calcAngAcceleration3D(Vector< T, 3 > &torque, Vector< T, 3 > &momentOfInertia, const Matrix< T, 3, 3 > &rotationMatrix)
constexpr bool providesSpecies()
Vector< T, PARTICLETYPE::d > getElongation(Particle< T, PARTICLETYPE > particle)
void setGlobalID(Particle< T, PARTICLETYPE > particle, std::size_t id)
void setCORoffset(Particle< T, PARTICLETYPE > particle, Vector< T, PARTICLETYPE::d > offsetCOR)
void setRestingParticle(Particle< T, PARTICLETYPE > particle)
void setDensity(Particle< T, PARTICLETYPE > particle, T density, T shapeFactor=T{1})
constexpr bool providesActive()
Provides field ACTIVE.
Vector< T, utilities::dimensions::convert< PARTICLETYPE::d >::rotation > getAngAccelerationStrd(Particle< T, PARTICLETYPE > particle)
void setEnlargementForContact(Particle< T, PARTICLETYPE > &particle, T value)
Vector< T, utilities::dimensions::convert< PARTICLETYPE::d >::rotation > getTorque(Particle< T, PARTICLETYPE > particle)
constexpr bool providesEnlargementForContactTreatment()
constexpr bool providesIsInContact()
constexpr bool providesAdhesion()
Provides field ADHESION.
T getRadius(Particle< T, PARTICLETYPE > &particle)
constexpr bool providesForce()
Provides field FORCE.
void enableMotionComputation(Particle< T, PARTICLETYPE > &particle, bool value=true)
constexpr bool providesRotationMatrix()
Provides field ROT_MATRIX.
void setMomentOfInertia(Particle< T, PARTICLETYPE > particle, Vector< T, utilities::dimensions::convert< PARTICLETYPE::d >::rotation > mofi)
Vector< T, PARTICLETYPE::d > getVelocity(Particle< T, PARTICLETYPE > particle)
void setElongation(Particle< T, PARTICLETYPE > particle, Vector< T, PARTICLETYPE::d > elongation)
auto getSmoothIndicatorPtr(Particle< T, PARTICLETYPE > particle)
unsigned getContactMaterial(Particle< T, PARTICLETYPE > particle)
constexpr bool providesID()
Provides field ID.
void setVelocity(Particle< T, PARTICLETYPE > particle, Vector< T, PARTICLETYPE::d > velocity)
void setDetaching(Particle< T, PARTICLETYPE > &particle, bool value)
constexpr bool providesDensity()
Provides field DENSITY.
bool isContactComputationEnabled(Particle< T, PARTICLETYPE > &particle)
Check if contact should be regarded (specification for a single particle)
Vector< T, PARTICLETYPE::d > getAcceleration(Particle< T, PARTICLETYPE > particle)
constexpr bool providesVelocity()
Provides field VELOCITY.
constexpr bool providesDetaching()
constexpr bool providesMomentOfInertia()
Provides field MOFI.
T getVolume(Particle< T, PARTICLETYPE > particle, T shapeFactor=T{1})
Returns the volume of a particle (for subgrid the volume of a sphere/circle is multiplied by the shap...
T getMass(Particle< T, PARTICLETYPE > particle, T shapeFactor=T{1})
void setInactive(Particle< T, PARTICLETYPE > particle, bool value=true)
void setAdhesion(Particle< T, PARTICLETYPE > &particle, Vector< T, 2 > adhesion)
auto getCuboidSurfaceExtent(Particle< T, PARTICLETYPE > particle)
Vector< T, utilities::dimensions::convert< PARTICLETYPE::d >::rotation > getAngle(Particle< T, PARTICLETYPE > particle)
void enableContactComputation(Particle< T, PARTICLETYPE > &particle, bool value=true)
constexpr bool providesElongation()
constexpr bool providesAngVelocity()
Provides field VELOCITY.
constexpr bool providesSmoothIndicator()
void setActive(Particle< T, PARTICLETYPE > particle, bool value=true)
constexpr bool providesCORoffset()
void setGlobalIC(Particle< T, PARTICLETYPE > particle, int id)
void setPosition(Particle< T, PARTICLETYPE > particle, Vector< T, PARTICLETYPE::d > position)
constexpr bool providesDynamicsID()
Provides field DYNAMICS_ID.
constexpr bool providesAngAccelerationStrd()
void setForce(Particle< T, PARTICLETYPE > particle, Vector< T, PARTICLETYPE::d > force)
T getEnlargementForContact(Particle< T, PARTICLETYPE > particle)
Vector< T, PARTICLETYPE::d > getPosition(Particle< T, PARTICLETYPE > particle)
constexpr bool providesContactMaterial()
Vector< T, utilities::dimensions::convert< PARTICLETYPE::d >::rotation > getAngularVelocity(Particle< T, PARTICLETYPE > particle)
Vector< T, PARTICLETYPE::d > getAccelerationStrd(Particle< T, PARTICLETYPE > particle)
void disableMotionComputation(Particle< T, PARTICLETYPE > &particle, bool value=true)
void setSmoothIndicatorPtr(Particle< T, PARTICLETYPE > particle, SmoothIndicatorF< T, T, PARTICLETYPE::d, true > *sindicator)
bool isDetaching(Particle< T, PARTICLETYPE > &particle)
Vector< T, PARTICLETYPE::d > getSurfaceNormal(Particle< T, PARTICLETYPE > particle)
void setContactMaterial(Particle< T, PARTICLETYPE > particle, unsigned material)
Vector< T, 2 > getAdhesion(Particle< T, PARTICLETYPE > particle)
void setTorque(Particle< T, PARTICLETYPE > particle, Vector< T, utilities::dimensions::convert< PARTICLETYPE::d >::rotation > torque)
ADf< T, DIM > fmod(const ADf< T, DIM > &a, const ADf< T, DIM > &b)
Expr pow(Expr base, Expr exp)
Top level namespace for all of OpenLB.
std::conditional_t< D==2, SmoothIndicatorF2D< T, T, PARTICLE >, SmoothIndicatorF3D< T, T, PARTICLE > > SmoothIndicatorF
Converts dimensions by deriving from given cartesian dimension D.