14 #ifndef ESYS_LSMGOUGECONFIG_H
15 #define ESYS_LSMGOUGECONFIG_H
17 #include "Foundation/BoundingBox.h"
18 #include "Geometry/CircularNeighbourTable.h"
19 #include "Geometry/Plane.h"
20 #include "Geometry/CubicBoxPacker.h"
21 #include "Geometry/RandomBoxPacker.h"
22 #include "Geometry/PackerGenerators.h"
23 #include "Geometry/DistConnections.h"
25 #include <boost/shared_ptr.hpp>
34 typedef std::vector<Plane> PlaneVector;
51 inline double getSize()
const;
53 inline double getMinParticleRadius()
const;
55 inline double getMaxParticleRadius()
const;
59 double m_minParticleRadius;
60 double m_maxParticleRadius;
63 template <
typename TmplParticleGrainGen>
67 typedef TmplParticleGrainGen ParticleGrainGen;
74 ParticleGrainGen &particleGrainGen,
78 double getMinGrainRadius();
80 double getMaxGrainRadius();
82 ParticleGrainGen &getParticleGrainGen()
const;
84 int getConnectionTag()
const;
86 ParticleGrainGen *m_pParticleGrainGen;
90 typedef std::vector<bool> BoolVector;
91 typedef std::vector<BoundingBox> BoundingBoxVector;
98 const BoolVector &periodicDimensions,
99 Orientation orientation,
104 inline bool is3d()
const;
106 inline void initialiseFitPlaneVector();
110 inline const PlaneVector &getFitPlaneVector()
const;
112 inline double getMinParticleRadius()
const;
114 inline double getMaxParticleRadius()
const;
116 inline const BoolVector &getPeriodicDimensions()
const;
119 BoolVector m_periodicDimensions;
120 Orientation m_orientation;
123 PlaneVector m_fitPlaneVector;
126 template <
typename TmplParticleGrainGen>
130 typedef TmplParticleGrainGen ParticleGrainGen;
135 const BoolVector &periodicDimensions,
136 Orientation orientation,
137 ParticleGrainGen &particleGrainGen
140 double getMinGrainRadius()
const;
142 double getMaxGrainRadius()
const;
144 ParticleGrainGen &getParticleGrainGen()
const;
147 ParticleGrainGen *m_pParticleGrainGen;
150 typedef std::vector<PackingInfo> PackingInfoVector;
152 template <
typename TmplParticleGrainGen>
156 typedef TmplParticleGrainGen ParticleGrainGen;
160 typedef std::vector<GougePackInfo> GougePackingInfoVector;
169 Orientation orientation,
172 const BoolVector &peridicDimensions=BoolVector(3,
false),
173 int maxInsertionFailures=100,
174 double tolerance = DBL_EPSILON*128,
175 double connectionTolerance = DBL_EPSILON*128*10,
176 int blockConnectionTag = 0
181 double getTolerance()
const;
183 double getConnectionTolerance()
const;
187 int getMaxInsertionFailures()
const;
189 double getRegularBlockRadius()
const;
191 double getFaultMinRadius()
const;
193 double getFaultMaxRadius()
const;
195 double getGougeMinRadius()
const;
197 double getGougeMaxRadius()
const;
199 int getGougeConnectionTag()
const;
201 int getBlockConnectionTag()
const;
203 const BoolVector &getPeriodicDimensions()
const;
205 BoundingBoxVector getRegularBBoxVector()
const;
207 GougePackingInfoVector getGougePackingInfoVector()
const;
209 PackingInfoVector getFaultPackingInfoVector()
const;
211 BoundingBox cutFromCentre(
double d1,
double d2)
const;
213 Orientation getOrientation()
const;
215 int getOrientationIndex()
const;
217 double getOrientationSize()
const;
219 double getMaxRadius()
const;
221 double getMinRadius()
const;
228 Orientation m_orientation;
231 BoolVector m_periodicDimensions;
232 int m_maxInsertionFailures;
234 double m_connectionTolerance;
235 int m_blockConnectionTag;
242 typename TmplGrainRandomBoxPacker,
243 typename TmplParticleRandomBoxPacker,
244 typename TmplConnection
249 typedef TmplConnection Connection;
250 typedef TmplGrainRandomBoxPacker GrainRandomPacker;
251 typedef boost::shared_ptr<GrainRandomPacker> GrainRandomPackerPtr;
252 typedef typename GrainRandomPacker::ParticleGrainGen ParticleGrainGen;
254 typedef typename GougeConfPrms::GougePackingInfoVector GougePackingInfoVector;
255 typedef typename GrainRandomPacker::Particle Particle;
256 typedef typename GrainRandomPacker::ParticleIterator ParticleIterator;
257 typedef typename GrainRandomPacker::ParticleConstIterator ParticleConstIterator;
258 typedef typename GrainRandomPacker::ParticleCollection ParticleCollection;
259 typedef typename GrainRandomPacker::Grain Grain;
260 typedef typename GrainRandomPacker::GrainIterator GrainIterator;
261 typedef typename GrainRandomPacker::GrainConstIterator GrainConstIterator;
262 typedef typename GrainRandomPacker::GrainCollection GrainCollection;
264 typedef typename GrainRandomPacker::PackerBase APacker;
265 typedef typename GrainRandomPacker::BoxPackerBase ABoxPacker;
269 typedef typename RegBoxPacker::ParticleGeneratorPtr RegRadiusGenPtr;
271 typedef TmplParticleRandomBoxPacker RndBoxPacker;
272 typedef typename RndBoxPacker::ParticleGenerator RndRadiusGen;
273 typedef typename RndBoxPacker::ParticleGeneratorPtr RndRadiusGenPtr;
275 typedef typename GrainRandomPacker::NTable NTable;
276 typedef typename GrainRandomPacker::NTablePtr NTablePtr;
277 typedef boost::shared_ptr<APacker> GeneratorPtr;
278 typedef std::vector<GeneratorPtr> GeneratorPtrVector;
279 typedef std::vector<GrainRandomPackerPtr> GrainRndPackerPtrVector;
280 typedef typename GrainRandomPacker::ParticlePool ParticlePool;
281 typedef typename GrainRandomPacker::ParticlePoolPtr ParticlePoolPtr;
282 typedef typename GrainRandomPacker::GrainPool GrainPool;
283 typedef typename GrainRandomPacker::GrainPoolPtr GrainPoolPtr;
288 bool operator()(
const Connection &i1,
const Connection &i2)
const
292 (i1.getP1Id() < i2.getP1Id())
295 (i1.getP1Id() == i2.getP1Id())
298 (i1.getP2Id() < i2.getP2Id())
301 (i1.getP2Id() == i2.getP2Id())
303 (i1.getTag() < i2.getTag())
310 bool operator()(
const Connection *i1,
const Connection *i2)
const
312 return (*
this)(*i1, *i2);
315 typedef std::set<Connection,ConnectionCmp> ConnectionSet;
322 virtual void generate();
324 int getNumParticles()
const;
326 int getNumGrains()
const;
328 int getNumConnections()
const;
330 const GrainRndPackerPtrVector &getGougeGeneratorVector()
const;
332 GrainRndPackerPtrVector &getGougeGeneratorVector();
334 const GeneratorPtrVector &getFaultGeneratorVector()
const;
336 bool isGougeParticle(
const Particle &particle)
const;
338 bool areInDifferentFaultBlocks(
343 virtual void write(std::ostream &oStream)
const;
345 void writeToFile(
const std::string &fileName)
const;
347 void tagGougeParticles(
int tag);
349 void tagRndBlockParticles(
int tag);
351 void tagDrivingPlateParticles(
354 double distanceFromBBoxEdge
357 virtual void createConnectionSet();
359 const ConnectionSet &getConnectionSet()
const;
361 GrainCollection getGrainCollection();
363 ParticleCollection getParticleCollection();
365 template <
typename TmplVisitor>
366 void visitParticles(TmplVisitor &visitor)
369 typename GeneratorPtrVector::iterator it = m_genPtrVector.begin();
370 it != m_genPtrVector.end();
374 ParticleIterator particleIt = (*it)->getParticleIterator();
375 while (particleIt.hasNext()) {
376 particleIt.next().visit(visitor);
381 template <
typename TmplVisitor>
382 void visitParticles(
const TmplVisitor &visitor)
const
385 typename GeneratorPtrVector::const_iterator it = m_genPtrVector.begin();
386 it != m_genPtrVector.end();
390 ParticleIterator particleIt = (*it)->getParticleIterator();
391 while (particleIt.hasNext()) {
392 particleIt.next().visit(visitor);
397 template <
typename TmplVisitor>
398 void visitConnections(TmplVisitor &visitor)
const
400 const ConnectionSet &connectionSet = getConnectionSet();
402 typename ConnectionSet::const_iterator it = connectionSet.begin();
403 it != connectionSet.end();
411 const GougeConfPrms &getPrms()
const
419 bool operator()(
const Particle *p1,
const Particle *p2)
const
421 return (p1->getID() < p2->getID());
429 : m_pGougeConfig(&gougeBlock),
430 m_tolerance(tolerance)
434 inline bool isValid(
const Particle &p1,
const Particle &p2)
const
438 (p1.getID() < p2.getID())
440 ((p1.getPos() - p2.getPos()).norm() < (m_tolerance + (p1.getRad() + p2.getRad())))
442 ((!m_pGougeConfig->isGougeParticle(p1)) && (!m_pGougeConfig->isGougeParticle(p2)))
444 ((!m_pGougeConfig->areInDifferentFaultBlocks(p1, p2)))
457 : m_pOStream(&oStream),
458 m_precision(precision)
462 void visitParticle(
const Particle &particle)
const
465 << std::setprecision(m_precision)
466 << particle.getPos() <<
" "
467 << particle.getRad() <<
" "
468 << particle.getID() <<
" "
469 << particle.getTag() <<
"\n";
473 std::ostream *m_pOStream;
481 : m_pOStream(&oStream)
488 << connection.first() <<
" "
489 << connection.second() <<
" "
494 std::ostream *m_pOStream;
499 NTablePtr m_nTablePtr;
501 ConnectionSet m_connectionSet;
502 GrainRndPackerPtrVector m_gougeGenPtrVector;
503 GeneratorPtrVector m_genPtrVector;
504 ParticlePoolPtr m_particlePoolPtr;
505 GrainPoolPtr m_grainPoolPtr;
507 void createRegularBlockGenerators();
508 void createFaultBlockGenerators();
509 virtual void createGougeConfigGenerators();
512 GeneratorPtrVector m_regularGenPtrVector;
513 GeneratorPtrVector m_faultGenPtrVector;
518 #include "Geometry/GougeConfig.hpp"