ESyS-Particle  4.0.1
GrainRandomBoxPacker.hpp
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 #include "Foundation/console.h"
00015 #include "Geometry/GrainRandomBoxPacker.h"
00016 #include "Geometry/SphereFitter.h"
00017 
00018 #include <algorithm>
00019 #include <stdexcept>
00020 #include <float.h>
00021 
00022 namespace esys
00023 {
00024   namespace lsm
00025   {
00026     template <typename TGrainGen, typename TGrainCol, template <typename TTGrainGen> class TRndPackWrap>
00027     GrainRandomBoxPacker<TGrainGen,TGrainCol,TRndPackWrap>::GrainRandomBoxPacker(
00028       ParticleGrainGenPtr particleGrainGenPtr,
00029       ParticlePoolPtr     particlePoolPtr,
00030       NTablePtr           nTablePtr,
00031       const BoundingBox   &bBox,
00032       const BoolVector    &periodicDimensions,
00033       double              tolerance,
00034       double              cubicPackRadius,
00035       int                 maxInsertionFailures,
00036       const PlaneVector   &fitPlaneVector,
00037       GrainPoolPtr        grainPoolPtr
00038     )
00039      :  Inherited(
00040           particleGrainGenPtr,
00041           particlePoolPtr,
00042           nTablePtr,
00043           bBox,
00044           periodicDimensions,
00045           tolerance,
00046           cubicPackRadius,
00047           maxInsertionFailures,
00048           fitPlaneVector
00049         ),
00050         m_grainCollectionPtr(new GrainCollection(particlePoolPtr, grainPoolPtr))
00051     {
00052     }
00053 
00054     template <typename TGrainGen, typename TGrainCol, template <typename TTGrainGen> class TRndPackWrap>
00055     GrainRandomBoxPacker<TGrainGen,TGrainCol,TRndPackWrap>::GrainRandomBoxPacker(
00056       ParticleGrainGenPtr particleGrainGenPtr,
00057       ParticlePoolPtr     particlePoolPtr,
00058       NTablePtr           nTablePtr,
00059       const BoundingBox   &bBox,
00060       const BoolVector    &periodicDimensions,
00061       double              tolerance,
00062       double              cubicPackRadius,
00063       int                 maxInsertionFailures
00064     )
00065      :  Inherited(
00066           particleGrainGenPtr,
00067           particlePoolPtr,
00068           nTablePtr,
00069           bBox,
00070           periodicDimensions,
00071           tolerance,
00072           cubicPackRadius,
00073           maxInsertionFailures
00074         ),
00075         m_grainCollectionPtr(new GrainCollection(particlePoolPtr))
00076     {
00077     }
00078 
00079     template <typename TGrainGen, typename TGrainCol, template <typename TTGrainGen> class TRndPackWrap>
00080     GrainRandomBoxPacker<TGrainGen,TGrainCol,TRndPackWrap>::~GrainRandomBoxPacker()
00081     {
00082     }
00083 
00084     template <typename TGrainGen, typename TGrainCol, template <typename TTGrainGen> class TRndPackWrap>
00085     const typename GrainRandomBoxPacker<TGrainGen,TGrainCol,TRndPackWrap>::GrainCollection &
00086     GrainRandomBoxPacker<TGrainGen,TGrainCol,TRndPackWrap>::getGrainCollection() const
00087     {
00088       return *(m_grainCollectionPtr.get());
00089     }
00090 
00091     template <typename TGrainGen, typename TGrainCol, template <typename TTGrainGen> class TRndPackWrap>
00092     typename GrainRandomBoxPacker<TGrainGen,TGrainCol,TRndPackWrap>::GrainCollection &
00093     GrainRandomBoxPacker<TGrainGen,TGrainCol,TRndPackWrap>::getGrainCollection()
00094     {
00095       return *(m_grainCollectionPtr.get());
00096     }
00097 
00098     template <typename TGrainGen, typename TGrainCol, template <typename TTGrainGen> class TRndPackWrap>
00099     typename GrainRandomBoxPacker<TGrainGen,TGrainCol,TRndPackWrap>::GrainIterator
00100     GrainRandomBoxPacker<TGrainGen,TGrainCol,TRndPackWrap>::getGrainIterator()
00101     {
00102       return getGrainCollection().getGrainIterator();
00103     }
00104 
00105     template <typename TGrainGen, typename TGrainCol, template <typename TTGrainGen> class TRndPackWrap>
00106     typename GrainRandomBoxPacker<TGrainGen,TGrainCol,TRndPackWrap>::GrainConstIterator
00107     GrainRandomBoxPacker<TGrainGen,TGrainCol,TRndPackWrap>::getGrainIterator() const
00108     {
00109       return getGrainCollection().getGrainIterator();
00110     }
00111 
00112     template <typename TGrainGen, typename TGrainCol, template <typename TTGrainGen> class TRndPackWrap>
00113     int
00114     GrainRandomBoxPacker<TGrainGen,TGrainCol,TRndPackWrap>::getNumGrains() const
00115     {
00116       return getGrainCollection().getNumGrains();
00117     }
00118 
00119     template <typename TGrainGen, typename TGrainCol, template <typename TTGrainGen> class TRndPackWrap>
00120     typename GrainRandomBoxPacker<TGrainGen,TGrainCol,TRndPackWrap>::ParticleGrainGen &
00121     GrainRandomBoxPacker<TGrainGen,TGrainCol,TRndPackWrap>::getParticleGrainGen()
00122     {
00123       return Inherited::getParticleGenerator();
00124     }
00125 
00126     template <typename TGrainGen, typename TGrainCol, template <typename TTGrainGen> class TRndPackWrap>
00127     const typename GrainRandomBoxPacker<TGrainGen,TGrainCol,TRndPackWrap>::ParticleGrainGen &
00128     GrainRandomBoxPacker<TGrainGen,TGrainCol,TRndPackWrap>::getParticleGrainGen() const
00129     {
00130       return Inherited::getParticleGenerator();
00131     }
00132 
00133     template <typename TGrainGen, typename TGrainCol, template <typename TTGrainGen> class TRndPackWrap>
00134     void
00135     GrainRandomBoxPacker<TGrainGen,TGrainCol,TRndPackWrap>::setParticleGrainGen(
00136       ParticleGrainGen &particleGrainGen
00137     )
00138     {
00139       this->setParticleGenerator(particleGrainGen);
00140     }
00141 
00142     template <typename TGrainGen, typename TGrainCol, template <typename TTGrainGen> class TRndPackWrap>
00143     void
00144     GrainRandomBoxPacker<TGrainGen,TGrainCol,TRndPackWrap>::setParticleGrainGen(
00145       ParticleGrainGenPtr particleGrainGenPtr
00146     )
00147     {
00148       setParticleGenerator(particleGrainGenPtr);
00149     }
00150 
00151     template <typename TGrainGen, typename TGrainCol, template <typename TTGrainGen> class TRndPackWrap>
00152     typename GrainRandomBoxPacker<TGrainGen,TGrainCol,TRndPackWrap>::GrainId
00153     GrainRandomBoxPacker<TGrainGen,TGrainCol,TRndPackWrap>::getNextGrainId() const
00154     {
00155       return m_grainCollectionPtr->getNumGrains();
00156     }
00157     
00158     template <typename TGrainGen, typename TGrainCol, template <typename TTGrainGen> class TRndPackWrap>
00159     typename GrainRandomBoxPacker<TGrainGen,TGrainCol,TRndPackWrap>::Grain &
00160     GrainRandomBoxPacker<TGrainGen,TGrainCol,TRndPackWrap>::constructGrain()
00161     {
00162       return m_grainCollectionPtr->createGrain();
00163     }
00164 
00165     template <typename TGrainGen, typename TGrainCol, template <typename TTGrainGen> class TRndPackWrap>
00166     typename GrainRandomBoxPacker<TGrainGen,TGrainCol,TRndPackWrap>::Grain &
00167     GrainRandomBoxPacker<TGrainGen,TGrainCol,TRndPackWrap>::createAndInsertGrain(
00168       const Grain &grain
00169     )
00170     {
00171       Grain &g = constructGrain();
00172       g.setId(getNextGrainId());
00173       typename Grain::ParticleConstIterator it = grain.getParticleIterator();
00174       while (it.hasNext())
00175       {
00176         g.insertRef(this->createAndInsertParticle(it.next()));
00177       }
00178       return g;
00179     }
00180     
00181     template <typename TGrainGen, typename TGrainCol, template <typename TTGrainGen> class TRndPackWrap>
00182     void GrainRandomBoxPacker<TGrainGen,TGrainCol,TRndPackWrap>::generateCubicPackingGrains()
00183     {
00184       GridIterator pointIt = GridIterator(this->getBBox(), this->getCubicPackingRadius());
00185       while (pointIt.hasNext()) {
00186         const Particle candidate =
00187           this->getCandidateParticle(pointIt.next(), this->getCubicPackingRadius());
00188         if (this->particleFitsInBBoxWithNeighbours(candidate)) {
00189           createAndInsertGrain(getParticleGrainGen().getGrain(candidate));
00190         }
00191       }
00192     }
00193 
00194     template <typename TGrainGen, typename TGrainCol, template <typename TTGrainGen> class TRndPackWrap>
00195     void GrainRandomBoxPacker<TGrainGen,TGrainCol,TRndPackWrap>::generateRandomFillGrains()
00196     {
00197       StuffedParticleIterator it =
00198         StuffedParticleIterator(
00199           *this,
00200           this->getMaxInsertionFailures(),
00201           this->getFitPlaneVector()
00202         );
00203       while (it.hasNext())
00204       {
00205         createAndInsertGrain(getParticleGrainGen().getGrain(it.next()));
00206       }
00207       it.logInfo();
00208     }
00209 
00210     template <typename TGrainGen, typename TGrainCol, template <typename TTGrainGen> class TRndPackWrap>
00211     void GrainRandomBoxPacker<TGrainGen,TGrainCol,TRndPackWrap>::generate()
00212     {
00213       generateCubicPackingGrains();
00214       generateRandomFillGrains();
00215     }
00216   };
00217 };