File indexing completed on 2026-09-11 09:30:07
0001 #ifndef VECGEOM_VOLUMES_UNPLACEDMULTIUNION_H_
0002 #define VECGEOM_VOLUMES_UNPLACEDMULTIUNION_H_
0003
0004
0005
0006
0007
0008
0009 #include "VecGeom/base/Cuda.h"
0010 #include "VecGeom/base/Global.h"
0011 #include "VecGeom/base/AlignedBase.h"
0012 #include "VecGeom/base/Vector3D.h"
0013 #include "VecGeom/volumes/UnplacedVolume.h"
0014 #include "MultiUnionStruct.h"
0015 #include "VecGeom/volumes/kernel/MultiUnionImplementation.h"
0016 #include "VecGeom/volumes/UnplacedVolumeImplHelper.h"
0017
0018 namespace vecgeom {
0019
0020 VECGEOM_DEVICE_DECLARE_CONV(class, UnplacedMultiUnion);
0021 VECGEOM_DEVICE_FORWARD_DECLARE(class UnplacedMultiUnion;);
0022
0023 inline namespace VECGEOM_IMPL_NAMESPACE {
0024
0025 class UnplacedMultiUnion : public UnplacedVolumeImplHelper<MultiUnionImplementation>, public AlignedBase {
0026
0027 protected:
0028 mutable MultiUnionStruct fMultiUnion;
0029
0030 public:
0031
0032 VECCORE_ATT_HOST_DEVICE
0033 UnplacedMultiUnion() : fMultiUnion()
0034 {
0035 fGlobalConvexity = false;
0036 ComputeBBox();
0037 }
0038
0039 VECCORE_ATT_HOST_DEVICE
0040 VECGEOM_FORCE_INLINE
0041 void AddNode(VUnplacedVolume const *volume, Transformation3D const &transform)
0042 {
0043 LogicalVolume *lvol = new LogicalVolume(volume);
0044 VPlacedVolume *pvol = lvol->Place(new Transformation3D(transform));
0045 fMultiUnion.AddNode(pvol);
0046 }
0047
0048 VECCORE_ATT_HOST_DEVICE
0049 VECGEOM_FORCE_INLINE
0050 void AddNode(VPlacedVolume const *volume) { fMultiUnion.AddNode(volume); }
0051
0052 VECCORE_ATT_HOST_DEVICE
0053 void Close() { fMultiUnion.Close(); }
0054
0055 VECCORE_ATT_HOST_DEVICE
0056 VECGEOM_FORCE_INLINE
0057 VPlacedVolume const *GetNode(size_t i) const { return fMultiUnion.fVolumes[i]; }
0058
0059 VECCORE_ATT_HOST_DEVICE
0060 VECGEOM_FORCE_INLINE
0061 virtual ESolidType GetType() const override { return ESolidType::multiunion; }
0062
0063 VECCORE_ATT_HOST_DEVICE
0064 MultiUnionStruct const &GetStruct() const { return fMultiUnion; }
0065
0066 VECCORE_ATT_HOST_DEVICE
0067 bool Normal(Vector3D<Precision> const &point, Vector3D<Precision> &normal) const override;
0068
0069 Precision Capacity() const override;
0070
0071 Precision SurfaceArea() const override;
0072
0073 VECCORE_ATT_HOST_DEVICE
0074 VECGEOM_FORCE_INLINE
0075 size_t GetNumberOfSolids() const { return fMultiUnion.fVolumes.size(); }
0076
0077 VECCORE_ATT_HOST_DEVICE
0078 void Extent(Vector3D<Precision> &aMin, Vector3D<Precision> &aMax) const override
0079 {
0080 aMin = fMultiUnion.fMinExtent;
0081 aMax = fMultiUnion.fMaxExtent;
0082 }
0083
0084 Vector3D<Precision> SamplePointOnSurface() const override;
0085
0086 std::string GetEntityType() const { return "MultiUnion"; }
0087
0088 VECCORE_ATT_HOST_DEVICE
0089 virtual void Print() const override {};
0090
0091 virtual void Print(std::ostream & ) const override {};
0092
0093 VECCORE_ATT_DEVICE
0094 static VPlacedVolume *Create(LogicalVolume const *const logical_volume, Transformation3D const *const transformation,
0095 #ifdef VECCORE_CUDA
0096 const int id,
0097 #endif
0098 VPlacedVolume *const placement = NULL);
0099
0100 #ifdef VECGEOM_CUDA_INTERFACE
0101 #ifdef VECGEOM_CUDA_HYBRID2
0102 virtual size_t DeviceSizeOf() const override { return DevicePtr<cuda::UnplacedMultiUnion>::SizeOf(); }
0103 virtual DevicePtr<cuda::VUnplacedVolume> CopyToGpu() const override;
0104 virtual DevicePtr<cuda::VUnplacedVolume> CopyToGpu(DevicePtr<cuda::VUnplacedVolume> const gpu_ptr) const override;
0105 #else
0106 virtual size_t DeviceSizeOf() const override { return 0; }
0107 virtual DevicePtr<cuda::VUnplacedVolume> CopyToGpu() const override { return DevicePtr<cuda::VUnplacedVolume>(); }
0108 virtual DevicePtr<cuda::VUnplacedVolume> CopyToGpu(DevicePtr<cuda::VUnplacedVolume> const gpu_ptr) const override
0109 {
0110 return DevicePtr<cuda::VUnplacedVolume>(gpu_ptr);
0111 }
0112 #endif
0113 #endif
0114
0115 private:
0116 VECCORE_ATT_DEVICE
0117 virtual VPlacedVolume *SpecializedVolume(LogicalVolume const *const volume,
0118 Transformation3D const *const transformation,
0119 #ifdef VECCORE_CUDA
0120 const int id,
0121 #endif
0122 VPlacedVolume *const placement = NULL) const override;
0123
0124 };
0125 }
0126 }
0127
0128 #endif