diff --git a/src/MotionModel/conveyorBeltMotion/conveyorBeltMotion.cpp b/src/MotionModel/conveyorBeltMotion/conveyorBeltMotion.cpp new file mode 100644 index 00000000..2315e43e --- /dev/null +++ b/src/MotionModel/conveyorBeltMotion/conveyorBeltMotion.cpp @@ -0,0 +1,75 @@ +/*------------------------------- phasicFlow --------------------------------- + O C enter of + O O E ngineering and + O O M ultiscale modeling of + OOOOOOO F luid flow +------------------------------------------------------------------------------ + Copyright (C): www.cemf.ir + email: hamid.r.norouzi AT gmail.com +------------------------------------------------------------------------------ +Licence: + This file is part of phasicFlow code. It is a free software for simulating + granular and multiphase flows. You can redistribute it and/or modify it under + the terms of GNU General Public License v3 or any other later versions. + + phasicFlow is distributed to help others in their research in the field of + granular and multiphase flows, but WITHOUT ANY WARRANTY; without even the + implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + +-----------------------------------------------------------------------------*/ + +#include "conveyorBeltMotion.hpp" + + +pFlow::conveyorBeltMotion::conveyorBeltMotion +( + const objectFile &objf, + repository *owner +) +: + fileDictionary(objf, owner) +{ + + if(!impl_readDictionary(*this) ) + { + fatalErrorInFunction; + fatalExit; + } +} + +pFlow::conveyorBeltMotion::conveyorBeltMotion +( + const objectFile &objf, + const dictionary &dict, + repository *owner +) +: + fileDictionary(objf, dict, owner) +{ + if(!impl_readDictionary(*this) ) + { + fatalErrorInFunction; + fatalExit; + } +} + +bool pFlow::conveyorBeltMotion::write +( + iOstream &os, + const IOPattern &iop +) const +{ + // a global dictionary + dictionary newDict(fileDictionary::dictionary::name(), true); + if( iop.thisProcWriteData() ) + { + if( !this->impl_writeDictionary(newDict) || + !newDict.write(os)) + { + fatalErrorInFunction<< + " error in writing to dictionary "<< newDict.globalName()< +{ +protected: + + friend MotionModel; + + bool impl_isMoving()const + { + return false; + } + + bool impl_move(uint32, real, real)const + { + return true; + } + + void impl_setTime(uint32 ,real ,real )const + {} + +public: + + TypeInfo("conveyorBeltMotion"); + + conveyorBeltMotion(const objectFile& objf, repository* owner); + + conveyorBeltMotion( + const objectFile& objf, + const dictionary& dict, + repository* owner); + + + using fileDictionary::write; + + bool write(iOstream& os, const IOPattern& iop)const override; + + static + auto noneComponent() + { + return conveyorBelt(); + } +}; + +} // pFlow + + +#endif // __conveyorBeltMotion_hpp__ \ No newline at end of file diff --git a/src/MotionModel/entities/conveyorBelt/conveyorBelt.cpp b/src/MotionModel/entities/conveyorBelt/conveyorBelt.cpp new file mode 100644 index 00000000..a92466c9 --- /dev/null +++ b/src/MotionModel/entities/conveyorBelt/conveyorBelt.cpp @@ -0,0 +1,72 @@ +/*------------------------------- phasicFlow --------------------------------- + O C enter of + O O E ngineering and + O O M ultiscale modeling of + OOOOOOO F luid flow +------------------------------------------------------------------------------ + Copyright (C): www.cemf.ir + email: hamid.r.norouzi AT gmail.com +------------------------------------------------------------------------------ +Licence: + This file is part of phasicFlow code. It is a free software for simulating + granular and multiphase flows. You can redistribute it and/or modify it under + the terms of GNU General Public License v3 or any other later versions. + + phasicFlow is distributed to help others in their research in the field of + granular and multiphase flows, but WITHOUT ANY WARRANTY; without even the + implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + +-----------------------------------------------------------------------------*/ + +#include "conveyorBelt.hpp" +#include "dictionary.hpp" + + +FUNCTION_H +pFlow::conveyorBelt::conveyorBelt(const dictionary& dict) +{ + if(!read(dict)) + { + fatalErrorInFunction<< + " error in reading conveyorBelt from dictionary "<< dict.globalName()<("velocity"); + + return true; +} + +FUNCTION_H +bool pFlow::conveyorBelt::write(dictionary& dict) const +{ + if( !dict.add("velocity", velocity_) ) + { + fatalErrorInFunction<< + " error in writing velocity to dictionary "<< dict.globalName()<>(iIstream& is, conveyorBelt& obj) +{ + + return is; +} + +} + + +#endif diff --git a/tutorials/sphereGranFlow/conveyorBelt/caseSetup/interaction b/tutorials/sphereGranFlow/conveyorBelt/caseSetup/interaction new file mode 100755 index 00000000..3ea53adf --- /dev/null +++ b/tutorials/sphereGranFlow/conveyorBelt/caseSetup/interaction @@ -0,0 +1,71 @@ +/* -------------------------------*- C++ -*--------------------------------- *\ +| phasicFlow File | +| copyright: www.cemf.ir | +\* ------------------------------------------------------------------------- */ +objectName interaction; +objectType dicrionary; +fileFormat ASCII; +/*---------------------------------------------------------------------------*/ +materials (lightMat heavyMat wallMat); // a list of materials names + +densities (1000 1500.0 2500); // density of materials [kg/m3] + +contactListType sortedContactList; + +contactSearch +{ + method NBS; // method for broad search particle-particle + + updateInterval 10; + + sizeRatio 1.1; + + cellExtent 0.55; + + adjustableBox No; +} + +model +{ + contactForceModel nonLinearLimited; + + rollingFrictionModel normal; + + /* + + Property (lightMat-lightMat lightMat-heavyMat lightMat-wallMat + heavyMat-heavyMat heavyMat-wallMat + wallMat-wallMat ); + */ + + Yeff (1.0e6 1.0e6 1.0e6 // Young modulus [Pa] + 1.0e6 1.0e6 + 1.0e6); + + Geff (0.8e6 0.8e6 0.8e6 // Shear modulus [Pa] + 0.8e6 0.8e6 + 0.8e6); + + nu (0.25 0.25 0.25 // Poisson's ratio [-] + 0.25 0.25 + 0.25); + + en (0.97 0.97 0.85 // coefficient of normal restitution + 0.97 0.85 + 1.00); + + et (1.0 1.0 1.0 // coefficient of tangential restitution + 1.0 1.0 + 1.0); + + mu (0.65 0.65 0.35 // dynamic friction + 0.65 0.35 + 0.35); + + mur (0.1 0.1 0.1 // rolling friction + 0.1 0.1 + 0.1); +} + + + diff --git a/tutorials/sphereGranFlow/conveyorBelt/caseSetup/particleInsertion b/tutorials/sphereGranFlow/conveyorBelt/caseSetup/particleInsertion new file mode 100755 index 00000000..195f27df --- /dev/null +++ b/tutorials/sphereGranFlow/conveyorBelt/caseSetup/particleInsertion @@ -0,0 +1,54 @@ +/* -------------------------------*- C++ -*--------------------------------- *\ +| phasicFlow File | +| copyright: www.cemf.ir | +\* ------------------------------------------------------------------------- */ +objectName particleInsertion; +objectType dicrionary; +fileFormat ASCII; +/*---------------------------------------------------------------------------*/ +active Yes; // is insertion active -> yes or no + +checkForCollision No; // is checked -> yes or no + +/* + one layers of particles are packed +*/ + +layer0 +{ + timeControl simulationTime; + + regionType cylinder; // type of insertion region + + rate 15000; // insertion rate (particles/s) + + startTime 0; // (s) + + endTime 0.5; // (s) + + insertionInterval 0.025; // s + + cylinderInfo + { + radius 0.09; // radius of cylinder (m) + + p1 ( 0.0 0.0 0.1 ); // (m,m,m) + + p2 ( 0.0 0.0 0.11); // (m,m,m) + } + + setFields + { + velocity realx3 (0.0 0.0 -0.6); // initial velocity of inserted particles + } + + mixture + { + lightSphere 1; // mixture composition of inserted particles + } +} + + + + + diff --git a/tutorials/sphereGranFlow/conveyorBelt/caseSetup/shapes b/tutorials/sphereGranFlow/conveyorBelt/caseSetup/shapes new file mode 100755 index 00000000..603c28cb --- /dev/null +++ b/tutorials/sphereGranFlow/conveyorBelt/caseSetup/shapes @@ -0,0 +1,15 @@ +/* -------------------------------*- C++ -*--------------------------------- *\ +| phasicFlow File | +| copyright: www.cemf.ir | +\* ------------------------------------------------------------------------- */ +objectName sphereDict; +objectType sphereShape; +fileFormat ASCII; +/*---------------------------------------------------------------------------*/ +names (lightSphere heavySphere); // names of shapes + +diameters (0.007 0.007); // diameter of shapes + +materials (lightMat heavyMat); // material names for shapes + + diff --git a/tutorials/sphereGranFlow/conveyorBelt/cleanThisCase b/tutorials/sphereGranFlow/conveyorBelt/cleanThisCase new file mode 100755 index 00000000..8a0ab919 --- /dev/null +++ b/tutorials/sphereGranFlow/conveyorBelt/cleanThisCase @@ -0,0 +1,7 @@ +#!/bin/sh +cd ${0%/*} || exit 1 # Run from this directory + +ls | grep -P "^(([0-9]+\.?[0-9]*)|(\.[0-9]+))$" | xargs -d"\n" rm -rf +rm -rf VTK + +#------------------------------------------------------------------------------ diff --git a/tutorials/sphereGranFlow/conveyorBelt/runThisCase b/tutorials/sphereGranFlow/conveyorBelt/runThisCase new file mode 100755 index 00000000..c48d71fe --- /dev/null +++ b/tutorials/sphereGranFlow/conveyorBelt/runThisCase @@ -0,0 +1,21 @@ +#!/bin/sh +cd ${0%/*} || exit 1 # Run from this directory +echo "\n<--------------------------------------------------------------------->" +echo "1) Creating particles" +echo "<--------------------------------------------------------------------->\n" +particlesPhasicFlow + +echo "\n<--------------------------------------------------------------------->" +echo "2) Creating geometry" +echo "<--------------------------------------------------------------------->\n" +geometryPhasicFlow + +echo "\n<--------------------------------------------------------------------->" +echo "3) Running the case" +echo "<--------------------------------------------------------------------->\n" +sphereGranFlow + + + + +#------------------------------------------------------------------------------ diff --git a/tutorials/sphereGranFlow/conveyorBelt/settings/domainDict b/tutorials/sphereGranFlow/conveyorBelt/settings/domainDict new file mode 100755 index 00000000..ef8b80a9 --- /dev/null +++ b/tutorials/sphereGranFlow/conveyorBelt/settings/domainDict @@ -0,0 +1,65 @@ +/* -------------------------------*- C++ -*--------------------------------- *\ +| phasicFlow File | +| copyright: www.cemf.ir | +\* ------------------------------------------------------------------------- */ +objectName domainDict; +objectType dictionary; +fileFormat ASCII; +/*---------------------------------------------------------------------------*/ +globalBox // Simulation domain: every particles that goes outside this domain will be deleted +{ + min (-0.11 -0.11 -0.41); + + max ( 0.11 0.11 0.41); +} + +boundaries +{ + // Determines how often (how many iterations) do you want to + + // rebuild the list of particles in the neighbor list + + // of all boundaries in the simulation domain + + neighborListUpdateInterval 30; + + // Determines how often do you want to update the new changes in the boundary + + updateInterval 10; + + // The distance from the boundary plane within which particles are marked to be in the boundary list + + neighborLength 0.004; + + left + { + type exit; // other options: periodict, reflective + } + + right + { + type exit; // other options: periodict, reflective + } + + bottom + { + type exit; // other options: periodict, reflective + } + + top + { + type exit; // other options: periodict, reflective + } + + rear + { + type exit; // other options: periodict, reflective + } + + front + { + type exit; // other options: periodict, reflective + } +} + + diff --git a/tutorials/sphereGranFlow/conveyorBelt/settings/geometryDict b/tutorials/sphereGranFlow/conveyorBelt/settings/geometryDict new file mode 100755 index 00000000..8f9a76b1 --- /dev/null +++ b/tutorials/sphereGranFlow/conveyorBelt/settings/geometryDict @@ -0,0 +1,78 @@ +/* -------------------------------*- C++ -*--------------------------------- *\ +| phasicFlow File | +| copyright: www.cemf.ir | +\* ------------------------------------------------------------------------- */ +objectName geometryDict; +objectType dictionary; +fileFormat ASCII; +/*---------------------------------------------------------------------------*/ +motionModel stationary; // motion model can be rotatingAxis or stationary or vibrating +stationaryInfo +{ + +} +/*conveyorBeltInfo +{ + conveyorBelt1 + { + velocity (1, 0, 0); + } +}*/ + +surfaces +{ + cylinderShell + { + type cylinderWall; // other options: cuboidWall and planeWall + + p1 (0.0 0.0 0.0); // begin point of cylinder axis + + p2 (0.0 0.0 0.4); // end point of cylinder axis + + radius1 0.1; // radius at p1 + + radius2 0.1; // radius at p2 + + resolution 36; // number of divisions + + material wallMat; // material name of this wall + } + + coneShell + { + type cylinderWall; // other options: cuboidWall and planeWall + + p1 (0.0 0.0 -0.1); // begin point of cylinder axis + + p2 (0.0 0.0 0.0); // end point of cylinder axis + + radius1 0.02; // radius at p1 + + radius2 0.1; // radius at p2 + + resolution 36; // number of divisions + + material wallMat; // material name of this wall + } + + belt + { + type stlWall; // type of the wall + file belt.stl; // file name in stl folder + material wallMat; // material name of this wall + //motion conveyorBelt1; // motion component name + } + + box + { + type stlWall; // type of the wall + file box.stl; // file name in stl folder + material wallMat; // material name of this wall + } +} + + + + + + diff --git a/tutorials/sphereGranFlow/conveyorBelt/settings/particlesDict b/tutorials/sphereGranFlow/conveyorBelt/settings/particlesDict new file mode 100755 index 00000000..4df47975 --- /dev/null +++ b/tutorials/sphereGranFlow/conveyorBelt/settings/particlesDict @@ -0,0 +1,47 @@ +/* -------------------------------*- C++ -*--------------------------------- *\ +| phasicFlow File | +| copyright: www.cemf.ir | +\* ------------------------------------------------------------------------- */ +objectName particlesDict; +objectType dictionary; +fileFormat ASCII; +/*---------------------------------------------------------------------------*/ +setFields +{ + /* + Default value for fields defined for particles + + These fields should always be defined for simulations with + + spherical particles. + */ + + defaultValue + { + velocity realx3 (0 0 0); // linear velocity (m/s) + + acceleration realx3 (0 0 0); // linear acceleration (m/s2) + + rVelocity realx3 (0 0 0); // rotational velocity (rad/s) + + shapeName word lightSphere; // name of the particle shape + } + + selectors + {} +} + +positionParticles // positions particles +{ + method empty; // other options: ordered and random + + regionType box; // other options: cylinder and sphere + + boxInfo // box region for positioning particles + { + min (-0.08 -0.08 0.015); // lower corner point of the box + + max ( 0.08 0.08 0.098); // upper corner point of the box + } +} + diff --git a/tutorials/sphereGranFlow/conveyorBelt/settings/settingsDict b/tutorials/sphereGranFlow/conveyorBelt/settings/settingsDict new file mode 100755 index 00000000..c5b6650d --- /dev/null +++ b/tutorials/sphereGranFlow/conveyorBelt/settings/settingsDict @@ -0,0 +1,42 @@ +/* -------------------------------*- C++ -*--------------------------------- *\ +| phasicFlow File | +| copyright: www.cemf.ir | +\* ------------------------------------------------------------------------- */ +objectName settingsDict; +objectType dictionary; +fileFormat ASCII; +/*---------------------------------------------------------------------------*/ +run layerdSiloFilling; + +dt 0.00005; // time step for integration (s) + +startTime 0.0; // start time for simulation + +endTime 5.0; // end time for simulation + +saveInterval 0.05; // time interval for saving the simulation + +timePrecision 6; // maximum number of digits for time folder + +g (0 0 -9.8); // gravity vector (m/s2) + +// save data objects that are not automatically saved on disk. + +// overrides the default behavior + +includeObjects (diameter); + +// exclude unnecessary data from saving on disk + +excludeObjects (rVelocity.dy1 pStructPosition.dy1 pStructVelocity.dy1); + +integrationMethod AdamsBashforth2; // integration method + +writeFormat ascii; // data writting format (ascii or binary) + +timersReport Yes; // report timers + +timersReportInterval 0.01; // time interval for reporting timers + + + diff --git a/tutorials/sphereGranFlow/conveyorBelt/stl/belt.stl b/tutorials/sphereGranFlow/conveyorBelt/stl/belt.stl new file mode 100644 index 00000000..6ab0e13b --- /dev/null +++ b/tutorials/sphereGranFlow/conveyorBelt/stl/belt.stl @@ -0,0 +1,198 @@ +solid + facet normal -1.000000 0.000000 0.000000 + outer loop + vertex -0.1 0.045 -0.145 + vertex -0.1 0.05 -0.12 + vertex -0.1 0.05 -0.15 + endloop + endfacet + facet normal -1.000000 0.000000 0.000000 + outer loop + vertex -0.1 0.045 -0.145 + vertex -0.1 0.045 -0.12 + vertex -0.1 0.05 -0.12 + endloop + endfacet + facet normal -1.000000 0.000000 0.000000 + outer loop + vertex -0.1 0.05 -0.15 + vertex -0.1 -0.05 -0.15 + vertex -0.1 0.045 -0.145 + endloop + endfacet + facet normal -1.000000 0.000000 0.000000 + outer loop + vertex -0.1 -0.05 -0.15 + vertex -0.1 -0.045 -0.145 + vertex -0.1 0.045 -0.145 + endloop + endfacet + facet normal -1.000000 0.000000 0.000000 + outer loop + vertex -0.1 -0.045 -0.145 + vertex -0.1 -0.05 -0.12 + vertex -0.1 -0.045 -0.12 + endloop + endfacet + facet normal -1.000000 0.000000 0.000000 + outer loop + vertex -0.1 -0.05 -0.15 + vertex -0.1 -0.05 -0.12 + vertex -0.1 -0.045 -0.145 + endloop + endfacet + facet normal 0.000000 0.000000 -1.000000 + outer loop + vertex -0.1 -0.05 -0.15 + vertex -0.1 0.05 -0.15 + vertex 0.2 0.05 -0.15 + endloop + endfacet + facet normal 0.000000 0.000000 -1.000000 + outer loop + vertex -0.1 -0.05 -0.15 + vertex 0.2 0.05 -0.15 + vertex 0.2 -0.05 -0.15 + endloop + endfacet + facet normal 1.000000 0.000000 0.000000 + outer loop + vertex 0.2 0.05 -0.12 + vertex 0.2 0.045 -0.145 + vertex 0.2 0.05 -0.15 + endloop + endfacet + facet normal 1.000000 -0.000000 0.000000 + outer loop + vertex 0.2 0.045 -0.12 + vertex 0.2 0.045 -0.145 + vertex 0.2 0.05 -0.12 + endloop + endfacet + facet normal 1.000000 0.000000 0.000000 + outer loop + vertex 0.2 -0.05 -0.15 + vertex 0.2 0.05 -0.15 + vertex 0.2 0.045 -0.145 + endloop + endfacet + facet normal 1.000000 -0.000000 0.000000 + outer loop + vertex 0.2 -0.045 -0.145 + vertex 0.2 -0.05 -0.15 + vertex 0.2 0.045 -0.145 + endloop + endfacet + facet normal 1.000000 -0.000000 0.000000 + outer loop + vertex 0.2 -0.05 -0.12 + vertex 0.2 -0.045 -0.145 + vertex 0.2 -0.045 -0.12 + endloop + endfacet + facet normal 1.000000 0.000000 0.000000 + outer loop + vertex 0.2 -0.05 -0.12 + vertex 0.2 -0.05 -0.15 + vertex 0.2 -0.045 -0.145 + endloop + endfacet + facet normal 0.000000 -1.000000 0.000000 + outer loop + vertex -0.1 -0.05 -0.15 + vertex 0.2 -0.05 -0.15 + vertex 0.2 -0.05 -0.12 + endloop + endfacet + facet normal 0.000000 -1.000000 0.000000 + outer loop + vertex -0.1 -0.05 -0.15 + vertex 0.2 -0.05 -0.12 + vertex -0.1 -0.05 -0.12 + endloop + endfacet + facet normal 0.000000 1.000000 0.000000 + outer loop + vertex 0.2 0.05 -0.12 + vertex -0.1 0.05 -0.15 + vertex -0.1 0.05 -0.12 + endloop + endfacet + facet normal 0.000000 1.000000 -0.000000 + outer loop + vertex 0.2 0.05 -0.15 + vertex -0.1 0.05 -0.15 + vertex 0.2 0.05 -0.12 + endloop + endfacet + facet normal 0.000000 0.000000 1.000000 + outer loop + vertex -0.1 -0.05 -0.12 + vertex 0.2 -0.05 -0.12 + vertex 0.2 -0.045 -0.12 + endloop + endfacet + facet normal -0.000000 0.000000 1.000000 + outer loop + vertex -0.1 -0.045 -0.12 + vertex -0.1 -0.05 -0.12 + vertex 0.2 -0.045 -0.12 + endloop + endfacet + facet normal 0.000000 0.000000 1.000000 + outer loop + vertex -0.1 0.045 -0.12 + vertex 0.2 0.045 -0.12 + vertex 0.2 0.05 -0.12 + endloop + endfacet + facet normal -0.000000 0.000000 1.000000 + outer loop + vertex -0.1 0.05 -0.12 + vertex -0.1 0.045 -0.12 + vertex 0.2 0.05 -0.12 + endloop + endfacet + facet normal 0.000000 -1.000000 0.000000 + outer loop + vertex -0.1 0.045 -0.145 + vertex 0.2 0.045 -0.145 + vertex 0.2 0.045 -0.12 + endloop + endfacet + facet normal 0.000000 -1.000000 0.000000 + outer loop + vertex -0.1 0.045 -0.145 + vertex 0.2 0.045 -0.12 + vertex -0.1 0.045 -0.12 + endloop + endfacet + facet normal 0.000000 0.000000 1.000000 + outer loop + vertex -0.1 -0.045 -0.145 + vertex 0.2 -0.045 -0.145 + vertex 0.2 0.045 -0.145 + endloop + endfacet + facet normal -0.000000 0.000000 1.000000 + outer loop + vertex -0.1 0.045 -0.145 + vertex -0.1 -0.045 -0.145 + vertex 0.2 0.045 -0.145 + endloop + endfacet + facet normal 0.000000 1.000000 -0.000000 + outer loop + vertex 0.2 -0.045 -0.145 + vertex -0.1 -0.045 -0.12 + vertex 0.2 -0.045 -0.12 + endloop + endfacet + facet normal 0.000000 1.000000 0.000000 + outer loop + vertex 0.2 -0.045 -0.145 + vertex -0.1 -0.045 -0.145 + vertex -0.1 -0.045 -0.12 + endloop + endfacet +endsolid diff --git a/tutorials/sphereGranFlow/conveyorBelt/stl/box.stl b/tutorials/sphereGranFlow/conveyorBelt/stl/box.stl new file mode 100644 index 00000000..3b0bb013 --- /dev/null +++ b/tutorials/sphereGranFlow/conveyorBelt/stl/box.stl @@ -0,0 +1,198 @@ +solid + facet normal -1.000000 0.000000 0.000000 + outer loop + vertex 0.182 -0.073 -0.18 + vertex 0.182 0.069 -0.18 + vertex 0.182 0.069 -0.28 + endloop + endfacet + facet normal -1.000000 0.000000 0.000000 + outer loop + vertex 0.182 -0.073 -0.18 + vertex 0.182 0.069 -0.28 + vertex 0.182 -0.073 -0.28 + endloop + endfacet + facet normal -0.000000 -1.000000 0.000000 + outer loop + vertex 0.323 -0.073 -0.18 + vertex 0.182 -0.073 -0.18 + vertex 0.182 -0.073 -0.28 + endloop + endfacet + facet normal 0.000000 -1.000000 -0.000000 + outer loop + vertex 0.323 -0.073 -0.18 + vertex 0.182 -0.073 -0.28 + vertex 0.323 -0.073 -0.28 + endloop + endfacet + facet normal 1.000000 0.000000 0.000000 + outer loop + vertex 0.323 0.069 -0.18 + vertex 0.323 -0.073 -0.18 + vertex 0.323 -0.073 -0.28 + endloop + endfacet + facet normal 1.000000 0.000000 0.000000 + outer loop + vertex 0.323 0.069 -0.18 + vertex 0.323 -0.073 -0.28 + vertex 0.323 0.069 -0.28 + endloop + endfacet + facet normal 0.000000 1.000000 0.000000 + outer loop + vertex 0.182 0.069 -0.28 + vertex 0.323 0.069 -0.18 + vertex 0.323 0.069 -0.28 + endloop + endfacet + facet normal -0.000000 1.000000 0.000000 + outer loop + vertex 0.182 0.069 -0.18 + vertex 0.323 0.069 -0.18 + vertex 0.182 0.069 -0.28 + endloop + endfacet + facet normal 0.000000 0.000000 -1.000000 + outer loop + vertex 0.182 0.069 -0.28 + vertex 0.323 0.069 -0.28 + vertex 0.182 -0.073 -0.28 + endloop + endfacet + facet normal 0.000000 0.000000 -1.000000 + outer loop + vertex 0.182 -0.073 -0.28 + vertex 0.323 0.069 -0.28 + vertex 0.323 -0.073 -0.28 + endloop + endfacet + facet normal 0.000000 0.000000 1.000000 + outer loop + vertex 0.323 -0.073 -0.18 + vertex 0.318 -0.068 -0.18 + vertex 0.187 -0.068 -0.18 + endloop + endfacet + facet normal 0.000000 0.000000 1.000000 + outer loop + vertex 0.323 -0.073 -0.18 + vertex 0.187 -0.068 -0.18 + vertex 0.182 -0.073 -0.18 + endloop + endfacet + facet normal 0.000000 0.000000 1.000000 + outer loop + vertex 0.187 0.064 -0.18 + vertex 0.182 0.069 -0.18 + vertex 0.182 -0.073 -0.18 + endloop + endfacet + facet normal 0.000000 0.000000 1.000000 + outer loop + vertex 0.187 0.064 -0.18 + vertex 0.182 -0.073 -0.18 + vertex 0.187 -0.068 -0.18 + endloop + endfacet + facet normal 0.000000 0.000000 1.000000 + outer loop + vertex 0.318 0.064 -0.18 + vertex 0.318 -0.068 -0.18 + vertex 0.323 -0.073 -0.18 + endloop + endfacet + facet normal 0.000000 0.000000 1.000000 + outer loop + vertex 0.323 0.069 -0.18 + vertex 0.318 0.064 -0.18 + vertex 0.323 -0.073 -0.18 + endloop + endfacet + facet normal 0.000000 0.000000 1.000000 + outer loop + vertex 0.323 0.069 -0.18 + vertex 0.182 0.069 -0.18 + vertex 0.187 0.064 -0.18 + endloop + endfacet + facet normal 0.000000 0.000000 1.000000 + outer loop + vertex 0.323 0.069 -0.18 + vertex 0.187 0.064 -0.18 + vertex 0.318 0.064 -0.18 + endloop + endfacet + facet normal 1.000000 0.000000 0.000000 + outer loop + vertex 0.187 0.064 -0.18 + vertex 0.187 -0.068 -0.18 + vertex 0.187 0.064 -0.275 + endloop + endfacet + facet normal 1.000000 0.000000 0.000000 + outer loop + vertex 0.187 0.064 -0.275 + vertex 0.187 -0.068 -0.18 + vertex 0.187 -0.068 -0.275 + endloop + endfacet + facet normal -0.000000 1.000000 0.000000 + outer loop + vertex 0.187 -0.068 -0.18 + vertex 0.318 -0.068 -0.18 + vertex 0.187 -0.068 -0.275 + endloop + endfacet + facet normal 0.000000 1.000000 0.000000 + outer loop + vertex 0.187 -0.068 -0.275 + vertex 0.318 -0.068 -0.18 + vertex 0.318 -0.068 -0.275 + endloop + endfacet + facet normal -1.000000 0.000000 0.000000 + outer loop + vertex 0.318 -0.068 -0.18 + vertex 0.318 0.064 -0.18 + vertex 0.318 -0.068 -0.275 + endloop + endfacet + facet normal -1.000000 0.000000 0.000000 + outer loop + vertex 0.318 -0.068 -0.275 + vertex 0.318 0.064 -0.18 + vertex 0.318 0.064 -0.275 + endloop + endfacet + facet normal -0.000000 -1.000000 -0.000000 + outer loop + vertex 0.318 0.064 -0.18 + vertex 0.187 0.064 -0.18 + vertex 0.318 0.064 -0.275 + endloop + endfacet + facet normal 0.000000 -1.000000 0.000000 + outer loop + vertex 0.318 0.064 -0.275 + vertex 0.187 0.064 -0.18 + vertex 0.187 0.064 -0.275 + endloop + endfacet + facet normal 0.000000 0.000000 1.000000 + outer loop + vertex 0.318 0.064 -0.275 + vertex 0.187 0.064 -0.275 + vertex 0.187 -0.068 -0.275 + endloop + endfacet + facet normal 0.000000 0.000000 1.000000 + outer loop + vertex 0.318 0.064 -0.275 + vertex 0.187 -0.068 -0.275 + vertex 0.318 -0.068 -0.275 + endloop + endfacet +endsolid