ESyS-Particle  4.0.1
RandomBoxPacker.h
00001 
00002 //                                                         //
00003 // Copyright (c) 2003-2011 by The University of Queensland //
00004 // Earth Systems Science Computational Centre (ESSCC)      //
00005 // http://www.uq.edu.au/esscc                              //
00006 //                                                         //
00007 // Primary Business: Brisbane, Queensland, Australia       //
00008 // Licensed under the Open Software License version 3.0    //
00009 // http://www.opensource.org/licenses/osl-3.0.php          //
00010 //                                                         //
00012 
00013 
00014 #ifndef ESYS_LSMRANDOMBOXPACKER_H
00015 #define ESYS_LSMRANDOMBOXPACKER_H
00016 
00017 #include "Foundation/console.h"
00018 #include "Foundation/Rng.h"
00019 #include "Geometry/CubicBoxPacker.h"
00020 #include "Geometry/SphereFitter.h"
00021 #include "Geometry/Plane.h"
00022 
00023 #include <vector>
00024 #include <boost/shared_ptr.hpp>
00025 
00026 namespace esys
00027 {
00028   namespace lsm
00029   {
00030     template <typename TmplFitterTraits>
00031     class FittedParticleIterator
00032     {
00033     public:
00034       typedef TmplFitterTraits                   FitterTraits;
00035       typedef typename FitterTraits::Plane       Plane;
00036       typedef typename FitterTraits::PlaneVector PlaneVector;
00037       typedef typename FitterTraits::Packer      Packer;
00038       typedef typename Packer::Particle          Particle;
00039       typedef typename Packer::ParticleVector    ParticleVector;
00040       
00041       class FitTraits
00042       {
00043       public:
00044         typedef Packer                           Validator;
00045         typedef typename Packer::Particle        Particle;
00046         typedef typename Packer::ParticleVector  ParticleVector;
00047         typedef typename FitterTraits::Plane     Plane;
00048       };
00049 
00050       typedef SphereFitter<FitTraits>            Fitter;
00051       typedef boost::shared_ptr<Fitter>          FitterPtr;
00052       typedef std::vector<FitterPtr>             FitterPtrVector;
00053       typedef MoveToSurfaceFitter<FitTraits>     Move2SurfaceFitter;
00054       typedef ThreeDSphereFitter<FitTraits>      ThreeDFitter;
00055       typedef TwoDSphereFitter<FitTraits>        TwoDFitter;
00056       typedef TwoDPlaneSphereFitter<FitTraits>   TwoDPlaneFitter;
00057       typedef ThreeDPlaneSphereFitter<FitTraits> ThreeDPlaneFitter;
00058 
00059       FittedParticleIterator(
00060         Packer            &packer,
00061         int               maxInsertionFailures,
00062         const PlaneVector &fitPlaneVector
00063       );
00064 
00065       void initialiseFitterPtrVector();
00066 
00067       int getMaxInsertionFailures() const;
00068 
00069       const FitterPtrVector &getFitterPtrVector() const;
00070 
00071       FitterPtrVector &getFitterPtrVector();
00072 
00073       const PlaneVector &getFitPlaneVector() const;
00074 
00075       const Packer &getPacker() const;
00076 
00077       Packer &getPacker();
00078 
00079       Plane getClosestFitPlane(const Particle &particle) const;
00080 
00081       double getRandom(double min, double max) const;
00082 
00083       Vec3 getRandomPoint() const;
00084 
00085       Particle getCandidateParticle(const Vec3 &point);
00086 
00087       ParticleVector getClosestNeighbours(const Particle& particle, int numClosest);
00088 
00089       Particle &generateNext();
00090 
00091       bool hasNext();
00092 
00093       Particle next();
00094 
00095       void logInfo();
00096 
00097     private:
00098       Packer          *m_pPacker;
00099       PlaneVector     m_fitPlaneVector;
00100       int             m_maxInsertionFailures;      
00101       int             m_lastFailCount;
00102       int             m_successCount;
00103       Particle        m_next;
00104       FitterPtrVector m_fitterPtrVector;
00105     };
00106 
00110     template <typename TmplParticleGenerator,template <typename TmplPartGen> class TmplCubicBoxPackerWrap>
00111     class RandomBoxPacker : public TmplCubicBoxPackerWrap<TmplParticleGenerator>::CubicBoxPackerBase
00112     {
00113     public:
00114       typedef
00115         typename TmplCubicBoxPackerWrap<TmplParticleGenerator>::CubicBoxPackerBase
00116         Inherited;
00117       typedef typename Inherited::ParticleGenerator     ParticleGenerator;
00118       typedef typename Inherited::ParticleGeneratorPtr  ParticleGeneratorPtr;
00119       typedef typename Inherited::Particle              Particle;
00120       typedef typename Inherited::NTable                NTable;
00121       typedef typename Inherited::NTablePtr             NTablePtr;
00122       typedef typename NTable::ParticleVector           ParticleVector;
00123       typedef typename Inherited::ParticlePool          ParticlePool;
00124       typedef typename Inherited::ParticlePoolPtr       ParticlePoolPtr;
00125       typedef std::vector<Plane>                        PlaneVector;
00126 
00127       class StufferTraits
00128       {
00129       public:
00130         typedef RandomBoxPacker              Packer;
00131         typedef esys::lsm::Plane             Plane;
00132         typedef typename Packer::PlaneVector PlaneVector;
00133       };
00134       typedef FittedParticleIterator<StufferTraits> StuffedParticleIterator;
00135 
00136       RandomBoxPacker(
00137         ParticleGeneratorPtr particleGeneratorPtr,
00138         ParticlePoolPtr      particlePoolPtr,
00139         NTablePtr            nTablePtr,
00140         const BoundingBox    &bBox,
00141         const BoolVector     &periodicDimensions,
00142         double               tolerance,
00143         double               cubicPackRadius,
00144         int                  maxInsertionFailures
00145       );
00146 
00147       RandomBoxPacker(
00148         ParticleGeneratorPtr particleGeneratorPtr,
00149         ParticlePoolPtr      particlePoolPtr,
00150         NTablePtr            nTablePtr,
00151         const BoundingBox    &bBox,
00152         const BoolVector     &periodicDimensions,
00153         double               tolerance,
00154         double               cubicPackRadius,
00155         int                  maxInsertionFailures,
00156         const PlaneVector    &fitPlaneVector
00157       );
00158 
00159       virtual ~RandomBoxPacker();
00160 
00161       PlaneVector getDefaultFitPlaneVector() const;
00162 
00163       bool particleIsValid(const Particle &particle) const;
00164 
00165       virtual void generate();
00166 
00167       double getRandom(double min, double max) const;
00168 
00169       Vec3 getRandomPoint() const;
00170 
00171       ParticleVector getClosestNeighbours(const Particle& particle, int numClosest);
00172 
00173       int getMaxInsertionFailures() const;
00174 
00175       void generateRandomFill();
00176 
00177       const PlaneVector &getFitPlaneVector() const;
00178 
00179       Plane getClosestFitPlane(const Particle &particle) const;
00180 
00181     private:
00182       PlaneVector  m_fitPlaneVector;
00183       int          m_maxInsertionFailures;
00184     };
00185   };
00186 };
00187 
00188 #include "Geometry/RandomBoxPacker.hpp"
00189 
00190 #endif