ESyS-Particle  4.0.1
GrainCollection.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 #include "Geometry/GrainCollection.h"
00014 #include <stdexcept>
00015 #include <fstream>
00016 #include <sstream>
00017 #include <iomanip>
00018 
00019 #include <boost/limits.hpp>
00020 
00021 namespace esys
00022 {
00023   namespace lsm
00024   {
00025     template <typename TmplGrain>
00026     GrainCollection<TmplGrain>::GrainCollection()
00027       : m_particlePoolPtr(new ParticlePool(4096)),
00028         m_grainPoolPtr(new GrainPool(4096)),
00029         m_grainVector()
00030     {
00031     }
00032 
00033     template <typename TmplGrain>
00034     GrainCollection<TmplGrain>::GrainCollection(
00035       ParticlePoolPtr particlePoolPtr
00036     )
00037       : m_particlePoolPtr(particlePoolPtr),
00038         m_grainPoolPtr(new GrainPool(4096)),
00039         m_grainVector()
00040     {
00041     }
00042 
00043     template <typename TmplGrain>
00044     GrainCollection<TmplGrain>::GrainCollection(
00045       ParticlePoolPtr particlePoolPtr,
00046       GrainPoolPtr grainPoolPtr
00047     )
00048       : m_particlePoolPtr(particlePoolPtr),
00049         m_grainPoolPtr(grainPoolPtr),
00050         m_grainVector()
00051     {
00052     }
00053 
00054     template <typename TmplGrain>
00055     typename GrainCollection<TmplGrain>::ParticlePoolPtr
00056     GrainCollection<TmplGrain>::getParticlePoolPtr()
00057     {
00058       return m_particlePoolPtr;
00059     }
00060 
00061     template <typename TmplGrain>
00062     typename GrainCollection<TmplGrain>::GrainPoolPtr
00063     GrainCollection<TmplGrain>::getGrainPoolPtr()
00064     {
00065       return m_grainPoolPtr;
00066     }
00067 
00068     template <typename TmplGrain>
00069     GrainCollection<TmplGrain>::~GrainCollection()
00070     {
00071     }
00072 
00073     template <typename TmplGrain>
00074     int GrainCollection<TmplGrain>::getNumGrains() const
00075     {
00076       return m_grainVector.size();
00077     }
00078 
00079     template <typename TmplGrain>
00080     int GrainCollection<TmplGrain>::getNumParticles() const
00081     {
00082       int i = 0;
00083       for (
00084         GrainConstIterator it = getGrainIterator();
00085         it.hasNext();
00086         i += it.next().getNumParticles()
00087       )
00088       {
00089       }
00090       return i;
00091     }
00092 
00093     template <typename TmplGrain>
00094     void
00095     GrainCollection<TmplGrain>::insertRef(Grain &g)
00096     {
00097       if (m_grainPoolPtr->is_from(&g))
00098       {
00099         m_grainVector.push_back(&g);
00100       }
00101       else
00102       {
00103         throw
00104           std::runtime_error(
00105             "GrainCollection<TmplGrain>::insertRef: Tried to insert"
00106             " reference to non-created grain."
00107           );
00108       }
00109     }
00110 
00111     template <typename TmplGrain>
00112     typename GrainCollection<TmplGrain>::Grain &
00113     GrainCollection<TmplGrain>::createGrain()
00114     {
00115       Grain *pGrain = m_grainPoolPtr->construct(getParticlePoolPtr());
00116       insertRef(*pGrain);
00117       return *pGrain;
00118     }
00119 
00120     template <typename TmplGrain>
00121     typename GrainCollection<TmplGrain>::Grain &
00122     GrainCollection<TmplGrain>::createGrain(typename Grain::Id id)
00123     {
00124       Grain *pGrain = m_grainPoolPtr->construct(id, getParticlePoolPtr());
00125       insertRef(*pGrain);
00126       return *pGrain;
00127     }
00128 
00129     template <typename TmplGrain>
00130     typename GrainCollection<TmplGrain>::Grain &
00131     GrainCollection<TmplGrain>::createGrain(const Grain &g)
00132     {
00133       Grain *pGrain = m_grainPoolPtr->construct(g);
00134       insertRef(*pGrain);
00135       return *pGrain;
00136     }
00137 
00138     template <typename TmplGrain>
00139     typename GrainCollection<TmplGrain>::GrainIterator
00140     GrainCollection<TmplGrain>::getGrainIterator()
00141     {
00142       return GrainIterator(VectorIterator(m_grainVector));
00143     }
00144 
00145     template <typename TmplGrain>
00146     typename GrainCollection<TmplGrain>::GrainConstIterator
00147     GrainCollection<TmplGrain>::getGrainIterator() const
00148     {
00149       return GrainConstIterator(VectorConstIterator(m_grainVector));
00150     }
00151 
00152   }
00153 }