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>
105 return providesID<PARTICLETYPE>();
109template<
typename PARTICLETYPE>
112 using namespace descriptors;
113 return PARTICLETYPE::template providesNested<GENERAL,INVALID>();
115template<
typename T,
typename PARTICLETYPE>
117 return providesInvalid<PARTICLETYPE>();
121template<
typename PARTICLETYPE>
124 using namespace descriptors;
125 return PARTICLETYPE::template providesNested<GENERAL,POSITION>();
127template<
typename T,
typename PARTICLETYPE>
129 return providesPosition<PARTICLETYPE>();
133template<
typename PARTICLETYPE>
136 using namespace descriptors;
137 return PARTICLETYPE::template providesNested<PHYSPROPERTIES,RADIUS>();
139template<
typename T,
typename PARTICLETYPE>
141 return providesRadius<PARTICLETYPE>();
145template<
typename PARTICLETYPE>
148 using namespace descriptors;
149 return PARTICLETYPE::template providesNested<PHYSPROPERTIES,DENSITY>();
151template<
typename T,
typename PARTICLETYPE>
153 return providesDensity<PARTICLETYPE>();
157template<
typename PARTICLETYPE>
160 using namespace descriptors;
161 return PARTICLETYPE::template providesNested<PHYSPROPERTIES,MASS>();
163template<
typename T,
typename PARTICLETYPE>
165 return providesMass<PARTICLETYPE>();
169template<
typename PARTICLETYPE>
172 using namespace descriptors;
173 return providesMass<PARTICLETYPE>() || providesDensity<PARTICLETYPE>();
175template<
typename T,
typename PARTICLETYPE>
177 return providesMassOrDensity<PARTICLETYPE>();
181template<
typename PARTICLETYPE>
184 using namespace descriptors;
185 return PARTICLETYPE::template providesNested<SURFACE,ANGLE>();
187template<
typename T,
typename PARTICLETYPE>
189 return providesAngle<PARTICLETYPE>();
193template<
typename PARTICLETYPE>
196 using namespace descriptors;
197 return PARTICLETYPE::template providesNested<MOBILITY,VELOCITY>();
199template<
typename T,
typename PARTICLETYPE>
201 return providesVelocity<PARTICLETYPE>();
205template<
typename PARTICLETYPE>
208 using namespace descriptors;
209 return PARTICLETYPE::template providesNested<MOBILITY,ANG_VELOCITY>();
211template<
typename T,
typename PARTICLETYPE>
213 return providesAngVelocity<PARTICLETYPE>();
217template<
typename PARTICLETYPE>
220 using namespace descriptors;
221 return PARTICLETYPE::template providesNested<FORCING,FORCE>();
223template<
typename T,
typename PARTICLETYPE>
225 return providesForce<PARTICLETYPE>();
229template<
typename PARTICLETYPE>
232 using namespace descriptors;
233 return PARTICLETYPE::template providesNested<FORCING,TORQUE>();
235template<
typename T,
typename PARTICLETYPE>
237 return providesTorque<PARTICLETYPE>();
241template<
typename PARTICLETYPE>
244 using namespace descriptors;
245 return PARTICLETYPE::template providesNested<FORCING,ADHESION>();
247template<
typename T,
typename PARTICLETYPE>
249 return providesAdhesion<PARTICLETYPE>();
253template<
typename PARTICLETYPE>
256 using namespace descriptors;
257 return PARTICLETYPE::template providesNested<PHYSPROPERTIES,MOFI>();
259template<
typename T,
typename PARTICLETYPE>
261 return providesMomentOfInertia<PARTICLETYPE>();
265template<
typename PARTICLETYPE>
268 using namespace descriptors;
269 return PARTICLETYPE::template providesNested<GENERAL,INVALID>();
271template<
typename T,
typename PARTICLETYPE>
273 return providesValid<PARTICLETYPE>();
277template<
typename PARTICLETYPE>
280 using namespace descriptors;
281 return PARTICLETYPE::template providesNested<DYNBEHAVIOUR,DYNAMICS_ID>();
283template<
typename T,
typename PARTICLETYPE>
285 return providesDynamicsID<PARTICLETYPE>();
289template<
typename PARTICLETYPE>
292 using namespace descriptors;
293 return PARTICLETYPE::template providesNested<DYNBEHAVIOUR,ACTIVE>();
295template<
typename T,
typename PARTICLETYPE>
297 return providesActive<PARTICLETYPE>();
301template<
typename PARTICLETYPE>
304 using namespace descriptors;
305 return PARTICLETYPE::template providesNested<DYNBEHAVIOUR,COMPUTE_MOTION>();
307template<
typename T,
typename PARTICLETYPE>
309 return providesComputeMotion<PARTICLETYPE>();
313template<
typename PARTICLETYPE>
316 using namespace descriptors;
317 return PARTICLETYPE::template providesNested<DYNBEHAVIOUR,COMPUTE_CONTACT>();
319template<
typename T,
typename PARTICLETYPE>
321 return providesComputeContact<PARTICLETYPE>();
325template<
typename PARTICLETYPE>
328 using namespace descriptors;
329 return PARTICLETYPE::template providesNested<SURFACE,ROT_MATRIX>();
331template<
typename T,
typename PARTICLETYPE>
333 return providesRotationMatrix<PARTICLETYPE>();
337template<
typename PARTICLETYPE>
340 using namespace descriptors;
341 return PARTICLETYPE::template providesNested<SURFACE>();
343template<
typename T,
typename PARTICLETYPE>
345 return providesSurface<PARTICLETYPE>();
349template<
typename PARTICLETYPE>
352 using namespace descriptors;
353 return PARTICLETYPE::template providesNested<SURFACE,SINDICATOR>();
355template<
typename T,
typename PARTICLETYPE>
358 return providesSmoothIndicator<PARTICLETYPE>();
362template<
typename PARTICLETYPE>
365 using namespace descriptors;
366 return PARTICLETYPE::template providesNested<PARALLELIZATION>();
368template<
typename T,
typename PARTICLETYPE>
370 return providesParallelization<PARTICLETYPE>();
373template<
typename PARTICLETYPE>
376 using namespace descriptors;
377 return PARTICLETYPE::template providesNested<PHYSPROPERTIES,SPECIES>();
379template<
typename T,
typename PARTICLETYPE>
381 return providesSpecies<PARTICLETYPE>();
384template<
typename PARTICLETYPE>
387 using namespace descriptors;
388 return PARTICLETYPE::template providesNested<DYNBEHAVIOUR,DETACHING>();
390template<
typename T,
typename PARTICLETYPE>
392 return providesDetaching<PARTICLETYPE>();
395template<
typename PARTICLETYPE>
398 using namespace descriptors;
399 return PARTICLETYPE::template providesNested<SURFACE,COR_OFFSET>();
401template<
typename T,
typename PARTICLETYPE>
403 return providesCORoffset<PARTICLETYPE>();
406template<
typename PARTICLETYPE>
409 using namespace descriptors;
410 return PARTICLETYPE::template providesNested<SURFACE,ELONGATION>();
412template<
typename T,
typename PARTICLETYPE>
414 return providesElongation<PARTICLETYPE>();
417template<
typename PARTICLETYPE>
420 using namespace descriptors;
421 return PARTICLETYPE::template providesNested<MOBILITY,ACCELERATION_STRD>();
423template<
typename T,
typename PARTICLETYPE>
425 return providesAccelerationStrd<PARTICLETYPE>();
428template<
typename PARTICLETYPE>
431 using namespace descriptors;
432 return PARTICLETYPE::template providesNested<MOBILITY,ANG_ACC_STRD>();
434template<
typename T,
typename PARTICLETYPE>
436 return providesAngAccelerationStrd<PARTICLETYPE>();
439template<
typename PARTICLETYPE>
442 using namespace descriptors;
443 return PARTICLETYPE::template providesNested<NUMERICPROPERTIES,ENLARGEMENT_FOR_CONTACT>();
445template<
typename T,
typename PARTICLETYPE>
447 return providesEnlargementForContactTreatment<PARTICLETYPE>();
450template<
typename PARTICLETYPE>
453 using namespace descriptors;
454 return PARTICLETYPE::template providesNested<MECHPROPERTIES,MATERIAL>();
456template<
typename T,
typename PARTICLETYPE>
458 return providesContactMaterial<PARTICLETYPE>();
461template<
typename PARTICLETYPE>
464 return (PARTICLETYPE::d==2);
466template<
typename T,
typename PARTICLETYPE>
468 return is2D<PARTICLETYPE>();
471template<
typename PARTICLETYPE>
474 return (PARTICLETYPE::d==3);
476template<
typename T,
typename PARTICLETYPE>
478 return is3D<PARTICLETYPE>();
483template<
typename T,
typename PARTICLETYPE>
486 using namespace descriptors;
487 constexpr unsigned D = PARTICLETYPE::d;
488 static_assert(providesPosition<PARTICLETYPE>(),
489 "Field GENERAL:POSITION has to be provided");
490 Vector<T,D> position( particle.template getField<GENERAL,POSITION>() );
494template<
bool ensureAngularBounds=false,
typename T,
typename PARTICLETYPE>
497 using namespace descriptors;
499 static_assert(providesAngle<PARTICLETYPE>(),
"Field SURFACE:ANGLE has to be provided");
500 Vector<T,Drot> angle( particle.template getField<SURFACE,ANGLE>() );
501 if constexpr (ensureAngularBounds){
502 for (
unsigned iRot=0; iRot<Drot; ++iRot) {
509template<
typename T,
typename PARTICLETYPE>
512 using namespace descriptors;
514 static_assert(providesRotationMatrix<PARTICLETYPE>(),
"Field SURFACE:ROT_MATRIX has to be provided");
515 Vector<T,DrotMat> rotationMatrix( particle.template getField<SURFACE,ROT_MATRIX>() );
516 return rotationMatrix;
519template<
unsigned dir=2,
typename T,
typename PARTICLETYPE>
522 using namespace descriptors;
523 constexpr unsigned D = PARTICLETYPE::d;
527 for (
unsigned iDim=0; iDim<D; ++iDim) {
528 unsigned iMat = D*iDim+dir;
529 normal[iDim] = rotationMatrix[iMat];
534template<
typename T,
typename PARTICLETYPE>
537 using namespace descriptors;
538 constexpr unsigned D = PARTICLETYPE::d;
539 static_assert(providesVelocity<PARTICLETYPE>(),
"Field MOBILITY:VELOCITY has to be provided");
540 Vector<T,D> velocity( particle.template getField<MOBILITY,VELOCITY>() );
544template<
typename T,
typename PARTICLETYPE>
547 using namespace descriptors;
549 static_assert(providesAngVelocity<PARTICLETYPE>(),
"Field MOBILITY:ANG_VELOCITY has to be provided");
550 Vector<T,Drot> angVelocity( particle.template getField<MOBILITY,ANG_VELOCITY>() );
554template<
typename T,
typename PARTICLETYPE>
557 using namespace descriptors;
558 constexpr unsigned D = PARTICLETYPE::d;
559 static_assert(providesForce<PARTICLETYPE>(),
"Field FORCING:FORCE has to be provided");
560 Vector<T,D> force( particle.template getField<FORCING,FORCE>() );
564template<
typename T,
typename PARTICLETYPE>
567 using namespace descriptors;
569 static_assert(providesTorque<PARTICLETYPE>(),
"Field FORCING:TORQUE has to be provided");
570 Vector<T,Drot> torque( particle.template getField<FORCING,TORQUE>() );
574template<
typename T,
typename PARTICLETYPE>
577 using namespace descriptors;
579 static_assert(providesMomentOfInertia<PARTICLETYPE>(),
"Field PHYSPROPERTIES:MOFI has to be provided");
580 Vector<T,Drot> mofi( particle.template getField<PHYSPROPERTIES,MOFI>() );
585template<
typename T,
typename PARTICLETYPE>
588 using namespace descriptors;
590 static_assert(providesAdhesion<PARTICLETYPE>(),
"Field FORCING:ADHESION has to be provided");
591 Vector<T,2> adhesion( particle.template getField<FORCING,ADHESION>() );
595template<
typename T,
typename PARTICLETYPE>
598 using namespace descriptors;
600 if constexpr(providesValid<PARTICLETYPE>()) {
601 valid = !particle.template getField<GENERAL,INVALID>();
606template<
typename T,
typename PARTICLETYPE>
609 using namespace descriptors;
611 if constexpr(providesActive<PARTICLETYPE>()) {
612 active = particle.template getField<DYNBEHAVIOUR,ACTIVE>();
618template<
typename T,
typename PARTICLETYPE>
621 using namespace descriptors;
622 static_assert(providesSmoothIndicator<PARTICLETYPE>(),
"Field FORCING:SINDICATOR has to be provided");
623 auto sIndicatorPtr = particle.template getField<SURFACE,SINDICATOR>();
624 return sIndicatorPtr;
628template<
typename T,
typename PARTICLETYPE>
631 using namespace descriptors;
633 if constexpr (providesSmoothIndicator<PARTICLETYPE>() ) {
636 else if constexpr ( providesRadius<PARTICLETYPE>() ) {
637 radius = particle.template getField<PHYSPROPERTIES,RADIUS>();
640 std::cerr <<
"ERROR: no Field found providing radius!" << std::endl;
647template<
typename T,
typename PARTICLETYPE>
650 using namespace descriptors;
651 constexpr unsigned D = PARTICLETYPE::d;
654 if constexpr (D == 3) {
663 if constexpr(D == 3) {
669 volume *= shapeFactor;
674template<
typename T,
typename PARTICLETYPE>
677 using namespace descriptors;
679 "Field PHYSPROPERTIES:MASS or PHYSPROPERTIES:DENSITY has to be provided");
683 density = particle.template getField<PHYSPROPERTIES, DENSITY>();
686 const T mass = particle.template getField<PHYSPROPERTIES, MASS>();
687 density = mass /
getVolume(particle, shapeFactor);
692template<
typename T,
typename PARTICLETYPE>
695 using namespace descriptors;
697 "Field PHYSPROPERTIES:MASS or PHYSPROPERTIES:DENSITY has to be provided");
701 mass = particle.template getField<PHYSPROPERTIES, MASS>();
704 const T density = particle.template getField<PHYSPROPERTIES, DENSITY>();
705 mass = density *
getVolume(particle, shapeFactor);
710template<
typename T,
typename PARTICLETYPE>
713 using namespace descriptors;
716 return particle.template getField<MOBILITY,ACCELERATION_STRD>();
720template<
typename T,
typename PARTICLETYPE>
723 using namespace descriptors;
724 static_assert(providesAccelerationStrd<PARTICLETYPE>(),
"Field MOBILITY:ACCELERATION has to be provided");
726 particle.template setField<MOBILITY, ACCELERATION_STRD>(acceleration);
730template<
typename T,
typename PARTICLETYPE>
733 using namespace descriptors;
734 constexpr unsigned D = PARTICLETYPE::d;
736 static_assert(providesForce<PARTICLETYPE>(),
"Field FORCING:FORCE has to be provided");
737 static_assert(providesMass<PARTICLETYPE>(),
"Field PHYSPROPERTIES:MASS has to be provided");
742 for (
unsigned iDim=0; iDim<D; ++iDim) {
743 acceleration[iDim] = force[iDim] / mass;
750template<
typename T,
typename PARTICLETYPE>
754 using namespace descriptors;
757 static_assert(providesTorque<PARTICLETYPE>(),
"Field FORCING:TORQUE has to be provided");
758 static_assert(providesMomentOfInertia<PARTICLETYPE>(),
"Field PHYSPROPERTIES:MOFI has to be provided");
762 if constexpr (PARTICLETYPE::d == 3 && providesRotationMatrix<PARTICLETYPE>()) {
766 for (
unsigned iRot=0; iRot<Drot; ++iRot) {
767 angularAcceleration[iRot] = torque[iRot] / momentOfInertia[iRot];
770 return angularAcceleration;
773template<
typename T,
typename PARTICLETYPE>
776 using namespace descriptors;
779 return particle.template getField<MOBILITY,ANG_ACC_STRD>();
784template<
typename T,
typename PARTICLETYPE>
787 using namespace descriptors;
788 static_assert(providesID<PARTICLETYPE>(),
"Field PARALLELIZATION:ID has to be provided");
789 auto globalID = particle.template getField<PARALLELIZATION,ID>();
794template<
typename T,
typename PARTICLETYPE>
797 using namespace descriptors;
798 static_assert(providesID<PARTICLETYPE>(),
"Field PARALLELIZATION:ID has to be provided");
799 auto globalIC = particle.template getField<PARALLELIZATION,IC>();
804template<
typename T,
typename PARTICLETYPE>
807 using namespace descriptors;
808 static_assert(providesDynamicsID<PARTICLETYPE>(),
809 "Field DYNBEHAVIOUR:DYNAMICS_ID has to be provided");
810 unsigned short dynamicsID = particle.template getField<DYNBEHAVIOUR,DYNAMICS_ID>();
815template<
typename T,
typename PARTICLETYPE>
818 using namespace descriptors;
819 static_assert(providesDetaching<PARTICLETYPE>(),
820 "Field DYNBEHAVIOUR:DETACHING has to be provided");
821 bool detaching = particle.template getField<DYNBEHAVIOUR,DETACHING>();
827template<
typename T,
typename PARTICLETYPE>
830 using namespace descriptors;
831 constexpr unsigned D = PARTICLETYPE::d;
832 static_assert(providesSmoothIndicator<PARTICLETYPE>(),
"Field FORCING:SINDICATOR has to be provided");
833 using SIndicatorType = std::conditional_t<
840 auto sIndicatorCuboidPtr =
static_cast<SIndicatorType*
>(sIndicatorPtr);
841 auto& indicatorCuboid = sIndicatorCuboidPtr->getIndicator();
845 indicatorCuboid.getxLength(),
846 indicatorCuboid.getyLength()
851 indicatorCuboid.getxLength(),
852 indicatorCuboid.getyLength(),
853 indicatorCuboid.getzLength()
859template<
typename T,
typename PARTICLETYPE>
862 using namespace descriptors;
863 constexpr unsigned D = PARTICLETYPE::d;
864 static_assert(providesCORoffset<PARTICLETYPE>(),
"Field SURFACE:COR_OFFSET has to be provided");
865 Vector<T,D> offsetCOR( particle.template getField<SURFACE,COR_OFFSET>() );
869template<
typename T,
typename PARTICLETYPE>
872 using namespace descriptors;
873 constexpr unsigned D = PARTICLETYPE::d;
874 static_assert(providesElongation<PARTICLETYPE>(),
"Field SURFACE:ELONGATION has to be provided");
875 Vector<T,D> elongation( particle.template getField<SURFACE,ELONGATION>() );
880template<
typename T,
typename PARTICLETYPE>
883 using namespace descriptors;
884 if constexpr (access::providesEnlargementForContactTreatment<PARTICLETYPE>()) {
885 return particle.template getField<NUMERICPROPERTIES,ENLARGEMENT_FOR_CONTACT>();
891 __builtin_unreachable();
894template<
typename T,
typename PARTICLETYPE>
897 using namespace descriptors;
899 "Field MECHPROPERTIES::MATERIAL has to be provided");
900 return particle.template getField<MECHPROPERTIES, MATERIAL>();
905template<
typename T,
typename PARTICLETYPE>
908 using namespace descriptors;
910 "Field PHYSPROPERTIES:MASS or PHYSPROPERTIES:DENSITY has to be provided");
913 particle.template setField<PHYSPROPERTIES, DENSITY>(density);
916 const T mass = density *
getVolume(particle, shapeFactor);
917 particle.template setField<PHYSPROPERTIES, MASS>(mass);
921template<
typename T,
typename PARTICLETYPE>
924 using namespace descriptors;
926 "Field PHYSPROPERTIES:MASS or PHYSPROPERTIES:DENSITY has to be provided");
929 particle.template setField<PHYSPROPERTIES, MASS>(mass);
932 const T density = mass /
getVolume(particle, shapeFactor);
933 particle.template setField<PHYSPROPERTIES, DENSITY>(density);
937template<
typename T,
typename PARTICLETYPE>
940 using namespace descriptors;
942 "Field GENERAL:POSITION has to be provided");
943 particle.template setField<GENERAL, POSITION>(position);
946template<
typename T,
typename PARTICLETYPE>
949 using namespace descriptors;
951 "Field MECHPROPERTIES::MATERIAL has to be provided");
952 particle.template setField<MECHPROPERTIES, MATERIAL>(material);
955template<
typename T,
typename PARTICLETYPE>
958 using namespace descriptors;
959 static_assert(providesAngle<PARTICLETYPE>(),
"Field SURFACE:ANGLE has to be provided");
961 PARTICLETYPE::d>::serialize_rotation(angle));
964template<
typename T,
typename PARTICLETYPE>
967 using namespace descriptors;
968 static_assert(providesRotationMatrix<PARTICLETYPE>(),
"Field SURFACE:ROT_MATRIX has to be provided");
969 particle.template setField<SURFACE,ROT_MATRIX>(rotMatrix);
972template<
typename T,
typename PARTICLETYPE>
975 using namespace descriptors;
976 static_assert(providesVelocity<PARTICLETYPE>(),
"Field MOBILITY:VELOCITY has to be provided");
977 particle.template setField<MOBILITY,VELOCITY>(velocity);
980template<
typename T,
typename PARTICLETYPE>
983 using namespace descriptors;
984 static_assert(providesAngVelocity<PARTICLETYPE>(),
"Field MOBILITY:ANG_VELOCITY has to be provided");
986 PARTICLETYPE::d>::serialize_rotation(angVelocity));
989template<
typename T,
typename PARTICLETYPE>
992 using namespace descriptors;
993 static_assert(providesAngAccelerationStrd<PARTICLETYPE>(),
"Field MOBILITY:ANG_ACC_STRD has to be provided");
995 PARTICLETYPE::d>::serialize_rotation(angAcceleration));
1000template<
typename T,
typename PARTICLETYPE>
1003 using namespace descriptors;
1004 static_assert(providesForce<PARTICLETYPE>(),
"Field FORCING:FORCE has to be provided");
1005 particle.template setField<FORCING,FORCE>(force);
1008template<
typename T,
typename PARTICLETYPE>
1011 using namespace descriptors;
1012 static_assert(providesTorque<PARTICLETYPE>(),
"Field FORCING:TORQUE has to be provided");
1014 PARTICLETYPE::d>::serialize_rotation(torque));
1017template<
typename T,
typename PARTICLETYPE>
1020 using namespace descriptors;
1021 static_assert(providesMomentOfInertia<PARTICLETYPE>(),
"Field PHYSPROPERTIES:MOFI has to be provided");
1023 PARTICLETYPE::d>::serialize_rotation(mofi));
1027template<
typename T,
typename PARTICLETYPE>
1030 using namespace descriptors;
1031 static_assert(providesAdhesion<PARTICLETYPE>(),
"Field FORCING:ADHESION has to be provided");
1032 particle.template setField<FORCING,ADHESION>(adhesion);
1035template<
typename T,
typename PARTICLETYPE>
1038 using namespace descriptors;
1039 static_assert(providesInvalid<PARTICLETYPE>(),
"Field GENERAL:INVALID has to be provided");
1040 particle.template setField<GENERAL,INVALID>( value );
1043template<
typename T,
typename PARTICLETYPE>
1049template<
typename T,
typename PARTICLETYPE>
1052 using namespace descriptors;
1053 static_assert(providesActive<PARTICLETYPE>(),
"Field DYNBEHAVIOUR:ACTIVE has to be provided");
1054 particle.template setField<DYNBEHAVIOUR,ACTIVE>( value );
1057template<
typename T,
typename PARTICLETYPE>
1064template<
typename T,
typename PARTICLETYPE>
1068 using namespace descriptors;
1069 static_assert(providesSmoothIndicator<PARTICLETYPE>(),
"Field FORCING:SINDICATOR has to be provided");
1070 particle.template setField<SURFACE,SINDICATOR>(sindicator);
1074template<
typename T,
typename PARTICLETYPE>
1077 using namespace descriptors;
1078 static_assert(providesRadius<PARTICLETYPE>(),
"Field PHYSPROPERTIES:RADIUS has to be provided");
1079 particle.template setField<PHYSPROPERTIES,RADIUS>(radius);
1082template<
typename T,
typename PARTICLETYPE>
1085 using namespace descriptors;
1086 static_assert(providesID<PARTICLETYPE>(),
"Field PARALLELIZATION:ID has to be provided");
1087 particle.template setField<PARALLELIZATION,ID>(
id);
1090template<
typename T,
typename PARTICLETYPE>
1093 using namespace descriptors;
1094 static_assert(providesID<PARTICLETYPE>(),
"Field PARALLELIZATION:ID has to be provided");
1095 particle.template setField<PARALLELIZATION,IC>(
id);
1098template<
typename T,
typename PARTICLETYPE>
1101 using namespace descriptors;
1102 static_assert(providesDynamicsID<PARTICLETYPE>(),
1103 "Field DYNBEHAVIOUR:DYNAMICS_ID has to be provided");
1104 particle.template setField<DYNBEHAVIOUR,DYNAMICS_ID>(dynamicsID);
1107template<
typename T,
typename PARTICLETYPE>
1110 using namespace descriptors;
1111 static_assert(providesDetaching<PARTICLETYPE>(),
1112 "Field DYNBEHAVIOUR:DETACHING has to be provided");
1113 particle.template setField<DYNBEHAVIOUR,DETACHING>(value);
1116template<
typename T,
typename PARTICLETYPE>
1119 using namespace descriptors;
1120 static_assert(providesCORoffset<PARTICLETYPE>(),
"Field SURFACE:COR_OFFSET has to be provided");
1121 particle.template setField<SURFACE,COR_OFFSET>(offsetCOR);
1124template<
typename T,
typename PARTICLETYPE>
1127 using namespace descriptors;
1128 static_assert(providesElongation<PARTICLETYPE>(),
"Field SURFACE:ELONGATION has to be provided");
1129 particle.template setField<SURFACE,ELONGATION>(elongation);
1132template<
typename T,
typename PARTICLETYPE>
1135 using namespace descriptors;
1136 static_assert(access::providesEnlargementForContactTreatment<PARTICLETYPE>(),
"Field NUMERICPROPERTIES:ENLARGEMENT_FOR_CONTACT has to be provided");
1137 particle.template setField<NUMERICPROPERTIES, ENLARGEMENT_FOR_CONTACT>(value);
1141template<
typename T,
typename PARTICLETYPE>
1144 using namespace descriptors;
1147 if constexpr(!providesComputeMotion<PARTICLETYPE>()) {
1151 return particle.template getField<DYNBEHAVIOUR,COMPUTE_MOTION>();
1154 __builtin_unreachable();
1158template<
typename T,
typename PARTICLETYPE>
1161 using namespace descriptors;
1165 if constexpr(!providesComputeContact<PARTICLETYPE>()) {
1169 return particle.template getField<DYNBEHAVIOUR,COMPUTE_CONTACT>();
1172 __builtin_unreachable();
1176template<
typename T,
typename PARTICLETYPE>
1183template<
typename T,
typename PARTICLETYPE>
1186 using namespace descriptors;
1187 static_assert(providesComputeMotion<PARTICLETYPE>(),
"Field DYNBEHAVIOUR:COMPUTE_MOTION has to be provided");
1188 particle.template setField<DYNBEHAVIOUR, COMPUTE_MOTION>(value);
1191template<
typename T,
typename PARTICLETYPE>
1194 using namespace descriptors;
1195 static_assert(providesComputeContact<PARTICLETYPE>(),
"Field DYNBEHAVIOUR:COMPUTE_CONTACT has to be provided");
1196 particle.template setField<DYNBEHAVIOUR, COMPUTE_CONTACT>(value);
1199template<
typename T,
typename PARTICLETYPE>
1205template<
typename T,
typename PARTICLETYPE>
1211template<
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 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)
cpu::simd::Pack< T > pow(cpu::simd::Pack< T > base, cpu::simd::Pack< T > 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.