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 #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 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(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 getCandidateParticle(pointIt.next(), this->getCubicPackingRadius()); 00188 if (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 };