14 #include "Foundation/console.h"
15 #include "Geometry/GrainRandomBoxPacker.h"
16 #include "Geometry/SphereFitter.h"
26 template <
typename TGrainGen,
typename TGrainCol,
template <
typename TTGrainGen>
class TRndPackWrap>
27 GrainRandomBoxPacker<TGrainGen,TGrainCol,TRndPackWrap>::GrainRandomBoxPacker(
28 ParticleGrainGenPtr particleGrainGenPtr,
29 ParticlePoolPtr particlePoolPtr,
31 const BoundingBox &bBox,
32 const BoolVector &periodicDimensions,
34 double cubicPackRadius,
35 int maxInsertionFailures,
36 const PlaneVector &fitPlaneVector,
37 GrainPoolPtr grainPoolPtr
50 m_grainCollectionPtr(new GrainCollection(particlePoolPtr, grainPoolPtr))
54 template <
typename TGrainGen,
typename TGrainCol,
template <
typename TTGrainGen>
class TRndPackWrap>
55 GrainRandomBoxPacker<TGrainGen,TGrainCol,TRndPackWrap>::GrainRandomBoxPacker(
56 ParticleGrainGenPtr particleGrainGenPtr,
57 ParticlePoolPtr particlePoolPtr,
59 const BoundingBox &bBox,
60 const BoolVector &periodicDimensions,
62 double cubicPackRadius,
63 int maxInsertionFailures
75 m_grainCollectionPtr(new GrainCollection(particlePoolPtr))
79 template <
typename TGrainGen,
typename TGrainCol,
template <
typename TTGrainGen>
class TRndPackWrap>
80 GrainRandomBoxPacker<TGrainGen,TGrainCol,TRndPackWrap>::~GrainRandomBoxPacker()
84 template <
typename TGrainGen,
typename TGrainCol,
template <
typename TTGrainGen>
class TRndPackWrap>
85 const typename GrainRandomBoxPacker<TGrainGen,TGrainCol,TRndPackWrap>::GrainCollection &
86 GrainRandomBoxPacker<TGrainGen,TGrainCol,TRndPackWrap>::getGrainCollection()
const
88 return *(m_grainCollectionPtr.get());
91 template <
typename TGrainGen,
typename TGrainCol,
template <
typename TTGrainGen>
class TRndPackWrap>
92 typename GrainRandomBoxPacker<TGrainGen,TGrainCol,TRndPackWrap>::GrainCollection &
93 GrainRandomBoxPacker<TGrainGen,TGrainCol,TRndPackWrap>::getGrainCollection()
95 return *(m_grainCollectionPtr.get());
98 template <
typename TGrainGen,
typename TGrainCol,
template <
typename TTGrainGen>
class TRndPackWrap>
99 typename GrainRandomBoxPacker<TGrainGen,TGrainCol,TRndPackWrap>::GrainIterator
100 GrainRandomBoxPacker<TGrainGen,TGrainCol,TRndPackWrap>::getGrainIterator()
102 return getGrainCollection().getGrainIterator();
105 template <
typename TGrainGen,
typename TGrainCol,
template <
typename TTGrainGen>
class TRndPackWrap>
106 typename GrainRandomBoxPacker<TGrainGen,TGrainCol,TRndPackWrap>::GrainConstIterator
107 GrainRandomBoxPacker<TGrainGen,TGrainCol,TRndPackWrap>::getGrainIterator()
const
109 return getGrainCollection().getGrainIterator();
112 template <
typename TGrainGen,
typename TGrainCol,
template <
typename TTGrainGen>
class TRndPackWrap>
114 GrainRandomBoxPacker<TGrainGen,TGrainCol,TRndPackWrap>::getNumGrains()
const
116 return getGrainCollection().getNumGrains();
119 template <
typename TGrainGen,
typename TGrainCol,
template <
typename TTGrainGen>
class TRndPackWrap>
120 typename GrainRandomBoxPacker<TGrainGen,TGrainCol,TRndPackWrap>::ParticleGrainGen &
121 GrainRandomBoxPacker<TGrainGen,TGrainCol,TRndPackWrap>::getParticleGrainGen()
123 return Inherited::getParticleGenerator();
126 template <
typename TGrainGen,
typename TGrainCol,
template <
typename TTGrainGen>
class TRndPackWrap>
127 const typename GrainRandomBoxPacker<TGrainGen,TGrainCol,TRndPackWrap>::ParticleGrainGen &
128 GrainRandomBoxPacker<TGrainGen,TGrainCol,TRndPackWrap>::getParticleGrainGen()
const
130 return Inherited::getParticleGenerator();
133 template <
typename TGrainGen,
typename TGrainCol,
template <
typename TTGrainGen>
class TRndPackWrap>
135 GrainRandomBoxPacker<TGrainGen,TGrainCol,TRndPackWrap>::setParticleGrainGen(
136 ParticleGrainGen &particleGrainGen
139 this->setParticleGenerator(particleGrainGen);
142 template <
typename TGrainGen,
typename TGrainCol,
template <
typename TTGrainGen>
class TRndPackWrap>
144 GrainRandomBoxPacker<TGrainGen,TGrainCol,TRndPackWrap>::setParticleGrainGen(
145 ParticleGrainGenPtr particleGrainGenPtr
148 setParticleGenerator(particleGrainGenPtr);
151 template <
typename TGrainGen,
typename TGrainCol,
template <
typename TTGrainGen>
class TRndPackWrap>
152 typename GrainRandomBoxPacker<TGrainGen,TGrainCol,TRndPackWrap>::GrainId
153 GrainRandomBoxPacker<TGrainGen,TGrainCol,TRndPackWrap>::getNextGrainId()
const
155 return m_grainCollectionPtr->getNumGrains();
158 template <
typename TGrainGen,
typename TGrainCol,
template <
typename TTGrainGen>
class TRndPackWrap>
159 typename GrainRandomBoxPacker<TGrainGen,TGrainCol,TRndPackWrap>::Grain &
160 GrainRandomBoxPacker<TGrainGen,TGrainCol,TRndPackWrap>::constructGrain()
162 return m_grainCollectionPtr->createGrain();
165 template <
typename TGrainGen,
typename TGrainCol,
template <
typename TTGrainGen>
class TRndPackWrap>
166 typename GrainRandomBoxPacker<TGrainGen,TGrainCol,TRndPackWrap>::Grain &
167 GrainRandomBoxPacker<TGrainGen,TGrainCol,TRndPackWrap>::createAndInsertGrain(
171 Grain &g = constructGrain();
172 g.setId(getNextGrainId());
173 typename Grain::ParticleConstIterator it = grain.getParticleIterator();
176 g.insertRef(this->createAndInsertParticle(it.next()));
181 template <
typename TGrainGen,
typename TGrainCol,
template <
typename TTGrainGen>
class TRndPackWrap>
182 void GrainRandomBoxPacker<TGrainGen,TGrainCol,TRndPackWrap>::generateCubicPackingGrains()
184 GridIterator pointIt = GridIterator(this->getBBox(), this->getCubicPackingRadius());
185 while (pointIt.hasNext()) {
186 const Particle candidate =
187 this->getCandidateParticle(pointIt.next(), this->getCubicPackingRadius());
188 if (this->particleFitsInBBoxWithNeighbours(candidate)) {
189 createAndInsertGrain(getParticleGrainGen().getGrain(candidate));
194 template <
typename TGrainGen,
typename TGrainCol,
template <
typename TTGrainGen>
class TRndPackWrap>
195 void GrainRandomBoxPacker<TGrainGen,TGrainCol,TRndPackWrap>::generateRandomFillGrains()
197 StuffedParticleIterator it =
198 StuffedParticleIterator(
200 this->getMaxInsertionFailures(),
201 this->getFitPlaneVector()
205 createAndInsertGrain(getParticleGrainGen().getGrain(it.next()));
210 template <
typename TGrainGen,
typename TGrainCol,
template <
typename TTGrainGen>
class TRndPackWrap>
211 void GrainRandomBoxPacker<TGrainGen,TGrainCol,TRndPackWrap>::generate()
213 generateCubicPackingGrains();
214 generateRandomFillGrains();