File indexing completed on 2026-09-11 09:29:57
0001
0002
0003
0004 #ifndef VECGEOM_VOLUMES_KERNEL_SCALEDSHAPEIMPLEMENTATION_H_
0005 #define VECGEOM_VOLUMES_KERNEL_SCALEDSHAPEIMPLEMENTATION_H_
0006
0007 #include "VecGeom/volumes/kernel/GenericKernels.h"
0008 #include "VecGeom/base/Vector3D.h"
0009 #include "VecGeom/volumes/ScaledShapeStruct.h"
0010
0011 #include <cstdio>
0012
0013 namespace vecgeom {
0014
0015 VECGEOM_DEVICE_FORWARD_DECLARE(struct ScaledShapeImplementation;);
0016 VECGEOM_DEVICE_DECLARE_CONV(struct, ScaledShapeImplementation);
0017
0018 inline namespace VECGEOM_IMPL_NAMESPACE {
0019
0020 class PlacedScaledShape;
0021 class UnplacedScaledShape;
0022
0023
0024
0025
0026 struct ScaledShapeImplementation {
0027
0028 using PlacedShape_t = PlacedScaledShape;
0029 using UnplacedStruct_t = ScaledShapeStruct<Precision>;
0030 using UnplacedVolume_t = UnplacedScaledShape;
0031
0032 template <typename Real_v, typename Bool_v>
0033 VECGEOM_FORCE_INLINE VECCORE_ATT_HOST_DEVICE static void Contains(UnplacedStruct_t const &unplaced,
0034 Vector3D<Real_v> const &point, Bool_v &inside);
0035
0036 template <typename Real_v, typename Inside_t>
0037 VECGEOM_FORCE_INLINE VECCORE_ATT_HOST_DEVICE static void Inside(UnplacedStruct_t const &unplaced,
0038 Vector3D<Real_v> const &point, Inside_t &inside);
0039
0040 template <typename Real_v>
0041 VECGEOM_FORCE_INLINE VECCORE_ATT_HOST_DEVICE static void DistanceToIn(UnplacedStruct_t const &unplaced,
0042 Vector3D<Real_v> const &point,
0043 Vector3D<Real_v> const &direction,
0044 Real_v const &stepMax, Real_v &distance);
0045
0046 template <typename Real_v>
0047 VECGEOM_FORCE_INLINE VECCORE_ATT_HOST_DEVICE static void DistanceToOut(UnplacedStruct_t const &unplaced,
0048 Vector3D<Real_v> const &point,
0049 Vector3D<Real_v> const &direction,
0050 Real_v const &stepMax, Real_v &distance);
0051
0052 template <typename Real_v>
0053 VECGEOM_FORCE_INLINE VECCORE_ATT_HOST_DEVICE static void SafetyToIn(UnplacedStruct_t const &unplaced,
0054 Vector3D<Real_v> const &point, Real_v &safety);
0055
0056 template <typename Real_v>
0057 VECGEOM_FORCE_INLINE VECCORE_ATT_HOST_DEVICE static void SafetyToOut(UnplacedStruct_t const &unplaced,
0058 Vector3D<Real_v> const &point, Real_v &safety);
0059
0060 template <typename Real_v>
0061 VECGEOM_FORCE_INLINE VECCORE_ATT_HOST_DEVICE static void NormalKernel(UnplacedStruct_t const &unplaced,
0062 Vector3D<Real_v> const &point,
0063 Vector3D<Real_v> &normal,
0064 vecCore::Mask_v<Real_v> &valid);
0065
0066 };
0067
0068
0069
0070 template <typename Real_v, typename Bool_v>
0071 VECCORE_ATT_HOST_DEVICE void ScaledShapeImplementation::Contains(UnplacedStruct_t const &unplaced,
0072 Vector3D<Real_v> const &point, Bool_v &inside)
0073 {
0074
0075
0076 Vector3D<Real_v> ulocalPoint;
0077 unplaced.fScale.Transform(point, ulocalPoint);
0078
0079
0080 inside = unplaced.fPlaced->Contains(ulocalPoint);
0081 }
0082
0083 template <typename Real_v, typename Inside_t>
0084 VECCORE_ATT_HOST_DEVICE void ScaledShapeImplementation::Inside(UnplacedStruct_t const &unplaced,
0085 Vector3D<Real_v> const &point, Inside_t &inside)
0086 {
0087
0088
0089 Vector3D<Real_v> ulocalPoint;
0090 unplaced.fScale.Transform(point, ulocalPoint);
0091
0092
0093 inside = unplaced.fPlaced->Inside(ulocalPoint);
0094 }
0095
0096 template <typename Real_v>
0097 VECCORE_ATT_HOST_DEVICE void ScaledShapeImplementation::DistanceToIn(UnplacedStruct_t const &unplaced,
0098 Vector3D<Real_v> const &point,
0099 Vector3D<Real_v> const &direction,
0100 Real_v const &stepMax, Real_v &distance)
0101 {
0102
0103
0104 Vector3D<Real_v> ulocalPoint;
0105 unplaced.fScale.Transform(point, ulocalPoint);
0106
0107
0108 Vector3D<Real_v> ulocalDir;
0109 unplaced.fScale.Transform(direction, ulocalDir);
0110 ulocalDir.Normalize();
0111
0112 auto ustepMax = unplaced.fScale.TransformDistance(stepMax, direction);
0113
0114
0115 distance = unplaced.fPlaced->DistanceToIn(ulocalPoint, ulocalDir, ustepMax);
0116
0117
0118 vecCore__MaskedAssignFunc(distance, distance < InfinityLength<Real_v>(),
0119 unplaced.fScale.InverseTransformDistance(distance, ulocalDir));
0120 }
0121
0122 template <typename Real_v>
0123 VECCORE_ATT_HOST_DEVICE void ScaledShapeImplementation::DistanceToOut(UnplacedStruct_t const &unplaced,
0124 Vector3D<Real_v> const &point,
0125 Vector3D<Real_v> const &direction,
0126 Real_v const &stepMax, Real_v &distance)
0127 {
0128
0129
0130 Vector3D<Real_v> ulocalPoint;
0131 unplaced.fScale.Transform(point, ulocalPoint);
0132
0133
0134 Vector3D<Real_v> ulocalDir;
0135 unplaced.fScale.Transform(direction, ulocalDir);
0136 ulocalDir.Normalize();
0137
0138 auto ustepMax = unplaced.fScale.TransformDistance(stepMax, direction);
0139
0140
0141 distance = unplaced.fPlaced->DistanceToOut(ulocalPoint, ulocalDir, ustepMax);
0142
0143
0144 vecCore__MaskedAssignFunc(distance, distance < InfinityLength<Real_v>(),
0145 unplaced.fScale.InverseTransformDistance(distance, ulocalDir));
0146 }
0147
0148 template <typename Real_v>
0149 VECCORE_ATT_HOST_DEVICE void ScaledShapeImplementation::SafetyToIn(UnplacedStruct_t const &unplaced,
0150 Vector3D<Real_v> const &point, Real_v &safety)
0151 {
0152
0153
0154 Vector3D<Real_v> ulocalPoint;
0155 unplaced.fScale.Transform(point, ulocalPoint);
0156
0157
0158 safety = unplaced.fPlaced->SafetyToIn(ulocalPoint);
0159 safety = unplaced.fScale.InverseTransformSafety(safety);
0160 }
0161
0162 template <typename Real_v>
0163 VECCORE_ATT_HOST_DEVICE void ScaledShapeImplementation::SafetyToOut(UnplacedStruct_t const &unplaced,
0164 Vector3D<Real_v> const &point, Real_v &safety)
0165 {
0166
0167
0168 Vector3D<Real_v> ulocalPoint;
0169 unplaced.fScale.Transform(point, ulocalPoint);
0170
0171
0172 safety = unplaced.fPlaced->SafetyToOut(ulocalPoint);
0173 safety = unplaced.fScale.InverseTransformSafety(safety);
0174 }
0175
0176 template <typename Real_v>
0177 VECCORE_ATT_HOST_DEVICE void ScaledShapeImplementation::NormalKernel(UnplacedStruct_t const &unplaced,
0178 Vector3D<Real_v> const &point,
0179 Vector3D<Real_v> &normal,
0180 vecCore::Mask_v<Real_v> &valid)
0181 {
0182
0183
0184 Vector3D<Real_v> ulocalPoint;
0185 unplaced.fScale.Transform(point, ulocalPoint);
0186
0187
0188 Vector3D<Real_v> ulocalNorm;
0189 valid = unplaced.fPlaced->Normal(ulocalPoint, ulocalNorm);
0190
0191
0192 unplaced.fScale.InverseTransformNormal(ulocalNorm, normal);
0193 normal.Normalize();
0194 }
0195 }
0196 }
0197
0198 #endif