ESyS-Particle
4.0.1
|
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