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 #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 }