30 const BoundingBox &bBox,
36 m_periodicDimensions(periodicDimensions),
37 m_orientation(orientation),
38 m_minRadius(minRadius),
39 m_maxRadius(maxRadius)
41 initialiseFitPlaneVector();
44 bool PackingInfo::is3d()
const
46 return (m_bBox.getSizes().Z() > 0.0);
49 void PackingInfo::initialiseFitPlaneVector()
51 m_fitPlaneVector.clear();
52 if ((m_orientation !=
XZ) && (!getPeriodicDimensions()[1])) {
53 m_fitPlaneVector.push_back(
56 m_fitPlaneVector.push_back(
60 if ((m_orientation !=
YZ) && (!getPeriodicDimensions()[0])) {
61 m_fitPlaneVector.push_back(
64 m_fitPlaneVector.push_back(
73 (!getPeriodicDimensions()[2])
75 m_fitPlaneVector.push_back(
78 m_fitPlaneVector.push_back(
89 const PlaneVector &PackingInfo::getFitPlaneVector()
const
91 return m_fitPlaneVector;
94 double PackingInfo::getMinParticleRadius()
const
99 double PackingInfo::getMaxParticleRadius()
const
104 const BoolVector &PackingInfo::getPeriodicDimensions()
const
106 return m_periodicDimensions;
111 template <
typename TGrainGen>
121 particleGrainGen.getMinParticleRadius(),
122 particleGrainGen.getMaxParticleRadius()
124 m_pParticleGrainGen(&particleGrainGen)
129 template <
typename TGrainGen>
133 return *m_pParticleGrainGen;
137 template <
typename TGrainGen>
141 return *m_pParticleGrainGen;
145 template <
typename TGrainGen>
148 return getParticleGrainGen().getMinGrainRadius();
151 template <
typename TGrainGen>
154 return getParticleGrainGen().getMaxGrainRadius();
161 m_minParticleRadius(0.0),
162 m_maxParticleRadius(0.0)
171 m_minParticleRadius(minRadius),
172 m_maxParticleRadius(maxRadius)
197 template <
typename TPGrainGen>
205 template <
typename TPGrainGen>
212 particleGrainGen.getMinParticleRadius(),
213 particleGrainGen.getMaxParticleRadius()
215 m_pParticleGrainGen(&particleGrainGen),
216 m_connectionTag(connectionTag)
220 template <
typename TPGrainGen>
224 return *m_pParticleGrainGen;
227 template <
typename TPGrainGen>
231 return m_connectionTag;
235 template <
typename TPGrainGen>
239 return *m_pParticleGrainGen;
243 template <
typename TPGrainGen>
246 return getParticleGrainGen().getMinGrainRadius();
249 template <
typename TPGrainGen>
252 return getParticleGrainGen().getMaxGrainRadius();
257 template <
typename TPGrainGen>
264 m_periodicDimensions(3, false),
265 m_maxInsertionFailures(50),
266 m_tolerance(DBL_EPSILON*128),
267 m_connectionTolerance(DBL_EPSILON*128*10),
268 m_blockConnectionTag(0)
272 template <
typename TPGrainGen>
280 int maxInsertionFailures,
282 double connectionTolerance,
283 int blockConnectionTag
285 m_padRadius(padRadius),
286 m_orientation(orientation),
287 m_faultPrms(faultRegionPrms),
288 m_gougePrms(gougeRegionPrms),
289 m_periodicDimensions(periodicDimensions),
290 m_maxInsertionFailures(maxInsertionFailures),
291 m_tolerance(tolerance),
292 m_connectionTolerance(connectionTolerance),
293 m_blockConnectionTag(blockConnectionTag)
298 template <
typename TPGrainGen>
303 template <
typename TPGrainGen>
309 template <
typename TPGrainGen>
312 return m_gougePrms.getConnectionTag();
315 template <
typename TPGrainGen>
318 return m_blockConnectionTag;
321 template <
typename TPGrainGen>
324 return m_maxInsertionFailures;
327 template <
typename TPGrainGen>
330 return m_periodicDimensions;
333 template <
typename TPGrainGen>
336 return m_orientation;
339 template <
typename TPGrainGen>
345 template <
typename TPGrainGen>
348 return m_connectionTolerance;
351 template <
typename TPGrainGen>
355 switch (m_orientation) {
373 std::stringstream msg;
374 msg <<
"Invalid orientation: " << m_orientation;
375 throw std::runtime_error(msg.str());
381 template <
typename TPGrainGen>
384 const int idx = getOrientationIndex();
392 minPt[idx] = std::min(cmp1, cmp2);
393 maxPt[idx] = std::max(cmp1, cmp2);
396 tmpPt[idx] = minPt[idx];
398 if ((tmpPt - bBox.
getMinPt())[idx] > getTolerance()) {
401 tmpPt[idx] = minBBox.
getMaxPt()[idx];
412 template <
typename TPGrainGen>
418 template <
typename TPGrainGen>
421 return m_faultPrms.getMinParticleRadius();
424 template <
typename TPGrainGen>
427 return m_faultPrms.getMaxParticleRadius();
430 template <
typename TPGrainGen>
433 return m_gougePrms.getMinParticleRadius();
436 template <
typename TPGrainGen>
439 return m_gougePrms.getMaxParticleRadius();
442 template <
typename TPGrainGen>
447 getBBox().getMaxPt()[getOrientationIndex()]
449 getBBox().getMinPt()[getOrientationIndex()]
453 template <
typename TPGrainGen>
458 (getOrientationSize() - (m_gougePrms.getSize() + 2*m_faultPrms.getSize()))
463 bBoxVector.reserve(2);
464 bBoxVector.push_back(
466 -(m_gougePrms.getSize()/2.0 + m_faultPrms.getSize()),
467 -getOrientationSize()/2.0
470 bBoxVector.push_back(
472 m_gougePrms.getSize()/2.0 + m_faultPrms.getSize(),
473 getOrientationSize()/2.0
480 template <
typename TPGrainGen>
485 if (m_gougePrms.getSize() > 0.0) {
487 overlap[getOrientationIndex()] = m_faultPrms.getMaxParticleRadius();
490 m_gougePrms.getSize()/2.0,
491 -m_gougePrms.getSize()/2.0
497 getPeriodicDimensions(),
499 m_gougePrms.getParticleGrainGen()
506 template <
typename TPGrainGen>
510 if (m_faultPrms.getSize() > 0.0)
513 (getOrientationSize() - (m_gougePrms.getSize() + 2.0*m_faultPrms.getSize()))
519 const double roughnessSize = m_faultPrms.getSize();
521 overlap[getOrientationIndex()] = m_padRadius;
524 -m_gougePrms.getSize()/2.0,
525 -(m_gougePrms.getSize()/2.0 + roughnessSize)
529 m_gougePrms.getSize()/2.0,
530 m_gougePrms.getSize()/2.0 + roughnessSize
536 getPeriodicDimensions(),
546 getPeriodicDimensions(),
555 std::stringstream msg;
557 <<
"Roughness size plus gouge size is greater than block size: "
558 <<
"2*" << m_faultPrms.getSize() <<
" + " << m_gougePrms.getSize()
559 <<
" > " << getOrientationSize();
560 throw std::runtime_error(msg.str().c_str());
566 template <
typename TPGrainGen>
572 std::max(m_faultPrms.getMaxParticleRadius(), m_gougePrms.getMaxParticleRadius())
576 template <
typename TPGrainGen>
582 std::min(m_faultPrms.getMinParticleRadius(), m_gougePrms.getMinParticleRadius())
586 template <
typename TPGrainGen>
589 return (
getBBox().getSizes()[2] == 0.0);
594 template <
typename TGPckr,
typename TPPckr,
typename TConn>
597 int numParticles = 0;
599 typename GeneratorPtrVector::const_iterator it = m_genPtrVector.begin();
600 it != m_genPtrVector.end();
604 numParticles += (*it)->getNumParticles();
609 template <
typename TGPckr,
typename TPPckr,
typename TConn>
614 typename GrainRndPackerPtrVector::const_iterator packerIt =
615 getGougeGeneratorVector().begin();
616 packerIt != getGougeGeneratorVector().end();
620 numGrains += (*packerIt)->getNumGrains();
625 template <
typename TGPckr,
typename TPPckr,
typename TConn>
628 return m_connectionSet.size();
631 template <
typename TGPckr,
typename TPPckr,
typename TConn>
636 m_gougeGenPtrVector(),
640 m_regularGenPtrVector(),
641 m_faultGenPtrVector()
671 template <
typename TGPckr,
typename TPPckr,
typename TConn>
676 BoundingBoxVector::const_iterator it = bBoxVector.begin();
677 it != bBoxVector.end();
681 <<
"GougeConfig<TGPckr,TPPckr,TConn>::createRegularBlockGenerators:"
692 m_prms.getPeriodicDimensions(),
693 m_prms.getTolerance(),
694 m_prms.getRegularBlockRadius()
697 m_genPtrVector.push_back(genPtr);
698 m_regularGenPtrVector.push_back(genPtr);
702 template <
typename TGPckr,
typename TPPckr,
typename TConn>
707 PackingInfoVector::const_iterator it = infoVec.begin();
712 <<
"GougeConfig<TGPckr,TPPckr,TConn>::createFaultBlockGenerators:"
720 it->getMinParticleRadius(),
721 it->getMaxParticleRadius()
727 it->getPeriodicDimensions(),
728 m_prms.getTolerance(),
729 it->getMaxParticleRadius(),
730 m_prms.getMaxInsertionFailures(),
731 it->getFitPlaneVector()
734 m_genPtrVector.push_back(genPtr);
735 m_faultGenPtrVector.push_back(genPtr);
739 template <
typename TGPckr,
typename TPPckr,
typename TConn>
744 typename GougePackingInfoVector::const_iterator it = infoVec.begin();
749 <<
"GougeConfig<TGPckr,TPPckr,TConn>::createGougeConfigGenerators:"
755 typename GrainRandomPacker::ParticleGrainGenPtr(),
759 it->getPeriodicDimensions(),
760 m_prms.getTolerance(),
761 it->getParticleGrainGen().getMaxGrainRadius(),
762 m_prms.getMaxInsertionFailures(),
763 it->getFitPlaneVector(),
767 genPtr->setParticleGrainGen(it->getParticleGrainGen());
768 m_genPtrVector.push_back(genPtr);
769 m_gougeGenPtrVector.push_back(genPtr);
773 template <
typename TGPckr,
typename TPPckr,
typename TConn>
778 template <
typename TGPckr,
typename TPPckr,
typename TConn>
782 createRegularBlockGenerators();
783 createFaultBlockGenerators();
784 createGougeConfigGenerators();
787 console.
Info() <<
"bbox = " << m_prms.getBBox().getMinPt() <<
" " << m_prms.getBBox().getMaxPt() <<
"\n";
789 typename GeneratorPtrVector::iterator it = m_genPtrVector.begin();
790 it != m_genPtrVector.end();
796 createConnectionSet();
799 template <
typename TGPckr,
typename TPPckr,
typename TConn>
802 std::ofstream fStream(fileName.c_str());
806 template <
typename TGPckr,
typename TPPckr,
typename TConn>
810 return m_gougeGenPtrVector;
813 template <
typename TGPckr,
typename TPPckr,
typename TConn>
817 return m_gougeGenPtrVector;
820 template <
typename TGPckr,
typename TPPckr,
typename TConn>
824 return m_faultGenPtrVector;
827 template <
typename TGPckr,
typename TPPckr,
typename TConn>
834 if (generators.size() == 2) {
837 (generators[0]->contains(p1) && generators[1]->contains(p2))
839 (generators[0]->contains(p2) && generators[1]->contains(p1))
842 else if (generators.size() > 2) {
845 "GougeConfig<TGPckr,TPPckr,TConn>::areInDifferentFaultBlocks: "
846 "More than two fault blocks."
852 template <
typename TGPckr,
typename TPPckr,
typename TConn>
857 typename GrainRndPackerPtrVector::const_iterator it = generators.begin();
858 it != generators.end();
862 if ((*it)->contains(particle)) {
869 template <
typename TGPckr,
typename TPPckr,
typename TConn>
875 typename NTable::ParticleIterator particleIt = m_nTablePtr->getParticleIterator();
877 while (particleIt.hasNext()) {
878 const typename NTable::Particle *pParticle = particleIt.next();
880 m_nTablePtr->getNeighbourVector(
882 pParticle->getRad() + m_prms.getConnectionTolerance()
885 typename NTable::ParticleVector::const_iterator it = neighbours.begin();
886 it != neighbours.end();
890 if (validator.
isValid(*pParticle, *(*it))) {
891 m_connectionSet.insert(
892 typename ConnectionSet::value_type(
895 m_prms.getBlockConnectionTag()
901 const int numBlockConns = m_connectionSet.size();
903 <<
"Created " << numBlockConns <<
" connections in "
904 <<
"bonded blocks.\n";
914 typename GrainRndPackerPtrVector::iterator packerIt = getGougeGeneratorVector().begin();
915 packerIt != getGougeGeneratorVector().end();
919 typename GrainRandomPacker::GrainIterator grainIt = (*packerIt)->getGrainIterator();
920 while (grainIt.hasNext())
924 m_prms.getConnectionTolerance(),
925 m_prms.getGougeConnectionTag(),
926 m_nTablePtr->getBBox(),
927 m_nTablePtr->getPeriodicDimensions()
929 Grain &g = grainIt.next();
930 connFinder.
create(g.getParticleIterator());
934 m_connectionSet.insert(connIt.
next());
939 <<
"Found no connections in grain " << g.getId()
942 while (partIt.hasNext())
950 <<
"Created " << m_connectionSet.size()-numBlockConns <<
" connections in "
951 <<
"gouge region.\n";
954 template <
typename TGPckr,
typename TPPckr,
typename TConn>
960 typename GeneratorPtrVector::iterator it = m_genPtrVector.begin();
961 it != m_genPtrVector.end();
966 while (particleIt.hasNext()) {
967 pCollection.insertRef(particleIt.next());
974 template <
typename TGPckr,
typename TPPckr,
typename TConn>
980 typename GrainRndPackerPtrVector::iterator packerIt =
981 getGougeGeneratorVector().begin();
982 packerIt != getGougeGeneratorVector().end();
987 while (grainIt.hasNext()) {
988 gCollection.insertRef(grainIt.next());
995 template <
typename TGPckr,
typename TPPckr,
typename TConn>
999 return m_connectionSet;
1002 template <
typename TGPckr,
typename TPPckr,
typename TConn>
1005 Vec3 minPt = m_nTablePtr->getBBox().getMinPt();
1006 Vec3 maxPt = m_nTablePtr->getBBox().getMaxPt();
1007 if (fabs(maxPt.
Z() - minPt.
Z()) < (2*m_prms.getMaxRadius())) {
1008 minPt.
Z() = minPt.
Z() - m_prms.getMaxRadius() - m_prms.getTolerance();
1009 maxPt.
Z() = maxPt.
Z() + m_prms.getMaxRadius() + m_prms.getTolerance();
1012 const BoundingBox geoBBox(minPt, maxPt + m_prms.getTolerance());
1019 m_prms.getPeriodicDimensions(),
1020 (m_prms.getBBox().getSizes().Z() <= 0.0)
1022 info.
write(oStream);
1029 typename NTable::ParticleIterator particleIt = m_nTablePtr->getParticleIterator();
1030 typedef std::set<Particle *, IdCompare> ParticleSet;
1031 ParticleSet taggedParticleSet;
1032 while (particleIt.hasNext()) {
1033 taggedParticleSet.insert(particleIt.next());
1041 particleIt = m_nTablePtr->getParticleIterator();
1042 ParticleSet particleSet;
1043 while (particleIt.hasNext()) {
1044 Particle *pParticle = particleIt.next();
1045 if (geoBBox.
contains(pParticle->getPos())) {
1046 pParticle->setTag((*(taggedParticleSet.find(pParticle)))->getTag());
1047 particleSet.insert(pParticle);
1060 << particleSet.size()
1062 const int precision = 12;
1065 typename ParticleSet::const_iterator it = particleSet.begin();
1066 it != particleSet.end();
1073 oStream <<
"EndParticles\n" <<
"BeginConnect\n";
1074 oStream << getConnectionSet().size() <<
"\n";
1078 visitConnections(connectionVisitor);
1079 oStream <<
"EndConnect";
1083 template <
typename TGPckr,
typename TPPckr,
typename TConn>
1087 typename GrainRndPackerPtrVector::iterator it = m_gougeGenPtrVector.begin();
1088 it != m_gougeGenPtrVector.end();
1092 typename GrainRandomPacker::ParticleIterator particleIt =
1093 (*it)->getParticleIterator();
1094 while (particleIt.hasNext()) {
1095 particleIt.next().setTag(tag);
1100 template <
typename TGPckr,
typename TPPckr,
typename TConn>
1104 typename GeneratorPtrVector::iterator it = m_faultGenPtrVector.begin();
1105 it != m_faultGenPtrVector.end();
1110 while (particleIt.hasNext()) {
1111 particleIt.next().setTag(tag);
1116 template <
typename TGPckr,
typename TPPckr,
typename TConn>
1120 double distanceFromBBoxEdge
1124 const BoundingBox bBox = particleCollection.getParticleBBox();
1126 const int idx = this->m_prms.getOrientationIndex();
1127 const double maxLow = bBox.
getMinPt()[idx] + distanceFromBBoxEdge;
1128 const double minHigh = bBox.
getMaxPt()[idx] - distanceFromBBoxEdge;
1130 int lowTagCount = 0;
1131 int highTagCount = 0;
1133 particleCollection.getParticleIterator();
1137 const double dimPos = particle.getPos()[idx];
1138 const double radius = particle.getRad();
1140 if (dimPos - radius <= maxLow) {
1141 particle.setTag(lowDrivingTag);
1144 if (dimPos + radius >= minHigh) {
1145 particle.setTag(highDrivingTag);
1149 console.
Info() <<
"Tagged " << lowTagCount <<
" particles with " << lowDrivingTag <<
"\n";
1150 console.
Info() <<
"Tagged " << highTagCount <<
" particles with " << highDrivingTag <<
"\n";