Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2026-09-11 09:30:07

0001 #ifndef VECGEOM_VOLUMES_UNPLACEDMULTIUNION_H_
0002 #define VECGEOM_VOLUMES_UNPLACEDMULTIUNION_H_
0003 /**
0004  @brief Class representing an unplaced union of multiple placed solids, possibly overlapping.
0005  Implemented based on the class G4MultipleUnion
0006  @author mihaela.gheata@cern.ch
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; ///< Structure storing multi-union parameters
0029 
0030 public:
0031   // the constructor
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 & /*os*/) 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 }; // End class
0125 } // namespace VECGEOM_IMPL_NAMESPACE
0126 } // namespace vecgeom
0127 
0128 #endif /* VECGEOM_VOLUMES_UNPLACEDMULTIUNION_H_ */