diff --git a/applications/test/vectorTools/Make/files b/applications/test/vectorTools/Make/files new file mode 100644 index 0000000000000000000000000000000000000000..0b30b98f8f3b0c0c1048846c8e90a62733a12dda --- /dev/null +++ b/applications/test/vectorTools/Make/files @@ -0,0 +1,3 @@ +Test-vectorTools.C + +EXE = $(FOAM_USER_APPBIN)/Test-vectorTools diff --git a/applications/test/vectorTools/Make/options b/applications/test/vectorTools/Make/options new file mode 100644 index 0000000000000000000000000000000000000000..9e015e6078873ee32ae6d53ac1590010819dcb69 --- /dev/null +++ b/applications/test/vectorTools/Make/options @@ -0,0 +1 @@ +EXE_INC = -I$(FOAM_APP)/utilities/mesh/generation/cvMesh/vectorTools diff --git a/applications/test/vectorTools/Test-vectorTools.C b/applications/test/vectorTools/Test-vectorTools.C new file mode 100644 index 0000000000000000000000000000000000000000..85d18ed98957073b2ab7130534cc21f0828740cf --- /dev/null +++ b/applications/test/vectorTools/Test-vectorTools.C @@ -0,0 +1,71 @@ +#include "vector.H" +#include "IOstreams.H" +#include "vectorTools.H" +#include "unitConversion.H" + +using namespace Foam; + + +void test(const vector& a, const vector& b, const scalar tolerance) +{ + Info<< "Vectors " << a << " and " << b + << " are (to tolerance of " << tolerance << "): "; + + if (vectorTools::areParallel(a, b, tolerance)) + Info<< " parallel "; + + if (vectorTools::areOrthogonal(a, b, tolerance)) + Info<< " orthogonal "; + + if (vectorTools::areAcute(a, b)) + Info<< " acute "; + + if (vectorTools::areObtuse(a, b)) + Info<< " obtuse "; + + Info<< ", angle = " << vectorTools::degAngleBetween(a, b); + + Info<< endl; +} + + +int main() +{ + vector a(1.0, 1.0, 1.0); + vector b(2.0, 2.0, 2.0); + + test(a, b, 0.0); + test(a, b, VSMALL); + test(a, b, SMALL); + test(a, b, 1e-3); + test(a, b, 1e-1); + + a = vector(1,0,0); + b = vector(0,2,0); + + test(a, b, 0.0); + test(a, b, VSMALL); + test(a, b, SMALL); + test(a, b, 1e-3); + test(a, b, 1e-1); + + a = vector(1,0,0); + b = vector(-1,0,0); + + test(a, b, 0.0); + test(a, b, VSMALL); + test(a, b, SMALL); + test(a, b, 1e-3); + test(a, b, 1e-1); + + a = vector(1,0,0); + b = vector(-1,2,0); + + test(a, b, 0.0); + test(a, b, VSMALL); + test(a, b, SMALL); + test(a, b, 1e-3); + test(a, b, 1e-1); + + return 0; +} diff --git a/applications/utilities/mesh/advanced/collapseEdges/collapseDict b/applications/utilities/mesh/advanced/collapseEdges/collapseDict index 60f4cb2f43809aff6b09b4ab0057aec3b226ab9b..78905475e33add919a8cc0ece968b737c26fea15 100644 --- a/applications/utilities/mesh/advanced/collapseEdges/collapseDict +++ b/applications/utilities/mesh/advanced/collapseEdges/collapseDict @@ -2,16 +2,24 @@ | ========= | | | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | | \\ / O peration | Version: dev | -| \\ / A nd | Web: www.OpenFOAM.org | +| \\ / A nd | Web: http://www.openfoam.org | | \\/ M anipulation | | \*---------------------------------------------------------------------------*/ + FoamFile { - version 2.0; - format ascii; - class dictionary; - object collapseDict; + version 2.0; + format ascii; + + root ""; + case ""; + instance ""; + local ""; + + class dictionary; + object collapseDict; } + // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // collapseEdgesCoeffs @@ -70,11 +78,7 @@ meshQualityCoeffs meshQualityCoeffDict meshQualityDict; // Maximum number of outer iterations is mesh quality checking is enabled - maximumIterations 10; - - // Maximum number of iterations deletion of a point can cause a bad face - // to be constructed before it is forced to not be deleted - maxPointErrorCount 5; + maximumIterations 30; } diff --git a/applications/utilities/mesh/generation/Allwmake b/applications/utilities/mesh/generation/Allwmake index d557fa34f89e754385551f8d8bba0ef418d049e5..48ca530c96933f6c31bf4f126658efc9f607fd51 100755 --- a/applications/utilities/mesh/generation/Allwmake +++ b/applications/utilities/mesh/generation/Allwmake @@ -9,5 +9,10 @@ extrude2DMesh/Allwmake wmake snappyHexMesh +if [ -d "$CGAL_ARCH_PATH" ] +then + cvMesh/Allwmake + cv2DMesh/Allwmake +fi # ----------------------------------------------------------------- end-of-file diff --git a/applications/utilities/mesh/generation/cv2DMesh/Allwclean b/applications/utilities/mesh/generation/cv2DMesh/Allwclean new file mode 100755 index 0000000000000000000000000000000000000000..d0ae53e41503d0ccd189b47c40f83dc193030e03 --- /dev/null +++ b/applications/utilities/mesh/generation/cv2DMesh/Allwclean @@ -0,0 +1,8 @@ +#!/bin/sh +cd ${0%/*} || exit 1 # run from this directory +set -x + +wclean libso conformalVoronoi2DMesh +wclean + +# ----------------------------------------------------------------- end-of-file diff --git a/applications/utilities/mesh/generation/cv2DMesh/Allwmake b/applications/utilities/mesh/generation/cv2DMesh/Allwmake new file mode 100755 index 0000000000000000000000000000000000000000..54868499573cf6b3ce989a211b0fd1be7944c490 --- /dev/null +++ b/applications/utilities/mesh/generation/cv2DMesh/Allwmake @@ -0,0 +1,8 @@ +#!/bin/sh +cd ${0%/*} || exit 1 # run from this directory +set -x + +wmake libso conformalVoronoi2DMesh +wmake + +# ----------------------------------------------------------------- end-of-file diff --git a/applications/utilities/mesh/generation/cv2DMesh/CGALTriangulation2DKernel.H b/applications/utilities/mesh/generation/cv2DMesh/CGALTriangulation2DKernel.H new file mode 100644 index 0000000000000000000000000000000000000000..28002f962fd3935e9de325d4bba28da3746fdd96 --- /dev/null +++ b/applications/utilities/mesh/generation/cv2DMesh/CGALTriangulation2DKernel.H @@ -0,0 +1,60 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2013 OpenFOAM Foundation + \\/ M anipulation | +------------------------------------------------------------------------------- +License + This file is part of OpenFOAM. + + OpenFOAM is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + OpenFOAM is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>. + +Typedefs + CGALTriangulation2DKernel + +Description + +\*---------------------------------------------------------------------------*/ + +#ifndef CGALTriangulation2DKernel_H +#define CGALTriangulation2DKernel_H + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#include "CGAL/Delaunay_triangulation_2.h" + +#ifdef CGAL_INEXACT + + // Fast kernel using a double as the storage type but the triangulation + // may fail + #include "CGAL/Exact_predicates_inexact_constructions_kernel.h" + + typedef CGAL::Exact_predicates_inexact_constructions_kernel K; + +#else + + // Very robust but expensive kernel + #include "CGAL/Exact_predicates_exact_constructions_kernel.h" + + typedef CGAL::Exact_predicates_exact_constructions_kernel K; + +#endif + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#endif + +// ************************************************************************* // diff --git a/applications/utilities/mesh/generation/cv2DMesh/CGALTriangulation2Ddefs.H b/applications/utilities/mesh/generation/cv2DMesh/CGALTriangulation2Ddefs.H new file mode 100644 index 0000000000000000000000000000000000000000..87319265483b63d1468fecf57a1be3edfde2fec0 --- /dev/null +++ b/applications/utilities/mesh/generation/cv2DMesh/CGALTriangulation2Ddefs.H @@ -0,0 +1,76 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2013 OpenFOAM Foundation + \\/ M anipulation | +------------------------------------------------------------------------------- +License + This file is part of OpenFOAM. + + OpenFOAM is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + OpenFOAM is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>. + +Typedefs + CGALTriangulation2Ddefs + +Description + CGAL data structures used for 2D Delaunay meshing. + + Define CGAL_INEXACT to use Exact_predicates_inexact_constructions kernel + otherwise the more robust but much less efficient + Exact_predicates_exact_constructions will be used. + + Define CGAL_HIERARCHY to use hierarchical Delaunay triangulation which is + faster but uses more memory than the standard Delaunay triangulation. + +\*---------------------------------------------------------------------------*/ + +#ifndef CGALTriangulation2Ddefs_H +#define CGALTriangulation2Ddefs_H + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#include "CGALTriangulation2DKernel.H" + +#include "indexedVertex.H" +#include "indexedFace.H" + +typedef CGAL::indexedVertex<K> Vb; +typedef CGAL::indexedFace<K> Fb; + +#ifdef CGAL_HIERARCHY + + // Data structures for hierarchical Delaunay triangulation which is more + // efficient but also uses more storage + #include "CGAL/Triangulation_hierarchy_2.h" + + typedef CGAL::Triangulation_hierarchy_vertex_base_2<Vb> Vbh; + typedef CGAL::Triangulation_data_structure_2<Vbh, Fb> Tds; + typedef CGAL::Delaunay_triangulation_2<K, Tds> DT; + typedef CGAL::Triangulation_hierarchy_2<DT> Delaunay; + +#else + + // Data structures for standard Delaunay triangulation + typedef CGAL::Triangulation_data_structure_2<Vb, Fb> Tds; + typedef CGAL::Delaunay_triangulation_2<K, Tds> Delaunay; + +#endif + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#endif + +// ************************************************************************* // diff --git a/applications/utilities/mesh/generation/cv2DMesh/CV2D.C b/applications/utilities/mesh/generation/cv2DMesh/CV2D.C new file mode 100644 index 0000000000000000000000000000000000000000..8a5931df61229dfb523c3a584377d0652ae15e73 --- /dev/null +++ b/applications/utilities/mesh/generation/cv2DMesh/CV2D.C @@ -0,0 +1,997 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2013 OpenFOAM Foundation + \\/ M anipulation | +------------------------------------------------------------------------------- +License + This file is part of OpenFOAM. + + OpenFOAM is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + OpenFOAM is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>. + +\*----------------------------------------------------------------------------*/ + +#include "CV2D.H" +#include "Random.H" +#include "transform.H" +#include "IFstream.H" +#include "uint.H" +#include "ulong.H" + +namespace Foam +{ + defineTypeNameAndDebug(CV2D, 0); +} + +// * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * // + +void Foam::CV2D::insertBoundingBox() +{ + Info<< "insertBoundingBox: creating bounding mesh" << endl; + scalar bigSpan = 10*meshControls().span(); + insertPoint(point2D(-bigSpan, -bigSpan), Vb::FAR_POINT); + insertPoint(point2D(-bigSpan, bigSpan), Vb::FAR_POINT); + insertPoint(point2D(bigSpan, -bigSpan), Vb::FAR_POINT); + insertPoint(point2D(bigSpan, bigSpan), Vb::FAR_POINT); +} + + +void Foam::CV2D::fast_restore_Delaunay(Vertex_handle vh) +{ + int i; + Face_handle f = vh->face(), next, start(f); + + do + { + i=f->index(vh); + if (!is_infinite(f)) + { + if (!internal_flip(f, cw(i))) external_flip(f, i); + if (f->neighbor(i) == start) start = f; + } + f = f->neighbor(cw(i)); + } while (f != start); +} + + +void Foam::CV2D::external_flip(Face_handle& f, int i) +{ + Face_handle n = f->neighbor(i); + + if + ( + CGAL::ON_POSITIVE_SIDE + != side_of_oriented_circle(n, f->vertex(i)->point()) + ) return; + + flip(f, i); + i = n->index(f->vertex(i)); + external_flip(n, i); +} + + +bool Foam::CV2D::internal_flip(Face_handle& f, int i) +{ + Face_handle n = f->neighbor(i); + + if + ( + CGAL::ON_POSITIVE_SIDE + != side_of_oriented_circle(n, f->vertex(i)->point()) + ) + { + return false; + } + + flip(f, i); + + return true; +} + + +// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // + +Foam::CV2D::CV2D +( + const Time& runTime, + const dictionary& cvMeshDict +) +: + Delaunay(), + runTime_(runTime), + rndGen_(64293*Pstream::myProcNo()), + allGeometry_ + ( + IOobject + ( + "cvSearchableSurfaces", + runTime_.constant(), + "triSurface", + runTime_, + IOobject::MUST_READ, + IOobject::NO_WRITE + ), + cvMeshDict.subDict("geometry") + ), + qSurf_ + ( + runTime_, + rndGen_, + allGeometry_, + cvMeshDict.subDict("surfaceConformation") + ), + controls_(cvMeshDict, qSurf_.globalBounds()), + cellSizeControl_ + ( + runTime, + cvMeshDict.subDict("motionControl").subDict("shapeControlFunctions"), + qSurf_, + controls_.minCellSize() + ), + relaxationModel_ + ( + relaxationModel::New + ( + cvMeshDict.subDict("motionControl"), + runTime + ) + ), + z_ + ( + point + ( + cvMeshDict.subDict("surfaceConformation").lookup("locationInMesh") + ).z() + ), + startOfInternalPoints_(0), + startOfSurfacePointPairs_(0), + startOfBoundaryConformPointPairs_(0), + featurePoints_() +{ + Info<< meshControls() << endl; + + insertBoundingBox(); + insertFeaturePoints(); +} + + +// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * // + +Foam::CV2D::~CV2D() +{} + + +// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // + +void Foam::CV2D::insertPoints +( + const point2DField& points, + const scalar nearness +) +{ + Info<< "insertInitialPoints(const point2DField& points): "; + + startOfInternalPoints_ = number_of_vertices(); + label nVert = startOfInternalPoints_; + + // Add the points and index them + forAll(points, i) + { + const point2D& p = points[i]; + + if (qSurf_.wellInside(toPoint3D(p), nearness)) + { + insert(toPoint(p))->index() = nVert++; + } + else + { + Warning + << "Rejecting point " << p << " outside surface" << endl; + } + } + + Info<< nVert << " vertices inserted" << endl; + + if (meshControls().objOutput()) + { + // Checking validity of triangulation + assert(is_valid()); + + writeTriangles("initial_triangles.obj", true); + writeFaces("initial_faces.obj", true); + } +} + + +void Foam::CV2D::insertPoints(const fileName& pointFileName) +{ + IFstream pointsFile(pointFileName); + + if (pointsFile.good()) + { + insertPoints + ( + point2DField(pointsFile), + 0.5*meshControls().minCellSize2() + ); + } + else + { + FatalErrorIn("insertInitialPoints") + << "Could not open pointsFile " << pointFileName + << exit(FatalError); + } +} + + +void Foam::CV2D::insertGrid() +{ + Info<< "insertInitialGrid: "; + + startOfInternalPoints_ = number_of_vertices(); + label nVert = startOfInternalPoints_; + + scalar x0 = qSurf_.globalBounds().min().x(); + scalar xR = qSurf_.globalBounds().max().x() - x0; + int ni = int(xR/meshControls().minCellSize()) + 1; + scalar deltax = xR/ni; + + scalar y0 = qSurf_.globalBounds().min().y(); + scalar yR = qSurf_.globalBounds().max().y() - y0; + int nj = int(yR/meshControls().minCellSize()) + 1; + scalar deltay = yR/nj; + + Random rndGen(1321); + scalar pert = meshControls().randomPerturbation()*min(deltax, deltay); + + for (int i=0; i<ni; i++) + { + for (int j=0; j<nj; j++) + { + point p(x0 + i*deltax, y0 + j*deltay, 0); + + if (meshControls().randomiseInitialGrid()) + { + p.x() += pert*(rndGen.scalar01() - 0.5); + p.y() += pert*(rndGen.scalar01() - 0.5); + } + + if (qSurf_.wellInside(p, 0.5*meshControls().minCellSize2())) + { + insert(Point(p.x(), p.y()))->index() = nVert++; + } + } + } + + Info<< nVert << " vertices inserted" << endl; + + if (meshControls().objOutput()) + { + // Checking validity of triangulation + assert(is_valid()); + + writeTriangles("initial_triangles.obj", true); + writeFaces("initial_faces.obj", true); + } +} + + +void Foam::CV2D::insertSurfacePointPairs() +{ + startOfSurfacePointPairs_ = number_of_vertices(); + + if (meshControls().insertSurfaceNearestPointPairs()) + { + insertSurfaceNearestPointPairs(); + } + + write("nearest"); + + // Insertion of point-pairs for near-points may cause protrusions + // so insertBoundaryConformPointPairs must be executed last + if (meshControls().insertSurfaceNearPointPairs()) + { + insertSurfaceNearPointPairs(); + } + + startOfBoundaryConformPointPairs_ = number_of_vertices(); +} + + +void Foam::CV2D::boundaryConform() +{ + if (!meshControls().insertSurfaceNearestPointPairs()) + { + markNearBoundaryPoints(); + } + + // Mark all the faces as SAVE_CHANGED + for + ( + Triangulation::Finite_faces_iterator fit = finite_faces_begin(); + fit != finite_faces_end(); + fit++ + ) + { + fit->faceIndex() = Fb::SAVE_CHANGED; + } + + for (label iter=1; iter<=meshControls().maxBoundaryConformingIter(); iter++) + { + label nIntersections = insertBoundaryConformPointPairs + ( + "surfaceIntersections_" + Foam::name(iter) + ".obj" + ); + + if (nIntersections == 0) + { + break; + } + else + { + Info<< "BC iteration " << iter << ": " + << nIntersections << " point-pairs inserted" << endl; + } + + // Any faces changed by insertBoundaryConformPointPairs will now + // be marked CHANGED, mark those as SAVE_CHANGED and those that + // remained SAVE_CHANGED as UNCHANGED + for + ( + Triangulation::Finite_faces_iterator fit = finite_faces_begin(); + fit != finite_faces_end(); + fit++ + ) + { + if (fit->faceIndex() == Fb::SAVE_CHANGED) + { + fit->faceIndex() = Fb::UNCHANGED; + } + else if (fit->faceIndex() == Fb::CHANGED) + { + fit->faceIndex() = Fb::SAVE_CHANGED; + } + } + } + + Info<< nl; + + write("boundary"); +} + + +void Foam::CV2D::removeSurfacePointPairs() +{ + for + ( + Triangulation::Finite_vertices_iterator vit = finite_vertices_begin(); + vit != finite_vertices_end(); + ++vit + ) + { + if (vit->index() >= startOfSurfacePointPairs_) + { + remove(vit); + } + } +} + + +void Foam::CV2D::newPoints() +{ + const scalar relaxation = relaxationModel_->relaxation(); + + Info<< "Relaxation = " << relaxation << endl; + + Field<point2D> dualVertices(number_of_faces()); + + label dualVerti = 0; + + // Find the dual point of each tetrahedron and assign it an index. + for + ( + Triangulation::Finite_faces_iterator fit = finite_faces_begin(); + fit != finite_faces_end(); + ++fit + ) + { + fit->faceIndex() = -1; + + if + ( + fit->vertex(0)->internalOrBoundaryPoint() + || fit->vertex(1)->internalOrBoundaryPoint() + || fit->vertex(2)->internalOrBoundaryPoint() + ) + { + fit->faceIndex() = dualVerti; + + dualVertices[dualVerti] = toPoint2D(circumcenter(fit)); + + dualVerti++; + } + } + + dualVertices.setSize(dualVerti); + + Field<vector2D> displacementAccumulator + ( + startOfSurfacePointPairs_, + vector2D::zero + ); + + // Calculate target size and alignment for vertices + scalarField sizes + ( + number_of_vertices(), + meshControls().minCellSize() + ); + + Field<vector2D> alignments + ( + number_of_vertices(), + vector2D(1, 0) + ); + + for + ( + Triangulation::Finite_vertices_iterator vit = finite_vertices_begin(); + vit != finite_vertices_end(); + ++vit + ) + { + if (vit->internalOrBoundaryPoint()) + { + point2D vert = toPoint2D(vit->point()); + + // alignment and size determination + pointIndexHit pHit; + label hitSurface = -1; + + qSurf_.findSurfaceNearest + ( + toPoint3D(vert), + meshControls().span2(), + pHit, + hitSurface + ); + + if (pHit.hit()) + { + vectorField norm(1); + allGeometry_[hitSurface].getNormal + ( + List<pointIndexHit>(1, pHit), + norm + ); + + alignments[vit->index()] = toPoint2D(norm[0]); + + sizes[vit->index()] = + cellSizeControl_.cellSize(toPoint3D(vit->point())); + } + } + } + + // Info<< "Calculated alignments" << endl; + + scalar cosAlignmentAcceptanceAngle = 0.68; + + // Upper and lower edge length ratios for weight + scalar u = 1.0; + scalar l = 0.7; + + PackedBoolList pointToBeRetained(startOfSurfacePointPairs_, true); + + std::list<Point> pointsToInsert; + + for + ( + Triangulation::Finite_edges_iterator eit = finite_edges_begin(); + eit != finite_edges_end(); + eit++ + ) + { + Vertex_handle vA = eit->first->vertex(cw(eit->second)); + Vertex_handle vB = eit->first->vertex(ccw(eit->second)); + + if (!vA->internalOrBoundaryPoint() || !vB->internalOrBoundaryPoint()) + { + continue; + } + + const point2D& dualV1 = dualVertices[eit->first->faceIndex()]; + const point2D& dualV2 = + dualVertices[eit->first->neighbor(eit->second)->faceIndex()]; + + scalar dualEdgeLength = mag(dualV1 - dualV2); + + point2D dVA = toPoint2D(vA->point()); + point2D dVB = toPoint2D(vB->point()); + + Field<vector2D> alignmentDirsA(2); + + alignmentDirsA[0] = alignments[vA->index()]; + alignmentDirsA[1] = vector2D + ( + -alignmentDirsA[0].y(), + alignmentDirsA[0].x() + ); + + Field<vector2D> alignmentDirsB(2); + + alignmentDirsB[0] = alignments[vB->index()]; + alignmentDirsB[1] = vector2D + ( + -alignmentDirsB[0].y(), + alignmentDirsB[0].x() + ); + + Field<vector2D> alignmentDirs(2); + + forAll(alignmentDirsA, aA) + { + const vector2D& a(alignmentDirsA[aA]); + + scalar maxDotProduct = 0.0; + + forAll(alignmentDirsB, aB) + { + const vector2D& b(alignmentDirsB[aB]); + + scalar dotProduct = a & b; + + if (mag(dotProduct) > maxDotProduct) + { + maxDotProduct = mag(dotProduct); + + alignmentDirs[aA] = a + sign(dotProduct)*b; + + alignmentDirs[aA] /= mag(alignmentDirs[aA]); + } + } + } + + vector2D rAB = dVA - dVB; + + scalar rABMag = mag(rAB); + + forAll(alignmentDirs, aD) + { + vector2D& alignmentDir = alignmentDirs[aD]; + + if ((rAB & alignmentDir) < 0) + { + // swap the direction of the alignment so that has the + // same sense as rAB + alignmentDir *= -1; + } + + scalar alignmentDotProd = ((rAB/rABMag) & alignmentDir); + + if (alignmentDotProd > cosAlignmentAcceptanceAngle) + { + scalar targetFaceSize = + 0.5*(sizes[vA->index()] + sizes[vB->index()]); + + // Test for changing aspect ratio on second alignment (first + // alignment is neartest surface normal) + // if (aD == 1) + // { + // targetFaceSize *= 2.0; + // } + + alignmentDir *= 0.5*targetFaceSize; + + vector2D delta = alignmentDir - 0.5*rAB; + + if (dualEdgeLength < 0.7*targetFaceSize) + { + delta *= 0; + } + else if (dualEdgeLength < targetFaceSize) + { + delta *= + ( + dualEdgeLength + /(targetFaceSize*(u - l)) + - 1/((u/l) - 1) + ); + } + + if + ( + vA->internalPoint() + && vB->internalPoint() + && rABMag > 1.75*targetFaceSize + && dualEdgeLength > 0.05*targetFaceSize + && alignmentDotProd > 0.93 + ) + { + // Point insertion + pointsToInsert.push_back(toPoint(0.5*(dVA + dVB))); + } + else if + ( + (vA->internalPoint() || vB->internalPoint()) + && rABMag < 0.65*targetFaceSize + ) + { + // Point removal + + // Only insert a point at the midpoint of the short edge + // if neither attached point has already been identified + // to be removed. + if + ( + pointToBeRetained[vA->index()] == true + && pointToBeRetained[vB->index()] == true + ) + { + pointsToInsert.push_back(toPoint(0.5*(dVA + dVB))); + } + + if (vA->internalPoint()) + { + pointToBeRetained[vA->index()] = false; + } + + if (vB->internalPoint()) + { + pointToBeRetained[vB->index()] = false; + } + } + else + { + if (vA->internalPoint()) + { + displacementAccumulator[vA->index()] += delta; + } + + if (vB->internalPoint()) + { + displacementAccumulator[vB->index()] += -delta; + } + } + } + } + } + + vector2D totalDisp = sum(displacementAccumulator); + scalar totalDist = sum(mag(displacementAccumulator)); + + // Relax the calculated displacement + displacementAccumulator *= relaxation; + + label numberOfNewPoints = pointsToInsert.size(); + + for + ( + Triangulation::Finite_vertices_iterator vit = finite_vertices_begin(); + vit != finite_vertices_end(); + ++vit + ) + { + if (vit->internalPoint()) + { + if (pointToBeRetained[vit->index()]) + { + pointsToInsert.push_front + ( + toPoint + ( + toPoint2D(vit->point()) + + displacementAccumulator[vit->index()] + ) + ); + } + } + } + + // Clear the triangulation and reinsert the bounding box and feature points. + // This is faster than removing and moving points. + this->clear(); + + insertBoundingBox(); + + reinsertFeaturePoints(); + + startOfInternalPoints_ = number_of_vertices(); + + label nVert = startOfInternalPoints_; + + Info<< "Inserting " << numberOfNewPoints << " new points" << endl; + + // Use the range insert as it is faster than individually inserting points. + insert(pointsToInsert.begin(), pointsToInsert.end()); + + for + ( + Delaunay::Finite_vertices_iterator vit = finite_vertices_begin(); + vit != finite_vertices_end(); + ++vit + ) + { + if + ( + vit->type() == Vb::INTERNAL_POINT + && vit->index() == Vb::INTERNAL_POINT + ) + { + vit->index() = nVert++; + } + } + + Info<< " Total displacement = " << totalDisp << nl + << " Total distance = " << totalDist << nl + << " Points added = " << pointsToInsert.size() + << endl; + + write("internal"); + + insertSurfacePointPairs(); + + boundaryConform(); + + +// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +// Old Method +// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +// for +// ( +// Triangulation::Finite_vertices_iterator vit = finite_vertices_begin(); +// vit != finite_vertices_end(); +// ++vit +// ) +// { +// if (vit->internalPoint()) +// { +// // Current dual-cell defining vertex ("centre") +// point2DFromPoint defVert0 = toPoint2D(vit->point()); + +// Triangulation::Edge_circulator ec = incident_edges(vit); +// Triangulation::Edge_circulator ecStart = ec; + +// // Circulate around the edges to find the first which is not +// // infinite +// do +// { +// if (!is_infinite(ec)) break; +// } while (++ec != ecStart); + +// // Store the start-end of the first non-infinte edge +// point2D de0 = toPoint2D(circumcenter(ec->first)); + +// // Keep track of the maximum edge length^2 +// scalar maxEdgeLen2 = 0.0; + +// // Keep track of the index of the longest edge +// label edgecd0i = -1; + +// // Edge counter +// label edgei = 0; + +// do +// { +// if (!is_infinite(ec)) +// { +// // Get the end of the current edge +// point2D de1 = toPoint2D +// ( +// circumcenter(ec->first->neighbor(ec->second)) +// ); + +// // Store the current edge vector +// edges[edgei] = de1 - de0; + +// // Store the edge mid-point in the vertices array +// vertices[edgei] = 0.5*(de1 + de0); + +// // Move the current edge end into the edge start for the +// // next iteration +// de0 = de1; + +// // Keep track of the longest edge + +// scalar edgeLen2 = magSqr(edges[edgei]); + +// if (edgeLen2 > maxEdgeLen2) +// { +// maxEdgeLen2 = edgeLen2; +// edgecd0i = edgei; +// } + +// edgei++; +// } +// } while (++ec != ecStart); + +// // Initialise cd0 such that the mesh will align +// // in in the x-y directions +// vector2D cd0(1, 0); + +// if (meshControls().relaxOrientation()) +// { +// // Get the longest edge from the array and use as the primary +// // direction of the coordinate system of the "square" cell +// cd0 = edges[edgecd0i]; +// } + +// if (meshControls().nearWallAlignedDist() > 0) +// { +// pointIndexHit pHit = qSurf_.tree().findNearest +// ( +// toPoint3D(defVert0), +// meshControls().nearWallAlignedDist2() +// ); + +// if (pHit.hit()) +// { +// cd0 = toPoint2D(faceNormals[pHit.index()]); +// } +// } + +// // Rotate by 45deg needed to create an averaging procedure which +// // encourages the cells to be square +// cd0 = vector2D(cd0.x() + cd0.y(), cd0.y() - cd0.x()); + +// // Normalise the primary coordinate direction +// cd0 /= mag(cd0); + +// // Calculate the orthogonal coordinate direction +// vector2D cd1(-cd0.y(), cd0.x()); + + +// // Restart the circulator +// ec = ecStart; + +// // ... and the counter +// edgei = 0; + +// // Initialise the displacement for the centre and sum-weights +// vector2D disp = vector2D::zero; +// scalar sumw = 0; + +// do +// { +// if (!is_infinite(ec)) +// { +// // Pick up the current edge +// const vector2D& ei = edges[edgei]; + +// // Calculate the centre to edge-centre vector +// vector2D deltai = vertices[edgei] - defVert0; + +// // Set the weight for this edge contribution +// scalar w = 1; + +// if (meshControls().squares()) +// { +// w = magSqr(deltai.x()*ei.y() - deltai.y()*ei.x()); +// // alternative weights +// //w = mag(deltai.x()*ei.y() - deltai.y()*ei.x()); +// //w = magSqr(ei)*mag(deltai); + +// // Use the following for an ~square mesh +// // Find the coordinate contributions for this edge delta +// scalar cd0deltai = cd0 & deltai; +// scalar cd1deltai = cd1 & deltai; + +// // Create a "square" displacement +// if (mag(cd0deltai) > mag(cd1deltai)) +// { +// disp += (w*cd0deltai)*cd0; +// } +// else +// { +// disp += (w*cd1deltai)*cd1; +// } +// } +// else +// { +// // Use this for a hexagon/pentagon mesh +// disp += w*deltai; +// } + +// // Sum the weights +// sumw += w; +// } +// else +// { +// FatalErrorIn("CV2D::newPoints() const") +// << "Infinite triangle found in internal mesh" +// << exit(FatalError); +// } + +// edgei++; + +// } while (++ec != ecStart); + +// // Calculate the average displacement +// disp /= sumw; +// totalDisp += disp; +// totalDist += mag(disp); + +// // Move the point by a fraction of the average displacement +// movePoint(vit, defVert0 + relaxation*disp); +// } +// } + +// Info << "\nTotal displacement = " << totalDisp +// << " total distance = " << totalDist << endl; +} + + +//void Foam::CV2D::moveInternalPoints(const point2DField& newPoints) +//{ +// label pointI = 0; + +// for +// ( +// Triangulation::Finite_vertices_iterator vit = finite_vertices_begin(); +// vit != finite_vertices_end(); +// ++vit +// ) +// { +// if (vit->internalPoint()) +// { +// movePoint(vit, newPoints[pointI++]); +// } +// } +//} + + +void Foam::CV2D::write() const +{ + if (meshControls().objOutput()) + { + writeFaces("allFaces.obj", false); + writeFaces("faces.obj", true); + writeTriangles("allTriangles.obj", false); + writeTriangles("triangles.obj", true); + writePatch("patch.pch"); + } +} + + +void Foam::CV2D::write(const word& stage) const +{ + if (meshControls().objOutput()) + { + Foam::mkDir(stage + "Faces"); + Foam::mkDir(stage + "Triangles"); + + writeFaces + ( + stage + + "Faces/allFaces_" + + runTime_.timeName() + + ".obj", + false + ); + + writeTriangles + ( + stage + + "Triangles/allTriangles_" + + runTime_.timeName() + + ".obj", + false + ); + } +} + + +// ************************************************************************* // diff --git a/applications/utilities/mesh/generation/cv2DMesh/CV2D.H b/applications/utilities/mesh/generation/cv2DMesh/CV2D.H new file mode 100644 index 0000000000000000000000000000000000000000..4948196fc2c685a7ece2aea29b8df50e4b5f20e7 --- /dev/null +++ b/applications/utilities/mesh/generation/cv2DMesh/CV2D.H @@ -0,0 +1,474 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2013 OpenFOAM Foundation + \\/ M anipulation | +------------------------------------------------------------------------------- +License + This file is part of OpenFOAM. + + OpenFOAM is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + OpenFOAM is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>. + +Class + CV2D + +Description + Conformal-Voronoi 2D automatic mesher with grid or read initial points + and point position relaxation with optional "squarification". + + There are a substantial number of options to this mesher read from + CV2DMesherDict file e.g.: + + // Min cell size used in tolerances when inserting points for + // boundary conforming. + // Also used to as the grid spacing usind in insertGrid. + minCellSize 0.05; + + // Feature angle used to inser feature points + // 0 = all features, 180 = no features + featureAngle 45; + + // Maximum quadrant angle allowed at a concave corner before + // additional "mitering" lines are added + maxQuadAngle 110; + + // Should the mesh be square-dominated or of unbiased hexagons + squares yes; + + // Near-wall region where cells are aligned with the wall specified as a + // number of cell layers + nearWallAlignedDist 3; + + // Chose if the cell orientation should relax during the iterations + // or remain fixed to the x-y directions + relaxOrientation no; + + // Insert near-boundary point mirror or point-pairs + insertSurfaceNearestPointPairs yes; + + // Mirror near-boundary points rather than insert point-pairs + mirrorPoints no; + + // Insert point-pairs vor dual-cell vertices very near the surface + insertSurfaceNearPointPairs yes; + + // Choose if to randomise the initial grid created by insertGrid. + randomiseInitialGrid yes; + + // Perturbation fraction, 1 = cell-size. + randomPurturbation 0.1; + + // Number of relaxation iterations. + nIterations 5; + + // Relaxation factor at the start of the iteration sequence. + // 0.5 is a sensible maximum and < 0.2 converges better. + relaxationFactorStart 0.8; + + // Relaxation factor at the end of the iteration sequence. + // Should be <= relaxationFactorStart + relaxationFactorEnd 0; + + writeInitialTriangulation no; + writeFeatureTriangulation no; + writeNearestTriangulation no; + writeInsertedPointPairs no; + writeFinalTriangulation yes; + + // Maximum number of iterations used in boundaryConform. + maxBoundaryConformingIter 5; + + minEdgeLenCoeff 0.5; + maxNotchLenCoeff 0.3; + minNearPointDistCoeff 0.25; + ppDistCoeff 0.05; + +SourceFiles + CGALTriangulation2Ddefs.H + indexedVertex.H + indexedFace.H + CV2DI.H + CV2D.C + CV2DIO.C + tolerances.C + controls.C + insertFeaturePoints.C + insertSurfaceNearestPointPairs.C + insertSurfaceNearPointPairs.C + insertBoundaryConformPointPairs.C + +\*---------------------------------------------------------------------------*/ + +#ifndef CV2D_H +#define CV2D_H + +#define CGAL_INEXACT +#define CGAL_HIERARCHY + +#include "CGALTriangulation2Ddefs.H" + +#include "Time.H" +#include "point2DFieldFwd.H" +#include "dictionary.H" +#include "Switch.H" +#include "PackedBoolList.H" +#include "EdgeMap.H" +#include "cv2DControls.H" +#include "tolerances.H" +#include "meshTools.H" +#include "triSurface.H" +#include "searchableSurfaces.H" +#include "conformationSurfaces.H" +#include "relaxationModel.H" +#include "cellSizeAndAlignmentControls.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ + +/*---------------------------------------------------------------------------*\ + Class CV2D Declaration +\*---------------------------------------------------------------------------*/ + +class CV2D +: + public Delaunay +{ + +private: + + // Private data + + //- The time registry of the application + const Time& runTime_; + + mutable Random rndGen_; + + //- The surface to mesh + //const querySurface& qSurf_; + //- All geometry of the meshing process, including surfaces to be + // conformed to and those to be used for refinement + searchableSurfaces allGeometry_; + + conformationSurfaces qSurf_; + + //- Meshing controls + cv2DControls controls_; + + //- The cell size control object + cellSizeAndAlignmentControls cellSizeControl_; + + //- Relaxation coefficient model. Runtime selectable. + autoPtr<relaxationModel> relaxationModel_; + + //- z-level + scalar z_; + + //- Keep track of the start of the internal points + label startOfInternalPoints_; + + //- Keep track of the start of the surface point-pairs + label startOfSurfacePointPairs_; + + //- Keep track of the boundary conform point-pairs + // stored after the insertion of the surface point-pairs in case + // the boundary conform function is called more than once without + // removing and insertin the surface point-pairs + label startOfBoundaryConformPointPairs_; + + //- Store the feature points + std::list<Vb> featurePoints_; + + //- Temporary storage for a dual-cell + static const label maxNvert = 20; + mutable point2D vertices[maxNvert+1]; + mutable vector2D edges[maxNvert+1]; + + + // Private Member Functions + + //- Disallow default bitwise copy construct + CV2D(const CV2D&); + + //- Disallow default bitwise assignment + void operator=(const CV2D&); + + + //- Insert point and return it's index + inline label insertPoint + ( + const point2D& pt, + const label type + ); + + //- Insert point and return it's index + inline label insertPoint + ( + const point2D& pt, + const label index, + const label type + ); + + inline label insertPoint + ( + const Point& p, + const label index, + const label type + ); + + inline bool insertMirrorPoint + ( + const point2D& nearSurfPt, + const point2D& surfPt + ); + + //- Insert a point-pair at a distance ppDist either side of + // surface point point surfPt in the direction n + inline void insertPointPair + ( + const scalar mirrorDist, + const point2D& surfPt, + const vector2D& n + ); + + //- Create the initial mesh from the bounding-box + void insertBoundingBox(); + + //- Check if a point is within a line. + bool on2DLine(const point2D& p, const linePointRef& line); + + //- Insert point groups at the feature points. + void insertFeaturePoints(); + + //- Re-insert point groups at the feature points. + void reinsertFeaturePoints(); + + //- Insert point-pairs at the given set of points using the surface + // normals corresponding to the given set of surface triangles + // and write the inserted point locations to the given file. + void insertPointPairs + ( + const DynamicList<point2D>& nearSurfacePoints, + const DynamicList<point2D>& surfacePoints, + const DynamicList<label>& surfaceTris, + const DynamicList<label>& surfaceHits, + const fileName fName + ); + + //- Check to see if dual cell specified by given vertex iterator + // intersects the boundary and hence reqires a point-pair. + bool dualCellSurfaceIntersection + ( + const Triangulation::Finite_vertices_iterator& vit + ) const; + + //- Insert point-pairs at the nearest points on the surface to the + // control vertex of dual-cells which intersect the boundary in order + // to provide a boundary-layer mesh. + // NB: This is not guaranteed to close the boundary + void insertSurfaceNearestPointPairs(); + + //- Insert point-pairs at small dual-cell edges on the surface in order + // to improve the boundary-layer mesh generated by + // insertSurfaceNearestPointPairs. + void insertSurfaceNearPointPairs(); + + //- Insert point-pair and correcting the Finite_vertices_iterator + // to account for the additional vertices + void insertPointPair + ( + Triangulation::Finite_vertices_iterator& vit, + const point2D& p, + const label trii, + const label hitSurface + ); + + //- Insert point-pair at the best intersection point between the lines + // from the dual-cell real centroid and it's vertices and the surface. + bool insertPointPairAtIntersection + ( + Triangulation::Finite_vertices_iterator& vit, + const point2D& defVert, + const point2D vertices[], + const scalar maxProtSize + ); + + //- Insert point-pairs corresponding to dual-cells which intersect + // the boundary surface + label insertBoundaryConformPointPairs(const fileName& fName); + + void markNearBoundaryPoints(); + + //- Restore the Delaunay contraint + void fast_restore_Delaunay(Vertex_handle vh); + + // Flip operations used by fast_restore_Delaunay + void external_flip(Face_handle& f, int i); + bool internal_flip(Face_handle& f, int i); + + //- Write all the faces and all the triangles at a particular stage. + void write(const word& stage) const; + + +public: + + //- Runtime type information + ClassName("CV2D"); + + + // Constructors + + //- Construct for given surface + CV2D(const Time& runTime, const dictionary& controlDict); + + + //- Destructor + ~CV2D(); + + + // Member Functions + + // Access + + inline const cv2DControls& meshControls() const; + + + // Conversion functions between point2D, point and Point + + inline const point2D& toPoint2D(const point&) const; + inline const point2DField toPoint2D(const pointField&) const; + inline point toPoint3D(const point2D&) const; + + #ifdef CGAL_INEXACT + typedef const point2D& point2DFromPoint; + typedef const Point& PointFromPoint2D; + #else + typedef point2D point2DFromPoint; + typedef Point PointFromPoint2D; + #endif + + inline point2DFromPoint toPoint2D(const Point&) const; + inline PointFromPoint2D toPoint(const point2D&) const; + inline point toPoint3D(const Point&) const; + + + // Point insertion + + //- Create the initial mesh from the given internal points. + // Points must be inside the boundary by at least nearness + // otherwise they are ignored. + void insertPoints + ( + const point2DField& points, + const scalar nearness + ); + + //- Create the initial mesh from the internal points in the given + // file. Points outside the geometry are ignored. + void insertPoints(const fileName& pointFileName); + + //- Create the initial mesh as a regular grid of points. + // Points outside the geometry are ignored. + void insertGrid(); + + //- Insert all surface point-pairs from + // insertSurfaceNearestPointPairs and + // findIntersectionForOutsideCentroid + void insertSurfacePointPairs(); + + //- Insert point-pairs where there are protrusions into + // or out of the surface + void boundaryConform(); + + + // Point removal + + //- Remove the point-pairs introduced by insertSurfacePointPairs + // and boundaryConform + void removeSurfacePointPairs(); + + + // Point motion + + inline void movePoint(const Vertex_handle& vh, const Point& P); + + //- Move the internal points to the given new locations and update + // the triangulation to ensure it is Delaunay + // void moveInternalPoints(const point2DField& newPoints); + + //- Calculate the displacements to create the new points + void newPoints(); + + //- Extract patch names and sizes. + void extractPatches + ( + wordList& patchNames, + labelList& patchSizes, + EdgeMap<label>& mapEdgesRegion, + EdgeMap<label>& indirectPatchEdge + ) const; + + + // Write + + //- Write internal points to .obj file + void writePoints(const fileName& fName, bool internalOnly) const; + + //- Write triangles as .obj file + void writeTriangles(const fileName& fName, bool internalOnly) const; + + //- Write dual faces as .obj file + void writeFaces(const fileName& fName, bool internalOnly) const; + + //- Calculates dual points (circumcentres of tets) and faces + // (point-cell walk of tets). + // Returns: + // - dualPoints (in triangle ordering) + // - dualFaces (compacted) + void calcDual + ( + point2DField& dualPoints, + faceList& dualFaces, + wordList& patchNames, + labelList& patchSizes, + EdgeMap<label>& mapEdgesRegion, + EdgeMap<label>& indirectPatchEdge + ) const; + + //- Write patch + void writePatch(const fileName& fName) const; + + void write() const; +}; + + +inline bool boundaryTriangle(const CV2D::Face_handle fc); +inline bool outsideTriangle(const CV2D::Face_handle fc); + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace Foam + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#include "CV2DI.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#endif + +// ************************************************************************* // diff --git a/applications/utilities/mesh/generation/cv2DMesh/CV2DI.H b/applications/utilities/mesh/generation/cv2DMesh/CV2DI.H new file mode 100644 index 0000000000000000000000000000000000000000..42f4757df12822197abe8ebcd2c5c8bc3f247208 --- /dev/null +++ b/applications/utilities/mesh/generation/cv2DMesh/CV2DI.H @@ -0,0 +1,227 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2013 OpenFOAM Foundation + \\/ M anipulation | +------------------------------------------------------------------------------- +License + This file is part of OpenFOAM. + + OpenFOAM is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + OpenFOAM is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>. + +\*---------------------------------------------------------------------------*/ + +// * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * // + +inline Foam::label Foam::CV2D::insertPoint +( + const point2D& p, + const label type +) +{ + uint nVert = number_of_vertices(); + + return insertPoint(toPoint(p), nVert, type); +} + + +inline Foam::label Foam::CV2D::insertPoint +( + const point2D& p, + const label index, + const label type +) +{ + return insertPoint(toPoint(p), index, type); +} + + +inline Foam::label Foam::CV2D::insertPoint +( + const Point& p, + const label index, + const label type +) +{ + uint nVert = number_of_vertices(); + + Vertex_handle vh = insert(p); + + if (nVert == number_of_vertices()) + { + WarningIn("Foam::CV2D::insertPoint") + << "Failed to insert point " << toPoint2D(p) << endl; + } + else + { + vh->index() = index; + vh->type() = type; + } + + return vh->index(); +} + + +inline bool Foam::CV2D::insertMirrorPoint +( + const point2D& nearSurfPt, + const point2D& surfPt +) +{ + point2D mirrorPoint(2*surfPt - nearSurfPt); + + if (qSurf_.outside(toPoint3D(mirrorPoint))) + { + insertPoint(mirrorPoint, Vb::MIRROR_POINT); + return true; + } + else + { + return false; + } +} + + +inline void Foam::CV2D::insertPointPair +( + const scalar ppDist, + const point2D& surfPt, + const vector2D& n +) +{ + vector2D ppDistn = ppDist*n; + + label master = insertPoint + ( + surfPt - ppDistn, + number_of_vertices() + 1 + ); + + insertPoint(surfPt + ppDistn, master); +} + + +// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // + +inline const Foam::cv2DControls& Foam::CV2D::meshControls() const +{ + return controls_; +} + + +inline const Foam::point2D& Foam::CV2D::toPoint2D(const point& p) const +{ + return reinterpret_cast<const point2D&>(p); +} + + +inline const Foam::point2DField Foam::CV2D::toPoint2D(const pointField& p) const +{ + point2DField temp(p.size()); + forAll(temp, pointI) + { + temp[pointI] = point2D(p[pointI].x(), p[pointI].y()); + } + return temp; +} + + +inline Foam::point Foam::CV2D::toPoint3D(const point2D& p) const +{ + return point(p.x(), p.y(), z_); +} + + +#ifdef CGAL_INEXACT + +inline Foam::CV2D::point2DFromPoint Foam::CV2D::toPoint2D(const Point& P) const +{ + return reinterpret_cast<point2DFromPoint>(P); +} + + +inline Foam::CV2D::PointFromPoint2D Foam::CV2D::toPoint(const point2D& p) const +{ + return reinterpret_cast<PointFromPoint2D>(p); +} + +#else + +inline Foam::CV2D::point2DFromPoint Foam::CV2D::toPoint2D(const Point& P) const +{ + return point2D(CGAL::to_double(P.x()), CGAL::to_double(P.y())); +} + + +inline Foam::CV2D::PointFromPoint2D Foam::CV2D::toPoint(const point2D& p) const +{ + return Point(p.x(), p.y()); +} + +#endif + + +inline Foam::point Foam::CV2D::toPoint3D(const Point& P) const +{ + return point(CGAL::to_double(P.x()), CGAL::to_double(P.y()), z_); +} + + +inline void Foam::CV2D::movePoint(const Vertex_handle& vh, const Point& P) +{ + int i = vh->index(); + int t = vh->type(); + + remove(vh); + + Vertex_handle newVh = insert(P); + + newVh->index() = i; + newVh->type() = t; + + // label i = vh->index(); + // move(vh, P); + // vh->index() = i; + + //vh->set_point(P); + //fast_restore_Delaunay(vh); +} + + +// * * * * * * * * * * * * * * * Friend Functions * * * * * * * * * * * * * // + +inline bool Foam::boundaryTriangle(const CV2D::Face_handle fc) +{ + return boundaryTriangle + ( + *fc->vertex(0), + *fc->vertex(1), + *fc->vertex(2) + ); +} + + +inline bool Foam::outsideTriangle(const CV2D::Face_handle fc) +{ + return outsideTriangle + ( + *fc->vertex(0), + *fc->vertex(1), + *fc->vertex(2) + ); +} + + +// ************************************************************************* // diff --git a/applications/utilities/mesh/generation/cv2DMesh/CV2DIO.C b/applications/utilities/mesh/generation/cv2DMesh/CV2DIO.C new file mode 100644 index 0000000000000000000000000000000000000000..0223c28ebec89849b1e74133e6ddda48ffab4a08 --- /dev/null +++ b/applications/utilities/mesh/generation/cv2DMesh/CV2DIO.C @@ -0,0 +1,386 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2013 OpenFOAM Foundation + \\/ M anipulation | +------------------------------------------------------------------------------- +License + This file is part of OpenFOAM. + + OpenFOAM is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + OpenFOAM is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>. + +\*---------------------------------------------------------------------------*/ + +#include "CV2D.H" +#include "OFstream.H" + +// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // + +void Foam::CV2D::writePoints(const fileName& fName, bool internalOnly) const +{ + Info<< "Writing points to " << fName << nl << endl; + OFstream str(fName); + + for + ( + Triangulation::Finite_vertices_iterator vit = finite_vertices_begin(); + vit != finite_vertices_end(); + ++vit + ) + { + if (!internalOnly || vit->internalOrBoundaryPoint()) + { + meshTools::writeOBJ(str, toPoint3D(vit->point())); + } + } +} + + +void Foam::CV2D::writeTriangles(const fileName& fName, bool internalOnly) const +{ + Info<< "Writing triangles to " << fName << nl << endl; + OFstream str(fName); + + labelList vertexMap(number_of_vertices(), -2); + label verti = 0; + + for + ( + Triangulation::Finite_vertices_iterator vit = finite_vertices_begin(); + vit != finite_vertices_end(); + ++vit + ) + { + if (!internalOnly || !vit->farPoint()) + { + vertexMap[vit->index()] = verti++; + meshTools::writeOBJ(str, toPoint3D(vit->point())); + } + } + + for + ( + Triangulation::Finite_faces_iterator fit = finite_faces_begin(); + fit != finite_faces_end(); + ++fit + ) + { + if + ( + !internalOnly + || ( + fit->vertex(0)->internalOrBoundaryPoint() + || fit->vertex(1)->internalOrBoundaryPoint() + || fit->vertex(2)->internalOrBoundaryPoint() + ) + ) + { + str << "f"; + for (label i = 0; i < 3; ++i) + { + str << " " << vertexMap[fit->vertex(i)->index()] + 1; + } + str << nl; + } + } +} + + +void Foam::CV2D::writeFaces(const fileName& fName, bool internalOnly) const +{ + Info<< "Writing dual faces to " << fName << nl << endl; + OFstream str(fName); + + label dualVerti = 0; + + for + ( + Triangulation::Finite_faces_iterator fit = finite_faces_begin(); + fit != finite_faces_end(); + ++fit + ) + { + if + ( + !internalOnly + || ( + fit->vertex(0)->internalOrBoundaryPoint() + || fit->vertex(1)->internalOrBoundaryPoint() + || fit->vertex(2)->internalOrBoundaryPoint() + ) + ) + { + fit->faceIndex() = dualVerti++; + meshTools::writeOBJ(str, toPoint3D(circumcenter(fit))); + } + else + { + fit->faceIndex() = -1; + } + } + + for + ( + Triangulation::Finite_vertices_iterator vit = finite_vertices_begin(); + vit != finite_vertices_end(); + ++vit + ) + { + if (!internalOnly || vit->internalOrBoundaryPoint()) + { + Face_circulator fcStart = incident_faces(vit); + Face_circulator fc = fcStart; + + str<< 'f'; + + do + { + if (!is_infinite(fc)) + { + if (fc->faceIndex() < 0) + { + FatalErrorIn + ( + "Foam::CV2D::writeFaces" + "(const fileName& fName, bool internalOnly)" + )<< "Dual face uses vertex defined by a triangle" + " defined by an external point" + << exit(FatalError); + } + + str<< ' ' << fc->faceIndex() + 1; + } + } while (++fc != fcStart); + + str<< nl; + } + } +} + + +void Foam::CV2D::extractPatches +( + wordList& patchNames, + labelList& patchSizes, + EdgeMap<label>& mapEdgesRegion, + EdgeMap<label>& indirectPatchEdge +) const +{ + label nPatches = qSurf_.patchNames().size() + 1; + label defaultPatchIndex = qSurf_.patchNames().size(); + + patchNames.setSize(nPatches); + patchSizes.setSize(nPatches, 0); + mapEdgesRegion.clear(); + + const wordList& existingPatches = qSurf_.patchNames(); + + forAll(existingPatches, sP) + { + patchNames[sP] = existingPatches[sP]; + } + + patchNames[defaultPatchIndex] = "CV2D_default_patch"; + + for + ( + Triangulation::Finite_edges_iterator eit = finite_edges_begin(); + eit != finite_edges_end(); + ++eit + ) + { + Face_handle fOwner = eit->first; + Face_handle fNeighbor = fOwner->neighbor(eit->second); + + Vertex_handle vA = fOwner->vertex(cw(eit->second)); + Vertex_handle vB = fOwner->vertex(ccw(eit->second)); + + if + ( + (vA->internalOrBoundaryPoint() && !vB->internalOrBoundaryPoint()) + || (vB->internalOrBoundaryPoint() && !vA->internalOrBoundaryPoint()) + ) + { + point ptA = toPoint3D(vA->point()); + point ptB = toPoint3D(vB->point()); + + label patchIndex = qSurf_.findPatch(ptA, ptB); + + if (patchIndex == -1) + { + patchIndex = defaultPatchIndex; + + WarningIn("Foam::CV2D::extractPatches") + << "Dual face found that is not on a surface " + << "patch. Adding to CV2D_default_patch." + << endl; + } + + edge e(fOwner->faceIndex(), fNeighbor->faceIndex()); + patchSizes[patchIndex]++; + mapEdgesRegion.insert(e, patchIndex); + + if (!pointPair(*vA, *vB)) + { + indirectPatchEdge.insert(e, 1); + } + } + } +} + + +void Foam::CV2D::calcDual +( + point2DField& dualPoints, + faceList& dualFaces, + wordList& patchNames, + labelList& patchSizes, + EdgeMap<label>& mapEdgesRegion, + EdgeMap<label>& indirectPatchEdge +) const +{ + // Dual points stored in triangle order. + dualPoints.setSize(number_of_faces()); + label dualVerti = 0; + + for + ( + Triangulation::Finite_faces_iterator fit = finite_faces_begin(); + fit != finite_faces_end(); + ++fit + ) + { + if + ( + fit->vertex(0)->internalOrBoundaryPoint() + || fit->vertex(1)->internalOrBoundaryPoint() + || fit->vertex(2)->internalOrBoundaryPoint() + ) + { + fit->faceIndex() = dualVerti; + + dualPoints[dualVerti++] = toPoint2D(circumcenter(fit)); + } + else + { + fit->faceIndex() = -1; + } + } + + dualPoints.setSize(dualVerti); + + extractPatches(patchNames, patchSizes, mapEdgesRegion, indirectPatchEdge); + + forAll(patchNames, patchI) + { + Info<< "Patch " << patchNames[patchI] + << " has size " << patchSizes[patchI] << endl; + } + + // Create dual faces + // ~~~~~~~~~~~~~~~~~ + + dualFaces.setSize(number_of_vertices()); + label dualFacei = 0; + labelList faceVerts(maxNvert); + + for + ( + Triangulation::Finite_vertices_iterator vit = finite_vertices_begin(); + vit != finite_vertices_end(); + ++vit + ) + { + if (vit->internalOrBoundaryPoint()) + { + Face_circulator fcStart = incident_faces(vit); + Face_circulator fc = fcStart; + label verti = 0; + + do + { + if (!is_infinite(fc)) + { + if (fc->faceIndex() < 0) + { + FatalErrorIn + ( + "Foam::CV2D::calcDual" + "(point2DField& dualPoints, faceList& dualFaces)" + )<< "Dual face uses vertex defined by a triangle" + " defined by an external point" + << exit(FatalError); + } + + // Look up the index of the triangle + faceVerts[verti++] = fc->faceIndex(); + } + } while (++fc != fcStart); + + if (faceVerts.size() > 2) + { + dualFaces[dualFacei++] = + face(labelList::subList(faceVerts, verti)); + } + else + { + Info<< "From triangle point:" << vit->index() + << " coord:" << toPoint2D(vit->point()) + << " generated illegal dualFace:" << faceVerts + << endl; + } + } + } + + dualFaces.setSize(dualFacei); +} + + +void Foam::CV2D::writePatch(const fileName& fName) const +{ + point2DField dual2DPoints; + faceList dualFaces; + wordList patchNames; + labelList patchSizes; + EdgeMap<label> mapEdgesRegion; + EdgeMap<label> indirectPatchEdge; + + calcDual + ( + dual2DPoints, + dualFaces, + patchNames, + patchSizes, + mapEdgesRegion, + indirectPatchEdge + ); + + pointField dualPoints(dual2DPoints.size()); + forAll(dualPoints, ip) + { + dualPoints[ip] = toPoint3D(dual2DPoints[ip]); + } + + // Dump as primitive patch to be read by extrudeMesh. + OFstream str(fName); + + Info<< "Writing patch to be used with extrudeMesh to file " << fName + << endl; + + str << dualPoints << nl << dualFaces << nl; +} + + +// ************************************************************************* // diff --git a/applications/utilities/mesh/generation/cv2DMesh/Make/files b/applications/utilities/mesh/generation/cv2DMesh/Make/files new file mode 100755 index 0000000000000000000000000000000000000000..f7f70afa2af7b1fbc34d268dc45efb10c36fb1f7 --- /dev/null +++ b/applications/utilities/mesh/generation/cv2DMesh/Make/files @@ -0,0 +1,12 @@ +#include CGAL_FILES + +CV2D.C +insertFeaturePoints.C +insertSurfaceNearestPointPairs.C +insertSurfaceNearPointPairs.C +insertBoundaryConformPointPairs.C +CV2DIO.C +shortEdgeFilter2D.C +cv2DMesh.C + +EXE = $(FOAM_APPBIN)/cv2DMesh diff --git a/applications/utilities/mesh/generation/cv2DMesh/Make/options b/applications/utilities/mesh/generation/cv2DMesh/Make/options new file mode 100755 index 0000000000000000000000000000000000000000..37c8ed4aeaebf4a61bb22f5c42f13d90f5f87629 --- /dev/null +++ b/applications/utilities/mesh/generation/cv2DMesh/Make/options @@ -0,0 +1,43 @@ +EXE_DEBUG = -DFULLDEBUG -g -O0 +EXE_FROUNDING_MATH = -frounding-math +EXE_NDEBUG = -DNDEBUG + +include $(GENERAL_RULES)/CGAL +FFLAGS = -DCGAL_FILES='"${CGAL_ARCH_PATH}/share/files"' + +EXE_INC = \ + ${EXE_FROUNDING_MATH} \ + ${EXE_NDEBUG} \ + ${CGAL_INC} \ + -I$(FOAM_APP)/utilities/mesh/generation/extrude2DMesh/extrude2DMesh/lnInclude \ + -I../cvMesh/vectorTools \ + -IconformalVoronoi2DMesh/lnInclude \ + -I$(FOAM_APP)/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/lnInclude \ + -I$(LIB_SRC)/parallel/decompose/decompositionMethods/lnInclude \ + -I$(LIB_SRC)/finiteVolume/lnInclude \ + -I$(LIB_SRC)/meshTools/lnInclude \ + -I$(LIB_SRC)/surfMesh/lnInclude \ + -I$(LIB_SRC)/edgeMesh/lnInclude \ + -I$(LIB_SRC)/dynamicMesh/lnInclude \ + -I$(LIB_SRC)/mesh/extrudeModel/lnInclude \ + -I$(LIB_SRC)/sampling/lnInclude \ + -I$(LIB_SRC)/triSurface/lnInclude \ + -I$(LIB_SRC)/fileFormats/lnInclude \ + +EXE_LIBS = \ + $(CGAL_LIBS) \ + -lboost_thread \ + -lmpfr \ + -lextrude2DMesh \ + -lextrudeModel \ + -lcv2DMesh \ + -lconformalVoronoiMesh \ + -lmeshTools \ + -lsurfMesh \ + -ledgeMesh \ + -ltriSurface \ + -ldynamicMesh \ + -ldecompositionMethods \ + -L$(FOAM_LIBBIN)/dummy -lptscotchDecomp \ + -lsampling \ + -lfileFormats diff --git a/applications/utilities/mesh/generation/cv2DMesh/conformalVoronoi2DMesh/Make/files b/applications/utilities/mesh/generation/cv2DMesh/conformalVoronoi2DMesh/Make/files new file mode 100755 index 0000000000000000000000000000000000000000..e35fec7b7139b6fe33ab9dfbbd570dc566db3150 --- /dev/null +++ b/applications/utilities/mesh/generation/cv2DMesh/conformalVoronoi2DMesh/Make/files @@ -0,0 +1,3 @@ +cv2DControls/cv2DControls.C + +LIB = $(FOAM_LIBBIN)/libcv2DMesh \ No newline at end of file diff --git a/applications/utilities/mesh/generation/cv2DMesh/conformalVoronoi2DMesh/Make/options b/applications/utilities/mesh/generation/cv2DMesh/conformalVoronoi2DMesh/Make/options new file mode 100755 index 0000000000000000000000000000000000000000..79be6f3a7dd8fa81ba203d5ab8572c446c43a6c7 --- /dev/null +++ b/applications/utilities/mesh/generation/cv2DMesh/conformalVoronoi2DMesh/Make/options @@ -0,0 +1,3 @@ +EXE_INC = + +LIB_LIBS = diff --git a/applications/utilities/mesh/generation/cv2DMesh/conformalVoronoi2DMesh/cv2DControls/cv2DControls.C b/applications/utilities/mesh/generation/cv2DMesh/conformalVoronoi2DMesh/cv2DControls/cv2DControls.C new file mode 100644 index 0000000000000000000000000000000000000000..1ec4442e10f7ecf8bc1a704f880824ad459df496 --- /dev/null +++ b/applications/utilities/mesh/generation/cv2DMesh/conformalVoronoi2DMesh/cv2DControls/cv2DControls.C @@ -0,0 +1,154 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2013 OpenFOAM Foundation + \\/ M anipulation | +------------------------------------------------------------------------------- +License + This file is part of OpenFOAM. + + OpenFOAM is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + OpenFOAM is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>. + +\*----------------------------------------------------------------------------*/ + +#include "cv2DControls.H" + +// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // + + +Foam::cv2DControls::cv2DControls +( + const dictionary& controlDict, + const boundBox& bb +) +: + dict_(controlDict), + + motionControl_(controlDict.subDict("motionControl")), + conformationControl_(controlDict.subDict("surfaceConformation")), + + minCellSize_(readScalar(motionControl_.lookup("minCellSize"))), + minCellSize2_(Foam::sqr(minCellSize_)), + + maxQuadAngle_(readScalar(conformationControl_.lookup("maxQuadAngle"))), + + nearWallAlignedDist_ + ( + readScalar(motionControl_.lookup("nearWallAlignedDist"))*minCellSize_ + ), + nearWallAlignedDist2_(Foam::sqr(nearWallAlignedDist_)), + + insertSurfaceNearestPointPairs_ + ( + conformationControl_.lookup("insertSurfaceNearestPointPairs") + ), + mirrorPoints_(conformationControl_.lookup("mirrorPoints")), + insertSurfaceNearPointPairs_ + ( + conformationControl_.lookup("insertSurfaceNearPointPairs") + ), + + objOutput_(motionControl_.lookupOrDefault<Switch>("objOutput", false)), + + meshedSurfaceOutput_ + ( + motionControl_.lookupOrDefault<Switch>("meshedSurfaceOutput", false) + ), + + randomiseInitialGrid_(conformationControl_.lookup("randomiseInitialGrid")), + randomPerturbation_ + ( + readScalar(conformationControl_.lookup("randomPerturbation")) + ), + + maxBoundaryConformingIter_ + ( + readLabel(conformationControl_.lookup("maxBoundaryConformingIter")) + ), + + span_ + ( + max(mag(bb.max().x()), mag(bb.min().x())) + + max(mag(bb.max().y()), mag(bb.min().y())) + ), + span2_(Foam::sqr(span_)), + + minEdgeLen_ + ( + readScalar(conformationControl_.lookup("minEdgeLenCoeff")) + *minCellSize_ + ), + minEdgeLen2_(Foam::sqr(minEdgeLen_)), + + maxNotchLen_ + ( + readScalar(conformationControl_.lookup("maxNotchLenCoeff")) + *minCellSize_ + ), + maxNotchLen2_(Foam::sqr(maxNotchLen_)), + + minNearPointDist_ + ( + readScalar(conformationControl_.lookup("minNearPointDistCoeff")) + *minCellSize_ + ), + minNearPointDist2_(Foam::sqr(minNearPointDist_)), + + ppDist_ + ( + readScalar(conformationControl_.lookup("pointPairDistanceCoeff")) + *minCellSize_ + ) +{} + + +// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * // + +Foam::cv2DControls::~cv2DControls() +{} + + +// * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * * // + +void Foam::cv2DControls::write(Ostream& os) const +{ + os.indentLevel() = 1; + os.precision(2); + os.flags(ios_base::scientific); + + os << nl << "Outputting CV2D Mesher controls:" << nl + << token::BEGIN_BLOCK << nl + << indent << "minCellSize2_ : " << minCellSize2_ << nl + << indent << "span_ / span2_ : " << span_ << " / " << span2_ << nl + << indent << "maxNotchLen2_ : " << maxNotchLen2_ << nl + << indent << "minNearPointDist2_ : " << minNearPointDist2_ << nl + << indent << "nearWallAlignedDist2_ : " << nearWallAlignedDist2_ << nl + << indent << "ppDist_ : " << ppDist_ << nl + << indent << "minEdgeLen2_ : " << minEdgeLen2_ << nl + << token::END_BLOCK << endl; +} + + +// * * * * * * * * * * * * * * IOStream operators * * * * * * * * * * * * * // + +Foam::Ostream& Foam::operator<<(Ostream& os, const cv2DControls& s) +{ + s.write(os); + return os; +} + + + +// ************************************************************************* // diff --git a/applications/utilities/mesh/generation/cv2DMesh/conformalVoronoi2DMesh/cv2DControls/cv2DControls.H b/applications/utilities/mesh/generation/cv2DMesh/conformalVoronoi2DMesh/cv2DControls/cv2DControls.H new file mode 100644 index 0000000000000000000000000000000000000000..fb357dd62dc28a30a5c98a0d82b93ed00d74c30e --- /dev/null +++ b/applications/utilities/mesh/generation/cv2DMesh/conformalVoronoi2DMesh/cv2DControls/cv2DControls.H @@ -0,0 +1,260 @@ +/*--------------------------------*- C++ -*----------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2013 OpenFOAM Foundation + \\/ M anipulation | +------------------------------------------------------------------------------- +License + This file is part of OpenFOAM. + + OpenFOAM is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + OpenFOAM is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>. + +Class + Foam::cv2DControls + +Description + Controls for the 2D CV mesh generator. + +SourceFiles + cv2DControls.C + cv2DControlsI.H + +\*---------------------------------------------------------------------------*/ + +#ifndef cv2DControls_H +#define cv2DControls_H + +#include "Switch.H" +#include "dictionary.H" +#include "boundBox.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ + +/*---------------------------------------------------------------------------*\ + Class cv2DControls Declaration +\*---------------------------------------------------------------------------*/ + +class cv2DControls +{ + // Private data + + //- Description of data_ + const dictionary& dict_; + + const dictionary& motionControl_; + + const dictionary& conformationControl_; + + + // Private Member Functions + + //- Disallow default bitwise copy construct + cv2DControls(const cv2DControls&); + + //- Disallow default bitwise assignment + void operator=(const cv2DControls&); + + +public: + + // Controls + + //- Minimum cell size below which protusions through the surface are + // not split + scalar minCellSize_; + + //- Square of minCellSize + scalar minCellSize2_; + + //- Maximum quadrant angle allowed at a concave corner before + // additional "mitering" lines are added + scalar maxQuadAngle_; + + //- Near-wall region where cells are aligned with the wall + scalar nearWallAlignedDist_; + + //- Square of nearWallAlignedDist + scalar nearWallAlignedDist2_; + + //- Insert near-boundary point mirror or point-pairs + Switch insertSurfaceNearestPointPairs_; + + //- Mirror near-boundary points rather than insert point-pairs + Switch mirrorPoints_; + + //- Insert point-pairs vor dual-cell vertices very near the surface + Switch insertSurfaceNearPointPairs_; + + Switch objOutput_; + + Switch meshedSurfaceOutput_; + + Switch randomiseInitialGrid_; + + scalar randomPerturbation_; + + label maxBoundaryConformingIter_; + + + // Tolerances + + //- Maximum cartesian span of the geometry + scalar span_; + + //- Square of span + scalar span2_; + + //- Minumum edge-length of the cell size below which protusions + // through the surface are not split + scalar minEdgeLen_; + + //- Square of minEdgeLen + scalar minEdgeLen2_; + + //- Maximum notch size below which protusions into the surface are + // not filled + scalar maxNotchLen_; + + //- Square of maxNotchLen + scalar maxNotchLen2_; + + //- The minimum distance alowed between a dual-cell vertex + // and the surface before a point-pair is introduced + scalar minNearPointDist_; + + //- Square of minNearPoint + scalar minNearPointDist2_; + + //- Distance between boundary conforming point-pairs + scalar ppDist_; + + //- Square of ppDist + scalar ppDist2_; + + + // Constructors + + cv2DControls + ( + const dictionary& controlDict, + const boundBox& bb + ); + + + //- Destructor + ~cv2DControls(); + + + // Member Functions + + // Access + + //- Return the minimum cell size + inline scalar minCellSize() const; + + //- Return the square of the minimum cell size + inline scalar minCellSize2() const; + + //- Return the maximum quadrant angle + inline scalar maxQuadAngle() const; + + //- Return number of layers to align with the nearest wall + inline scalar nearWallAlignedDist() const; + + //- Return square of nearWallAlignedDist + inline scalar nearWallAlignedDist2() const; + + //- Return insertSurfaceNearestPointPairs Switch + inline Switch insertSurfaceNearestPointPairs() const; + + //- Return mirrorPoints Switch + inline Switch mirrorPoints() const; + + //- Return insertSurfaceNearPointPairs Switch + inline Switch insertSurfaceNearPointPairs() const; + + //- Return the objOutput Switch + inline Switch objOutput() const; + + //- Return the meshedSurfaceOutput Switch + inline Switch meshedSurfaceOutput() const; + + //- Return the randomise initial point layout Switch + inline Switch randomiseInitialGrid() const; + + //- Return the random perturbation factor + inline scalar randomPerturbation() const; + + //- Return the maximum number of boundary conformation iterations + inline label maxBoundaryConformingIter() const; + + //- Return the span + inline scalar span() const; + + //- Return the span squared + inline scalar span2() const; + + //- Return the minEdgeLen + inline scalar minEdgeLen() const; + + //- Return the minEdgeLen squared + inline scalar minEdgeLen2() const; + + //- Return the maxNotchLen + inline scalar maxNotchLen() const; + + //- Return the maxNotchLen squared + inline scalar maxNotchLen2() const; + + //- Return the minNearPointDist + inline scalar minNearPointDist() const; + + //- Return the minNearPointDist squared + inline scalar minNearPointDist2() const; + + //- Return the ppDist + inline scalar ppDist() const; + + + // Write + + //- Write controls to output stream. + void write(Ostream& os) const; + + //- Ostream Operator + friend Ostream& operator<< + ( + Ostream& os, + const cv2DControls& s + ); +}; + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace Foam + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#include "cv2DControlsI.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#endif + +// ************************************************************************* // diff --git a/applications/utilities/mesh/generation/cv2DMesh/conformalVoronoi2DMesh/cv2DControls/cv2DControlsI.H b/applications/utilities/mesh/generation/cv2DMesh/conformalVoronoi2DMesh/cv2DControls/cv2DControlsI.H new file mode 100644 index 0000000000000000000000000000000000000000..dd745a7875f14903ccfb4a685517eb565b979191 --- /dev/null +++ b/applications/utilities/mesh/generation/cv2DMesh/conformalVoronoi2DMesh/cv2DControls/cv2DControlsI.H @@ -0,0 +1,158 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2013 OpenFOAM Foundation + \\/ M anipulation | +------------------------------------------------------------------------------- +License + This file is part of OpenFOAM. + + OpenFOAM is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + OpenFOAM is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>. + +\*---------------------------------------------------------------------------*/ + +inline Foam::scalar Foam::cv2DControls::minCellSize() const +{ + return minCellSize_; +} + + +inline Foam::scalar Foam::cv2DControls::minCellSize2() const +{ + return minCellSize2_; +} + + +inline Foam::scalar Foam::cv2DControls::maxQuadAngle() const +{ + return maxQuadAngle_; +} + + +inline Foam::scalar Foam::cv2DControls::nearWallAlignedDist() const +{ + return nearWallAlignedDist_; +} + + +inline Foam::scalar Foam::cv2DControls::nearWallAlignedDist2() const +{ + return nearWallAlignedDist2_; +} + + +inline Foam::Switch Foam::cv2DControls::insertSurfaceNearestPointPairs() const +{ + return insertSurfaceNearestPointPairs_; +} + + +inline Foam::Switch Foam::cv2DControls::mirrorPoints() const +{ + return mirrorPoints_; +} + + +inline Foam::Switch Foam::cv2DControls::insertSurfaceNearPointPairs() const +{ + return insertSurfaceNearPointPairs_; +} + + +inline Foam::Switch Foam::cv2DControls::objOutput() const +{ + return objOutput_; +} + + +inline Foam::Switch Foam::cv2DControls::meshedSurfaceOutput() const +{ + return meshedSurfaceOutput_; +} + + +inline Foam::Switch Foam::cv2DControls::randomiseInitialGrid() const +{ + return randomiseInitialGrid_; +} + + +inline Foam::scalar Foam::cv2DControls::randomPerturbation() const +{ + return randomPerturbation_; +} + + +inline Foam::label Foam::cv2DControls::maxBoundaryConformingIter() const +{ + return maxBoundaryConformingIter_; +} + + +inline Foam::scalar Foam::cv2DControls::span() const +{ + return span_; +} + + +inline Foam::scalar Foam::cv2DControls::span2() const +{ + return span2_; +} + + +inline Foam::scalar Foam::cv2DControls::minEdgeLen() const +{ + return minEdgeLen_; +} + + +inline Foam::scalar Foam::cv2DControls::minEdgeLen2() const +{ + return minEdgeLen2_; +} + + +inline Foam::scalar Foam::cv2DControls::maxNotchLen() const +{ + return maxNotchLen_; +} + + +inline Foam::scalar Foam::cv2DControls::maxNotchLen2() const +{ + return maxNotchLen2_; +} + + +inline Foam::scalar Foam::cv2DControls::minNearPointDist() const +{ + return minNearPointDist_; +} + + +inline Foam::scalar Foam::cv2DControls::minNearPointDist2() const +{ + return minNearPointDist2_; +} + + +inline Foam::scalar Foam::cv2DControls::ppDist() const +{ + return ppDist_; +} + + +// ************************************************************************* // diff --git a/applications/utilities/mesh/generation/cv2DMesh/cv2DMesh.C b/applications/utilities/mesh/generation/cv2DMesh/cv2DMesh.C new file mode 100644 index 0000000000000000000000000000000000000000..e44a249f2825043587f387d8410171c9720a065d --- /dev/null +++ b/applications/utilities/mesh/generation/cv2DMesh/cv2DMesh.C @@ -0,0 +1,230 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2013 OpenFOAM Foundation + \\/ M anipulation | +------------------------------------------------------------------------------- +License + This file is part of OpenFOAM. + + OpenFOAM is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + OpenFOAM is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>. + +Application + cv2DMesh + +Description + Conformal-Voronoi 2D extruding automatic mesher with grid or read + initial points and point position relaxation with optional + "squarification". + +\*---------------------------------------------------------------------------*/ + +#include "CV2D.H" +#include "argList.H" + +#include "MeshedSurfaces.H" +#include "shortEdgeFilter2D.H" +#include "extrude2DMesh.H" +#include "polyMesh.H" +#include "patchToPoly2DMesh.H" +#include "extrudeModel.H" +#include "polyTopoChange.H" +#include "edgeCollapser.H" +#include "globalIndex.H" + +using namespace Foam; + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +int main(int argc, char *argv[]) +{ + argList::noParallel(); + argList::validArgs.clear(); + argList::validOptions.insert + ( + "pointsFile", + "filename" + ); + + #include "addOverwriteOption.H" + + #include "setRootCase.H" + #include "createTime.H" + + // Read control dictionary + // ~~~~~~~~~~~~~~~~~~~~~~~ + IOdictionary controlDict + ( + IOobject + ( + args.executable() + "Dict", + runTime.system(), + runTime, + IOobject::MUST_READ_IF_MODIFIED, + IOobject::NO_WRITE + ) + ); + + const dictionary& shortEdgeFilterDict + ( + controlDict.subDict("shortEdgeFilter") + ); + const dictionary& extrusionDict(controlDict.subDict("extrusion")); + + Switch extrude(extrusionDict.lookup("extrude")); + const bool overwrite = args.optionFound("overwrite"); + + // Read and triangulation + // ~~~~~~~~~~~~~~~~~~~~~~ + CV2D mesh(runTime, controlDict); + + if (args.options().found("pointsFile")) + { + fileName pointFileName(IStringStream(args.options()["pointsFile"])()); + mesh.insertPoints(pointFileName); + } + else + { + mesh.insertGrid(); + } + + mesh.insertSurfacePointPairs(); + mesh.boundaryConform(); + + while (runTime.loop()) + { + Info<< nl << "Time = " << runTime.timeName() << endl; + + mesh.newPoints(); + } + + mesh.write(); + + Info<< "Finished Delaunay in = " << runTime.cpuTimeIncrement() << " s." + << endl; + + Info<< "Begin filtering short edges:" << endl; + shortEdgeFilter2D sef(mesh, shortEdgeFilterDict); + + sef.filter(); + + Info<< "Meshed surface after edge filtering :" << endl; + sef.fMesh().writeStats(Info); + + if (mesh.meshControls().meshedSurfaceOutput()) + { + Info<< "Write .obj file of the 2D mesh: MeshedSurface.obj" << endl; + sef.fMesh().write("MeshedSurface.obj"); + } + + Info<< "Finished filtering in = " << runTime.cpuTimeIncrement() << " s." + << endl; + + Info<< "Begin constructing a polyMesh:" << endl; + + patchToPoly2DMesh poly2DMesh + ( + sef.fMesh(), + sef.patchNames(), + sef.patchSizes(), + sef.mapEdgesRegion() + ); + + poly2DMesh.createMesh(); + + polyMesh pMesh + ( + IOobject + ( + polyMesh::defaultRegion, + runTime.constant(), + runTime, + IOobject::NO_READ, + IOobject::NO_WRITE, + false + ), + xferMove(poly2DMesh.points()), + xferMove(poly2DMesh.faces()), + xferMove(poly2DMesh.owner()), + xferMove(poly2DMesh.neighbour()) + ); + + Info<< "Constructing patches." << endl; + List<polyPatch*> patches(poly2DMesh.patchNames().size()); + label countPatches = 0; + + forAll(patches, patchI) + { + if (poly2DMesh.patchSizes()[patchI] != 0) + { + patches[countPatches] = new polyPatch + ( + poly2DMesh.patchNames()[patchI], + poly2DMesh.patchSizes()[patchI], + poly2DMesh.patchStarts()[patchI], + countPatches, + pMesh.boundaryMesh(), + word::null + ); + + countPatches++; + } + } + patches.setSize(countPatches); + pMesh.addPatches(patches); + + if (extrude) + { + Info<< "Begin extruding the polyMesh:" << endl; + + { + // Point generator + autoPtr<extrudeModel> model(extrudeModel::New(extrusionDict)); + + extrude2DMesh extruder(pMesh, extrusionDict, model()); + + extruder.addFrontBackPatches(); + + polyTopoChange meshMod(pMesh.boundaryMesh().size()); + + extruder.setRefinement(meshMod); + + autoPtr<mapPolyMesh> morphMap = meshMod.changeMesh(pMesh, false); + + pMesh.updateMesh(morphMap); + } + } + + if (!overwrite) + { + runTime++; + } + else + { + pMesh.setInstance("constant"); + } + + pMesh.write(); + + Info<< "Finished extruding in = " + << runTime.cpuTimeIncrement() << " s." << endl; + + Info<< nl << "End\n" << endl; + + return 0; +} + + +// ************************************************************************* // diff --git a/applications/utilities/mesh/generation/cv2DMesh/cv2DMeshDict b/applications/utilities/mesh/generation/cv2DMesh/cv2DMeshDict new file mode 100644 index 0000000000000000000000000000000000000000..0ef6d2a0c4794677e257056a9a23d3b1e59975d2 --- /dev/null +++ b/applications/utilities/mesh/generation/cv2DMesh/cv2DMeshDict @@ -0,0 +1,208 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: dev | +| \\ / A nd | Web: www.OpenFOAM.org | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ + +FoamFile +{ + version 2.0; + format ascii; + + root ""; + case ""; + instance ""; + local ""; + + class dictionary; + object cv2DMeshDict; +} + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + + +geometry +{ + laurence_clean_preciser.stl + { + name laurence_clean_preciser; + type closedTriSurfaceMesh; + //type triSurfaceMesh; + } +// refinementBox +// { +// type searchableBox; +// min (-0.5 0.35 -1000); +// max (-0.5 0.35 1000); +// } +// refinementSphere +// { +// type searchableSphere; +// centre (0.85 0.4 0.0); +// radius 0.01; +// } +} + +surfaceConformation +{ + locationInMesh (-2.8 0.7 0.5); + + pointPairDistanceCoeff 0.005; + + minEdgeLenCoeff 0.005; + + maxNotchLenCoeff 0.003; + + minNearPointDistCoeff 0.0025; + + maxQuadAngle 125; + + // Insert near-boundary point mirror or point-pairs + insertSurfaceNearestPointPairs yes; + + // Mirror near-boundary points rather than insert point-pairs + mirrorPoints no; + + // Insert point-pairs vor dual-cell vertices very near the surface + insertSurfaceNearPointPairs yes; + + // Maximum number of iterations used in boundaryConform. + maxBoundaryConformingIter 5; + + geometryToConformTo + { + laurence_clean_preciser + { + featureMethod extendedFeatureEdgeMesh; + extendedFeatureEdgeMesh "laurence_clean_preciser.extendedFeatureEdgeMesh"; + } + } + + additionalFeatures + { + } + + // Choose if to randomise the initial grid created by insertGrid. + randomiseInitialGrid yes; + + // Perturbation fraction, 1 = cell-size. + randomPerturbation 0.1; + +} + + +motionControl +{ + defaultCellSize 0.05; + + // Assign a priority to all requests for cell sizes, the highest overrules. + defaultPriority 0; + + cellSizeControlGeometry + { + laurence_clean_preciser + { + priority 1; + mode bothSides; + cellSizeFunction linearDistance; + linearDistanceCoeffs + { + distanceCellSize 0.05; + surfaceCellSize 0.01; + distance 0.5; + } + uniformCoeffs + { + cellSize 0.01; + } + } +// refinementBox +// { +// priority 1; +// mode outside; +// cellSizeFunction linearDistance; +// linearDistanceCoeffs +// { +// distanceCellSize 0.04; +// surfaceCellSize 0.005; +// distance 0.2; +// } +// } +// refinementSphere +// { +// priority 1; +// mode outside; +// cellSizeFunction linearDistance; +// linearDistanceCoeffs +// { +// distanceCellSize 0.04; +// surfaceCellSize 0.005; +// distance 0.2; +// } +// } + } + + relaxationModel adaptiveLinear; + + adaptiveLinearCoeffs + { + relaxationStart 0.5; + relaxationEnd 0.0; + } + + objOutput no; + + // Near-wall region where cells are aligned with the wall specified as a number + // of cell layers + nearWallAlignedDist 3; + +} + +shortEdgeFilter +{ + // Factor to multiply the average of a face's edge lengths by. + // If an edge of that face is smaller than that value then delete it. + shortEdgeFilterFactor 0.2; + + // Weighting for the lengths of edges that are attached to the boundaries. + // Used when calculating the length of an edge. Default 2.0. + edgeAttachedToBoundaryFactor 2.0; +} + +extrusion +{ + extrude on; + + extrudeModel linearDirection; + //extrudeModel wedge; + + patchInfo + { + //type empty; + //startFace + } + + patchType empty; + //patchType wedge; + + nLayers 1; + + expansionRatio 1.0; //0.9; + + linearDirectionCoeffs + { + direction (0 0 1); + thickness 0.1; + } + + wedgeCoeffs + { + axisPt (0 0 0); + axis (1 0 0); + angle 10; + } + + thickness 0.1; +} diff --git a/applications/utilities/mesh/generation/cv2DMesh/indexedFace.H b/applications/utilities/mesh/generation/cv2DMesh/indexedFace.H new file mode 100644 index 0000000000000000000000000000000000000000..0c30fcc952cc84f0894e7eb1476f0be0cf113ed3 --- /dev/null +++ b/applications/utilities/mesh/generation/cv2DMesh/indexedFace.H @@ -0,0 +1,135 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2013 OpenFOAM Foundation + \\/ M anipulation | +------------------------------------------------------------------------------- +License + This file is part of OpenFOAM. + + OpenFOAM is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + OpenFOAM is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>. + +Class + indexedFace + +Description + An indexed form of CGAL::Triangulation_face_base_2<K> used to keep + track of the vertices in the triangulation. + +\*---------------------------------------------------------------------------*/ + +#ifndef indexedFace_H +#define indexedFace_H + +#include <CGAL/Triangulation_2.h> +#include "indexedVertex.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace CGAL +{ + +/*---------------------------------------------------------------------------*\ + Class indexedFace Declaration +\*---------------------------------------------------------------------------*/ + +template<class Gt, class Fb=CGAL::Triangulation_face_base_2<Gt> > +class indexedFace +: + public Fb +{ + // Private data + + //- The index for this triangle face + // -1: triangle and changed and associated data needs updating + // >=0: index of triangles, set by external update algorithm + int index_; + + +public: + + enum faceTypes + { + UNCHANGED = 0, + CHANGED = -1, + SAVE_CHANGED = -2 + }; + + typedef typename Fb::Vertex_handle Vertex_handle; + typedef typename Fb::Face_handle Face_handle; + + template < typename TDS2 > + struct Rebind_TDS + { + typedef typename Fb::template Rebind_TDS<TDS2>::Other Fb2; + typedef indexedFace<Gt, Fb2> Other; + }; + + + // Constructors + + inline indexedFace(); + + inline indexedFace + ( + Vertex_handle v0, + Vertex_handle v1, + Vertex_handle v2 + ); + + inline indexedFace + ( + Vertex_handle v0, + Vertex_handle v1, + Vertex_handle v2, + Face_handle n0, + Face_handle n1, + Face_handle n2 + ); + + + // Member Functions + + inline void set_vertex(int i, Vertex_handle v); + + inline void set_vertices(); + + inline void set_vertices + ( + Vertex_handle v0, + Vertex_handle v1, + Vertex_handle v2 + ); + + inline int& faceIndex(); + + inline int faceIndex() const; + +}; + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace CGAL + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#include "indexedFaceI.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#endif + +// ************************************************************************* // diff --git a/applications/utilities/mesh/generation/cv2DMesh/indexedFaceI.H b/applications/utilities/mesh/generation/cv2DMesh/indexedFaceI.H new file mode 100644 index 0000000000000000000000000000000000000000..367cf944333a301593995a00dceb77ac61cac60a --- /dev/null +++ b/applications/utilities/mesh/generation/cv2DMesh/indexedFaceI.H @@ -0,0 +1,110 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2013 OpenFOAM Foundation + \\/ M anipulation | +------------------------------------------------------------------------------- +License + This file is part of OpenFOAM. + + OpenFOAM is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + OpenFOAM is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>. + +\*---------------------------------------------------------------------------*/ + +// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // + +template<class Gt, class Fb> +inline CGAL::indexedFace<Gt, Fb>::indexedFace() +: + Fb(), + index_(CHANGED) +{} + + +template<class Gt, class Fb> +inline CGAL::indexedFace<Gt, Fb>::indexedFace +( + Vertex_handle v0, + Vertex_handle v1, + Vertex_handle v2 +) +: + Fb(v0, v1, v2), + index_(CHANGED) +{} + + +template<class Gt, class Fb> +inline CGAL::indexedFace<Gt, Fb>::indexedFace +( + Vertex_handle v0, + Vertex_handle v1, + Vertex_handle v2, + Face_handle n0, + Face_handle n1, + Face_handle n2 +) +: + Fb(v0, v1, v2, n0, n1, n2), + index_(CHANGED) +{} + + +// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // + +template<class Gt, class Fb> +inline void CGAL::indexedFace<Gt, Fb>::set_vertex(int i, Vertex_handle v) +{ + index_ = CHANGED; + Fb::set_vertex(i, v); +} + + +template<class Gt, class Fb> +inline void CGAL::indexedFace<Gt, Fb>::set_vertices() +{ + index_ = CHANGED; + Fb::set_vertices(); +} + + +template<class Gt, class Fb> +inline void CGAL::indexedFace<Gt, Fb>::set_vertices +( + Vertex_handle v0, + Vertex_handle v1, + Vertex_handle v2 +) +{ + index_ = CHANGED; + Fb::set_vertices(v0, v1, v2); +} + + +template<class Gt, class Fb> +inline int& CGAL::indexedFace<Gt, Fb>::faceIndex() +{ + return index_; +} + + +template<class Gt, class Fb> +inline int CGAL::indexedFace<Gt, Fb>::faceIndex() const +{ + return index_; +} + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // diff --git a/applications/utilities/mesh/generation/cv2DMesh/indexedVertex.H b/applications/utilities/mesh/generation/cv2DMesh/indexedVertex.H new file mode 100644 index 0000000000000000000000000000000000000000..ae58a0bfe5c2610f4a2651442df081e09a53fcab --- /dev/null +++ b/applications/utilities/mesh/generation/cv2DMesh/indexedVertex.H @@ -0,0 +1,210 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2013 OpenFOAM Foundation + \\/ M anipulation | +------------------------------------------------------------------------------- +License + This file is part of OpenFOAM. + + OpenFOAM is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + OpenFOAM is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>. + +Class + indexedVertex + +Description + An indexed form of CGAL::Triangulation_vertex_base_2<K> used to keep + track of the vertices in the triangulation. + +\*---------------------------------------------------------------------------*/ + +#ifndef indexedVertex_H +#define indexedVertex_H + +#include <CGAL/Triangulation_2.h> + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace CGAL +{ + +// Forward declaration of friend functions and operators + +template<class Gt, class Vb> +class indexedVertex; + +template<class Gt, class Vb> +bool pointPair +( + const indexedVertex<Gt, Vb>& v0, + const indexedVertex<Gt, Vb>& v1 +); + +template<class Gt, class Vb> +bool boundaryTriangle +( + const indexedVertex<Gt, Vb>& v0, + const indexedVertex<Gt, Vb>& v1, + const indexedVertex<Gt, Vb>& v2 +); + +template<class Gt, class Vb> +bool outsideTriangle +( + const indexedVertex<Gt, Vb>& v0, + const indexedVertex<Gt, Vb>& v1, + const indexedVertex<Gt, Vb>& v2 +); + +/*---------------------------------------------------------------------------*\ + Class indexedVertex Declaration +\*---------------------------------------------------------------------------*/ + +template<class Gt, class Vb=CGAL::Triangulation_vertex_base_2<Gt> > +class indexedVertex +: + public Vb +{ + // Private data + + //- The index for this triangle vertex + int index_; + + //- Index of pair-point : + // NEAR_BOUNDARY_POINT : internal near boundary point. + // INTERNAL_POINT : internal point. + // FAR_POINT : far-point. + // >= 0 : part of point-pair. Index of other point. + // Lowest numbered is inside one (master). + int type_; + + +public: + + enum pointTypes + { + NEAR_BOUNDARY_POINT = -4, + INTERNAL_POINT = -3, + MIRROR_POINT = -2, + FAR_POINT = -1 + }; + + typedef typename Vb::Vertex_handle Vertex_handle; + typedef typename Vb::Face_handle Face_handle; + typedef typename Vb::Point Point; + + template<typename TDS2> + struct Rebind_TDS + { + typedef typename Vb::template Rebind_TDS<TDS2>::Other Vb2; + typedef indexedVertex<Gt,Vb2> Other; + }; + + + // Constructors + + inline indexedVertex(); + + inline indexedVertex(const Point& p); + + inline indexedVertex(const Point& p, const int index, const int& type); + + inline indexedVertex(const Point& p, Face_handle f); + + inline indexedVertex(Face_handle f); + + + // Member Functions + + inline int& index(); + + inline int index() const; + + inline int& type(); + + inline int type() const; + + //- Is point a far-point + inline bool farPoint() const; + + //- Is point internal, i.e. not on boundary + inline bool internalPoint() const; + + //- Is point internal and near the boundary + inline bool nearBoundary() const; + + //- Set the point to be near the boundary + inline void setNearBoundary(); + + //- Is point a mirror point + inline bool mirrorPoint() const; + + //- Either master or slave of pointPair. + inline bool pairPoint() const; + + //- Master of a pointPair is the lowest numbered one. + inline bool ppMaster() const; + + //- Slave of a pointPair is the highest numbered one. + inline bool ppSlave() const; + + //- Either original internal point or master of pointPair. + inline bool internalOrBoundaryPoint() const; + + //- Is point near the boundary or part of the boundary definition + inline bool nearOrOnBoundary() const; + + + // Friend Functions + + //- Do the two given vertices consitute a boundary point-pair + friend bool pointPair <Gt, Vb> + ( + const indexedVertex<Gt, Vb>& v0, + const indexedVertex<Gt, Vb>& v1 + ); + + //- Do the three given vertices consitute a boundary triangle + friend bool boundaryTriangle <Gt, Vb> + ( + const indexedVertex<Gt, Vb>& v0, + const indexedVertex<Gt, Vb>& v1, + const indexedVertex<Gt, Vb>& v2 + ); + + //- Do the three given vertices consitute an outside triangle + friend bool outsideTriangle <Gt, Vb> + ( + const indexedVertex<Gt, Vb>& v0, + const indexedVertex<Gt, Vb>& v1, + const indexedVertex<Gt, Vb>& v2 + ); + +}; + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace CGAL + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#include "indexedVertexI.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#endif + +// ************************************************************************* // diff --git a/applications/utilities/mesh/generation/cv2DMesh/indexedVertexI.H b/applications/utilities/mesh/generation/cv2DMesh/indexedVertexI.H new file mode 100644 index 0000000000000000000000000000000000000000..2d6280274f573b519ee51e034f3b7f7e767321c1 --- /dev/null +++ b/applications/utilities/mesh/generation/cv2DMesh/indexedVertexI.H @@ -0,0 +1,233 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2013 OpenFOAM Foundation + \\/ M anipulation | +------------------------------------------------------------------------------- +License + This file is part of OpenFOAM. + + OpenFOAM is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + OpenFOAM is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>. + +\*---------------------------------------------------------------------------*/ + +// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // + +template<class Gt, class Vb> +inline CGAL::indexedVertex<Gt, Vb>::indexedVertex() +: + Vb(), + index_(INTERNAL_POINT), + type_(INTERNAL_POINT) +{} + + +template<class Gt, class Vb> +inline CGAL::indexedVertex<Gt, Vb>::indexedVertex(const Point& p) +: + Vb(p), + index_(INTERNAL_POINT), + type_(INTERNAL_POINT) +{} + + +template<class Gt, class Vb> +inline CGAL::indexedVertex<Gt, Vb>::indexedVertex +( + const Point& p, + const int index, + const int& type +) +: + Vb(p), + index_(index), + type_(type) +{} + + +template<class Gt, class Vb> +inline CGAL::indexedVertex<Gt, Vb>::indexedVertex(const Point& p, Face_handle f) +: + Vb(f, p), + index_(INTERNAL_POINT), + type_(INTERNAL_POINT) +{} + + +template<class Gt, class Vb> +inline CGAL::indexedVertex<Gt, Vb>::indexedVertex(Face_handle f) +: + Vb(f), + index_(INTERNAL_POINT), + type_(INTERNAL_POINT) +{} + + +// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // + +template<class Gt, class Vb> +inline int& CGAL::indexedVertex<Gt, Vb>::index() +{ + return index_; +} + + +template<class Gt, class Vb> +inline int CGAL::indexedVertex<Gt, Vb>::index() const +{ + return index_; +} + + +template<class Gt, class Vb> +inline int& CGAL::indexedVertex<Gt, Vb>::type() +{ + return type_; +} + + +template<class Gt, class Vb> +inline int CGAL::indexedVertex<Gt, Vb>::type() const +{ + return type_; +} + + +template<class Gt, class Vb> +inline bool CGAL::indexedVertex<Gt, Vb>::farPoint() const +{ + return type_ == FAR_POINT; +} + + +template<class Gt, class Vb> +inline bool CGAL::indexedVertex<Gt, Vb>::internalPoint() const +{ + return type_ <= INTERNAL_POINT; +} + + +template<class Gt, class Vb> +inline bool CGAL::indexedVertex<Gt, Vb>::nearBoundary() const +{ + return type_ == NEAR_BOUNDARY_POINT; +} + + +template<class Gt, class Vb> +inline void CGAL::indexedVertex<Gt, Vb>::setNearBoundary() +{ + type_ = NEAR_BOUNDARY_POINT; +} + + +template<class Gt, class Vb> +inline bool CGAL::indexedVertex<Gt, Vb>::mirrorPoint() const +{ + return type_ == MIRROR_POINT; +} + + +template<class Gt, class Vb> +inline bool CGAL::indexedVertex<Gt, Vb>::pairPoint() const +{ + return type_ >= 0; +} + + +template<class Gt, class Vb> +inline bool CGAL::indexedVertex<Gt, Vb>::ppMaster() const +{ + if (type_ > index_) + { + return true; + } + else + { + return false; + } +} + + +template<class Gt, class Vb> +inline bool CGAL::indexedVertex<Gt, Vb>::ppSlave() const +{ + if (type_ >= 0 && type_ < index_) + { + return true; + } + else + { + return false; + } +} + + +template<class Gt, class Vb> +inline bool CGAL::indexedVertex<Gt, Vb>::internalOrBoundaryPoint() const +{ + return internalPoint() || ppMaster(); +} + + +template<class Gt, class Vb> +inline bool CGAL::indexedVertex<Gt, Vb>::nearOrOnBoundary() const +{ + return pairPoint() || mirrorPoint() || nearBoundary(); +} + + +// * * * * * * * * * * * * * * * Friend Functions * * * * * * * * * * * * * // + +template<class Gt, class Vb> +bool CGAL::pointPair +( + const indexedVertex<Gt, Vb>& v0, + const indexedVertex<Gt, Vb>& v1 +) +{ + return v0.index_ == v1.type_ || v1.index_ == v0.type_; +} + + +template<class Gt, class Vb> +bool CGAL::boundaryTriangle +( + const indexedVertex<Gt, Vb>& v0, + const indexedVertex<Gt, Vb>& v1, + const indexedVertex<Gt, Vb>& v2 +) +{ + return (v0.pairPoint() && pointPair(v1, v2)) + || (v1.pairPoint() && pointPair(v2, v0)) + || (v2.pairPoint() && pointPair(v0, v1)); +} + + +template<class Gt, class Vb> +bool CGAL::outsideTriangle +( + const indexedVertex<Gt, Vb>& v0, + const indexedVertex<Gt, Vb>& v1, + const indexedVertex<Gt, Vb>& v2 +) +{ + return (v0.farPoint() || v0.ppSlave()) + || (v1.farPoint() || v1.ppSlave()) + || (v2.farPoint() || v2.ppSlave()); +} + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // diff --git a/applications/utilities/mesh/generation/cv2DMesh/insertBoundaryConformPointPairs.C b/applications/utilities/mesh/generation/cv2DMesh/insertBoundaryConformPointPairs.C new file mode 100644 index 0000000000000000000000000000000000000000..7db9f2dae4661c09895c0960613c56d92d6560f1 --- /dev/null +++ b/applications/utilities/mesh/generation/cv2DMesh/insertBoundaryConformPointPairs.C @@ -0,0 +1,323 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2013 OpenFOAM Foundation + \\/ M anipulation | +------------------------------------------------------------------------------- +License + This file is part of OpenFOAM. + + OpenFOAM is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + OpenFOAM is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>. + +\*----------------------------------------------------------------------------*/ + +#include "CV2D.H" + +// * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * // + +void Foam::CV2D::insertPointPair +( + Triangulation::Finite_vertices_iterator& vit, + const point2D& p, + const label trii, + const label hitSurface +) +{ + if + ( + !meshControls().mirrorPoints() + || !insertMirrorPoint(toPoint2D(vit->point()), p) + ) + { + pointIndexHit pHit + ( + true, + toPoint3D(p), + trii + ); + + vectorField norm(1); + qSurf_.geometry()[hitSurface].getNormal + ( + List<pointIndexHit>(1, pHit), + norm + ); + + insertPointPair + ( + meshControls().ppDist(), + p, + toPoint2D(norm[0]) + ); + } + + vit = Triangulation::Finite_vertices_iterator + ( + CGAL::Filter_iterator + < + Triangulation::All_vertices_iterator, + Triangulation::Infinite_tester + >(finite_vertices_end(), vit.predicate(), vit.base()) + ); +} + + +bool Foam::CV2D::insertPointPairAtIntersection +( + Triangulation::Finite_vertices_iterator& vit, + const point2D& defVert, + const point2D vertices[], + const scalar maxProtSize2 +) +{ + bool found = false; + point2D interPoint; + label interTri = -1; + label interHitSurface = -1; + scalar interDist2 = 0; + + Face_circulator fcStart = incident_faces(vit); + Face_circulator fc = fcStart; + label vi = 0; + + do + { + if (!is_infinite(fc)) + { + pointIndexHit pHit; + label hitSurface = -1; + + qSurf_.findSurfaceNearestIntersection + ( + toPoint3D(defVert), + toPoint3D(vertices[vi]), + pHit, + hitSurface + ); + + if (pHit.hit()) + { + scalar dist2 = + magSqr(toPoint2D(pHit.hitPoint()) - vertices[vi]); + + // Check the point is further away than the furthest so far + if (dist2 > interDist2) + { + scalar mps2 = maxProtSize2; + + // If this is a boundary triangle reset the tolerance + // to avoid finding a hit point very close to a boundary + // vertex + if (boundaryTriangle(fc)) + { + mps2 = meshControls().maxNotchLen2(); + } + + if (dist2 > mps2) + { + found = true; + interPoint = toPoint2D(pHit.hitPoint()); + interTri = pHit.index(); + interDist2 = dist2; + interHitSurface = hitSurface; + } + } + } + + vi++; + } + } while (++fc != fcStart); + + if (found) + { + insertPointPair(vit, interPoint, interTri, interHitSurface); + return true; + } + else + { + return false; + } +} + + +Foam::label Foam::CV2D::insertBoundaryConformPointPairs +( + const fileName& fName +) +{ + label nIntersections = 0; + + for + ( + Triangulation::Finite_vertices_iterator vit = finite_vertices_begin(); + vit != finite_vertices_end(); + vit++ + ) + { + // Consider only those points part of point-pairs or near boundary + if (!vit->nearOrOnBoundary()) + { + continue; + } + + // Counter-clockwise circulator + Face_circulator fcStart = incident_faces(vit); + Face_circulator fc = fcStart; + + bool infinite = false; + bool changed = false; + + do + { + if (is_infinite(fc)) + { + infinite = true; + break; + } + else if (fc->faceIndex() < Fb::UNCHANGED) + { + changed = true; + break; + } + } while (++fc != fcStart); + + // If the dual-cell is connected to the infinite point or none of the + // faces whose circumcentres it uses have changed ignore + if (infinite || !changed) continue; + + fc = fcStart; + label nVerts = 0; + + do + { + vertices[nVerts++] = toPoint2D(circumcenter(fc)); + + if (nVerts == maxNvert) + { + break; + } + } while (++fc != fcStart); + + // Check if dual-cell has a large number of faces in which case + // assumed to be in the far-field and reject + if (nVerts == maxNvert) continue; + + // Set n+1 vertex to the first vertex for easy circulating + vertices[nVerts] = vertices[0]; + + // Convert triangle vertex to OpenFOAM point + point2DFromPoint defVert = toPoint2D(vit->point()); + + scalar maxProtSize2 = meshControls().maxNotchLen2(); + + if (vit->internalOrBoundaryPoint()) + { + // Calculate metrics of the dual-cell + // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + // The perimeter of the dual-cell + scalar perimeter = 0; + + // Twice the area of the dual-cell + scalar areaT2 = 0; + + for (int vi=0; vi<nVerts; vi++) + { + vector2D edge(vertices[vi+1] - vertices[vi]); + perimeter += mag(edge); + vector2D otherEdge = defVert - vertices[vi]; + areaT2 += mag(edge.x()*otherEdge.y() - edge.y()*otherEdge.x()); + } + + // If the dual-cell is very small reject refinement + if (areaT2 < meshControls().minEdgeLen2()) continue; + + // Estimate the cell width + scalar cellWidth = areaT2/perimeter; + + + // Check dimensions of dual-cell + /* + // Quick rejection of dual-cell refinement based on it's perimeter + if (perimeter < 2*meshControls().minCellSize()) continue; + + // Also check the area of the cell and reject refinement + // if it is less than that allowed + if (areaT2 < meshControls().minCellSize2()) continue; + + // Estimate the cell width and reject refinement if it is less than + // that allowed + if (cellWidth < 0.5*meshControls().minEdgeLen()) continue; + */ + + if + ( + perimeter > 2*meshControls().minCellSize() + && areaT2 > meshControls().minCellSize2() + && cellWidth > 0.5*meshControls().minEdgeLen() + ) + { + maxProtSize2 = 0.25*meshControls().maxNotchLen2(); + } + } + + if (insertPointPairAtIntersection(vit, defVert, vertices, maxProtSize2)) + { + nIntersections++; + } + } + + return nIntersections; +} + + +void Foam::CV2D::markNearBoundaryPoints() +{ + label count = 0; + for + ( + Triangulation::Finite_vertices_iterator vit = finite_vertices_begin(); + vit != finite_vertices_end(); + vit++ + ) + { + if (vit->internalPoint()) + { + point vert(toPoint3D(vit->point())); + + pointIndexHit pHit; + label hitSurface = -1; + + qSurf_.findSurfaceNearest + ( + vert, + 4*meshControls().minCellSize2(), + pHit, + hitSurface + ); + + if (pHit.hit()) + { + vit->setNearBoundary(); + ++count; + } + } + } + + Info<< count << " points marked as being near a boundary" << endl; +} + + +// ************************************************************************* // diff --git a/applications/utilities/mesh/generation/cv2DMesh/insertFeaturePoints.C b/applications/utilities/mesh/generation/cv2DMesh/insertFeaturePoints.C new file mode 100644 index 0000000000000000000000000000000000000000..464557078fe09981e912b7ad3b029e41920d7a36 --- /dev/null +++ b/applications/utilities/mesh/generation/cv2DMesh/insertFeaturePoints.C @@ -0,0 +1,394 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2013 OpenFOAM Foundation + \\/ M anipulation | +------------------------------------------------------------------------------- +License + This file is part of OpenFOAM. + + OpenFOAM is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + OpenFOAM is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>. + +\*----------------------------------------------------------------------------*/ + +#include "CV2D.H" +#include "plane.H" +#include "unitConversion.H" + +// * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * // + +bool Foam::CV2D::on2DLine(const point2D& p, const linePointRef& line) +{ + const point2D& a = toPoint2D(line.start()); + const point2D& b = toPoint2D(line.end()); + + if + ( + p.x() < min(a.x(), b.x()) + || p.x() > max(a.x(), b.x()) + || p.y() < min(a.y(), b.y()) + || p.y() > max(a.y(), b.y()) + ) + { + return false; + } + + return true; +} + + +void Foam::CV2D::insertFeaturePoints() +{ + featurePoints_.clear(); + label nVert = number_of_vertices(); + + const PtrList<extendedFeatureEdgeMesh>& feMeshes + ( + qSurf_.features() + ); + + if (feMeshes.empty()) + { + WarningIn("CV2D::insertFeaturePoints") + << "Extended Feature Edge Mesh is empty so no feature points will " + << "be found." << nl + << " Use: featureMethod extendedFeatureEdgeMesh;" << nl + << endl; + } + + forAll(feMeshes, i) + { + const extendedFeatureEdgeMesh& feMesh(feMeshes[i]); + const edgeList& edges = feMesh.edges(); + const pointField& points = feMesh.points(); + + if (debug) + { + label nConvex = feMesh.concaveStart() - feMesh.convexStart(); + label nConcave = feMesh.mixedStart() - feMesh.concaveStart(); + label nMixed = feMesh.nonFeatureStart() - feMesh.mixedStart(); + label nExternal = feMesh.internalStart() - feMesh.externalStart(); + label nInternal = feMesh.flatStart() - feMesh.internalStart(); + label nFlat = feMesh.openStart() - feMesh.flatStart(); + label nOpen = feMesh.multipleStart() - feMesh.openStart(); + label nMultiple = edges.size() - feMesh.multipleStart(); + + Info<< "Inserting Feature Points:" << nl + << " Convex points: " << nConvex << nl + << " Concave points: " << nConcave << nl + << " Mixed points: " << nMixed << nl + << " External edges: " << nExternal << nl + << " Internal edges: " << nInternal << nl + << " Flat edges: " << nFlat << nl + << " Open edges: " << nOpen << nl + << " Multiple edges: " << nMultiple << endl; + } + + // Args: (base point, normal) + // @todo allow user to input this + plane zPlane(vector(0, 0, z_), vector(0, 0, 1)); + + if (debug) + { + Info<< " plane: " << zPlane << " " << z_ << endl; + } + + forAll(edges, edgeI) + { + const edge& e = feMesh.edges()[edgeI]; + + const point& ep0 = points[e.start()]; + const point& ep1 = points[e.end()]; + + const linePointRef line(ep0, ep1); + + scalar intersect = zPlane.lineIntersect(line); + + point2D featPoint = toPoint2D(intersect * (ep1 - ep0) + ep0); + + if (on2DLine(featPoint, line)) + { + vector2DField fpn = toPoint2D(feMesh.edgeNormals(edgeI)); + + vector2D cornerNormal = sum(fpn); + cornerNormal /= mag(cornerNormal); + + if (debug) + { + Info<< nl << " line: " << line << nl + << " vec: " << line.vec() << nl + << " featurePoint: " << featPoint << nl + << " line length: " << line.mag() << nl + << " intersect: " << intersect << endl; + } + + if + ( + feMesh.getEdgeStatus(edgeI) + == extendedFeatureEdgeMesh::EXTERNAL + ) + { + // Convex Point + Foam::point2D internalPt = + featPoint - meshControls().ppDist()*cornerNormal; + + if (debug) + { + Info<< "PREC: " << internalPt << nl + << " : " << featPoint << nl + << " : " << meshControls().ppDist() << nl + << " : " << cornerNormal << endl; + } + + featurePoints_.push_back + ( + Vb + ( + toPoint(internalPt), + nVert, + nVert + 1 + ) + ); + label masterPtIndex = nVert++; + + forAll(fpn, nI) + { + const vector n3D(fpn[nI][0], fpn[nI][1], 0.0); + + plane planeN = plane(toPoint3D(featPoint), n3D); + + Foam::point2D externalPt = + internalPt + + ( + 2.0 + * planeN.distance(toPoint3D(internalPt)) + * fpn[nI] + ); + + featurePoints_.push_back + ( + Vb + ( + toPoint(externalPt), + nVert++, + masterPtIndex + ) + ); + + if (debug) + { + Info<< " side point: " << externalPt << endl; + } + } + + if (debug) + { + Info<< "Convex Point: " << featPoint << nl + << " corner norm: " << cornerNormal << nl + << " reference: " << internalPt << endl; + } + } + else if + ( + feMesh.getEdgeStatus(edgeI) + == extendedFeatureEdgeMesh::INTERNAL + ) + { + // Concave Point + Foam::point2D externalPt = + featPoint + meshControls().ppDist()*cornerNormal; + + Foam::point2D refPt = + featPoint - meshControls().ppDist()*cornerNormal; + + label slavePointIndex = 0; + + scalar totalAngle = + radToDeg + ( + constant::mathematical::pi + + acos(mag(fpn[0] & fpn[1])) + ); + + // Number of quadrants the angle should be split into + int nQuads = + int(totalAngle/meshControls().maxQuadAngle()) + 1; + + // The number of additional master points needed to + //obtain the required number of quadrants. + int nAddPoints = min(max(nQuads - 2, 0), 2); + + // index of reflMaster + label reflectedMaster = nVert + 2 + nAddPoints; + + if (debug) + { + Info<< "Concave Point: " << featPoint << nl + << " corner norm: " << cornerNormal << nl + << " external: " << externalPt << nl + << " reference: " << refPt << nl + << " angle: " << totalAngle << nl + << " nQuads: " << nQuads << nl + << " nAddPoints: " << nAddPoints << endl; + } + + forAll(fpn, nI) + { + const vector n3D(fpn[nI][0], fpn[nI][1], 0.0); + + plane planeN = plane(toPoint3D(featPoint), n3D); + + Foam::point2D internalPt = + externalPt + - ( + 2.0 + * planeN.distance(toPoint3D(externalPt)) + * fpn[nI] + ); + + featurePoints_.push_back + ( + Vb + ( + toPoint(internalPt), + nVert, + reflectedMaster + ) + ); + slavePointIndex = nVert++; + + if (debug) + { + Info<< "Internal Point: " << internalPt << endl; + } + } + + if (nAddPoints == 1) + { + // One additional point is the reflection of the slave + // point, i.e., the original reference point + featurePoints_.push_back + ( + Vb + ( + toPoint(refPt), + nVert++, + reflectedMaster + ) + ); + + if (debug) + { + Info<< "ref Point: " << refPt << endl; + } + } + else if (nAddPoints == 2) + { + point2D reflectedAa = + refPt - ((featPoint - externalPt) & fpn[1])*fpn[1]; + + featurePoints_.push_back + ( + Vb + ( + toPoint(reflectedAa), + nVert++, + reflectedMaster + ) + ); + + point2D reflectedBb = + refPt - ((featPoint - externalPt) & fpn[0])*fpn[0]; + + featurePoints_.push_back + ( + Vb + ( + toPoint(reflectedBb), + nVert++, + reflectedMaster + ) + ); + + if (debug) + { + Info<< "refA Point: " << reflectedAa << nl + << "refb Point: " << reflectedBb << endl; + } + } + + featurePoints_.push_back + ( + Vb + ( + toPoint(externalPt), + nVert++, + slavePointIndex + ) + ); + } + else + { + WarningIn("void Foam::CV2D::insertFeaturePoints()") + << "Feature Edge " << edges[edgeI] << nl + << " points(" << points[edges[edgeI].start()] + << ", " << points[edges[edgeI].end()] << ")" << nl + << " is not labelled as either concave or convex, it" + << " is labelled as (#2 = flat): " + << feMesh.getEdgeStatus(edgeI) << endl; + } + } + else + { + WarningIn("void Foam::CV2D::insertFeaturePoints()") + << "Point " << featPoint << " is not on the line " + << line << endl; + } + } + } + + // Insert the feature points. + reinsertFeaturePoints(); + + if (meshControls().objOutput()) + { + writePoints("feat_allPoints.obj", false); + writeFaces("feat_allFaces.obj", false); + writeFaces("feat_faces.obj", true); + writeTriangles("feat_triangles.obj", true); + } +} + + +void Foam::CV2D::reinsertFeaturePoints() +{ + for + ( + std::list<Vb>::iterator vit=featurePoints_.begin(); + vit != featurePoints_.end(); + ++vit + ) + { + insertPoint + ( + toPoint2D(vit->point()), + vit->index(), + vit->type() + ); + } +} + + +// ************************************************************************* // diff --git a/applications/utilities/mesh/generation/cv2DMesh/insertSurfaceNearPointPairs.C b/applications/utilities/mesh/generation/cv2DMesh/insertSurfaceNearPointPairs.C new file mode 100644 index 0000000000000000000000000000000000000000..700041f814189bae85c38bc9496b9139bdb4a71c --- /dev/null +++ b/applications/utilities/mesh/generation/cv2DMesh/insertSurfaceNearPointPairs.C @@ -0,0 +1,114 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2013 OpenFOAM Foundation + \\/ M anipulation | +------------------------------------------------------------------------------- +License + This file is part of OpenFOAM. + + OpenFOAM is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + OpenFOAM is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>. + +\*----------------------------------------------------------------------------*/ + +#include "CV2D.H" + +// * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * // + +void Foam::CV2D::insertSurfaceNearPointPairs() +{ + Info<< "insertSurfaceNearPointPairs: "; + + label nNearPoints = 0; + + for + ( + Triangulation::Finite_edges_iterator eit = finite_edges_begin(); + eit != finite_edges_end(); + eit++ + ) + { + Vertex_handle v0h = eit->first->vertex(cw(eit->second)); + Vertex_handle v1h = eit->first->vertex(ccw(eit->second)); + + if (v0h->ppMaster() && v1h->ppMaster()) + { + point2DFromPoint v0(toPoint2D(v0h->point())); + point2DFromPoint v1(toPoint2D(v1h->point())); + + // Check that the two triangle vertices are further apart than the + // minimum cell size + if (magSqr(v1 - v0) > meshControls().minCellSize2()) + { + point2D e0(toPoint2D(circumcenter(eit->first))); + + point2D e1 + ( + toPoint2D(circumcenter(eit->first->neighbor(eit->second))) + ); + + // Calculate the length^2 of the edge normal to the surface + scalar edgeLen2 = magSqr(e0 - e1); + + if (edgeLen2 < meshControls().minNearPointDist2()) + { + pointIndexHit pHit; + label hitSurface = -1; + + qSurf_.findSurfaceNearest + ( + toPoint3D(e0), + meshControls().minEdgeLen2(), + pHit, + hitSurface + ); + + if (pHit.hit()) + { + vectorField norm(1); + qSurf_.geometry()[hitSurface].getNormal + ( + List<pointIndexHit>(1, pHit), + norm + ); + + insertPointPair + ( + meshControls().ppDist(), + toPoint2D(pHit.hitPoint()), + toPoint2D(norm[0]) + ); + + nNearPoints++; + + // Correct the edge iterator for the change in the + // number of edges following the point-pair insertion + eit = Finite_edges_iterator + ( + finite_edges_end().base(), + eit.predicate(), + eit.base() + ); + } + } + } + } + } + + Info<< nNearPoints << " point-pairs inserted" << endl; +} + + +// ************************************************************************* // diff --git a/applications/utilities/mesh/generation/cv2DMesh/insertSurfaceNearestPointPairs.C b/applications/utilities/mesh/generation/cv2DMesh/insertSurfaceNearestPointPairs.C new file mode 100644 index 0000000000000000000000000000000000000000..49249241e77adac8ccce8b8853f1a40b8f92719c --- /dev/null +++ b/applications/utilities/mesh/generation/cv2DMesh/insertSurfaceNearestPointPairs.C @@ -0,0 +1,244 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2013 OpenFOAM Foundation + \\/ M anipulation | +------------------------------------------------------------------------------- +License + This file is part of OpenFOAM. + + OpenFOAM is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + OpenFOAM is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>. + +\*----------------------------------------------------------------------------*/ + +#include "CV2D.H" + +// * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * // + +bool Foam::CV2D::dualCellSurfaceIntersection +( + const Triangulation::Finite_vertices_iterator& vit +) const +{ + Triangulation::Edge_circulator ecStart = incident_edges(vit); + Triangulation::Edge_circulator ec = ecStart; + + do + { + if (!is_infinite(ec)) + { + point e0 = toPoint3D(circumcenter(ec->first)); + + // If edge end is outside bounding box then edge cuts boundary + if (!qSurf_.globalBounds().contains(e0)) + { + return true; + } + + point e1 = toPoint3D(circumcenter(ec->first->neighbor(ec->second))); + + // If other edge end is ouside bounding box then edge cuts boundary + if (!qSurf_.globalBounds().contains(e1)) + { + return true; + } + + if (magSqr(e1 - e0) > meshControls().minEdgeLen2()) + { + if (qSurf_.findSurfaceAnyIntersection(e0, e1)) + { + return true; + } + } + } + + } while (++ec != ecStart); + + return false; +} + + +void Foam::CV2D::insertPointPairs +( + const DynamicList<point2D>& nearSurfacePoints, + const DynamicList<point2D>& surfacePoints, + const DynamicList<label>& surfaceTris, + const DynamicList<label>& surfaceHits, + const fileName fName +) +{ + if (meshControls().mirrorPoints()) + { + forAll(surfacePoints, ppi) + { + insertMirrorPoint + ( + nearSurfacePoints[ppi], + surfacePoints[ppi] + ); + } + } + else + { + forAll(surfacePoints, ppi) + { + pointIndexHit pHit + ( + true, + toPoint3D(surfacePoints[ppi]), + surfaceTris[ppi] + ); + + vectorField norm(1); + qSurf_.geometry()[surfaceHits[ppi]].getNormal + ( + List<pointIndexHit>(1, pHit), + norm + ); + + insertPointPair + ( + meshControls().ppDist(), + surfacePoints[ppi], + toPoint2D(norm[0]) + ); + } + } + + Info<< surfacePoints.size() << " point-pairs inserted" << endl; + + if (meshControls().objOutput()) + { + OFstream str(fName); + label vertI = 0; + + forAll(surfacePoints, ppi) + { + meshTools::writeOBJ(str, toPoint3D(surfacePoints[ppi])); + vertI++; + } + + Info<< "insertPointPairs: Written " << surfacePoints.size() + << " inserted point-pair locations to file " + << str.name() << endl; + } +} + + +void Foam::CV2D::insertSurfaceNearestPointPairs() +{ + Info<< "insertSurfaceNearestPointPairs: "; + + label nSurfacePointsEst = + min + ( + number_of_vertices(), + size_t(10*sqrt(scalar(number_of_vertices()))) + ); + + DynamicList<point2D> nearSurfacePoints(nSurfacePointsEst); + DynamicList<point2D> surfacePoints(nSurfacePointsEst); + DynamicList<label> surfaceTris(nSurfacePointsEst); + DynamicList<label> surfaceHits(nSurfacePointsEst); + + // Local references to surface mesh addressing +// const pointField& localPoints = qSurf_.localPoints(); +// const labelListList& edgeFaces = qSurf_.edgeFaces(); +// const vectorField& faceNormals = qSurf_.faceNormals(); +// const labelListList& faceEdges = qSurf_.faceEdges(); + + for + ( + Triangulation::Finite_vertices_iterator vit = finite_vertices_begin(); + vit != finite_vertices_end(); + vit++ + ) + { + if (vit->internalPoint()) + { + point2DFromPoint vert(toPoint2D(vit->point())); + + pointIndexHit pHit; + label hitSurface = -1; + + qSurf_.findSurfaceNearest + ( + toPoint3D(vert), + 4*meshControls().minCellSize2(), + pHit, + hitSurface + ); + + if (pHit.hit()) + { + vit->setNearBoundary(); + + // Reference to the nearest triangle +// const labelledTri& f = qSurf_[hitSurface]; + +// // Find where point is on triangle. +// // Note tolerance needed is relative one +// // (used in comparing normalized [0..1] triangle coordinates). +// label nearType, nearLabel; +// triPointRef +// ( +// localPoints[f[0]], +// localPoints[f[1]], +// localPoints[f[2]] +// ).classify(pHit.hitPoint(), nearType, nearLabel); + +// // If point is on a edge check if it is an internal feature + +// bool internalFeatureEdge = false; + +// if (nearType == triPointRef::EDGE) +// { +// label edgeI = faceEdges[hitSurface][nearLabel]; +// const labelList& eFaces = edgeFaces[edgeI]; + +// if +// ( +// eFaces.size() == 2 +// && (faceNormals[eFaces[0]] & faceNormals[eFaces[1]]) +// < -0.2 +// ) +// { +// internalFeatureEdge = true; +// } +// } + + if (dualCellSurfaceIntersection(vit)) //&& !internalFeatureEdge) + { + nearSurfacePoints.append(vert); + surfacePoints.append(toPoint2D(pHit.hitPoint())); + surfaceTris.append(pHit.index()); + surfaceHits.append(hitSurface); + } + } + } + } + + insertPointPairs + ( + nearSurfacePoints, + surfacePoints, + surfaceTris, + surfaceHits, + "surfaceNearestIntersections.obj" + ); +} + + +// ************************************************************************* // diff --git a/applications/utilities/mesh/generation/cv2DMesh/shortEdgeFilter2D.C b/applications/utilities/mesh/generation/cv2DMesh/shortEdgeFilter2D.C new file mode 100644 index 0000000000000000000000000000000000000000..b125351314b205acd0ee6e1406954230af58d917 --- /dev/null +++ b/applications/utilities/mesh/generation/cv2DMesh/shortEdgeFilter2D.C @@ -0,0 +1,533 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2013 OpenFOAM Foundation + \\/ M anipulation | +------------------------------------------------------------------------------- +License + This file is part of OpenFOAM. + + OpenFOAM is free software: you can redistribute it and/or modify it + under the terms_ of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + OpenFOAM is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>. + +\*---------------------------------------------------------------------------*/ + +#include "shortEdgeFilter2D.H" + +namespace Foam +{ + defineTypeNameAndDebug(shortEdgeFilter2D, 0); +} + + +// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // + +Foam::shortEdgeFilter2D::shortEdgeFilter2D +( + const Foam::CV2D& cv2Dmesh, + const dictionary& dict +) +: + cv2Dmesh_(cv2Dmesh), + shortEdgeFilterFactor_(readScalar(dict.lookup("shortEdgeFilterFactor"))), + edgeAttachedToBoundaryFactor_ + ( + dict.lookupOrDefault<scalar>("edgeAttachedToBoundaryFactor", 2.0) + ), + patchNames_(wordList()), + patchSizes_(labelList()), + mapEdgesRegion_(), + indirectPatchEdge_() +{ + point2DField points2D; + faceList faces; + + cv2Dmesh.calcDual + ( + points2D, + faces, + patchNames_, + patchSizes_, + mapEdgesRegion_, + indirectPatchEdge_ + ); + + pointField points(points2D.size()); + forAll(points, ip) + { + points[ip] = cv2Dmesh.toPoint3D(points2D[ip]); + } + + if (debug) + { + OFstream str("indirectPatchEdges.obj"); + label count = 0; + + Info<< "Writing indirectPatchEdges to " << str.name() << endl; + + forAllConstIter(EdgeMap<label>, indirectPatchEdge_, iter) + { + const edge& e = iter.key(); + + meshTools::writeOBJ + ( + str, + points[e.start()], + points[e.end()], + count + ); + } + } + + points2D.clear(); + + ms_ = MeshedSurface<face>(xferMove(points), xferMove(faces)); + + Info<< "Meshed surface stats before edge filtering :" << endl; + ms_.writeStats(Info); + + if (debug) + { + writeInfo(Info); + + ms_.write("MeshedSurface_preFilter.obj"); + } +} + + +// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * // + +Foam::shortEdgeFilter2D::~shortEdgeFilter2D() +{} + + +// * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * * // + +void +Foam::shortEdgeFilter2D::filter() +{ + // These are global indices. + const pointField& points = ms_.points(); + const edgeList& edges = ms_.edges(); + const faceList& faces = ms_.faces(); + const labelList& meshPoints = ms_.meshPoints(); + const labelList& boundaryPoints = ms_.boundaryPoints(); + + label maxChain = 0; + label nPointsToRemove = 0; + + labelList pointsToRemove(ms_.points().size(), -1); + + // List of number of vertices in a face. + labelList newFaceVertexCount(faces.size(), -1); + forAll(faces, faceI) + { + newFaceVertexCount[faceI] = faces[faceI].size(); + } + + // Check if the point is a boundary point. Flag if it is so that + // it will not be deleted. + boolList boundaryPointFlags(points.size(), false); + // This has been removed, otherwise small edges on the boundary are not + // removed. + /* forAll(boundaryPointFlags, pointI) + { + forAll(boundaryPoints, bPoint) + { + if (meshPoints[boundaryPoints[bPoint]] == pointI) + { + boundaryPointFlags[pointI] = true; + } + } + }*/ + + // Check if an edge has a boundary point. It it does the edge length + // will be doubled when working out its length. + Info<< " Marking edges attached to boundaries." << endl; + boolList edgeAttachedToBoundary(edges.size(), false); + forAll(edges, edgeI) + { + const edge& e = edges[edgeI]; + const label startVertex = e.start(); + const label endVertex = e.end(); + + forAll(boundaryPoints, bPoint) + { + if + ( + boundaryPoints[bPoint] == startVertex + || boundaryPoints[bPoint] == endVertex + ) + { + edgeAttachedToBoundary[edgeI] = true; + } + } + } + + forAll(edges, edgeI) + { + const edge& e = edges[edgeI]; + + // get the vertices of that edge. + const label startVertex = e.start(); + const label endVertex = e.end(); + + scalar edgeLength = + mag + ( + points[meshPoints[startVertex]] + - points[meshPoints[endVertex]] + ); + + if (edgeAttachedToBoundary[edgeI]) + { + edgeLength *= edgeAttachedToBoundaryFactor_; + } + + scalar shortEdgeFilterValue = 0.0; + + const labelList& psEdges = ms_.pointEdges()[startVertex]; + const labelList& peEdges = ms_.pointEdges()[endVertex]; + + forAll(psEdges, psEdgeI) + { + const edge& psE = edges[psEdges[psEdgeI]]; + if (edgeI != psEdges[psEdgeI]) + { + shortEdgeFilterValue += + mag + ( + points[meshPoints[psE.start()]] + - points[meshPoints[psE.end()]] + ); + } + } + + forAll(peEdges, peEdgeI) + { + const edge& peE = edges[peEdges[peEdgeI]]; + if (edgeI != peEdges[peEdgeI]) + { + shortEdgeFilterValue += + mag + ( + points[meshPoints[peE.start()]] + - points[meshPoints[peE.end()]] + ); + } + } + + shortEdgeFilterValue *= + shortEdgeFilterFactor_ + /(psEdges.size() + peEdges.size() - 2); + + + edge lookupInPatchEdge + ( + meshPoints[startVertex], + meshPoints[endVertex] + ); + + if + ( + edgeLength < shortEdgeFilterValue + || indirectPatchEdge_.found(lookupInPatchEdge) + ) + { + bool flagDegenerateFace = false; + const labelList& pFaces = ms_.pointFaces()[startVertex]; + + forAll(pFaces, pFaceI) + { + const face& f = ms_.localFaces()[pFaces[pFaceI]]; + forAll(f, fp) + { + // If the edge is part of this face... + if (f[fp] == endVertex) + { + // If deleting vertex would create a triangle, don't! + if (newFaceVertexCount[pFaces[pFaceI]] < 4) + { + flagDegenerateFace = true; + } + else + { + newFaceVertexCount[pFaces[pFaceI]]--; + } + } + // If the edge is not part of this face... + else + { + // Deleting vertex of a triangle... + if (newFaceVertexCount[pFaces[pFaceI]] < 3) + { + flagDegenerateFace = true; + } + } + } + } + + // This if statement determines whether a point should be deleted. + if + ( + pointsToRemove[meshPoints[startVertex]] == -1 + && pointsToRemove[meshPoints[endVertex]] == -1 + && !boundaryPointFlags[meshPoints[startVertex]] + && !flagDegenerateFace + ) + { + pointsToRemove[meshPoints[startVertex]] = meshPoints[endVertex]; + ++nPointsToRemove; + } + } + } + + label totalNewPoints = points.size() - nPointsToRemove; + + pointField newPoints(totalNewPoints, vector::zero); + labelList newPointNumbers(points.size(), -1); + label numberRemoved = 0; + + forAll(points, pointI) + { + // If the point is NOT going to be removed. + if (pointsToRemove[pointI] == -1) + { + newPoints[pointI - numberRemoved] = points[pointI]; + newPointNumbers[pointI] = pointI - numberRemoved; + } + else + { + numberRemoved++; + } + } + + // Need a new faceList + faceList newFaces(faces.size()); + label newFaceI = 0; + + labelList newFace; + label newFaceSize = 0; + + // Now need to iterate over the faces and remove points. Global index. + forAll(faces, faceI) + { + const face& f = faces[faceI]; + + newFace.clear(); + newFace.setSize(f.size()); + newFaceSize = 0; + + forAll(f, fp) + { + label pointI = f[fp]; + // If not removing the point, then add it to the new face. + if (pointsToRemove[pointI] == -1) + { + newFace[newFaceSize++] = newPointNumbers[pointI]; + } + else + { + label newPointI = pointsToRemove[pointI]; + // Replace deleted point with point that it is being + // collapsed to. + if + ( + f.nextLabel(fp) != newPointI + && f.prevLabel(fp) != newPointI + ) + { + label pChain = newPointI; + label totalChain = 0; + for (label nChain = 0; nChain <= totalChain; ++nChain) + { + if (newPointNumbers[pChain] != -1) + { + newFace[newFaceSize++] = newPointNumbers[pChain]; + newPointNumbers[pointI] = newPointNumbers[pChain]; + maxChain = max(totalChain, maxChain); + } + else + { + WarningIn("shortEdgeFilter") + << "Point " << pChain + << " marked for deletion as well as point " + << pointI << nl + << " Incrementing maxChain by 1 from " + << totalChain << " to " << totalChain + 1 + << endl; + totalChain++; + } + pChain = pointsToRemove[pChain]; + } + } + else + { + if (newPointNumbers[newPointI] != -1) + { + newPointNumbers[pointI] = newPointNumbers[newPointI]; + } + } + } + } + + newFace.setSize(newFaceSize); + + if (newFace.size() > 2) + { + newFaces[newFaceI++] = face(newFace); + } + else + { + FatalErrorIn("shortEdgeFilter") + << "Only " << newFace.size() << " in face " << faceI + << exit(FatalError); + } + } + + newFaces.setSize(newFaceI); + + MeshedSurface<face> fMesh + ( + xferMove(newPoints), + xferMove(newFaces), + xferCopy(List<surfZone>()) + ); + + const Map<int>& fMeshPointMap = fMesh.meshPointMap(); + + // Reset patchSizes_ + patchSizes_.clear(); + patchSizes_.setSize(patchNames_.size(), 0); + + label equalEdges = 0; + label notFound = 0; + label matches = 0; + label negativeLabels = 0; + + forAll(newPointNumbers, pointI) + { + if (newPointNumbers[pointI] == -1) + { + WarningIn("shortEdgeFilter") + << pointI << " will be deleted and " << newPointNumbers[pointI] + << ", so it will not be replaced. " + << "This will cause edges to be deleted." << endl; + } + } + + // Create new EdgeMap. + Info<< "Creating new EdgeMap." << endl; + EdgeMap<label> newMapEdgesRegion(mapEdgesRegion_.size()); + + for + ( + label bEdgeI = ms_.nInternalEdges(); + bEdgeI < edges.size(); + ++bEdgeI + ) + { + label p1 = meshPoints[edges[bEdgeI][0]]; + label p2 = meshPoints[edges[bEdgeI][1]]; + + edge e(p1, p2); + + if (mapEdgesRegion_.found(e)) + { + if + ( + newPointNumbers[p1] != -1 + && newPointNumbers[p2] != -1 + ) + { + if (newPointNumbers[p1] != newPointNumbers[p2]) + { + label region = mapEdgesRegion_.find(e)(); + newMapEdgesRegion.insert + ( + edge + ( + fMeshPointMap[newPointNumbers[p1]], + fMeshPointMap[newPointNumbers[p2]] + ), + region + ); + patchSizes_[region]++; + matches++; + } + else + { + equalEdges++; + } + } + else + { + negativeLabels++; + } + } + else + { + notFound++; + } + } + + if (debug) + { + Info<< "EdgeMapping :" << nl + << " Matches : " << matches << nl + << " Equal : " << equalEdges << nl + << " Negative : " << negativeLabels << nl + << " Not Found: " << notFound << endl; + } + + mapEdgesRegion_.transfer(newMapEdgesRegion); + + ms_.transfer(fMesh); + + Info<< " Maximum number of chained collapses = " << maxChain << endl; + + if (debug) + { + writeInfo(Info); + } +} + + +void Foam::shortEdgeFilter2D::writeInfo(Ostream& os) +{ + os << "Short Edge Filtering Information:" << nl + << " shortEdgeFilterFactor: " << shortEdgeFilterFactor_ << nl + << " edgeAttachedToBoundaryFactor: " << edgeAttachedToBoundaryFactor_ + << endl; + + forAll(patchNames_, patchI) + { + os << " Patch " << patchNames_[patchI] + << ", size " << patchSizes_[patchI] << endl; + } + + os << " There are " << mapEdgesRegion_.size() + << " boundary edges." << endl; + + os << " Mesh Info:" << nl + << " Points: " << ms_.nPoints() << nl + << " Faces: " << ms_.size() << nl + << " Edges: " << ms_.nEdges() << nl + << " Internal: " << ms_.nInternalEdges() << nl + << " External: " << ms_.nEdges() - ms_.nInternalEdges() + << endl; +} + + +// ************************************************************************* // diff --git a/applications/utilities/mesh/generation/cv2DMesh/shortEdgeFilter2D.H b/applications/utilities/mesh/generation/cv2DMesh/shortEdgeFilter2D.H new file mode 100644 index 0000000000000000000000000000000000000000..53b248fc3d4bf542676f3a1f64d9cc5db9f3664a --- /dev/null +++ b/applications/utilities/mesh/generation/cv2DMesh/shortEdgeFilter2D.H @@ -0,0 +1,133 @@ +/*--------------------------------*- C++ -*----------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2013 OpenFOAM Foundation + \\/ M anipulation | +------------------------------------------------------------------------------- +License + This file is part of OpenFOAM. + + OpenFOAM is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + OpenFOAM is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>. + +Class + Foam::shortEdgeFilter2D + +Description + This class filters short edges generated by the CV2D mesher. + +SourceFiles + shortEdgeFilter2D.C + +\*---------------------------------------------------------------------------*/ + +#ifndef shortEdgeFilter2D_H +#define shortEdgeFilter2D_H + +#include "MeshedSurfaces.H" +#include "CV2D.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ + +/*---------------------------------------------------------------------------*\ + Class shortEdgeFilter2D Declaration +\*---------------------------------------------------------------------------*/ + +class shortEdgeFilter2D +{ + // Private data + + const CV2D& cv2Dmesh_; + + MeshedSurface<face> ms_; + + const scalar shortEdgeFilterFactor_; + + const scalar edgeAttachedToBoundaryFactor_; + + wordList patchNames_; + + labelList patchSizes_; + + EdgeMap<label> mapEdgesRegion_; + + EdgeMap<label> indirectPatchEdge_; + + + // Private Member Functions + + //- Disallow default bitwise copy construct + shortEdgeFilter2D(const shortEdgeFilter2D&); + + //- Disallow default bitwise assignment + void operator=(const shortEdgeFilter2D&); + + +public: + + //- Runtime type information + ClassName("shortEdgeFilter2D"); + + // Constructors + + shortEdgeFilter2D(const CV2D& cv2Dmesh, const dictionary& dict); + + + //- Destructor + ~shortEdgeFilter2D(); + + + // Access Functions + + const wordList& patchNames() const + { + return patchNames_; + } + + const labelList& patchSizes() const + { + return patchSizes_; + } + + const EdgeMap<label>& mapEdgesRegion() const + { + return mapEdgesRegion_; + } + + const MeshedSurface<face>& fMesh() const + { + return ms_; + } + + + // Member Functions + + void filter(); + + void writeInfo(Ostream& os); +}; + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace Foam + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#endif + +// ************************************************************************* // diff --git a/applications/utilities/mesh/generation/cvMesh/Allwclean b/applications/utilities/mesh/generation/cvMesh/Allwclean new file mode 100755 index 0000000000000000000000000000000000000000..3eff84006aa70bbe0d2c8b60b9408274c47bad7d --- /dev/null +++ b/applications/utilities/mesh/generation/cvMesh/Allwclean @@ -0,0 +1,10 @@ +#!/bin/sh +cd ${0%/*} || exit 1 # run from this directory +set -x + +wclean libso conformalVoronoiMesh +wclean +wclean cvMeshSurfaceSimplify +wclean cvMeshBackgroundMesh + +# ----------------------------------------------------------------- end-of-file diff --git a/applications/utilities/mesh/generation/cvMesh/Allwmake b/applications/utilities/mesh/generation/cvMesh/Allwmake new file mode 100755 index 0000000000000000000000000000000000000000..d88e8cee4afe888e82031a710e39bd9db82a578d --- /dev/null +++ b/applications/utilities/mesh/generation/cvMesh/Allwmake @@ -0,0 +1,11 @@ +#!/bin/sh +cd ${0%/*} || exit 1 # run from this directory +set -x + +wmake libso conformalVoronoiMesh +wmake +#wmake cvMeshBackgroundMesh +(cd cvMeshSurfaceSimplify && ./Allwmake) +wmake cellSizeAndAlignmentGrid + +# ----------------------------------------------------------------- end-of-file diff --git a/applications/utilities/mesh/generation/cvMesh/Make/files b/applications/utilities/mesh/generation/cvMesh/Make/files new file mode 100644 index 0000000000000000000000000000000000000000..425e0f5b83e2d83a58cef72bfc78a1503f18ad69 --- /dev/null +++ b/applications/utilities/mesh/generation/cvMesh/Make/files @@ -0,0 +1,3 @@ +cvMesh.C + +EXE = $(FOAM_APPBIN)/cvMesh diff --git a/applications/utilities/mesh/generation/cvMesh/Make/options b/applications/utilities/mesh/generation/cvMesh/Make/options new file mode 100644 index 0000000000000000000000000000000000000000..9461fa3725d8b76cc7cdce5cc102b5aa1933bdbf --- /dev/null +++ b/applications/utilities/mesh/generation/cvMesh/Make/options @@ -0,0 +1,38 @@ +EXE_DEBUG = -DFULLDEBUG -g -O0 +EXE_FROUNDING_MATH = -frounding-math +EXE_NDEBUG = -DNDEBUG + +CGAL_EXACT = /*-DCGAL_DONT_USE_LAZY_KERNEL*/ +CGAL_INEXACT = -DCGAL_INEXACT + +include $(GENERAL_RULES)/CGAL + +EXE_INC = \ + ${EXE_FROUNDING_MATH} \ + ${EXE_NDEBUG} \ + ${CGAL_INEXACT} \ + ${CGAL_INC} \ + -IconformalVoronoiMesh/lnInclude \ + -I$(LIB_SRC)/finiteVolume/lnInclude \ + -I$(LIB_SRC)/meshTools/lnInclude \ + -I$(LIB_SRC)/parallel/decompose/decompositionMethods/lnInclude \ + -I$(LIB_SRC)/edgeMesh/lnInclude \ + -I$(LIB_SRC)/fileFormats/lnInclude \ + -I$(LIB_SRC)/dynamicMesh/lnInclude \ + -I$(LIB_SRC)/triSurface/lnInclude \ + -I$(LIB_SRC)/sampling/lnInclude \ + -IvectorTools + +EXE_LIBS = \ + $(CGAL_LIBS) \ + -lboost_thread \ + -lmpfr \ + -lconformalVoronoiMesh \ + -lmeshTools \ + -ldecompositionMethods \ + -L$(FOAM_LIBBIN)/dummy -lptscotchDecomp \ + -ledgeMesh \ + -lfileFormats \ + -ltriSurface \ + -ldynamicMesh \ + -lsampling diff --git a/applications/utilities/mesh/generation/cvMesh/cellSizeAndAlignmentGrid/Make/files b/applications/utilities/mesh/generation/cvMesh/cellSizeAndAlignmentGrid/Make/files new file mode 100644 index 0000000000000000000000000000000000000000..83b77fdc77ee07fc46cfc37752b42d613bce8154 --- /dev/null +++ b/applications/utilities/mesh/generation/cvMesh/cellSizeAndAlignmentGrid/Make/files @@ -0,0 +1,2 @@ +cellSizeAndAlignmentGrid.C +EXE = $(FOAM_USER_APPBIN)/cellSizeAndAlignmentGrid diff --git a/applications/utilities/mesh/generation/cvMesh/cellSizeAndAlignmentGrid/Make/options b/applications/utilities/mesh/generation/cvMesh/cellSizeAndAlignmentGrid/Make/options new file mode 100644 index 0000000000000000000000000000000000000000..31d0d80858fad570a1809d938b72a86a074ab71b --- /dev/null +++ b/applications/utilities/mesh/generation/cvMesh/cellSizeAndAlignmentGrid/Make/options @@ -0,0 +1,40 @@ +EXE_DEBUG = -DFULLDEBUG -g -O0 +EXE_FROUNDING_MATH = -frounding-math +EXE_NDEBUG = -DNDEBUG + +CGAL_EXACT = /*-DCGAL_DONT_USE_LAZY_KERNEL*/ +CGAL_INEXACT = -DCGAL_INEXACT + +include $(GENERAL_RULES)/CGAL + + +EXE_INC = \ + ${EXE_FROUNDING_MATH} \ + ${EXE_NDEBUG} \ + ${CGAL_INEXACT} \ + ${CGAL_INC} \ + -I$(LIB_SRC)/finiteVolume/lnInclude \ + -I$(LIB_SRC)/dynamicMesh/lnInclude \ + -I$(LIB_SRC)/triSurface/lnInclude \ + -I$(LIB_SRC)/fileFormats/lnInclude \ + -I$(LIB_SRC)/sampling/lnInclude \ + -I$(LIB_SRC)/meshTools/lnInclude \ + -I$(LIB_SRC)/parallel/decompose/decompositionMethods/lnInclude \ + -I$(LIB_SRC)/edgeMesh/lnInclude \ + -I$(HOME)/OpenFOAM/OpenFOAM-dev/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/lnInclude \ + -I$(HOME)/OpenFOAM/OpenFOAM-dev/applications/utilities/mesh/generation/cvMesh/vectorTools + +EXE_LIBS = \ + $(CGAL_LIBS) \ + -lmpfr \ + -lboost_thread \ + -lconformalVoronoiMesh \ + -lfiniteVolume \ + -lmeshTools \ + -ldecompositionMethods \ + -L$(FOAM_LIBBIN)/dummy -lptscotchDecomp \ + -ledgeMesh \ + -ltriSurface \ + -ldynamicMesh \ + -lsampling \ + -lfileFormats diff --git a/applications/utilities/mesh/generation/cvMesh/cellSizeAndAlignmentGrid/cellSizeAndAlignmentGrid.C b/applications/utilities/mesh/generation/cvMesh/cellSizeAndAlignmentGrid/cellSizeAndAlignmentGrid.C new file mode 100644 index 0000000000000000000000000000000000000000..454416299d2d2539171dbd73023db41d4cf00cc2 --- /dev/null +++ b/applications/utilities/mesh/generation/cvMesh/cellSizeAndAlignmentGrid/cellSizeAndAlignmentGrid.C @@ -0,0 +1,716 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2012-2013 OpenFOAM Foundation + \\/ M anipulation | +------------------------------------------------------------------------------- +License + This file is part of OpenFOAM. + + OpenFOAM is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + OpenFOAM is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>. + +Application + Test-distributedDelaunayMesh + +Description + +\*---------------------------------------------------------------------------*/ + +#include "CGALTriangulation3DKernel.H" + +#include "indexedVertex.H" +#include "indexedCell.H" + +#include "argList.H" +#include "Time.H" +#include "DistributedDelaunayMesh.H" +#include "backgroundMeshDecomposition.H" +#include "searchableSurfaces.H" +#include "conformationSurfaces.H" +#include "PrintTable.H" +#include "Random.H" +#include "boundBox.H" +#include "point.H" +#include "cellShapeControlMesh.H" +#include "triadField.H" +#include "scalarIOField.H" +#include "pointIOField.H" +#include "triadIOField.H" + +using namespace Foam; + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // +// Main program: + +template <class Triangulation, class Type> +Foam::tmp<Foam::Field<Type> > filterFarPoints +( + const Triangulation& mesh, + const Field<Type>& field +) +{ + tmp<Field<Type> > tNewField(new Field<Type>(field.size())); + Field<Type>& newField = tNewField(); + + label added = 0; + label count = 0; + + for + ( + typename Triangulation::Finite_vertices_iterator vit = + mesh.finite_vertices_begin(); + vit != mesh.finite_vertices_end(); + ++vit + ) + { + if (vit->real()) + { + newField[added++] = field[count]; + } + + count++; + } + + newField.resize(added); + + return tNewField; +} + + +template <class T> +autoPtr<mapDistribute> buildMap +( + const T& mesh, + labelListList& pointPoints +) +{ + pointPoints.setSize(mesh.vertexCount()); + + globalIndex globalIndexing(mesh.vertexCount()); + + for + ( + typename T::Finite_vertices_iterator vit = mesh.finite_vertices_begin(); + vit != mesh.finite_vertices_end(); + ++vit + ) + { + if (!vit->real()) + { + continue; + } + + std::list<typename T::Vertex_handle> adjVerts; + mesh.finite_adjacent_vertices(vit, std::back_inserter(adjVerts)); + + DynamicList<label> indices(adjVerts.size()); + + for + ( + typename std::list<typename T::Vertex_handle>::const_iterator + adjVertI = adjVerts.begin(); + adjVertI != adjVerts.end(); + ++adjVertI + ) + { + typename T::Vertex_handle vh = *adjVertI; + + if (!vh->farPoint()) + { + indices.append + ( + globalIndexing.toGlobal(vh->procIndex(), vh->index()) + ); + } + } + + pointPoints[vit->index()].transfer(indices); + } + + List<Map<label> > compactMap; + + return autoPtr<mapDistribute> + ( + new mapDistribute + ( + globalIndexing, + pointPoints, + compactMap + ) + ); +} + + +template <class T> +Foam::tmp<Foam::triadField> buildAlignmentField(const T& mesh) +{ + tmp<triadField> tAlignments + ( + new triadField(mesh.vertexCount(), triad::unset) + ); + triadField& alignments = tAlignments(); + + for + ( + typename T::Finite_vertices_iterator vit = mesh.finite_vertices_begin(); + vit != mesh.finite_vertices_end(); + ++vit + ) + { + if (!vit->real()) + { + continue; + } + + alignments[vit->index()] = vit->alignment(); + } + + return tAlignments; +} + + +template <class T> +Foam::tmp<Foam::pointField> buildPointField(const T& mesh) +{ + tmp<pointField> tPoints + ( + new pointField(mesh.vertexCount(), point(GREAT, GREAT, GREAT)) + ); + pointField& points = tPoints(); + + for + ( + typename T::Finite_vertices_iterator vit = mesh.finite_vertices_begin(); + vit != mesh.finite_vertices_end(); + ++vit + ) + { + if (!vit->real()) + { + continue; + } + + points[vit->index()] = topoint(vit->point()); + } + + return tPoints; +} + + +void refine +( + cellShapeControlMesh& mesh, + const conformationSurfaces& geometryToConformTo, + const label maxRefinementIterations, + const scalar defaultCellSize +) +{ + for (label iter = 0; iter < maxRefinementIterations; ++iter) + { + DynamicList<point> ptsToInsert; + + for + ( + CellSizeDelaunay::Finite_cells_iterator cit = + mesh.finite_cells_begin(); + cit != mesh.finite_cells_end(); + ++cit + ) + { + const point newPoint = + topoint + ( + CGAL::centroid + ( + cit->vertex(0)->point(), + cit->vertex(1)->point(), + cit->vertex(2)->point(), + cit->vertex(3)->point() + ) + ); + + if (geometryToConformTo.inside(newPoint)) + { + ptsToInsert.append(newPoint); + } + } + + Info<< " Adding " << returnReduce(ptsToInsert.size(), sumOp<label>()) + << endl; + + forAll(ptsToInsert, ptI) + { + mesh.insert + ( + ptsToInsert[ptI], + defaultCellSize, + triad::unset, + Vb::vtInternal + ); + } + } +} + + +int main(int argc, char *argv[]) +{ + #include "setRootCase.H" + #include "createTime.H" + + // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + + label maxRefinementIterations = 2; + label maxSmoothingIterations = 200; + scalar minResidual = 0; + scalar defaultCellSize = 0.001; + scalar nearFeatDistSqrCoeff = 1e-8; + + + // Need to decouple vertex and cell type from this class? + // Vertex must have: + // + index + // + procIndex + // - type should be optional + cellShapeControlMesh mesh(runTime); + + IOdictionary cvMeshDict + ( + IOobject + ( + "cvMeshDict", + runTime.system(), + runTime, + IOobject::MUST_READ, + IOobject::NO_WRITE + ) + ); + + Random rndGen(64293*Pstream::myProcNo()); + + searchableSurfaces allGeometry + ( + IOobject + ( + "cvSearchableSurfaces", + runTime.constant(), + "triSurface", + runTime, + IOobject::MUST_READ, + IOobject::NO_WRITE + ), + cvMeshDict.subDict("geometry") + ); + + conformationSurfaces geometryToConformTo + ( + runTime, + rndGen, + allGeometry, + cvMeshDict.subDict("surfaceConformation") + ); + + autoPtr<backgroundMeshDecomposition> bMesh; + if (Pstream::parRun()) + { + bMesh.set + ( + new backgroundMeshDecomposition + ( + runTime, + rndGen, + geometryToConformTo, + cvMeshDict.subDict("backgroundMeshDecomposition") + ) + ); + } + + // Nice to have IO for the delaunay mesh + // IO depend on vertex type. + // + // Define a delaunay mesh as: + // + list of points of the triangulation + // + optionally a list of cells + + Info<< nl << "Loop over surfaces" << endl; + + forAll(geometryToConformTo.surfaces(), sI) + { + const label surfI = geometryToConformTo.surfaces()[sI]; + + const searchableSurface& surface = + geometryToConformTo.geometry()[surfI]; + + Info<< nl << "Inserting points from surface " << surface.name() + << " (" << surface.type() << ")" << endl; + + const tmp<pointField> tpoints(surface.points()); + const pointField& points = tpoints(); + + Info<< " Number of points = " << points.size() << endl; + + forAll(points, pI) + { + // Is the point in the extendedFeatureEdgeMesh? If so get the + // point normal, otherwise get the surface normal from + // searchableSurface + + pointIndexHit info; + label infoFeature; + geometryToConformTo.findFeaturePointNearest + ( + points[pI], + nearFeatDistSqrCoeff, + info, + infoFeature + ); + + + autoPtr<triad> pointAlignment; + + if (info.hit()) + { + const extendedFeatureEdgeMesh& features = + geometryToConformTo.features()[infoFeature]; + + vectorField norms = features.featurePointNormals(info.index()); + + // Create a triad from these norms. + pointAlignment.set(new triad()); + forAll(norms, nI) + { + pointAlignment() += norms[nI]; + } + + pointAlignment().normalize(); + pointAlignment().orthogonalize(); + } + else + { + geometryToConformTo.findEdgeNearest + ( + points[pI], + nearFeatDistSqrCoeff, + info, + infoFeature + ); + + if (info.hit()) + { + const extendedFeatureEdgeMesh& features = + geometryToConformTo.features()[infoFeature]; + + vectorField norms = features.edgeNormals(info.index()); + + // Create a triad from these norms. + pointAlignment.set(new triad()); + forAll(norms, nI) + { + pointAlignment() += norms[nI]; + } + + pointAlignment().normalize(); + pointAlignment().orthogonalize(); + } + else + { + pointField ptField(1, points[pI]); + scalarField distField(1, nearFeatDistSqrCoeff); + List<pointIndexHit> infoList(1, pointIndexHit()); + + surface.findNearest(ptField, distField, infoList); + + vectorField normals(1); + surface.getNormal(infoList, normals); + + pointAlignment.set(new triad(normals[0])); + } + } + + if (Pstream::parRun()) + { + if (bMesh().positionOnThisProcessor(points[pI])) + { + CellSizeDelaunay::Vertex_handle vh = mesh.insert + ( + points[pI], + defaultCellSize, + pointAlignment(), + Vb::vtInternalNearBoundary + ); + } + } + else + { + CellSizeDelaunay::Vertex_handle vh = mesh.insert + ( + points[pI], + defaultCellSize, + pointAlignment(), + Vb::vtInternalNearBoundary + ); + } + } + } + + + // Refine the mesh + refine + ( + mesh, + geometryToConformTo, + maxRefinementIterations, + defaultCellSize + ); + + + if (Pstream::parRun()) + { + mesh.distribute(bMesh); + } + + + labelListList pointPoints; + autoPtr<mapDistribute> meshDistributor = buildMap(mesh, pointPoints); + + + triadField alignments(buildAlignmentField(mesh)); + pointField points(buildPointField(mesh)); + + mesh.printInfo(Info); + + + // Setup the sizes and alignments on each point + triadField fixedAlignments(mesh.vertexCount(), triad::unset); + + for + ( + CellSizeDelaunay::Finite_vertices_iterator vit = + mesh.finite_vertices_begin(); + vit != mesh.finite_vertices_end(); + ++vit + ) + { + if (vit->nearBoundary()) + { + fixedAlignments[vit->index()] = vit->alignment(); + } + } + + Info<< nl << "Smoothing alignments" << endl; + + for (label iter = 0; iter < maxSmoothingIterations; iter++) + { + Info<< "Iteration " << iter; + + meshDistributor().distribute(points); + meshDistributor().distribute(alignments); + + scalar residual = 0; + + triadField triadAv(alignments.size(), triad::unset); + + forAll(pointPoints, pI) + { + const labelList& pPoints = pointPoints[pI]; + + if (pPoints.empty()) + { + continue; + } + + const triad& oldTriad = alignments[pI]; + triad& newTriad = triadAv[pI]; + + // Enforce the boundary conditions + const triad& fixedAlignment = fixedAlignments[pI]; + + forAll(pPoints, adjPointI) + { + const label adjPointIndex = pPoints[adjPointI]; + + scalar dist = mag(points[pI] - points[adjPointIndex]); + +// dist = max(dist, SMALL); + + triad tmpTriad = alignments[adjPointIndex]; + + for (direction dir = 0; dir < 3; dir++) + { + if (tmpTriad.set(dir)) + { + tmpTriad[dir] *= (1.0/dist); + } + } + + newTriad += tmpTriad; + } + + newTriad.normalize(); + newTriad.orthogonalize(); +// newTriad = newTriad.sortxyz(); + + label nFixed = 0; + + forAll(fixedAlignment, dirI) + { + if (fixedAlignment.set(dirI)) + { + nFixed++; + } + } + + if (nFixed == 1) + { + forAll(fixedAlignment, dirI) + { + if (fixedAlignment.set(dirI)) + { + newTriad.align(fixedAlignment[dirI]); + } + } + } + else if (nFixed == 2) + { + forAll(fixedAlignment, dirI) + { + if (fixedAlignment.set(dirI)) + { + newTriad[dirI] = fixedAlignment[dirI]; + } + else + { + newTriad[dirI] = triad::unset[dirI]; + } + } + + newTriad.orthogonalize(); + } + else if (nFixed == 3) + { + forAll(fixedAlignment, dirI) + { + if (fixedAlignment.set(dirI)) + { + newTriad[dirI] = fixedAlignment[dirI]; + } + } + } + + for (direction dir = 0; dir < 3; ++dir) + { + if + ( + newTriad.set(dir) + && oldTriad.set(dir) + //&& !fixedAlignment.set(dir) + ) + { + scalar dotProd = (oldTriad[dir] & newTriad[dir]); + scalar diff = mag(dotProd) - 1.0; + + residual += mag(diff); + } + } + } + + forAll(alignments, pI) + { + alignments[pI] = triadAv[pI].sortxyz(); + } + + reduce(residual, sumOp<scalar>()); + + Info<< ", Residual = " << residual << endl; + + if (residual <= minResidual) + { + break; + } + } + + + // Write alignments to a .obj file + OFstream str(runTime.path()/"alignments.obj"); + + forAll(alignments, pI) + { + const triad& tri = alignments[pI]; + + if (tri.set()) + { + forAll(tri, dirI) + { + meshTools::writeOBJ(str, points[pI], tri[dirI] + points[pI]); + } + } + } + + + // Remove the far points + pointIOField pointsIO + ( + IOobject + ( + "points", + runTime.constant(), + runTime, + IOobject::NO_READ, + IOobject::AUTO_WRITE + ), + filterFarPoints(mesh, points) + ); + + scalarField sizes(points.size(), defaultCellSize); + scalarIOField sizesIO + ( + IOobject + ( + "sizes", + runTime.constant(), + runTime, + IOobject::NO_READ, + IOobject::AUTO_WRITE + ), + filterFarPoints(mesh, sizes) + ); + + triadIOField alignmentsIO + ( + IOobject + ( + "alignments", + runTime.constant(), + runTime, + IOobject::NO_READ, + IOobject::AUTO_WRITE + ), + filterFarPoints(mesh, alignments) + ); + + pointsIO.write(); + sizesIO.write(); + alignmentsIO.write(); + + Info<< nl << "ExecutionTime = " << runTime.elapsedCpuTime() << " s" + << " ClockTime = " << runTime.elapsedClockTime() << " s" + << nl << endl; + + Info<< "\nEnd\n" << endl; + + return 0; +} + + +// ************************************************************************* // diff --git a/applications/utilities/mesh/generation/cvMesh/checkCvMesh/meshQualityDict b/applications/utilities/mesh/generation/cvMesh/checkCvMesh/meshQualityDict new file mode 100644 index 0000000000000000000000000000000000000000..fa5319e087c5e36fe7c3cd93d3a69d5ebc75463e --- /dev/null +++ b/applications/utilities/mesh/generation/cvMesh/checkCvMesh/meshQualityDict @@ -0,0 +1,73 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: dev | +| \\ / A nd | Web: www.OpenFOAM.org | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ + +FoamFile +{ + version 2.0; + format ascii; + + root ""; + case ""; + instance ""; + local ""; + + class dictionary; + object meshQualityDict; +} + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +//- Maximum non-orthogonality allowed. Set to 180 to disable. +maxNonOrtho 65; + +//- Max skewness allowed. Set to <0 to disable. +maxBoundarySkewness 50; +maxInternalSkewness 10; + +//- Max concaveness allowed. Is angle (in degrees) below which concavity +// is allowed. 0 is straight face, <0 would be convex face. +// Set to 180 to disable. +maxConcave 80; + +//- Minimum quality of the tet formed by the face-centre +// and variable base point minimum decomposition triangles and +// the cell centre. This has to be a positive number for tracking +// to work. Set to very negative number (e.g. -1E30) to +// disable. +// <0 = inside out tet, +// 0 = flat tet +// 1 = regular tet +minTetQuality 1e-30; + +//- Minimum pyramid volume. Is absolute volume of cell pyramid. +// Set to a sensible fraction of the smallest cell volume expected. +// Set to very negative number (e.g. -1E30) to disable. +minVol 1e-20; + +//- Minimum face area. Set to <0 to disable. +minArea -1; + +//- Minimum face twist. Set to <-1 to disable. dot product of face normal +//- and face centre triangles normal +minTwist 0.001; + +//- minimum normalised cell determinant +//- 1 = hex, <= 0 = folded or flattened illegal cell +minDeterminant 0.001; + +//- minFaceWeight (0 -> 0.5) +minFaceWeight 0.02; + +//- minVolRatio (0 -> 1) +minVolRatio 0.01; + +//must be >0 for Fluent compatibility +minTriangleTwist -1; + + +// ************************************************************************* // diff --git a/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/DelaunayMesh/DelaunayMesh.C b/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/DelaunayMesh/DelaunayMesh.C new file mode 100644 index 0000000000000000000000000000000000000000..a0327ce04f9b5e7b7cc622a0190115b6d21f7be7 --- /dev/null +++ b/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/DelaunayMesh/DelaunayMesh.C @@ -0,0 +1,233 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2012 OpenFOAM Foundation + \\/ M anipulation | +------------------------------------------------------------------------------- +License + This file is part of OpenFOAM. + + OpenFOAM is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + OpenFOAM is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>. + +\*---------------------------------------------------------------------------*/ + +#include "DelaunayMesh.H" +#include "labelPair.H" +#include "PrintTable.H" + +// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * // + + +// * * * * * * * * * * * * Static Member Functions * * * * * * * * * * * * * // + + +// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // + +template<class Triangulation> +Foam::DelaunayMesh<Triangulation>::DelaunayMesh() +: + Triangulation(), + vertexCount_(0), + cellCount_(0) +{} + + +// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * // + +template<class Triangulation> +Foam::DelaunayMesh<Triangulation>::~DelaunayMesh() +{} + + +// * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * // + + +// * * * * * * * * * * * * Protected Member Functions * * * * * * * * * * * // + + +// * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * * // + +template<class Triangulation> +void Foam::DelaunayMesh<Triangulation>::reset() +{ + Info<< "Clearing triangulation" << endl; + + this->clear(); + + resetVertexCount(); + resetCellCount(); +} + + +template<class Triangulation> +void Foam::DelaunayMesh<Triangulation>::insertPoints(const List<Vb>& vertices) +{ + rangeInsertWithInfo + ( + vertices.begin(), + vertices.end(), + true + ); +} + + +template<class Triangulation> +bool Foam::DelaunayMesh<Triangulation>::Traits_for_spatial_sort::Less_x_3:: +operator() +( + const Point_3& p, + const Point_3& q +) const +{ + return typename Gt::Less_x_3()(*(p.first), *(q.first)); +} + +template<class Triangulation> +bool Foam::DelaunayMesh<Triangulation>::Traits_for_spatial_sort::Less_y_3:: +operator() +( + const Point_3& p, + const Point_3& q +) const +{ + return typename Gt::Less_y_3()(*(p.first), *(q.first)); +} + +template<class Triangulation> +bool Foam::DelaunayMesh<Triangulation>::Traits_for_spatial_sort::Less_z_3:: +operator() +( + const Point_3& p, + const Point_3& q +) const +{ + return typename Gt::Less_z_3()(*(p.first), *(q.first)); +} + +template<class Triangulation> +typename Foam::DelaunayMesh<Triangulation>::Traits_for_spatial_sort::Less_x_3 +Foam::DelaunayMesh<Triangulation>::Traits_for_spatial_sort::less_x_3_object() +const +{ + return Less_x_3(); +} + +template<class Triangulation> +typename Foam::DelaunayMesh<Triangulation>::Traits_for_spatial_sort::Less_y_3 +Foam::DelaunayMesh<Triangulation>::Traits_for_spatial_sort::less_y_3_object() +const +{ + return Less_y_3(); +} + +template<class Triangulation> +typename Foam::DelaunayMesh<Triangulation>::Traits_for_spatial_sort::Less_z_3 +Foam::DelaunayMesh<Triangulation>::Traits_for_spatial_sort::less_z_3_object() +const +{ + return Less_z_3(); +} + + +template<class Triangulation> +template<class PointIterator> +void Foam::DelaunayMesh<Triangulation>::rangeInsertWithInfo +( + PointIterator begin, + PointIterator end, + bool printErrors +) +{ + typedef DynamicList + < + std::pair + < + const typename Triangulation::Point*, + label + > + > vectorPairPointIndex; + + vectorPairPointIndex points; + + label count = 0; + for (PointIterator it = begin; it != end; ++it) + { + points.append + ( + std::make_pair(&(it->point()), count++) + ); + } + + std::random_shuffle(points.begin(), points.end()); + + spatial_sort + ( + points.begin(), + points.end(), + Traits_for_spatial_sort() + ); + + Vertex_handle hint; + + for + ( + typename vectorPairPointIndex::const_iterator p = points.begin(); + p != points.end(); + ++p + ) + { + const size_t checkInsertion = Triangulation::number_of_vertices(); + + hint = this->insert(*(p->first), hint); + + const Vb& vert = *(begin + p->second); + + if (checkInsertion != Triangulation::number_of_vertices() - 1) + { + if (printErrors) + { + Vertex_handle nearV = + Triangulation::nearest_vertex(*(p->first)); + + Pout<< "Failed insertion : " << vert.info() + << " nearest : " << nearV->info(); + } + } + else + { + hint->index() = getNewVertexIndex(); + hint->type() = vert.type(); + hint->procIndex() = vert.procIndex(); + hint->targetCellSize() = vert.targetCellSize(); + hint->alignment() = vert.alignment(); + } + } +} + + +// * * * * * * * * * * * * * * Member Operators * * * * * * * * * * * * * * // + + +// * * * * * * * * * * * * * * Friend Functions * * * * * * * * * * * * * * // + + +// * * * * * * * * * * * * * * Friend Operators * * * * * * * * * * * * * * // + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#include "DelaunayMeshIO.C" + +// ************************************************************************* // diff --git a/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/DelaunayMesh/DelaunayMesh.H b/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/DelaunayMesh/DelaunayMesh.H new file mode 100644 index 0000000000000000000000000000000000000000..bdeee880e78e1b5bfc9fdf6b0ae7050c915453eb --- /dev/null +++ b/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/DelaunayMesh/DelaunayMesh.H @@ -0,0 +1,238 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2012 OpenFOAM Foundation + \\/ M anipulation | +------------------------------------------------------------------------------- +License + This file is part of OpenFOAM. + + OpenFOAM is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + OpenFOAM is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>. + +Class + Foam::DelaunayMesh + +Description + The vertex and cell classes must have an index defined + +SourceFiles + DelaunayMeshI.H + DelaunayMesh.C + DelaunayMeshIO.C + +\*---------------------------------------------------------------------------*/ + +#ifndef DelaunayMesh_H +#define DelaunayMesh_H + +#include "Pair.H" +#include "HashSet.H" +#include "FixedList.H" +#include "boundBox.H" +#include "indexedVertex.H" +#include "CGALTriangulation3Ddefs.H" +#include "autoPtr.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ + +class fvMesh; + +/*---------------------------------------------------------------------------*\ + Class DelaunayMesh Declaration +\*---------------------------------------------------------------------------*/ + +template<class Triangulation> +class DelaunayMesh +: + public Triangulation +{ +public: + + typedef typename Triangulation::Cell_handle Cell_handle; + typedef typename Triangulation::Vertex_handle Vertex_handle; + typedef typename Triangulation::Point Point; + typedef typename Triangulation::Facet Facet; + + typedef typename Triangulation::Finite_vertices_iterator + Finite_vertices_iterator; + typedef typename Triangulation::Finite_cells_iterator + Finite_cells_iterator; + typedef typename Triangulation::Finite_facets_iterator + Finite_facets_iterator; + + typedef HashSet + < + Pair<label>, + FixedList<label, 2>::Hash<> + > labelPairHashSet; + + +private: + + // Private data + + //- Keep track of the number of vertices that have been added. + // This allows a unique index to be assigned to each vertex. + mutable label vertexCount_; + + //- Keep track of the number of cells that have been added. + // This allows a unique index to be assigned to each cell. + mutable label cellCount_; + + //- Spatial sort traits to use with a pair of point pointers and an int. + // Taken from a post on the CGAL lists: 2010-01/msg00004.html by + // Sebastien Loriot (Geometry Factory). + struct Traits_for_spatial_sort + : + public Triangulation::Geom_traits + { + typedef typename Triangulation::Geom_traits Gt; + + typedef std::pair<const typename Triangulation::Point*, int> + Point_3; + + struct Less_x_3 + { + bool operator()(const Point_3& p, const Point_3& q) const; + }; + + struct Less_y_3 + { + bool operator()(const Point_3& p, const Point_3& q) const; + }; + + struct Less_z_3 + { + bool operator()(const Point_3& p, const Point_3& q) const; + }; + + Less_x_3 less_x_3_object() const; + Less_y_3 less_y_3_object() const; + Less_z_3 less_z_3_object() const; + }; + + + // Private Member Functions + + void sortFaces + ( + faceList& faces, + labelList& owner, + labelList& neighbour + ) const; + + void addPatches + ( + const label nInternalFaces, + faceList& faces, + labelList& owner, + labelList& patchSizes, + labelList& patchStarts, + const List<DynamicList<face> >& patchFaces, + const List<DynamicList<label> >& patchOwners + ) const; + + //- Disallow default bitwise copy construct + DelaunayMesh(const DelaunayMesh<Triangulation>&); + + //- Disallow default bitwise assignment + void operator=(const DelaunayMesh<Triangulation>&); + + +public: + + // Constructors + + //- Construct from components + DelaunayMesh(); + + + //- Destructor + ~DelaunayMesh(); + + + // Member Functions + + inline label getNewVertexIndex() const; + + inline label getNewCellIndex() const; + + inline label cellCount() const; + + inline void resetCellCount(); + + inline label vertexCount() const; + + inline void resetVertexCount(); + + + //- Remove the entire triangulation + void reset(); + + void insertPoints(const List<Vb>& vertices); + + //- Function inserting points into a triangulation and setting the + // index and type data of the point in the correct order. This is + // faster than inserting points individually. + // + // Adapted from a post on the CGAL lists: 2010-01/msg00004.html by + // Sebastien Loriot (Geometry Factory). + template<class PointIterator> + void rangeInsertWithInfo + ( + PointIterator begin, + PointIterator end, + bool printErrors = true + ); + + + // Queries + + void printInfo(Ostream& os) const; + + //- Create an fvMesh from the triangulation. + // The mesh is not parallel consistent - only used for viewing + autoPtr<fvMesh> createMesh + ( + const fileName& name, + const Time& runTime, + labelList& vertexMap, + labelList& cellMap + ) const; +}; + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace Foam + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#include "DelaunayMeshI.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#ifdef NoRepository +# include "DelaunayMesh.C" +#endif + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#endif + +// ************************************************************************* // diff --git a/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/DelaunayMesh/DelaunayMeshI.H b/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/DelaunayMesh/DelaunayMeshI.H new file mode 100644 index 0000000000000000000000000000000000000000..841e5c9024b5954e80a897148c00e4c3bfea3e4e --- /dev/null +++ b/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/DelaunayMesh/DelaunayMeshI.H @@ -0,0 +1,119 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2012 OpenFOAM Foundation + \\/ M anipulation | +------------------------------------------------------------------------------- +License + This file is part of OpenFOAM. + + OpenFOAM is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + OpenFOAM is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>. + +\*---------------------------------------------------------------------------*/ + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +// * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * // + + +// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // + + +// * * * * * * * * * * * * * * * * Destructors * * * * * * * * * * * * * * * // + + +// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // + +template<class Triangulation> +inline Foam::label Foam::DelaunayMesh<Triangulation>::getNewVertexIndex() const +{ + label id = vertexCount_++; + + if (id == labelMax) + { + WarningIn + ( + "Foam::DelaunayMesh<Triangulation>::getNewVertexIndex() const" + ) << "Vertex counter has overflowed." << endl; + } + + return id; +} + + +template<class Triangulation> +inline Foam::label Foam::DelaunayMesh<Triangulation>::getNewCellIndex() const +{ + label id = cellCount_++; + + if (id == labelMax) + { + WarningIn + ( + "Foam::DelaunayMesh<Triangulation>::getNewCellIndex() const" + ) << "Cell counter has overflowed." << endl; + } + + return id; +} + + +template<class Triangulation> +Foam::label Foam::DelaunayMesh<Triangulation>::cellCount() const +{ + return cellCount_; +} + + +template<class Triangulation> +void Foam::DelaunayMesh<Triangulation>::resetCellCount() +{ + cellCount_ = 0; +} + + +template<class Triangulation> +Foam::label Foam::DelaunayMesh<Triangulation>::vertexCount() const +{ + return vertexCount_; +} + + +template<class Triangulation> +void Foam::DelaunayMesh<Triangulation>::resetVertexCount() +{ + vertexCount_ = 0; +} + + +// * * * * * * * * * * * * * * * Member Operators * * * * * * * * * * * * * // + + +// * * * * * * * * * * * * * * * Friend Functions * * * * * * * * * * * * * // + + +// * * * * * * * * * * * * * * * Friend Operators * * * * * * * * * * * * * // + + +// * * * * * * * * * * * * * * IOstream Operators * * * * * * * * * * * * * // + + +// * * * * * * * * * * * * * * * Ostream Operator * * * * * * * * * * * * * // + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + + +// ************************************************************************* // diff --git a/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/DelaunayMesh/DelaunayMeshIO.C b/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/DelaunayMesh/DelaunayMeshIO.C new file mode 100644 index 0000000000000000000000000000000000000000..63a9889308ee3273e0b372f886edd6efd3e10d51 --- /dev/null +++ b/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/DelaunayMesh/DelaunayMeshIO.C @@ -0,0 +1,391 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2012 OpenFOAM Foundation + \\/ M anipulation | +------------------------------------------------------------------------------- +License + This file is part of OpenFOAM. + + OpenFOAM is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + OpenFOAM is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>. + +\*---------------------------------------------------------------------------*/ + +#include "DelaunayMesh.H" +#include "fvMesh.H" +#include "pointConversion.H" +#include "wallPolyPatch.H" +#include "processorPolyPatch.H" + +// * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * // + +template<class Triangulation> +void Foam::DelaunayMesh<Triangulation>::sortFaces +( + faceList& faces, + labelList& owner, + labelList& neighbour +) const +{ + // Upper triangular order: + // + owner is sorted in ascending cell order + // + within each block of equal value for owner, neighbour is sorted in + // ascending cell order. + // + faces sorted to correspond + // e.g. + // owner | neighbour + // 0 | 2 + // 0 | 23 + // 0 | 71 + // 1 | 23 + // 1 | 24 + // 1 | 91 + + List<labelPair> ownerNeighbourPair(owner.size()); + + forAll(ownerNeighbourPair, oNI) + { + ownerNeighbourPair[oNI] = labelPair(owner[oNI], neighbour[oNI]); + } + + Info<< nl + << "Sorting faces, owner and neighbour into upper triangular order" + << endl; + + labelList oldToNew; + + sortedOrder(ownerNeighbourPair, oldToNew); + + oldToNew = invert(oldToNew.size(), oldToNew); + + inplaceReorder(oldToNew, faces); + inplaceReorder(oldToNew, owner); + inplaceReorder(oldToNew, neighbour); +} + + +template<class Triangulation> +void Foam::DelaunayMesh<Triangulation>::addPatches +( + const label nInternalFaces, + faceList& faces, + labelList& owner, + labelList& patchSizes, + labelList& patchStarts, + const List<DynamicList<face> >& patchFaces, + const List<DynamicList<label> >& patchOwners +) const +{ + label nPatches = patchFaces.size(); + + patchSizes.setSize(nPatches, -1); + patchStarts.setSize(nPatches, -1); + + label nBoundaryFaces = 0; + + forAll(patchFaces, p) + { + patchSizes[p] = patchFaces[p].size(); + patchStarts[p] = nInternalFaces + nBoundaryFaces; + + nBoundaryFaces += patchSizes[p]; + } + + faces.setSize(nInternalFaces + nBoundaryFaces); + owner.setSize(nInternalFaces + nBoundaryFaces); + + label faceI = nInternalFaces; + + forAll(patchFaces, p) + { + forAll(patchFaces[p], f) + { + faces[faceI] = patchFaces[p][f]; + owner[faceI] = patchOwners[p][f]; + + faceI++; + } + } +} + + +// * * * * * * * * * * * * * * Member Operators * * * * * * * * * * * * * * // + +template<class Triangulation> +void Foam::DelaunayMesh<Triangulation>::printInfo(Ostream& os) const +{ + PrintTable<word, label> triInfoTable("Mesh Statistics"); + + triInfoTable.add("Points", Triangulation::number_of_vertices()); + triInfoTable.add("Edges", Triangulation::number_of_finite_edges()); + triInfoTable.add("Faces", Triangulation::number_of_finite_facets()); + triInfoTable.add("Cells", Triangulation::number_of_finite_cells()); + + scalar minSize = GREAT; + scalar maxSize = 0; + + for + ( + Finite_vertices_iterator vit = Triangulation::finite_vertices_begin(); + vit != Triangulation::finite_vertices_end(); + ++vit + ) + { + if (!vit->farPoint()) + { + minSize = min(vit->targetCellSize(), minSize); + maxSize = max(vit->targetCellSize(), maxSize); + } + } + + Info<< incrIndent; + triInfoTable.print(Info, true, true); + + Info<< "Size (Min/Max) = " + << returnReduce(minSize, minOp<scalar>()) << " " + << returnReduce(maxSize, maxOp<scalar>()) << endl; + + Info<< decrIndent; +} + + +template<class Triangulation> +Foam::autoPtr<Foam::fvMesh> +Foam::DelaunayMesh<Triangulation>::createMesh +( + const fileName& name, + const Time& runTime, + labelList& vertexMap, + labelList& cellMap +) const +{ + pointField points(Triangulation::number_of_vertices()); + faceList faces(Triangulation::number_of_finite_facets()); + labelList owner(Triangulation::number_of_finite_facets()); + labelList neighbour(Triangulation::number_of_finite_facets()); + + wordList patchNames(1, "cvMesh_defaultPatch"); + wordList patchTypes(1, wallPolyPatch::typeName); + + labelList patchSizes(1, 0); + labelList patchStarts(1, 0); + + List<DynamicList<face> > patchFaces(1, DynamicList<face>()); + List<DynamicList<label> > patchOwners(1, DynamicList<label>()); + + vertexMap.setSize(Triangulation::number_of_vertices()); + cellMap.setSize(Triangulation::number_of_finite_cells()); + + // Calculate pts and a map of point index to location in pts. + label vertI = 0; + + for + ( + Finite_vertices_iterator vit = Triangulation::finite_vertices_begin(); + vit != Triangulation::finite_vertices_end(); + ++vit + ) + { + if (!vit->farPoint()) + { + vertexMap[vit->index()] = vertI; + points[vertI] = topoint(vit->point()); + vertI++; + } + } + + points.setSize(vertI); + + // Index the cells + label cellI = 0; + + for + ( + Finite_cells_iterator cit = Triangulation::finite_cells_begin(); + cit != Triangulation::finite_cells_end(); + ++cit + ) + { + if + ( + !cit->hasFarPoint() + && !Triangulation::is_infinite(cit) + ) + { + cellMap[cit->cellIndex()] = cellI++; + } + } + + label faceI = 0; + labelList verticesOnTriFace(3, -1); + face newFace(verticesOnTriFace); + + for + ( + Finite_facets_iterator fit = Triangulation::finite_facets_begin(); + fit != Triangulation::finite_facets_end(); + ++fit + ) + { + const Cell_handle c1(fit->first); + const int oppositeVertex = fit->second; + const Cell_handle c2(c1->neighbor(oppositeVertex)); + + label c1I = Cb::ctFar; + bool c1Real = false; + if (!c1->hasFarPoint() && !Triangulation::is_infinite(c1)) + { + c1I = cellMap[c1->cellIndex()]; + c1Real = true; + } + + label c2I = Cb::ctFar; + bool c2Real = false; + if (!c2->hasFarPoint() && !Triangulation::is_infinite(c2)) + { + c2I = cellMap[c2->cellIndex()]; + c2Real = true; + } + + if (!c1Real && !c2Real) + { + // Both tets are outside, skip + continue; + } + + label ownerCell = -1; + label neighbourCell = -1; + + for (label i = 0; i < 3; i++) + { + verticesOnTriFace[i] = vertexMap + [ + c1->vertex + ( + Triangulation::vertex_triple_index(oppositeVertex, i) + )->index() + ]; + } + + newFace = face(verticesOnTriFace); + + if (!c1Real || !c2Real) + { + // Boundary face... + if (!c1Real) + { + //... with c1 outside + ownerCell = c2I; + } + else + { + // ... with c2 outside + ownerCell = c1I; + + reverse(newFace); + } + + patchFaces[0].append(newFace); + patchOwners[0].append(ownerCell); + } + else + { + // Internal face... + if (c1I < c2I) + { + // ...with c1 as the ownerCell + ownerCell = c1I; + neighbourCell = c2I; + + reverse(newFace); + } + else + { + // ...with c2 as the ownerCell + ownerCell = c2I; + neighbourCell = c1I; + } + + faces[faceI] = newFace; + owner[faceI] = ownerCell; + neighbour[faceI] = neighbourCell; + faceI++; + } + } + + faces.setSize(faceI); + owner.setSize(faceI); + neighbour.setSize(faceI); + + sortFaces(faces, owner, neighbour); + + addPatches + ( + faceI, + faces, + owner, + patchSizes, + patchStarts, + patchFaces, + patchOwners + ); + + autoPtr<fvMesh> meshPtr + ( + new fvMesh + ( + IOobject + ( + name, + runTime.timeName(), + runTime, + IOobject::NO_READ, + IOobject::NO_WRITE + ), + xferMove(points), + xferMove(faces), + xferMove(owner), + xferMove(neighbour) + ) + ); + + List<polyPatch*> patches(patchStarts.size()); + + label nValidPatches = 0; + + forAll(patches, p) + { + patches[nValidPatches] = polyPatch::New + ( + patchTypes[p], + patchNames[p], + patchSizes[p], + patchStarts[p], + nValidPatches, + meshPtr().boundaryMesh() + ).ptr(); + + nValidPatches++; + } + + patches.setSize(nValidPatches); + + meshPtr().addFvPatches(patches); + + return meshPtr; +} + + +// ************************************************************************* // diff --git a/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/DelaunayMesh/DistributedDelaunayMesh.C b/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/DelaunayMesh/DistributedDelaunayMesh.C new file mode 100644 index 0000000000000000000000000000000000000000..b2ed781b8b389e32c165a9fc6cddfcb3d930dc1b --- /dev/null +++ b/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/DelaunayMesh/DistributedDelaunayMesh.C @@ -0,0 +1,938 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2012 OpenFOAM Foundation + \\/ M anipulation | +------------------------------------------------------------------------------- +License + This file is part of OpenFOAM. + + OpenFOAM is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + OpenFOAM is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>. + +\*---------------------------------------------------------------------------*/ + +#include "DistributedDelaunayMesh.H" +#include "meshSearch.H" +#include "mapDistribute.H" +#include "zeroGradientFvPatchFields.H" +#include "pointConversion.H" +#include "indexedVertexEnum.H" +#include "IOmanip.H" + +// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * // + + +// * * * * * * * * * * * * Static Member Functions * * * * * * * * * * * * * // + +template<class Triangulation> +Foam::autoPtr<Foam::mapDistribute> +Foam::DistributedDelaunayMesh<Triangulation>::buildMap +( + const List<label>& toProc +) +{ + // Determine send map + // ~~~~~~~~~~~~~~~~~~ + + // 1. Count + labelList nSend(Pstream::nProcs(), 0); + + forAll(toProc, i) + { + label procI = toProc[i]; + + nSend[procI]++; + } + + // Send over how many I need to receive + // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + labelListList sendSizes(Pstream::nProcs()); + + sendSizes[Pstream::myProcNo()] = nSend; + + combineReduce(sendSizes, UPstream::listEq()); + + // 2. Size sendMap + labelListList sendMap(Pstream::nProcs()); + + forAll(nSend, procI) + { + sendMap[procI].setSize(nSend[procI]); + + nSend[procI] = 0; + } + + // 3. Fill sendMap + forAll(toProc, i) + { + label procI = toProc[i]; + + sendMap[procI][nSend[procI]++] = i; + } + + // Determine receive map + // ~~~~~~~~~~~~~~~~~~~~~ + + labelListList constructMap(Pstream::nProcs()); + + // Local transfers first + constructMap[Pstream::myProcNo()] = identity + ( + sendMap[Pstream::myProcNo()].size() + ); + + label constructSize = constructMap[Pstream::myProcNo()].size(); + + forAll(constructMap, procI) + { + if (procI != Pstream::myProcNo()) + { + label nRecv = sendSizes[procI][Pstream::myProcNo()]; + + constructMap[procI].setSize(nRecv); + + for (label i = 0; i < nRecv; i++) + { + constructMap[procI][i] = constructSize++; + } + } + } + + return autoPtr<mapDistribute> + ( + new mapDistribute + ( + constructSize, + sendMap.xfer(), + constructMap.xfer() + ) + ); +} + + +// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // + +template<class Triangulation> +Foam::DistributedDelaunayMesh<Triangulation>::DistributedDelaunayMesh() +: + DelaunayMesh<Triangulation>(), + allBackgroundMeshBounds_() +{} + + +// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * // + +template<class Triangulation> +Foam::DistributedDelaunayMesh<Triangulation>::~DistributedDelaunayMesh() +{} + + +// * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * // + +template<class Triangulation> +bool Foam::DistributedDelaunayMesh<Triangulation>::distributeBoundBoxes +( + const boundBox& bb +) +{ + allBackgroundMeshBounds_.reset(new List<boundBox>(Pstream::nProcs())); + + // Give the bounds of every processor to every other processor + allBackgroundMeshBounds_()[Pstream::myProcNo()] = bb; + + Pstream::gatherList(allBackgroundMeshBounds_()); + Pstream::scatterList(allBackgroundMeshBounds_()); + + return true; +} + + +template<class Triangulation> +bool Foam::DistributedDelaunayMesh<Triangulation>::isLocal +( + const Vertex_handle& v +) const +{ + return isLocal(v->procIndex()); +} + + +template<class Triangulation> +bool Foam::DistributedDelaunayMesh<Triangulation>::isLocal +( + const label localProcIndex +) const +{ + return localProcIndex == Pstream::myProcNo(); +} + + +template<class Triangulation> +Foam::labelList Foam::DistributedDelaunayMesh<Triangulation>::overlapProcessors +( + const point& centre, + const scalar radiusSqr +) const +{ + DynamicList<label> toProc(Pstream::nProcs()); + + forAll(allBackgroundMeshBounds_(), procI) + { + // Test against the bounding box of the processor + if + ( + !isLocal(procI) + && allBackgroundMeshBounds_()[procI].overlaps(centre, radiusSqr) + ) + { + toProc.append(procI); + } + } + + return toProc; +} + + +template<class Triangulation> +bool Foam::DistributedDelaunayMesh<Triangulation>::checkProcBoundaryCell +( + const Cell_handle& cit, + Map<labelList>& circumsphereOverlaps +) const +{ + const Foam::point& cc = cit->dual(); + + const scalar crSqr = magSqr + ( + cc - topoint(cit->vertex(0)->point()) + ); + + labelList circumsphereOverlap = overlapProcessors + ( + cc, + sqr(1.01)*crSqr + ); + + cit->cellIndex() = this->getNewCellIndex(); + + if (!circumsphereOverlap.empty()) + { + circumsphereOverlaps.insert(cit->cellIndex(), circumsphereOverlap); + + return true; + } + + return false; +} + + +template<class Triangulation> +void Foam::DistributedDelaunayMesh<Triangulation>::findProcessorBoundaryCells +( + Map<labelList>& circumsphereOverlaps +) const +{ + // Start by assuming that all the cells have no index + // If they do, they have already been visited so ignore them + + labelHashSet cellToCheck + ( + Triangulation::number_of_finite_cells() + /Pstream::nProcs() + ); + + for + ( + All_cells_iterator cit = Triangulation::all_cells_begin(); + cit != Triangulation::all_cells_end(); + ++cit + ) + { + if (Triangulation::is_infinite(cit)) + { + // Index of infinite vertex in this cell. + int i = cit->index(Triangulation::infinite_vertex()); + + Cell_handle c = cit->neighbor(i); + + if (c->unassigned()) + { + c->cellIndex() = this->getNewCellIndex(); + + if (checkProcBoundaryCell(c, circumsphereOverlaps)) + { + cellToCheck.insert(c->cellIndex()); + } + } + } + else if (cit->parallelDualVertex()) + { + if (cit->unassigned()) + { + if (checkProcBoundaryCell(cit, circumsphereOverlaps)) + { + cellToCheck.insert(cit->cellIndex()); + } + } + } + } + + for + ( + Finite_cells_iterator cit = Triangulation::finite_cells_begin(); + cit != Triangulation::finite_cells_end(); + ++cit + ) + { + if (cellToCheck.found(cit->cellIndex())) + { + // Get the neighbours and check them + for (label adjCellI = 0; adjCellI < 4; ++adjCellI) + { + Cell_handle citNeighbor = cit->neighbor(adjCellI); + + // Ignore if has far point or previously visited + if + ( + !citNeighbor->unassigned() + || !citNeighbor->internalOrBoundaryDualVertex() + || Triangulation::is_infinite(citNeighbor) + ) + { + continue; + } + + checkProcBoundaryCell + ( + citNeighbor, + circumsphereOverlaps + ); + } + } + } +} + + +template<class Triangulation> +void Foam::DistributedDelaunayMesh<Triangulation>::markVerticesToRefer +( + const Map<labelList>& circumsphereOverlaps, + PtrList<labelPairHashSet>& referralVertices, + DynamicList<label>& targetProcessor, + DynamicList<Vb>& parallelInfluenceVertices +) +{ + // Relying on the order of iteration of cells being the same as before + for + ( + Finite_cells_iterator cit = Triangulation::finite_cells_begin(); + cit != Triangulation::finite_cells_end(); + ++cit + ) + { + if (Triangulation::is_infinite(cit)) + { + continue; + } + + Map<labelList>::const_iterator iter = + circumsphereOverlaps.find(cit->cellIndex()); + + // Pre-tested circumsphere potential influence + if (iter != circumsphereOverlaps.cend()) + { + const labelList& citOverlaps = iter(); + + forAll(citOverlaps, cOI) + { + label procI = citOverlaps[cOI]; + + for (int i = 0; i < 4; i++) + { + Vertex_handle v = cit->vertex(i); + + if (v->farPoint()) + { + continue; + } + + label vProcIndex = v->procIndex(); + label vIndex = v->index(); + + const labelPair procIndexPair(vProcIndex, vIndex); + + // Using the hashSet to ensure that each vertex is only + // referred once to each processor. + // Do not refer a vertex to its own processor. + if (vProcIndex != procI) + { + if (referralVertices[procI].insert(procIndexPair)) + { + targetProcessor.append(procI); + + parallelInfluenceVertices.append + ( + Vb + ( + v->point(), + v->index(), + v->type(), + v->procIndex() + ) + ); + + parallelInfluenceVertices.last().targetCellSize() = + v->targetCellSize(); + parallelInfluenceVertices.last().alignment() = + v->alignment(); + } + } + } + } + } + } +} + + +template<class Triangulation> +Foam::label Foam::DistributedDelaunayMesh<Triangulation>::referVertices +( + const DynamicList<label>& targetProcessor, + DynamicList<Vb>& parallelVertices, + PtrList<labelPairHashSet>& referralVertices, + labelPairHashSet& receivedVertices +) +{ + DynamicList<Vb> referredVertices(targetProcessor.size()); + + const label preDistributionSize = parallelVertices.size(); + + mapDistribute pointMap = buildMap(targetProcessor); + + // Make a copy of the original list. + DynamicList<Vb> originalParallelVertices(parallelVertices); + + pointMap.distribute(parallelVertices); + + for (label procI = 0; procI < Pstream::nProcs(); procI++) + { + const labelList& constructMap = pointMap.constructMap()[procI]; + + if (constructMap.size()) + { + forAll(constructMap, i) + { + const Vb& v = parallelVertices[constructMap[i]]; + + if + ( + v.procIndex() != Pstream::myProcNo() + && !receivedVertices.found(labelPair(v.procIndex(), v.index())) + ) + { + referredVertices.append(v); + + receivedVertices.insert + ( + labelPair(v.procIndex(), v.index()) + ); + } + } + } + } + + label preInsertionSize = Triangulation::number_of_vertices(); + + labelPairHashSet pointsNotInserted = rangeInsertReferredWithInfo + ( + referredVertices.begin(), + referredVertices.end() + ); + + if (!pointsNotInserted.empty()) + { + for + ( + typename labelPairHashSet::const_iterator iter + = pointsNotInserted.begin(); + iter != pointsNotInserted.end(); + ++iter + ) + { + if (receivedVertices.found(iter.key())) + { + receivedVertices.erase(iter.key()); + } + } + } + + boolList pointInserted(parallelVertices.size(), true); + + forAll(parallelVertices, vI) + { + const labelPair procIndexI + ( + parallelVertices[vI].procIndex(), + parallelVertices[vI].index() + ); + + if (pointsNotInserted.found(procIndexI)) + { + pointInserted[vI] = false; + } + } + + pointMap.reverseDistribute(preDistributionSize, pointInserted); + + forAll(originalParallelVertices, vI) + { + const label procIndex = targetProcessor[vI]; + + if (!pointInserted[vI]) + { + if (referralVertices[procIndex].size()) + { + if + ( + !referralVertices[procIndex].unset + ( + labelPair + ( + originalParallelVertices[vI].procIndex(), + originalParallelVertices[vI].index() + ) + ) + ) + { + Pout<< "*** not found " + << originalParallelVertices[vI].procIndex() + << " " << originalParallelVertices[vI].index() << endl; + } + + } + } + } + + label postInsertionSize = Triangulation::number_of_vertices(); + + reduce(preInsertionSize, sumOp<label>()); + reduce(postInsertionSize, sumOp<label>()); + + label nTotalToInsert = referredVertices.size(); + + reduce(nTotalToInsert, sumOp<label>()); + + if (preInsertionSize + nTotalToInsert != postInsertionSize) + { + label nNotInserted = + returnReduce(pointsNotInserted.size(), sumOp<label>()); + + Info<< " Inserted = " + << setw(name(label(Triangulation::number_of_finite_cells())).size()) + << nTotalToInsert - nNotInserted + << " / " << nTotalToInsert << endl; + + nTotalToInsert -= nNotInserted; + } + else + { + Info<< " Inserted = " << nTotalToInsert << endl; + } + + return nTotalToInsert; +} + + +template<class Triangulation> +void Foam::DistributedDelaunayMesh<Triangulation>::sync +( + const boundBox& bb, + PtrList<labelPairHashSet>& referralVertices, + labelPairHashSet& receivedVertices, + bool iterateReferral +) +{ + if (!Pstream::parRun()) + { + return; + } + + if (allBackgroundMeshBounds_.empty()) + { + distributeBoundBoxes(bb); + } + + label nVerts = Triangulation::number_of_vertices(); + label nCells = Triangulation::number_of_finite_cells(); + + DynamicList<Vb> parallelInfluenceVertices(0.1*nVerts); + DynamicList<label> targetProcessor(0.1*nVerts); + + // Some of these values will not be used, i.e. for non-real cells + DynamicList<Foam::point> circumcentre(0.1*nVerts); + DynamicList<scalar> circumradiusSqr(0.1*nVerts); + + Map<labelList> circumsphereOverlaps(nCells); + + findProcessorBoundaryCells(circumsphereOverlaps); + + Info<< " Influences = " + << setw(name(nCells).size()) + << returnReduce(circumsphereOverlaps.size(), sumOp<label>()) << " / " + << returnReduce(nCells, sumOp<label>()); + + markVerticesToRefer + ( + circumsphereOverlaps, + referralVertices, + targetProcessor, + parallelInfluenceVertices + ); + + referVertices + ( + targetProcessor, + parallelInfluenceVertices, + referralVertices, + receivedVertices + ); + + if (iterateReferral) + { + label oldNReferred = 0; + label nIterations = 1; + + Info<< incrIndent << indent + << "Iteratively referring referred vertices..." + << endl; + do + { + Info<< indent << "Iteration " << nIterations++ << ":"; + + circumsphereOverlaps.clear(); + targetProcessor.clear(); + parallelInfluenceVertices.clear(); + + findProcessorBoundaryCells(circumsphereOverlaps); + + nCells = Triangulation::number_of_finite_cells(); + + Info<< " Influences = " + << setw(name(nCells).size()) + << returnReduce(circumsphereOverlaps.size(), sumOp<label>()) + << " / " + << returnReduce(nCells, sumOp<label>()); + + markVerticesToRefer + ( + circumsphereOverlaps, + referralVertices, + targetProcessor, + parallelInfluenceVertices + ); + + label nReferred = referVertices + ( + targetProcessor, + parallelInfluenceVertices, + referralVertices, + receivedVertices + ); + + if (nReferred == 0 || nReferred == oldNReferred) + { + break; + } + + oldNReferred = nReferred; + + } while (true); + + Info<< decrIndent; + } +} + + +// * * * * * * * * * * * * Protected Member Functions * * * * * * * * * * * // + + +// * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * * // + +template<class Triangulation> +bool Foam::DistributedDelaunayMesh<Triangulation>::distribute +( + const boundBox& bb +) +{ + notImplemented + ( + "Foam::DistributedDelaunayMesh<Triangulation>::distribute" + "(" + " const boundBox& bb" + ")" + ); + + if (!Pstream::parRun()) + { + return false; + } + + distributeBoundBoxes(bb); + + return true; +} + + +template<class Triangulation> +Foam::autoPtr<Foam::mapDistribute> +Foam::DistributedDelaunayMesh<Triangulation>::distribute +( + const backgroundMeshDecomposition& decomposition +) +{ + if (!Pstream::parRun()) + { + return autoPtr<mapDistribute>(); + } + + distributeBoundBoxes(decomposition.procBounds()); + + DynamicList<point> points(Triangulation::number_of_vertices()); + + for + ( + Finite_vertices_iterator vit = Triangulation::finite_vertices_begin(); + vit != Triangulation::finite_vertices_end(); + ++vit + ) + { + if (vit->real()) + { + points.append(topoint(vit->point())); + } + } + + autoPtr<mapDistribute> mapDist = decomposition.distributePoints(points); + + return mapDist; +} + + +template<class Triangulation> +void Foam::DistributedDelaunayMesh<Triangulation>::sync(const boundBox& bb) +{ + if (!Pstream::parRun()) + { + return; + } + + if (allBackgroundMeshBounds_.empty()) + { + distributeBoundBoxes(bb); + } + + const label nApproxReferred = + Triangulation::number_of_vertices() + /Pstream::nProcs(); + + PtrList<labelPairHashSet> referralVertices(Pstream::nProcs()); + forAll(referralVertices, procI) + { + if (!isLocal(procI)) + { + referralVertices.set(procI, new labelPairHashSet(nApproxReferred)); + } + } + + labelPairHashSet receivedVertices(nApproxReferred); + + sync + ( + bb, + referralVertices, + receivedVertices, + true + ); +} + + +template<class Triangulation> +template<class PointIterator> +typename Foam::DistributedDelaunayMesh<Triangulation>::labelPairHashSet +Foam::DistributedDelaunayMesh<Triangulation>::rangeInsertReferredWithInfo +( + PointIterator begin, + PointIterator end, + bool printErrors +) +{ + const boundBox& bb = allBackgroundMeshBounds_()[Pstream::myProcNo()]; + + typedef DynamicList + < + std::pair<scalar, label> + > vectorPairPointIndex; + + vectorPairPointIndex pointsBbDistSqr; + + label count = 0; + for (PointIterator it = begin; it != end; ++it) + { + const Foam::point samplePoint(topoint(it->point())); + + scalar distFromBbSqr = 0; + + if (!bb.contains(samplePoint)) + { + const Foam::point nearestPoint = bb.nearest(samplePoint); + + distFromBbSqr = magSqr(nearestPoint - samplePoint); + } + + pointsBbDistSqr.append + ( + std::make_pair(distFromBbSqr, count++) + ); + } + + std::random_shuffle(pointsBbDistSqr.begin(), pointsBbDistSqr.end()); + + // Sort in ascending order by the distance of the point from the centre + // of the processor bounding box + sort(pointsBbDistSqr.begin(), pointsBbDistSqr.end()); + + typename Triangulation::Vertex_handle hint; + + typename Triangulation::Locate_type lt; + int li, lj; + + label nNotInserted = 0; + + labelPairHashSet uninserted + ( + Triangulation::number_of_vertices() + /Pstream::nProcs() + ); + + for + ( + typename vectorPairPointIndex::const_iterator p = + pointsBbDistSqr.begin(); + p != pointsBbDistSqr.end(); + ++p + ) + { + const size_t checkInsertion = Triangulation::number_of_vertices(); + + const Vb& vert = *(begin + p->second); + const Point& pointToInsert = vert.point(); + + // Locate the point + Cell_handle c = Triangulation::locate(pointToInsert, lt, li, lj, hint); + + if (lt == Triangulation::VERTEX) + { + if (printErrors) + { + Vertex_handle nearV = + Triangulation::nearest_vertex(pointToInsert); + + Pout<< "Failed insertion, point already exists" << nl + << "Failed insertion : " << vert.info() + << " nearest : " << nearV->info(); + } + + uninserted.insert(labelPair(vert.procIndex(), vert.index())); + nNotInserted++; + + continue; + } + + // Get the cells that conflict with p in a vector V, + // and a facet on the boundary of this hole in f. + std::vector<Cell_handle> V; + typename Triangulation::Facet f; + + Triangulation::find_conflicts + ( + pointToInsert, + c, + CGAL::Oneset_iterator<typename Triangulation::Facet>(f), + std::back_inserter(V) + ); + + bool insert = false; + for (size_t i = 0; i < V.size(); ++i) + { + if (V[i]->real() || V[i]->hasFarPoint()) + { + insert = true; + break; + } + } + + if (insert) + { + hint = Triangulation::insert_in_hole + ( + pointToInsert, + V.begin(), + V.end(), + f.first, + f.second + ); + + if (checkInsertion != Triangulation::number_of_vertices() - 1) + { + if (printErrors) + { + Vertex_handle nearV = + Triangulation::nearest_vertex(pointToInsert); + + Pout<< "Failed insertion : " << vert.info() + << " nearest : " << nearV->info(); + } + } + else + { + hint->index() = vert.index(); + hint->type() = vert.type(); + hint->procIndex() = vert.procIndex(); + hint->targetCellSize() = vert.targetCellSize(); + hint->alignment() = vert.alignment(); + } + } + else + { + uninserted.insert(labelPair(vert.procIndex(), vert.index())); + nNotInserted++; + } + } + + return uninserted; +} + + +// * * * * * * * * * * * * * * Member Operators * * * * * * * * * * * * * * // + + +// * * * * * * * * * * * * * * Friend Functions * * * * * * * * * * * * * * // + + +// * * * * * * * * * * * * * * Friend Operators * * * * * * * * * * * * * * // + + +// ************************************************************************* // diff --git a/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/DelaunayMesh/DistributedDelaunayMesh.H b/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/DelaunayMesh/DistributedDelaunayMesh.H new file mode 100644 index 0000000000000000000000000000000000000000..fcc5d8c2ba8926842f6d5a5d205334cab3e7f992 --- /dev/null +++ b/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/DelaunayMesh/DistributedDelaunayMesh.H @@ -0,0 +1,208 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2012 OpenFOAM Foundation + \\/ M anipulation | +------------------------------------------------------------------------------- +License + This file is part of OpenFOAM. + + OpenFOAM is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + OpenFOAM is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>. + +Class + Foam::DistributedDelaunayMesh + +Description + +SourceFiles + DistributedDelaunayMeshI.H + DistributedDelaunayMesh.C + DistributedDelaunayMeshIO.C + +\*---------------------------------------------------------------------------*/ + +#ifndef DistributedDelaunayMesh_H +#define DistributedDelaunayMesh_H + +#include "DelaunayMesh.H" +#include "backgroundMeshDecomposition.H" +#include "autoPtr.H" +#include "boundBox.H" +#include "indexedVertex.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ + +class mapDistribute; + +/*---------------------------------------------------------------------------*\ + Class DistributedDelaunayMesh Declaration +\*---------------------------------------------------------------------------*/ + +template<class Triangulation> +class DistributedDelaunayMesh +: + public DelaunayMesh<Triangulation> +{ +public: + + typedef typename Triangulation::Vertex_handle Vertex_handle; + typedef typename Triangulation::Cell_handle Cell_handle; + typedef typename Triangulation::Point Point; + + typedef typename Triangulation::Finite_vertices_iterator + Finite_vertices_iterator; + typedef typename Triangulation::Finite_cells_iterator + Finite_cells_iterator; + typedef typename Triangulation::All_cells_iterator + All_cells_iterator; + + typedef typename DelaunayMesh<Triangulation>::labelPairHashSet + labelPairHashSet; + + +private: + + autoPtr<List<boundBox> > allBackgroundMeshBounds_; + + + // Private Member Functions + + //- + bool distributeBoundBoxes(const boundBox& bb); + + //- + bool isLocal(const Vertex_handle& v) const; + + bool isLocal(const label localProcIndex) const; + + labelList overlapProcessors + ( + const point& centre, + const scalar radiusSqr + ) const; + + bool checkProcBoundaryCell + ( + const Cell_handle& cit, + Map<labelList>& circumsphereOverlaps + ) const; + + void findProcessorBoundaryCells + ( + Map<labelList>& circumsphereOverlaps + ) const; + + void markVerticesToRefer + ( + const Map<labelList>& circumsphereOverlaps, + PtrList<labelPairHashSet>& referralVertices, + DynamicList<label>& targetProcessor, + DynamicList<Vb>& parallelInfluenceVertices + ); + + label referVertices + ( + const DynamicList<label>& targetProcessor, + DynamicList<Vb>& parallelVertices, + PtrList<labelPairHashSet>& referralVertices, + labelPairHashSet& receivedVertices + ); + + //- Disallow default bitwise copy construct + DistributedDelaunayMesh(const DistributedDelaunayMesh<Triangulation>&); + + //- Disallow default bitwise assignment + void operator=(const DistributedDelaunayMesh<Triangulation>&); + + +public: + + // Constructors + + //- Construct from components + DistributedDelaunayMesh(); + + + //- Destructor + ~DistributedDelaunayMesh(); + + + // Member Functions + + //- Build a mapDistribute for the supplied destination processor data + static autoPtr<mapDistribute> buildMap(const List<label>& toProc); + + //- + bool distribute(const boundBox& bb); + + autoPtr<mapDistribute> distribute + ( + const backgroundMeshDecomposition& decomposition + ); + + //- Refer vertices so that the processor interfaces are consistent + void sync(const boundBox& bb); + + //- Refer vertices so that the processor interfaces are consistent + void sync + ( + const boundBox& bb, + PtrList<labelPairHashSet>& referralVertices, + labelPairHashSet& receivedVertices, + bool iterateReferral = true + ); + + //- Inserts points into the triangulation if the point is within + // the circumsphere of another cell. Returns HashSet of failed + // point insertions + template<class PointIterator> + labelPairHashSet rangeInsertReferredWithInfo + ( + PointIterator begin, + PointIterator end, + bool printErrors = true + ); + +// distributeField(); + + + // Queries + + +}; + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace Foam + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +//#include "DistributedDelaunayMeshI.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#ifdef NoRepository +# include "DistributedDelaunayMesh.C" +#endif + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#endif + +// ************************************************************************* // diff --git a/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/Make/files b/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/Make/files new file mode 100644 index 0000000000000000000000000000000000000000..c6e553f64c32b3e7a61d3b26908ecfa3a9e35172 --- /dev/null +++ b/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/Make/files @@ -0,0 +1,66 @@ +#include CGAL_FILES + +conformalVoronoiMesh/indexedVertex/indexedVertexEnum.C +conformalVoronoiMesh/indexedCell/indexedCellEnum.C + +conformalVoronoiMesh/conformalVoronoiMesh.C +conformalVoronoiMesh/conformalVoronoiMeshCalcDualMesh.C +conformalVoronoiMesh/conformalVoronoiMeshConformToSurface.C +conformalVoronoiMesh/conformalVoronoiMeshIO.C +conformalVoronoiMesh/conformalVoronoiMeshFeaturePoints.C +conformalVoronoiMesh/conformalVoronoiMeshFeaturePointSpecialisations.C + +cvControls/cvControls.C + +conformationSurfaces/conformationSurfaces.C + +backgroundMeshDecomposition/backgroundMeshDecomposition.C + +cellShapeControl/cellShapeControl/cellShapeControl.C + +cellShapeControl/cellShapeControlMesh/cellShapeControlMesh.C + +cellSizeAndAlignmentControl = cellShapeControl/cellSizeAndAlignmentControl +$(cellSizeAndAlignmentControl)/cellSizeAndAlignmentControls.C +$(cellSizeAndAlignmentControl)/cellSizeAndAlignmentControl/cellSizeAndAlignmentControl.C +$(cellSizeAndAlignmentControl)/fileControl/fileControl.C +$(cellSizeAndAlignmentControl)/searchableSurfaceControl/searchableSurfaceControl.C +/*cellShapeControl/pQuadCoorControl/pQuadCoorControl.C*/ + +cellShapeControl/cellAspectRatioControl/cellAspectRatioControl.C + +/*cellSizeControlSurfaces/cellSizeControlSurfaces.C*/ + +cellSizeFunctions = cellSizeControlSurfaces/cellSizeFunction +$(cellSizeFunctions)/cellSizeFunction/cellSizeFunction.C +$(cellSizeFunctions)/uniform/uniform.C +$(cellSizeFunctions)/uniformDistance/uniformDistance.C +$(cellSizeFunctions)/linearDistance/linearDistance.C +$(cellSizeFunctions)/surfaceOffsetLinearDistance/surfaceOffsetLinearDistance.C +$(cellSizeFunctions)/linearSpatial/linearSpatial.C + +surfaceCellSizeFunctions = cellSizeControlSurfaces/surfaceCellSizeFunction +$(surfaceCellSizeFunctions)/surfaceCellSizeFunction/surfaceCellSizeFunction.C +$(surfaceCellSizeFunctions)/uniformValue/uniformValue.C +$(surfaceCellSizeFunctions)/nonUniformField/nonUniformField.C + +cellSizeCalculationType = $(surfaceCellSizeFunctions)/cellSizeCalculationType +$(cellSizeCalculationType)/cellSizeCalculationType/cellSizeCalculationType.C +$(cellSizeCalculationType)/fieldFromFile/fieldFromFile.C +$(cellSizeCalculationType)/automatic/automatic.C + +initialPointsMethod/initialPointsMethod/initialPointsMethod.C +initialPointsMethod/uniformGrid/uniformGrid.C +initialPointsMethod/bodyCentredCubic/bodyCentredCubic.C +initialPointsMethod/faceCentredCubic/faceCentredCubic.C +initialPointsMethod/pointFile/pointFile.C +initialPointsMethod/autoDensity/autoDensity.C + +relaxationModel/relaxationModel/relaxationModel.C +relaxationModel/adaptiveLinear/adaptiveLinear.C +relaxationModel/rampHoldFall/rampHoldFall.C + +faceAreaWeightModel/faceAreaWeightModel/faceAreaWeightModel.C +faceAreaWeightModel/piecewiseLinearRamp/piecewiseLinearRamp.C + +LIB = $(FOAM_LIBBIN)/libconformalVoronoiMesh diff --git a/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/Make/options b/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/Make/options new file mode 100644 index 0000000000000000000000000000000000000000..03ee51a4f6366bfdaee9196edb37451f69cfd8b4 --- /dev/null +++ b/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/Make/options @@ -0,0 +1,33 @@ +EXE_DEBUG = -DFULLDEBUG -g -O0 +EXE_FROUNDING_MATH = -frounding-math +EXE_NDEBUG = -DNDEBUG + +CGAL_EXACT = /*-DCGAL_DONT_USE_LAZY_KERNEL*/ +CGAL_INEXACT = -DCGAL_INEXACT + +include $(GENERAL_RULES)/CGAL +FFLAGS = -DCGAL_FILES='"${CGAL_ARCH_PATH}/share/files"' + +EXE_INC = \ + ${EXE_FROUNDING_MATH} \ + ${EXE_NDEBUG} \ + ${CGAL_INEXACT} \ + ${CGAL_INC} \ + -I$(LIB_SRC)/finiteVolume/lnInclude \ + -I$(LIB_SRC)/meshTools/lnInclude \ + -I$(LIB_SRC)/parallel/decompose/decompositionMethods/lnInclude \ + -I$(LIB_SRC)/edgeMesh/lnInclude \ + -I$(LIB_SRC)/fileFormats/lnInclude \ + -I$(LIB_SRC)/dynamicMesh/lnInclude \ + -I$(LIB_SRC)/triSurface/lnInclude \ + -I$(LIB_SRC)/sampling/lnInclude \ + -IPrintTable \ + -I../vectorTools + +LIB_LIBS = \ + -lmeshTools \ + -ledgeMesh \ + -lfileFormats \ + -ltriSurface \ + -ldynamicMesh \ + -lsampling diff --git a/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/PrintTable/PrintTable.C b/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/PrintTable/PrintTable.C new file mode 100644 index 0000000000000000000000000000000000000000..4b0c747f0fa66361f4d588a2e56dc1d7e22d0b90 --- /dev/null +++ b/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/PrintTable/PrintTable.C @@ -0,0 +1,234 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2012-2013 OpenFOAM Foundation + \\/ M anipulation | +------------------------------------------------------------------------------- +License + This file is part of OpenFOAM. + + OpenFOAM is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + OpenFOAM is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>. + +\*---------------------------------------------------------------------------*/ + +#include "PrintTable.H" + +// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // + +template<class KeyType, class DataType> +Foam::PrintTable<KeyType, DataType>::PrintTable() +: + table_(), + title_(string::null) +{} + + +template<class KeyType, class DataType> +Foam::PrintTable<KeyType, DataType>::PrintTable(const string& title) +: + table_(), + title_(title) +{} + + +template<class KeyType, class DataType> +Foam::PrintTable<KeyType, DataType>::PrintTable +( + const PrintTable<KeyType, DataType>& table +) +: + table_(table.table_), + title_(table.title_) +{} + + +// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * // + +template<class KeyType, class DataType> +Foam::PrintTable<KeyType, DataType>::~PrintTable() +{} + + +// * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * * // + +template<class KeyType, class DataType> +void Foam::PrintTable<KeyType, DataType>::print +( + Ostream& os, + const bool printSum, + const bool printAverage +) const +{ + HashTable<HashTable<DataType, label>, KeyType> combinedTable; + + List<HashTableData> procData(Pstream::nProcs(), HashTableData()); + + procData[Pstream::myProcNo()] = table_; + + Pstream::gatherList(procData); + + if (Pstream::master()) + { + label largestKeyLength = 6; + label largestDataLength = 0; + + List<label> largestProcSize(Pstream::nProcs(), 0); + + forAll(procData, procI) + { + const HashTableData& procIData = procData[procI]; + + for + ( + typename HashTableData::const_iterator iter = procIData.begin(); + iter != procIData.end(); + ++iter + ) + { + if (!combinedTable.found(iter.key())) + { + combinedTable.insert + ( + iter.key(), + HashTable<DataType, label>() + ); + } + + HashTable<DataType, label>& key = combinedTable[iter.key()]; + + key.insert(procI, iter()); + + for + ( + typename HashTable<DataType, label> + ::const_iterator dataIter = key.begin(); + dataIter != key.end(); + ++dataIter + ) + { + std::ostringstream buf; + buf << dataIter(); + + largestDataLength = max + ( + largestDataLength, + label(buf.str().length()) + ); + } + + std::ostringstream buf; + buf << iter.key(); + + largestKeyLength = max + ( + largestKeyLength, + label(buf.str().length()) + ); + } + } + + os.width(largestKeyLength); + os << nl << indent << tab << title_.c_str() << endl; + + os.width(largestKeyLength); + os << indent << "Proc #"; + forAll(procData, procI) + { + os << tab; + os.width(largestDataLength); + os << procI; + } + + if (printSum) + { + os << tab; + os.width(largestDataLength); + os << "Sum"; + } + + if (printAverage) + { + os << tab; + os.width(largestDataLength); + os << "Average"; + } + + os << endl; + + const List<KeyType>& sortedTable = combinedTable.sortedToc(); + + forAll(sortedTable, keyI) + { + const HashTable<DataType, label>& procDataList + = combinedTable[sortedTable[keyI]]; + + os.width(largestKeyLength); + os << indent << sortedTable[keyI]; + + forAll(procDataList, elemI) + { + os << tab; + os.width(largestDataLength); + os << procDataList[elemI]; + } + + if (printSum) + { + DataType sum = 0; + forAll(procDataList, elemI) + { + sum += procDataList[elemI]; + } + + os << tab; + os.width(largestDataLength); + os << sum; + + if (printAverage) + { + os << tab; + os.width(largestDataLength); + os << sum/Pstream::nProcs(); + } + } + + os << endl; + } + } +} + + +// * * * * * * * * * * * * * * Member Operators * * * * * * * * * * * * * * // + +template<class KeyType, class DataType> +void Foam::PrintTable<KeyType, DataType>::operator= +( + const PrintTable<KeyType, DataType>& rhs +) +{ + // Check for assignment to self + if (this == &rhs) + { + FatalErrorIn + ( + "Foam::PrintTable<KeyType, DataType>::operator=" + "(const Foam::PrintTable<KeyType, DataType>&)" + ) << "Attempted assignment to self" + << abort(FatalError); + } +} + + +// ************************************************************************* // diff --git a/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/PrintTable/PrintTable.H b/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/PrintTable/PrintTable.H new file mode 100644 index 0000000000000000000000000000000000000000..9f9e8b9594bbfa702fb83ce2ccdd9b0671cfd79a --- /dev/null +++ b/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/PrintTable/PrintTable.H @@ -0,0 +1,140 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2012-2013 OpenFOAM Foundation + \\/ M anipulation | +------------------------------------------------------------------------------- +License + This file is part of OpenFOAM. + + OpenFOAM is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + OpenFOAM is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>. + +Class + Foam::PrintTable + +Description + Print a table in parallel, e.g.; + + \verbatim + Vertex Type Information + Proc # 0 1 2 3 + Total 145680 145278 145751 145359 + Unassigned 0 0 0 0 + nExternalFeatureEdge 883 829 828 960 + nExternalFeaturePoint 8 10 10 12 + nExternalSurface 9533 9488 9502 9482 + nFar 0 0 0 0 + nInternal 125494 125198 125642 125174 + nInternalFeatureEdge 238 241 241 240 + nInternalFeaturePoint 2 2 2 2 + nInternalNearBoundary 0 0 0 0 + nInternalSurface 9522 9510 9526 9489 + nReferred 7545 7497 7500 7587 + \endverbatim + +SourceFiles + PrintTableI.H + PrintTable.C + +\*---------------------------------------------------------------------------*/ + +#ifndef PrintTable_H +#define PrintTable_H + +#include "HashTable.H" +#include "Ostream.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ + +/*---------------------------------------------------------------------------*\ + Class PrintTable Declaration +\*---------------------------------------------------------------------------*/ + +template<class KeyType, class DataType> +class PrintTable +{ + typedef HashTable<DataType, KeyType> HashTableData; + + + // Private data + + //- Hash table holding the data + HashTableData table_; + + //- Title of the table + string title_; + + + // Private Member Functions + + //- Disallow default bitwise assignment + void operator=(const PrintTable<KeyType, DataType>&); + + +public: + + // Constructors + + //- Null constructor + PrintTable(); + + //- Construct with a title + explicit PrintTable(const string& title); + + //- Copy constructor + PrintTable(const PrintTable<KeyType, DataType>& table); + + + //- Destructor + ~PrintTable(); + + + // Member Functions + + //- Add an entry (D) to the given key(K) + void add(const KeyType& K, const DataType& D); + + //- Print the table + void print + ( + Ostream& os, + const bool printSum = false, + const bool printAverage = false + ) const; +}; + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace Foam + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#include "PrintTableI.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#ifdef NoRepository +# include "PrintTable.C" +#endif + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#endif + +// ************************************************************************* // diff --git a/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/PrintTable/PrintTableI.H b/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/PrintTable/PrintTableI.H new file mode 100644 index 0000000000000000000000000000000000000000..6c093bc13a2d8ea6e05fa53cc452403950a65743 --- /dev/null +++ b/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/PrintTable/PrintTableI.H @@ -0,0 +1,42 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2012 OpenFOAM Foundation + \\/ M anipulation | +------------------------------------------------------------------------------- +License + This file is part of OpenFOAM. + + OpenFOAM is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + OpenFOAM is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>. + +\*---------------------------------------------------------------------------*/ + +// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // + +template<class KeyType, class DataType> +void Foam::PrintTable<KeyType, DataType>::add +( + const KeyType& K, + const DataType& D +) +{ + table_.set(K, D); +} + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + + +// ************************************************************************* // diff --git a/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/backgroundMeshDecomposition/backgroundMeshDecomposition.C b/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/backgroundMeshDecomposition/backgroundMeshDecomposition.C new file mode 100644 index 0000000000000000000000000000000000000000..7f60b96200013c5a9e228c3f5672ead92ebb9ca0 --- /dev/null +++ b/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/backgroundMeshDecomposition/backgroundMeshDecomposition.C @@ -0,0 +1,1804 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2011-2012 OpenFOAM Foundation + \\/ M anipulation | +------------------------------------------------------------------------------- +License + This file is part of OpenFOAM. + + OpenFOAM is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + OpenFOAM is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>. + +\*---------------------------------------------------------------------------*/ + +#include "backgroundMeshDecomposition.H" +#include "meshSearch.H" +#include "conformationSurfaces.H" +#include "zeroGradientFvPatchFields.H" +#include "Time.H" +#include "Random.H" + +// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * // + +namespace Foam +{ + +defineTypeNameAndDebug(backgroundMeshDecomposition, 0); + +} + + +// * * * * * * * * * * * * * Static Member Functions * * * * * * * * * * * * // + +Foam::autoPtr<Foam::mapDistribute> Foam::backgroundMeshDecomposition::buildMap +( + const List<label>& toProc +) +{ + // Determine send map + // ~~~~~~~~~~~~~~~~~~ + + // 1. Count + labelList nSend(Pstream::nProcs(), 0); + + forAll(toProc, i) + { + label procI = toProc[i]; + + nSend[procI]++; + } + + // Send over how many I need to receive + // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + labelListList sendSizes(Pstream::nProcs()); + + sendSizes[Pstream::myProcNo()] = nSend; + + combineReduce(sendSizes, UPstream::listEq()); + + // 2. Size sendMap + labelListList sendMap(Pstream::nProcs()); + + forAll(nSend, procI) + { + sendMap[procI].setSize(nSend[procI]); + + nSend[procI] = 0; + } + + // 3. Fill sendMap + forAll(toProc, i) + { + label procI = toProc[i]; + + sendMap[procI][nSend[procI]++] = i; + } + + // Determine receive map + // ~~~~~~~~~~~~~~~~~~~~~ + + labelListList constructMap(Pstream::nProcs()); + + // Local transfers first + constructMap[Pstream::myProcNo()] = identity + ( + sendMap[Pstream::myProcNo()].size() + ); + + label constructSize = constructMap[Pstream::myProcNo()].size(); + + forAll(constructMap, procI) + { + if (procI != Pstream::myProcNo()) + { + label nRecv = sendSizes[procI][Pstream::myProcNo()]; + + constructMap[procI].setSize(nRecv); + + for (label i = 0; i < nRecv; i++) + { + constructMap[procI][i] = constructSize++; + } + } + } + + return autoPtr<mapDistribute> + ( + new mapDistribute + ( + constructSize, + sendMap.xfer(), + constructMap.xfer() + ) + ); +} + + +// * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * // + +void Foam::backgroundMeshDecomposition::initialRefinement() +{ + volScalarField cellWeights + ( + IOobject + ( + "cellWeights", + mesh_.time().timeName(), + mesh_, + IOobject::NO_READ, + IOobject::NO_WRITE + ), + mesh_, + dimensionedScalar("one", dimless, 1.0), + zeroGradientFvPatchScalarField::typeName + ); + + const conformationSurfaces& geometry = geometryToConformTo_; + + decompositionMethod& decomposer = decomposerPtr_(); + + volScalarField::InternalField& icellWeights = cellWeights.internalField(); + + + // For each cell in the mesh has it been determined if it is fully + // inside, outside, or overlaps the surface + labelList volumeStatus + ( + mesh_.nCells(), + searchableSurface::UNKNOWN + ); + + // Surface refinement + { + while (true) + { + // Determine/update the status of each cell + forAll(volumeStatus, cellI) + { + if (volumeStatus[cellI] == searchableSurface::UNKNOWN) + { + treeBoundBox cellBb + ( + mesh_.cells()[cellI].points + ( + mesh_.faces(), + mesh_.points() + ) + ); + + if (geometry.overlaps(cellBb)) + { + volumeStatus[cellI] = searchableSurface::MIXED; + } + else if (geometry.inside(cellBb.midpoint())) + { + volumeStatus[cellI] = searchableSurface::INSIDE; + } + else + { + volumeStatus[cellI] = + searchableSurface::OUTSIDE; + } + } + } + + { + labelList refCells = selectRefinementCells + ( + volumeStatus, + cellWeights + ); + + // Maintain 2:1 ratio + labelList newCellsToRefine + ( + meshCutter_.consistentRefinement + ( + refCells, + true // extend set + ) + ); + + forAll(newCellsToRefine, nCTRI) + { + label cellI = newCellsToRefine[nCTRI]; + + if (volumeStatus[cellI] == searchableSurface::MIXED) + { + volumeStatus[cellI] = searchableSurface::UNKNOWN; + } + + icellWeights[cellI] = max + ( + 1.0, + icellWeights[cellI]/8.0 + ); + } + + if (returnReduce(newCellsToRefine.size(), sumOp<label>()) == 0) + { + break; + } + + // Mesh changing engine. + polyTopoChange meshMod(mesh_); + + // Play refinement commands into mesh changer. + meshCutter_.setRefinement(newCellsToRefine, meshMod); + + // Create mesh, return map from old to new mesh. + autoPtr<mapPolyMesh> map = meshMod.changeMesh + ( + mesh_, + false, // inflate + true, // syncParallel + true, // orderCells (to reduce cell transfers) + false // orderPoints + ); + + // Update fields + mesh_.updateMesh(map); + + // Update numbering of cells/vertices. + meshCutter_.updateMesh(map); + + { + // Map volumeStatus + + const labelList& cellMap = map().cellMap(); + + labelList newVolumeStatus(cellMap.size()); + + forAll(cellMap, newCellI) + { + label oldCellI = cellMap[newCellI]; + + if (oldCellI == -1) + { + newVolumeStatus[newCellI] = + searchableSurface::UNKNOWN; + } + else + { + newVolumeStatus[newCellI] = volumeStatus[oldCellI]; + } + } + + volumeStatus.transfer(newVolumeStatus); + } + + Info<< " Background mesh refined from " + << returnReduce(map().nOldCells(), sumOp<label>()) + << " to " << mesh_.globalData().nTotalCells() + << " cells." << endl; + } + + // Determine/update the status of each cell + forAll(volumeStatus, cellI) + { + if (volumeStatus[cellI] == searchableSurface::UNKNOWN) + { + treeBoundBox cellBb + ( + mesh_.cells()[cellI].points + ( + mesh_.faces(), + mesh_.points() + ) + ); + + if (geometry.overlaps(cellBb)) + { + volumeStatus[cellI] = searchableSurface::MIXED; + } + else if (geometry.inside(cellBb.midpoint())) + { + volumeStatus[cellI] = searchableSurface::INSIDE; + } + else + { + volumeStatus[cellI] = + searchableSurface::OUTSIDE; + } + } + } + + // Hard code switch for this stage for testing + bool removeOutsideCells = false; + + if (removeOutsideCells) + { + DynamicList<label> cellsToRemove; + + forAll(volumeStatus, cellI) + { + if (volumeStatus[cellI] == searchableSurface::OUTSIDE) + { + cellsToRemove.append(cellI); + } + } + + removeCells cellRemover(mesh_); + + // Mesh changing engine. + polyTopoChange meshMod(mesh_); + + labelList exposedFaces = cellRemover.getExposedFaces + ( + cellsToRemove + ); + + // Play refinement commands into mesh changer. + cellRemover.setRefinement + ( + cellsToRemove, + exposedFaces, + labelList(exposedFaces.size(), 0), // patchID dummy + meshMod + ); + + // Create mesh, return map from old to new mesh. + autoPtr<mapPolyMesh> map = meshMod.changeMesh + ( + mesh_, + false, // inflate + true, // syncParallel + true, // orderCells (to reduce cell transfers) + false // orderPoints + ); + + // Update fields + mesh_.updateMesh(map); + + // Update numbering of cells/vertices. + meshCutter_.updateMesh(map); + cellRemover.updateMesh(map); + + { + // Map volumeStatus + + const labelList& cellMap = map().cellMap(); + + labelList newVolumeStatus(cellMap.size()); + + forAll(cellMap, newCellI) + { + label oldCellI = cellMap[newCellI]; + + if (oldCellI == -1) + { + newVolumeStatus[newCellI] = + searchableSurface::UNKNOWN; + } + else + { + newVolumeStatus[newCellI] = + volumeStatus[oldCellI]; + } + } + + volumeStatus.transfer(newVolumeStatus); + } + + Info<< "Removed " + << returnReduce(map().nOldCells(), sumOp<label>()) + - mesh_.globalData().nTotalCells() + << " cells." << endl; + } + + if (debug) + { + // const_cast<Time&>(mesh_.time())++; + // Info<< "Time " << mesh_.time().timeName() << endl; + meshCutter_.write(); + mesh_.write(); + cellWeights.write(); + } + + labelList newDecomp = decomposer.decompose + ( + mesh_, + mesh_.cellCentres(), + icellWeights + ); + + fvMeshDistribute distributor(mesh_, mergeDist_); + + autoPtr<mapDistributePolyMesh> mapDist = distributor.distribute + ( + newDecomp + ); + + meshCutter_.distribute(mapDist); + + mapDist().distributeCellData(volumeStatus); + + if (debug) + { + printMeshData(mesh_); + + // const_cast<Time&>(mesh_.time())++; + // Info<< "Time " << mesh_.time().timeName() << endl; + meshCutter_.write(); + mesh_.write(); + cellWeights.write(); + } + } + } + + if (debug) + { + // const_cast<Time&>(mesh_.time())++; + // Info<< "Time " << mesh_.time().timeName() << endl; + cellWeights.write(); + mesh_.write(); + } + + buildPatchAndTree(); +} + + +void Foam::backgroundMeshDecomposition::printMeshData +( + const polyMesh& mesh +) const +{ + // Collect all data on master + + globalIndex globalCells(mesh.nCells()); + // labelListList patchNeiProcNo(Pstream::nProcs()); + // labelListList patchSize(Pstream::nProcs()); + // const labelList& pPatches = mesh.globalData().processorPatches(); + // patchNeiProcNo[Pstream::myProcNo()].setSize(pPatches.size()); + // patchSize[Pstream::myProcNo()].setSize(pPatches.size()); + // forAll(pPatches, i) + // { + // const processorPolyPatch& ppp = refCast<const processorPolyPatch> + // ( + // mesh.boundaryMesh()[pPatches[i]] + // ); + // patchNeiProcNo[Pstream::myProcNo()][i] = ppp.neighbProcNo(); + // patchSize[Pstream::myProcNo()][i] = ppp.size(); + // } + // Pstream::gatherList(patchNeiProcNo); + // Pstream::gatherList(patchSize); + + + // // Print stats + + // globalIndex globalBoundaryFaces(mesh.nFaces()-mesh.nInternalFaces()); + + for (label procI = 0; procI < Pstream::nProcs(); procI++) + { + Info<< "Processor " << procI << " " + << "Number of cells = " << globalCells.localSize(procI) + << endl; + + // label nProcFaces = 0; + + // const labelList& nei = patchNeiProcNo[procI]; + + // forAll(patchNeiProcNo[procI], i) + // { + // Info<< " Number of faces shared with processor " + // << patchNeiProcNo[procI][i] << " = " << patchSize[procI][i] + // << endl; + + // nProcFaces += patchSize[procI][i]; + // } + + // Info<< " Number of processor patches = " << nei.size() << nl + // << " Number of processor faces = " << nProcFaces << nl + // << " Number of boundary faces = " + // << globalBoundaryFaces.localSize(procI) << endl; + } +} + + +bool Foam::backgroundMeshDecomposition::refineCell +( + label cellI, + label volType, + scalar& weightEstimate +) const +{ + // Sample the box to find an estimate of the min size, and a volume + // estimate when overlapping == true. + + const conformationSurfaces& geometry = geometryToConformTo_; + + treeBoundBox cellBb + ( + mesh_.cells()[cellI].points + ( + mesh_.faces(), + mesh_.points() + ) + ); + + weightEstimate = 1.0; + + if (volType == searchableSurface::MIXED) + { +// // Assess the cell size at the nearest point on the surface for the +// // MIXED cells, if the cell is large with respect to the cell size, +// // then refine it. +// +// pointField samplePoints +// ( +// volRes_*volRes_*volRes_, +// vector::zero +// ); +// +// // scalar sampleVol = cellBb.volume()/samplePoints.size(); +// +// vector delta = cellBb.span()/volRes_; +// +// label pI = 0; +// +// for (label i = 0; i < volRes_; i++) +// { +// for (label j = 0; j < volRes_; j++) +// { +// for (label k = 0; k < volRes_; k++) +// { +// samplePoints[pI++] = +// cellBb.min() +// + vector +// ( +// delta.x()*(i + 0.5), +// delta.y()*(j + 0.5), +// delta.z()*(k + 0.5) +// ); +// } +// } +// } +// +// List<pointIndexHit> hitInfo; +// labelList hitSurfaces; +// +// geometry.findSurfaceNearest +// ( +// samplePoints, +// scalarField(samplePoints.size(), sqr(GREAT)), +// hitInfo, +// hitSurfaces +// ); +// +// // weightEstimate = 0.0; +// +// scalar minCellSize = GREAT; +// +// forAll(samplePoints, i) +// { +// scalar s = cellShapeControl_.cellSize +// ( +// hitInfo[i].hitPoint() +// ); +// +// // Info<< "cellBb.midpoint() " << cellBb.midpoint() << nl +// // << samplePoints[i] << nl +// // << hitInfo[i] << nl +// // << "cellBb.span() " << cellBb.span() << nl +// // << "cellBb.mag() " << cellBb.mag() << nl +// // << s << endl; +// +// if (s < minCellSize) +// { +// minCellSize = max(s, minCellSizeLimit_); +// } +// +// // Estimate the number of points in the cell by the surface size, +// // this is likely to be too small, so reduce. +// // weightEstimate += sampleVol/pow3(s); +// } +// +// if (sqr(spanScale_)*sqr(minCellSize) < magSqr(cellBb.span())) +// { +// return true; +// } + } + else if (volType == searchableSurface::INSIDE) + { + // scalar s = cvMesh_.cellShapeControl_.cellSize(cellBb.midpoint()); + + // Estimate the number of points in the cell by the size at the cell + // midpoint + // weightEstimate = cellBb.volume()/pow3(s); + + return false; + } + // else + // { + // weightEstimate = 1.0; + + // return false; + // } + + return false; +} + + +Foam::labelList Foam::backgroundMeshDecomposition::selectRefinementCells +( + labelList& volumeStatus, + volScalarField& cellWeights +) const +{ + volScalarField::InternalField& icellWeights = cellWeights.internalField(); + + labelHashSet cellsToRefine; + + // Determine/update the status of each cell + forAll(volumeStatus, cellI) + { + if (volumeStatus[cellI] == searchableSurface::MIXED) + { + if (meshCutter_.cellLevel()[cellI] < minLevels_) + { + cellsToRefine.insert(cellI); + } + } + + if (volumeStatus[cellI] != searchableSurface::OUTSIDE) + { + if + ( + refineCell + ( + cellI, + volumeStatus[cellI], + icellWeights[cellI] + ) + ) + { + cellsToRefine.insert(cellI); + } + } + } + + return cellsToRefine.toc(); +} + + +void Foam::backgroundMeshDecomposition::buildPatchAndTree() +{ + primitivePatch tmpBoundaryFaces + ( + SubList<face> + ( + mesh_.faces(), + mesh_.nFaces() - mesh_.nInternalFaces(), + mesh_.nInternalFaces() + ), + mesh_.points() + ); + + boundaryFacesPtr_.reset + ( + new bPatch + ( + tmpBoundaryFaces.localFaces(), + tmpBoundaryFaces.localPoints() + ) + ); + + // Overall bb + treeBoundBox overallBb(boundaryFacesPtr_().localPoints()); + + Random& rnd = rndGen_; + + bFTreePtr_.reset + ( + new indexedOctree<treeDataBPatch> + ( + treeDataBPatch(false, boundaryFacesPtr_()), + overallBb.extend(rnd, 1e-4), + 10, // maxLevel + 10, // leafSize + 3.0 // duplicity + ) + ); + + // Give the bounds of every processor to every other processor + allBackgroundMeshBounds_[Pstream::myProcNo()] = overallBb; + + Pstream::gatherList(allBackgroundMeshBounds_); + Pstream::scatterList(allBackgroundMeshBounds_); + + point bbMin(GREAT, GREAT, GREAT); + point bbMax(-GREAT, -GREAT, -GREAT); + + forAll(allBackgroundMeshBounds_, procI) + { + bbMin = min(bbMin, allBackgroundMeshBounds_[procI].min()); + bbMax = max(bbMax, allBackgroundMeshBounds_[procI].max()); + } + + globalBackgroundBounds_ = treeBoundBox(bbMin, bbMax); + + if (false) + { + OFstream fStr + ( + mesh_.time().path() + /"backgroundMeshDecomposition_proc_" + + name(Pstream::myProcNo()) + + "_boundaryFaces.obj" + ); + + const faceList& faces = boundaryFacesPtr_().localFaces(); + const List<point>& points = boundaryFacesPtr_().localPoints(); + + Map<label> foamToObj(points.size()); + + label vertI = 0; + + forAll(faces, i) + { + const face& f = faces[i]; + + forAll(f, fPI) + { + if (foamToObj.insert(f[fPI], vertI)) + { + meshTools::writeOBJ(fStr, points[f[fPI]]); + vertI++; + } + } + + fStr<< 'f'; + + forAll(f, fPI) + { + fStr<< ' ' << foamToObj[f[fPI]] + 1; + } + + fStr<< nl; + } + } +} + + +// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // + +Foam::backgroundMeshDecomposition::backgroundMeshDecomposition +( + const Time& runTime, + Random& rndGen, + const conformationSurfaces& geometryToConformTo, + const dictionary& coeffsDict +) +: + runTime_(runTime), + geometryToConformTo_(geometryToConformTo), + rndGen_(rndGen), + mesh_ + ( + IOobject + ( + fvMesh::defaultRegion, + runTime_.timeName(), + runTime_, + IOobject::MUST_READ + ) + ), + meshCutter_ + ( + mesh_, + labelList(mesh_.nCells(), 0), + labelList(mesh_.nPoints(), 0) + ), + boundaryFacesPtr_(), + bFTreePtr_(), + allBackgroundMeshBounds_(Pstream::nProcs()), + globalBackgroundBounds_(), + decomposeDict_ + ( + IOobject + ( + "decomposeParDict", + runTime_.system(), + runTime_, + IOobject::MUST_READ_IF_MODIFIED, + IOobject::NO_WRITE + ) + ), + decomposerPtr_(decompositionMethod::New(decomposeDict_)), + mergeDist_(1e-6*mesh_.bounds().mag()), + spanScale_(readScalar(coeffsDict.lookup("spanScale"))), + minCellSizeLimit_ + ( + coeffsDict.lookupOrDefault<scalar>("minCellSizeLimit", 0.0) + ), + minLevels_(readLabel(coeffsDict.lookup("minLevels"))), + volRes_(readLabel(coeffsDict.lookup("sampleResolution"))), + maxCellWeightCoeff_(readScalar(coeffsDict.lookup("maxCellWeightCoeff"))) +{ + if (!Pstream::parRun()) + { + FatalErrorIn + ( + "Foam::backgroundMeshDecomposition::backgroundMeshDecomposition" + "(" + "const dictionary& coeffsDict, " + "const conformalVoronoiMesh& cvMesh" + ")" + ) + << "This cannot be used when not running in parallel." + << exit(FatalError); + } + + if (!decomposerPtr_().parallelAware()) + { + FatalErrorIn + ( + "void Foam::backgroundMeshDecomposition::initialRefinement() const" + ) + << "You have selected decomposition method " + << decomposerPtr_().typeName + << " which is not parallel aware." << endl + << exit(FatalError); + } + + Info<< nl << "Building initial background mesh decomposition" << endl; + + initialRefinement(); +} + + +// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * // + +Foam::backgroundMeshDecomposition::~backgroundMeshDecomposition() +{} + + +// * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * * // + +Foam::autoPtr<Foam::mapDistributePolyMesh> +Foam::backgroundMeshDecomposition::distribute +( + volScalarField& cellWeights +) +{ + if (debug) + { + // const_cast<Time&>(mesh_.time())++; + // Info<< "Time " << mesh_.time().timeName() << endl; + cellWeights.write(); + mesh_.write(); + } + + volScalarField::InternalField& icellWeights = cellWeights.internalField(); + + while (true) + { + // Refine large cells if necessary + + label nOccupiedCells = 0; + + forAll(icellWeights, cI) + { + if (icellWeights[cI] > 1 - SMALL) + { + nOccupiedCells++; + } + } + + // Only look at occupied cells, as there is a possibility of runaway + // refinement if the number of cells grows too fast. Also, clip the + // minimum cellWeightLimit at maxCellWeightCoeff_ + + scalar cellWeightLimit = max + ( + maxCellWeightCoeff_ + *sum(cellWeights).value() + /returnReduce(nOccupiedCells, sumOp<label>()), + maxCellWeightCoeff_ + ); + + if (debug) + { + Info<< " cellWeightLimit " << cellWeightLimit << endl; + + Pout<< " sum(cellWeights) " << sum(cellWeights.internalField()) + << " max(cellWeights) " << max(cellWeights.internalField()) + << endl; + } + + labelHashSet cellsToRefine; + + forAll(icellWeights, cWI) + { + if (icellWeights[cWI] > cellWeightLimit) + { + cellsToRefine.insert(cWI); + } + } + + if (returnReduce(cellsToRefine.size(), sumOp<label>()) == 0) + { + break; + } + + // Maintain 2:1 ratio + labelList newCellsToRefine + ( + meshCutter_.consistentRefinement + ( + cellsToRefine.toc(), + true // extend set + ) + ); + + if (debug && !cellsToRefine.empty()) + { + Pout<< " cellWeights too large in " << cellsToRefine.size() + << " cells" << endl; + } + + forAll(newCellsToRefine, nCTRI) + { + label cellI = newCellsToRefine[nCTRI]; + + icellWeights[cellI] /= 8.0; + } + + // Mesh changing engine. + polyTopoChange meshMod(mesh_); + + // Play refinement commands into mesh changer. + meshCutter_.setRefinement(newCellsToRefine, meshMod); + + // Create mesh, return map from old to new mesh. + autoPtr<mapPolyMesh> map = meshMod.changeMesh + ( + mesh_, + false, // inflate + true, // syncParallel + true, // orderCells (to reduce cell motion) + false // orderPoints + ); + + // Update fields + mesh_.updateMesh(map); + + // Update numbering of cells/vertices. + meshCutter_.updateMesh(map); + + Info<< " Background mesh refined from " + << returnReduce(map().nOldCells(), sumOp<label>()) + << " to " << mesh_.globalData().nTotalCells() + << " cells." << endl; + + if (debug) + { + // const_cast<Time&>(mesh_.time())++; + // Info<< "Time " << mesh_.time().timeName() << endl; + cellWeights.write(); + mesh_.write(); + } + } + + if (debug) + { + printMeshData(mesh_); + + Pout<< " Pre distribute sum(cellWeights) " + << sum(icellWeights) + << " max(cellWeights) " + << max(icellWeights) + << endl; + } + + labelList newDecomp = decomposerPtr_().decompose + ( + mesh_, + mesh_.cellCentres(), + icellWeights + ); + + Info<< " Redistributing background mesh cells" << endl; + + fvMeshDistribute distributor(mesh_, mergeDist_); + + autoPtr<mapDistributePolyMesh> mapDist = distributor.distribute(newDecomp); + + meshCutter_.distribute(mapDist); + + if (debug) + { + printMeshData(mesh_); + + Pout<< " Post distribute sum(cellWeights) " + << sum(icellWeights) + << " max(cellWeights) " + << max(icellWeights) + << endl; + + // const_cast<Time&>(mesh_.time())++; + // Info<< "Time " << mesh_.time().timeName() << endl; + mesh_.write(); + cellWeights.write(); + } + + buildPatchAndTree(); + + return mapDist; +} + + +Foam::autoPtr<Foam::mapDistribute> +Foam::backgroundMeshDecomposition::distributePoints +( + List<point>& points +) const +{ + labelList toProc(processorPosition(points)); + + autoPtr<mapDistribute> map(buildMap(toProc)); + + map().distribute(points); + + return map; +} + + +bool Foam::backgroundMeshDecomposition::positionOnThisProcessor +( + const point& pt +) const +{ +// return bFTreePtr_().findAnyOverlap(pt, 0.0); + + return + ( + bFTreePtr_().getVolumeType(pt) + == indexedOctree<treeDataBPatch>::INSIDE + ); +} + + +Foam::boolList Foam::backgroundMeshDecomposition::positionOnThisProcessor +( + const List<point>& pts +) const +{ + boolList posProc(pts.size(), true); + + forAll(pts, pI) + { + posProc[pI] = positionOnThisProcessor(pts[pI]); + } + + return posProc; +} + + +bool Foam::backgroundMeshDecomposition::overlapsThisProcessor +( + const treeBoundBox& box +) const +{ +// return !procBounds().contains(box); + return !bFTreePtr_().findBox(box).empty(); +} + + +bool Foam::backgroundMeshDecomposition::overlapsThisProcessor +( + const point& centre, + const scalar radiusSqr +) const +{ + //return bFTreePtr_().findAnyOverlap(centre, radiusSqr); + + return bFTreePtr_().findNearest(centre, radiusSqr).hit(); +} + + +Foam::pointIndexHit Foam::backgroundMeshDecomposition::findLine +( + const point& start, + const point& end +) const +{ + return bFTreePtr_().findLine(start, end); +} + + +Foam::pointIndexHit Foam::backgroundMeshDecomposition::findLineAny +( + const point& start, + const point& end +) const +{ + return bFTreePtr_().findLineAny(start, end); +} + + +Foam::labelList Foam::backgroundMeshDecomposition::processorPosition +( + const List<point>& pts +) const +{ + DynamicList<label> toCandidateProc; + DynamicList<point> testPoints; + labelList ptBlockStart(pts.size(), -1); + labelList ptBlockSize(pts.size(), -1); + + label nTotalCandidates = 0; + + forAll(pts, pI) + { + const point& pt = pts[pI]; + + label nCandidates = 0; + + forAll(allBackgroundMeshBounds_, procI) + { + if (allBackgroundMeshBounds_[procI].contains(pt)) + { + toCandidateProc.append(procI); + testPoints.append(pt); + + nCandidates++; + } + } + + ptBlockStart[pI] = nTotalCandidates; + ptBlockSize[pI] = nCandidates; + + nTotalCandidates += nCandidates; + } + + // Needed for reverseDistribute + label preDistributionToCandidateProcSize = toCandidateProc.size(); + + autoPtr<mapDistribute> map(buildMap(toCandidateProc)); + + map().distribute(testPoints); + + List<bool> pointOnCandidate(testPoints.size(), false); + + // Test candidate points on candidate processors + forAll(testPoints, tPI) + { + pointOnCandidate[tPI] = positionOnThisProcessor(testPoints[tPI]); + } + + map().reverseDistribute + ( + preDistributionToCandidateProcSize, + pointOnCandidate + ); + + labelList ptProc(pts.size(), -1); + + DynamicList<label> failedPointIndices; + DynamicList<point> failedPoints; + + forAll(pts, pI) + { + // Extract the sub list of results for this point + + SubList<bool> ptProcResults + ( + pointOnCandidate, + ptBlockSize[pI], + ptBlockStart[pI] + ); + + forAll(ptProcResults, pPRI) + { + if (ptProcResults[pPRI]) + { + ptProc[pI] = toCandidateProc[ptBlockStart[pI] + pPRI]; + + break; + } + } + + if (ptProc[pI] < 0) + { + if (!globalBackgroundBounds_.contains(pts[pI])) + { + FatalErrorIn + ( + "Foam::labelList" + "Foam::backgroundMeshDecomposition::processorPosition" + "(" + "const List<point>&" + ") const" + ) + << "The position " << pts[pI] + << " is not in any part of the background mesh " + << globalBackgroundBounds_ << endl + << "A background mesh with a wider margin around " + << "the geometry may help." + << exit(FatalError); + } + + if (debug) + { + WarningIn + ( + "Foam::labelList" + "Foam::backgroundMeshDecomposition::processorPosition" + "(" + "const List<point>&" + ") const" + ) << "The position " << pts[pI] + << " was not found in the background mesh " + << globalBackgroundBounds_ << ", finding nearest." + << endl; + } + + failedPointIndices.append(pI); + failedPoints.append(pts[pI]); + } + } + + labelList ptNearestProc(processorNearestPosition(failedPoints)); + + forAll(failedPoints, fPI) + { + label pI = failedPointIndices[fPI]; + + ptProc[pI] = ptNearestProc[fPI]; + } + + return ptProc; +} + + +Foam::labelList Foam::backgroundMeshDecomposition::processorNearestPosition +( + const List<point>& pts +) const +{ + DynamicList<label> toCandidateProc; + DynamicList<point> testPoints; + labelList ptBlockStart(pts.size(), -1); + labelList ptBlockSize(pts.size(), -1); + + label nTotalCandidates = 0; + + forAll(pts, pI) + { + const point& pt = pts[pI]; + + label nCandidates = 0; + + forAll(allBackgroundMeshBounds_, procI) + { + // Candidate points may lie just outside a processor box, increase + // test range by using overlaps rather than contains + if (allBackgroundMeshBounds_[procI].overlaps(pt, sqr(SMALL*100))) + { + toCandidateProc.append(procI); + testPoints.append(pt); + + nCandidates++; + } + } + + ptBlockStart[pI] = nTotalCandidates; + ptBlockSize[pI] = nCandidates; + + nTotalCandidates += nCandidates; + } + + // Needed for reverseDistribute + label preDistributionToCandidateProcSize = toCandidateProc.size(); + + autoPtr<mapDistribute> map(buildMap(toCandidateProc)); + + map().distribute(testPoints); + + List<scalar> distanceSqrToCandidate(testPoints.size(), sqr(GREAT)); + + // Test candidate points on candidate processors + forAll(testPoints, tPI) + { + pointIndexHit info = bFTreePtr_().findNearest + ( + testPoints[tPI], + sqr(GREAT) + ); + + if (info.hit()) + { + distanceSqrToCandidate[tPI] = magSqr + ( + testPoints[tPI] - info.hitPoint() + ); + } + } + + map().reverseDistribute + ( + preDistributionToCandidateProcSize, + distanceSqrToCandidate + ); + + labelList ptNearestProc(pts.size(), -1); + + forAll(pts, pI) + { + // Extract the sub list of results for this point + + SubList<scalar> ptNearestProcResults + ( + distanceSqrToCandidate, + ptBlockSize[pI], + ptBlockStart[pI] + ); + + scalar nearestProcDistSqr = GREAT; + + forAll(ptNearestProcResults, pPRI) + { + if (ptNearestProcResults[pPRI] < nearestProcDistSqr) + { + nearestProcDistSqr = ptNearestProcResults[pPRI]; + + ptNearestProc[pI] = toCandidateProc[ptBlockStart[pI] + pPRI]; + } + } + + if (debug) + { + Pout<< pts[pI] << " nearestProcDistSqr " << nearestProcDistSqr + << " ptNearestProc[pI] " << ptNearestProc[pI] << endl; + } + + if (ptNearestProc[pI] < 0) + { + FatalErrorIn + ( + "Foam::labelList" + "Foam::backgroundMeshDecomposition::processorNearestPosition" + "(" + "const List<point>& pts" + ") const" + ) + << "The position " << pts[pI] + << " did not find a nearest point on the background mesh." + << exit(FatalError); + } + } + + return ptNearestProc; +} + + + +Foam::List<Foam::List<Foam::pointIndexHit> > +Foam::backgroundMeshDecomposition::intersectsProcessors +( + const List<point>& starts, + const List<point>& ends, + bool includeOwnProcessor +) const +{ + DynamicList<label> toCandidateProc; + DynamicList<point> testStarts; + DynamicList<point> testEnds; + labelList segmentBlockStart(starts.size(), -1); + labelList segmentBlockSize(starts.size(), -1); + + label nTotalCandidates = 0; + + forAll(starts, sI) + { + const point& s = starts[sI]; + const point& e = ends[sI]; + + // Dummy point for treeBoundBox::intersects + point p(vector::zero); + + label nCandidates = 0; + + forAll(allBackgroundMeshBounds_, procI) + { + // It is assumed that the sphere in question overlaps the source + // processor, so don't test it, unless includeOwnProcessor is true + if + ( + (includeOwnProcessor || procI != Pstream::myProcNo()) + && allBackgroundMeshBounds_[procI].intersects(s, e, p) + ) + { + toCandidateProc.append(procI); + testStarts.append(s); + testEnds.append(e); + + nCandidates++; + } + } + + segmentBlockStart[sI] = nTotalCandidates; + segmentBlockSize[sI] = nCandidates; + + nTotalCandidates += nCandidates; + } + + // Needed for reverseDistribute + label preDistributionToCandidateProcSize = toCandidateProc.size(); + + autoPtr<mapDistribute> map(buildMap(toCandidateProc)); + + map().distribute(testStarts); + map().distribute(testEnds); + + List<pointIndexHit> segmentIntersectsCandidate(testStarts.size()); + + // Test candidate segments on candidate processors + forAll(testStarts, sI) + { + const point& s = testStarts[sI]; + const point& e = testEnds[sI]; + + // If the sphere finds some elements of the patch, then it overlaps + segmentIntersectsCandidate[sI] = bFTreePtr_().findLine(s, e); + } + + map().reverseDistribute + ( + preDistributionToCandidateProcSize, + segmentIntersectsCandidate + ); + + List<List<pointIndexHit> > segmentHitProcs(starts.size()); + + // Working storage for assessing processors + DynamicList<pointIndexHit> tmpProcHits; + + forAll(starts, sI) + { + tmpProcHits.clear(); + + // Extract the sub list of results for this point + + SubList<pointIndexHit> segmentProcResults + ( + segmentIntersectsCandidate, + segmentBlockSize[sI], + segmentBlockStart[sI] + ); + + forAll(segmentProcResults, sPRI) + { + if (segmentProcResults[sPRI].hit()) + { + tmpProcHits.append(segmentProcResults[sPRI]); + + tmpProcHits.last().setIndex + ( + toCandidateProc[segmentBlockStart[sI] + sPRI] + ); + } + } + + segmentHitProcs[sI] = tmpProcHits; + } + + return segmentHitProcs; +} + + +bool Foam::backgroundMeshDecomposition::overlapsOtherProcessors +( + const point& centre, + const scalar& radiusSqr +) const +{ + forAll(allBackgroundMeshBounds_, procI) + { + if (bFTreePtr_().findNearest(centre, radiusSqr).hit()) + { + return true; + } + } + + return false; +} + + +Foam::labelList Foam::backgroundMeshDecomposition::overlapProcessors +( + const point& centre, + const scalar radiusSqr +) const +{ + DynamicList<label> toProc(Pstream::nProcs()); + + forAll(allBackgroundMeshBounds_, procI) + { + // Test against the bounding box of the processor + if + ( + procI != Pstream::myProcNo() + && allBackgroundMeshBounds_[procI].overlaps(centre, radiusSqr) + ) + { + // Expensive test +// if (bFTreePtr_().findNearest(centre, radiusSqr).hit()) + { + toProc.append(procI); + } + } + } + + return toProc; +} + + +//Foam::labelListList Foam::backgroundMeshDecomposition::overlapsProcessors +//( +// const List<point>& centres, +// const List<scalar>& radiusSqrs, +// const Delaunay& T, +// bool includeOwnProcessor +//) const +//{ +// DynamicList<label> toCandidateProc; +// DynamicList<point> testCentres; +// DynamicList<scalar> testRadiusSqrs; +// labelList sphereBlockStart(centres.size(), -1); +// labelList sphereBlockSize(centres.size(), -1); +// +// label nTotalCandidates = 0; +// +// forAll(centres, sI) +// { +// const point& c = centres[sI]; +// scalar rSqr = radiusSqrs[sI]; +// +// label nCandidates = 0; +// +// forAll(allBackgroundMeshBounds_, procI) +// { +// // It is assumed that the sphere in question overlaps the source +// // processor, so don't test it, unless includeOwnProcessor is true +// if +// ( +// (includeOwnProcessor || procI != Pstream::myProcNo()) +// && allBackgroundMeshBounds_[procI].overlaps(c, rSqr) +// ) +// { +// if (bFTreePtr_().findNearest(c, rSqr).hit()) +// { +// toCandidateProc.append(procI); +// testCentres.append(c); +// testRadiusSqrs.append(rSqr); +// +// nCandidates++; +// } +// } +// } +// +// sphereBlockStart[sI] = nTotalCandidates; +// sphereBlockSize[sI] = nCandidates; +// +// nTotalCandidates += nCandidates; +// } +// +// // Needed for reverseDistribute +//// label preDistributionToCandidateProcSize = toCandidateProc.size(); +//// +//// autoPtr<mapDistribute> map(buildMap(toCandidateProc)); +//// +//// map().distribute(testCentres); +//// map().distribute(testRadiusSqrs); +// +// // @todo This is faster, but results in more vertices being referred +// boolList sphereOverlapsCandidate(testCentres.size(), true); +//// boolList sphereOverlapsCandidate(testCentres.size(), false); +//// +//// // Test candidate spheres on candidate processors +//// forAll(testCentres, sI) +//// { +//// const point& c = testCentres[sI]; +//// const scalar rSqr = testRadiusSqrs[sI]; +//// +//// const bool flagOverlap = bFTreePtr_().findNearest(c, rSqr).hit(); +//// +//// if (flagOverlap) +//// { +//// //if (vertexOctree.findAnyOverlap(c, rSqr)) +////// if (vertexOctree.findNearest(c, rSqr*1.001).hit()) +////// { +////// sphereOverlapsCandidate[sI] = true; +////// } +//// +////// Vertex_handle nearestVertex = T.nearest_vertex +////// ( +////// toPoint<Point>(c) +////// ); +////// +////// const scalar distSqr = magSqr +////// ( +////// topoint(nearestVertex->point()) - c +////// ); +////// +////// if (distSqr <= rSqr) +////// { +////// // If the sphere finds a nearest element of the patch, +////// // then it overlaps +//// sphereOverlapsCandidate[sI] = true; +////// } +//// } +//// } +// +//// map().reverseDistribute +//// ( +//// preDistributionToCandidateProcSize, +//// sphereOverlapsCandidate +//// ); +// +// labelListList sphereProcs(centres.size()); +// +// // Working storage for assessing processors +// DynamicList<label> tmpProcs; +// +// forAll(centres, sI) +// { +// tmpProcs.clear(); +// +// // Extract the sub list of results for this point +// +// SubList<bool> sphereProcResults +// ( +// sphereOverlapsCandidate, +// sphereBlockSize[sI], +// sphereBlockStart[sI] +// ); +// +// forAll(sphereProcResults, sPRI) +// { +// if (sphereProcResults[sPRI]) +// { +// tmpProcs.append(toCandidateProc[sphereBlockStart[sI] + sPRI]); +// } +// } +// +// sphereProcs[sI] = tmpProcs; +// } +// +// return sphereProcs; +//} + + +//Foam::labelListList Foam::backgroundMeshDecomposition::overlapProcessors +//( +// const point& cc, +// const scalar rSqr +//) const +//{ +// DynamicList<label> toCandidateProc; +// label sphereBlockStart(-1); +// label sphereBlockSize(-1); +// +// label nCandidates = 0; +// +// forAll(allBackgroundMeshBounds_, procI) +// { +// // It is assumed that the sphere in question overlaps the source +// // processor, so don't test it, unless includeOwnProcessor is true +// if +// ( +// (includeOwnProcessor || procI != Pstream::myProcNo()) +// && allBackgroundMeshBounds_[procI].overlaps(cc, rSqr) +// ) +// { +// toCandidateProc.append(procI); +// +// nCandidates++; +// } +// } +// +// sphereBlockSize = nCandidates; +// nTotalCandidates += nCandidates; +// +// // Needed for reverseDistribute +// label preDistributionToCandidateProcSize = toCandidateProc.size(); +// +// autoPtr<mapDistribute> map(buildMap(toCandidateProc)); +// +// map().distribute(testCentres); +// map().distribute(testRadiusSqrs); +// +// // @todo This is faster, but results in more vertices being referred +//// boolList sphereOverlapsCandidate(testCentres.size(), true); +// boolList sphereOverlapsCandidate(testCentres.size(), false); +// +// // Test candidate spheres on candidate processors +// forAll(testCentres, sI) +// { +// const point& c = testCentres[sI]; +// const scalar rSqr = testRadiusSqrs[sI]; +// +// const bool flagOverlap = bFTreePtr_().findNearest(c, rSqr).hit(); +// +// if (flagOverlap) +// { +// //if (vertexOctree.findAnyOverlap(c, rSqr)) +//// if (vertexOctree.findNearest(c, rSqr*1.001).hit()) +//// { +//// sphereOverlapsCandidate[sI] = true; +//// } +// +//// Vertex_handle nearestVertex = T.nearest_vertex +//// ( +//// toPoint<Point>(c) +//// ); +//// +//// const scalar distSqr = magSqr +//// ( +//// topoint(nearestVertex->point()) - c +//// ); +//// +//// if (distSqr <= rSqr) +//// { +//// // If the sphere finds a nearest element of the patch, then +//// // it overlaps +// sphereOverlapsCandidate[sI] = true; +//// } +// } +// } +// +// map().reverseDistribute +// ( +// preDistributionToCandidateProcSize, +// sphereOverlapsCandidate +// ); +// +// labelListList sphereProcs(centres.size()); +// +// // Working storage for assessing processors +// DynamicList<label> tmpProcs; +// +// forAll(centres, sI) +// { +// tmpProcs.clear(); +// +// // Extract the sub list of results for this point +// +// SubList<bool> sphereProcResults +// ( +// sphereOverlapsCandidate, +// sphereBlockSize[sI], +// sphereBlockStart[sI] +// ); +// +// forAll(sphereProcResults, sPRI) +// { +// if (sphereProcResults[sPRI]) +// { +// tmpProcs.append(toCandidateProc[sphereBlockStart[sI] + sPRI]); +// } +// } +// +// sphereProcs[sI] = tmpProcs; +// } +// +// return sphereProcs; +//} + + +// ************************************************************************* // diff --git a/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/backgroundMeshDecomposition/backgroundMeshDecomposition.H b/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/backgroundMeshDecomposition/backgroundMeshDecomposition.H new file mode 100644 index 0000000000000000000000000000000000000000..73aa2fee74a86d32fb81360eec0b602b2aa7ed58 --- /dev/null +++ b/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/backgroundMeshDecomposition/backgroundMeshDecomposition.H @@ -0,0 +1,340 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2011-2012 OpenFOAM Foundation + \\/ M anipulation | +------------------------------------------------------------------------------- +License + This file is part of OpenFOAM. + + OpenFOAM is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + OpenFOAM is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>. + +Class + Foam::backgroundMeshDecomposition + +Description + Store a background polyMesh to use for the decomposition of space and + queries for parallel conformalVoronoiMesh. + + The requirements are: + + + To have a decomposition of space which can quickly interrogate an + arbitrary location from any processor to reliably and unambiguously + determine which processor owns the space that the point is in, i.e. as + the vertices move, or need inserted as part of the surface conformation, + send them to the correct proc. + + + To be able to be dynamically built, refined and redistributed to other + procs the partitioning as the meshing progresses to balance the load. + + + To be able to query whether a sphere (the circumsphere of a Delaunay tet) + overlaps any part of the space defined by the structure, and whether a + ray (Voronoi edge) penetrates any part of the space defined by the + structure, this is what determines if points get referred to a processor. + +SourceFiles + backgroundMeshDecompositionI.H + backgroundMeshDecomposition.C + +\*---------------------------------------------------------------------------*/ + +#ifndef backgroundMeshDecomposition_H +#define backgroundMeshDecomposition_H + +#include "fvMesh.H" +#include "hexRef8.H" +#include "cellSet.H" +#include "meshTools.H" +#include "polyTopoChange.H" +#include "mapPolyMesh.H" +#include "decompositionMethod.H" +#include "fvMeshDistribute.H" +#include "removeCells.H" +#include "mapDistributePolyMesh.H" +#include "globalIndex.H" +#include "treeBoundBox.H" +#include "primitivePatch.H" +#include "face.H" +#include "labelList.H" +#include "pointField.H" +#include "indexedOctree.H" +#include "treeDataPrimitivePatch.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ + +typedef PrimitivePatch<face, List, const pointField, point> bPatch; +typedef treeDataPrimitivePatch<bPatch> treeDataBPatch; + +class Time; +class Random; +class conformationSurfaces; + +/*---------------------------------------------------------------------------*\ + Class backgroundMeshDecomposition Declaration +\*---------------------------------------------------------------------------*/ + +class backgroundMeshDecomposition +{ + // Private data + + //- Method details dictionary + //dictionary coeffsDict_; + + //- Reference to runtime + const Time& runTime_; + + //- Reference to surface + const conformationSurfaces& geometryToConformTo_; + + //- Random number generator + Random& rndGen_; + + //- Mesh stored on for this processor, specifiying the domain that it + // is responsible for. + fvMesh mesh_; + + //- Refinement object + hexRef8 meshCutter_; + + //- Patch containing an independent representation of the surface of the + // mesh of this processor + autoPtr<bPatch> boundaryFacesPtr_; + + //- Search tree for the boundaryFaces_ patch + autoPtr<indexedOctree<treeDataBPatch> > bFTreePtr_; + + //- The bounds of all background meshes on all processors + treeBoundBoxList allBackgroundMeshBounds_; + + //- The overall bounds of all of the background meshes, used to test if + // a point that is not found on any processor is in the domain at all + treeBoundBox globalBackgroundBounds_; + + //- Decomposition dictionary + IOdictionary decomposeDict_; + + //- Decomposition method + autoPtr<decompositionMethod> decomposerPtr_; + + //- merge distance required by fvMeshDistribute + scalar mergeDist_; + + //- Scale of a cell span vs cell size used to decide to refine a cell + scalar spanScale_; + + //- Smallest minimum cell size allowed, i.e. to avoid high initial + // refinement of areas of small size + scalar minCellSizeLimit_; + + //- Minimum normal level of refinement + label minLevels_; + + //- How fine should the initial sample of the volume a box be to + // investigate the local cell size + label volRes_; + + //- Allowed factor above the average cell weight before a background + // cell needs to be split + scalar maxCellWeightCoeff_; + + + // Private Member Functions + + void initialRefinement(); + + //- Print details of the decomposed mesh + void printMeshData(const polyMesh& mesh) const; + + //- Estimate the number of vertices that will be in this cell, returns + // true if the cell is to be split because of the density ratio inside + // it + bool refineCell + ( + label cellI, + label volType, + scalar& weightEstimate + ) const; + + //- Select cells for refinement at the surface of the geometry to be + // meshed + labelList selectRefinementCells + ( + labelList& volumeStatus, + volScalarField& cellWeights + ) const; + + //- Build the surface patch and search tree + void buildPatchAndTree(); + + //- Disallow default bitwise copy construct + backgroundMeshDecomposition(const backgroundMeshDecomposition&); + + //- Disallow default bitwise assignment + void operator=(const backgroundMeshDecomposition&); + + +public: + + //- Runtime type information + ClassName("backgroundMeshDecomposition"); + + + // Constructors + + //- Construct from components in cvMesh operation + backgroundMeshDecomposition + ( + const Time& runTime, + Random& rndGen, + const conformationSurfaces& geometryToConformTo, + const dictionary& coeffsDict + ); + + + //- Destructor + ~backgroundMeshDecomposition(); + + + // Member Functions + + //- Build a mapDistribute for the supplied destination processor data + static autoPtr<mapDistribute> buildMap(const List<label>& toProc); + + //- Redistribute the background mesh based on a supplied weight field, + // returning a map to use to redistribute vertices. + autoPtr<mapDistributePolyMesh> distribute + ( + volScalarField& cellWeights + ); + + //- Distribute supplied the points to the appropriate processor + autoPtr<mapDistribute> distributePoints(List<point>& points) const; + + //- Is the given position inside the domain of this decomposition + bool positionOnThisProcessor(const point& pt) const; + + //- Are the given positions inside the domain of this decomposition + boolList positionOnThisProcessor(const List<point>& pts) const; + + //- Does the given box overlap the faces of the boundary of this + // processor + bool overlapsThisProcessor(const treeBoundBox& box) const; + + //- Does the given sphere overlap the faces of the boundary of this + // processor + bool overlapsThisProcessor + ( + const point& centre, + const scalar radiusSqr + ) const; + + //- Find nearest intersection of line between start and end, (exposing + // underlying indexedOctree) + pointIndexHit findLine + ( + const point& start, + const point& end + ) const; + + //- Find any intersection of line between start and end, (exposing + // underlying indexedOctree) + pointIndexHit findLineAny + ( + const point& start, + const point& end + ) const; + + //- What processor is the given position on? + labelList processorPosition(const List<point>& pts) const; + + //- What is the nearest processor to the given position? + labelList processorNearestPosition(const List<point>& pts) const; + + //- Which processors are intersected by the line segment, returns all + // processors whose boundary patch is intersected by the sphere. By + // default this does not return the processor that the query is + // launched from, it is assumed that the point is on that processor. + // The index data member of the pointIndexHit is replaced with the + // processor index. + List<List<pointIndexHit> > intersectsProcessors + ( + const List<point>& starts, + const List<point>& ends, + bool includeOwnProcessor = false + ) const; + + bool overlapsOtherProcessors + ( + const point& centre, + const scalar& radiusSqr + ) const; + + labelList overlapProcessors + ( + const point& centre, + const scalar radiusSqr + ) const; + +// //- Which processors overlap the given sphere, returns all processors +// // whose boundary patch is touched by the sphere or whom the sphere +// // is inside. By default this does not return the processor that the +// // query is launched from, it is assumed that the point is on that +// // processor. +// labelListList overlapsProcessors +// ( +// const List<point>& centres, +// const List<scalar>& radiusSqrs, +// const Delaunay& T, +// bool includeOwnProcessor +// ) const; + + // Access + + //- Return access to the underlying mesh + inline const fvMesh& mesh() const; + + //- Return access to the underlying tree + inline const indexedOctree<treeDataBPatch>& tree() const; + + //- Return the boundBox of this processor + inline const treeBoundBox& procBounds() const; + + //- Return the cell level of the underlying mesh + inline const labelList& cellLevel() const; + + //- Return the point level of the underlying mesh + inline const labelList& pointLevel() const; + + //- Return the current decomposition method + inline const decompositionMethod& decomposer() const; +}; + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace Foam + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#include "backgroundMeshDecompositionI.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#endif + +// ************************************************************************* // diff --git a/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/backgroundMeshDecomposition/backgroundMeshDecompositionI.H b/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/backgroundMeshDecomposition/backgroundMeshDecompositionI.H new file mode 100644 index 0000000000000000000000000000000000000000..1f8b7b0a327a1bd7d74fbf5c1ce49719cd4e9734 --- /dev/null +++ b/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/backgroundMeshDecomposition/backgroundMeshDecompositionI.H @@ -0,0 +1,67 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2011-2012 OpenFOAM Foundation + \\/ M anipulation | +------------------------------------------------------------------------------- +License + This file is part of OpenFOAM. + + OpenFOAM is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + OpenFOAM is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>. + +\*---------------------------------------------------------------------------*/ + +// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // + +const Foam::fvMesh& Foam::backgroundMeshDecomposition::mesh() const +{ + return mesh_; +} + + +const Foam::indexedOctree<Foam::treeDataBPatch>& +Foam::backgroundMeshDecomposition::tree() const +{ + return bFTreePtr_(); +} + + +const Foam::treeBoundBox& +Foam::backgroundMeshDecomposition::procBounds() const +{ + return allBackgroundMeshBounds_[Pstream::myProcNo()]; +} + + +const Foam::labelList& Foam::backgroundMeshDecomposition::cellLevel() const +{ + return meshCutter_.cellLevel(); +} + + +const Foam::labelList& Foam::backgroundMeshDecomposition::pointLevel() const +{ + return meshCutter_.pointLevel(); +} + + +const Foam::decompositionMethod& +Foam::backgroundMeshDecomposition::decomposer() const +{ + return decomposerPtr_(); +} + + +// ************************************************************************* // diff --git a/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/cellShapeControl/cellAspectRatioControl/cellAspectRatioControl.C b/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/cellShapeControl/cellAspectRatioControl/cellAspectRatioControl.C new file mode 100644 index 0000000000000000000000000000000000000000..dfba259e674b5dbd6b5cca8bb4e32ab0ff59a3b7 --- /dev/null +++ b/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/cellShapeControl/cellAspectRatioControl/cellAspectRatioControl.C @@ -0,0 +1,110 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2012 OpenFOAM Foundation + \\/ M anipulation | +------------------------------------------------------------------------------- +License + This file is part of OpenFOAM. + + OpenFOAM is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + OpenFOAM is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>. + +\*---------------------------------------------------------------------------*/ + +#include "cellAspectRatioControl.H" +#include "vectorTools.H" + +// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // + +Foam::cellAspectRatioControl::cellAspectRatioControl +( + const dictionary& motionDict +) +: + aspectRatioDict_(motionDict.subOrEmptyDict("cellAspectRatioControl")), + aspectRatio_(aspectRatioDict_.lookupOrDefault<scalar>("aspectRatio", 1.0)), + aspectRatioDirection_ + ( + aspectRatioDict_.lookupOrDefault<vector> + ( + "aspectRatioDirection", + vector(0, 0, 0) + ) + ) +{ + Info<< nl << " Cell Aspect Ratio Control" << nl + << " Ratio : " << aspectRatio_ << nl + << " Direction : " << aspectRatioDirection_ << nl << endl; +} + + +// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * // + +Foam::cellAspectRatioControl::~cellAspectRatioControl() +{} + + +// * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * * // + +void Foam::cellAspectRatioControl::updateCellSizeAndFaceArea +( + vector& alignmentDir, + scalar& targetFaceArea, + scalar& targetCellSize +) const +{ + const scalar cosAngle = mag + ( + vectorTools::cosPhi(alignmentDir, aspectRatioDirection_) + ); + + // Change target face area based on aspect ratio + targetFaceArea + += targetFaceArea + *(aspectRatio_ - 1.0) + *(1.0 - cosAngle); + + // Change target cell size based on aspect ratio + targetCellSize + += targetCellSize + *(aspectRatio_ - 1.0) + *cosAngle; + + alignmentDir *= 0.5*targetCellSize; +} + + +void Foam::cellAspectRatioControl::updateDeltaVector +( + const vector& alignmentDir, + const scalar targetCellSize, + const scalar rABMag, + vector& delta +) const +{ + const scalar cosAngle = mag + ( + vectorTools::cosPhi(alignmentDir, aspectRatioDirection_) + ); + + delta += 0.5 + *delta + *cosAngle + *(targetCellSize/rABMag) + *(aspectRatio_ - 1.0); +} + + +// ************************************************************************* // diff --git a/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/cellShapeControl/cellAspectRatioControl/cellAspectRatioControl.H b/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/cellShapeControl/cellAspectRatioControl/cellAspectRatioControl.H new file mode 100644 index 0000000000000000000000000000000000000000..ac47311940a7c3672b9c2e378946d1c5b8b658e1 --- /dev/null +++ b/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/cellShapeControl/cellAspectRatioControl/cellAspectRatioControl.H @@ -0,0 +1,115 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2012 OpenFOAM Foundation + \\/ M anipulation | +------------------------------------------------------------------------------- +License + This file is part of OpenFOAM. + + OpenFOAM is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + OpenFOAM is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>. + +Class + Foam::cellAspectRatioControl + +Description + +SourceFiles + cellAspectRatioControl.C + +\*---------------------------------------------------------------------------*/ + +#ifndef cellAspectRatioControl_H +#define cellAspectRatioControl_H + +#include "dictionary.H" +#include "vector.H" +#include "scalar.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ + + +/*---------------------------------------------------------------------------*\ + Class cellAspectRatioControl Declaration +\*---------------------------------------------------------------------------*/ + +class cellAspectRatioControl +{ + // Private data + + const dictionary aspectRatioDict_; + + const scalar aspectRatio_; + + const vector aspectRatioDirection_; + + + // Private Member Functions + + //- Disallow default bitwise copy construct + cellAspectRatioControl(const cellAspectRatioControl&); + + //- Disallow default bitwise assignment + void operator=(const cellAspectRatioControl&); + + +public: + + // Constructors + + //- Construct from dictionary + cellAspectRatioControl + ( + const dictionary& motionDict + ); + + + //- Destructor + virtual ~cellAspectRatioControl(); + + + // Member Functions + + // Query + + void updateCellSizeAndFaceArea + ( + vector& alignmentDir, + scalar& targetFaceArea, + scalar& targetCellSize + ) const; + + void updateDeltaVector + ( + const vector& alignmentDir, + const scalar targetCellSize, + const scalar rABMag, + vector& delta + ) const; +}; + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace Foam + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#endif + +// ************************************************************************* // diff --git a/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/cellShapeControl/cellShapeControl/cellShapeControl.C b/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/cellShapeControl/cellShapeControl/cellShapeControl.C new file mode 100644 index 0000000000000000000000000000000000000000..932b264f94345aa6aef7b9afb3f705e6060e9994 --- /dev/null +++ b/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/cellShapeControl/cellShapeControl/cellShapeControl.C @@ -0,0 +1,930 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2012-2013 OpenFOAM Foundation + \\/ M anipulation | +------------------------------------------------------------------------------- +License + This file is part of OpenFOAM. + + OpenFOAM is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + OpenFOAM is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>. + +\*---------------------------------------------------------------------------*/ + +#include "cellShapeControl.H" +#include "pointField.H" +#include "scalarField.H" +#include "triadField.H" +#include "cellSizeAndAlignmentControl.H" +#include "searchableSurfaceControl.H" +#include "cellSizeFunction.H" + +// * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * * // + +template <class Triangulation, class Type> +Foam::tmp<Foam::Field<Type> > Foam::cellShapeControl::filterFarPoints +( + const Triangulation& mesh, + const Field<Type>& field +) +{ + tmp<Field<Type> > tNewField(new Field<Type>(field.size())); + Field<Type>& newField = tNewField(); + + label added = 0; + label count = 0; + + for + ( + typename Triangulation::Finite_vertices_iterator vit = + mesh.finite_vertices_begin(); + vit != mesh.finite_vertices_end(); + ++vit + ) + { + if (vit->real()) + { + newField[added++] = field[count]; + } + + count++; + } + + newField.resize(added); + + return tNewField; +} + + +template <class Triangulation> +Foam::autoPtr<Foam::mapDistribute> Foam::cellShapeControl::buildReferredMap +( + const Triangulation& mesh, + labelList& indices +) +{ + globalIndex globalIndexing(mesh.vertexCount()); + + DynamicList<label> dynIndices(mesh.vertexCount()/10); + + for + ( + typename Triangulation::Finite_vertices_iterator vit = + mesh.finite_vertices_begin(); + vit != mesh.finite_vertices_end(); + ++vit + ) + { + if (vit->referred()) + { + dynIndices.append + ( + globalIndexing.toGlobal(vit->procIndex(), vit->index()) + ); + } + } + + indices.transfer(dynIndices); + + List<Map<label> > compactMap; + return autoPtr<mapDistribute> + ( + new mapDistribute + ( + globalIndexing, + indices, + compactMap + ) + ); +} + + +template <class Triangulation> +Foam::autoPtr<Foam::mapDistribute> Foam::cellShapeControl::buildMap +( + const Triangulation& mesh, + labelListList& pointPoints +) +{ + pointPoints.setSize(mesh.vertexCount()); + + globalIndex globalIndexing(mesh.vertexCount()); + + for + ( + typename Triangulation::Finite_vertices_iterator vit = + mesh.finite_vertices_begin(); + vit != mesh.finite_vertices_end(); + ++vit + ) + { + if (!vit->real()) + { + continue; + } + + std::list<typename Triangulation::Vertex_handle> adjVerts; + mesh.finite_adjacent_vertices(vit, std::back_inserter(adjVerts)); + + DynamicList<label> indices(adjVerts.size()); + + for + ( + typename std::list<typename Triangulation::Vertex_handle>:: + const_iterator adjVertI = adjVerts.begin(); + adjVertI != adjVerts.end(); + ++adjVertI + ) + { + typename Triangulation::Vertex_handle vh = *adjVertI; + + if (!vh->farPoint()) + { + indices.append + ( + globalIndexing.toGlobal(vh->procIndex(), vh->index()) + ); + } + } + + pointPoints[vit->index()].transfer(indices); + } + + List<Map<label> > compactMap; + return autoPtr<mapDistribute> + ( + new mapDistribute + ( + globalIndexing, + pointPoints, + compactMap + ) + ); +} + + +template <class Triangulation> +Foam::tmp<Foam::triadField> Foam::cellShapeControl::buildAlignmentField +( + const Triangulation& mesh +) +{ + tmp<triadField> tAlignments + ( + new triadField(mesh.vertexCount(), triad::unset) + ); + triadField& alignments = tAlignments(); + + for + ( + typename Triangulation::Finite_vertices_iterator vit = + mesh.finite_vertices_begin(); + vit != mesh.finite_vertices_end(); + ++vit + ) + { + if (!vit->real()) + { + continue; + } + + alignments[vit->index()] = vit->alignment(); + } + + return tAlignments; +} + + +template <class Triangulation> +Foam::tmp<Foam::pointField> Foam::cellShapeControl::buildPointField +( + const Triangulation& mesh +) +{ + tmp<pointField> tPoints + ( + new pointField(mesh.vertexCount(), point(GREAT, GREAT, GREAT)) + ); + pointField& points = tPoints(); + + for + ( + typename Triangulation::Finite_vertices_iterator vit = + mesh.finite_vertices_begin(); + vit != mesh.finite_vertices_end(); + ++vit + ) + { + if (!vit->real()) + { + continue; + } + + points[vit->index()] = topoint(vit->point()); + } + + return tPoints; +} + + +// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // + +Foam::cellShapeControl::cellShapeControl +( + const Time& runTime, + const dictionary& motionDict, + const searchableSurfaces& allGeometry, + const conformationSurfaces& geometryToConformTo +) +: + dictionary(motionDict), + runTime_(runTime), + allGeometry_(allGeometry), + geometryToConformTo_(geometryToConformTo), + defaultCellSize_(readScalar(lookup("defaultCellSize"))), + minimumCellSize_(readScalar(lookup("minimumCellSize"))), + shapeControlMesh_(runTime), + aspectRatio_(motionDict), + sizeAndAlignment_ + ( + runTime, + motionDict.subDict("shapeControlFunctions"), + geometryToConformTo, + defaultCellSize_ + ) +{} + + +// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * // + +Foam::cellShapeControl::~cellShapeControl() +{} + + +// * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * * // + +Foam::scalarField Foam::cellShapeControl::cellSize +( + const pointField& pts +) const +{ + scalarField cellSizes(pts.size()); + + forAll(pts, i) + { + cellSizes[i] = cellSize(pts[i]); + } + + return cellSizes; +} + + +Foam::scalar Foam::cellShapeControl::cellSize(const point& pt) const +{ + scalarList bary; + cellShapeControlMesh::Cell_handle ch; + + shapeControlMesh_.barycentricCoords(pt, bary, ch); + + scalar size = 0; + + label nFarPoints = 0; + for (label pI = 0; pI < 4; ++pI) + { + if (ch->vertex(pI)->farPoint()) + { + nFarPoints++; + } + } + + if (shapeControlMesh_.is_infinite(ch)) + { +// if (nFarPoints != 0) +// { +// for (label pI = 0; pI < 4; ++pI) +// { +// if (!ch->vertex(pI)->farPoint()) +// { +// size = ch->vertex(pI)->targetCellSize(); +// return size; +// } +// } +// } + + // Look up nearest point + cellShapeControlMesh::Vertex_handle nearV = + shapeControlMesh_.nearest_vertex + ( + toPoint<cellShapeControlMesh::Point>(pt) + ); + + size = nearV->targetCellSize(); + } + else + { + if (nFarPoints != 0) + { + for (label pI = 0; pI < 4; ++pI) + { + if (!ch->vertex(pI)->farPoint()) + { + size = ch->vertex(pI)->targetCellSize(); + return size; + } + } + } + else + { + forAll(bary, pI) + { + size += bary[pI]*ch->vertex(pI)->targetCellSize(); + } + } + } + + return size; +} + + +//- Return the cell alignment at the given location +Foam::tensor Foam::cellShapeControl::cellAlignment(const point& pt) const +{ + scalarList bary; + cellShapeControlMesh::Cell_handle ch; + + shapeControlMesh_.barycentricCoords(pt, bary, ch); + + tensor alignment = tensor::zero; + + label nFarPoints = 0; + for (label pI = 0; pI < 4; ++pI) + { + if (ch->vertex(pI)->farPoint()) + { + nFarPoints++; + } + } + + if (shapeControlMesh_.is_infinite(ch) || nFarPoints == 4) + { + Pout<< "At Infinite vertex" << endl; + + if (nFarPoints != 0) + { + for (label pI = 0; pI < 4; ++pI) + { + if (!ch->vertex(pI)->farPoint()) + { + alignment = ch->vertex(pI)->alignment(); + return alignment; + } + } + } + +// cellShapeControlMesh::Vertex_handle nearV = +// shapeControlMesh_.nearest_vertex +// ( +// toPoint<cellShapeControlMesh::Point>(pt) +// ); +// +// alignment = nearV->alignment(); + } + else + { +// forAll(bary, pI) +// { +// alignment += bary[pI]*ch->vertex(pI)->alignment(); +// } + + cellShapeControlMesh::Vertex_handle nearV = + shapeControlMesh_.nearest_vertex_in_cell + ( + toPoint<cellShapeControlMesh::Point>(pt), + ch + ); + + alignment = nearV->alignment(); + } + + return alignment; +} + + +void Foam::cellShapeControl::cellSizeAndAlignment +( + const point& pt, + scalar& size, + tensor& alignment +) const +{ + scalarList bary; + cellShapeControlMesh::Cell_handle ch; + + shapeControlMesh_.barycentricCoords(pt, bary, ch); + + alignment = tensor::zero; + size = 0; + + label nFarPoints = 0; + for (label pI = 0; pI < 4; ++pI) + { + if (ch->vertex(pI)->farPoint()) + { + nFarPoints++; + } + } + + if (shapeControlMesh_.is_infinite(ch)) + { + if (nFarPoints != 0) + { + for (label pI = 0; pI < 4; ++pI) + { + if (!ch->vertex(pI)->farPoint()) + { + size = ch->vertex(pI)->targetCellSize(); + alignment = ch->vertex(pI)->alignment(); + return; + } + } + } + +// cellShapeControlMesh::Vertex_handle nearV = +// shapeControlMesh_.nearest_vertex +// ( +// toPoint<cellShapeControlMesh::Point>(pt) +// ); +// +// size = nearV->targetCellSize(); +// alignment = nearV->alignment(); + } + else + { + if (nFarPoints != 0) + { + for (label pI = 0; pI < 4; ++pI) + { + if (!ch->vertex(pI)->farPoint()) + { + size = ch->vertex(pI)->targetCellSize(); + alignment = ch->vertex(pI)->alignment(); + return; + } + } + } + else + { +// triad tri; + + forAll(bary, pI) + { + size += bary[pI]*ch->vertex(pI)->targetCellSize(); + +// triad triTmp2 = ch->vertex(pI)->alignment(); +// tri += triTmp2*bary[pI]; + } + +// tri.normalize(); +// tri.orthogonalize(); +// tri = tri.sortxyz(); +// +// alignment = tri; + + cellShapeControlMesh::Vertex_handle nearV = + shapeControlMesh_.nearest_vertex + ( + toPoint<cellShapeControlMesh::Point>(pt) + ); + + alignment = nearV->alignment(); + } + } +} + + +void Foam::cellShapeControl::initialMeshPopulation +( + const autoPtr<backgroundMeshDecomposition>& decomposition +) +{ + // Need to pass in the background mesh decomposition so that can test if + // a point to insert is on the processor. + if (Pstream::parRun()) + { + shapeControlMesh_.insertBoundingPoints(decomposition().procBounds()); + } + else + { + shapeControlMesh_.insertBoundingPoints(allGeometry_.bounds()); + } + + const PtrList<cellSizeAndAlignmentControl>& controlFunctions = + sizeAndAlignment_.controlFunctions(); + + forAll(controlFunctions, fI) + { + const cellSizeAndAlignmentControl& controlFunction = + controlFunctions[fI]; + + Info<< "Inserting points from " << controlFunction.name() + << " (" << controlFunction.type() << ")" << endl; + + pointField pts; + scalarField sizes; + triadField alignments; + + controlFunction.initialVertices(pts, sizes, alignments); + + List<Vb> vertices(pts.size()); + + // Clip the minimum size + forAll(vertices, vI) + { + vertices[vI] = Vb(pts[vI], Vb::vtInternal); + vertices[vI].targetCellSize() = max(sizes[vI], minimumCellSize_); + vertices[vI].alignment() = alignments[vI]; + } + + pts.clear(); + sizes.clear(); + alignments.clear(); + + label nRejected = 0; + + PackedBoolList keepVertex(vertices.size(), true); + + if (Pstream::parRun()) + { + forAll(vertices, vI) + { + const bool onProc = decomposition().positionOnThisProcessor + ( + topoint(vertices[vI].point()) + ); + + if (!onProc) + { + keepVertex[vI] = false; + } + } + } + + inplaceSubset(keepVertex, vertices); + + const label preInsertedSize = shapeControlMesh_.number_of_vertices(); + + shapeControlMesh_.rangeInsertWithInfo(vertices.begin(), vertices.end()); + + Info<< " Inserted " + << returnReduce + ( + shapeControlMesh_.number_of_vertices() + - preInsertedSize, sumOp<label>() + ) + << "/" << vertices.size() + << endl; + } +} + + +Foam::label Foam::cellShapeControl::refineMesh +( + const autoPtr<backgroundMeshDecomposition>& decomposition +) +{ + const pointField cellCentres(shapeControlMesh_.cellCentres()); + + Info<< " Created cell centres" << endl; + + const PtrList<cellSizeAndAlignmentControl>& controlFunctions = + sizeAndAlignment_.controlFunctions(); + + DynamicList<Vb> verts(shapeControlMesh_.number_of_vertices()); + + forAll(cellCentres, cellI) + { + const Foam::point& pt = cellCentres[cellI]; + + if (!geometryToConformTo_.inside(pt)) + { + continue; + } + + scalarList bary; + cellShapeControlMesh::Cell_handle ch; + + shapeControlMesh_.barycentricCoords(pt, bary, ch); + + if (shapeControlMesh_.is_infinite(ch)) + { + continue; + } + + scalar interpolatedSize = 0; + forAll(bary, pI) + { + interpolatedSize += bary[pI]*ch->vertex(pI)->targetCellSize(); + } + + label lastPriority = labelMax; + scalar lastCellSize = GREAT; + forAll(controlFunctions, fI) + { + const cellSizeAndAlignmentControl& controlFunction = + controlFunctions[fI]; + + if (controlFunction.priority() > lastPriority) + { + continue; + } + + if (isA<searchableSurfaceControl>(controlFunction)) + { + const cellSizeFunction& sizeFunction = + dynamicCast<const searchableSurfaceControl> + ( + controlFunction + ).sizeFunction(); + + scalar cellSize = 0; + if (sizeFunction.cellSize(pt, cellSize)) + { + if (controlFunction.priority() == lastPriority) + { + if (cellSize < lastCellSize) + { + lastCellSize = cellSize; + } + } + else + { + lastCellSize = cellSize; + } + + lastPriority = controlFunction.priority(); + } + } + } + + if + ( + lastCellSize < GREAT + //&& mag(interpolatedSize - lastCellSize)/lastCellSize > 0.2 + ) + { + if (Pstream::parRun()) + { + if (!decomposition().positionOnThisProcessor(pt)) + { + continue; + } + } + + verts.append + ( + Vb + ( + toPoint<cellShapeControlMesh::Point>(pt), + Vb::vtInternal + ) + ); + verts.last().targetCellSize() = lastCellSize; + verts.last().alignment() = triad::unset; + } + } + + shapeControlMesh_.insertPoints(verts); + + return verts.size(); +} + + +void Foam::cellShapeControl::smoothMesh() +{ + label maxSmoothingIterations = readLabel(lookup("maxSmoothingIterations")); + scalar minResidual = 0; + + labelListList pointPoints; + autoPtr<mapDistribute> meshDistributor = buildMap + ( + shapeControlMesh_, + pointPoints + ); + + triadField alignments(buildAlignmentField(shapeControlMesh_)); + pointField points(buildPointField(shapeControlMesh_)); + // Setup the sizes and alignments on each point + triadField fixedAlignments(shapeControlMesh_.vertexCount(), triad::unset); + + for + ( + CellSizeDelaunay::Finite_vertices_iterator vit = + shapeControlMesh_.finite_vertices_begin(); + vit != shapeControlMesh_.finite_vertices_end(); + ++vit + ) + { + if (vit->real()) + { + fixedAlignments[vit->index()] = vit->alignment(); + } + } + + Info<< nl << "Smoothing alignments" << endl; + + for (label iter = 0; iter < maxSmoothingIterations; iter++) + { + Info<< "Iteration " << iter; + + meshDistributor().distribute(points); + meshDistributor().distribute(alignments); + + scalar residual = 0; + + triadField triadAv(alignments.size(), triad::unset); + + forAll(pointPoints, pI) + { + const labelList& pPoints = pointPoints[pI]; + + if (pPoints.empty()) + { + continue; + } + + triad& newTriad = triadAv[pI]; + + forAll(pPoints, adjPointI) + { + const label adjPointIndex = pPoints[adjPointI]; + + scalar dist = mag(points[pI] - points[adjPointIndex]); + + triad tmpTriad = alignments[adjPointIndex]; + + for (direction dir = 0; dir < 3; dir++) + { + if (tmpTriad.set(dir)) + { + tmpTriad[dir] *= (1.0/dist); + } + } + + newTriad += tmpTriad; + } + + newTriad.normalize(); + newTriad.orthogonalize(); + newTriad = newTriad.sortxyz(); + + // Enforce the boundary conditions + const triad& fixedAlignment = fixedAlignments[pI]; + + label nFixed = 0; + + forAll(fixedAlignment, dirI) + { + if (fixedAlignment.set(dirI)) + { + nFixed++; + } + } + + if (nFixed == 1) + { + forAll(fixedAlignment, dirI) + { + if (fixedAlignment.set(dirI)) + { + newTriad.align(fixedAlignment[dirI]); + } + } + } + else if (nFixed == 2) + { + forAll(fixedAlignment, dirI) + { + if (fixedAlignment.set(dirI)) + { + newTriad[dirI] = fixedAlignment[dirI]; + } + else + { + newTriad[dirI] = triad::unset[dirI]; + } + } + + newTriad.orthogonalize(); + } + else if (nFixed == 3) + { + forAll(fixedAlignment, dirI) + { + if (fixedAlignment.set(dirI)) + { + newTriad[dirI] = fixedAlignment[dirI]; + } + } + } + + const triad& oldTriad = alignments[pI]; + + for (direction dir = 0; dir < 3; ++dir) + { + if + ( + newTriad.set(dir) + && oldTriad.set(dir) + //&& !fixedAlignment.set(dir) + ) + { + scalar dotProd = (oldTriad[dir] & newTriad[dir]); + scalar diff = mag(dotProd) - 1.0; + + residual += mag(diff); + } + } + +// if (iter == 198 || iter == 199) +// { +// Info<< "Triad" << nl +// << " Fixed (" << nFixed << ") = " << fixedAlignment +// << nl +// << " Old = " << oldTriad << nl +// << " Pre-Align= " << triadAv[pI] << nl +// << " New = " << newTriad << nl +// << " Residual = " << residual << endl; +// } + } + + forAll(alignments, pI) + { + alignments[pI] = triadAv[pI].sortxyz(); + } + + reduce(residual, sumOp<scalar>()); + + Info<< ", Residual = " << residual << endl; + + if (iter > 0 && residual <= minResidual) + { + break; + } + } + + meshDistributor().distribute(alignments); + + for + ( + CellSizeDelaunay::Finite_vertices_iterator vit = + shapeControlMesh_.finite_vertices_begin(); + vit != shapeControlMesh_.finite_vertices_end(); + ++vit + ) + { + if (vit->real()) + { + vit->alignment() = alignments[vit->index()]; + } + } + + labelList referredPoints; + autoPtr<mapDistribute> referredDistributor = buildReferredMap + ( + shapeControlMesh_, + referredPoints + ); + + alignments.setSize(shapeControlMesh_.vertexCount()); + referredDistributor().distribute(alignments); + + label referredI = 0; + for + ( + CellSizeDelaunay::Finite_vertices_iterator vit = + shapeControlMesh_.finite_vertices_begin(); + vit != shapeControlMesh_.finite_vertices_end(); + ++vit + ) + { + if (vit->referred()) + { + vit->alignment() = alignments[referredPoints[referredI++]]; + } + } +} + + +// ************************************************************************* // diff --git a/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/cellShapeControl/cellShapeControl/cellShapeControl.H b/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/cellShapeControl/cellShapeControl/cellShapeControl.H new file mode 100644 index 0000000000000000000000000000000000000000..040ff6f2e09ee51571a0f525ec6507816a9bf1d7 --- /dev/null +++ b/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/cellShapeControl/cellShapeControl/cellShapeControl.H @@ -0,0 +1,213 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2012-2013 OpenFOAM Foundation + \\/ M anipulation | +------------------------------------------------------------------------------- +License + This file is part of OpenFOAM. + + OpenFOAM is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + OpenFOAM is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>. + +Class + Foam::cellShapeControl + +Description + +SourceFiles + cellShapeControlI.H + cellShapeControl.C + +\*---------------------------------------------------------------------------*/ + +#ifndef cellShapeControl_H +#define cellShapeControl_H + +#include "dictionary.H" +#include "autoPtr.H" +#include "tensor.H" +#include "point.H" +#include "primitiveFieldsFwd.H" +#include "pointFieldFwd.H" +#include "Time.H" +#include "searchableSurfaces.H" +#include "conformationSurfaces.H" +#include "cellAspectRatioControl.H" +#include "cellSizeAndAlignmentControls.H" +#include "cellShapeControlMesh.H" +#include "backgroundMeshDecomposition.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ + + +/*---------------------------------------------------------------------------*\ + Class cellShapeControl Declaration +\*---------------------------------------------------------------------------*/ + +class cellShapeControl +: + public dictionary +{ + // Private data + + const Time& runTime_; + + const searchableSurfaces& allGeometry_; + + const conformationSurfaces& geometryToConformTo_; + + const scalar defaultCellSize_; + + const scalar minimumCellSize_; + + cellShapeControlMesh shapeControlMesh_; + + cellAspectRatioControl aspectRatio_; + + cellSizeAndAlignmentControls sizeAndAlignment_; + + + // Private Member Functions + + template <class Triangulation, class Type> + tmp<Field<Type> > filterFarPoints + ( + const Triangulation& mesh, + const Field<Type>& field + ); + + template <class Triangulation> + autoPtr<mapDistribute> buildMap + ( + const Triangulation& mesh, + labelListList& pointPoints + ); + + template <class Triangulation> + autoPtr<mapDistribute> buildReferredMap + ( + const Triangulation& mesh, + labelList& indices + ); + + template <class Triangulation> + tmp<triadField> buildAlignmentField(const Triangulation& mesh); + + template <class Triangulation> + tmp<pointField> buildPointField(const Triangulation& mesh); + + //- Disallow default bitwise copy construct + cellShapeControl(const cellShapeControl&); + + //- Disallow default bitwise assignment + void operator=(const cellShapeControl&); + + +public: + + //- Runtime type information + ClassName("cellShapeControl"); + + + // Constructors + + //- Construct from dictionary and references to conformalVoronoiMesh and + // searchableSurfaces + cellShapeControl + ( + const Time& runTime, + const dictionary& cellShapeControlDict, + const searchableSurfaces& allGeometry, + const conformationSurfaces& geometryToConformTo + ); + + + //- Destructor + ~cellShapeControl(); + + + // Member Functions + + // Access + + inline const scalar& defaultCellSize() const; + + inline cellShapeControlMesh& shapeControlMesh(); + + inline const cellShapeControlMesh& shapeControlMesh() const; + + inline const cellAspectRatioControl& aspectRatio() const; + + inline const cellSizeAndAlignmentControls& sizeAndAlignment() const; + + + // Query + + //- Return the cell size at the given location + scalar cellSize(const point& pt) const; + + scalarField cellSize(const pointField& pts) const; + + //- Return the cell alignment at the given location + tensor cellAlignment(const point& pt) const; + + void cellSizeAndAlignment + ( + const point& pt, + scalar& size, + tensor& alignment + ) const; + + + // Edit + + void initialMeshPopulation + ( + const autoPtr<backgroundMeshDecomposition>& decomposition + ); + + label refineMesh + ( + const autoPtr<backgroundMeshDecomposition>& decomposition + ); + + void smoothMesh(); + + //- Add a control point with a specified size and alignment +// virtual void addControlPoint +// ( +// const point& pt, +// const scalar& size, +// const tensor& alignment +// ); +}; + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace Foam + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#include "cellShapeControlI.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#endif + +// ************************************************************************* // diff --git a/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/cellShapeControl/cellShapeControl/cellShapeControlI.H b/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/cellShapeControl/cellShapeControl/cellShapeControlI.H new file mode 100644 index 0000000000000000000000000000000000000000..f7fdebc93192998027adbdfc2ba6527221a0b248 --- /dev/null +++ b/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/cellShapeControl/cellShapeControl/cellShapeControlI.H @@ -0,0 +1,55 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2012 OpenFOAM Foundation + \\/ M anipulation | +------------------------------------------------------------------------------- +License + This file is part of OpenFOAM. + + OpenFOAM is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + OpenFOAM is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>. + +\*---------------------------------------------------------------------------*/ + +// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // + +inline Foam::cellShapeControlMesh& +Foam::cellShapeControl::shapeControlMesh() +{ + return shapeControlMesh_; +} + + +inline const Foam::cellShapeControlMesh& +Foam::cellShapeControl::shapeControlMesh() const +{ + return shapeControlMesh_; +} + + +inline const Foam::scalar& Foam::cellShapeControl::defaultCellSize() const +{ + return defaultCellSize_; +} + + +inline const Foam::cellAspectRatioControl& +Foam::cellShapeControl::aspectRatio() const +{ + return aspectRatio_; +} + + +// ************************************************************************* // diff --git a/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/cellShapeControl/cellShapeControlMesh/cellShapeControlMesh.C b/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/cellShapeControl/cellShapeControlMesh/cellShapeControlMesh.C new file mode 100644 index 0000000000000000000000000000000000000000..ae57bbb087bb74a2f37f0efb6a4d52b6f4daaeec --- /dev/null +++ b/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/cellShapeControl/cellShapeControlMesh/cellShapeControlMesh.C @@ -0,0 +1,760 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2012 OpenFOAM Foundation + \\/ M anipulation | +------------------------------------------------------------------------------- +License + This file is part of OpenFOAM. + + OpenFOAM is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + OpenFOAM is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>. + +\*---------------------------------------------------------------------------*/ + +#include "cellShapeControlMesh.H" +#include "pointIOField.H" +#include "scalarIOField.H" +#include "tensorIOField.H" +#include "tetrahedron.H" +#include "plane.H" +#include "transform.H" +#include "meshTools.H" + +// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * // + +namespace Foam +{ + +defineTypeNameAndDebug(cellShapeControlMesh, 0); + +} + + +// * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * * // + +//Foam::tensor Foam::cellShapeControlMesh::requiredAlignment +//( +// const Foam::point& pt, +// const searchableSurfaces& allGeometry, +// const conformationSurfaces& geometryToConformTo +//) const +//{ +// pointIndexHit surfHit; +// label hitSurface; +// +// geometryToConformTo.findSurfaceNearest +// ( +// pt, +// sqr(GREAT), +// surfHit, +// hitSurface +// ); +// +// if (!surfHit.hit()) +// { +// FatalErrorIn +// ( +// "Foam::tensor Foam::conformalVoronoiMesh::requiredAlignment" +// ) << "findSurfaceNearest did not find a hit across the surfaces." +// << exit(FatalError) << endl; +// } +// +// // Primary alignment +// +// vectorField norm(1); +// +// allGeometry[hitSurface].getNormal +// ( +// List<pointIndexHit>(1, surfHit), +// norm +// ); +// +// const vector np = norm[0]; +// +// // Generate equally spaced 'spokes' in a circle normal to the +// // direction from the vertex to the closest point on the surface +// // and look for a secondary intersection. +// +// const vector d = surfHit.hitPoint() - pt; +// +// const tensor Rp = rotationTensor(vector(0,0,1), np); +// +// const label s = 36;//cvMeshControls().alignmentSearchSpokes(); +// +// scalar closestSpokeHitDistance = GREAT; +// +// pointIndexHit closestSpokeHit; +// +// label closestSpokeSurface = -1; +// +// const scalar spanMag = geometryToConformTo.globalBounds().mag(); +// +// for (label i = 0; i < s; i++) +// { +// vector spoke +// ( +// Foam::cos(i*constant::mathematical::twoPi/s), +// Foam::sin(i*constant::mathematical::twoPi/s), +// 0 +// ); +// +// spoke *= spanMag; +// +// spoke = Rp & spoke; +// +// pointIndexHit spokeHit; +// +// label spokeSurface = -1; +// +// // internal spoke +// +// geometryToConformTo.findSurfaceNearestIntersection +// ( +// pt, +// pt + spoke, +// spokeHit, +// spokeSurface +// ); +// +// if (spokeHit.hit()) +// { +// scalar spokeHitDistance = mag +// ( +// spokeHit.hitPoint() - pt +// ); +// +// if (spokeHitDistance < closestSpokeHitDistance) +// { +// closestSpokeHit = spokeHit; +// closestSpokeSurface = spokeSurface; +// closestSpokeHitDistance = spokeHitDistance; +// } +// } +// +// //external spoke +// +// Foam::point mirrorPt = pt + 2*d; +// +// geometryToConformTo.findSurfaceNearestIntersection +// ( +// mirrorPt, +// mirrorPt + spoke, +// spokeHit, +// spokeSurface +// ); +// +// if (spokeHit.hit()) +// { +// scalar spokeHitDistance = mag +// ( +// spokeHit.hitPoint() - mirrorPt +// ); +// +// if (spokeHitDistance < closestSpokeHitDistance) +// { +// closestSpokeHit = spokeHit; +// closestSpokeSurface = spokeSurface; +// closestSpokeHitDistance = spokeHitDistance; +// } +// } +// } +// +// if (closestSpokeSurface == -1) +// { +//// WarningIn +//// ( +//// "conformalVoronoiMesh::requiredAlignment" +//// "(" +//// "const Foam::point& pt" +//// ") const" +//// ) << "No secondary surface hit found in spoke search " +//// << "using " << s +//// << " spokes, try increasing alignmentSearchSpokes." +//// << endl; +// +// return I; +// } +// +// // Auxiliary alignment generated by spoke intersection normal. +// +// allGeometry[closestSpokeSurface].getNormal +// ( +// List<pointIndexHit>(1, closestSpokeHit), +// norm +// ); +// +// const vector& na = norm[0]; +// +// // Secondary alignment +// vector ns = np ^ na; +// +// if (mag(ns) < SMALL) +// { +// FatalErrorIn("conformalVoronoiMesh::requiredAlignment") +// << "Parallel normals detected in spoke search." << nl +// << "point: " << pt << nl +// << "closest surface point: " << surfHit.hitPoint() << nl +// << "closest spoke hit: " << closestSpokeHit.hitPoint() << nl +// << "np: " << surfHit.hitPoint() + np << nl +// << "ns: " << closestSpokeHit.hitPoint() + na << nl +// << exit(FatalError); +// } +// +// ns /= mag(ns); +// +// tensor Rs = rotationTensor((Rp & vector(0,1,0)), ns); +// +// return (Rs & Rp); +//} + + +Foam::label Foam::cellShapeControlMesh::removePoints() +{ + label nRemoved = 0; + for + ( + CellSizeDelaunay::Finite_vertices_iterator vit = + finite_vertices_begin(); + vit != finite_vertices_end(); + ++vit + ) + { + std::list<Vertex_handle> verts; + adjacent_vertices(vit, std::back_inserter(verts)); + + bool removePt = true; + for + ( + std::list<Vertex_handle>::iterator aVit = verts.begin(); + aVit != verts.end(); + ++aVit + ) + { + Vertex_handle avh = *aVit; + + scalar diff = + mag(avh->targetCellSize() - vit->targetCellSize()) + /max(vit->targetCellSize(), 1e-6); + + if (diff > 0.05) + { + removePt = false; + } + } + + if (removePt) + { + remove(vit); + nRemoved++; + } + } + + return nRemoved; +} + + +Foam::tmp<Foam::pointField> Foam::cellShapeControlMesh::cellCentres() const +{ + tmp<pointField> tcellCentres(new pointField(number_of_finite_cells())); + pointField& cellCentres = tcellCentres(); + + label count = 0; + for + ( + CellSizeDelaunay::Finite_cells_iterator c = finite_cells_begin(); + c != finite_cells_end(); + ++c + ) + { + if (c->hasFarPoint()) + { + continue; + } + + scalarList bary; + cellShapeControlMesh::Cell_handle ch; + + const Foam::point centre = topoint + ( + CGAL::centroid<baseK> + ( + c->vertex(0)->point(), + c->vertex(1)->point(), + c->vertex(2)->point(), + c->vertex(3)->point() + ) + ); + + cellCentres[count++] = centre; + } + + cellCentres.resize(count); + + return tcellCentres; +} + + +void Foam::cellShapeControlMesh::writeTriangulation() +{ + OFstream str + ( + "refinementTriangulation_" + + name(Pstream::myProcNo()) + + ".obj" + ); + + label count = 0; + + Info<< "Write refinementTriangulation" << endl; + + for + ( + CellSizeDelaunay::Finite_edges_iterator e = finite_edges_begin(); + e != finite_edges_end(); + ++e + ) + { + Cell_handle c = e->first; + Vertex_handle vA = c->vertex(e->second); + Vertex_handle vB = c->vertex(e->third); + + // Don't write far edges + if (vA->farPoint() || vB->farPoint()) + { + continue; + } + + // Don't write unowned edges + if (vA->referred() && vB->referred()) + { + continue; + } + + pointFromPoint p1 = topoint(vA->point()); + pointFromPoint p2 = topoint(vB->point()); + + meshTools::writeOBJ(str, p1, p2, count); + } + + if (is_valid()) + { + Info<< " Triangulation is valid" << endl; + } + else + { + FatalErrorIn + ( + "Foam::triangulatedMesh::writeRefinementTriangulation()" + ) << "Triangulation is not valid" + << abort(FatalError); + } +} + + +// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // + +Foam::cellShapeControlMesh::cellShapeControlMesh(const Time& runTime) +: + runTime_(runTime), + defaultCellSize_(0.0) +{} + + +//Foam::triangulatedMesh::triangulatedMesh +//( +// const Time& runTime, +// const fileName& pointsFile, +// const fileName& sizesFile, +// const fileName& alignmentsFile, +// const scalar& defaultCellSize +//) +//: +// defaultCellSize_(defaultCellSize) +//{ +// Info<< " Reading points from file : " << pointsFile << endl; +// +// pointIOField points +// ( +// IOobject +// ( +// pointsFile, +// runTime.constant(), +// runTime, +// IOobject::MUST_READ, +// IOobject::NO_WRITE +// ) +// ); +// +// Info<< " Reading sizes from file : " << sizesFile << endl; +// +// scalarIOField sizes +// ( +// IOobject +// ( +// sizesFile, +// runTime.constant(), +// runTime, +// IOobject::MUST_READ, +// IOobject::NO_WRITE +// ) +// ); +// +// Info<< " Reading alignments from file : " << alignmentsFile << endl; +// +// tensorIOField alignments +// ( +// IOobject +// ( +// alignmentsFile, +// runTime.constant(), +// runTime, +// IOobject::MUST_READ, +// IOobject::NO_WRITE +// ) +// ); +// +// Info<< " Number of points : " << points.size() << endl; +// Info<< " Minimum size : " << min(sizes) << endl; +// Info<< " Average size : " << average(sizes) << endl; +// Info<< " Maximum size : " << max(sizes) << endl; +// +// forAll(points, pI) +// { +// size_t nVert = number_of_vertices(); +// +// Vertex_handle v = insert +// ( +// Point(points[pI].x(), points[pI].y(), points[pI].z()) +// ); +// +// if (number_of_vertices() == nVert) +// { +// Info<< " Failed to insert point : " << points[pI] << endl; +// } +// +// v->targetCellSize() = sizes[pI]; +// +// const tensor& alignment = alignments[pI]; +// +// +// +// v->alignment() = alignment; +// } +// +//// scalar factor = 1.0; +//// label maxIteration = 1; +//// +//// for (label iteration = 0; iteration < maxIteration; ++iteration) +//// { +//// Info<< "Iteration : " << iteration << endl; +//// +//// label nRefined = refineTriangulation(factor); +//// +//// Info<< " Number of cells refined in refinement iteration : " +//// << nRefined << nl << endl; +//// +//// if (nRefined <= 0 && iteration != 0) +//// { +//// break; +//// } +//// +//// factor *= 1.5; +//// } +// +// //writeRefinementTriangulation(); +//} + + +//Foam::triangulatedMesh::triangulatedMesh +//( +// const Time& runTime, +// const DynamicList<Foam::point>& points, +// const DynamicList<scalar>& sizes, +// const DynamicList<tensor>& alignments, +// const scalar& defaultCellSize +//) +//: +// defaultCellSize_(defaultCellSize) +//{ +// forAll(points, pI) +// { +// size_t nVert = number_of_vertices(); +// +// Vertex_handle v = insert +// ( +// Point(points[pI].x(), points[pI].y(), points[pI].z()) +// ); +// +// if (number_of_vertices() == nVert) +// { +// Info<< "Failed to insert point : " << points[pI] << endl; +// } +// +// v->targetCellSize() = sizes[pI]; +// +// v->alignment() = alignments[pI]; +// } +// +// //writeRefinementTriangulation(); +// +// Info<< nl << "Refinement triangulation information: " << endl; +// Info<< " Number of vertices: " << label(number_of_vertices()) << endl; +// Info<< " Number of cells : " +// << label(number_of_finite_cells()) << endl; +// Info<< " Number of faces : " +// << label(number_of_finite_facets()) << endl; +// Info<< " Number of edges : " +// << label(number_of_finite_edges()) << endl; +// Info<< " Dimensionality : " << label(dimension()) << nl << endl; +//} + + +// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * // + +Foam::cellShapeControlMesh::~cellShapeControlMesh() +{} + + +// * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * * // + +void Foam::cellShapeControlMesh::barycentricCoords +( + const Foam::point& pt, + scalarList& bary, + Cell_handle& ch +) const +{ + // Use the previous cell handle as a hint on where to start searching + ch = locate + ( + Point(pt.x(), pt.y(), pt.z()) + ); + + if (!is_infinite(ch)) + { + oldCellHandle_ = ch; + + tetPointRef tet + ( + topoint(ch->vertex(0)->point()), + topoint(ch->vertex(1)->point()), + topoint(ch->vertex(2)->point()), + topoint(ch->vertex(3)->point()) + ); + + tet.barycentric(pt, bary); + } +} + + +Foam::boundBox Foam::cellShapeControlMesh::bounds() const +{ + DynamicList<Foam::point> pts(number_of_vertices()); + + for + ( + Finite_vertices_iterator vit = finite_vertices_begin(); + vit != finite_vertices_end(); + ++vit + ) + { + if (vit->real()) + { + pts.append(topoint(vit->point())); + } + } + + boundBox bb(pts); + + return bb; +} + + +void Foam::cellShapeControlMesh::distribute +( + const backgroundMeshDecomposition& decomposition +) +{ + if (!Pstream::parRun()) + { + return; + } + + autoPtr<mapDistribute> mapDist = + DistributedDelaunayMesh<CellSizeDelaunay>::distribute(decomposition); + + DynamicList<Foam::point> points(number_of_vertices()); + DynamicList<scalar> sizes(number_of_vertices()); + DynamicList<tensor> alignments(number_of_vertices()); + + for + ( + Finite_vertices_iterator vit = finite_vertices_begin(); + vit != finite_vertices_end(); + ++vit + ) + { + if (vit->real()) + { + points.append(topoint(vit->point())); + sizes.append(vit->targetCellSize()); + alignments.append(vit->alignment()); + } + } + + mapDist().distribute(points); + mapDist().distribute(sizes); + mapDist().distribute(alignments); + + // Reset the entire tessellation + DelaunayMesh<CellSizeDelaunay>::reset(); + + Info<< nl << " Inserting distributed tessellation" << endl; + + insertBoundingPoints(decomposition.procBounds()); + + // Internal points have to be inserted first + + DynamicList<Vb> verticesToInsert(points.size()); + + forAll(points, pI) + { + verticesToInsert.append + ( + Vb + ( + toPoint<Point>(points[pI]), + -1, + Vb::vtInternal, + Pstream::myProcNo() + ) + ); + + verticesToInsert.last().targetCellSize() = sizes[pI]; + verticesToInsert.last().alignment() = alignments[pI]; + } + + this->rangeInsertWithInfo + ( + verticesToInsert.begin(), + verticesToInsert.end(), + true + ); + + sync(decomposition.procBounds()); + + Info<< " Total number of vertices after redistribution " + << returnReduce(label(number_of_vertices()), sumOp<label>()) << endl; +} + + +Foam::tensorField Foam::cellShapeControlMesh::dumpAlignments() const +{ + tensorField alignmentsTmp(number_of_vertices(), tensor::zero); + + label count = 0; + for + ( + Finite_vertices_iterator vit = finite_vertices_begin(); + vit != finite_vertices_end(); + ++vit + ) + { + alignmentsTmp[count++] = vit->alignment(); + } + + return alignmentsTmp; +} + + +void Foam::cellShapeControlMesh::insertBoundingPoints(const boundBox& bb) +{ + boundBox bbInflate = bb; + bbInflate.inflate(10); + + pointField pts(bbInflate.points()); + + forAll(pts, pI) + { + insertFar(pts[pI]); + } +} + + +void Foam::cellShapeControlMesh::write() const +{ + Info<< "Writing cell size and alignment mesh" << endl; + + const fileName name("cellSizeAndAlignmentMesh"); + + // Reindex the cells + label cellCount = 0; + for + ( + Finite_cells_iterator cit = finite_cells_begin(); + cit != finite_cells_end(); + ++cit + ) + { + if (!cit->hasFarPoint() && !is_infinite(cit)) + { + cit->cellIndex() = cellCount++; + } + } + + labelList vertexMap; + labelList cellMap; + + autoPtr<fvMesh> meshPtr = DelaunayMesh<CellSizeDelaunay>::createMesh + ( + name, + runTime_, + vertexMap, + cellMap + ); + const fvMesh& mesh = meshPtr(); + + pointScalarField sizes + ( + IOobject + ( + "sizes", + mesh.time().timeName(), + mesh, + IOobject::NO_READ, + IOobject::AUTO_WRITE + ), + pointMesh::New(mesh), + scalar(0) + ); + + for + ( + Finite_vertices_iterator vit = finite_vertices_begin(); + vit != finite_vertices_end(); + ++vit + ) + { + if (!vit->farPoint()) + { + sizes[vertexMap[vit->index()]] = vit->targetCellSize(); + } + } + + mesh.write(); +} + + +// ************************************************************************* // diff --git a/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/cellShapeControl/cellShapeControlMesh/cellShapeControlMesh.H b/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/cellShapeControl/cellShapeControlMesh/cellShapeControlMesh.H new file mode 100644 index 0000000000000000000000000000000000000000..e6cb37a2c3b097b82af919982f1a512331a6bf03 --- /dev/null +++ b/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/cellShapeControl/cellShapeControlMesh/cellShapeControlMesh.H @@ -0,0 +1,168 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2012 OpenFOAM Foundation + \\/ M anipulation | +------------------------------------------------------------------------------- +License + This file is part of OpenFOAM. + + OpenFOAM is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + OpenFOAM is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>. + +Class + Foam::cellShapeControlMesh + +Description + +SourceFiles + cellShapeControlMeshI.H + cellShapeControlMesh.C + +\*---------------------------------------------------------------------------*/ + +#ifndef cellShapeControlMesh_H +#define cellShapeControlMesh_H + +#include "Time.H" +#include "scalar.H" +#include "point.H" +#include "tensor.H" +#include "triad.H" +#include "fileName.H" +#include "searchableSurfaces.H" +#include "conformationSurfaces.H" +#include "DistributedDelaunayMesh.H" +#include "CGALTriangulation3Ddefs.H" +#include "backgroundMeshDecomposition.H" +#include "boundBox.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ + +/*---------------------------------------------------------------------------*\ + Class cellShapeControlMesh Declaration +\*---------------------------------------------------------------------------*/ + +class cellShapeControlMesh +: + public DistributedDelaunayMesh<CellSizeDelaunay> +{ +public: + + typedef CellSizeDelaunay::Cell_handle Cell_handle; + typedef CellSizeDelaunay::Vertex_handle Vertex_handle; + typedef CellSizeDelaunay::Point Point; + + +private: + + // Private data + + const Time& runTime_; + + mutable Cell_handle oldCellHandle_; + + const scalar defaultCellSize_; + + + // Private Member Functions + + //- Disallow default bitwise copy construct + cellShapeControlMesh(const cellShapeControlMesh&); + + //- Disallow default bitwise assignment + void operator=(const cellShapeControlMesh&); + + +public: + + //- Runtime type information + ClassName("cellShapeControlMesh"); + + + // Constructors + + explicit cellShapeControlMesh(const Time& runTime); + + + //- Destructor + ~cellShapeControlMesh(); + + + // Member Functions + + // Query + + //- Calculate and return the barycentric coordinates for + // interpolating quantities on the background mesh + void barycentricCoords + ( + const Foam::point& pt, + scalarList& bary, + Cell_handle& ch + ) const; + + boundBox bounds() const; + + + // Edit + + label removePoints(); + + //- Get the centres of all the tets + tmp<pointField> cellCentres() const; + + inline Vertex_handle insert + ( + const Foam::point& pt, + const scalar& size, + const triad& alignment, + const Foam::indexedVertexEnum::vertexType type = Vb::vtInternal + ); + + inline Vertex_handle insertFar + ( + const Foam::point& pt + ); + + void distribute + ( + const backgroundMeshDecomposition& decomposition + ); + + tensorField dumpAlignments() const; + + void insertBoundingPoints(const boundBox& bb); + + void writeTriangulation(); + + void write() const; +}; + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace Foam + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#include "cellShapeControlMeshI.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // +#endif + +// ************************************************************************* // diff --git a/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/cellShapeControl/cellShapeControlMesh/cellShapeControlMeshI.H b/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/cellShapeControl/cellShapeControlMesh/cellShapeControlMeshI.H new file mode 100644 index 0000000000000000000000000000000000000000..305256d4ccaf924d7c5dc19c867b6812ffa724f0 --- /dev/null +++ b/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/cellShapeControl/cellShapeControlMesh/cellShapeControlMeshI.H @@ -0,0 +1,68 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2012 OpenFOAM Foundation + \\/ M anipulation | +------------------------------------------------------------------------------- +License + This file is part of OpenFOAM. + + OpenFOAM is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + OpenFOAM is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>. + +\*---------------------------------------------------------------------------*/ + +// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // + +Foam::cellShapeControlMesh::Vertex_handle Foam::cellShapeControlMesh::insert +( + const Foam::point& pt, + const scalar& size, + const triad& alignment, + const Foam::indexedVertexEnum::vertexType type +) +{ + Vertex_handle v = CellSizeDelaunay::insert + ( + Point(pt.x(), pt.y(), pt.z()) + ); + v->type() = type; + v->index() = getNewVertexIndex(); + v->procIndex() = Pstream::myProcNo(); + v->targetCellSize() = size; + v->alignment() = tensor(alignment.x(), alignment.y(), alignment.z()); + + return v; +} + + +Foam::cellShapeControlMesh::Vertex_handle Foam::cellShapeControlMesh::insertFar +( + const Foam::point& pt +) +{ + Vertex_handle v = CellSizeDelaunay::insert + ( + Point(pt.x(), pt.y(), pt.z()) + ); + v->type() = Vb::vtFar; +// v->type() = Vb::vtExternalFeaturePoint; + v->index() = getNewVertexIndex(); + v->procIndex() = Pstream::myProcNo(); + + return v; +} + + +// ************************************************************************* // diff --git a/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/cellShapeControl/cellSizeAndAlignmentControl/cellSizeAndAlignmentControl/cellSizeAndAlignmentControl.C b/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/cellShapeControl/cellSizeAndAlignmentControl/cellSizeAndAlignmentControl/cellSizeAndAlignmentControl.C new file mode 100644 index 0000000000000000000000000000000000000000..31d5d614062d17e601f92fbaff116cd05019ac98 --- /dev/null +++ b/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/cellShapeControl/cellSizeAndAlignmentControl/cellSizeAndAlignmentControl/cellSizeAndAlignmentControl.C @@ -0,0 +1,120 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2012-2013 OpenFOAM Foundation + \\/ M anipulation | +------------------------------------------------------------------------------- +License + This file is part of OpenFOAM. + + OpenFOAM is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + OpenFOAM is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>. + +\*---------------------------------------------------------------------------*/ + +#include "cellSizeAndAlignmentControl.H" +#include "addToRunTimeSelectionTable.H" + +// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * // + +namespace Foam +{ + +defineTypeNameAndDebug(cellSizeAndAlignmentControl, 0); +defineRunTimeSelectionTable(cellSizeAndAlignmentControl, dictionary); + +} + + +// * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * * // + + + +// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // + +Foam::cellSizeAndAlignmentControl::cellSizeAndAlignmentControl +( + const Time& runTime, + const word& name, + const dictionary& controlFunctionDict, + const conformationSurfaces& allGeometry +) +: + runTime_(runTime), + name_(name) +{} + + +// * * * * * * * * * * * * * * * * * Selectors * * * * * * * * * * * * * * * // + +Foam::autoPtr<Foam::cellSizeAndAlignmentControl> +Foam::cellSizeAndAlignmentControl::New +( + const Time& runTime, + const word& name, + const dictionary& controlFunctionDict, + const conformationSurfaces& allGeometry +) +{ + word cellSizeAndAlignmentControlTypeName + ( + controlFunctionDict.lookup("type") + ); + + Info<< nl << "Selecting cellSizeAndAlignmentControl " + << cellSizeAndAlignmentControlTypeName << endl; + + dictionaryConstructorTable::iterator cstrIter = + dictionaryConstructorTablePtr_->find + ( + cellSizeAndAlignmentControlTypeName + ); + + if (cstrIter == dictionaryConstructorTablePtr_->end()) + { + FatalErrorIn + ( + "cellSizeAndAlignmentControl::New()" + ) << "Unknown cellSizeAndAlignmentControl type " + << cellSizeAndAlignmentControlTypeName + << endl << endl + << "Valid cellSizeAndAlignmentControl types are :" << endl + << dictionaryConstructorTablePtr_->toc() + << exit(FatalError); + } + + return autoPtr<cellSizeAndAlignmentControl> + ( + cstrIter() + ( + runTime, + name, + controlFunctionDict, + allGeometry + ) + ); +} + + +// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * // + +Foam::cellSizeAndAlignmentControl::~cellSizeAndAlignmentControl() +{} + + +// * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * * // + + + +// ************************************************************************* // diff --git a/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/cellShapeControl/cellSizeAndAlignmentControl/cellSizeAndAlignmentControl/cellSizeAndAlignmentControl.H b/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/cellShapeControl/cellSizeAndAlignmentControl/cellSizeAndAlignmentControl/cellSizeAndAlignmentControl.H new file mode 100644 index 0000000000000000000000000000000000000000..243211929edc2e19a22651d0f2b381184de84107 --- /dev/null +++ b/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/cellShapeControl/cellSizeAndAlignmentControl/cellSizeAndAlignmentControl/cellSizeAndAlignmentControl.H @@ -0,0 +1,160 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2012-2013 OpenFOAM Foundation + \\/ M anipulation | +------------------------------------------------------------------------------- +License + This file is part of OpenFOAM. + + OpenFOAM is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + OpenFOAM is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>. + +Class + Foam::cellSizeAndAlignmentControl + +Description + +SourceFiles + cellSizeAndAlignmentControlI.H + cellSizeAndAlignmentControl.C + +\*---------------------------------------------------------------------------*/ + +#ifndef cellSizeAndAlignmentControl_H +#define cellSizeAndAlignmentControl_H + +#include "dictionary.H" +#include "conformationSurfaces.H" +#include "Time.H" +#include "quaternion.H" +#include "triadField.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ + + +/*---------------------------------------------------------------------------*\ + Class cellSizeAndAlignmentControl Declaration +\*---------------------------------------------------------------------------*/ + +class cellSizeAndAlignmentControl +{ +protected: + + const Time& runTime_; + + +private: + + // Private data + + const word name_; + + + // Private Member Functions + + //- Disallow default bitwise copy construct + cellSizeAndAlignmentControl(const cellSizeAndAlignmentControl&); + + //- Disallow default bitwise assignment + void operator=(const cellSizeAndAlignmentControl&); + + +public: + + //- Runtime type information + TypeName("cellSizeAndAlignmentControl"); + + + // Declare run-time constructor selection table + + declareRunTimeSelectionTable + ( + autoPtr, + cellSizeAndAlignmentControl, + dictionary, + ( + const Time& runTime, + const word& name, + const dictionary& controlFunctionDict, + const conformationSurfaces& allGeometry + ), + (runTime, name, controlFunctionDict, allGeometry) + ); + + + // Constructors + + //- Construct from dictionary and references to conformalVoronoiMesh and + // searchableSurfaces + cellSizeAndAlignmentControl + ( + const Time& runTime, + const word& name, + const dictionary& controlFunctionDict, + const conformationSurfaces& allGeometry + ); + + + // Selectors + + //- Return a reference to the selected cellShapeControl + static autoPtr<cellSizeAndAlignmentControl> New + ( + const Time& runTime, + const word& name, + const dictionary& controlFunctionDict, + const conformationSurfaces& allGeometry + ); + + + //- Destructor + virtual ~cellSizeAndAlignmentControl(); + + + // Member Functions + + // Access + + const word& name() const + { + return name_; + } + + virtual label priority() const = 0; + + + // Query + + virtual void initialVertices + ( + pointField& pts, + scalarField& sizes, + triadField& alignments + ) const = 0; +}; + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace Foam + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#endif + +// ************************************************************************* // diff --git a/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/cellShapeControl/cellSizeAndAlignmentControl/cellSizeAndAlignmentControls.C b/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/cellShapeControl/cellSizeAndAlignmentControl/cellSizeAndAlignmentControls.C new file mode 100644 index 0000000000000000000000000000000000000000..515482689dcd9a1b5a5f89118b9222d74762f488 --- /dev/null +++ b/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/cellShapeControl/cellSizeAndAlignmentControl/cellSizeAndAlignmentControls.C @@ -0,0 +1,177 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2012-2013 OpenFOAM Foundation + \\/ M anipulation | +------------------------------------------------------------------------------- +License + This file is part of OpenFOAM. + + OpenFOAM is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + OpenFOAM is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>. + +\*---------------------------------------------------------------------------*/ + +#include "cellSizeAndAlignmentControls.H" +#include "searchableSurfaceControl.H" + +// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * // + +namespace Foam +{ + +defineTypeNameAndDebug(cellSizeAndAlignmentControls, 0); + +} + + +// * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * * // + +bool Foam::cellSizeAndAlignmentControls::evalCellSizeFunctions +( + const point& pt, + scalar& minSize +) const +{ + bool anyFunctionFound = false; + + // Regions requesting with the same priority take the smallest + + if (controlFunctions_.size()) + { + // Maintain priority of current hit. Initialise so it always goes + // through at least once. + label previousPriority = -1; + + forAll(controlFunctions_, i) + { + const cellSizeAndAlignmentControl& cSF = controlFunctions_[i]; + + if (isA<searchableSurfaceControl>(cSF)) + { + const searchableSurfaceControl& sSC = + refCast<const searchableSurfaceControl>(cSF); + + if (debug) + { + Info<< "size function " + << sSC.name() + << " priority " << sSC.priority() + << endl; + } + + if (sSC.priority() < previousPriority) + { + return minSize; + } + + scalar sizeI; + + if (sSC.sizeFunction().cellSize(pt, sizeI)) + { + anyFunctionFound = true; + + if (sSC.priority() == previousPriority) + { + if (sizeI < minSize) + { + minSize = sizeI; + } + } + else + { + minSize = sizeI; + } + + if (debug) + { + Info<< "sizeI " << sizeI + <<" minSize " << minSize << endl; + } + + previousPriority = sSC.priority(); + } + } + } + } + + return anyFunctionFound; +} + + +// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // + +Foam::cellSizeAndAlignmentControls::cellSizeAndAlignmentControls +( + const Time& runTime, + const dictionary& shapeControlDict, + const conformationSurfaces& allGeometry, + const scalar defaultCellSize +) +: + shapeControlDict_(shapeControlDict), + allGeometry_(allGeometry), + controlFunctions_(shapeControlDict_.size()), + defaultCellSize_(defaultCellSize) +{ + label functionI = 0; + + forAllConstIter(dictionary, shapeControlDict_, iter) + { + word shapeControlEntryName = iter().keyword(); + + const dictionary& controlFunctionDict + ( + shapeControlDict_.subDict(shapeControlEntryName) + ); + + controlFunctions_.set + ( + functionI, + cellSizeAndAlignmentControl::New + ( + runTime, + shapeControlEntryName, + controlFunctionDict, + allGeometry + ) + ); + + functionI++; + } +} + + +// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * // + +Foam::cellSizeAndAlignmentControls::~cellSizeAndAlignmentControls() +{} + + +// * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * * // + +Foam::scalar Foam::cellSizeAndAlignmentControls::cellSize +( + const point& pt +) const +{ + scalar size = defaultCellSize_; + + evalCellSizeFunctions(pt, size); + + return size; +} + + +// ************************************************************************* // diff --git a/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/cellShapeControl/cellSizeAndAlignmentControl/cellSizeAndAlignmentControls.H b/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/cellShapeControl/cellSizeAndAlignmentControl/cellSizeAndAlignmentControls.H new file mode 100644 index 0000000000000000000000000000000000000000..76e6c801dd845c0b20375a1761282452bb3ec74b --- /dev/null +++ b/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/cellShapeControl/cellSizeAndAlignmentControl/cellSizeAndAlignmentControls.H @@ -0,0 +1,119 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2012-2013 OpenFOAM Foundation + \\/ M anipulation | +------------------------------------------------------------------------------- +License + This file is part of OpenFOAM. + + OpenFOAM is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + OpenFOAM is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>. + +Class + Foam::cellSizeAndAlignmentControls + +Description + +SourceFiles + cellSizeAndAlignmentControls.C + +\*---------------------------------------------------------------------------*/ + +#ifndef cellSizeAndAlignmentControls_H +#define cellSizeAndAlignmentControls_H + +#include "dictionary.H" +#include "cellSizeAndAlignmentControl.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ + +/*---------------------------------------------------------------------------*\ + Class cellSizeAndAlignmentControls Declaration +\*---------------------------------------------------------------------------*/ + +class cellSizeAndAlignmentControls +{ + // Private data + + const dictionary& shapeControlDict_; + + const conformationSurfaces& allGeometry_; + + PtrList<cellSizeAndAlignmentControl> controlFunctions_; + + const scalar defaultCellSize_; + + + // Private Member Functions + + bool evalCellSizeFunctions(const point& pt, scalar& minSize) const; + + //- Disallow default bitwise copy construct + cellSizeAndAlignmentControls(const cellSizeAndAlignmentControls&); + + //- Disallow default bitwise assignment + void operator=(const cellSizeAndAlignmentControls&); + + +public: + + //- Runtime type information + ClassName("cellSizeAndAlignmentControls"); + + + // Constructors + + //- Construct from dictionary + cellSizeAndAlignmentControls + ( + const Time& runTime, + const dictionary& shapeControlDict, + const conformationSurfaces& allGeometry, + const scalar defaultCellSize + ); + + + //- Destructor + virtual ~cellSizeAndAlignmentControls(); + + + // Member Functions + + // Access + + const PtrList<cellSizeAndAlignmentControl>& controlFunctions() const + { + return controlFunctions_; + } + + + // Query + + scalar cellSize(const point& pt) const; +}; + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace Foam + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#endif + +// ************************************************************************* // diff --git a/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/cellShapeControl/cellSizeAndAlignmentControl/fileControl/fileControl.C b/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/cellShapeControl/cellSizeAndAlignmentControl/fileControl/fileControl.C new file mode 100644 index 0000000000000000000000000000000000000000..9b86dbf2ba643fb6c563cd2774eaf6c39e42129b --- /dev/null +++ b/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/cellShapeControl/cellSizeAndAlignmentControl/fileControl/fileControl.C @@ -0,0 +1,242 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2012-2013 OpenFOAM Foundation + \\/ M anipulation | +------------------------------------------------------------------------------- +License + This file is part of OpenFOAM. + + OpenFOAM is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + OpenFOAM is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>. + +\*---------------------------------------------------------------------------*/ + +#include "fileControl.H" +#include "addToRunTimeSelectionTable.H" +#include "tetrahedron.H" +#include "scalarList.H" +#include "vectorTools.H" +#include "pointIOField.H" +#include "scalarIOField.H" +#include "triadIOField.H" + +// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * // + +namespace Foam +{ + +defineTypeNameAndDebug(fileControl, 0); +addToRunTimeSelectionTable +( + cellSizeAndAlignmentControl, + fileControl, + dictionary +); + +} + + +// * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * * // + + +// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // + +Foam::fileControl::fileControl +( + const Time& runTime, + const word& name, + const dictionary& controlFunctionDict, + const conformationSurfaces& allGeometry +) +: + cellSizeAndAlignmentControl + ( + runTime, + name, + controlFunctionDict, + allGeometry + ), + pointsFile_(controlFunctionDict.lookup("pointsFile")), + sizesFile_(controlFunctionDict.lookup("sizesFile")), + alignmentsFile_(controlFunctionDict.lookup("alignmentsFile")), + priority_(readLabel(controlFunctionDict.lookup("priority"))) +{ + Info<< indent << "Loading from file... " << nl + << indent << " points : " << pointsFile_ << nl + << indent << " sizes : " << sizesFile_ << nl + << indent << " alignments : " << alignmentsFile_ + << endl; +} + + +// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * // + +Foam::fileControl::~fileControl() +{} + + +// * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * * // +// +//Foam::scalar Foam::fileControl::cellSize(const point& pt) const +//{ +// scalarList bary; +// Cell_handle ch; +// +// triangulatedMesh_.barycentricCoords(pt, bary, ch); +// +// scalar size = 0; +// forAll(bary, pI) +// { +// size += bary[pI]*ch->vertex(pI)->size(); +// } +// +// return size; +//} +// +// +////- Return the cell alignment at the given location +//Foam::tensor Foam::fileControl::cellAlignment(const point& pt) const +//{ +// scalarList bary; +// Cell_handle ch; +// +// triangulatedMesh_.barycentricCoords(pt, bary, ch); +// +// label nearest = 0; +// +// tensor alignment = Foam::tensor::zero; +// forAll(bary, pI) +// { +// //alignment += bary[pI]*ch->vertex(pI)->alignment(); +// +// // Find nearest point +// if (bary[pI] > nearest) +// { +// alignment = ch->vertex(pI)->alignment(); +// nearest = bary[pI]; +// } +// } +// +// return alignment; +//} +// +// +////- Return the cell alignment at the given location +//void Foam::fileControl::cellSizeAndAlignment +//( +// const point& pt, +// scalar& size, +// tensor& alignment +//) const +//{ +// scalarList bary; +// Cell_handle ch; +// +// triangulatedMesh_.barycentricCoords(pt, bary, ch); +// +// size = 0; +// forAll(bary, pI) +// { +// size += bary[pI]*ch->vertex(pI)->size(); +// } +// +//// alignment = Foam::tensor::zero; +//// forAll(bary, pI) +//// { +//// alignment += bary[pI]*ch->vertex(pI)->alignment(); +//// } +// +// alignment = cellAlignment(pt); +//} + +void Foam::fileControl::initialVertices +( + pointField& pts, + scalarField& sizes, + triadField& alignments +) const +{ + Info<< " Reading points from file : " << pointsFile_ << endl; + + pointIOField pointsTmp + ( + IOobject + ( + pointsFile_, + runTime_.constant(), + runTime_, + IOobject::MUST_READ, + IOobject::NO_WRITE, + false + ) + ); + + pts.transfer(pointsTmp); + + Info<< " Reading sizes from file : " << sizesFile_ << endl; + + scalarIOField sizesTmp + ( + IOobject + ( + sizesFile_, + runTime_.constant(), + runTime_, + IOobject::MUST_READ, + IOobject::NO_WRITE, + false + ) + ); + + sizes.transfer(sizesTmp); + + Info<< " Reading alignments from file : " << alignmentsFile_ << endl; + + triadIOField alignmentsTmp + ( + IOobject + ( + alignmentsFile_, + runTime_.constant(), + runTime_, + IOobject::MUST_READ, + IOobject::NO_WRITE, + false + ) + ); + + alignments.transfer(alignmentsTmp); + + if ((pts.size() != sizes.size()) || (pts.size() != alignments.size())) + { + FatalErrorIn + ( + "Foam::fileControl::initialVertices" + "(" + " pointField&," + " scalarField&," + " Field<triad>&" + ")" + ) << "Size of list of points, sizes and alignments do not match:" + << nl + << "Points size = " << pts.size() << nl + << "Sizes size = " << sizes.size() << nl + << "Alignments size = " << alignments.size() + << abort(FatalError); + } +} + + +// ************************************************************************* // diff --git a/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/cellShapeControl/cellSizeAndAlignmentControl/fileControl/fileControl.H b/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/cellShapeControl/cellSizeAndAlignmentControl/fileControl/fileControl.H new file mode 100644 index 0000000000000000000000000000000000000000..f06892680d69ef3c70ea77976854b2125b0b00c7 --- /dev/null +++ b/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/cellShapeControl/cellSizeAndAlignmentControl/fileControl/fileControl.H @@ -0,0 +1,140 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2012-2013 OpenFOAM Foundation + \\/ M anipulation | +------------------------------------------------------------------------------- +License + This file is part of OpenFOAM. + + OpenFOAM is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + OpenFOAM is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>. + +Class + Foam::fileControl + +Description + +SourceFiles + fileControl.C + +\*---------------------------------------------------------------------------*/ + +#ifndef fileControl_H +#define fileControl_H + +#include "cellSizeAndAlignmentControl.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ + + +/*---------------------------------------------------------------------------*\ + Class fileControl Declaration +\*---------------------------------------------------------------------------*/ + +class fileControl +: + public cellSizeAndAlignmentControl +{ + // Private data + + const fileName pointsFile_; + + const fileName sizesFile_; + + const fileName alignmentsFile_; + + label priority_; + + + // Private Member Functions + + //- Disallow default bitwise copy construct + fileControl(const fileControl&); + + //- Disallow default bitwise assignment + void operator=(const fileControl&); + + +public: + + //- Runtime type information + TypeName("fileControl"); + + + // Constructors + + //- Construct from dictionary and references to conformalVoronoiMesh and + // searchableSurfaces + fileControl + ( + const Time& runTime, + const word& name, + const dictionary& controlFunctionDict, + const conformationSurfaces& allGeometry + ); + + //- Destructor + ~fileControl(); + + + // Member Functions + + // Access + + + // Query + +// //- Return the cell size at the given location +// virtual scalar cellSize(const point& pt) const; +// +// //- Return the cell alignment at the given location +// virtual tensor cellAlignment(const point& pt) const; +// +// virtual void cellSizeAndAlignment +// ( +// const point& pt, +// scalar& size, +// tensor& alignment +// ) const; + + + // Edit + + virtual void initialVertices + ( + pointField& pts, + scalarField& sizes, + triadField& alignments + ) const; + + virtual label priority() const + { + return priority_; + } +}; + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace Foam + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#endif + +// ************************************************************************* // diff --git a/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/cellShapeControl/cellSizeAndAlignmentControl/searchableSurfaceControl/searchableSurfaceControl.C b/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/cellShapeControl/cellSizeAndAlignmentControl/searchableSurfaceControl/searchableSurfaceControl.C new file mode 100644 index 0000000000000000000000000000000000000000..0f2a4f6d8c76cf39d69e4890af63af4f9590e321 --- /dev/null +++ b/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/cellShapeControl/cellSizeAndAlignmentControl/searchableSurfaceControl/searchableSurfaceControl.C @@ -0,0 +1,666 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2012-2013 OpenFOAM Foundation + \\/ M anipulation | +------------------------------------------------------------------------------- +License + This file is part of OpenFOAM. + + OpenFOAM is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + OpenFOAM is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>. + +\*---------------------------------------------------------------------------*/ + +#include "searchableSurfaceControl.H" +#include "addToRunTimeSelectionTable.H" +#include "cellSizeFunction.H" +#include "triSurfaceMesh.H" +#include "searchableBox.H" +#include "tetrahedron.H" +#include "vectorTools.H" +#include "quaternion.H" + +// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * // + +namespace Foam +{ + +defineTypeNameAndDebug(searchableSurfaceControl, 0); +addToRunTimeSelectionTable +( + cellSizeAndAlignmentControl, + searchableSurfaceControl, + dictionary +); + +} + + +// * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * * // + +//Foam::tensor Foam::surfaceControl::requiredAlignment +//( +// const Foam::point& pt, +// const vectorField& ptNormals +//) const +//{ +//// pointIndexHit surfHit; +//// label hitSurface; +//// +//// geometryToConformTo_.findSurfaceNearest +//// ( +//// pt, +//// sqr(GREAT), +//// surfHit, +//// hitSurface +//// ); +//// +//// if (!surfHit.hit()) +//// { +//// FatalErrorIn +//// ( +//// "Foam::tensor Foam::conformalVoronoiMesh::requiredAlignment" +//// ) +//// << "findSurfaceNearest did not find a hit across the surfaces." +//// << exit(FatalError) << endl; +//// } +//// +////// Primary alignment +//// +//// vectorField norm(1); +//// +//// allGeometry_[hitSurface].getNormal +//// ( +//// List<pointIndexHit>(1, surfHit), +//// norm +//// ); +//// +//// const vector np = norm[0]; +//// +//// const tensor Rp = rotationTensor(vector(0,0,1), np); +//// +//// return (Rp); +// +//// Info<< "Point : " << pt << endl; +//// forAll(ptNormals, pnI) +//// { +//// Info<< " normal " << pnI << " : " << ptNormals[pnI] << endl; +//// } +// +// vector np = ptNormals[0]; +// +// const tensor Rp = rotationTensor(vector(0,0,1), np); +// +// vector na = vector::zero; +// +// scalar smallestAngle = GREAT; +// +// for (label pnI = 1; pnI < ptNormals.size(); ++pnI) +// { +// const vector& nextNormal = ptNormals[pnI]; +// +// const scalar cosPhi = vectorTools::cosPhi(np, nextNormal); +// +// if (mag(cosPhi) < smallestAngle) +// { +// na = nextNormal; +// smallestAngle = cosPhi; +// } +// } +// +// // Secondary alignment +// vector ns = np ^ na; +// +// if (mag(ns) < SMALL) +// { +// WarningIn("conformalVoronoiMesh::requiredAlignment") +// << "Parallel normals detected in spoke search." << nl +// << "point: " << pt << nl +// << "np : " << np << nl +// << "na : " << na << nl +// << "ns : " << ns << nl +// << endl; +// +// ns = np; +// } +// +// ns /= mag(ns); +// +// tensor Rs = rotationTensor((Rp & vector(0,1,0)), ns); +// +//// Info<< "Point " << pt << nl +//// << " np : " << np << nl +//// << " ns : " << ns << nl +//// << " Rp : " << Rp << nl +//// << " Rs : " << Rs << nl +//// << " Rs&Rp: " << (Rs & Rp) << endl; +// +// return (Rs & Rp); +//} + + +// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // + +Foam::searchableSurfaceControl::searchableSurfaceControl +( + const Time& runTime, + const word& name, + const dictionary& controlFunctionDict, + const conformationSurfaces& allGeometry +) +: + cellSizeAndAlignmentControl + ( + runTime, + name, + controlFunctionDict, + allGeometry + ), + surfaceName_(controlFunctionDict.lookupOrDefault<word>("surface", name)), + searchableSurface_(allGeometry.geometry()[surfaceName_]), + allGeometry_(allGeometry), + cellSizeFunction_ + ( + cellSizeFunction::New(controlFunctionDict, searchableSurface_) + ) +// geometryToConformTo_(geometryToConformTo), +// surfaces_(), +// cellSizeFunctions_(), +// triangulatedMesh_() +{ +// const dictionary& surfacesDict = coeffDict(); +// +// Info<< nl << "Reading cellSizeControlGeometry" << endl; +// +// surfaces_.setSize(surfacesDict.size()); +// +// cellSizeFunctions_.setSize(surfacesDict.size()); +// +// label surfI = 0; +// +// DynamicList<point> pointsToInsert; +// DynamicList<scalar> sizesToInsert; +// DynamicList<tensor> alignmentsToInsert; +// +// forAllConstIter(dictionary, surfacesDict, iter) +// { +// const dictionary& surfaceSubDict +// ( +// surfacesDict.subDict(iter().keyword()) +// ); +// +// // If the "surface" keyword is not found in the dictionary, assume +// // the name of the dictionary is the surface. Distinction required to +// // allow the same surface to be used multiple times to supply multiple +// // cellSizeFunctions +// +// word surfaceName = surfaceSubDict.lookupOrDefault<word> +// ( +// "surface", +// iter().keyword() +// ); +// +// surfaces_[surfI] = allGeometry_.findSurfaceID(surfaceName); +// +// if (surfaces_[surfI] < 0) +// { +// FatalErrorIn +// ( +// "Foam::surfaceControl::surfaceControl" +// ) << "No surface " << surfaceName << " found. " +// << "Valid geometry is " << nl << allGeometry_.names() +// << exit(FatalError); +// } +// +// const searchableSurface& surface = allGeometry_[surfaces_[surfI]]; +// +// Info<< nl << " " << iter().keyword() << nl +// << " surface: " << surfaceName << nl +// << " size : " << surface.size() << endl; +// +// cellSizeFunctions_.set +// ( +// surfI, +// cellSizeFunction::New +// ( +// surfaceSubDict, +// surface +// ) +// ); +// +// surfI++; +// +// if (isA<triSurfaceMesh>(surface)) +// { +// const triSurfaceMesh& tsm +// = refCast<const triSurfaceMesh>(surface); +// +// const pointField& points = tsm.points(); +// const vectorField& faceNormals = tsm.faceNormals(); +// const labelListList& pointFaces = tsm.pointFaces(); +// +// Info<< " Number of points: " << tsm.nPoints() << endl; +// +// forAll(points, pI) +// { +// const Foam::point& pt = points[pI]; +// const labelList& ptFaces = pointFaces[pI]; +// +// vectorField pointNormals(ptFaces.size()); +// +// forAll(pointNormals, pnI) +// { +// pointNormals[pnI] = faceNormals[ptFaces[pnI]]; +// } +// +// pointsToInsert.append(pt); +// +// // Get the value of the point from surfaceCellSizeFunction. If +// // adding points internally then will need to interpolate. +// scalar newSize = 0; +// +// cellSizeFunctions_[surfI - 1].cellSize(pt, newSize); +// sizesToInsert.append(newSize); +// +// tensor newAlignment = requiredAlignment(pt, pointNormals); +// +// alignmentsToInsert.append(newAlignment); +// } +// } +// } +// +// // Add the global bound box to ensure that all internal point queries +// // will return sizes and alignments +//// boundBox bb = allGeometry_.bounds(); +//// +//// pointField bbPoints = bb.points(); +//// +//// forAll(bbPoints, pI) +//// { +//// pointsToInsert.append(bbPoints[pI]); +//// sizesToInsert.append(defaultCellSize()); +//// alignmentsToInsert.append(tensor(1,0,0,0,1,0,0,0,1)); +//// } +// +// triangulatedMesh_.set +// ( +// new triangulatedMesh +// ( +// runTime, +// pointsToInsert, +// sizesToInsert, +// alignmentsToInsert, +// defaultCellSize() +// ) +// ); +// +// scalar factor = 1.0; +// label maxIteration = cellShapeControlDict.lookupOrDefault<label> +// ( +// "maxRefinementIterations", 1 +// ); +// +// +// for (label iteration = 0; iteration < maxIteration; ++iteration) +// { +// Info<< "Iteration : " << iteration << endl; +// +// label nRefined = triangulatedMesh_().refineTriangulation +// ( +// factor, +// allGeometry_, +// geometryToConformTo_ +// ); +// +// Info<< " Number of cells refined in refinement iteration : " +// << nRefined << nl << endl; +// +// if (nRefined <= 0 && iteration != 0) +// { +// break; +// } +// +// factor *= 1.5; +// } +} + + +// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * // + +Foam::searchableSurfaceControl::~searchableSurfaceControl() +{} + + +// * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * * // + +//Foam::scalar Foam::surfaceControl::cellSize(const point& pt) const +//{ +// scalarList bary; +// Cell_handle ch; +// +// triangulatedMesh_().barycentricCoords(pt, bary, ch); +// +// scalar size = 0; +// forAll(bary, pI) +// { +// size += bary[pI]*ch->vertex(pI)->size(); +// } +// +// return size; +//} +// +// +////- Return the cell alignment at the given location +//Foam::tensor Foam::surfaceControl::cellAlignment(const point& pt) const +//{ +// scalarList bary; +// Cell_handle ch; +// +// triangulatedMesh_().barycentricCoords(pt, bary, ch); +// +//// vectorField cartesianDirections(3); +//// +//// cartesianDirections[0] = vector(0,0,1); +//// cartesianDirections[1] = vector(0,1,0); +//// cartesianDirections[2] = vector(1,0,0); +//// +//// // Rearrange each alignment tensor so that the x/y/z components are +//// // in order of whichever makes the smallest angle with the global +//// // coordinate system +//// FixedList<tensor, 4> alignments; +//// +//// forAll(alignments, aI) +//// { +//// tensor a = ch->vertex(aI)->alignment(); +//// +//// tensor tmpA = a; +//// +////// Info<< nl << indent<< a << endl; +//// +//// scalar minAngle = 0; +//// +//// scalar axx = vectorTools::cosPhi(a.x(), cartesianDirections[0]); +//// scalar axy = vectorTools::cosPhi(a.y(), cartesianDirections[0]); +//// scalar axz = vectorTools::cosPhi(a.z(), cartesianDirections[0]); +//// +//// scalar ayx = vectorTools::cosPhi(a.x(), cartesianDirections[1]); +//// scalar ayy = vectorTools::cosPhi(a.y(), cartesianDirections[1]); +//// scalar ayz = vectorTools::cosPhi(a.z(), cartesianDirections[1]); +//// +//// scalar azx = vectorTools::cosPhi(a.x(), cartesianDirections[2]); +//// scalar azy = vectorTools::cosPhi(a.y(), cartesianDirections[2]); +//// scalar azz = vectorTools::cosPhi(a.z(), cartesianDirections[2]); +//// +////// Info<< indent << axx << " " << axy << " " << axz << nl +////// << indent << ayx << " " << ayy << " " << ayz << nl +////// << indent << azx << " " << azy << " " << azz << endl; +//// +//// if (mag(axx) >= minAngle) +//// { +//// tmpA.xx() = mag(a.xx()); +//// tmpA.xy() = mag(a.xy()); +//// tmpA.xz() = mag(a.xz()); +//// minAngle = mag(axx); +//// } +//// if (mag(axy) >= minAngle) +//// { +//// tmpA.xx() = mag(a.yx()); +//// tmpA.xy() = mag(a.yy()); +//// tmpA.xz() = mag(a.yz()); +//// minAngle = mag(axy); +//// } +//// if (mag(axz) >= minAngle) +//// { +//// tmpA.xx() = mag(a.zx()); +//// tmpA.xy() = mag(a.zy()); +//// tmpA.xz() = mag(a.zz()); +//// } +//// +//// minAngle = 0; +//// +//// if (mag(ayx) >= minAngle) +//// { +//// tmpA.yx() = mag(a.xx()); +//// tmpA.yy() = mag(a.xy()); +//// tmpA.yz() = mag(a.xz()); +//// minAngle = mag(ayx); +//// } +//// if (mag(ayy) >= minAngle) +//// { +//// tmpA.yx() = mag(a.yx()); +//// tmpA.yy() = mag(a.yy()); +//// tmpA.yz() = mag(a.yz()); +//// minAngle = mag(ayy); +//// } +//// if (mag(ayz) >= minAngle) +//// { +//// tmpA.yx() = mag(a.zx()); +//// tmpA.yy() = mag(a.zy()); +//// tmpA.yz() = mag(a.zz()); +//// } +//// +//// minAngle = 0; +//// +//// if (mag(azx) >= minAngle) +//// { +//// tmpA.zx() = mag(a.xx()); +//// tmpA.zy() = mag(a.xy()); +//// tmpA.zz() = mag(a.xz()); +//// minAngle = mag(azx); +//// } +//// if (mag(azy) >= minAngle) +//// { +//// tmpA.zx() = mag(a.yx()); +//// tmpA.zy() = mag(a.yy()); +//// tmpA.zz() = mag(a.yz()); +//// minAngle = mag(azy); +//// } +//// if (mag(azz) >= minAngle) +//// { +//// tmpA.zx() = mag(a.zx()); +//// tmpA.zy() = mag(a.zy()); +//// tmpA.zz() = mag(a.zz()); +//// } +//// +//// alignments[aI] = tmpA; +//// } +// +// scalar nearest = 0; +// +//// Info<< nl << "Point " << pt << endl; +//// +//// FixedList<quaternion, 4> qAlignments; +//// forAll(qAlignments, aI) +//// { +////// Info<< " Direction " << aI << endl; +////// Info<< " Rot tensor" << alignments[aI] << endl; +//// qAlignments[aI] = quaternion(alignments[aI]); +//// qAlignments[aI].normalize(); +////// Info<< " Quaternion: " << qAlignments[aI] << endl; +////// Info<< " Rot tensor from quat: " << qAlignments[aI].R() +////// << endl; +//// } +// +// tensor alignment = Foam::tensor::zero; +// forAll(bary, pI) +// { +//// alignment += bary[pI]*ch->vertex(pI)->alignment(); +// +//// alignment += bary[pI]*alignments[pI]; +// +// // Try slerp with quaternions +// +// // Find nearest point +// if (bary[pI] > nearest) +// { +// alignment = ch->vertex(pI)->alignment(); +// nearest = bary[pI]; +// } +// } +// +//// quaternion alignment; +// +//// alignment = qAlignments[0]*bary[0] +//// + qAlignments[1]*bary[1] +//// + qAlignments[2]*bary[2] +//// + qAlignments[3]*bary[3]; +// +//// alignment = +//// slerp(qAlignments[0], qAlignments[1], bary[0]+bary[1]+bary[2]); +//// alignment = slerp(alignment, qAlignments[2], bary[0]+bary[1]+bary[2]); +//// alignment = slerp(alignment, qAlignments[3], bary[0]+bary[1]+bary[2]); +//// alignment = +//// slerp(alignment, qAlignments[0], bary[0]/(bary[0]+bary[1]+bary[2])); +// +//// Info<< " Interp alignment : " << alignment << endl; +//// Info<< " Interp rot tensor: " << alignment.R() << endl; +// +// return alignment; +//} +// +// +//void Foam::surfaceControl::cellSizeAndAlignment +//( +// const point& pt, +// scalar& size, +// tensor& alignment +//) const +//{ +// scalarList bary; +// Cell_handle ch; +// +// triangulatedMesh_().barycentricCoords(pt, bary, ch); +// +// size = 0; +// forAll(bary, pI) +// { +// size += bary[pI]*ch->vertex(pI)->size(); +// } +// +//// alignment = Foam::tensor::zero; +//// forAll(bary, pI) +//// { +//// alignment += bary[pI]*ch->vertex(pI)->alignment(); +//// } +// +// alignment = cellAlignment(pt); +//} + +void Foam::searchableSurfaceControl::initialVertices +( + pointField& pts, + scalarField& sizes, + triadField& alignments +) const +{ + pts = searchableSurface_.points(); + sizes.setSize(pts.size()); + alignments.setSize(pts.size()); + + const scalar nearFeatDistSqrCoeff = 1e-8; + + forAll(pts, pI) + { + // Is the point in the extendedFeatureEdgeMesh? If so get the + // point normal, otherwise get the surface normal from + // searchableSurface + + pointIndexHit info; + label infoFeature; + allGeometry_.findFeaturePointNearest + ( + pts[pI], + nearFeatDistSqrCoeff, + info, + infoFeature + ); + + autoPtr<triad> pointAlignment; + + if (info.hit()) + { + const extendedFeatureEdgeMesh& features = + allGeometry_.features()[infoFeature]; + + vectorField norms = features.featurePointNormals(info.index()); + + // Create a triad from these norms. + pointAlignment.set(new triad()); + forAll(norms, nI) + { + pointAlignment() += norms[nI]; + } + + pointAlignment().normalize(); + pointAlignment().orthogonalize(); + } + else + { + allGeometry_.findEdgeNearest + ( + pts[pI], + nearFeatDistSqrCoeff, + info, + infoFeature + ); + + if (info.hit()) + { + const extendedFeatureEdgeMesh& features = + allGeometry_.features()[infoFeature]; + + vectorField norms = features.edgeNormals(info.index()); + + // Create a triad from these norms. + pointAlignment.set(new triad()); + forAll(norms, nI) + { + pointAlignment() += norms[nI]; + } + + pointAlignment().normalize(); + pointAlignment().orthogonalize(); + } + else + { + pointField ptField(1, pts[pI]); + scalarField distField(1, nearFeatDistSqrCoeff); + List<pointIndexHit> infoList(1, pointIndexHit()); + + searchableSurface_.findNearest(ptField, distField, infoList); + + vectorField normals(1); + searchableSurface_.getNormal(infoList, normals); + + pointAlignment.set(new triad(normals[0])); + } + } + + if (!cellSizeFunction_().cellSize(pts[pI], sizes[pI])) + { + FatalErrorIn + ( + "Foam::searchableSurfaceControl::initialVertices" + "(pointField&, scalarField&, tensorField&)" + ) << "Could not calculate cell size" + << abort(FatalError); + } + + alignments[pI] = pointAlignment(); + } +} + + +// ************************************************************************* // diff --git a/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/cellShapeControl/cellSizeAndAlignmentControl/searchableSurfaceControl/searchableSurfaceControl.H b/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/cellShapeControl/cellSizeAndAlignmentControl/searchableSurfaceControl/searchableSurfaceControl.H new file mode 100644 index 0000000000000000000000000000000000000000..7edc26cdc4cbdff5187f0c528c1000e59c6562f7 --- /dev/null +++ b/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/cellShapeControl/cellSizeAndAlignmentControl/searchableSurfaceControl/searchableSurfaceControl.H @@ -0,0 +1,173 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2012-2013 OpenFOAM Foundation + \\/ M anipulation | +------------------------------------------------------------------------------- +License + This file is part of OpenFOAM. + + OpenFOAM is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + OpenFOAM is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>. + +Class + Foam::searchableSurfaceControl + +Description + +SourceFiles + searchableSurfaceControl.C + +\*---------------------------------------------------------------------------*/ + +#ifndef searchableSurfaceControl_H +#define searchableSurfaceControl_H + +#include "cellSizeFunction.H" +#include "triad.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ + + +/*---------------------------------------------------------------------------*\ + Class surfaceControl Declaration +\*---------------------------------------------------------------------------*/ + +class searchableSurfaceControl +: + public cellSizeAndAlignmentControl +{ + // Private data + + //- Name of the surface + const word surfaceName_; + + //- Reference to the searchableSurface object holding the geometry data + const searchableSurface& searchableSurface_; + + const conformationSurfaces& allGeometry_; + + autoPtr<cellSizeFunction> cellSizeFunction_; + + +// const conformationSurfaces& geometryToConformTo_; +// +// //- Indices of surfaces in allGeometry that are to be conformed to +// labelList surfaces_; +// +// //- A list of all of the cellSizeFunction objects +// PtrList<cellSizeFunction> cellSizeFunctions_; +// +// autoPtr<triangulatedMesh> triangulatedMesh_; +// +// +// // Private Member Functions +// +// //- +// tensor requiredAlignment +// ( +// const point& pt, +// const vectorField& ptNormals +// ) const; + + //- Disallow default bitwise copy construct + searchableSurfaceControl(const searchableSurfaceControl&); + + //- Disallow default bitwise assignment + void operator=(const searchableSurfaceControl&); + + +public: + + //- Runtime type information + TypeName("searchableSurfaceControl"); + + + // Constructors + + //- Construct from dictionary and references to conformalVoronoiMesh and + // searchableSurfaces + searchableSurfaceControl + ( + const Time& runTime, + const word& name, + const dictionary& controlFunctionDict, + const conformationSurfaces& allGeometry + ); + + //- Destructor + ~searchableSurfaceControl(); + + + // Member Functions + + // Access + +// //- Return reference to the searchableSurfaces object containing +// // all of the geometry +// inline const searchableSurfaces& geometry() const; +// +// //- Return the surface indices +// inline const labelList& surfaces() const; +// +// +// // Query +// +// //- Return the cell size at the given location +// virtual scalar cellSize(const point& pt) const; +// +// //- Return the cell alignment at the given location +// virtual tensor cellAlignment(const point& pt) const; +// +// virtual void cellSizeAndAlignment +// ( +// const point& pt, +// scalar& size, +// tensor& alignment +// ) const; + + virtual void initialVertices + ( + pointField& pts, + scalarField& sizes, + triadField& alignments + ) const; + + const cellSizeFunction& sizeFunction() const + { + return cellSizeFunction_(); + } + + virtual label priority() const + { + return cellSizeFunction_().priority(); + } + + // Edit + +}; + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace Foam + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#endif + +// ************************************************************************* // diff --git a/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/cellSizeControlSurfaces/cellSizeFunction/cellSizeFunction/cellSizeFunction.C b/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/cellSizeControlSurfaces/cellSizeFunction/cellSizeFunction/cellSizeFunction.C new file mode 100644 index 0000000000000000000000000000000000000000..5b35e7b301bb4d659be1bb46a4b5ce1021750ad0 --- /dev/null +++ b/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/cellSizeControlSurfaces/cellSizeFunction/cellSizeFunction/cellSizeFunction.C @@ -0,0 +1,146 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2012-2013 OpenFOAM Foundation + \\/ M anipulation | +------------------------------------------------------------------------------- +License + This file is part of OpenFOAM. + + OpenFOAM is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + OpenFOAM is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>. + +\*---------------------------------------------------------------------------*/ + +#include "cellSizeFunction.H" +#include "addToRunTimeSelectionTable.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ + defineTypeNameAndDebug(cellSizeFunction, 0); + defineRunTimeSelectionTable(cellSizeFunction, dictionary); + + scalar cellSizeFunction::snapToSurfaceTol_ = 1e-10; +} + +// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // + +Foam::cellSizeFunction::cellSizeFunction +( + const word& type, + const dictionary& cellSizeFunctionDict, + const searchableSurface& surface +) +: + dictionary(cellSizeFunctionDict), + surface_(surface), + surfaceCellSizeFunction_ + ( + surfaceCellSizeFunction::New + ( + cellSizeFunctionDict, + surface + ) + ), + coeffsDict_(subDict(type + "Coeffs")), + sideMode_(), + priority_(readLabel(cellSizeFunctionDict.lookup("priority"))) +{ + word mode = cellSizeFunctionDict.lookup("mode"); + + if (surface_.hasVolumeType()) + { + if (mode == "inside") + { + sideMode_ = smInside; + } + else if (mode == "outside") + { + sideMode_ = smOutside; + } + else if (mode == "bothSides") + { + sideMode_ = rmBothsides; + } + else + { + FatalErrorIn("searchableSurfaceControl::searchableSurfaceControl") + << "Unknown mode, expected: inside, outside or bothSides" << nl + << exit(FatalError); + } + } + else + { + if (mode != "bothSides") + { + WarningIn("searchableSurfaceControl::searchableSurfaceControl") + << "surface does not support volumeType, defaulting mode to " + << "bothSides." + << endl; + } + + sideMode_ = rmBothsides; + } +} + + +// * * * * * * * * * * * * * * * * * Selectors * * * * * * * * * * * * * * * // + +Foam::autoPtr<Foam::cellSizeFunction> Foam::cellSizeFunction::New +( + const dictionary& cellSizeFunctionDict, + const searchableSurface& surface +) +{ + word cellSizeFunctionTypeName + ( + cellSizeFunctionDict.lookup("cellSizeFunction") + ); + + Info<< " Selecting cellSizeFunction " << cellSizeFunctionTypeName + << endl; + + dictionaryConstructorTable::iterator cstrIter = + dictionaryConstructorTablePtr_->find(cellSizeFunctionTypeName); + + if (cstrIter == dictionaryConstructorTablePtr_->end()) + { + FatalErrorIn + ( + "cellSizeFunction::New(dictionary&, " + "const conformalVoronoiMesh&, const searchableSurface&)" + ) << "Unknown cellSizeFunction type " + << cellSizeFunctionTypeName + << endl << endl + << "Valid cellSizeFunction types are :" << endl + << dictionaryConstructorTablePtr_->toc() + << exit(FatalError); + } + + return autoPtr<cellSizeFunction> + ( + cstrIter()(cellSizeFunctionDict, surface) + ); +} + + +// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * // + +Foam::cellSizeFunction::~cellSizeFunction() +{} + + +// ************************************************************************* // diff --git a/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/cellSizeControlSurfaces/cellSizeFunction/cellSizeFunction/cellSizeFunction.H b/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/cellSizeControlSurfaces/cellSizeFunction/cellSizeFunction/cellSizeFunction.H new file mode 100644 index 0000000000000000000000000000000000000000..6c93f8e260238d88ae6b8e8344a9d657d4c35f56 --- /dev/null +++ b/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/cellSizeControlSurfaces/cellSizeFunction/cellSizeFunction/cellSizeFunction.H @@ -0,0 +1,201 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2012-2013 OpenFOAM Foundation + \\/ M anipulation | +------------------------------------------------------------------------------- +License + This file is part of OpenFOAM. + + OpenFOAM is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + OpenFOAM is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>. + +Class + Foam::cellSizeFunction + +Description + Abstract base class for specifying target cell sizes + +SourceFiles + cellSizeFunction.C + +\*---------------------------------------------------------------------------*/ + +#ifndef cellSizeFunction_H +#define cellSizeFunction_H + +#include "point.H" +#include "conformalVoronoiMesh.H" +#include "searchableSurface.H" +#include "dictionary.H" +#include "autoPtr.H" +#include "runTimeSelectionTables.H" +#include "surfaceCellSizeFunction.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ + +/*---------------------------------------------------------------------------*\ + Class cellSizeFunction Declaration +\*---------------------------------------------------------------------------*/ + +class cellSizeFunction +: + public dictionary +{ + +public: + + //- Surface side mode + enum sideMode + { + smInside, // Control inside the surface + smOutside, // Control outside the surface + rmBothsides // Control on both sides of a surface + }; + + //- Runtime type information + TypeName("cellSizeFunction"); + + +protected: + + // Static data + + //- Point closeness tolerance to a surface where the function "snaps" to + // including the surface + static scalar snapToSurfaceTol_; + + + // Protected data + + //- Reference to the searchableSurface that cellSizeFunction + // relates to + const searchableSurface& surface_; + + //- Cell size at the surface + scalarField surfaceCellSize_; + + autoPtr<surfaceCellSizeFunction> surfaceCellSizeFunction_; + + //- Method details dictionary + dictionary coeffsDict_; + + //- Mode of size specification, i.e. inside, outside or bothSides + sideMode sideMode_; + + label priority_; + + +private: + + // Private Member Functions + + //- Disallow default bitwise copy construct + cellSizeFunction(const cellSizeFunction&); + + //- Disallow default bitwise assignment + void operator=(const cellSizeFunction&); + + +public: + + // Declare run-time constructor selection table + + declareRunTimeSelectionTable + ( + autoPtr, + cellSizeFunction, + dictionary, + ( + const dictionary& cellSizeFunctionDict, + const searchableSurface& surface + ), + (cellSizeFunctionDict, surface) + ); + + + // Constructors + + //- Construct from components + cellSizeFunction + ( + const word& type, + const dictionary& cellSizeFunctionDict, + const searchableSurface& surface + ); + + + // Selectors + + //- Return a reference to the selected cellSizeFunction + static autoPtr<cellSizeFunction> New + ( + const dictionary& cellSizeFunctionDict, + const searchableSurface& surface + ); + + + //- Destructor + virtual ~cellSizeFunction(); + + + // Member Functions + + //- Const access to the details dictionary + inline const dictionary& coeffsDict() const + { + return coeffsDict_; + } + + //- Modify scalar argument to the cell size specified by function. + // Return a boolean specifying if the function was used, i.e. false if + // the point was not in range of the surface for a spatially varying + // size. + virtual bool cellSize + ( + const point& pt, + scalar& size + ) const = 0; + + + virtual bool setCellSize + ( + const pointField& pts + ) + { + WarningIn("cellSizeFunction::setCellSize(const pointField&)") + << "Not overloaded." + << endl; + return false; + } + + label priority() const + { + return priority_; + } +}; + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace Foam + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#endif + +// ************************************************************************* // diff --git a/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/cellSizeControlSurfaces/cellSizeFunction/linearDistance/linearDistance.C b/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/cellSizeControlSurfaces/cellSizeFunction/linearDistance/linearDistance.C new file mode 100644 index 0000000000000000000000000000000000000000..fc4c4223ef754f7c4fdec46b1256b9e2ac25b294 --- /dev/null +++ b/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/cellSizeControlSurfaces/cellSizeFunction/linearDistance/linearDistance.C @@ -0,0 +1,200 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2012 OpenFOAM Foundation + \\/ M anipulation | +------------------------------------------------------------------------------- +License + This file is part of OpenFOAM. + + OpenFOAM is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + OpenFOAM is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>. + +\*---------------------------------------------------------------------------*/ + +#include "linearDistance.H" +#include "addToRunTimeSelectionTable.H" +#include "triSurfaceMesh.H" +#include "triSurfaceFields.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ + +// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * // + +defineTypeNameAndDebug(linearDistance, 0); +addToRunTimeSelectionTable(cellSizeFunction, linearDistance, dictionary); + + +// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // + +linearDistance::linearDistance +( + const dictionary& initialPointsDict, + const searchableSurface& surface +) +: + cellSizeFunction(typeName, initialPointsDict, surface), + distanceCellSize_(readScalar(coeffsDict().lookup("distanceCellSize"))), + distance_(readScalar(coeffsDict().lookup("distance"))), + distanceSqr_(sqr(distance_)) +{} + + +// * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * * // + +scalar linearDistance::sizeFunction +( + const point& pt, + scalar d, + label index +) const +{ + const scalar interpolatedSize + = surfaceCellSizeFunction_().interpolate(pt, index); + + scalar gradient + = (distanceCellSize_ - interpolatedSize) + /distance_; + + scalar size = gradient*d + interpolatedSize; + + return size; +} + + +// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // + +bool linearDistance::cellSize(const point& pt, scalar& size) const +{ + size = 0; + + List<pointIndexHit> hits; + + surface_.findNearest + ( + pointField(1, pt), + scalarField(1, distanceSqr_), + hits + ); + + const pointIndexHit& hitInfo = hits[0]; + + if (hitInfo.hit()) + { + const point& hitPt = hitInfo.hitPoint(); + const label hitIndex = hitInfo.index(); + + const scalar dist = mag(pt - hitPt); + + if (sideMode_ == rmBothsides) + { + size = sizeFunction(hitPt, dist, hitIndex); + + return true; + } + + // If the nearest point is essentially on the surface, do not do a + // getVolumeType calculation, as it will be prone to error. + if (dist < snapToSurfaceTol_) + { + size = sizeFunction(hitPt, 0, hitIndex); + + return true; + } + + pointField ptF(1, pt); + List<searchableSurface::volumeType> vTL; + + surface_.getVolumeType(ptF, vTL); + + bool functionApplied = false; + + if + ( + sideMode_ == smInside + && vTL[0] == searchableSurface::INSIDE + ) + { + size = sizeFunction(hitPt, dist, hitIndex); + + functionApplied = true; + } + else if + ( + sideMode_ == smOutside + && vTL[0] == searchableSurface::OUTSIDE + ) + { + size = sizeFunction(hitPt, dist, hitIndex); + + functionApplied = true; + } + + return functionApplied; + } + + return false; +} + + +bool linearDistance::setCellSize(const pointField& pts) +{ + labelHashSet surfaceAlreadyHit(surfaceCellSize_.size()); + + forAll(pts, ptI) + { + const Foam::point& pt = pts[ptI]; + + List<pointIndexHit> hits; + + surface_.findNearest + ( + pointField(1, pt), + scalarField(1, distanceSqr_), + hits + ); + + const label surfHitI = hits[0].index(); + + if + ( + hits[0].hit() + && !surfaceAlreadyHit.found(surfHitI) + ) + { + // Halving cell size is arbitrary + surfaceCellSizeFunction_().refineSurfaceSize(surfHitI); + + surfaceAlreadyHit.insert(surfHitI); + } + } + + // Force recalculation of the interpolation + if (!pts.empty()) + { + surfaceCellSizeFunction_().recalculateInterpolation(); + } + + return true; +} + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace Foam + +// ************************************************************************* // diff --git a/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/cellSizeControlSurfaces/cellSizeFunction/linearDistance/linearDistance.H b/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/cellSizeControlSurfaces/cellSizeFunction/linearDistance/linearDistance.H new file mode 100644 index 0000000000000000000000000000000000000000..d30a6a8045991d02255f782b954e4f7af9ae1386 --- /dev/null +++ b/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/cellSizeControlSurfaces/cellSizeFunction/linearDistance/linearDistance.H @@ -0,0 +1,121 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2012 OpenFOAM Foundation + \\/ M anipulation | +------------------------------------------------------------------------------- +License + This file is part of OpenFOAM. + + OpenFOAM is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + OpenFOAM is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>. + +Class + Foam::linearDistance + +Description + +SourceFiles + linearDistance.C + +\*---------------------------------------------------------------------------*/ + +#ifndef linearDistance_H +#define linearDistance_H + +#include "cellSizeFunction.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ + +/*---------------------------------------------------------------------------*\ + Class linearDistance Declaration +\*---------------------------------------------------------------------------*/ + +class linearDistance +: + public cellSizeFunction +{ + +private: + + // Private data + + //- cell size at distance_ from the surface + scalar distanceCellSize_; + + //- distance from the surface to control over + scalar distance_; + + //- distance squared + scalar distanceSqr_; + + + // Private Member Functions + + //- Calculate the cell size as a function of the given distance + scalar sizeFunction(const point& pt, scalar d, label index) const; + + +public: + + //- Runtime type information + TypeName("linearDistance"); + + // Constructors + + //- Construct from components + linearDistance + ( + const dictionary& initialPointsDict, + const searchableSurface& surface + ); + + + //- Destructor + virtual ~linearDistance() + {} + + + // Member Functions + + //- Modify scalar argument to the cell size specified by function. + // Return a boolean specifying if the function was used, i.e. false if + // the point was not in range of the surface for a spatially varying + // size. + virtual bool cellSize + ( + const point& pt, + scalar& size + ) const; + + //- Adapt local cell size. Return true if anything changed. + virtual bool setCellSize + ( + const pointField& pts + ); +}; + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace Foam + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#endif + +// ************************************************************************* // diff --git a/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/cellSizeControlSurfaces/cellSizeFunction/linearSpatial/linearSpatial.C b/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/cellSizeControlSurfaces/cellSizeFunction/linearSpatial/linearSpatial.C new file mode 100644 index 0000000000000000000000000000000000000000..5f41979bc764d14260e803b74f646219630a9529 --- /dev/null +++ b/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/cellSizeControlSurfaces/cellSizeFunction/linearSpatial/linearSpatial.C @@ -0,0 +1,142 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2012 OpenFOAM Foundation + \\/ M anipulation | +------------------------------------------------------------------------------- +License + This file is part of OpenFOAM. + + OpenFOAM is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + OpenFOAM is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>. + +\*---------------------------------------------------------------------------*/ + +#include "linearSpatial.H" +#include "addToRunTimeSelectionTable.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ + +// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * // + +defineTypeNameAndDebug(linearSpatial, 0); +addToRunTimeSelectionTable(cellSizeFunction, linearSpatial, dictionary); + + +// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // + +linearSpatial::linearSpatial +( + const dictionary& initialPointsDict, + const searchableSurface& surface +) +: + cellSizeFunction(typeName, initialPointsDict, surface), + referencePoint_(coeffsDict().lookup("referencePoint")), + referenceCellSize_(readScalar(coeffsDict().lookup("referenceCellSize"))), + direction_(coeffsDict().lookup("direction")), + cellSizeGradient_(readScalar(coeffsDict().lookup("cellSizeGradient"))) +{ + direction_ /= mag(direction_); +} + + +// * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * * // + +scalar linearSpatial::sizeFunction(const point& pt) const +{ + return + referenceCellSize_ + + ((pt - referencePoint_) & direction_)*cellSizeGradient_; +} + + +// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // + +bool linearSpatial::cellSize +( + const point& pt, + scalar& size +) const +{ + if (sideMode_ == rmBothsides) + { + size = sizeFunction(pt); + + return true; + } + + size = 0; + + List<pointIndexHit> hits; + + surface_.findNearest + ( + pointField(1, pt), + scalarField(1, sqr(snapToSurfaceTol_)), + hits + ); + + const pointIndexHit& hitInfo = hits[0]; + + // If the nearest point is essentially on the surface, do not do a + // getVolumeType calculation, as it will be prone to error. + if (hitInfo.hit()) + { + size = sizeFunction(pt); + + return true; + } + + pointField ptF(1, pt); + List<searchableSurface::volumeType> vTL; + + surface_.getVolumeType(ptF, vTL); + + bool functionApplied = false; + + if + ( + sideMode_ == smInside + && vTL[0] == searchableSurface::INSIDE + ) + { + size = sizeFunction(pt); + + functionApplied = true; + } + else if + ( + sideMode_ == smOutside + && vTL[0] == searchableSurface::OUTSIDE + ) + { + size = sizeFunction(pt); + + functionApplied = true; + } + + return functionApplied; + +} + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace Foam + +// ************************************************************************* // diff --git a/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/cellSizeControlSurfaces/cellSizeFunction/linearSpatial/linearSpatial.H b/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/cellSizeControlSurfaces/cellSizeFunction/linearSpatial/linearSpatial.H new file mode 100644 index 0000000000000000000000000000000000000000..0f413b289a950c40ba3bb2b068c9bea97b92c272 --- /dev/null +++ b/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/cellSizeControlSurfaces/cellSizeFunction/linearSpatial/linearSpatial.H @@ -0,0 +1,119 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2012 OpenFOAM Foundation + \\/ M anipulation | +------------------------------------------------------------------------------- +License + This file is part of OpenFOAM. + + OpenFOAM is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + OpenFOAM is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>. + +Class + Foam::linearSpatial + +Description + +SourceFiles + linearSpatial.C + +\*---------------------------------------------------------------------------*/ + +#ifndef linearSpatial_H +#define linearSpatial_H + +#include "cellSizeFunction.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ + +/*---------------------------------------------------------------------------*\ + Class linearSpatial Declaration +\*---------------------------------------------------------------------------*/ + +class linearSpatial +: + public cellSizeFunction +{ + +private: + + // Private data + + //- Reference point for spatial size grading + point referencePoint_; + + //- Cell size at reference point + scalar referenceCellSize_; + + //- Direction of cell size grading, stored as unit vector, may be + // supplied with any magnitude + vector direction_; + + //- Gradient of cell size change in direction of direction_ + scalar cellSizeGradient_; + + + // Private Member Functions + + //- Calculate the cell size as a function of the given position + scalar sizeFunction(const point& pt) const; + + +public: + + //- Runtime type information + TypeName("linearSpatial"); + + // Constructors + + //- Construct from components + linearSpatial + ( + const dictionary& initialPointsDict, + const searchableSurface& surface + ); + + + //- Destructor + virtual ~linearSpatial() + {} + + + // Member Functions + + //- Modify scalar argument to the cell size specified by function. + // Return a boolean specifying if the function was used, i.e. false if + // the point was not in range of the surface for a spatially varying + // size. + virtual bool cellSize + ( + const point& pt, + scalar& size + ) const; +}; + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace Foam + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#endif + +// ************************************************************************* // diff --git a/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/cellSizeControlSurfaces/cellSizeFunction/surfaceOffsetLinearDistance/surfaceOffsetLinearDistance.C b/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/cellSizeControlSurfaces/cellSizeFunction/surfaceOffsetLinearDistance/surfaceOffsetLinearDistance.C new file mode 100644 index 0000000000000000000000000000000000000000..2a711f3e0b6f66958c9cfae41b8e9b0cd343d659 --- /dev/null +++ b/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/cellSizeControlSurfaces/cellSizeFunction/surfaceOffsetLinearDistance/surfaceOffsetLinearDistance.C @@ -0,0 +1,224 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2012 OpenFOAM Foundation + \\/ M anipulation | +------------------------------------------------------------------------------- +License + This file is part of OpenFOAM. + + OpenFOAM is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + OpenFOAM is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>. + +\*---------------------------------------------------------------------------*/ + +#include "surfaceOffsetLinearDistance.H" +#include "addToRunTimeSelectionTable.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ + +// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * // + +defineTypeNameAndDebug(surfaceOffsetLinearDistance, 0); +addToRunTimeSelectionTable +( + cellSizeFunction, + surfaceOffsetLinearDistance, + dictionary +); + +// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // + +surfaceOffsetLinearDistance::surfaceOffsetLinearDistance +( + const dictionary& initialPointsDict, + const searchableSurface& surface +) +: + cellSizeFunction(typeName, initialPointsDict, surface), + distanceCellSize_(readScalar(coeffsDict().lookup("distanceCellSize"))), + surfaceOffset_(readScalar(coeffsDict().lookup("surfaceOffset"))), + totalDistance_(), + totalDistanceSqr_() +{ + if + ( + coeffsDict().found("totalDistance") + || coeffsDict().found("linearDistance") + ) + { + if + ( + coeffsDict().found("totalDistance") + && coeffsDict().found("linearDistance") + ) + { + FatalErrorIn + ( + "surfaceOffsetLinearDistance::surfaceOffsetLinearDistance" + "(" + "const dictionary& initialPointsDict, " + "const conformalVoronoiMesh& cvMesh, " + "const searchableSurface& surface" + ")" + ) + << "totalDistance and linearDistance found, " + << "specify one or other, not both." + << nl << exit(FatalError) << endl; + } + + if (coeffsDict().found("totalDistance")) + { + totalDistance_ = readScalar(coeffsDict().lookup("totalDistance")); + } + else + { + totalDistance_ = + readScalar(coeffsDict().lookup("linearDistance")) + + surfaceOffset_; + } + } + else + { + FatalErrorIn + ( + "surfaceOffsetLinearDistance::surfaceOffsetLinearDistance" + "(" + "const dictionary& initialPointsDict, " + "const conformalVoronoiMesh& cvMesh, " + "const searchableSurface& surface" + ")" + ) + << "totalDistance or linearDistance not found." + << nl << exit(FatalError) << endl; + } + + totalDistanceSqr_ = sqr(totalDistance_); +} + + +// * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * * // + +scalar surfaceOffsetLinearDistance::sizeFunction +( + const point& pt, + scalar d, + label index +) const +{ + const scalar interpolatedSize + = surfaceCellSizeFunction_().interpolate(pt, index); + + if (d <= surfaceOffset_) + { + return interpolatedSize; + } + + scalar gradient = + (distanceCellSize_ - interpolatedSize) + /(totalDistance_ - surfaceOffset_); + + scalar intercept = interpolatedSize - gradient*surfaceOffset_; + + return gradient*d + intercept; +} + + +// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // + +bool surfaceOffsetLinearDistance::cellSize +( + const point& pt, + scalar& size +) const +{ + size = 0; + + List<pointIndexHit> hits; + + surface_.findNearest + ( + pointField(1, pt), + scalarField(1, totalDistanceSqr_), + hits + ); + + const pointIndexHit& hitInfo = hits[0]; + + if (hitInfo.hit()) + { + const point& hitPt = hitInfo.hitPoint(); + const label hitIndex = hitInfo.index(); + + const scalar dist = mag(pt - hitPt); + + if (sideMode_ == rmBothsides) + { + size = sizeFunction(hitPt, dist, hitIndex); + + return true; + } + + // If the nearest point is essentially on the surface, do not do a + // getVolumeType calculation, as it will be prone to error. + if (mag(pt - hitInfo.hitPoint()) < snapToSurfaceTol_) + { + size = sizeFunction(hitPt, 0, hitIndex); + + return true; + } + + pointField ptF(1, pt); + List<searchableSurface::volumeType> vTL; + + surface_.getVolumeType(ptF, vTL); + + bool functionApplied = false; + + if + ( + sideMode_ == smInside + && vTL[0] == searchableSurface::INSIDE + ) + { + size = sizeFunction(hitPt, dist, hitIndex); + + functionApplied = true; + } + else if + ( + sideMode_ == smOutside + && vTL[0] == searchableSurface::OUTSIDE + ) + { + size = sizeFunction(hitPt, dist, hitIndex); + + functionApplied = true; + } + + return functionApplied; + } + + return false; +} + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace Foam + +// ************************************************************************* // diff --git a/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/cellSizeControlSurfaces/cellSizeFunction/surfaceOffsetLinearDistance/surfaceOffsetLinearDistance.H b/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/cellSizeControlSurfaces/cellSizeFunction/surfaceOffsetLinearDistance/surfaceOffsetLinearDistance.H new file mode 100644 index 0000000000000000000000000000000000000000..520435237fbbf9d0fc700c6d9f22c2bdee0168d0 --- /dev/null +++ b/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/cellSizeControlSurfaces/cellSizeFunction/surfaceOffsetLinearDistance/surfaceOffsetLinearDistance.H @@ -0,0 +1,119 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2012 OpenFOAM Foundation + \\/ M anipulation | +------------------------------------------------------------------------------- +License + This file is part of OpenFOAM. + + OpenFOAM is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + OpenFOAM is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>. + +Class + Foam::surfaceOffsetLinearDistance + +Description + +SourceFiles + surfaceOffsetLinearDistance.C + +\*---------------------------------------------------------------------------*/ + +#ifndef surfaceOffsetLinearDistance_H +#define surfaceOffsetLinearDistance_H + +#include "cellSizeFunction.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ + +/*---------------------------------------------------------------------------*\ + Class surfaceOffsetLinearDistance Declaration +\*---------------------------------------------------------------------------*/ + +class surfaceOffsetLinearDistance +: + public cellSizeFunction +{ + +private: + + // Private data + + //- cell size at distance_ from the surface + scalar distanceCellSize_; + + //- Offset distance from surface for constant size portion + scalar surfaceOffset_; + + //- Total distance from the surface to control over (distance + + // surfaceOffset) + scalar totalDistance_; + + //- totalDistance squared + scalar totalDistanceSqr_; + + + // Private Member Functions + + //- Calculate the cell size as a function of the given distance + scalar sizeFunction(const point& pt, scalar d, label index) const; + + +public: + + //- Runtime type information + TypeName("surfaceOffsetLinearDistance"); + + // Constructors + + //- Construct from components + surfaceOffsetLinearDistance + ( + const dictionary& initialPointsDict, + const searchableSurface& surface + ); + + + //- Destructor + virtual ~surfaceOffsetLinearDistance() + {} + + + // Member Functions + + //- Modify scalar argument to the cell size specified by function. + // Return a boolean specifying if the function was used, i.e. false if + // the point was not in range of the surface for a spatially varying + // size. + virtual bool cellSize + ( + const point& pt, + scalar& size + ) const; +}; + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace Foam + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#endif + +// ************************************************************************* // diff --git a/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/cellSizeControlSurfaces/cellSizeFunction/uniform/uniform.C b/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/cellSizeControlSurfaces/cellSizeFunction/uniform/uniform.C new file mode 100644 index 0000000000000000000000000000000000000000..e2744eeb2fe544aad3e715bf774d619402a5ee0d --- /dev/null +++ b/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/cellSizeControlSurfaces/cellSizeFunction/uniform/uniform.C @@ -0,0 +1,175 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2012 OpenFOAM Foundation + \\/ M anipulation | +------------------------------------------------------------------------------- +License + This file is part of OpenFOAM. + + OpenFOAM is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + OpenFOAM is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>. + +\*---------------------------------------------------------------------------*/ + +#include "uniform.H" +#include "addToRunTimeSelectionTable.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ + +// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * // + +defineTypeNameAndDebug(uniform, 0); +addToRunTimeSelectionTable(cellSizeFunction, uniform, dictionary); + +// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // + +uniform::uniform +( + const dictionary& initialPointsDict, + const searchableSurface& surface +) +: + cellSizeFunction(typeName, initialPointsDict, surface) +{} + + +// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // + +bool uniform::cellSize +( + const point& pt, + scalar& size +) const +{ + List<pointIndexHit> hits; + + surface_.findNearest + ( + pointField(1, pt), + scalarField(1, sqr(GREAT)), + hits + ); + + const pointIndexHit& hitInfo = hits[0]; + + if (hitInfo.hit()) + { + const point& hitPt = hitInfo.hitPoint(); + const label index = hitInfo.index(); + + if (sideMode_ == rmBothsides) + { + size = surfaceCellSizeFunction_().interpolate(hitPt, index); + + return true; + } + + size = 0; + + List<pointIndexHit> closeToSurfaceHits; + + surface_.findNearest + ( + pointField(1, pt), + scalarField(1, sqr(snapToSurfaceTol_)), + closeToSurfaceHits + ); + + const pointIndexHit& closeToSurface = closeToSurfaceHits[0]; + + // If the nearest point is essentially on the surface, do not do a + // getVolumeType calculation, as it will be prone to error. + if (closeToSurface.hit()) + { + size = surfaceCellSizeFunction_().interpolate(hitPt, index); + + return true; + } + + pointField ptF(1, pt); + List<searchableSurface::volumeType> vTL(1); + + surface_.getVolumeType(ptF, vTL); + + bool functionApplied = false; + + if + ( + sideMode_ == smInside + && vTL[0] == searchableSurface::INSIDE + ) + { + size = surfaceCellSizeFunction_().interpolate(hitPt, index); + + functionApplied = true; + } + else if + ( + sideMode_ == smOutside + && vTL[0] == searchableSurface::OUTSIDE + ) + { + size = surfaceCellSizeFunction_().interpolate(hitPt, index); + + functionApplied = true; + } + + return functionApplied; + } + + return false; +} + + +bool uniform::setCellSize +( + const pointField& pts +) +{ +// labelHashSet surfaceAlreadyHit(cellSize_.size()); +// +// forAll(pts, ptI) +// { +// const Foam::point& pt = pts[ptI]; +// +// List<pointIndexHit> hits; +// +// surface_.findNearest +// ( +// pointField(1, pt), +// scalarField(1, sqr(GREAT)), +// hits +// ); +// +// if (hits[0].hit() && !surfaceAlreadyHit.found(hits[0].index())) +// { +// surfaceCellSizeFunction_().refineCellSize(hits[0].index()); +// +// surfaceAlreadyHit.insert(hits[0].index()); +// } +// } + + return true; +} + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace Foam + +// ************************************************************************* // diff --git a/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/cellSizeControlSurfaces/cellSizeFunction/uniform/uniform.H b/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/cellSizeControlSurfaces/cellSizeFunction/uniform/uniform.H new file mode 100644 index 0000000000000000000000000000000000000000..726d506992e3dfe3436da05c2bf730d7b73a19b5 --- /dev/null +++ b/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/cellSizeControlSurfaces/cellSizeFunction/uniform/uniform.H @@ -0,0 +1,106 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2012 OpenFOAM Foundation + \\/ M anipulation | +------------------------------------------------------------------------------- +License + This file is part of OpenFOAM. + + OpenFOAM is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + OpenFOAM is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>. + +Class + Foam::uniform + +Description + +SourceFiles + uniform.C + +\*---------------------------------------------------------------------------*/ + +#ifndef uniform_H +#define uniform_H + +#include "cellSizeFunction.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ + +/*---------------------------------------------------------------------------*\ + Class uniform Declaration +\*---------------------------------------------------------------------------*/ + +class uniform +: + public cellSizeFunction +{ + +private: + + // Private data + + +public: + + //- Runtime type information + TypeName("uniform"); + + // Constructors + + //- Construct from components + uniform + ( + const dictionary& initialPointsDict, + const searchableSurface& surface + ); + + + //- Destructor + virtual ~uniform() + {} + + + // Member Functions + + //- Modify scalar argument to the cell size specified by function. + // Return a boolean specifying if the function was used, i.e. false if + // the point was not in range of the surface for a spatially varying + // size. + virtual bool cellSize + ( + const point& pt, + scalar& size + ) const; + + //- Adapt local cell size. Return true if anything changed. + virtual bool setCellSize + ( + const pointField& pts + ); +}; + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace Foam + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#endif + +// ************************************************************************* // diff --git a/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/cellSizeControlSurfaces/cellSizeFunction/uniformDistance/uniformDistance.C b/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/cellSizeControlSurfaces/cellSizeFunction/uniformDistance/uniformDistance.C new file mode 100644 index 0000000000000000000000000000000000000000..47e8ecfe43db2a6fbf62c68431066c11e6538e03 --- /dev/null +++ b/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/cellSizeControlSurfaces/cellSizeFunction/uniformDistance/uniformDistance.C @@ -0,0 +1,164 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2012 OpenFOAM Foundation + \\/ M anipulation | +------------------------------------------------------------------------------- +License + This file is part of OpenFOAM. + + OpenFOAM is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + OpenFOAM is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>. + +\*---------------------------------------------------------------------------*/ + +#include "uniformDistance.H" +#include "addToRunTimeSelectionTable.H" +#include "dimensionSet.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ + +// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * // + +defineTypeNameAndDebug(uniformDistance, 0); +addToRunTimeSelectionTable(cellSizeFunction, uniformDistance, dictionary); + +// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // + +uniformDistance::uniformDistance +( + const dictionary& initialPointsDict, + const searchableSurface& surface +) +: + cellSizeFunction(typeName, initialPointsDict, surface), + distance_(readScalar(coeffsDict().lookup("distance"))), + distanceSqr_(sqr(distance_)) +{} + + +// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // + +bool uniformDistance::cellSize +( + const point& pt, + scalar& size +) const +{ + size = 0; + + List<pointIndexHit> hits; + + surface_.findNearest + ( + pointField(1, pt), + scalarField(1, distanceSqr_), + hits + ); + + const pointIndexHit& hitInfo = hits[0]; + + if (hitInfo.hit()) + { + if (sideMode_ == rmBothsides) + { + size = surfaceCellSizeFunction_().surfaceSize(hitInfo.index()); + + return true; + } + + // If the nearest point is essentially on the surface, do not do a + // getVolumeType calculation, as it will be prone to error. + if (mag(pt - hitInfo.hitPoint()) < snapToSurfaceTol_) + { + size = surfaceCellSizeFunction_().surfaceSize(hitInfo.index()); + + return true; + } + + pointField ptF(1, pt); + List<searchableSurface::volumeType> vTL; + + surface_.getVolumeType(ptF, vTL); + + bool functionApplied = false; + + if + ( + sideMode_ == smInside + && vTL[0] == searchableSurface::INSIDE + ) + { + size = surfaceCellSizeFunction_().surfaceSize(hitInfo.index()); + + functionApplied = true; + } + else if + ( + sideMode_ == smOutside + && vTL[0] == searchableSurface::OUTSIDE + ) + { + size = surfaceCellSizeFunction_().surfaceSize(hitInfo.index()); + + functionApplied = true; + } + + return functionApplied; + } + + return false; +} + + +bool uniformDistance::setCellSize +( + const pointField& pts +) +{ + labelHashSet surfaceAlreadyHit(surface_.size()); + + forAll(pts, ptI) + { + const Foam::point& pt = pts[ptI]; + + List<pointIndexHit> hits; + + surface_.findNearest + ( + pointField(1, pt), + scalarField(1, distanceSqr_), + hits + ); + + if (hits[0].hit() && !surfaceAlreadyHit.found(hits[0].index())) + { + surfaceCellSizeFunction_().refineSurfaceSize(hits[0].index()); + + surfaceAlreadyHit.insert(hits[0].index()); + } + } + + return true; +} + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace Foam + +// ************************************************************************* // diff --git a/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/cellSizeControlSurfaces/cellSizeFunction/uniformDistance/uniformDistance.H b/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/cellSizeControlSurfaces/cellSizeFunction/uniformDistance/uniformDistance.H new file mode 100644 index 0000000000000000000000000000000000000000..0ffe679e1b310b55b03b39b3132482a2191b0442 --- /dev/null +++ b/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/cellSizeControlSurfaces/cellSizeFunction/uniformDistance/uniformDistance.H @@ -0,0 +1,112 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2012 OpenFOAM Foundation + \\/ M anipulation | +------------------------------------------------------------------------------- +License + This file is part of OpenFOAM. + + OpenFOAM is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + OpenFOAM is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>. + +Class + Foam::uniformDistance + +Description + +SourceFiles + uniformDistance.C + +\*---------------------------------------------------------------------------*/ + +#ifndef uniformDistance_H +#define uniformDistance_H + +#include "cellSizeFunction.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ + +/*---------------------------------------------------------------------------*\ + Class uniformDistance Declaration +\*---------------------------------------------------------------------------*/ + +class uniformDistance +: + public cellSizeFunction +{ + +private: + + // Private data + + //- Distance + scalar distance_; + + //- Distance squared + scalar distanceSqr_; + + +public: + + //- Runtime type information + TypeName("uniformDistance"); + + // Constructors + + //- Construct from components + uniformDistance + ( + const dictionary& initialPointsDict, + const searchableSurface& surface + ); + + + //- Destructor + virtual ~uniformDistance() + {} + + + // Member Functions + + //- Modify scalar argument to the cell size specified by function. + // Return a boolean specifying if the function was used, i.e. false if + // the point was not in range of the surface for a spatially varying + // size. + virtual bool cellSize + ( + const point& pt, + scalar& size + ) const; + + //- Adapt local cell size. Return true if anything changed. + virtual bool setCellSize + ( + const pointField& pts + ); +}; + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace Foam + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#endif + +// ************************************************************************* // diff --git a/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/cellSizeControlSurfaces/surfaceCellSizeFunction/cellSizeCalculationType/automatic/automatic.C b/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/cellSizeControlSurfaces/surfaceCellSizeFunction/cellSizeCalculationType/automatic/automatic.C new file mode 100644 index 0000000000000000000000000000000000000000..4a73b4a7c51cc78e1607d3ffd42a2058f2710729 --- /dev/null +++ b/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/cellSizeControlSurfaces/surfaceCellSizeFunction/cellSizeCalculationType/automatic/automatic.C @@ -0,0 +1,292 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2012 OpenFOAM Foundation + \\/ M anipulation | +------------------------------------------------------------------------------- +License + This file is part of OpenFOAM. + + OpenFOAM is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + OpenFOAM is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>. + +\*---------------------------------------------------------------------------*/ + +#include "automatic.H" +#include "addToRunTimeSelectionTable.H" +#include "triSurfaceMesh.H" +#include "vtkSurfaceWriter.H" +#include "Time.H" + +// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * // + +namespace Foam +{ + defineTypeNameAndDebug(automatic, 0); + addToRunTimeSelectionTable(cellSizeCalculationType, automatic, dictionary); +} + + +// * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * // + +void Foam::automatic::smoothField(triSurfaceScalarField& surf) +{ + label nSmoothingIterations = 10; + + for (label iter = 0; iter < nSmoothingIterations; ++iter) + { + const pointField& faceCentres = surface_.faceCentres(); + + forAll(surf, sI) + { + const labelList& faceFaces = surface_.faceFaces()[sI]; + + const point& fC = faceCentres[sI]; + const scalar value = surf[sI]; + + scalar newValue = 0; + scalar totalDist = 0; + + label nFaces = 0; + + forAll(faceFaces, fI) + { + const label faceLabel = faceFaces[fI]; + const point& faceCentre = faceCentres[faceLabel]; + + const scalar faceValue = surf[faceLabel]; + const scalar distance = mag(faceCentre - fC); + + newValue += faceValue/distance; + + totalDist += 1.0/distance; + + if (value < faceValue) + { + nFaces++; + } + } + + // Do not smooth out the peak values + if (nFaces == faceFaces.size()) + { + //continue; + } + + surf[sI] = newValue/totalDist; + } + } +} + + +// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // + +Foam::automatic::automatic +( + const dictionary& cellSizeCalcTypeDict, + const triSurfaceMesh& surface +) +: + cellSizeCalculationType(typeName, cellSizeCalcTypeDict, surface), + coeffsDict_(cellSizeCalcTypeDict.subDict(typeName + "Coeffs")), + surface_(surface), + surfaceName_(surface.searchableSurface::name()), + readCurvature_(Switch(coeffsDict_.lookup("curvature"))), + curvatureFile_(coeffsDict_.lookup("curvatureFile")), + readFeatureProximity_(Switch(coeffsDict_.lookup("featureProximity"))), + featureProximityFile_(coeffsDict_.lookup("featureProximityFile")), + readInternalCloseness_(Switch(coeffsDict_.lookup("internalCloseness"))), + internalClosenessFile_(coeffsDict_.lookup("internalClosenessFile")), + curvatureCellSizeFactor_ + ( + readScalar(coeffsDict_.lookup("curvatureCellSizeFactor")) + ), + maximumCellSize_ + ( + readScalar(coeffsDict_.lookup("maximumCellSize")) + ) +{} + + +// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // + +Foam::triSurfaceScalarField Foam::automatic::load() +{ + Info<< indent << "Calculating cell size on surface: " + << surfaceName_ << endl; + + triSurfaceScalarField surfaceCellSize + ( + IOobject + ( + surfaceName_ + ".cellSize", + surface_.searchableSurface::time().constant(), + "triSurface", + surface_.searchableSurface::time(), + IOobject::NO_READ, + IOobject::NO_WRITE + ), + surface_, + dimLength, + scalarField(surface_.size(), maximumCellSize_) + ); + + if (readCurvature_) + { + Info<< indent << "Reading curvature : " + << curvatureFile_ << endl; + + triSurfacePointScalarField curvature + ( + IOobject + ( + curvatureFile_, + surface_.searchableSurface::time().constant(), + "triSurface", + surface_.searchableSurface::time(), + IOobject::MUST_READ, + IOobject::NO_WRITE + ), + surface_, + dimLength, + true + ); + + const List<labelledTri>& localFaces = surface_.localFaces(); + const labelList& meshPoints = surface_.meshPoints(); + + forAll(surfaceCellSize, fI) + { + const labelList& facePoints = localFaces[fI].triFaceFace(); + + scalar interpolatedCurvatureToFace = 0.0; + + forAll(facePoints, fpI) + { + interpolatedCurvatureToFace + += curvature[meshPoints[facePoints[fpI]]]; + } + + interpolatedCurvatureToFace /= facePoints.size(); + + surfaceCellSize[fI] = + min + ( + 1.0 + /max + ( + (1.0/curvatureCellSizeFactor_) + *interpolatedCurvatureToFace, + 1.0/maximumCellSize_ + ), + surfaceCellSize[fI] + ); + } + } + + if (readInternalCloseness_) + { + Info<< indent << "Reading internal closeness: " + << internalClosenessFile_ << endl; + + triSurfaceScalarField internalCloseness + ( + IOobject + ( + internalClosenessFile_, + surface_.searchableSurface::time().constant(), + "triSurface", + surface_.searchableSurface::time(), + IOobject::MUST_READ, + IOobject::NO_WRITE + ), + surface_, + dimLength, + true + ); + + forAll(surfaceCellSize, fI) + { + surfaceCellSize[fI] = + min + ( + internalCloseness[fI], + surfaceCellSize[fI] + ); + } + } + + if (readFeatureProximity_) + { + Info<< indent << "Reading feature proximity : " + << featureProximityFile_ << endl; + + triSurfaceScalarField featureProximity + ( + IOobject + ( + featureProximityFile_, + surface_.searchableSurface::time().constant(), + "triSurface", + surface_.searchableSurface::time(), + IOobject::MUST_READ, + IOobject::NO_WRITE + ), + surface_, + dimLength, + true + ); + + forAll(surfaceCellSize, fI) + { + surfaceCellSize[fI] = + min + ( + featureProximity[fI], + surfaceCellSize[fI] + ); + } + } + + smoothField(surfaceCellSize); + + surfaceCellSize.write(); + + if (debug) + { + faceList faces(surface_.size()); + + forAll(surface_, fI) + { + faces[fI] = surface_.triSurface::operator[](fI).triFaceFace(); + } + + vtkSurfaceWriter().write + ( + surface_.searchableSurface::time().constant()/"triSurface", + surfaceName_, + surface_.points(), + faces, + "cellSize", + surfaceCellSize, + false, + true + ); + } + + return surfaceCellSize; +} + + +// ************************************************************************* // diff --git a/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/cellSizeControlSurfaces/surfaceCellSizeFunction/cellSizeCalculationType/automatic/automatic.H b/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/cellSizeControlSurfaces/surfaceCellSizeFunction/cellSizeCalculationType/automatic/automatic.H new file mode 100644 index 0000000000000000000000000000000000000000..4288176e8f3ddccd42dcf074cb5bd2f21d260756 --- /dev/null +++ b/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/cellSizeControlSurfaces/surfaceCellSizeFunction/cellSizeCalculationType/automatic/automatic.H @@ -0,0 +1,129 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2012 OpenFOAM Foundation + \\/ M anipulation | +------------------------------------------------------------------------------- +License + This file is part of OpenFOAM. + + OpenFOAM is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + OpenFOAM is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>. + +Class + Foam::automatic + +Description + +SourceFiles + automatic.C + +\*---------------------------------------------------------------------------*/ + +#ifndef automatic_H +#define automatic_H + +#include "cellSizeCalculationType.H" +#include "triSurfaceFields.H" +#include "PrimitivePatchInterpolation.H" +#include "Switch.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ + +class triSurfaceMesh; + +/*---------------------------------------------------------------------------*\ + Class automatic Declaration +\*---------------------------------------------------------------------------*/ + +class automatic +: + public cellSizeCalculationType +{ + +private: + + // Private data + + //- Dictionary of coefficients for automatic cell sizing + const dictionary& coeffsDict_; + + //- Reference to the triSurfaceMesh + const triSurfaceMesh& surface_; + + //- Name of the surface. Used to write the cell size field + const word surfaceName_; + + const Switch readCurvature_; + const word curvatureFile_; + + const Switch readFeatureProximity_; + const word featureProximityFile_; + + const Switch readInternalCloseness_; + const word internalClosenessFile_; + + //- The curvature values are multiplied by the inverse of this value to + // get the cell size + const scalar curvatureCellSizeFactor_; + + //- The maximum allowable sell size + const scalar maximumCellSize_; + + + // Private Member Functions + + void smoothField(triSurfaceScalarField& surf); + + +public: + + //- Runtime type information + TypeName("automatic"); + + + // Constructors + + //- Construct from components + automatic + ( + const dictionary& cellSizeCalcTypeDict, + const triSurfaceMesh& surface + ); + + + //- Destructor + virtual ~automatic() + {} + + + // Member Functions + + //- Load the cell size field + virtual triSurfaceScalarField load(); +}; + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace Foam + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#endif + +// ************************************************************************* // diff --git a/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/cellSizeControlSurfaces/surfaceCellSizeFunction/cellSizeCalculationType/cellSizeCalculationType/cellSizeCalculationType.C b/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/cellSizeControlSurfaces/surfaceCellSizeFunction/cellSizeCalculationType/cellSizeCalculationType/cellSizeCalculationType.C new file mode 100644 index 0000000000000000000000000000000000000000..b449d46fc66b71d794d69ffa5aeae526f47ea9d8 --- /dev/null +++ b/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/cellSizeControlSurfaces/surfaceCellSizeFunction/cellSizeCalculationType/cellSizeCalculationType/cellSizeCalculationType.C @@ -0,0 +1,97 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2012 OpenFOAM Foundation + \\/ M anipulation | +------------------------------------------------------------------------------- +License + This file is part of OpenFOAM. + + OpenFOAM is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + OpenFOAM is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>. + +\*---------------------------------------------------------------------------*/ + +#include "cellSizeCalculationType.H" +#include "addToRunTimeSelectionTable.H" +#include "triSurfaceMesh.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ + defineTypeNameAndDebug(cellSizeCalculationType, 0); + defineRunTimeSelectionTable(cellSizeCalculationType, dictionary); +} + +// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // + +Foam::cellSizeCalculationType::cellSizeCalculationType +( + const word& type, + const dictionary& cellSizeCalculationTypeDict, + const triSurfaceMesh& surface +) +: + cellSizeCalculationTypeDict_(cellSizeCalculationTypeDict) +{} + + +// * * * * * * * * * * * * * * * * * Selectors * * * * * * * * * * * * * * * // + +Foam::autoPtr<Foam::cellSizeCalculationType> Foam::cellSizeCalculationType::New +( + const dictionary& cellSizeCalculationTypeDict, + const triSurfaceMesh& surface +) +{ + word cellSizeCalculationTypeTypeName + ( + cellSizeCalculationTypeDict.lookup("cellSizeCalculationType") + ); + + Info<< " Selecting cellSizeCalculationType " + << cellSizeCalculationTypeTypeName << endl; + + dictionaryConstructorTable::iterator cstrIter = + dictionaryConstructorTablePtr_->find(cellSizeCalculationTypeTypeName); + + if (cstrIter == dictionaryConstructorTablePtr_->end()) + { + FatalErrorIn + ( + "cellSizeCalculationType::New(dictionary&, " + "const conformalVoronoiMesh&, const searchableSurface&)" + ) << "Unknown cellSizeCalculationType type " + << cellSizeCalculationTypeTypeName + << endl << endl + << "Valid cellSizeCalculationType types are :" << endl + << dictionaryConstructorTablePtr_->toc() + << exit(FatalError); + } + + return autoPtr<cellSizeCalculationType> + ( + cstrIter()(cellSizeCalculationTypeDict, surface) + ); +} + + +// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * // + +Foam::cellSizeCalculationType::~cellSizeCalculationType() +{} + + +// ************************************************************************* // diff --git a/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/cellSizeControlSurfaces/surfaceCellSizeFunction/cellSizeCalculationType/cellSizeCalculationType/cellSizeCalculationType.H b/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/cellSizeControlSurfaces/surfaceCellSizeFunction/cellSizeCalculationType/cellSizeCalculationType/cellSizeCalculationType.H new file mode 100644 index 0000000000000000000000000000000000000000..4d59f5c7189906a57d1a3d0fd429b86645647917 --- /dev/null +++ b/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/cellSizeControlSurfaces/surfaceCellSizeFunction/cellSizeCalculationType/cellSizeCalculationType/cellSizeCalculationType.H @@ -0,0 +1,134 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2012 OpenFOAM Foundation + \\/ M anipulation | +------------------------------------------------------------------------------- +License + This file is part of OpenFOAM. + + OpenFOAM is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + OpenFOAM is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>. + +Class + Foam::cellSizeCalculationType + +Description + Abstract base class for specifying target cell sizes + +SourceFiles + cellSizeCalculationType.C + +\*---------------------------------------------------------------------------*/ + +#ifndef cellSizeCalculationType_H +#define cellSizeCalculationType_H + +#include "searchableSurface.H" +#include "autoPtr.H" +#include "runTimeSelectionTables.H" +#include "triSurfaceFields.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ + +class triSurfaceMesh; + +/*---------------------------------------------------------------------------*\ + Class cellSizeCalculationType Declaration +\*---------------------------------------------------------------------------*/ + +class cellSizeCalculationType +{ + +protected: + + const dictionary& cellSizeCalculationTypeDict_; + + +private: + + // Private Member Functions + + //- Disallow default bitwise copy construct + cellSizeCalculationType(const cellSizeCalculationType&); + + //- Disallow default bitwise assignment + void operator=(const cellSizeCalculationType&); + + +public: + + //- Runtime type information + TypeName("cellSizeCalculationType"); + + + // Declare run-time constructor selection table + + declareRunTimeSelectionTable + ( + autoPtr, + cellSizeCalculationType, + dictionary, + ( + const dictionary& cellSizeCalculationTypeDict, + const triSurfaceMesh& surface + ), + (cellSizeCalculationTypeDict, surface) + ); + + + // Constructors + + //- Construct from components + cellSizeCalculationType + ( + const word& type, + const dictionary& cellSizeCalculationTypeDict, + const triSurfaceMesh& surface + ); + + + // Selectors + + //- Return a reference to the selected cellSizeCalculationType + static autoPtr<cellSizeCalculationType> New + ( + const dictionary& cellSizeCalculationTypeDict, + const triSurfaceMesh& surface + ); + + + //- Destructor + virtual ~cellSizeCalculationType(); + + + // Member Functions + + //- Load the cell size + virtual triSurfaceScalarField load() = 0; +}; + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace Foam + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#endif + +// ************************************************************************* // diff --git a/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/cellSizeControlSurfaces/surfaceCellSizeFunction/cellSizeCalculationType/fieldFromFile/fieldFromFile.C b/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/cellSizeControlSurfaces/surfaceCellSizeFunction/cellSizeCalculationType/fieldFromFile/fieldFromFile.C new file mode 100644 index 0000000000000000000000000000000000000000..788c1d69c6852f1c51e71143c59f5cb1b07f7303 --- /dev/null +++ b/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/cellSizeControlSurfaces/surfaceCellSizeFunction/cellSizeCalculationType/fieldFromFile/fieldFromFile.C @@ -0,0 +1,88 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2012 OpenFOAM Foundation + \\/ M anipulation | +------------------------------------------------------------------------------- +License + This file is part of OpenFOAM. + + OpenFOAM is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + OpenFOAM is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>. + +\*---------------------------------------------------------------------------*/ + +#include "fieldFromFile.H" +#include "addToRunTimeSelectionTable.H" +#include "triSurfaceMesh.H" +#include "triSurfaceFields.H" +#include "Time.H" + +// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * // + +namespace Foam +{ + defineTypeNameAndDebug(fieldFromFile, 0); + addToRunTimeSelectionTable + ( + cellSizeCalculationType, + fieldFromFile, + dictionary + ); +} + +// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // + +Foam::fieldFromFile::fieldFromFile +( + const dictionary& cellSizeCalcTypeDict, + const triSurfaceMesh& surface +) +: + cellSizeCalculationType(typeName, cellSizeCalcTypeDict, surface), + surface_(surface), + fileName_ + ( + cellSizeCalcTypeDict.subDict(typeName + "Coeffs").lookup("fieldFile") + ) +{} + + +// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // + +Foam::triSurfaceScalarField Foam::fieldFromFile::load() +{ + Info<< indent << "Loading: " << fileName_ << endl; + + triSurfaceScalarField surfaceCellSize + ( + IOobject + ( + fileName_, + surface_.searchableSurface::time().constant(), + "triSurface", + surface_.searchableSurface::time(), + IOobject::MUST_READ, + IOobject::NO_WRITE + ), + surface_, + dimLength, + true + ); + + return surfaceCellSize; +} + + +// ************************************************************************* // diff --git a/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/cellSizeControlSurfaces/surfaceCellSizeFunction/cellSizeCalculationType/fieldFromFile/fieldFromFile.H b/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/cellSizeControlSurfaces/surfaceCellSizeFunction/cellSizeCalculationType/fieldFromFile/fieldFromFile.H new file mode 100644 index 0000000000000000000000000000000000000000..ed99b5edd0f583d4aaa872b582ad1c1fc7ce5967 --- /dev/null +++ b/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/cellSizeControlSurfaces/surfaceCellSizeFunction/cellSizeCalculationType/fieldFromFile/fieldFromFile.H @@ -0,0 +1,105 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2012 OpenFOAM Foundation + \\/ M anipulation | +------------------------------------------------------------------------------- +License + This file is part of OpenFOAM. + + OpenFOAM is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + OpenFOAM is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>. + +Class + Foam::fieldFromFile + +Description + +SourceFiles + fieldFromFile.C + +\*---------------------------------------------------------------------------*/ + +#ifndef fieldFromFile_H +#define fieldFromFile_H + +#include "cellSizeCalculationType.H" +#include "triSurfaceFields.H" +#include "PrimitivePatchInterpolation.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ + +class triSurfaceMesh; + +/*---------------------------------------------------------------------------*\ + Class fieldFromFile Declaration +\*---------------------------------------------------------------------------*/ + +class fieldFromFile +: + public cellSizeCalculationType +{ + +private: + + // Private data + + //- Reference to the triSurfaceMesh + const triSurfaceMesh& surface_; + + //- Name of the triSurfaceScalarField file to load in. Must be in + // constant/triSurface + const word fileName_; + + +public: + + //- Runtime type information + TypeName("fieldFromFile"); + + + // Constructors + + //- Construct from components + fieldFromFile + ( + const dictionary& cellSizeCalcTypeDict, + const triSurfaceMesh& surface + ); + + + //- Destructor + virtual ~fieldFromFile() + {} + + + // Member Functions + + //- Load the cell size field + virtual triSurfaceScalarField load(); +}; + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace Foam + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#endif + +// ************************************************************************* // diff --git a/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/cellSizeControlSurfaces/surfaceCellSizeFunction/nonUniformField/nonUniformField.C b/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/cellSizeControlSurfaces/surfaceCellSizeFunction/nonUniformField/nonUniformField.C new file mode 100644 index 0000000000000000000000000000000000000000..fc91ed279b04a7979eface6cf063fec1ab5b36c4 --- /dev/null +++ b/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/cellSizeControlSurfaces/surfaceCellSizeFunction/nonUniformField/nonUniformField.C @@ -0,0 +1,167 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2012 OpenFOAM Foundation + \\/ M anipulation | +------------------------------------------------------------------------------- +License + This file is part of OpenFOAM. + + OpenFOAM is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + OpenFOAM is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>. + +\*---------------------------------------------------------------------------*/ + +#include "nonUniformField.H" +#include "triSurfaceMesh.H" +#include "searchableSurface.H" +#include "addToRunTimeSelectionTable.H" +#include "Time.H" + +// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * // + +namespace Foam +{ + defineTypeNameAndDebug(nonUniformField, 0); + addToRunTimeSelectionTable + ( + surfaceCellSizeFunction, + nonUniformField, + dictionary + ); +} + + +// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // + +Foam::nonUniformField::nonUniformField +( + const dictionary& cellSizeFunctionDict, + const searchableSurface& surface +) +: + surfaceCellSizeFunction(typeName, cellSizeFunctionDict, surface), + surfaceTriMesh_(refCast<const triSurfaceMesh>(surface)), + surfaceCellSize_ + ( + IOobject + ( + "surfaceCellSize.cellSize", + surface.time().constant(), + "triSurface", + surface.time(), + IOobject::NO_READ, + IOobject::NO_WRITE + ), + surfaceTriMesh_, + dimLength, + false + ), + cellSizeCalculationType_ + ( + cellSizeCalculationType::New(coeffsDict(), surfaceTriMesh_) + ), + pointCellSize_(), + patch_() +{ + Info<< incrIndent << incrIndent; + + surfaceCellSize_ = cellSizeCalculationType_().load(); + + Info<< decrIndent; + + Info<< indent << "Cell size field statistics:" << nl + << indent << " Minimum: " << min(surfaceCellSize_).value() << nl + << indent << " Average: " << average(surfaceCellSize_).value() << nl + << indent << " Maximum: " << max(surfaceCellSize_).value() << endl; + + Info<< decrIndent; +} + + +// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // + +const Foam::scalar& Foam::nonUniformField::surfaceSize(const label index) const +{ + return surfaceCellSize_[index]; +} + + +const Foam::scalar& Foam::nonUniformField::refineSurfaceSize(const label index) +{ + surfaceCellSize_[index] *= refinementFactor_; + + return surfaceCellSize_[index]; +} + + +Foam::scalar Foam::nonUniformField::interpolate +( + const point& pt, + const label index +) const +{ + if (patch_.empty()) + { + recalculateInterpolation(); + } + + const face& faceHitByPt = surfaceTriMesh_.triSurface::operator[](index); + + const pointField& pts = surfaceTriMesh_.points(); + const Map<label>& pMap = surfaceTriMesh_.meshPointMap(); + + triPointRef tri + ( + pts[faceHitByPt[0]], + pts[faceHitByPt[1]], + pts[faceHitByPt[2]] + ); + + scalarList bary(3, 0.0); + + tri.barycentric(pt, bary); + + return pointCellSize_()[pMap[faceHitByPt[0]]]*bary[0] + + pointCellSize_()[pMap[faceHitByPt[1]]]*bary[1] + + pointCellSize_()[pMap[faceHitByPt[2]]]*bary[2]; +} + + +void Foam::nonUniformField::recalculateInterpolation() const +{ + patch_.reset(new primitivePatchInterpolation(surfaceTriMesh_)); + + pointCellSize_.reset + ( + new triSurfacePointScalarField + ( + IOobject + ( + "pointCellSize.cellSize", + surfaceTriMesh_.searchableSurface::time().constant(), + "triSurface", + surfaceTriMesh_.searchableSurface::time(), + IOobject::NO_READ, + IOobject::NO_WRITE + ), + surfaceTriMesh_, + dimLength, + patch_().faceToPointInterpolate(surfaceCellSize_) + ) + ); +} + + +// ************************************************************************* // diff --git a/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/cellSizeControlSurfaces/surfaceCellSizeFunction/nonUniformField/nonUniformField.H b/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/cellSizeControlSurfaces/surfaceCellSizeFunction/nonUniformField/nonUniformField.H new file mode 100644 index 0000000000000000000000000000000000000000..039fd0fedbd8130d5ccbf6d1526419eebc3fed73 --- /dev/null +++ b/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/cellSizeControlSurfaces/surfaceCellSizeFunction/nonUniformField/nonUniformField.H @@ -0,0 +1,123 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2012 OpenFOAM Foundation + \\/ M anipulation | +------------------------------------------------------------------------------- +License + This file is part of OpenFOAM. + + OpenFOAM is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + OpenFOAM is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>. + +Class + Foam::nonUniformField + +Description + +SourceFiles + nonUniformField.C + +\*---------------------------------------------------------------------------*/ + +#ifndef nonUniformField_H +#define nonUniformField_H + +#include "triSurfaceFields.H" +#include "PrimitivePatchInterpolation.H" +#include "surfaceCellSizeFunction.H" +#include "cellSizeCalculationType.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ + +class triSurfaceMesh; +class searchableSurface; + +/*---------------------------------------------------------------------------*\ + Class nonUniformField Declaration +\*---------------------------------------------------------------------------*/ + +class nonUniformField +: + public surfaceCellSizeFunction +{ + +protected: + + // Private typedef + + typedef PrimitivePatchInterpolation + < + PrimitivePatch<labelledTri, List, pointField, point> + > primitivePatchInterpolation; + + + // Private data + + const triSurfaceMesh& surfaceTriMesh_; + + triSurfaceScalarField surfaceCellSize_; + + autoPtr<cellSizeCalculationType> cellSizeCalculationType_; + + mutable autoPtr<triSurfacePointScalarField> pointCellSize_; + + mutable autoPtr<primitivePatchInterpolation> patch_; + + +public: + + //- Runtime type information + TypeName("nonUniformField"); + + + // Constructors + + //- Construct from components + nonUniformField + ( + const dictionary& cellSizeFunctionDict, + const searchableSurface& surface + ); + + + //- Destructor + virtual ~nonUniformField() + {} + + + // Member Functions + + virtual const scalar& surfaceSize(const label index) const; + + virtual const scalar& refineSurfaceSize(const label index); + + virtual scalar interpolate(const point& pt, const label index) const; + + virtual void recalculateInterpolation() const; +}; + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace Foam + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#endif + +// ************************************************************************* // diff --git a/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/cellSizeControlSurfaces/surfaceCellSizeFunction/surfaceCellSizeFunction/surfaceCellSizeFunction.C b/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/cellSizeControlSurfaces/surfaceCellSizeFunction/surfaceCellSizeFunction/surfaceCellSizeFunction.C new file mode 100644 index 0000000000000000000000000000000000000000..04d9af824f0980840a2e1846f9144efb404b891f --- /dev/null +++ b/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/cellSizeControlSurfaces/surfaceCellSizeFunction/surfaceCellSizeFunction/surfaceCellSizeFunction.C @@ -0,0 +1,102 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2012 OpenFOAM Foundation + \\/ M anipulation | +------------------------------------------------------------------------------- +License + This file is part of OpenFOAM. + + OpenFOAM is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + OpenFOAM is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>. + +\*---------------------------------------------------------------------------*/ + +#include "surfaceCellSizeFunction.H" +#include "addToRunTimeSelectionTable.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ + defineTypeNameAndDebug(surfaceCellSizeFunction, 0); + defineRunTimeSelectionTable(surfaceCellSizeFunction, dictionary); +} + +// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // + +Foam::surfaceCellSizeFunction::surfaceCellSizeFunction +( + const word& type, + const dictionary& surfaceCellSizeFunctionDict, + const searchableSurface& surface +) +: + dictionary(surfaceCellSizeFunctionDict), + surface_(surface), + coeffsDict_(subDict(type + "Coeffs")), + refinementFactor_ + ( + lookupOrDefault<scalar>("refinementFactor", 1.0) + ) +{} + + +// * * * * * * * * * * * * * * * * * Selectors * * * * * * * * * * * * * * * // + +Foam::autoPtr<Foam::surfaceCellSizeFunction> Foam::surfaceCellSizeFunction::New +( + const dictionary& surfaceCellSizeFunctionDict, + const searchableSurface& surface +) +{ + word surfaceCellSizeFunctionTypeName + ( + surfaceCellSizeFunctionDict.lookup("surfaceCellSizeFunction") + ); + + Info<< " Selecting surfaceCellSizeFunction " + << surfaceCellSizeFunctionTypeName << endl; + + dictionaryConstructorTable::iterator cstrIter = + dictionaryConstructorTablePtr_->find(surfaceCellSizeFunctionTypeName); + + if (cstrIter == dictionaryConstructorTablePtr_->end()) + { + FatalErrorIn + ( + "surfaceCellSizeFunction::New(dictionary&, " + "const conformalVoronoiMesh&, const searchableSurface&)" + ) << "Unknown surfaceCellSizeFunction type " + << surfaceCellSizeFunctionTypeName + << endl << endl + << "Valid surfaceCellSizeFunction types are :" << endl + << dictionaryConstructorTablePtr_->toc() + << exit(FatalError); + } + + return autoPtr<surfaceCellSizeFunction> + ( + cstrIter()(surfaceCellSizeFunctionDict, surface) + ); +} + + +// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * // + +Foam::surfaceCellSizeFunction::~surfaceCellSizeFunction() +{} + + +// ************************************************************************* // diff --git a/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/cellSizeControlSurfaces/surfaceCellSizeFunction/surfaceCellSizeFunction/surfaceCellSizeFunction.H b/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/cellSizeControlSurfaces/surfaceCellSizeFunction/surfaceCellSizeFunction/surfaceCellSizeFunction.H new file mode 100644 index 0000000000000000000000000000000000000000..5c798c3be1176c6d2044d85b4299975eed0f0ecb --- /dev/null +++ b/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/cellSizeControlSurfaces/surfaceCellSizeFunction/surfaceCellSizeFunction/surfaceCellSizeFunction.H @@ -0,0 +1,159 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2012 OpenFOAM Foundation + \\/ M anipulation | +------------------------------------------------------------------------------- +License + This file is part of OpenFOAM. + + OpenFOAM is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + OpenFOAM is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>. + +Class + Foam::surfaceCellSizeFunction + +Description + Abstract base class for specifying target cell sizes + +SourceFiles + surfaceCellSizeFunction.C + +\*---------------------------------------------------------------------------*/ + +#ifndef surfaceCellSizeFunction_H +#define surfaceCellSizeFunction_H + +#include "searchableSurface.H" +#include "dictionary.H" +#include "autoPtr.H" +#include "runTimeSelectionTables.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ + +/*---------------------------------------------------------------------------*\ + Class surfaceCellSizeFunction Declaration +\*---------------------------------------------------------------------------*/ + +class surfaceCellSizeFunction +: + public dictionary +{ + +protected: + + // Protected data + + //- Reference to the searchableSurface that surfaceCellSizeFunction + // relates to + const searchableSurface& surface_; + + const dictionary coeffsDict_; + + //- If cell resizing is allowed, this is the factor of the old cell size + // to get the new cell size + scalar refinementFactor_; + + +private: + + // Private Member Functions + + //- Disallow default bitwise copy construct + surfaceCellSizeFunction(const surfaceCellSizeFunction&); + + //- Disallow default bitwise assignment + void operator=(const surfaceCellSizeFunction&); + + +public: + + //- Runtime type information + TypeName("surfaceCellSizeFunction"); + + + // Declare run-time constructor selection table + + declareRunTimeSelectionTable + ( + autoPtr, + surfaceCellSizeFunction, + dictionary, + ( + const dictionary& surfaceCellSizeFunctionDict, + const searchableSurface& surface + ), + (surfaceCellSizeFunctionDict, surface) + ); + + + // Constructors + + //- Construct from components + surfaceCellSizeFunction + ( + const word& type, + const dictionary& surfaceCellSizeFunctionDict, + const searchableSurface& surface + ); + + + // Selectors + + //- Return a reference to the selected surfaceCellSizeFunction + static autoPtr<surfaceCellSizeFunction> New + ( + const dictionary& surfaceCellSizeFunctionDict, + const searchableSurface& surface + ); + + + //- Destructor + virtual ~surfaceCellSizeFunction(); + + + // Member Functions + + //- Const access to the details dictionary + inline const dictionary& coeffsDict() const + { + return coeffsDict_; + } + + virtual const scalar& surfaceSize(const label index) const = 0; + + virtual const scalar& refineSurfaceSize(const label index) = 0; + + virtual scalar interpolate + ( + const point& pt, + const label index + ) const = 0; + + virtual void recalculateInterpolation() const = 0; +}; + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace Foam + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#endif + +// ************************************************************************* // diff --git a/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/cellSizeControlSurfaces/surfaceCellSizeFunction/uniformValue/uniformValue.C b/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/cellSizeControlSurfaces/surfaceCellSizeFunction/uniformValue/uniformValue.C new file mode 100644 index 0000000000000000000000000000000000000000..e68a5ab3cac8a03f5d4b64663437d6c0875d035a --- /dev/null +++ b/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/cellSizeControlSurfaces/surfaceCellSizeFunction/uniformValue/uniformValue.C @@ -0,0 +1,86 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2012 OpenFOAM Foundation + \\/ M anipulation | +------------------------------------------------------------------------------- +License + This file is part of OpenFOAM. + + OpenFOAM is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + OpenFOAM is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>. + +\*---------------------------------------------------------------------------*/ + +#include "uniformValue.H" +#include "addToRunTimeSelectionTable.H" + +// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * // + +namespace Foam +{ + defineTypeNameAndDebug(uniformValue, 0); + addToRunTimeSelectionTable + ( + surfaceCellSizeFunction, + uniformValue, + dictionary + ); +} + + +// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // + +Foam::uniformValue::uniformValue +( + const dictionary& cellSizeFunctionDict, + const searchableSurface& surface +) +: + surfaceCellSizeFunction(typeName, cellSizeFunctionDict, surface), + surfaceCellSize_(readScalar(coeffsDict().lookup("surfaceCellSize"))) +{} + + +// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // + +const Foam::scalar& Foam::uniformValue::surfaceSize(const label index) const +{ + return surfaceCellSize_; +} + + +const Foam::scalar& Foam::uniformValue::refineSurfaceSize(const label index) +{ + surfaceCellSize_ *= refinementFactor_; + + return surfaceCellSize_; +} + + +Foam::scalar Foam::uniformValue::interpolate +( + const point& pt, + const label index +) const +{ + return surfaceCellSize_; +} + + +void Foam::uniformValue::recalculateInterpolation() const +{} + + +// ************************************************************************* // diff --git a/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/cellSizeControlSurfaces/surfaceCellSizeFunction/uniformValue/uniformValue.H b/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/cellSizeControlSurfaces/surfaceCellSizeFunction/uniformValue/uniformValue.H new file mode 100644 index 0000000000000000000000000000000000000000..36778379332e25a5efa8d78adaee94409824442f --- /dev/null +++ b/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/cellSizeControlSurfaces/surfaceCellSizeFunction/uniformValue/uniformValue.H @@ -0,0 +1,105 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2012 OpenFOAM Foundation + \\/ M anipulation | +------------------------------------------------------------------------------- +License + This file is part of OpenFOAM. + + OpenFOAM is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + OpenFOAM is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>. + +Class + Foam::uniformValue + +Description + +SourceFiles + uniformValue.C + +\*---------------------------------------------------------------------------*/ + +#ifndef uniformValue_H +#define uniformValue_H + +#include "surfaceCellSizeFunction.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ + +/*---------------------------------------------------------------------------*\ + Class uniformValue Declaration +\*---------------------------------------------------------------------------*/ + +class uniformValue +: + public surfaceCellSizeFunction +{ + +private: + + // Private data + + scalar surfaceCellSize_; + + +public: + + //- Runtime type information + TypeName("uniformValue"); + + + // Constructors + + //- Construct from components + uniformValue + ( + const dictionary& cellSizeFunctionDict, + const searchableSurface& surface + ); + + + //- Destructor + virtual ~uniformValue() + {} + + + // Member Functions + + virtual const scalar& surfaceSize(const label index) const; + + virtual const scalar& refineSurfaceSize(const label index); + + virtual scalar interpolate + ( + const point& pt, + const label index + ) const; + + virtual void recalculateInterpolation() const; +}; + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace Foam + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#endif + +// ************************************************************************* // diff --git a/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/conformalVoronoiMesh/CGALTriangulation3DKernel.H b/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/conformalVoronoiMesh/CGALTriangulation3DKernel.H new file mode 100644 index 0000000000000000000000000000000000000000..e80b3fb8f4b428ee42d4f739c582e4d429aafe35 --- /dev/null +++ b/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/conformalVoronoiMesh/CGALTriangulation3DKernel.H @@ -0,0 +1,62 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2012 OpenFOAM Foundation + \\/ M anipulation | +------------------------------------------------------------------------------- +License + This file is part of OpenFOAM. + + OpenFOAM is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + OpenFOAM is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>. + +Typedefs + CGALTriangulation3DKernel + +Description + +\*---------------------------------------------------------------------------*/ + +#ifndef CGALTriangulation3DKernel_H +#define CGALTriangulation3DKernel_H + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#include "CGAL/Delaunay_triangulation_3.h" + +#ifdef CGAL_INEXACT + + // Fast kernel using a double as the storage type but the triangulation may + // fail. Adding robust circumcentre traits + #include "CGAL/Exact_predicates_inexact_constructions_kernel.h" + typedef CGAL::Exact_predicates_inexact_constructions_kernel baseK; +// #include <CGAL/Robust_circumcenter_traits_3.h> + #include <CGAL/Robust_circumcenter_filtered_traits_3.h> +// typedef CGAL::Robust_circumcenter_traits_3<baseK> K; + typedef CGAL::Robust_circumcenter_filtered_traits_3<baseK> K; + +#else + + // Very robust but expensive kernel + #include "CGAL/Exact_predicates_exact_constructions_kernel.h" + typedef CGAL::Exact_predicates_exact_constructions_kernel baseK; + typedef CGAL::Exact_predicates_exact_constructions_kernel K; + +#endif + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#endif + +// ************************************************************************* // diff --git a/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/conformalVoronoiMesh/CGALTriangulation3Ddefs.H b/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/conformalVoronoiMesh/CGALTriangulation3Ddefs.H new file mode 100644 index 0000000000000000000000000000000000000000..4e7dd48c38c76ffe152bf7d194881540ca0c2381 --- /dev/null +++ b/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/conformalVoronoiMesh/CGALTriangulation3Ddefs.H @@ -0,0 +1,60 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2012 OpenFOAM Foundation + \\/ M anipulation | +------------------------------------------------------------------------------- +License + This file is part of OpenFOAM. + + OpenFOAM is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + OpenFOAM is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>. + +Typedefs + CGALTriangulation3Ddefs + +Description + CGAL data structures used for 3D Delaunay meshing. + + Define CGAL_INEXACT to use Exact_predicates_inexact_constructions kernel + otherwise the more robust but much less efficient + Exact_predicates_exact_constructions will be used. + +\*---------------------------------------------------------------------------*/ + +#ifndef CGALTriangulation3Ddefs_H +#define CGALTriangulation3Ddefs_H + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#include "CGALTriangulation3DKernel.H" + +#include "indexedVertex.H" +#include "indexedCell.H" + +typedef CGAL::indexedVertex<K> Vb; +typedef CGAL::indexedCell<K> Cb; + +typedef CGAL::Compact_location CompactLocator; +typedef CGAL::Fast_location FastLocator; + +typedef CGAL::Triangulation_data_structure_3<Vb, Cb> Tds; +typedef CGAL::Delaunay_triangulation_3<K, Tds, CompactLocator> Delaunay; +typedef CGAL::Delaunay_triangulation_3<K, Tds, FastLocator> CellSizeDelaunay; + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#endif + +// ************************************************************************* // diff --git a/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/conformalVoronoiMesh/conformalVoronoiMesh.C b/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/conformalVoronoiMesh/conformalVoronoiMesh.C new file mode 100644 index 0000000000000000000000000000000000000000..ec6ca47901b5f55ced91f7a976b2e94360c2bd32 --- /dev/null +++ b/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/conformalVoronoiMesh/conformalVoronoiMesh.C @@ -0,0 +1,2224 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2012-2013 OpenFOAM Foundation + \\/ M anipulation | +------------------------------------------------------------------------------- +License + This file is part of OpenFOAM. + + OpenFOAM is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + OpenFOAM is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>. + +\*---------------------------------------------------------------------------*/ + +#include "conformalVoronoiMesh.H" +#include "initialPointsMethod.H" +#include "relaxationModel.H" +#include "faceAreaWeightModel.H" +#include "meshSearch.H" +#include "vectorTools.H" +#include "IOmanip.H" +#include "indexedCellChecks.H" + + +// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * // + +namespace Foam +{ + +defineTypeNameAndDebug(conformalVoronoiMesh, 0); + +} + +const Foam::scalar Foam::conformalVoronoiMesh::tolParallel = 1e-3; + + +// * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * * // + +void Foam::conformalVoronoiMesh::cellSizeMeshOverlapsBackground() const +{ + const cellShapeControlMesh& cellSizeMesh = + cellShapeControl_.shapeControlMesh(); + + DynamicList<Foam::point> pts(number_of_vertices()); + + for + ( + Delaunay::Finite_vertices_iterator vit = finite_vertices_begin(); + vit != finite_vertices_end(); + ++vit + ) + { + if (vit->internalOrBoundaryPoint()) + { + pts.append(topoint(vit->point())); + } + } + + boundBox bb(pts); + + boundBox cellSizeMeshBb = cellSizeMesh.bounds(); + + bool fullyContained = true; + + if (!cellSizeMeshBb.contains(bb)) + { + Pout<< "Triangulation not fully contained in cell size mesh." + << endl; + + Pout<< "Cell Size Mesh Bounds = " << cellSizeMesh.bounds() << endl; + Pout<< "cvMesh Bounds = " << bb << endl; + + fullyContained = false; + } + + reduce(fullyContained, andOp<unsigned int>()); + + Info<< "Triangulation is " + << (fullyContained ? "fully" : "not fully") + << " contained in the cell size mesh" + << endl; +} + + +Foam::scalar Foam::conformalVoronoiMesh::requiredSize +( + const Foam::point& pt +) const +{ + pointIndexHit surfHit; + label hitSurface; + + DynamicList<scalar> cellSizeHits; + + geometryToConformTo_.findSurfaceNearest + ( + pt, + sqr(GREAT), + surfHit, + hitSurface + ); + + if (!surfHit.hit()) + { + FatalErrorIn + ( + "Foam::tensor Foam::conformalVoronoiMesh::requiredAlignment" + ) + << "findSurfaceNearest did not find a hit across the surfaces." + << exit(FatalError) << endl; + } + + cellSizeHits.append(cellShapeControls().cellSize(pt)); + + // Primary alignment + + vectorField norm(1); + + allGeometry_[hitSurface].getNormal + ( + List<pointIndexHit>(1, surfHit), + norm + ); + + const vector np = norm[0]; + + // Generate equally spaced 'spokes' in a circle normal to the + // direction from the vertex to the closest point on the surface + // and look for a secondary intersection. + + const vector d = surfHit.hitPoint() - pt; + + const tensor Rp = rotationTensor(vector(0,0,1), np); + + const label s = cvMeshControls().alignmentSearchSpokes(); + + const scalar spanMag = geometryToConformTo_.globalBounds().mag(); + + scalar totalDist = 0; + + for (label i = 0; i < s; i++) + { + vector spoke + ( + Foam::cos(i*constant::mathematical::twoPi/s), + Foam::sin(i*constant::mathematical::twoPi/s), + 0 + ); + + spoke *= spanMag; + + spoke = Rp & spoke; + + pointIndexHit spokeHit; + + label spokeSurface = -1; + + // internal spoke + + geometryToConformTo_.findSurfaceNearestIntersection + ( + pt, + pt + spoke, + spokeHit, + spokeSurface + ); + + if (spokeHit.hit()) + { + const Foam::point& hitPt = spokeHit.hitPoint(); + + scalar spokeHitDistance = mag(hitPt - pt); + + cellSizeHits.append + ( + cellShapeControls().cellSize(hitPt) + ); + + totalDist += spokeHitDistance; + } + + //external spoke + + Foam::point mirrorPt = pt + 2*d; + + geometryToConformTo_.findSurfaceNearestIntersection + ( + mirrorPt, + mirrorPt + spoke, + spokeHit, + spokeSurface + ); + + if (spokeHit.hit()) + { + const Foam::point& hitPt = spokeHit.hitPoint(); + + scalar spokeHitDistance = mag(hitPt - mirrorPt); + + cellSizeHits.append + ( + cellShapeControls().cellSize(hitPt) + ); + + totalDist += spokeHitDistance; + } + } + + scalar cellSize = 0; + + forAll(cellSizeHits, hitI) + { + cellSize += cellSizeHits[hitI]; + } + + return cellSize/cellSizeHits.size(); + //return cellShapeControls().cellSize(pt); +} + + +Foam::tensor Foam::conformalVoronoiMesh::requiredAlignment +( + const Foam::point& pt +) const +{ + pointIndexHit surfHit; + label hitSurface; + + geometryToConformTo_.findSurfaceNearest + ( + pt, + sqr(GREAT), + surfHit, + hitSurface + ); + + if (!surfHit.hit()) + { + FatalErrorIn + ( + "Foam::tensor Foam::conformalVoronoiMesh::requiredAlignment" + ) + << "findSurfaceNearest did not find a hit across the surfaces." + << exit(FatalError) << endl; + } + + // Primary alignment + + vectorField norm(1); + + allGeometry_[hitSurface].getNormal + ( + List<pointIndexHit>(1, surfHit), + norm + ); + + const vector np = norm[0]; + + // Generate equally spaced 'spokes' in a circle normal to the + // direction from the vertex to the closest point on the surface + // and look for a secondary intersection. + + const vector d = surfHit.hitPoint() - pt; + + const tensor Rp = rotationTensor(vector(0,0,1), np); + + const label s = cvMeshControls().alignmentSearchSpokes(); + + scalar closestSpokeHitDistance = GREAT; + + pointIndexHit closestSpokeHit; + + label closestSpokeSurface = -1; + + const scalar spanMag = geometryToConformTo_.globalBounds().mag(); + + for (label i = 0; i < s; i++) + { + vector spoke + ( + Foam::cos(i*constant::mathematical::twoPi/s), + Foam::sin(i*constant::mathematical::twoPi/s), + 0 + ); + + spoke *= spanMag; + + spoke = Rp & spoke; + + pointIndexHit spokeHit; + + label spokeSurface = -1; + + // internal spoke + + geometryToConformTo_.findSurfaceNearestIntersection + ( + pt, + pt + spoke, + spokeHit, + spokeSurface + ); + + if (spokeHit.hit()) + { + scalar spokeHitDistance = mag + ( + spokeHit.hitPoint() - pt + ); + + if (spokeHitDistance < closestSpokeHitDistance) + { + closestSpokeHit = spokeHit; + closestSpokeSurface = spokeSurface; + closestSpokeHitDistance = spokeHitDistance; + } + } + + //external spoke + + Foam::point mirrorPt = pt + 2*d; + + geometryToConformTo_.findSurfaceNearestIntersection + ( + mirrorPt, + mirrorPt + spoke, + spokeHit, + spokeSurface + ); + + if (spokeHit.hit()) + { + scalar spokeHitDistance = mag + ( + spokeHit.hitPoint() - mirrorPt + ); + + if (spokeHitDistance < closestSpokeHitDistance) + { + closestSpokeHit = spokeHit; + closestSpokeSurface = spokeSurface; + closestSpokeHitDistance = spokeHitDistance; + } + } + } + + if (closestSpokeSurface == -1) + { + WarningIn + ( + "conformalVoronoiMesh::requiredAlignment" + "(" + "const Foam::point& pt" + ") const" + ) << "No secondary surface hit found in spoke search " + << "using " << s + << " spokes, try increasing alignmentSearchSpokes." + << endl; + + return I; + } + + // Auxiliary alignment generated by spoke intersection normal. + + allGeometry_[closestSpokeSurface].getNormal + ( + List<pointIndexHit>(1, closestSpokeHit), + norm + ); + + const vector& na = norm[0]; + + // Secondary alignment + vector ns = np ^ na; + + if (mag(ns) < SMALL) + { + FatalErrorIn("conformalVoronoiMesh::requiredAlignment") + << "Parallel normals detected in spoke search." << nl + << "point: " << pt << nl + << "closest surface point: " << surfHit.hitPoint() << nl + << "closest spoke hit: " << closestSpokeHit.hitPoint() << nl + << "np: " << surfHit.hitPoint() + np << nl + << "ns: " << closestSpokeHit.hitPoint() + na << nl + << exit(FatalError); + } + + ns /= mag(ns); + + tensor Rs = rotationTensor((Rp & vector(0,1,0)), ns); + + return (Rs & Rp); +} + + +void Foam::conformalVoronoiMesh::insertInternalPoints +( + List<Point>& points, + bool distribute +) +{ + label nPoints = points.size(); + + if (Pstream::parRun()) + { + reduce(nPoints, sumOp<label>()); + } + + Info<< " " << nPoints << " points to insert..." << endl; + + if (Pstream::parRun() && distribute) + { + List<Foam::point> transferPoints(points.size()); + + forAll(points, pI) + { + transferPoints[pI] = topoint(points[pI]); + } + + // Send the points that are not on this processor to the appropriate + // place + Foam::autoPtr<Foam::mapDistribute> map + ( + decomposition_().distributePoints(transferPoints) + ); + + map().distribute(points); + } + + label nVert = number_of_vertices(); + + // using the range insert (faster than inserting points one by one) + insert(points.begin(), points.end()); + + label nInserted(number_of_vertices() - nVert); + + if (Pstream::parRun()) + { + reduce(nInserted, sumOp<label>()); + } + + Info<< " " << nInserted << " points inserted" + << ", failed to insert " << nPoints - nInserted + << " (" + << 100.0*(nPoints - nInserted)/nInserted + << " %)"<< endl; + + for + ( + Delaunay::Finite_vertices_iterator vit = finite_vertices_begin(); + vit != finite_vertices_end(); + ++vit + ) + { + if (vit->uninitialised()) + { + vit->index() = getNewVertexIndex(); + vit->type() = Vb::vtInternal; + } + } +} + + +void Foam::conformalVoronoiMesh::insertPoints +( + List<Vb>& vertices, + bool distribute +) +{ + if (Pstream::parRun() && distribute) + { + const label preDistributionSize = vertices.size(); + + List<Foam::point> pts(preDistributionSize); + + forAll(vertices, vI) + { + const Foam::point& pt = topoint(vertices[vI].point()); + + pts[vI] = pt; + } + + // Distribute points to their appropriate processor + autoPtr<mapDistribute> map + ( + decomposition_().distributePoints(pts) + ); + + map().distribute(vertices); + + forAll(vertices, vI) + { + vertices[vI].procIndex() = Pstream::myProcNo(); + } + } + + rangeInsertWithInfo + ( + vertices.begin(), + vertices.end(), + true + ); +} + + +void Foam::conformalVoronoiMesh::insertSurfacePointPairs +( + const pointIndexHitAndFeatureList& surfaceHits, + const fileName fName +) +{ + DynamicList<Vb> pts(2.0*surfaceHits.size()); + + forAll(surfaceHits, i) + { + vectorField norm(1); + + const pointIndexHit surfaceHit = surfaceHits[i].first(); + const label featureIndex = surfaceHits[i].second(); + + allGeometry_[featureIndex].getNormal + ( + List<pointIndexHit>(1, surfaceHit), + norm + ); + + const vector& normal = norm[0]; + + const Foam::point& surfacePt(surfaceHit.hitPoint()); + + if (geometryToConformTo_.isBaffle(featureIndex)) + { + createBafflePointPair + ( + pointPairDistance(surfacePt), + surfacePt, + normal, + pts + ); + } + else + { + createPointPair + ( + pointPairDistance(surfacePt), + surfacePt, + normal, + pts + ); + } + } + + insertPoints(pts, true); + + if (cvMeshControls().objOutput() && fName != fileName::null) + { + writePoints(fName, pts); + } +} + + +void Foam::conformalVoronoiMesh::insertEdgePointGroups +( + const pointIndexHitAndFeatureList& edgeHits, + const fileName fName +) +{ + DynamicList<Vb> pts(3.0*edgeHits.size()); + + forAll(edgeHits, i) + { + const extendedFeatureEdgeMesh& feMesh + ( + geometryToConformTo_.features()[edgeHits[i].second()] + ); + + createEdgePointGroup(feMesh, edgeHits[i].first(), pts); + } + + pts.shrink(); + + insertPoints(pts, true); + + if (cvMeshControls().objOutput() && fName != fileName::null) + { + writePoints(fName, pts); + } +} + + +bool Foam::conformalVoronoiMesh::nearFeaturePt(const Foam::point& pt) const +{ + scalar exclusionRangeSqr = featurePointExclusionDistanceSqr(pt); + + pointIndexHit info; + label featureHit; + + geometryToConformTo_.findFeaturePointNearest + ( + pt, + exclusionRangeSqr, + info, + featureHit + ); + + return info.hit(); +} + + +void Foam::conformalVoronoiMesh::insertInitialPoints() +{ + Info<< nl << "Inserting initial points" << endl; + + timeCheck("Before initial points call"); + + List<Point> initPts = initialPointsMethod_->initialPoints(); + + timeCheck("After initial points call"); + + // Assume that the initial points method made the correct decision for + // which processor each point should be on, so give distribute = false + insertInternalPoints(initPts); +} + + +Foam::scalar Foam::conformalVoronoiMesh::calculateLoadUnbalance() const +{ + label nRealVertices = 0; + + for + ( + Delaunay::Finite_vertices_iterator vit = finite_vertices_begin(); + vit != finite_vertices_end(); + ++vit + ) + { + // Only store real vertices that are not feature vertices + if (vit->real() && !vit->featurePoint()) + { + nRealVertices++; + } + } + + scalar globalNRealVertices = returnReduce + ( + nRealVertices, + sumOp<label>() + ); + + scalar unbalance = returnReduce + ( + mag(1.0 - nRealVertices/(globalNRealVertices/Pstream::nProcs())), + maxOp<scalar>() + ); + + Info<< " Processor unbalance " << unbalance << endl; + + return unbalance; +} + + +bool Foam::conformalVoronoiMesh::distributeBackground() +{ + if (!Pstream::parRun()) + { + return false; + } + + Info<< nl << "Redistributing points" << endl; + + timeCheck("Before distribute"); + + label iteration = 0; + + scalar previousLoadUnbalance = 0; + + while (true) + { + scalar maxLoadUnbalance = calculateLoadUnbalance(); + + if + ( + maxLoadUnbalance <= cvMeshControls().maxLoadUnbalance() + || maxLoadUnbalance <= previousLoadUnbalance + ) + { + // If this is the first iteration, return false, if it was a + // subsequent one, return true; + return iteration != 0; + } + + previousLoadUnbalance = maxLoadUnbalance; + + Info<< " Total number of vertices before redistribution " + << returnReduce(label(number_of_vertices()), sumOp<label>()) + << endl; + + const fvMesh& bMesh = decomposition_().mesh(); + + volScalarField cellWeights + ( + IOobject + ( + "cellWeights", + bMesh.time().timeName(), + bMesh, + IOobject::NO_READ, + IOobject::NO_WRITE + ), + bMesh, + dimensionedScalar("weight", dimless, 1e-2), + zeroGradientFvPatchScalarField::typeName + ); + + meshSearch cellSearch(bMesh, polyMesh::FACEPLANES); + + labelList cellVertices(bMesh.nCells(), 0); + + for + ( + Delaunay::Finite_vertices_iterator vit = finite_vertices_begin(); + vit != finite_vertices_end(); + ++vit + ) + { + // Only store real vertices that are not feature vertices + if (vit->real() && !vit->featurePoint()) + { + pointFromPoint v = topoint(vit->point()); + + label cellI = cellSearch.findCell(v); + + if (cellI == -1) + { +// Pout<< "findCell conformalVoronoiMesh::distribute " +// << "findCell " +// << vit->type() << " " +// << vit->index() << " " +// << v << " " +// << cellI +// << " find nearest cellI "; + + cellI = cellSearch.findNearestCell(v); + } + + cellVertices[cellI]++; + } + } + + forAll(cellVertices, cI) + { + // Give a small but finite weight for empty cells. Some + // decomposition methods have difficulty with integer overflows in + // the sum of the normalised weight field. + cellWeights.internalField()[cI] = max + ( + cellVertices[cI], + 1e-2 + ); + } + + autoPtr<mapDistributePolyMesh> mapDist = decomposition_().distribute + ( + cellWeights + ); + + cellShapeControl_.shapeControlMesh().distribute(decomposition_); + + distribute(); + + timeCheck("After distribute"); + + iteration++; + } + + return true; +} + + +void Foam::conformalVoronoiMesh::distribute() +{ + if (!Pstream::parRun()) + { + return ; + } + + autoPtr<mapDistribute> mapDist = + DistributedDelaunayMesh<Delaunay>::distribute(decomposition_()); + + DynamicList<Foam::point> points(number_of_vertices()); + DynamicList<Foam::indexedVertexEnum::vertexType> types + ( + number_of_vertices() + ); + DynamicList<scalar> sizes(number_of_vertices()); + DynamicList<tensor> alignments(number_of_vertices()); + + for + ( + Finite_vertices_iterator vit = finite_vertices_begin(); + vit != finite_vertices_end(); + ++vit + ) + { + if (vit->real()) + { + points.append(topoint(vit->point())); + types.append(vit->type()); + sizes.append(vit->targetCellSize()); + alignments.append(vit->alignment()); + } + } + + mapDist().distribute(points); + mapDist().distribute(types); + mapDist().distribute(sizes); + mapDist().distribute(alignments); + + // Reset the entire tessellation + DelaunayMesh<Delaunay>::reset(); + + Info<< nl << " Inserting distributed tessellation" << endl; + + // Internal points have to be inserted first + + DynamicList<Vb> verticesToInsert(points.size()); + + forAll(points, pI) + { + verticesToInsert.append + ( + Vb + ( + toPoint<Point>(points[pI]), + -1, + types[pI], + Pstream::myProcNo() + ) + ); + + verticesToInsert.last().targetCellSize() = sizes[pI]; + verticesToInsert.last().alignment() = alignments[pI]; + } + + this->rangeInsertWithInfo + ( + verticesToInsert.begin(), + verticesToInsert.end(), + true + ); + + Info<< " Total number of vertices after redistribution " + << returnReduce + ( + label(number_of_vertices()), sumOp<label>() + ) + << endl; +} + + +void Foam::conformalVoronoiMesh::buildCellSizeAndAlignmentMesh() +{ + cellShapeControl_.initialMeshPopulation(decomposition_); + + cellShapeControlMesh& cellSizeMesh = cellShapeControl_.shapeControlMesh(); + + if (Pstream::parRun()) + { + cellSizeMesh.distribute(decomposition_); + } + + label nMaxIter = readLabel + ( + cvMeshControls().cvMeshDict().subDict("motionControl").lookup + ( + "maxRefinementIterations" + ) + ); + + Info<< "Maximum number of refinement iterations : " << nMaxIter << endl; + + for (label i = 0; i < nMaxIter; ++i) + { +// label nRemoved = cellSizeMesh.removePoints(); + label nRemoved = 0; + reduce(nRemoved, sumOp<label>()); + + label nAdded = cellShapeControl_.refineMesh(decomposition_); +// label nAdded = 0; + reduce(nAdded, sumOp<label>()); + + if (Pstream::parRun()) + { + cellSizeMesh.distribute(decomposition_); + } + + if (nRemoved + nAdded == 0) + { + break; + } + + Info<< " Iteration " << i + << " Added = " << nAdded << " points" + << ", Removed = " << nRemoved << " points" + << endl; + } + + cellShapeControl_.smoothMesh(); + + Info<< "Background cell size and alignment mesh:" << endl; + cellSizeMesh.printInfo(Info); + + if (cvMeshControls().objOutput()) + { + cellSizeMesh.writeTriangulation(); + cellSizeMesh.write(); + } +} + + +void Foam::conformalVoronoiMesh::storeSizesAndAlignments() +{ + DynamicList<Point> storePts(number_of_vertices()); + + for + ( + Delaunay::Finite_vertices_iterator vit = finite_vertices_begin(); + vit != finite_vertices_end(); + vit++ + ) + { + if (vit->internalPoint()) + { + storePts.append(vit->point()); + } + } + + storePts.shrink(); + + storeSizesAndAlignments(storePts); +} + + +void Foam::conformalVoronoiMesh::storeSizesAndAlignments +( + const List<Point>& storePts +) +{ +// timeCheck("Start of storeSizesAndAlignments"); +// +// Info << nl << "Store size and alignment" << endl; +// +// sizeAndAlignmentLocations_.setSize(storePts.size()); +// +// storedSizes_.setSize(sizeAndAlignmentLocations_.size()); +// +// storedAlignments_.setSize(sizeAndAlignmentLocations_.size()); +// +// label i = 0; +// +// //checkCellSizing(); +// +// for +// ( +// List<Point>::const_iterator pit = storePts.begin(); +// pit != storePts.end(); +// ++pit +// ) +// { +// pointFromPoint pt = topoint(*pit); +// +//// storedAlignments_[i] = requiredAlignment(pt); +//// +//// storedSizes_[i] = cellShapeControls().cellSize(pt); +// +// cellShapeControls().cellSizeAndAlignment +// ( +// pt, +// storedSizes_[i], +// storedAlignments_[i] +// ); +// +// i++; +// } +// +// timeCheck("Sizes and alignments calculated, build tree"); +// +// buildSizeAndAlignmentTree(); +// +// timeCheck("Size and alignment tree built"); +} + + +void Foam::conformalVoronoiMesh::updateSizesAndAlignments +( + const List<Point>& storePts +) +{ + // This function is only used in serial, the background redistribution + // triggers this when unbalance is detected in parallel. + + if + ( + !Pstream::parRun() + && runTime_.run() + && runTime_.timeIndex() + % cvMeshControls().sizeAndAlignmentRebuildFrequency() == 0 + ) + { + storeSizesAndAlignments(storePts); + + timeCheck("Updated sizes and alignments"); + } +} + + +const Foam::indexedOctree<Foam::treeDataPoint>& +Foam::conformalVoronoiMesh::sizeAndAlignmentTree() const +{ + if (sizeAndAlignmentTreePtr_.empty()) + { + buildSizeAndAlignmentTree(); + } + + return sizeAndAlignmentTreePtr_(); +} + + +void Foam::conformalVoronoiMesh::setVertexSizeAndAlignment() +{ +// Info<< nl << "Looking up target cell alignment and size" << endl; +// +// const indexedOctree<treeDataPoint>& tree = sizeAndAlignmentTree(); +// +// for +// ( +// Delaunay::Finite_vertices_iterator vit = finite_vertices_begin(); +// vit != finite_vertices_end(); +// vit++ +// ) +// { +// if +// ( +// vit->internalOrBoundaryPoint() +// || vit->referredInternalOrBoundaryPoint() +// ) +// { +// pointFromPoint pt = topoint(vit->point()); +// +// pointIndexHit info = tree.findNearest(pt, sqr(GREAT)); +// +// if (info.hit()) +// { +// vit->alignment() = storedAlignments_[info.index()]; +// +// vit->targetCellSize() = storedSizes_[info.index()]; +// } +// else +// { +// WarningIn +// ( +// "void " +// "Foam::conformalVoronoiMesh::setVertexSizeAndAlignment()" +// ) +// << "Point " << pt << " did not find a nearest point " +// << " for alignment and size lookup." << endl; +// +// vit->alignment() = cellShapeControls().cellAlignment(pt); +// +// vit->targetCellSize() = cellShapeControls().cellSize(pt); +// } +// } +// } + + Info<< nl << "Calculating target cell alignment and size" << endl; + + for + ( + Delaunay::Finite_vertices_iterator vit = finite_vertices_begin(); + vit != finite_vertices_end(); + vit++ + ) + { + if (vit->internalOrBoundaryPoint()) + { + pointFromPoint pt = topoint(vit->point()); + + cellShapeControls().cellSizeAndAlignment + ( + pt, + vit->targetCellSize(), + vit->alignment() + ); + + //vit->alignment() = tensor(1,0,0,0,1,0,0,0,1); + //vit->alignment() = requiredAlignment(pt); + + //vit->targetCellSize() = cellShapeControls().cellSize(pt); + } + } +} + + +Foam::face Foam::conformalVoronoiMesh::buildDualFace +( + const Delaunay::Finite_edges_iterator& eit +) const +{ + Cell_circulator ccStart = incident_cells(*eit); + Cell_circulator cc1 = ccStart; + Cell_circulator cc2 = cc1; + + // Advance the second circulator so that it always stays on the next + // cell around the edge; + cc2++; + + DynamicList<label> verticesOnFace; + + label nUniqueVertices = 0; + + do + { + if + ( + cc1->hasFarPoint() || cc2->hasFarPoint() + || is_infinite(cc1) || is_infinite(cc2) + ) + { + Cell_handle c = eit->first; + Vertex_handle vA = c->vertex(eit->second); + Vertex_handle vB = c->vertex(eit->third); + + drawDelaunayCell(Pout, cc1); + drawDelaunayCell(Pout, cc2); + + FatalErrorIn("Foam::conformalVoronoiMesh::buildDualFace") + << "Dual face uses circumcenter defined by a " + << "Delaunay tetrahedron with no internal " + << "or boundary points. Defining Delaunay edge ends: " + << topoint(vA->point()) << " " + << topoint(vB->point()) << nl + << exit(FatalError); + } + + label cc1I = cc1->cellIndex(); + + label cc2I = cc2->cellIndex(); + + if (cc1I != cc2I) + { + if (findIndex(verticesOnFace, cc1I) == -1) + { + nUniqueVertices++; + } + + verticesOnFace.append(cc1I); + } + + cc1++; + + cc2++; + + } while (cc1 != ccStart); + + verticesOnFace.shrink(); + + if (verticesOnFace.size() >= 3 && nUniqueVertices < 3) + { + // There are not enough unique vertices on this face to + // justify its size, it may have a form like: + + // Vertices: + // A B + // A B + + // Face: + // ABAB + + // Setting the size to be below 3, so that it will not be + // created + + verticesOnFace.setSize(nUniqueVertices); + } + + return face(verticesOnFace); +} + + +Foam::label Foam::conformalVoronoiMesh::maxFilterCount +( + const Delaunay::Finite_edges_iterator& eit +) const +{ + Cell_circulator ccStart = incident_cells(*eit); + Cell_circulator cc = ccStart; + + label maxFC = 0; + + do + { + if (cc->hasFarPoint()) + { + Cell_handle c = eit->first; + Vertex_handle vA = c->vertex(eit->second); + Vertex_handle vB = c->vertex(eit->third); + + FatalErrorIn("Foam::conformalVoronoiMesh::buildDualFace") + << "Dual face uses circumcenter defined by a " + << "Delaunay tetrahedron with no internal " + << "or boundary points. Defining Delaunay edge ends: " + << topoint(vA->point()) << " " + << topoint(vB->point()) << nl + << exit(FatalError); + } + + if (cc->filterCount() > maxFC) + { + maxFC = cc->filterCount(); + } + + cc++; + + } while (cc != ccStart); + + return maxFC; +} + + +bool Foam::conformalVoronoiMesh::ownerAndNeighbour +( + Vertex_handle vA, + Vertex_handle vB, + label& owner, + label& neighbour +) const +{ + bool reverse = false; + + owner = -1; + neighbour = -1; + + label dualCellIndexA = vA->index(); + + if (!vA->internalOrBoundaryPoint() || vA->referred()) + { + dualCellIndexA = -1; + } + + label dualCellIndexB = vB->index(); + + if (!vB->internalOrBoundaryPoint() || vB->referred()) + { + dualCellIndexB = -1; + } + + if (dualCellIndexA == -1 && dualCellIndexB == -1) + { + FatalErrorIn + ( + "bool Foam::conformalVoronoiMesh::ownerAndNeighbour" + "(" + "Vertex_handle vA," + "Vertex_handle vB," + "label& owner," + "label& neighbour" + ") const" + ) + << "Attempting to create a face joining " + << "two unindexed dual cells " + << exit(FatalError); + } + else if (dualCellIndexA == -1 || dualCellIndexB == -1) + { + // boundary face, find which is the owner + + if (dualCellIndexA == -1) + { + owner = dualCellIndexB; + + reverse = true; + } + else + { + owner = dualCellIndexA; + } + } + else + { + // internal face, find the lower cell to be the owner + + if (dualCellIndexB > dualCellIndexA) + { + owner = dualCellIndexA; + neighbour = dualCellIndexB; + } + else + { + owner = dualCellIndexB; + neighbour = dualCellIndexA; + + // reverse face order to correctly orientate normal + reverse = true; + } + } + + return reverse; +} + + +// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // + +Foam::conformalVoronoiMesh::conformalVoronoiMesh +( + const Time& runTime, + const dictionary& cvMeshDict +) +: + DistributedDelaunayMesh<Delaunay>(), + runTime_(runTime), + rndGen_(64293*Pstream::myProcNo()), + cvMeshControls_(cvMeshDict), + allGeometry_ + ( + IOobject + ( + "cvSearchableSurfaces", + runTime_.constant(), + "triSurface", + runTime_, + IOobject::MUST_READ, + IOobject::NO_WRITE + ), + cvMeshDict.subDict("geometry") + ), + geometryToConformTo_ + ( + runTime_, + rndGen_, + allGeometry_, + cvMeshDict.subDict("surfaceConformation") + ), + cellShapeControl_ + ( + runTime_, + cvMeshDict.subDict("motionControl"), + allGeometry_, + geometryToConformTo_ + ), + limitBounds_(), + featureVertices_(), + featurePointLocations_(), + edgeLocationTreePtr_(), + surfacePtLocationTreePtr_(), + sizeAndAlignmentLocations_(), + storedSizes_(), + storedAlignments_(), + sizeAndAlignmentTreePtr_(), + surfaceConformationVertices_(), + initialPointsMethod_ + ( + initialPointsMethod::New + ( + cvMeshDict.subDict("initialPoints"), + *this + ) + ), + relaxationModel_ + ( + relaxationModel::New + ( + cvMeshDict.subDict("motionControl"), + runTime_ + ) + ), + faceAreaWeightModel_ + ( + faceAreaWeightModel::New + ( + cvMeshDict.subDict("motionControl") + ) + ), + decomposition_() +{ + if (cvMeshControls().objOutput()) + { + geometryToConformTo_.writeFeatureObj("cvMesh"); + } + + if (Pstream::parRun()) + { + decomposition_.reset + ( + new backgroundMeshDecomposition + ( + runTime_, + rndGen_, + geometryToConformTo_, + cvMeshDict.subDict("backgroundMeshDecomposition") + ) + ); + } + + buildCellSizeAndAlignmentMesh(); + + insertInitialPoints(); + + insertFeaturePoints(); + + setVertexSizeAndAlignment(); + + cellSizeMeshOverlapsBackground(); + + // Improve the guess that the backgroundMeshDecomposition makes with the + // initial positions. Use before building the surface conformation to + // better balance the surface conformation load. + distributeBackground(); + + buildSurfaceConformation(); + + // The introduction of the surface conformation may have distorted the + // balance of vertices, distribute if necessary. + distributeBackground(); + + if (Pstream::parRun()) + { + sync(decomposition_().procBounds()); + } + + // Do not store the surface conformation until after it has been + // (potentially) redistributed. + storeSurfaceConformation(); + + // Use storeSizesAndAlignments with no feed points because all background + // points may have been distributed. + storeSizesAndAlignments(); + + // Report any Delaunay vertices that do not think that they are in the + // domain the processor they are on. + // reportProcessorOccupancy(); + + cellSizeMeshOverlapsBackground(); + + printVertexInfo(); + + if (cvMeshControls().objOutput()) + { + writePoints + ( + "internalPoints_" + runTime_.timeName() + ".obj", + Foam::indexedVertexEnum::vtUnassigned, + Foam::indexedVertexEnum::vtExternalFeaturePoint + ); + } +} + + +// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * // + +Foam::conformalVoronoiMesh::~conformalVoronoiMesh() +{} + + +// * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * * // + +void Foam::conformalVoronoiMesh::move() +{ + timeCheck("Start of move"); + + scalar relaxation = relaxationModel_->relaxation(); + + Info<< nl << "Relaxation = " << relaxation << endl; + + pointField dualVertices(number_of_finite_cells()); + + this->resetCellCount(); + + // Find the dual point of each tetrahedron and assign it an index. + for + ( + Delaunay::Finite_cells_iterator cit = finite_cells_begin(); + cit != finite_cells_end(); + ++cit + ) + { + cit->cellIndex() = Cb::ctUnassigned; + + if (cit->anyInternalOrBoundaryDualVertex()) + { + cit->cellIndex() = getNewCellIndex(); + + dualVertices[cit->cellIndex()] = cit->dual(); + } + + if (cit->hasFarPoint()) + { + cit->cellIndex() = Cb::ctFar; + } + } + + dualVertices.setSize(cellCount()); + + setVertexSizeAndAlignment(); + + timeCheck("Determined sizes and alignments"); + + Info<< nl << "Determining vertex displacements" << endl; + + vectorField cartesianDirections(3); + + cartesianDirections[0] = vector(1, 0, 0); + cartesianDirections[1] = vector(0, 1, 0); + cartesianDirections[2] = vector(0, 0, 1); + + vectorField displacementAccumulator + ( + number_of_vertices(), + vector::zero + ); + + PackedBoolList pointToBeRetained + ( + number_of_vertices(), + true + ); + + DynamicList<Point> pointsToInsert(number_of_vertices()); + + for + ( + Delaunay::Finite_edges_iterator eit = finite_edges_begin(); + eit != finite_edges_end(); + ++eit + ) + { + Cell_handle c = eit->first; + Vertex_handle vA = c->vertex(eit->second); + Vertex_handle vB = c->vertex(eit->third); + + if + ( + ( + vA->internalPoint() && !vA->referred() + && vB->internalOrBoundaryPoint() + ) + || ( + vB->internalPoint() && !vB->referred() + && vA->internalOrBoundaryPoint() + ) + ) + { + pointFromPoint dVA = topoint(vA->point()); + pointFromPoint dVB = topoint(vB->point()); + + Field<vector> alignmentDirsA + ( + vA->alignment().T() & cartesianDirections + ); + Field<vector> alignmentDirsB + ( + vB->alignment().T() & cartesianDirections + ); + + Field<vector> alignmentDirs(3); + + forAll(alignmentDirsA, aA) + { + const vector& a = alignmentDirsA[aA]; + + scalar maxDotProduct = 0.0; + + forAll(alignmentDirsB, aB) + { + const vector& b = alignmentDirsB[aB]; + + const scalar dotProduct = a & b; + + if (mag(dotProduct) > maxDotProduct) + { + maxDotProduct = mag(dotProduct); + + alignmentDirs[aA] = a + sign(dotProduct)*b; + + alignmentDirs[aA] /= mag(alignmentDirs[aA]); + } + } + } + + vector rAB = dVA - dVB; + + scalar rABMag = mag(rAB); + + if (rABMag < SMALL) + { + // Removal of close points + + if + ( + vA->internalPoint() && !vA->referred() + && vB->internalPoint() && !vB->referred() + ) + { + // Only insert a point at the midpoint of + // the short edge if neither attached + // point has already been identified to be + // removed. + + if + ( + pointToBeRetained[vA->index()] == true + && pointToBeRetained[vB->index()] == true + ) + { + pointsToInsert.append + ( + toPoint<Point>(0.5*(dVA + dVB)) + ); + } + } + + if (vA->internalPoint() && !vA->referred()) + { + pointToBeRetained[vA->index()] = false; + } + + if (vB->internalPoint() && !vB->referred()) + { + pointToBeRetained[vB->index()] = false; + } + + // Do not consider this Delaunay edge any further + + continue; + } + + forAll(alignmentDirs, aD) + { + vector& alignmentDir = alignmentDirs[aD]; + + scalar dotProd = rAB & alignmentDir; + + if (dotProd < 0) + { + // swap the direction of the alignment so that has the + // same sense as rAB + alignmentDir *= -1; + dotProd *= -1; + } + + const scalar alignmentDotProd = dotProd/rABMag; + + if + ( + alignmentDotProd + > cvMeshControls().cosAlignmentAcceptanceAngle() + ) + { + scalar targetCellSize = averageCellSize(vA, vB); + + scalar targetFaceArea = sqr(targetCellSize); + + const vector originalAlignmentDir = alignmentDir; + + // Update cell size and face area + cellShapeControls().aspectRatio().updateCellSizeAndFaceArea + ( + alignmentDir, + targetFaceArea, + targetCellSize + ); + + // Vector to move end points around middle of vector + // to align edge (i.e. dual face normal) with alignment + // directions. + vector delta = alignmentDir - 0.5*rAB; + + face dualFace = buildDualFace(eit); + +// Pout<< dualFace << endl; +// Pout<< " " << vA->info() << endl; +// Pout<< " " << vB->info() << endl; + + const scalar faceArea = dualFace.mag(dualVertices); + + // Update delta vector + cellShapeControls().aspectRatio().updateDeltaVector + ( + originalAlignmentDir, + targetCellSize, + rABMag, + delta + ); + + if (targetFaceArea == 0) + { + Pout<< vA->info() << vB->info(); + + Cell_handle ch = locate(vA->point()); + if (is_infinite(ch)) + { + Pout<< "vA " << vA->targetCellSize() << endl; + } + + ch = locate(vB->point()); + if (is_infinite(ch)) + { + Pout<< "vB " << vB->targetCellSize() << endl; + } + } + + delta *= faceAreaWeightModel_->faceAreaWeight + ( + faceArea/targetFaceArea + ); + + if + ( + ( + (vA->internalPoint() && vB->internalPoint()) + && (!vA->referred() || !vB->referred()) +// || +// ( +// vA->referredInternalPoint() +// && vB->referredInternalPoint() +// ) + ) + && rABMag + > cvMeshControls().insertionDistCoeff()*targetCellSize + && faceArea + > cvMeshControls().faceAreaRatioCoeff()*targetFaceArea + && alignmentDotProd + > cvMeshControls().cosInsertionAcceptanceAngle() + ) + { + // Point insertion + if + ( + !geometryToConformTo_.findSurfaceAnyIntersection + ( + dVA, + dVB + ) + ) + { + const Foam::point& newPt = 0.5*(dVA + dVB); + + if (positionOnThisProc(newPt)) + { + // Prevent insertions spanning surfaces + pointsToInsert.append(toPoint<Point>(newPt)); + } + } + } + else if + ( + ( + (vA->internalPoint() && !vA->referred()) + || (vB->internalPoint() && !vB->referred()) + ) + && rABMag + < cvMeshControls().removalDistCoeff() + *targetCellSize + ) + { + // Point removal + if + ( + vA->internalPoint() && !vA->referred() + && vB->internalPoint() && !vB->referred() + ) + { + // Only insert a point at the midpoint of + // the short edge if neither attached + // point has already been identified to be + // removed. + if + ( + pointToBeRetained[vA->index()] == true + && pointToBeRetained[vB->index()] == true + ) + { + pointsToInsert.append + ( + toPoint<Point>(0.5*(dVA + dVB)) + ); + } + } + + if (vA->internalPoint() && !vA->referred()) + { + pointToBeRetained[vA->index()] = false; + } + + if (vB->internalPoint() && !vB->referred()) + { + pointToBeRetained[vB->index()] = false; + } + } + else + { + if (vA->internalPoint() && !vA->referred()) + { + displacementAccumulator[vA->index()] += delta; + } + + if (vB->internalPoint() && !vB->referred()) + { + displacementAccumulator[vB->index()] -= delta; + } + } + } + } + } + } + + Info<< "Limit displacements" << endl; + + // Limit displacements that pierce, or get too close to the surface + for + ( + Delaunay::Finite_vertices_iterator vit = finite_vertices_begin(); + vit != finite_vertices_end(); + ++vit + ) + { + if (vit->internalPoint() && !vit->referred()) + { + if (pointToBeRetained[vit->index()] == true) + { + limitDisplacement + ( + vit, + displacementAccumulator[vit->index()] + ); + } + } + } + + vector totalDisp = gSum(displacementAccumulator); + scalar totalDist = gSum(mag(displacementAccumulator)); + + displacementAccumulator *= relaxation; + + Info<< "Sum displacements" << endl; + + for + ( + Delaunay::Finite_vertices_iterator vit = finite_vertices_begin(); + vit != finite_vertices_end(); + ++vit + ) + { + if (vit->internalPoint() && !vit->referred()) + { + if (pointToBeRetained[vit->index()] == true) + { + // Convert vit->point() to FOAM vector (double) to do addition, + // avoids memory increase because a record of the constructions + // would be kept otherwise. + // See cgal-discuss@lists-sop.inria.fr: + // "Memory issue with openSUSE 11.3, exact kernel, adding + // points/vectors" + // 14/1/2011. + // Only necessary if using an exact constructions kernel + // (extended precision) + + pointsToInsert.append + ( + toPoint<Point> + ( + topoint(vit->point()) + + displacementAccumulator[vit->index()] + ) + ); + } + } + } + + pointsToInsert.shrink(); + + // Save displacements to file. + if (cvMeshControls().objOutput() && runTime_.outputTime()) + { + Pout<< "Writing point displacement vectors to file." << endl; + OFstream str("displacements_" + runTime_.timeName() + ".obj"); + + for + ( + Delaunay::Finite_vertices_iterator vit = finite_vertices_begin(); + vit != finite_vertices_end(); + ++vit + ) + { + if (vit->internalPoint() && !vit->referred()) + { + if (pointToBeRetained[vit->index()] == true) + { + meshTools::writeOBJ(str, topoint(vit->point())); + + str << "vn " + << displacementAccumulator[vit->index()][0] << " " + << displacementAccumulator[vit->index()][1] << " " + << displacementAccumulator[vit->index()][2] << " " + << endl; + } + } + } + } + + // Remove the entire tessellation + DelaunayMesh<Delaunay>::reset(); + + timeCheck("Displacement calculated"); + + Info<< nl << "Inserting displaced tessellation" << endl; + + insertInternalPoints(pointsToInsert, true); + + reinsertFeaturePoints(true); + + // Remove internal points that have been inserted outside the surface. +// label internalPtIsOutside = 0; +// +// for +// ( +// Delaunay::Finite_vertices_iterator vit = finite_vertices_begin(); +// vit != finite_vertices_end(); +// ++vit +// ) +// { +// if (vit->internalPoint() && !vit->referred()) +// { +// bool inside = geometryToConformTo_.inside +// ( +// topoint(vit->point()) +// ); +// +// if (!inside) +// { +// remove(vit); +// internalPtIsOutside++; +// } +// } +// } +// +// Info<< " " << internalPtIsOutside +// << " internal points were inserted outside the domain. " +// << "They have been removed." << endl; + + // Fix points that have not been significantly displaced +// for +// ( +// Delaunay::Finite_vertices_iterator vit = finite_vertices_begin(); +// vit != finite_vertices_end(); +// ++vit +// ) +// { +// if (vit->internalPoint()) +// { +// if +// ( +// mag(displacementAccumulator[vit->index()]) +// < 0.1*targetCellSize(topoint(vit->point())) +// ) +// { +// vit->setVertexFixed(); +// } +// } +// } + + timeCheck("Internal points inserted"); + + { + // Check that no index is shared between any of the local points + labelHashSet usedIndices; + for + ( + Delaunay::Finite_vertices_iterator vit = finite_vertices_begin(); + vit != finite_vertices_end(); + ++vit + ) + { + if (!vit->referred() && !usedIndices.insert(vit->index())) + { + FatalErrorIn("Foam::conformalVoronoiMesh::move()") + << "Index already used! Could not insert: " << nl + << vit->info() + << abort(FatalError); + } + } + } + + conformToSurface(); + + if (cvMeshControls().objOutput()) + { + writePoints + ( + "internalPoints_" + runTime_.timeName() + ".obj", + Foam::indexedVertexEnum::vtInternal + ); + } + + if (cvMeshControls().objOutput() && runTime_.outputTime()) + { + writeBoundaryPoints("boundaryPoints_" + runTime_.timeName() + ".obj"); + } + + timeCheck("After conformToSurface"); + + printVertexInfo(); + + // Write the intermediate mesh, do not filter the dual faces. + if (runTime_.outputTime()) + { + writeMesh(runTime_.timeName()); + } + + updateSizesAndAlignments(pointsToInsert); + + Info<< nl + << "Total displacement = " << totalDisp << nl + << "Total distance = " << totalDist << nl + << endl; +} + + +bool Foam::conformalVoronoiMesh::positionOnThisProc +( + const Foam::point& pt +) const +{ + if (Pstream::parRun()) + { + return decomposition_().positionOnThisProcessor(pt); + } + + return true; +} + + +Foam::boolList Foam::conformalVoronoiMesh::positionOnThisProc +( + const Foam::List<Foam::point>& pts +) const +{ + if (Pstream::parRun()) + { + return decomposition_().positionOnThisProcessor(pts); + } + + return boolList(pts.size(), true); +} + + +Foam::labelList Foam::conformalVoronoiMesh::positionProc +( + const Foam::List<Foam::point>& pts +) const +{ + if (!Pstream::parRun()) + { + return labelList(pts.size(), -1); + } + + return decomposition_().processorPosition(pts); +} + + +Foam::List<Foam::List<Foam::pointIndexHit> > +Foam::conformalVoronoiMesh::intersectsProc +( + const List<Foam::point>& starts, + const List<Foam::point>& ends +) const +{ + if (!Pstream::parRun()) + { + return List<List<pointIndexHit> >(starts.size()); + } + + return decomposition_().intersectsProcessors(starts, ends, false); +} + + +//Foam::labelListList Foam::conformalVoronoiMesh::overlapsProc +//( +// const List<Foam::point>& centres, +// const List<scalar>& radiusSqrs +//) const +//{ +// if (!Pstream::parRun()) +// { +// return labelListList(centres.size(), labelList(0)); +// } +// +//// DynamicList<Foam::point> pts(number_of_vertices()); +// +//// for +//// ( +//// Delaunay::Finite_vertices_iterator vit = finite_vertices_begin(); +//// vit != finite_vertices_end(); +//// vit++ +//// ) +//// { +//// pts.append(topoint(vit->point())); +//// } +//// +//// dynamicIndexedOctree<dynamicTreeDataPoint> vertexOctree +//// ( +//// dynamicTreeDataPoint(pts), +//// treeBoundBox(min(pts), max(pts)), +//// 10, // maxLevel +//// 10, // leafSize +//// 3.0 // duplicity +//// ); +// +// return decomposition_().overlapsProcessors +// ( +// centres, +// radiusSqrs, +// *this, +// false//, +//// vertexOctree +// ); +//} + + +void Foam::conformalVoronoiMesh::checkCoPlanarCells() const +{ + typedef CGAL::Exact_predicates_exact_constructions_kernel Kexact; + typedef CGAL::Point_3<Kexact> PointExact; + + if (!is_valid()) + { + Pout<< "Triangulation is invalid!" << endl; + } + + OFstream str("badCells.obj"); + + label badCells = 0; + + for + ( + Delaunay::Finite_cells_iterator cit = finite_cells_begin(); + cit != finite_cells_end(); + ++cit + ) + { + const scalar quality = cvMeshChecks::coplanarTet(cit, 1e-16); + + if (quality == 0) + { + Pout<< "COPLANAR: " << cit->info() << nl + << " quality = " << quality << nl + << " dual = " << topoint(cit->dual()) << endl; + + drawDelaunayCell(str, cit, badCells++); + + FixedList<PointExact, 4> cellVerticesExact(PointExact(0,0,0)); + forAll(cellVerticesExact, vI) + { + cellVerticesExact[vI] = PointExact + ( + cit->vertex(vI)->point().x(), + cit->vertex(vI)->point().y(), + cit->vertex(vI)->point().z() + ); + } + + PointExact synchronisedDual = CGAL::circumcenter<Kexact> + ( + cellVerticesExact[0], + cellVerticesExact[1], + cellVerticesExact[2], + cellVerticesExact[3] + ); + + Foam::point exactPt + ( + CGAL::to_double(synchronisedDual.x()), + CGAL::to_double(synchronisedDual.y()), + CGAL::to_double(synchronisedDual.z()) + ); + + Info<< "inexact = " << cit->dual() << nl + << "exact = " << exactPt << endl; + } + } + + Pout<< "There are " << badCells << " bad cells out of " + << number_of_finite_cells() << endl; + + + label nNonGabriel = 0; + for + ( + Delaunay::Finite_facets_iterator fit = finite_facets_begin(); + fit != finite_facets_end(); + ++fit + ) + { + if (!is_Gabriel(*fit)) + { + nNonGabriel++;//Pout<< "Non-gabriel face" << endl; + } + } + + Pout<< "There are " << nNonGabriel << " non-Gabriel faces out of " + << number_of_finite_facets() << endl; +} + + +// ************************************************************************* // diff --git a/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/conformalVoronoiMesh/conformalVoronoiMesh.H b/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/conformalVoronoiMesh/conformalVoronoiMesh.H new file mode 100644 index 0000000000000000000000000000000000000000..912a426dd1e5a55b6f367062233e48709f31ee23 --- /dev/null +++ b/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/conformalVoronoiMesh/conformalVoronoiMesh.H @@ -0,0 +1,1197 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2012-2013 OpenFOAM Foundation + \\/ M anipulation | +------------------------------------------------------------------------------- +License + This file is part of OpenFOAM. + + OpenFOAM is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + OpenFOAM is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>. + +Class + Foam::conformalVoronoiMesh + +Description + +SourceFiles + conformalVoronoiMeshI.H + conformalVoronoiMesh.C + conformalVoronoiMeshIO.C + conformalVoronoiMeshConformToSurface.C + conformalVoronoiMeshFeaturePoints.C + conformalVoronoiMeshFeaturePointSpecialisations.C + conformalVoronoiMeshCalcDualMesh.C + +\*---------------------------------------------------------------------------*/ + +#ifndef conformalVoronoiMesh_H +#define conformalVoronoiMesh_H + +#include "CGALTriangulation3Ddefs.H" +#include "uint.H" +#include "ulong.H" +#include "searchableSurfaces.H" +#include "conformationSurfaces.H" +#include "cellShapeControl.H" +#include "cvControls.H" +#include "DynamicList.H" +#include "PackedBoolList.H" +#include "Time.H" +#include "polyMesh.H" +#include "plane.H" +#include "SortableList.H" +#include "meshTools.H" +#include "dynamicIndexedOctree.H" +#include "dynamicTreeDataPoint.H" +#include "indexedOctree.H" +#include "treeDataPoint.H" +#include "unitConversion.H" +#include "transform.H" +#include "volFields.H" +#include "fvMesh.H" +#include "labelPair.H" +#include "HashSet.H" +#include "memInfo.H" +#include "point.H" +#include "cellSet.H" +#include "wallPolyPatch.H" +#include "processorPolyPatch.H" +#include "zeroGradientFvPatchFields.H" +#include "globalIndex.H" +#include "pointFeatureEdgesTypes.H" +#include "pointConversion.H" +#include "Tuple2.H" +#include "DistributedDelaunayMesh.H" +#include "tensorIOField.H" + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ + +// Forward declaration of classes +class initialPointsMethod; + +class relaxationModel; + +class faceAreaWeightModel; + +class backgroundMeshDecomposition; + +/*---------------------------------------------------------------------------*\ + Class conformalVoronoiMesh Declaration +\*---------------------------------------------------------------------------*/ + +class conformalVoronoiMesh +: + public DistributedDelaunayMesh<Delaunay> +{ +public: + + enum reconformationMode + { + rmOff, // Do not rebuild the surface conformation + rmOn + }; + + typedef Delaunay::Vertex_handle Vertex_handle; + typedef Delaunay::Cell_handle Cell_handle; + typedef Delaunay::Point Point; + + typedef List<DynamicList<Pair<labelPair> > > labelPairPairDynListList; + + typedef Tuple2<pointIndexHit, label> pointIndexHitAndFeature; + typedef List<pointIndexHitAndFeature> pointIndexHitAndFeatureList; + typedef DynamicList<pointIndexHitAndFeature> pointIndexHitAndFeatureDynList; + + +private: + + // Static data + + static const scalar tolParallel; + + static const scalar searchConeAngle; + + static const scalar searchAngleOppositeSurface; + + + // Private data + + //- The time registry of the application + const Time& runTime_; + + //- Random number generator + mutable Random rndGen_; + + //- Controls for the conformal Voronoi meshing process + cvControls cvMeshControls_; + + //- All geometry of the meshing process, including surfaces to be + // conformed to and those to be used for refinement + searchableSurfaces allGeometry_; + + //- The surfaces to conform to + conformationSurfaces geometryToConformTo_; + + //- The cell shape control object + cellShapeControl cellShapeControl_; + + //- Limiting bound box before infinity begins + treeBoundBox limitBounds_; + + //- Store the feature constraining points to be reinserted after a + // triangulation clear. Maintained with relative types and indices. + List<Vb> featureVertices_; + + //- Storing the locations of all of the features to be conformed to. + // Single pointField required by the featurePointTree. + pointField featurePointLocations_; + + //- Search tree for edge point locations + mutable autoPtr<dynamicIndexedOctree<dynamicTreeDataPoint> > + edgeLocationTreePtr_; + + mutable DynamicList<Foam::point> existingEdgeLocations_; + + //- Search tree for surface point locations + mutable autoPtr<dynamicIndexedOctree<dynamicTreeDataPoint> > + surfacePtLocationTreePtr_; + + mutable DynamicList<Foam::point> existingSurfacePtLocations_; + + //- Store locations where the cell size and alignments will be + // pre-calculated and looked up + pointField sizeAndAlignmentLocations_; + + //- Stored cell size at sizeAndAlignmentLocations_ + scalarField storedSizes_; + + //- Stored alignments at sizeAndAlignmentLocations_ + tensorField storedAlignments_; + + //- Search tree for size and alignment lookup points + mutable autoPtr<indexedOctree<treeDataPoint> > sizeAndAlignmentTreePtr_; + + //- Store the surface and feature edge conformation locations to be + // reinserted + List<Vb> surfaceConformationVertices_; + + //- Method for inserting initial points. Runtime selectable. + autoPtr<initialPointsMethod> initialPointsMethod_; + + //- Relaxation coefficient model. Runtime selectable. + autoPtr<relaxationModel> relaxationModel_; + + //- Face area weight function. Runtime selectable. + autoPtr<faceAreaWeightModel> faceAreaWeightModel_; + + //- Background mesh decomposition, only available in parallel. + autoPtr<backgroundMeshDecomposition> decomposition_; + + + // Private Member Functions + + inline scalar defaultCellSize() const; + + //- Return the local target cell size at the given location. Takes + // boolean argument to allow speed-up of queries if the point is going + // to be on a surface. + inline scalar targetCellSize(const Foam::point& pt) const; + + //- Return the target cell size from that stored on a pair of + // Delaunay vertices, using a mean function. + inline scalar averageCellSize + ( + const Vertex_handle& vA, + const Vertex_handle& vB + ) const; + + //- Return the target cell size from that stored on a pair of + // Delaunay vertices, including the possibility that one of + // them is not an internalOrBoundaryPoint, and so will not + // have valid data. + inline scalar averageAnyCellSize + ( + const Vertex_handle& vA, + const Vertex_handle& vB + ) const; + + //- The average target cell size of a Delaunay facet, i.e., of + // a dual edge + inline scalar averageAnyCellSize + ( + const Delaunay::Finite_facets_iterator& fit + ) const; + + //- Return the local point pair separation at the given location + inline scalar pointPairDistance(const Foam::point& pt) const; + + //- Return the local mixed feature point placement distance + inline scalar mixedFeaturePointDistance(const Foam::point& pt) const; + + //- Return the square of the local feature point exclusion distance + inline scalar featurePointExclusionDistanceSqr + ( + const Foam::point& pt + ) const; + + //- Return the square of the local feature edge exclusion distance + inline scalar featureEdgeExclusionDistanceSqr + ( + const Foam::point& pt + ) const; + + //- Return the square of the local surface point exclusion distance + inline scalar surfacePtExclusionDistanceSqr + ( + const Foam::point& pt + ) const; + + //- Return the square of the local surface search distance + inline scalar surfaceSearchDistanceSqr(const Foam::point& pt) const; + + //- Return the local maximum surface protrusion distance + inline scalar maxSurfaceProtrusion(const Foam::point& pt) const; + + //- Return the required cell size at the given location + scalar requiredSize(const Foam::point& pt) const; + + //- Return the required alignment directions at the given location + tensor requiredAlignment(const Foam::point& pt) const; + + //- Insert Point and return its auto-generated index + inline bool insertPoint + ( + const Point& P, + const indexedVertexEnum::vertexType type + ); + + //- Insert Foam::point with specified index and type + inline bool insertPoint + ( + const Foam::point& p, + const indexedVertexEnum::vertexType type + ); + + //- Insert Point with specified index, type and original processor + inline bool insertReferredPoint + ( + const Point& P, + const label index, + const indexedVertexEnum::vertexType type, + const label processor + ); + + inline bool insertReferredPoint(const Vb& P); + + //- Insert Foam::point with specified index, type and original processor + inline bool insertReferredPoint + ( + const Foam::point& p, + const label index, + const indexedVertexEnum::vertexType type, + const label processor + ); + + //- Insert Delaunay vertices using the CGAL range insertion method, + // optionally check processor occupancy and distribute to other + // processors + void insertInternalPoints + ( + List<Point>& points, + const bool distribute = false + ); + + void insertPoints + ( + List<Vb>& vertices, + bool distribute = true + ); + + //- Create a point-pair at a ppDist distance either side of + // surface point surfPt, in the direction n + inline void createPointPair + ( + const scalar ppDist, + const Foam::point& surfPt, + const vector& n, + DynamicList<Vb>& pts + ); + + inline Foam::point perturbPoint(const Foam::point& pt) const; + + //- Create a point-pair at a ppDist distance either side of + // surface point surfPt, in the direction n + inline void createBafflePointPair + ( + const scalar ppDist, + const Foam::point& surfPt, + const vector& n, + DynamicList<Vb>& pts + ); + + inline bool isPointPair + ( + const Vertex_handle& vA, + const Vertex_handle& vB + ) const; + + //- Insert pairs of points on the surface with the given normals, at the + // specified spacing + void insertSurfacePointPairs + ( + const pointIndexHitAndFeatureList& surfaceHits, + const fileName fName = fileName::null + ); + + //- Insert groups of points to conform to an edge given a list of + // pointIndexHits specifying the location and edge index of the point + // to be conformed to on the corresponding entry in featureHit + void insertEdgePointGroups + ( + const pointIndexHitAndFeatureList& edgeHits, + const fileName fName = fileName::null + ); + + //- Call the appropriate function to conform to an edge + void createEdgePointGroup + ( + const extendedFeatureEdgeMesh& feMesh, + const pointIndexHit& edHit, + DynamicList<Vb>& pts + ); + + //- Create points to conform to an external edge + void createExternalEdgePointGroup + ( + const extendedFeatureEdgeMesh& feMesh, + const pointIndexHit& edHit, + DynamicList<Vb>& pts + ); + + //- Create points to conform to an internal edge + void createInternalEdgePointGroup + ( + const extendedFeatureEdgeMesh& feMesh, + const pointIndexHit& edHit, + DynamicList<Vb>& pts + ); + + //- Create points to conform to a flat edge + void createFlatEdgePointGroup + ( + const extendedFeatureEdgeMesh& feMesh, + const pointIndexHit& edHit, + DynamicList<Vb>& pts + ); + + //- Create points to conform to an open edge + void createOpenEdgePointGroup + ( + const extendedFeatureEdgeMesh& feMesh, + const pointIndexHit& edHit, + DynamicList<Vb>& pts + ); + + //- Create points to conform to multiply connected edge + void createMultipleEdgePointGroup + ( + const extendedFeatureEdgeMesh& feMesh, + const pointIndexHit& edHit, + DynamicList<Vb>& pts + ); + + //- Determine and insert point groups at the feature points + void insertFeaturePoints(); + + //- Create point groups at mixed feature points + void createMixedFeaturePoints(DynamicList<Vb>& pts); + + void addMasterAndSlavePoints + ( + const DynamicList<Foam::point>& masterPoints, + const DynamicList<indexedVertexEnum::vertexType>&masterPointsTypes, + const Map<DynamicList<autoPtr<plane> > >& masterPointReflections, + DynamicList<Vb>& pts, + const label ptI + ) const; + + label getSign(const extendedFeatureEdgeMesh::edgeStatus eStatus) const; + + void createMasterAndSlavePoints + ( + const extendedFeatureEdgeMesh& feMesh, + const label ptI, + DynamicList<Vb>& pts + ) const; + + void createFeaturePoints(DynamicList<Vb>& pts); + + vector sharedFaceNormal + ( + const extendedFeatureEdgeMesh& feMesh, + const label edgeI, + const label nextEdgeI + ) const; + + List<Foam::point> reflectPointInPlanes + ( + const Foam::point p, + const DynamicList<autoPtr<plane> >& planes + ) const; + + Foam::point reflectPointInPlane + ( + const Foam::point p, + const plane& planeN + ) const; + + + //- Fill the pointFeatureEdgesType struct with the types of feature + // edges that are attached to the point. + List<extendedFeatureEdgeMesh::edgeStatus> calcPointFeatureEdgesTypes + ( + const extendedFeatureEdgeMesh& feMesh, + const labelList& pEds, + pointFeatureEdgesTypes& pFEdgeTypes + ); + + //- Create feature point groups if a specialisation exists for the + // structure + bool createSpecialisedFeaturePoint + ( + const extendedFeatureEdgeMesh& feMesh, + const labelList& pEds, + const pointFeatureEdgesTypes& pFEdgeTypes, + const List<extendedFeatureEdgeMesh::edgeStatus>& allEdStat, + const label ptI, + DynamicList<Vb>& pts + ); + + //- Store the locations of all of the features to be conformed to + void constructFeaturePointLocations(); + + List<pointIndexHit> findSurfacePtLocationsNearFeaturePoint + ( + const Foam::point& featurePoint + ) const; + + //- Reinsert stored feature point defining points + void reinsertFeaturePoints(bool distribute = false); + + //- Check if a location is in exclusion range around a feature point + bool nearFeaturePt(const Foam::point& pt) const; + + //- Insert the initial points into the triangulation, based on the + // initialPointsMethod + void insertInitialPoints(); + + //- Calculate the worst load balance + scalar calculateLoadUnbalance() const; + + //- In parallel redistribute the backgroundMeshDecomposition and + // vertices to balance the number of vertices on each processor. + // Returns true if the background mesh changes as this removes all + // referred vertices, so the parallel interface may need rebuilt. + bool distributeBackground(); + + // Test for full containment + void cellSizeMeshOverlapsBackground() const; + + //- + void distribute(); + + void buildCellSizeAndAlignmentMesh(); + + //- Store data for sizeAndAlignmentLocations_, storedSizes_ and + // storedAlignments_ and initialise the sizeAndAlignmentTreePtr_, + // determining the appropriate sizeAndAlignmentLocations_ + // automatically + void storeSizesAndAlignments(); + + //- Store data for sizeAndAlignmentLocations_, storedSizes_ and + // storedAlignments_ and initialise the sizeAndAlignmentTreePtr_ + void storeSizesAndAlignments(const List<Point>& storePts); + + //- Restore the sizes and alignments if required + void updateSizesAndAlignments(const List<Point>& storePts); + + //- Demand driven construction of octree for and alignment points + const indexedOctree<treeDataPoint>& sizeAndAlignmentTree() const; + + //- Set the size and alignment data for each vertex + void setVertexSizeAndAlignment(); + + //- Builds a dual face by circulating around the supplied edge. + face buildDualFace + ( + const Delaunay::Finite_edges_iterator& eit + ) const; + + boolList dualFaceBoundaryPoints + ( + const Delaunay::Finite_edges_iterator& eit + ) const; + + //- Finds the maximum filterCount of the dual vertices + // (Delaunay cells) that form the dual face produced by the + // supplied edge + label maxFilterCount + ( + const Delaunay::Finite_edges_iterator& eit + ) const; + + //- Determines the owner and neighbour labels for dual cells + // corresponding to the dual face formed by the supplied + // Delaunay vertices. If the dual face is a boundary face + // then neighbour = -1. Returns true if the dual face + // created by vA -> vB needs to be reversed to be correctly + // orientated. + bool ownerAndNeighbour + ( + Vertex_handle vA, + Vertex_handle vB, + label& owner, + label& neighbour + ) const; + + //- Insert the necessary point pairs to conform to the surface, either + // from stored results, or trigger a re-conformation + void conformToSurface(); + + //- Decision making function for when to rebuild the surface + // conformation + reconformationMode reconformationControl() const; + + //- Determines geometrically whether a vertex is close to a surface + // This is an optimisation + label findVerticesNearBoundaries(); + + //- Create and insert the necessary point pairs to conform to the + // surface, then store the result + void buildSurfaceConformation(); + + label synchroniseEdgeTrees + ( + pointIndexHitAndFeatureList& featureEdgeHits + ); + + label synchroniseSurfaceTrees + ( + pointIndexHitAndFeatureList& surfaceHits + ); + + bool locationConformsToInside + ( + const pointIndexHitAndFeature& info + ) const; + + //- Check to see if dual cell specified by given vertex iterator + // intersects the boundary and hence reqires a point-pair + bool dualCellSurfaceAnyIntersection + ( + const Delaunay::Finite_vertices_iterator& vit + ) const; + + //- Return all intersections + bool dualCellSurfaceAllIntersections + ( + const Delaunay::Finite_vertices_iterator& vit, + pointIndexHitAndFeatureDynList& info + ) const; + + //- Return false if the line is entirely outside the current processor + // domain, true is either point is inside, or the processor domain + // bounadry is intersected (i.e. the points are box outside but the + // line cuts. The points will be moved onto the box where they + // intersect. + bool clipLineToProc + ( + const Foam::point& pt, + Foam::point& a, + Foam::point& b + ) const; + + //- Find the "worst" protrusion of a dual cell through the surface, + // subject to the maxSurfaceProtrusion tolerance + void dualCellLargestSurfaceProtrusion + ( + const Delaunay::Finite_vertices_iterator& vit, + pointIndexHit& surfHit, + label& hitSurface + ) const; + + //- Find the "worst" incursion of the dual cell of a non-internal or + // boundary point through the surface, subject to the + // maxSurfaceProtrusion tolerance + void dualCellLargestSurfaceIncursion + ( + const Delaunay::Finite_vertices_iterator& vit, + pointIndexHit& surfHitLargest, + label& hitSurfaceLargest + ) const; + + //- Write out vertex-processor occupancy information for debugging + void reportProcessorOccupancy(); + + //- Write out debugging information about the surface conformation + // quality +// void reportSurfaceConformationQuality(); + + //- Limit the displacement of a point so that it doesn't penetrate the + // surface to be meshed or come too close to it + void limitDisplacement + ( + const Delaunay::Finite_vertices_iterator& vit, + vector& displacement, + label callCount = 0 + ) const; + + //- Find angle between the normals of two close surface points. + scalar angleBetweenSurfacePoints(Foam::point pA, Foam::point pB) const; + + //- Check if a surface point is near another. + bool nearSurfacePoint + ( + pointIndexHitAndFeature& pHit + ) const; + + //- Append a point to the surface point tree and the existing list + bool appendToSurfacePtTree + ( + const Foam::point& pt + ) const; + + //- Append a point to the edge location tree and the existing list + bool appendToEdgeLocationTree + ( + const Foam::point& pt + ) const; + + //- Return a list of the nearest feature edge locations + List<pointIndexHit> nearestFeatureEdgeLocations + ( + const Foam::point& pt + ) const; + + //- Check if a point is near any feature edge points. + bool pointIsNearFeatureEdgeLocation(const Foam::point& pt) const; + + bool pointIsNearFeatureEdgeLocation + ( + const Foam::point& pt, + pointIndexHit& info + ) const; + + //- Check if a point is near any surface conformation points. + bool pointIsNearSurfaceLocation(const Foam::point& pt) const; + + bool pointIsNearSurfaceLocation + ( + const Foam::point& pt, + pointIndexHit& info + ) const; + + //- Check if a location is in the exclusion range of an existing feature + //- edge conformation location + bool nearFeatureEdgeLocation + ( + pointIndexHit& pHit + ) const; + + //- Build or rebuild the edge location tree + void buildEdgeLocationTree + ( + const DynamicList<Foam::point>& existingEdgeLocations + ) const; + + //- Build or rebuild the surface point location tree + void buildSurfacePtLocationTree + ( + const DynamicList<Foam::point>& existingSurfacePtLocations + ) const; + + //- Build or rebuild the sizeAndAlignmentTree + void buildSizeAndAlignmentTree() const; + + //- Process the surface conformation locations to decide which surface + // and edge conformation locations to add + void addSurfaceAndEdgeHits + ( + const Delaunay::Finite_vertices_iterator& vit, + const pointIndexHitAndFeatureDynList& surfaceIntersections, + scalar surfacePtReplaceDistCoeffSqr, + scalar edgeSearchDistCoeffSqr, + pointIndexHitAndFeatureDynList& surfaceHits, + pointIndexHitAndFeatureDynList& featureEdgeHits + ) const; + + //- Store the surface conformation with the indices offset to be + // relative to zero + void storeSurfaceConformation(); + + //- Reinsert the surface conformation re-offsetting indices to be + // relative to new number of internal vertices + void reinsertSurfaceConformation(); + + void checkCells(); + + void checkDuals(); + + void checkVertices(); + + void checkCoPlanarCells() const; + + //- Dual calculation + void calcDualMesh + ( + pointField& points, + labelList& boundaryPts, + faceList& faces, + labelList& owner, + labelList& neighbour, + wordList& patchTypes, + wordList& patchNames, + labelList& patchSizes, + labelList& patchStarts, + labelList& procNeighbours, + pointField& cellCentres, + labelList& cellToDelaunayVertex, + labelListList& patchToDelaunayVertex, + PackedBoolList& boundaryFacesToRemove + ); + + //- Tet mesh calculation + void calcTetMesh + ( + pointField& points, + labelList& pointToDelaunayVertex, + faceList& faces, + labelList& owner, + labelList& neighbour, + wordList& patchTypes, + wordList& patchNames, + labelList& patchSizes, + labelList& patchStarts + ); + + //- Determines if the dual face constructed by the Delaunay + // edge is a boundary face + inline bool isBoundaryDualFace + ( + const Delaunay::Finite_edges_iterator& eit + ) const; + + //- Which processors are attached to the dual edge represented by this + // Delaunay facet + inline List<label> processorsAttached + ( + const Delaunay::Finite_facets_iterator& fit + ) const; + + //- Determines if the edge constructed from the face is on + // a processor patch + inline bool isParallelDualEdge + ( + const Delaunay::Finite_facets_iterator& fit + ) const; + + //- Determines if the dual face constructed by the Delaunay + // edge is a processor boundary face + inline bool isProcBoundaryEdge + ( + const Delaunay::Finite_edges_iterator& eit + ) const; + + //- Merge vertices that are identical + void mergeIdenticalDualVertices + ( + const pointField& pts, + const labelList& boundaryPts + ); + + label mergeIdenticalDualVertices + ( + const pointField& pts, + const labelList& boundaryPts, + Map<label>& dualPtIndexMap + ) const; + + //- Identify the face labels of the deferred collapse faces + void deferredCollapseFaceSet + ( + labelList& owner, + labelList& neighbour, + const HashSet<labelPair, labelPair::Hash<> >& deferredCollapseFaces + ) const; + + //- Check whether the cell sizes are fine enough. Creates a polyMesh. + void checkCellSizing(); + + //- Find all cells with a patch face that is not near the surface. The + // allowed offset is the fraction of the target cell size. + labelHashSet findOffsetPatchFaces + ( + const polyMesh& mesh, + const scalar allowedOffset + ) const; + + //- Create a polyMesh and check its quality, reports which + // elements damage the mesh quality, allowing backtracking. + labelHashSet checkPolyMeshQuality(const pointField& pts) const; + + //- Index all of the the Delaunay cells and calculate their + //- dual points + void indexDualVertices + ( + pointField& pts, + labelList& boundaryPts + ); + + //- Re-index all of the Delaunay cells + void reindexDualVertices(const Map<label>& dualPtIndexMap); + + label createPatchInfo + ( + wordList& patchNames, + wordList& patchTypes, + labelList& procNeighbours + ) const; + + //- Create all of the internal and boundary faces + void createFacesOwnerNeighbourAndPatches + ( + faceList& faces, + labelList& owner, + labelList& neighbour, + wordList& patchTypes, + wordList& patchNames, + labelList& patchSizes, + labelList& patchStarts, + labelList& procNeighbours, + labelListList& patchPointPairSlaves, + PackedBoolList& boundaryFacesToRemove, + bool includeEmptyPatches = false + ) const; + + //- Create the cell centres to use for the mesh + void createCellCentres(pointField& cellCentres) const; + + //- Extract all points in vertex-index order + tmp<pointField> allPoints() const; + + //- Sort the faces, owner and neighbour lists into + // upper-triangular order. For internal faces only, use + // before adding patch faces + void sortFaces + ( + faceList& faces, + labelList& owner, + labelList& neighbour + ) const; + + //- Sort the processor patches so that the faces are in the same order + // on both processors + void sortProcPatches + ( + List<DynamicList<face> >& patchFaces, + List<DynamicList<label> >& patchOwners, + List<DynamicList<label> >& patchPointPairSlaves, + labelPairPairDynListList& patchSortingIndices + ) const; + + //- Add the faces and owner information for the patches + void addPatches + ( + const label nInternalFaces, + faceList& faces, + labelList& owner, + labelList& patchSizes, + labelList& patchStarts, + PackedBoolList& boundaryFacesToRemove, + const List<DynamicList<face> >& patchFaces, + const List<DynamicList<label> >& patchOwners, + const List<DynamicList<bool> >& indirectPatchFace + ) const; + + //- Remove points that are no longer used by any faces + void removeUnusedPoints + ( + faceList& faces, + pointField& pts, + labelList& boundaryPts + ) const; + + //- Remove dual cells that are not used by any faces. Return compaction + // map. + labelList removeUnusedCells + ( + labelList& owner, + labelList& neighbour + ) const; + + //- Create an empty fvMesh + autoPtr<fvMesh> createDummyMesh + ( + const IOobject& io, + const wordList& patchTypes, + const wordList& patchNames, + const labelList& patchSizes, + const labelList& patchStarts, + const labelList& procNeighbours + ) const; + + //- Create a polyMesh from points. + autoPtr<polyMesh> createPolyMeshFromPoints(const pointField& pts) const; + + void checkProcessorPatchesMatch + ( + const wordList& patchTypes, + const labelList& patchSizes, + const labelList& procNeighbours + ) const; + + void reorderPoints + ( + pointField& points, + labelList& boundaryPts, + faceList& faces, + const label nInternalFaces + ) const; + + //- Rotate the faces on processor patches if necessary + void reorderProcessorPatches + ( + const word& meshName, + const fileName& instance, + const pointField& points, + faceList& faces, + const wordList& patchTypes, + const wordList& patchNames, + const labelList& patchSizes, + const labelList& patchStarts, + const labelList& procNeighbours + ) const; + + //- Disallow default bitwise copy construct + conformalVoronoiMesh(const conformalVoronoiMesh&); + + //- Disallow default bitwise assignment + void operator=(const conformalVoronoiMesh&); + + +public: + + //- Runtime type information + ClassName("conformalVoronoiMesh"); + + + // Constructors + + //- Construct from Time and cvMeshDict + conformalVoronoiMesh + ( + const Time& runTime, + const dictionary& cvMeshDict + ); + + + //- Destructor + ~conformalVoronoiMesh(); + + + // Member Functions + + //- Move the vertices according to the controller, re-conforming to the + // surface as required + void move(); + + void printVertexInfo() const; + + //- Check if the point is in the domain handled by this processor + bool positionOnThisProc(const Foam::point& pt) const; + + //- Check if the point is in the domain handled by this processor + boolList positionOnThisProc(const Foam::List<Foam::point>& pts) const; + + //- Which processor's domain handles this point + labelList positionProc(const Foam::List<Foam::point>& pts) const; + + //- Which other processors does each line segment intersect + List<List<pointIndexHit> > intersectsProc + ( + const List<Foam::point>& starts, + const List<Foam::point>& ends + ) const; + +// //- Which other processors does each sphere overlap +// labelListList overlapsProc +// ( +// const List<Foam::point>& centres, +// const List<scalar>& radiusSqrs +// ) const; + + typedef K::Vector_3 CGALVector; + + inline CGALVector toCGALVector(const Foam::vector& v) const; + + + // Access + + //- Return the Time object + inline const Time& time() const; + + //- Return the random number generator + inline Random& rndGen() const; + + //- Return the allGeometry object + inline const searchableSurfaces& allGeometry() const; + + //- Return the conformationSurfaces object + inline const conformationSurfaces& geometryToConformTo() const; + + //- Return the backgroundMeshDecomposition + inline const backgroundMeshDecomposition& decomposition() const; + + //- Return the cellShapeControl object + inline const cellShapeControl& cellShapeControls() const; + + //- Return the cvMeshControls object + inline const cvControls& cvMeshControls() const; + + + // Write + + //- Write the elapsedCpuTime and memory usage, with an optional + // description + void timeCheck + ( + const string& description = string::null + ) const; + + //- Write the Delaunay cell + void drawDelaunayCell + ( + Ostream& os, + const Cell_handle& c, + label offset = 0 + ) const; + + //- Write Delaunay points in the range between (and including) + // type startPointType and endPointType to .obj file + void writePoints + ( + const fileName& fName, + const Foam::indexedVertexEnum::vertexType startPointType, + const Foam::indexedVertexEnum::vertexType endPointType + ) const; + + //- Write Delaunay points of type pointType to .obj file + void writePoints + ( + const fileName& fName, + const Foam::indexedVertexEnum::vertexType pointType + ) const; + + //- Write the boundary Delaunay points to .obj file + void writeBoundaryPoints(const fileName& fName) const; + + //- Write list of points to file + void writePoints + ( + const fileName& fName, + const List<Foam::point>& points + ) const; + + //- Write list of points to file + void writePoints + ( + const fileName& fName, + const List<Vb>& points + ) const; + + //- Write the internal Delaunay vertices of the tessellation as a + // pointField that may be used to restart the meshing process + void writeInternalDelaunayVertices(const fileName& instance) const; + + //- Prepare data and call writeMesh for polyMesh and + // tetDualMesh + void writeMesh(const fileName& instance); + + //- Write mesh to disk + void writeMesh + ( + const word& meshName, + const fileName& instance, + pointField& points, + labelList& boundaryPts, + faceList& faces, + labelList& owner, + labelList& neighbour, + const wordList& patchTypes, + const wordList& patchNames, + const labelList& patchSizes, + const labelList& patchStarts, + const labelList& procNeighbours, + const pointField& cellCentres, + const PackedBoolList& boundaryFacesToRemove + ) const; + + //- Write points and faces as .obj file + void writeObjMesh + ( + const pointField& points, + const faceList& faces, + const fileName& fName + ) const; + + //- Calculate and write a field of the target cell size, + // target cell volume, actual cell volume and equivalent + // actual cell size (cbrt(actual cell volume)). + void writeCellSizes(const fvMesh& mesh) const; + + void writeCellAlignments(const fvMesh& mesh) const; + + //- Calculate and write the cell centres. + void writeCellCentres(const fvMesh& mesh) const; + + //- Find the cellSet of the boundary cells which have points that + // protrude out of the surface beyond a tolerance. + labelHashSet findRemainingProtrusionSet(const polyMesh& mesh) const; + + void writeProcessorInterface + ( + const fileName& fName, + const faceList& faces + ) const; +}; + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace Foam + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#include "conformalVoronoiMeshI.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#endif + +// ************************************************************************* // diff --git a/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/conformalVoronoiMesh/conformalVoronoiMeshCalcDualMesh.C b/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/conformalVoronoiMesh/conformalVoronoiMeshCalcDualMesh.C new file mode 100644 index 0000000000000000000000000000000000000000..66a26f666f1bbc0c3380b41775fdf0f9a314446f --- /dev/null +++ b/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/conformalVoronoiMesh/conformalVoronoiMeshCalcDualMesh.C @@ -0,0 +1,2571 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2012-2013 OpenFOAM Foundation + \\/ M anipulation | +------------------------------------------------------------------------------- +License + This file is part of OpenFOAM. + + OpenFOAM is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + OpenFOAM is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>. + +\*---------------------------------------------------------------------------*/ + +#include "conformalVoronoiMesh.H" +#include "motionSmoother.H" +#include "backgroundMeshDecomposition.H" +#include "polyMeshGeometry.H" +#include "indexedCellChecks.H" + +#include "CGAL/Exact_predicates_exact_constructions_kernel.h" +#include "CGAL/Gmpq.h" + +// * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * * // + +void Foam::conformalVoronoiMesh::checkCells() +{ + List<List<FixedList<Foam::point, 4> > > cellListList(Pstream::nProcs()); + + List<FixedList<Foam::point, 4> > cells(number_of_finite_cells()); + + globalIndex gIndex(number_of_vertices()); + + label count = 0; + for + ( + Delaunay::Finite_cells_iterator cit = finite_cells_begin(); + cit != finite_cells_end(); + ++cit + ) + { + if (tetrahedron(cit).volume() == 0) + { + Pout<< "ZERO VOLUME TET" << endl; + Pout<< cit->info(); + Pout<< cit->dual(); + } + + if (cit->hasFarPoint()) + { + continue; + } + + List<labelPair> cellVerticesPair(4); + List<Foam::point> cellVertices(4); + + for (label vI = 0; vI < 4; ++vI) + { + cellVerticesPair[vI] = labelPair + ( + cit->vertex(vI)->procIndex(), + cit->vertex(vI)->index() + ); + cellVertices[vI] = topoint(cit->vertex(vI)->point()); + } + + List<Foam::point> cellVerticesOld(cellVertices); + labelList oldToNew; + sortedOrder(cellVerticesPair, oldToNew); + oldToNew = invert(oldToNew.size(), oldToNew); + inplaceReorder(oldToNew, cellVerticesPair); + inplaceReorder(oldToNew, cellVertices); + +// FixedList<label, 4> globalTetCell +// ( +// cit->globallyOrderedCellVertices(gIndex) +// ); +// +// FixedList<Point, 4> cellVertices(Point(0,0,0)); +// +// forAll(globalTetCell, gvI) +// { +// label gI = globalTetCell[gvI]; +// +// cellVertices[gvI] = cit->vertex(gI)->point(); +// } + +// if (cit->hasFarPoint()) +// { +// continue; +// } + + for (label i = 0; i < 4; ++i) + { + //cells[count][i] = topoint(cit->vertex(i)->point()); + cells[count][i] = cellVertices[i]; + } + + count++; + } + + cells.setSize(count); + + cellListList[Pstream::myProcNo()] = cells; + + Pstream::gatherList(cellListList); + + if (Pstream::master()) + { + Info<< "Checking on master processor the cells of each " << nl + << "processor point list against the master cell list." << nl + << "There are " << cellListList.size() << " processors" << nl + << "The size of each processor's cell list is:" << endl; + + forAll(cellListList, cfI) + { + Info<< " Proc " << cfI << " has " << cellListList[cfI].size() + << " cells" << endl; + } + + label nMatches = 0, nMatchFoundDiffOrder = 0; + + forAll(cellListList[0], cmI) + { + const FixedList<Foam::point, 4>& masterCell = cellListList[0][cmI]; + + bool matchFound = false; + bool matchFoundDiffOrder = false; + + forAll(cellListList, cpI) + { + if (cpI == 0) + { + continue; + } + + forAll(cellListList[cpI], csI) + { + const FixedList<Foam::point, 4>& slaveCell + = cellListList[cpI][csI]; + + if (masterCell == slaveCell) + { + matchFound = true; + break; + } + else + { + label samePt = 0; + + forAll(masterCell, mI) + { + const Foam::point& mPt = masterCell[mI]; + + forAll(slaveCell, sI) + { + const Foam::point& sPt = slaveCell[sI]; + + if (mPt == sPt) + { + samePt++; + } + } + } + + if (samePt == 4) + { + matchFoundDiffOrder = true; + + Pout<< masterCell << nl << slaveCell << endl; + + break; + } + } + } + } + + if (matchFound) + { + nMatches++; + } + + if (matchFoundDiffOrder) + { + nMatchFoundDiffOrder++; + } + } + + Info<< "Found " << nMatches << " matching cells and " + << nMatchFoundDiffOrder << " matching cells with different " + << "vertex ordering"<< endl; + } +} + + +void Foam::conformalVoronoiMesh::checkDuals() +{ + List<List<Point> > pointFieldList(Pstream::nProcs()); + + List<Point> duals(number_of_finite_cells()); + + typedef CGAL::Exact_predicates_exact_constructions_kernel EK2; + typedef CGAL::Regular_triangulation_euclidean_traits_3<EK2> EK; + typedef CGAL::Cartesian_converter<baseK::Kernel, EK2> To_exact; + typedef CGAL::Cartesian_converter<EK2, baseK::Kernel> Back_from_exact; + +// PackedBoolList bPoints(number_of_finite_cells()); + +// indexDualVertices(duals, bPoints); + + label count = 0;//duals.size(); + + duals.setSize(number_of_finite_cells()); + + globalIndex gIndex(number_of_vertices()); + + for + ( + Delaunay::Finite_cells_iterator cit = finite_cells_begin(); + cit != finite_cells_end(); + ++cit + ) + { + if (cit->hasFarPoint()) + { + continue; + } + + duals[count++] = cit->circumcenter(); + +// List<labelPair> cellVerticesPair(4); +// List<Point> cellVertices(4); +// +// for (label vI = 0; vI < 4; ++vI) +// { +// cellVerticesPair[vI] = labelPair +// ( +// cit->vertex(vI)->procIndex(), +// cit->vertex(vI)->index() +// ); +// cellVertices[vI] = cit->vertex(vI)->point(); +// } +// +// labelList oldToNew; +// sortedOrder(cellVerticesPair, oldToNew); +// oldToNew = invert(oldToNew.size(), oldToNew); +// inplaceReorder(oldToNew, cellVerticesPair); +// inplaceReorder(oldToNew, cellVertices); +// +// duals[count++] = CGAL::circumcenter +// ( +// cellVertices[0], +// cellVertices[1], +// cellVertices[2], +// cellVertices[3] +// ); + +// To_exact to_exact; +// Back_from_exact back_from_exact; +// EK::Construct_circumcenter_3 exact_circumcenter = +// EK().construct_circumcenter_3_object(); +// +// duals[count++] = topoint +// ( +// back_from_exact +// ( +// exact_circumcenter +// ( +// to_exact(cit->vertex(0)->point()), +// to_exact(cit->vertex(1)->point()), +// to_exact(cit->vertex(2)->point()), +// to_exact(cit->vertex(3)->point()) +// ) +// ) +// ); + } + + Pout<< "Duals Calculated " << count << endl; + + duals.setSize(count); + + pointFieldList[Pstream::myProcNo()] = duals; + + Pstream::gatherList(pointFieldList); + + if (Pstream::master()) + { + Info<< "Checking on master processor the dual locations of each " << nl + << "processor point list against the master dual list." << nl + << "There are " << pointFieldList.size() << " processors" << nl + << "The size of each processor's dual list is:" << endl; + + forAll(pointFieldList, pfI) + { + Info<< " Proc " << pfI << " has " << pointFieldList[pfI].size() + << " duals" << endl; + } + + label nNonMatches = 0; + label nNearMatches = 0; + label nExactMatches = 0; + + forAll(pointFieldList[0], pI) + { + const Point& masterPoint = pointFieldList[0][pI]; + + bool foundMatch = false; + bool foundNearMatch = false; + + scalar minCloseness = GREAT; + Point closestPoint(0, 0, 0); + + forAll(pointFieldList, pfI) + { + if (pfI == 0) + { + continue; + } + +// label pfI = 1; + + forAll(pointFieldList[pfI], pISlave) + { + const Point& slavePoint + = pointFieldList[pfI][pISlave]; + + if (masterPoint == slavePoint) + { + foundMatch = true; + break; + } + + const scalar closeness = mag + ( + topoint(masterPoint) - topoint(slavePoint) + ); + + if (closeness < 1e-12) + { + foundNearMatch = true; + } + else + { + if (closeness < minCloseness) + { + minCloseness = closeness; + closestPoint = slavePoint; + } + } + } + + if (!foundMatch) + { + if (foundNearMatch) + { + CGAL::Gmpq x(CGAL::to_double(masterPoint.x())); + CGAL::Gmpq y(CGAL::to_double(masterPoint.y())); + CGAL::Gmpq z(CGAL::to_double(masterPoint.z())); + + std::cout<< "master = " << x << " " << y << " " << z + << std::endl; + + CGAL::Gmpq xs(CGAL::to_double(closestPoint.x())); + CGAL::Gmpq ys(CGAL::to_double(closestPoint.y())); + CGAL::Gmpq zs(CGAL::to_double(closestPoint.z())); + std::cout<< "slave = " << xs << " " << ys << " " << zs + << std::endl; + + nNearMatches++; + } + else + { + nNonMatches++; + Info<< " Closest point to " << masterPoint << " is " + << closestPoint << nl + << " Separation is " << minCloseness << endl; + + CGAL::Gmpq x(CGAL::to_double(masterPoint.x())); + CGAL::Gmpq y(CGAL::to_double(masterPoint.y())); + CGAL::Gmpq z(CGAL::to_double(masterPoint.z())); + + std::cout<< "master = " << x << " " << y << " " << z + << std::endl; + + CGAL::Gmpq xs(CGAL::to_double(closestPoint.x())); + CGAL::Gmpq ys(CGAL::to_double(closestPoint.y())); + CGAL::Gmpq zs(CGAL::to_double(closestPoint.z())); + std::cout<< "slave = " << xs << " " << ys << " " << zs + << std::endl; + } + } + else + { + nExactMatches++; + } + } + } + + Info<< "Found " << nNonMatches << " non-matching duals" << nl + << " and " << nNearMatches << " near matches" + << " and " << nExactMatches << " exact matches" << endl; + } +} + + +void Foam::conformalVoronoiMesh::checkVertices() +{ + List<pointField> pointFieldList(Pstream::nProcs()); + + pointField points(number_of_vertices()); + + labelPairHashSet duplicateVertices; + + label count = 0; + for + ( + Delaunay::Finite_vertices_iterator vit = finite_vertices_begin(); + vit != finite_vertices_end(); + ++vit + ) + { + if (duplicateVertices.found(labelPair(vit->procIndex(), vit->index()))) + { + Pout<< "DUPLICATE " << vit->procIndex() << vit->index() << endl; + } + else + { + duplicateVertices.insert(labelPair(vit->procIndex(), vit->index())); + } + + points[count++] = topoint(vit->point()); + } + + pointFieldList[Pstream::myProcNo()] = points; + + Pstream::gatherList(pointFieldList); + + OFstream str("missingPoints.obj"); + + if (Pstream::master()) + { + Info<< "Checking on master processor the point locations of each " << nl + << "processor point list against the master point list." << nl + << "There are " << pointFieldList.size() << " processors" << nl + << "The size of each processor's point list is:" << endl; + + forAll(pointFieldList, pfI) + { + Info<< " Proc " << pfI << " has " << pointFieldList[pfI].size() + << " points" << endl; + } + + label nNonMatches = 0; + + forAll(pointFieldList[0], pI) + { + const Foam::point& masterPoint = pointFieldList[0][pI]; + + forAll(pointFieldList, pfI) + { + if (pI == 0) + { + continue; + } + + bool foundMatch = false; + + forAll(pointFieldList[pfI], pISlave) + { + const Foam::point& slavePoint + = pointFieldList[pfI][pISlave]; + + if (masterPoint == slavePoint) + { + foundMatch = true; + break; + } + } + + if (!foundMatch) + { + Info<< " Proc " << pfI << " Master != Slave -> " + << masterPoint << endl; + + meshTools::writeOBJ(str, masterPoint); + + nNonMatches++; + } + } + } + + Info<< "Found a total of " << nNonMatches << " non-matching points" + << endl; + } +} + + +void Foam::conformalVoronoiMesh::calcDualMesh +( + pointField& points, + labelList& boundaryPts, + faceList& faces, + labelList& owner, + labelList& neighbour, + wordList& patchTypes, + wordList& patchNames, + labelList& patchSizes, + labelList& patchStarts, + labelList& procNeighbours, + pointField& cellCentres, + labelList& cellToDelaunayVertex, + labelListList& patchToDelaunayVertex, + PackedBoolList& boundaryFacesToRemove +) +{ + timeCheck("Start calcDualMesh"); + +// if (debug) +// { +// Pout<< nl << "Perfoming some checks . . ." << nl << nl +// << "Total number of vertices = " << number_of_vertices() << nl +// << "Total number of cells = " << number_of_finite_cells() +// << endl; +// +// checkVertices(); +// checkCells(); +// checkDuals(); +// +// Info<< nl << "Finished checks" << nl << endl; +// } + + setVertexSizeAndAlignment(); + + timeCheck("After setVertexSizeAndAlignment"); + + indexDualVertices(points, boundaryPts); + + { + Info<< nl << "Merging identical points" << endl; + + // There is no guarantee that a merge of close points is no-risk + mergeIdenticalDualVertices(points, boundaryPts); + } + + // Final dual face and owner neighbour construction + + timeCheck("Before createFacesOwnerNeighbourAndPatches"); + + createFacesOwnerNeighbourAndPatches + ( + faces, + owner, + neighbour, + patchTypes, + patchNames, + patchSizes, + patchStarts, + procNeighbours, + patchToDelaunayVertex, // from patch face to Delaunay vertex (slavePp) + boundaryFacesToRemove, + false + ); + + // deferredCollapseFaceSet(owner, neighbour, deferredCollapseFaces); + + cellCentres = allPoints(); + + cellToDelaunayVertex = removeUnusedCells(owner, neighbour); + + cellCentres = pointField(cellCentres, cellToDelaunayVertex); + + removeUnusedPoints(faces, points, boundaryPts); + + timeCheck("End of calcDualMesh"); +} + + +void Foam::conformalVoronoiMesh::calcTetMesh +( + pointField& points, + labelList& pointToDelaunayVertex, + faceList& faces, + labelList& owner, + labelList& neighbour, + wordList& patchTypes, + wordList& patchNames, + labelList& patchSizes, + labelList& patchStarts +) +{ + labelList vertexMap(number_of_vertices()); + + label vertI = 0; + + points.setSize(number_of_vertices()); + pointToDelaunayVertex.setSize(number_of_vertices()); + + for + ( + Delaunay::Finite_vertices_iterator vit = finite_vertices_begin(); + vit != finite_vertices_end(); + ++vit + ) + { + if (vit->internalPoint() || vit->boundaryPoint()) + { + vertexMap[vit->index()] = vertI; + points[vertI] = topoint(vit->point()); + pointToDelaunayVertex[vertI] = vit->index(); + vertI++; + } + } + + points.setSize(vertI); + pointToDelaunayVertex.setSize(vertI); + + label cellI = 0; + + for + ( + Delaunay::Finite_cells_iterator cit = finite_cells_begin(); + cit != finite_cells_end(); + ++cit + ) + { + if (cit->internalOrBoundaryDualVertex()) + { + cit->cellIndex() = cellI++; + } + else + { + cit->cellIndex() = Cb::ctFar; + } + } + + patchNames = geometryToConformTo_.patchNames(); + + patchNames.setSize(patchNames.size() + 1); + + patchNames[patchNames.size() - 1] = "cvMesh_defaultPatch"; + patchTypes.setSize(patchNames.size(), wallPolyPatch::typeName); + + label nPatches = patchNames.size(); + + List<DynamicList<face> > patchFaces(nPatches, DynamicList<face>(0)); + + List<DynamicList<label> > patchOwners(nPatches, DynamicList<label>(0)); + + faces.setSize(number_of_finite_facets()); + + owner.setSize(number_of_finite_facets()); + + neighbour.setSize(number_of_finite_facets()); + + label faceI = 0; + + labelList verticesOnTriFace(3, -1); + + face newFace(verticesOnTriFace); + + for + ( + Delaunay::Finite_facets_iterator fit = finite_facets_begin(); + fit != finite_facets_end(); + ++fit + ) + { + const Cell_handle c1(fit->first); + const int oppositeVertex = fit->second; + const Cell_handle c2(c1->neighbor(oppositeVertex)); + + if (c1->hasFarPoint() && c2->hasFarPoint()) + { + // Both tets are outside, skip + continue; + } + + label c1I = c1->cellIndex(); + label c2I = c2->cellIndex(); + + label ownerCell = -1; + label neighbourCell = -1; + + for (label i = 0; i < 3; i++) + { + verticesOnTriFace[i] = vertexMap + [ + c1->vertex(vertex_triple_index(oppositeVertex, i))->index() + ]; + } + + newFace = face(verticesOnTriFace); + + if (c1->hasFarPoint() || c2->hasFarPoint()) + { + // Boundary face... + if (c1->hasFarPoint()) + { + //... with c1 outside + ownerCell = c2I; + } + else + { + // ... with c2 outside + ownerCell = c1I; + + reverse(newFace); + } + + label patchIndex = geometryToConformTo_.findPatch + ( + newFace.centre(points) + ); + + if (patchIndex == -1) + { + patchIndex = patchNames.size() - 1; + + WarningIn("Foam::conformalVoronoiMesh::calcTetMesh") + << "Tet face centre at " << nl + << newFace.centre(points) << nl + << "did not find a surface patch. Adding to " + << patchNames[patchIndex] + << endl; + } + + patchFaces[patchIndex].append(newFace); + patchOwners[patchIndex].append(ownerCell); + } + else + { + // Internal face... + if (c1I < c2I) + { + // ...with c1 as the ownerCell + ownerCell = c1I; + neighbourCell = c2I; + + reverse(newFace); + } + else + { + // ...with c2 as the ownerCell + ownerCell = c2I; + neighbourCell = c1I; + } + + faces[faceI] = newFace; + owner[faceI] = ownerCell; + neighbour[faceI] = neighbourCell; + faceI++; + } + } + + label nInternalFaces = faceI; + + faces.setSize(nInternalFaces); + owner.setSize(nInternalFaces); + neighbour.setSize(nInternalFaces); + + sortFaces(faces, owner, neighbour); + +// addPatches +// ( +// nInternalFaces, +// faces, +// owner, +// patchSizes, +// patchStarts, +// patchFaces, +// patchOwners +// ); +} + + +void Foam::conformalVoronoiMesh::mergeIdenticalDualVertices +( + const pointField& pts, + const labelList& boundaryPts +) +{ + // Assess close points to be merged + + label nPtsMerged = 0; + label nPtsMergedSum = 0; + + do + { + Map<label> dualPtIndexMap; + + nPtsMerged = mergeIdenticalDualVertices + ( + pts, + boundaryPts, + dualPtIndexMap + ); + + reindexDualVertices(dualPtIndexMap); + + reduce(nPtsMerged, sumOp<label>()); + + nPtsMergedSum += nPtsMerged; + + } while (nPtsMerged > 0); + + if (nPtsMergedSum > 0) + { + Info<< " Merged " << nPtsMergedSum << " points " << endl; + } +} + + +Foam::label Foam::conformalVoronoiMesh::mergeIdenticalDualVertices +( + const pointField& pts, + const labelList& boundaryPts, + Map<label>& dualPtIndexMap +) const +{ + label nPtsMerged = 0; + + for + ( + Delaunay::Finite_facets_iterator fit = finite_facets_begin(); + fit != finite_facets_end(); + ++fit + ) + { + const Cell_handle c1(fit->first); + const int oppositeVertex = fit->second; + const Cell_handle c2(c1->neighbor(oppositeVertex)); + + if (is_infinite(c1) || is_infinite(c2)) + { + continue; + } + + label& c1I = c1->cellIndex(); + label& c2I = c2->cellIndex(); + + if ((c1I != c2I) && !c1->hasFarPoint() && !c2->hasFarPoint()) + { + const Foam::point& p1 = pts[c1I]; + const Foam::point& p2 = pts[c2I]; + + if (p1 == p2) + { + if (c1I < c2I) + { + dualPtIndexMap.insert(c1I, c1I); + dualPtIndexMap.insert(c2I, c1I); + } + else + { + dualPtIndexMap.insert(c1I, c2I); + dualPtIndexMap.insert(c2I, c2I); + } + + nPtsMerged++; + } + } + } + + if (debug) + { + Info<< "mergeIdenticalDualVertices:" << endl + << " zero-length edges : " + << returnReduce(nPtsMerged, sumOp<label>()) << endl + << endl; + } + + return nPtsMerged; +} + + +//void Foam::conformalVoronoiMesh::smoothSurface +//( +// pointField& pts, +// const labelList& boundaryPts +//) +//{ +// label nCollapsedFaces = 0; +// +// label iterI = 0; +// +// do +// { +// Map<label> dualPtIndexMap; +// +// nCollapsedFaces = smoothSurfaceDualFaces +// ( +// pts, +// boundaryPts, +// dualPtIndexMap +// ); +// +// reduce(nCollapsedFaces, sumOp<label>()); +// +// reindexDualVertices(dualPtIndexMap); +// +// mergeIdenticalDualVertices(pts, boundaryPts); +// +// if (nCollapsedFaces > 0) +// { +// Info<< " Collapsed " << nCollapsedFaces << " boundary faces" +// << endl; +// } +// +// if (++iterI > cvMeshControls().maxCollapseIterations()) +// { +// Info<< " maxCollapseIterations reached, stopping collapse" +// << endl; +// +// break; +// } +// +// } while (nCollapsedFaces > 0); +// +// // Force all points of boundary faces to be on the surface +//// for +//// ( +//// Delaunay::Finite_cells_iterator cit = finite_cells_begin(); +//// cit != finite_cells_end(); +//// ++cit +//// ) +//// { +//// label ptI = cit->cellIndex(); +//// +//// label fC = cit->filterCount(); +//// +//// if (fC > cvMeshControls().filterCountSkipThreshold()) +//// { +//// // This vertex has been limited too many times, skip +//// continue; +//// } +//// +//// // Only cells with indices > -1 are valid +//// if (ptI > -1) +//// { +//// if (boundaryPts[ptI] != -1) +//// { +//// Foam::point& pt = pts[ptI]; +//// +//// pointIndexHit surfHit; +//// label hitSurface; +//// +//// geometryToConformTo_.findSurfaceNearest +//// ( +//// pt, +//// sqr(GREAT), +//// surfHit, +//// hitSurface +//// ); +//// +//// if (surfHit.hit()) +//// { +//// pt += (surfHit.hitPoint() - pt) +//// *pow +//// ( +//// cvMeshControls().filterErrorReductionCoeff(), +//// fC +//// ); +//// } +//// } +//// } +//// } +//// +//// mergeCloseDualVertices(pts, boundaryPts); +//} +// +// +//Foam::label Foam::conformalVoronoiMesh::smoothSurfaceDualFaces +//( +// pointField& pts, +// const labelList& boundaryPts, +// Map<label>& dualPtIndexMap +//) const +//{ +// label nCollapsedFaces = 0; +// +// const scalar cosPerpendicularToleranceAngle = cos +// ( +// degToRad(cvMeshControls().surfaceStepFaceAngle()) +// ); +// +// for +// ( +// Delaunay::Finite_edges_iterator eit = finite_edges_begin(); +// eit != finite_edges_end(); +// ++eit +// ) +// { +// Cell_circulator ccStart = incident_cells(*eit); +// Cell_circulator cc = ccStart; +// +// bool skipFace = false; +// +// do +// { +// if (dualPtIndexMap.found(cc->cellIndex())) +// { +// // One of the points of this face has already been +// // collapsed this sweep, leave for next sweep +// +// skipFace = true; +// +// break; +// } +// +// } while (++cc != ccStart); +// +// if (skipFace) +// { +// continue; +// } +// +// if (isBoundaryDualFace(eit)) +// { +// face dualFace = buildDualFace(eit); +// +// if (dualFace.size() < 3) +// { +// // This face has been collapsed already +// continue; +// } +// +// label maxFC = maxFilterCount(eit); +// +// if (maxFC > cvMeshControls().filterCountSkipThreshold()) +// { +// // A vertex on this face has been limited too many +// // times, skip +// continue; +// } +// +// Cell_handle c = eit->first; +// Vertex_handle vA = c->vertex(eit->second); +// Vertex_handle vB = c->vertex(eit->third); +// +// if +// ( +// vA->internalBoundaryPoint() && vA->surfacePoint() +// && vB->externalBoundaryPoint() && vB->surfacePoint() +// ) +// { +// if (vA->index() == vB->index() - 1) +// { +// continue; +// } +// } +// else if +// ( +// vA->externalBoundaryPoint() && vA->surfacePoint() +// && vB->internalBoundaryPoint() && vB->surfacePoint() +// ) +// { +// if (vA->index() == vB->index() + 1) +// { +// continue; +// } +// } +//// else if +//// ( +//// vA->internalBoundaryPoint() && vA->featureEdgePoint() +//// && vB->externalBoundaryPoint() && vB->featureEdgePoint() +//// ) +//// { +//// if (vA->index() == vB->index() - 1) +//// { +//// continue; +//// } +//// } +//// else if +//// ( +//// vA->externalBoundaryPoint() && vA->featureEdgePoint() +//// && vB->internalBoundaryPoint() && vB->featureEdgePoint() +//// ) +//// { +//// if (vA->index() == vB->index() + 1) +//// { +//// continue; +//// } +//// } +//// else if +//// ( +//// vA->internalBoundaryPoint() && vA->featurePoint() +//// && vB->externalBoundaryPoint() && vB->featurePoint() +//// ) +//// { +//// if (vA->index() == vB->index() - 1) +//// { +//// continue; +//// } +//// } +//// else if +//// ( +//// vA->externalBoundaryPoint() && vA->featurePoint() +//// && vB->internalBoundaryPoint() && vB->featurePoint() +//// ) +//// { +//// if (vA->index() == vB->index() + 1) +//// { +//// continue; +//// } +//// } +// +// +// if ((faceNormal & surfaceNormal) < cosPerpendicularToleranceAngle) +// { +// scalar targetFaceSize = averageAnyCellSize(vA, vB); +// +// // Selecting faces to collapse based on angle to +// // surface, so set collapseSizeLimitCoeff to GREAT to +// // allow collapse of all faces +// +// faceCollapseMode mode = collapseFace +// ( +// dualFace, +// pts, +// boundaryPts, +// dualPtIndexMap, +// targetFaceSize, +// GREAT, +// maxFC +// ); +// +// if (mode == fcmPoint || mode == fcmEdge) +// { +// nCollapsedFaces++; +// } +// } +// } +// } +// +// return nCollapsedFaces; +//} + + +void Foam::conformalVoronoiMesh::deferredCollapseFaceSet +( + labelList& owner, + labelList& neighbour, + const HashSet<labelPair, labelPair::Hash<> >& deferredCollapseFaces +) const +{ + DynamicList<label> faceLabels; + + forAll(neighbour, nI) + { + if (deferredCollapseFaces.found(Pair<label>(owner[nI], neighbour[nI]))) + { + faceLabels.append(nI); + } + } + + Pout<< "facesToCollapse" << nl << faceLabels << endl; +} + + +Foam::autoPtr<Foam::polyMesh> +Foam::conformalVoronoiMesh::createPolyMeshFromPoints +( + const pointField& pts +) const +{ + faceList faces; + labelList owner; + labelList neighbour; + wordList patchTypes; + wordList patchNames; + labelList patchSizes; + labelList patchStarts; + labelList procNeighbours; + pointField cellCentres; + labelListList patchToDelaunayVertex; + PackedBoolList boundaryFacesToRemove; + + timeCheck("Start of checkPolyMeshQuality"); + + Info<< nl << "Creating polyMesh to assess quality" << endl; + + createFacesOwnerNeighbourAndPatches + ( + faces, + owner, + neighbour, + patchTypes, + patchNames, + patchSizes, + patchStarts, + procNeighbours, + patchToDelaunayVertex, + boundaryFacesToRemove, + false + ); + + //createCellCentres(cellCentres); + cellCentres = allPoints(); + + labelList cellToDelaunayVertex(removeUnusedCells(owner, neighbour)); + cellCentres = pointField(cellCentres, cellToDelaunayVertex); + + autoPtr<polyMesh> meshPtr + ( + new polyMesh + ( + IOobject + ( + "cvMesh_temporary", + runTime_.timeName(), + runTime_, + IOobject::NO_READ, + IOobject::NO_WRITE + ), + xferCopy(pts), + xferMove(faces), + xferMove(owner), + xferMove(neighbour) + ) + ); + + polyMesh& pMesh = meshPtr(); + + List<polyPatch*> patches(patchStarts.size()); + + label nValidPatches = 0; + + forAll(patches, p) + { + if (patchTypes[p] == processorPolyPatch::typeName) + { + // Do not create empty processor patches + if (patchSizes[p] > 0) + { + patches[nValidPatches] = new processorPolyPatch + ( + patchNames[p], + patchSizes[p], + patchStarts[p], + nValidPatches, + pMesh.boundaryMesh(), + Pstream::myProcNo(), + procNeighbours[p], + coupledPolyPatch::COINCIDENTFULLMATCH + ); + + nValidPatches++; + } + } + else + { + patches[nValidPatches] = polyPatch::New + ( + patchTypes[p], + patchNames[p], + patchSizes[p], + patchStarts[p], + nValidPatches, + pMesh.boundaryMesh() + ).ptr(); + + nValidPatches++; + } + } + + patches.setSize(nValidPatches); + + pMesh.addPatches(patches); + + // Info<< "ADDPATCHES NOT IN PARALLEL" << endl; + + // forAll(patches, p) + // { + // patches[p] = new polyPatch + // ( + // patchNames[p], + // patchSizes[p], + // patchStarts[p], + // p, + // pMesh.boundaryMesh() + // ); + // } + + // pMesh.addPatches(patches, false); + + // pMesh.overrideCellCentres(cellCentres); + + return meshPtr; +} + + +void Foam::conformalVoronoiMesh::checkCellSizing() +{ + Info<< "Checking cell sizes..."<< endl; + + timeCheck("Start of Cell Sizing"); + + labelList boundaryPts(number_of_finite_cells(), -1); + pointField ptsField; + + indexDualVertices(ptsField, boundaryPts); + + // Merge close dual vertices. + mergeIdenticalDualVertices(ptsField, boundaryPts); + + autoPtr<polyMesh> meshPtr = createPolyMeshFromPoints(ptsField); + const polyMesh& pMesh = meshPtr(); + + //pMesh.write(); + + // Find cells with poor quality + DynamicList<label> checkFaces(identity(pMesh.nFaces())); + labelHashSet wrongFaces(pMesh.nFaces()/100); + + Info<< "Running checkMesh on mesh with " << pMesh.nCells() + << " cells "<< endl; + + const dictionary& dict + = cvMeshControls().cvMeshDict().subDict("meshQualityControls"); + + const scalar maxNonOrtho = readScalar(dict.lookup("maxNonOrtho", true)); + + label nWrongFaces = 0; + + if (maxNonOrtho < 180.0 - SMALL) + { + polyMeshGeometry::checkFaceDotProduct + ( + false, + maxNonOrtho, + pMesh, + pMesh.cellCentres(), + pMesh.faceAreas(), + checkFaces, + List<labelPair>(), + &wrongFaces + ); + + label nNonOrthogonal = returnReduce(wrongFaces.size(), sumOp<label>()); + + Info<< " non-orthogonality > " << maxNonOrtho + << " degrees : " << nNonOrthogonal << endl; + + nWrongFaces += nNonOrthogonal; + } + + labelHashSet protrudingCells = findOffsetPatchFaces(pMesh, 0.25); + + label nProtrudingCells = protrudingCells.size(); + + Info<< " protruding/intruding cells : " << nProtrudingCells << endl; + + nWrongFaces += nProtrudingCells; + +// motionSmoother::checkMesh +// ( +// false, +// pMesh, +// cvMeshControls().cvMeshDict().subDict("meshQualityControls"), +// checkFaces, +// wrongFaces +// ); + + Info<< " Found total of " << nWrongFaces << " bad faces" << endl; + + { + labelHashSet cellsToResizeMap(pMesh.nFaces()/100); + + // Find cells that are attached to the faces in wrongFaces. + forAllConstIter(labelHashSet, wrongFaces, iter) + { + const label faceOwner = pMesh.faceOwner()[iter.key()]; + const label faceNeighbour = pMesh.faceNeighbour()[iter.key()]; + + if (!cellsToResizeMap.found(faceOwner)) + { + cellsToResizeMap.insert(faceOwner); + } + + if (!cellsToResizeMap.found(faceNeighbour)) + { + cellsToResizeMap.insert(faceNeighbour); + } + } + + cellsToResizeMap += protrudingCells; + + pointField cellsToResize(cellsToResizeMap.size()); + + label count = 0; + for (label cellI = 0; cellI < pMesh.nCells(); ++cellI) + { + if (cellsToResizeMap.found(cellI)) + { + cellsToResize[count++] = pMesh.cellCentres()[cellI]; + } + } + + Info<< " DISABLED: Automatically re-sizing " << cellsToResize.size() + << " cells that are attached to the bad faces: " << endl; + + //cellSizeControl_.setCellSizes(cellsToResize); + } + + timeCheck("End of Cell Sizing"); + + Info<< "Finished checking cell sizes"<< endl; +} + + +Foam::labelHashSet Foam::conformalVoronoiMesh::findOffsetPatchFaces +( + const polyMesh& mesh, + const scalar allowedOffset +) const +{ + timeCheck("Start findRemainingProtrusionSet"); + + const polyBoundaryMesh& patches = mesh.boundaryMesh(); + + cellSet offsetBoundaryCells + ( + mesh, + "cvMesh_protrudingCells", + mesh.nCells()/1000 + ); + + forAll(patches, patchI) + { + const polyPatch& patch = patches[patchI]; + + const faceList& localFaces = patch.localFaces(); + const pointField& localPoints = patch.localPoints(); + + const labelList& fCell = patch.faceCells(); + + forAll(localFaces, pLFI) + { + const face& f = localFaces[pLFI]; + + const Foam::point& faceCentre = f.centre(localPoints); + + const scalar targetSize = targetCellSize(faceCentre); + + pointIndexHit pHit; + label surfHit = -1; + + geometryToConformTo_.findSurfaceNearest + ( + faceCentre, + sqr(targetSize), + pHit, + surfHit + ); + + if + ( + pHit.hit() + && (mag(pHit.hitPoint() - faceCentre) > allowedOffset*targetSize) + ) + { + offsetBoundaryCells.insert(fCell[pLFI]); + } + } + } + + if (cvMeshControls().objOutput()) + { + offsetBoundaryCells.write(); + } + + return offsetBoundaryCells; +} + + +Foam::labelHashSet Foam::conformalVoronoiMesh::checkPolyMeshQuality +( + const pointField& pts +) const +{ + autoPtr<polyMesh> meshPtr = createPolyMeshFromPoints(pts); + polyMesh& pMesh = meshPtr(); + + timeCheck("polyMesh created, checking quality"); + + labelHashSet wrongFaces(pMesh.nFaces()/100); + + DynamicList<label> checkFaces(pMesh.nFaces()); + + const vectorField& fAreas = pMesh.faceAreas(); + + scalar faceAreaLimit = SMALL; + + forAll(fAreas, fI) + { + if (mag(fAreas[fI]) > faceAreaLimit) + { + checkFaces.append(fI); + } + } + + Info<< nl << "Excluding " + << returnReduce(fAreas.size() - checkFaces.size(), sumOp<label>()) + << " faces from check, < " << faceAreaLimit << " area" << endl; + + motionSmoother::checkMesh + ( + false, + pMesh, + cvMeshControls().cvMeshDict().subDict("meshQualityControls"), + checkFaces, + wrongFaces + ); + + { + // Check for cells with more than 1 but fewer than 4 faces + label nInvalidPolyhedra = 0; + + const cellList& cells = pMesh.cells(); + + forAll(cells, cI) + { + if (cells[cI].size() < 4 && cells[cI].size() > 0) + { + // Pout<< "cell " << cI << " " << cells[cI] + // << " has " << cells[cI].size() << " faces." + // << endl; + + nInvalidPolyhedra++; + + forAll(cells[cI], cFI) + { + wrongFaces.insert(cells[cI][cFI]); + } + } + } + + Info<< " cells with more than 1 but fewer than 4 faces : " + << returnReduce(nInvalidPolyhedra, sumOp<label>()) + << endl; + + // Check for cells with one internal face only + + labelList nInternalFaces(pMesh.nCells(), 0); + + for (label fI = 0; fI < pMesh.nInternalFaces(); fI++) + { + nInternalFaces[pMesh.faceOwner()[fI]]++; + nInternalFaces[pMesh.faceNeighbour()[fI]]++; + } + + const polyBoundaryMesh& patches = pMesh.boundaryMesh(); + + forAll(patches, patchI) + { + if (patches[patchI].coupled()) + { + const labelUList& owners = patches[patchI].faceCells(); + + forAll(owners, i) + { + nInternalFaces[owners[i]]++; + } + } + } + + label oneInternalFaceCells = 0; + + forAll(nInternalFaces, cI) + { + if (nInternalFaces[cI] <= 1) + { + oneInternalFaceCells++; + + forAll(cells[cI], cFI) + { + wrongFaces.insert(cells[cI][cFI]); + } + } + } + + Info<< " cells with with zero or one non-boundary face : " + << returnReduce(oneInternalFaceCells, sumOp<label>()) + << endl; + } + + + PackedBoolList ptToBeLimited(pts.size(), false); + + forAllConstIter(labelHashSet, wrongFaces, iter) + { + const face f = pMesh.faces()[iter.key()]; + + forAll(f, fPtI) + { + ptToBeLimited[f[fPtI]] = true; + } + } + + // // Limit connected cells + + // labelHashSet limitCells(pMesh.nCells()/100); + + // const labelListList& ptCells = pMesh.pointCells(); + + // forAllConstIter(labelHashSet, wrongFaces, iter) + // { + // const face f = pMesh.faces()[iter.key()]; + + // forAll(f, fPtI) + // { + // label ptI = f[fPtI]; + + // const labelList& pC = ptCells[ptI]; + + // forAll(pC, pCI) + // { + // limitCells.insert(pC[pCI]); + // } + // } + // } + + // const labelListList& cellPts = pMesh.cellPoints(); + + // forAllConstIter(labelHashSet, limitCells, iter) + // { + // label cellI = iter.key(); + + // const labelList& cP = cellPts[cellI]; + + // forAll(cP, cPI) + // { + // ptToBeLimited[cP[cPI]] = true; + // } + // } + + + // Apply Delaunay cell filterCounts and determine the maximum + // overall filterCount + + label maxFilterCount = 0; + + for + ( + Delaunay::Finite_cells_iterator cit = finite_cells_begin(); + cit != finite_cells_end(); + ++cit + ) + { + label cI = cit->cellIndex(); + + if (cI >= 0) + { + if (ptToBeLimited[cI] == true) + { + cit->filterCount()++; + } + + if (cit->filterCount() > maxFilterCount) + { + maxFilterCount = cit->filterCount(); + } + } + } + + Info<< nl << "Maximum number of filter limits applied: " + << returnReduce(maxFilterCount, maxOp<label>()) << endl; + + return wrongFaces; +} + + +void Foam::conformalVoronoiMesh::indexDualVertices +( + pointField& pts, + labelList& boundaryPts +) +{ + // Indexing Delaunay cells, which are the dual vertices + + this->resetCellCount(); + + pts.setSize(number_of_finite_cells()); + + boundaryPts.setSize(number_of_finite_cells(), -1); + + for + ( + Delaunay::Finite_cells_iterator cit = finite_cells_begin(); + cit != finite_cells_end(); + ++cit + ) + { +// if (tetrahedron(cit).volume() == 0) +// { +// Pout<< "ZERO VOLUME TET" << endl; +// Pout<< cit->info(); +// Pout<< "Dual = " << cit->dual(); +// } + + if (!cit->hasFarPoint()) + { + cit->cellIndex() = getNewCellIndex(); + + // For nearly coplanar Delaunay cells that are present on different + // processors the result of the circumcentre calculation depends on + // the ordering of the vertices, so synchronise it across processors + + if (Pstream::parRun() && cit->parallelDualVertex()) + { + typedef CGAL::Exact_predicates_exact_constructions_kernel Exact; + typedef CGAL::Point_3<Exact> ExactPoint; + + List<labelPair> cellVerticesPair(4); + List<ExactPoint> cellVertices(4); + + for (label vI = 0; vI < 4; ++vI) + { + cellVerticesPair[vI] = labelPair + ( + cit->vertex(vI)->procIndex(), + cit->vertex(vI)->index() + ); + + cellVertices[vI] = ExactPoint + ( + cit->vertex(vI)->point().x(), + cit->vertex(vI)->point().y(), + cit->vertex(vI)->point().z() + ); + } + + // Sort the vertices so that they will be in the same order on + // each processor + labelList oldToNew; + sortedOrder(cellVerticesPair, oldToNew); + oldToNew = invert(oldToNew.size(), oldToNew); + inplaceReorder(oldToNew, cellVertices); + + ExactPoint synchronisedDual = CGAL::circumcenter + ( + cellVertices[0], + cellVertices[1], + cellVertices[2], + cellVertices[3] + ); + + pts[cit->cellIndex()] = Foam::point + ( + CGAL::to_double(synchronisedDual.x()), + CGAL::to_double(synchronisedDual.y()), + CGAL::to_double(synchronisedDual.z()) + ); + } + else + { + pts[cit->cellIndex()] = cit->dual(); + } + + if (cit->boundaryDualVertex()) + { + if (cit->featureEdgeDualVertex()) + { + boundaryPts[cit->cellIndex()] = 1; + } + else + { + boundaryPts[cit->cellIndex()] = 0; + } + } + } + else + { + cit->cellIndex() = Cb::ctFar; + } + } + + pts.setSize(this->cellCount()); + + boundaryPts.setSize(this->cellCount()); +} + + +void Foam::conformalVoronoiMesh::reindexDualVertices +( + const Map<label>& dualPtIndexMap +) +{ + for + ( + Delaunay::Finite_cells_iterator cit = finite_cells_begin(); + cit != finite_cells_end(); + ++cit + ) + { + if (dualPtIndexMap.found(cit->cellIndex())) + { + cit->cellIndex() = dualPtIndexMap[cit->cellIndex()]; + } + } +} + + +Foam::label Foam::conformalVoronoiMesh::createPatchInfo +( + wordList& patchNames, + wordList& patchTypes, + labelList& procNeighbours +) const +{ + patchNames = geometryToConformTo_.patchNames(); + patchTypes.setSize(patchNames.size() + 1, wallPolyPatch::typeName); + procNeighbours.setSize(patchNames.size() + 1, -1); + + patchNames.setSize(patchNames.size() + 1); + + label defaultPatchIndex = patchNames.size() - 1; + + patchTypes[defaultPatchIndex] = wallPolyPatch::typeName; + procNeighbours[defaultPatchIndex] = -1; + patchNames[defaultPatchIndex] = "cvMesh_defaultPatch"; + + label nProcPatches = 0; + + if (Pstream::parRun()) + { + List<boolList> procUsedList + ( + Pstream::nProcs(), + boolList(Pstream::nProcs(), false) + ); + + boolList& procUsed = procUsedList[Pstream::myProcNo()]; + + // Determine which processor patches are required + for + ( + Delaunay::Finite_vertices_iterator vit = finite_vertices_begin(); + vit != finite_vertices_end(); + vit++ + ) + { + // This test is not sufficient if one of the processors does + // not receive a referred vertex from another processor, but does + // send one to the other processor. + if (vit->referred()) + { + procUsed[vit->procIndex()] = true; + } + } + + // Because the previous test was insufficient, combine the lists. + Pstream::gatherList(procUsedList); + Pstream::scatterList(procUsedList); + + forAll(procUsedList, procI) + { + if (procI != Pstream::myProcNo()) + { + if (procUsedList[procI][Pstream::myProcNo()]) + { + procUsed[procI] = true; + } + } + } + + forAll(procUsed, pUI) + { + if (procUsed[pUI]) + { + nProcPatches++; + } + } + + label nNonProcPatches = patchNames.size(); + + patchNames.setSize(nNonProcPatches + nProcPatches); + patchTypes.setSize(nNonProcPatches + nProcPatches); + procNeighbours.setSize(nNonProcPatches + nProcPatches, -1); + + label procAddI = 0; + + forAll(procUsed, pUI) + { + if (procUsed[pUI]) + { + patchTypes[nNonProcPatches + procAddI] = + processorPolyPatch::typeName; + + patchNames[nNonProcPatches + procAddI] = + "procBoundary" + + name(Pstream::myProcNo()) + + "to" + + name(pUI); + + procNeighbours[nNonProcPatches + procAddI] = pUI; + + procAddI++; + } + } + } + + return defaultPatchIndex; +} + + +void Foam::conformalVoronoiMesh::createFacesOwnerNeighbourAndPatches +( + faceList& faces, + labelList& owner, + labelList& neighbour, + wordList& patchTypes, + wordList& patchNames, + labelList& patchSizes, + labelList& patchStarts, + labelList& procNeighbours, + labelListList& patchPointPairSlaves, + PackedBoolList& boundaryFacesToRemove, + bool includeEmptyPatches +) const +{ + const label defaultPatchIndex = createPatchInfo + ( + patchNames, + patchTypes, + procNeighbours + ); + + const label nPatches = patchNames.size(); + + List<DynamicList<face> > patchFaces(nPatches, DynamicList<face>(0)); + List<DynamicList<label> > patchOwners(nPatches, DynamicList<label>(0)); + // Per patch face the index of the slave node of the point pair + List<DynamicList<label> > patchPPSlaves(nPatches, DynamicList<label>(0)); + + List<DynamicList<bool> > indirectPatchFace(nPatches, DynamicList<bool>(0)); + + faces.setSize(number_of_finite_edges()); + owner.setSize(number_of_finite_edges()); + neighbour.setSize(number_of_finite_edges()); + + labelPairPairDynListList procPatchSortingIndex(nPatches); + + label dualFaceI = 0; + + for + ( + Delaunay::Finite_edges_iterator eit = finite_edges_begin(); + eit != finite_edges_end(); + ++eit + ) + { + Cell_handle c = eit->first; + Vertex_handle vA = c->vertex(eit->second); + Vertex_handle vB = c->vertex(eit->third); + + if + ( + (vA->internalOrBoundaryPoint() && !vA->referred()) + || (vB->internalOrBoundaryPoint() && !vB->referred()) + ) + { + face newDualFace = buildDualFace(eit); + + if (newDualFace.size() >= 3) + { + label own = -1; + label nei = -1; + + if (ownerAndNeighbour(vA, vB, own, nei)) + { + reverse(newDualFace); + } + + if (nei == -1) + { + // boundary face + + pointFromPoint ptA = topoint(vA->point()); + pointFromPoint ptB = topoint(vB->point()); + + label patchIndex = -1; + + if (isProcBoundaryEdge(eit)) + { + // One (and only one) of the points is an internal + // point from another processor + + label procIndex = max(vA->procIndex(), vB->procIndex()); + + patchIndex = max + ( + findIndex(procNeighbours, vA->procIndex()), + findIndex(procNeighbours, vB->procIndex()) + ); + + // The lower processor index is the owner of the + // two for the purpose of sorting the patch faces. + + if (Pstream::myProcNo() < procIndex) + { + // Use this processor's vertex index as the master + // for sorting + + DynamicList<Pair<labelPair> >& sortingIndex = + procPatchSortingIndex[patchIndex]; + + if (vB->internalOrBoundaryPoint() && vB->referred()) + { + sortingIndex.append + ( + Pair<labelPair> + ( + labelPair(vA->index(), vA->procIndex()), + labelPair(vB->index(), vB->procIndex()) + ) + ); + } + else + { + sortingIndex.append + ( + Pair<labelPair> + ( + labelPair(vB->index(), vB->procIndex()), + labelPair(vA->index(), vA->procIndex()) + ) + ); + } + } + else + { + // Use the other processor's vertex index as the + // master for sorting + + DynamicList<Pair<labelPair> >& sortingIndex = + procPatchSortingIndex[patchIndex]; + + if (vA->internalOrBoundaryPoint() && vA->referred()) + { + sortingIndex.append + ( + Pair<labelPair> + ( + labelPair(vA->index(), vA->procIndex()), + labelPair(vB->index(), vB->procIndex()) + ) + ); + } + else + { + sortingIndex.append + ( + Pair<labelPair> + ( + labelPair(vB->index(), vB->procIndex()), + labelPair(vA->index(), vA->procIndex()) + ) + ); + } + } + +// Pout<< ptA << " " << ptB +// << " proc indices " +// << vA->procIndex() << " " << vB->procIndex() +// << " indices " << vA->index() +// << " " << vB->index() +// << " my proc " << Pstream::myProcNo() +// << " addedIndex " +// << procPatchSortingIndex[patchIndex].last() +// << endl; + } + else + { + patchIndex = geometryToConformTo_.findPatch(ptA, ptB); + } + + if (patchIndex == -1) + { + // Did not find a surface patch between + // between Dv pair, finding nearest patch + +// Pout<< "Did not find a surface patch between " +// << "for face, finding nearest patch to" +// << 0.5*(ptA + ptB) << endl; + + patchIndex = geometryToConformTo_.findPatch + ( + 0.5*(ptA + ptB) + ); + } + + patchFaces[patchIndex].append(newDualFace); + patchOwners[patchIndex].append(own); + + // If the two vertices are a pair, then the patch face is + // a desired one. + if (!isPointPair(vA, vB)) + { + indirectPatchFace[patchIndex].append(true); + } + else + { + indirectPatchFace[patchIndex].append(false); + } + + // Store the non-internal or boundary point + if (vA->internalOrBoundaryPoint()) + { + patchPPSlaves[patchIndex].append(vB->index()); + } + else + { + patchPPSlaves[patchIndex].append(vA->index()); + } + } + else + { + // internal face + faces[dualFaceI] = newDualFace; + owner[dualFaceI] = own; + neighbour[dualFaceI] = nei; + + dualFaceI++; + } + } + } + } + + if (!patchFaces[defaultPatchIndex].empty()) + { + Pout<< nl << patchFaces[defaultPatchIndex].size() + << " faces were not able to have their patch determined from " + << "the surface. " + << nl << "Adding to patch " << patchNames[defaultPatchIndex] + << endl; + } + + label nInternalFaces = dualFaceI; + + faces.setSize(nInternalFaces); + owner.setSize(nInternalFaces); + neighbour.setSize(nInternalFaces); + + timeCheck("polyMesh quality checked"); + + sortFaces(faces, owner, neighbour); + + sortProcPatches + ( + patchFaces, + patchOwners, + patchPPSlaves, + procPatchSortingIndex + ); + + timeCheck("faces, owner, neighbour sorted"); + + addPatches + ( + nInternalFaces, + faces, + owner, + patchSizes, + patchStarts, + boundaryFacesToRemove, + patchFaces, + patchOwners, + indirectPatchFace + ); + + // Return patchPointPairSlaves.setSize(nPatches); + patchPointPairSlaves.setSize(nPatches); + forAll(patchPPSlaves, patchI) + { + patchPointPairSlaves[patchI].transfer(patchPPSlaves[patchI]); + } + +// if (cvMeshControls().objOutput()) + { + Info<< "Writing processor interfaces" << endl; + + forAll(procNeighbours, nbI) + { + if (patchFaces[nbI].size() > 0) + { + const label neighbour = procNeighbours[nbI]; + + faceList procPatchFaces = patchFaces[nbI]; + + // Reverse faces as it makes it easier to analyse the output + // using a diff + if (neighbour < Pstream::myProcNo()) + { + forAll(procPatchFaces, fI) + { + procPatchFaces[fI] = procPatchFaces[fI].reverseFace(); + } + } + + if (neighbour != -1) + { + word fName = + "processor_" + + name(Pstream::myProcNo()) + + "_to_" + + name(neighbour) + + "_interface.obj"; + + writeProcessorInterface(fName, procPatchFaces); + } + } + } + } +} + + +void Foam::conformalVoronoiMesh::createCellCentres +( + pointField& cellCentres +) const +{ + cellCentres.setSize(number_of_vertices(), point::max); + + label vertI = 0; + + for + ( + Delaunay::Finite_vertices_iterator vit = finite_vertices_begin(); + vit != finite_vertices_end(); + ++vit + ) + { + if (vit->internalOrBoundaryPoint()) + { + cellCentres[vertI++] = topoint(vit->point()); + } + } + + cellCentres.setSize(vertI); +} + + +Foam::tmp<Foam::pointField> Foam::conformalVoronoiMesh::allPoints() const +{ + tmp<pointField> tpts(new pointField(number_of_vertices(), point::max)); + pointField& pts = tpts(); + + label nVert = 0; + + for + ( + Delaunay::Finite_vertices_iterator vit = finite_vertices_begin(); + vit != finite_vertices_end(); + ++vit + ) + { + if (vit->internalOrBoundaryPoint()) + { + pts[nVert++] = topoint(vit->point()); + } + } + + return tpts; +} + + +void Foam::conformalVoronoiMesh::sortFaces +( + faceList& faces, + labelList& owner, + labelList& neighbour +) const +{ + // Upper triangular order: + // + owner is sorted in ascending cell order + // + within each block of equal value for owner, neighbour is sorted in + // ascending cell order. + // + faces sorted to correspond + // e.g. + // owner | neighbour + // 0 | 2 + // 0 | 23 + // 0 | 71 + // 1 | 23 + // 1 | 24 + // 1 | 91 + + List<labelPair> ownerNeighbourPair(owner.size()); + + forAll(ownerNeighbourPair, oNI) + { + ownerNeighbourPair[oNI] = labelPair(owner[oNI], neighbour[oNI]); + } + + Info<< nl + << "Sorting faces, owner and neighbour into upper triangular order" + << endl; + + labelList oldToNew; + + sortedOrder(ownerNeighbourPair, oldToNew); + + oldToNew = invert(oldToNew.size(), oldToNew); + + inplaceReorder(oldToNew, faces); + inplaceReorder(oldToNew, owner); + inplaceReorder(oldToNew, neighbour); +} + + +void Foam::conformalVoronoiMesh::sortProcPatches +( + List<DynamicList<face> >& patchFaces, + List<DynamicList<label> >& patchOwners, + List<DynamicList<label> >& patchPointPairSlaves, + labelPairPairDynListList& patchSortingIndices +) const +{ + if (!Pstream::parRun()) + { + return; + } + + forAll(patchSortingIndices, patchI) + { + faceList& faces = patchFaces[patchI]; + labelList& owner = patchOwners[patchI]; + DynamicList<label>& slaves = patchPointPairSlaves[patchI]; + + DynamicList<Pair<labelPair> >& sortingIndices + = patchSortingIndices[patchI]; + + if (!sortingIndices.empty()) + { + if + ( + faces.size() != sortingIndices.size() + || owner.size() != sortingIndices.size() + || slaves.size() != sortingIndices.size() + ) + { + FatalErrorIn + ( + "void Foam::conformalVoronoiMesh::sortProcPatches" + "(" + "List<DynamicList<face> >& patchFaces, " + "List<DynamicList<label> >& patchOwners, " + "const List<DynamicList<label> >& patchSortingIndices" + ") const" + ) + << "patch size and size of sorting indices is inconsistent " + << " for patch " << patchI << nl + << " faces.size() " << faces.size() << nl + << " owner.size() " << owner.size() << nl + << " slaves.size() " << slaves.size() << nl + << " sortingIndices.size() " + << sortingIndices.size() + << exit(FatalError) << endl; + } + + labelList oldToNew; + + sortedOrder(sortingIndices, oldToNew); + + oldToNew = invert(oldToNew.size(), oldToNew); + + inplaceReorder(oldToNew, sortingIndices); + inplaceReorder(oldToNew, faces); + inplaceReorder(oldToNew, owner); + inplaceReorder(oldToNew, slaves); + } + } +} + + +void Foam::conformalVoronoiMesh::addPatches +( + const label nInternalFaces, + faceList& faces, + labelList& owner, + labelList& patchSizes, + labelList& patchStarts, + PackedBoolList& boundaryFacesToRemove, + const List<DynamicList<face> >& patchFaces, + const List<DynamicList<label> >& patchOwners, + const List<DynamicList<bool> >& indirectPatchFace +) const +{ + label nPatches = patchFaces.size(); + + patchSizes.setSize(nPatches, -1); + patchStarts.setSize(nPatches, -1); + + label nBoundaryFaces = 0; + + forAll(patchFaces, p) + { + patchSizes[p] = patchFaces[p].size(); + patchStarts[p] = nInternalFaces + nBoundaryFaces; + + nBoundaryFaces += patchSizes[p]; + } + + faces.setSize(nInternalFaces + nBoundaryFaces); + owner.setSize(nInternalFaces + nBoundaryFaces); + + label faceI = nInternalFaces; + + forAll(patchFaces, p) + { + forAll(patchFaces[p], f) + { + faces[faceI] = patchFaces[p][f]; + owner[faceI] = patchOwners[p][f]; + boundaryFacesToRemove[faceI] = indirectPatchFace[p][f]; + + faceI++; + } + } +} + + +void Foam::conformalVoronoiMesh::removeUnusedPoints +( + faceList& faces, + pointField& pts, + labelList& boundaryPts +) const +{ + Info<< nl << "Removing unused points" << endl; + + PackedBoolList ptUsed(pts.size(), false); + + // Scan all faces to find all of the points that are used + + forAll(faces, fI) + { + const face& f = faces[fI]; + + forAll(f, fPtI) + { + ptUsed[f[fPtI]] = true; + } + } + + label pointI = 0; + + labelList oldToNew(pts.size(), -1); + + // Move all of the used points to the start of the pointField and + // truncate it + + forAll(ptUsed, ptUI) + { + if (ptUsed[ptUI] == true) + { + oldToNew[ptUI] = pointI++; + } + } + + inplaceReorder(oldToNew, pts); + inplaceReorder(oldToNew, boundaryPts); + + Info<< " Removing " + << returnReduce(pts.size() - pointI, sumOp<label>()) + << " unused points" + << endl; + + pts.setSize(pointI); + boundaryPts.setSize(pointI); + + // Renumber the faces to use the new point numbers + + forAll(faces, fI) + { + inplaceRenumber(oldToNew, faces[fI]); + } +} + + +Foam::labelList Foam::conformalVoronoiMesh::removeUnusedCells +( + labelList& owner, + labelList& neighbour +) const +{ + Info<< nl << "Removing unused cells" << endl; + + PackedBoolList cellUsed(number_of_vertices(), false); + + // Scan all faces to find all of the cells that are used + + forAll(owner, oI) + { + cellUsed[owner[oI]] = true; + } + + forAll(neighbour, nI) + { + cellUsed[neighbour[nI]] = true; + } + + label cellI = 0; + + labelList oldToNew(cellUsed.size(), -1); + + // Move all of the used cellCentres to the start of the pointField and + // truncate it + + forAll(cellUsed, cellUI) + { + if (cellUsed[cellUI] == true) + { + oldToNew[cellUI] = cellI++; + } + } + + labelList newToOld(invert(cellI, oldToNew)); + + // Find all of the unused cells, create a list of them, then + // subtract one from each owner and neighbour entry for each of + // the unused cell indices that it is above. + + DynamicList<label> unusedCells; + + forAll(cellUsed, cUI) + { + if (cellUsed[cUI] == false) + { + unusedCells.append(cUI); + } + } + + if (unusedCells.size() > 0) + { + Info<< " Removing " + << returnReduce(unusedCells.size(), sumOp<label>()) + << " unused cell labels" << endl; + + forAll(owner, oI) + { + label& o = owner[oI]; + + o -= findLower(unusedCells, o) + 1; + } + + forAll(neighbour, nI) + { + label& n = neighbour[nI]; + + n -= findLower(unusedCells, n) + 1; + } + } + + return newToOld; +} + + +// ************************************************************************* // diff --git a/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/conformalVoronoiMesh/conformalVoronoiMeshConformToSurface.C b/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/conformalVoronoiMesh/conformalVoronoiMeshConformToSurface.C new file mode 100644 index 0000000000000000000000000000000000000000..14c5428c816f2941e2889eb16fe92f8b128a1978 --- /dev/null +++ b/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/conformalVoronoiMesh/conformalVoronoiMeshConformToSurface.C @@ -0,0 +1,2106 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2012 OpenFOAM Foundation + \\/ M anipulation | +------------------------------------------------------------------------------- +License + This file is part of OpenFOAM. + + OpenFOAM is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + OpenFOAM is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>. + +\*---------------------------------------------------------------------------*/ + +#include "conformalVoronoiMesh.H" +#include "backgroundMeshDecomposition.H" +#include "vectorTools.H" +#include "indexedCellChecks.H" +#include "IOmanip.H" + +using namespace Foam::vectorTools; + +const Foam::scalar Foam::conformalVoronoiMesh::searchConeAngle + = Foam::cos(degToRad(30)); + +const Foam::scalar Foam::conformalVoronoiMesh::searchAngleOppositeSurface + = Foam::cos(degToRad(150)); + + +// * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * * // + +void Foam::conformalVoronoiMesh::conformToSurface() +{ + this->resetCellCount(); + // Index the cells + for + ( + Delaunay::Finite_cells_iterator cit = finite_cells_begin(); + cit != finite_cells_end(); + ++cit + ) + { + cit->cellIndex() = Cb::ctUnassigned; + } + + if (reconformationControl() == rmOff) + { + // Reinsert stored surface conformation + reinsertSurfaceConformation(); + + if (Pstream::parRun()) + { + sync(decomposition_().procBounds()); + } + } + else + { + // Rebuild, insert and store new surface conformation + buildSurfaceConformation(); + + if (distributeBackground()) + { + if (Pstream::parRun()) + { + sync(decomposition_().procBounds()); + } + + // Use storeSizesAndAlignments with no feed points because all + // background points may have been distributed. + storeSizesAndAlignments(); + } + + // Do not store the surface conformation until after it has been + // (potentially) redistributed. + storeSurfaceConformation(); + } + + // reportSurfaceConformationQuality(); +} + + +Foam::conformalVoronoiMesh::reconformationMode +Foam::conformalVoronoiMesh::reconformationControl() const +{ + if + ( + runTime_.timeIndex() + % cvMeshControls().surfaceConformationRebuildFrequency() == 0 + ) + { + return rmOn; + } + + return rmOff; +} + + +// @todo Investigate topological tests +Foam::label Foam::conformalVoronoiMesh::findVerticesNearBoundaries() +{ + label countNearBoundaryVertices = 0; + + for + ( + Delaunay::Finite_facets_iterator fit = finite_facets_begin(); + fit != finite_facets_end(); + ++fit + ) + { + if + ( + is_infinite(fit->first) + || is_infinite(fit->first->neighbor(fit->second)) + ) + { + continue; + } + + Cell_handle c1 = fit->first; + Cell_handle c2 = fit->first->neighbor(fit->second); + + pointFromPoint dE0 = c1->dual(); + pointFromPoint dE1 = c2->dual(); + + if (!geometryToConformTo_.findSurfaceAnyIntersection(dE0, dE1)) + { + continue; + } + + for (label cellI = 0; cellI < 4; ++cellI) + { + Vertex_handle v = c1->vertex(cellI); + + if + ( + !is_infinite(v) + && v->internalPoint() + && fit->second != cellI + ) + { + v->setNearBoundary(); + } + } + + for (label cellI = 0; cellI < 4; ++cellI) + { + Vertex_handle v = c2->vertex(cellI); + + if + ( + !is_infinite(v) + && v->internalPoint() + && fit->second != cellI + ) + { + v->setNearBoundary(); + } + } + } + + for + ( + Delaunay::Finite_vertices_iterator vit = finite_vertices_begin(); + vit != finite_vertices_end(); + ++vit + ) + { + if (vit->nearBoundary()) + { + countNearBoundaryVertices++; + } + } + + // Geometric test. +// for +// ( +// Delaunay::Finite_vertices_iterator vit = finite_vertices_begin(); +// vit != finite_vertices_end(); +// ++vit +// ) +// { +// if (vit->internalPoint() && !vit->nearBoundary()) +// { +// pointFromPoint pt = topoint(vit->point()); +// +// const scalar range = sqr +// ( +// cvMeshControls().nearBoundaryDistanceCoeff() +// *targetCellSize(pt) +// ); +// +// pointIndexHit pHit; +// label hitSurface; +// +// geometryToConformTo_.findSurfaceNearest +// ( +// pt, +// range, +// pHit, +// hitSurface +// ); +// +// if (pHit.hit()) +// { +// vit->setNearBoundary(); +// countNearBoundaryVertices++; +// } +// } +// } + + return countNearBoundaryVertices; +} + + +void Foam::conformalVoronoiMesh::buildSurfaceConformation() +{ + timeCheck("Start buildSurfaceConformation"); + + if (reconformationControl() == rmOff) + { + WarningIn("buildSurfaceConformation()") + << "reconformationMode rmNone specified, not building conformation" + << endl; + + return; + } + else + { + Info<< nl << "Rebuilding surface conformation for more iterations" + << endl; + } + + existingEdgeLocations_.clearStorage(); + existingSurfacePtLocations_.clearStorage(); + + buildEdgeLocationTree(existingEdgeLocations_); + buildSurfacePtLocationTree(existingSurfacePtLocations_); + + label initialTotalHits = 0; + + // Surface protrusion conformation is done in two steps. + // 1. the dual edges (of all internal vertices) can stretch to + // 'infinity' so any intersection would be badly behaved. So + // just find the nearest point on the geometry and insert point + // pairs. + // Now most of the surface conformation will be done with some + // residual protrusions / incursions. + // 2. find any segments of dual edges outside the geometry. Shoot + // ray from Delaunay vertex to middle of this segment and introduce + // point pairs. This will handle e.g. + + // protruding section of face: + // + // internal + // \ / + // -+-----------+-- boundary + // \ / + // -------- + // + // Shoot ray and find intersection with outside segment (x) and + // introduce point pair (..) + // + // | + // \ . / + // -+-----|-----+-- boundary + // \ . / + // ---x---- + + // Find vertices near boundaries to speed up subsequent checks. + label countNearBoundaryVertices = findVerticesNearBoundaries(); + + Info<< " Vertices marked as being near a boundary: " + << returnReduce(countNearBoundaryVertices, sumOp<label>()) + << " (estimated)" << endl; + + timeCheck("After set near boundary"); + + const scalar edgeSearchDistCoeffSqr = + cvMeshControls().edgeSearchDistCoeffSqr(); + + const scalar surfacePtReplaceDistCoeffSqr = + cvMeshControls().surfacePtReplaceDistCoeffSqr(); + + const label AtoV = label(6/Foam::pow(scalar(number_of_vertices()), 3)); + + // Initial surface protrusion conformation - nearest surface point + { + pointIndexHitAndFeatureDynList featureEdgeHits(AtoV/4); + pointIndexHitAndFeatureDynList surfaceHits(AtoV); + + for + ( + Delaunay::Finite_vertices_iterator vit = finite_vertices_begin(); + vit != finite_vertices_end(); + vit++ + ) + { + if (vit->nearBoundary()) + { + pointIndexHitAndFeatureDynList surfaceIntersections(AtoV); + + if + ( + dualCellSurfaceAllIntersections + ( + vit, + surfaceIntersections + ) + ) + { + // meshTools::writeOBJ(Pout, vert); + // meshTools::writeOBJ(Pout, surfHit.hitPoint()); + // Pout<< "l cr0 cr1" << endl; + + addSurfaceAndEdgeHits + ( + vit, + surfaceIntersections, + surfacePtReplaceDistCoeffSqr, + edgeSearchDistCoeffSqr, + surfaceHits, + featureEdgeHits + ); + } + else + { + vit->setInternal(); + countNearBoundaryVertices--; + } + } + } + + Info<< " Vertices marked as being near a boundary: " + << returnReduce(countNearBoundaryVertices, sumOp<label>()) + << " (after dual surface intersection)" << endl; + + label nVerts = number_of_vertices(); + label nSurfHits = surfaceHits.size(); + label nFeatEdHits = featureEdgeHits.size(); + + if (Pstream::parRun()) + { + reduce(nVerts, sumOp<label>()); + reduce(nSurfHits, sumOp<label>()); + reduce(nFeatEdHits, sumOp<label>()); + } + + Info<< nl << "Initial conformation" << nl + << " Number of vertices " << nVerts << nl + << " Number of surface hits " << nSurfHits << nl + << " Number of edge hits " << nFeatEdHits + << endl; + + // In parallel, synchronise the surface trees + if (Pstream::parRun()) + { + synchroniseSurfaceTrees(surfaceHits); + } + + insertSurfacePointPairs + ( + surfaceHits, + "surfaceConformationLocations_initial.obj" + ); + + // In parallel, synchronise the edge trees + if (Pstream::parRun()) + { + synchroniseEdgeTrees(featureEdgeHits); + } + + insertEdgePointGroups + ( + featureEdgeHits, + "edgeConformationLocations_initial.obj" + ); + + timeCheck("After initial conformation"); + + initialTotalHits = nSurfHits + nFeatEdHits; + } + + // Remember which vertices were referred to each processor so only updates + // are sent. + PtrList<labelPairHashSet> referralVertices(Pstream::nProcs()); + + // Store the vertices that have been received and added from each processor + // already so that there is no attempt to add them more than once. + autoPtr<labelPairHashSet> receivedVertices; + + if (Pstream::parRun()) + { + forAll(referralVertices, procI) + { + if (procI != Pstream::myProcNo()) + { + referralVertices.set + ( + procI, + new labelPairHashSet(number_of_vertices()/Pstream::nProcs()) + ); + } + } + + receivedVertices.set + ( + new labelPairHashSet(number_of_vertices()/Pstream::nProcs()) + ); + + // Build the parallel interface the initial surface conformation + sync + ( + decomposition_().procBounds(), + referralVertices, + receivedVertices() + ); + } + + label iterationNo = 0; + + label maxIterations = cvMeshControls().maxConformationIterations(); + + scalar iterationToInitialHitRatioLimit = + cvMeshControls().iterationToInitialHitRatioLimit(); + + label hitLimit = label(iterationToInitialHitRatioLimit*initialTotalHits); + + Info<< nl << "Stopping iterations when: " << nl + << " total number of hits drops below " + << iterationToInitialHitRatioLimit + << " of initial hits (" << hitLimit << ")" << nl + << " or " << nl + << " maximum number of iterations (" << maxIterations + << ") is reached" + << endl; + + // Set totalHits to a large enough positive value to enter the while loop on + // the first iteration + label totalHits = initialTotalHits; + + while + ( + totalHits > 0 + && totalHits >= hitLimit + && iterationNo < maxIterations + ) + { + pointIndexHitAndFeatureDynList surfaceHits(0.5*AtoV); + pointIndexHitAndFeatureDynList featureEdgeHits(0.25*AtoV); + + for + ( + Delaunay::Finite_vertices_iterator vit = finite_vertices_begin(); + vit != finite_vertices_end(); + ++vit + ) + { + // The initial surface conformation has already identified the + // nearBoundary set of vertices. Previously inserted boundary + // points and referred internal vertices from other processors can + // also generate protrusions and must be assessed too. + if + ( + vit->nearBoundary() + || vit->internalBoundaryPoint() + || (vit->internalOrBoundaryPoint() && vit->referred()) + ) + { + pointIndexHitAndFeatureDynList surfaceIntersections(0.5*AtoV); + + pointIndexHit surfHit; + label hitSurface; + + // Find segments of dual face outside the geometry and find the + // the middle of this + dualCellLargestSurfaceProtrusion(vit, surfHit, hitSurface); + + if (surfHit.hit()) + { + surfaceIntersections.append + ( + pointIndexHitAndFeature(surfHit, hitSurface) + ); + + addSurfaceAndEdgeHits + ( + vit, + surfaceIntersections, + surfacePtReplaceDistCoeffSqr, + edgeSearchDistCoeffSqr, + surfaceHits, + featureEdgeHits + ); + } + else + { + // No surface hit detected so if internal then don't check + // again + if (vit->nearBoundary()) + { + vit->setInternal(); + } + } + } + else if (vit->externalBoundaryPoint()) + { + pointIndexHitAndFeatureDynList surfaceIntersections(0.5*AtoV); + + pointIndexHit surfHit; + label hitSurface; + + // Detect slave (external vertices) whose dual face incurs + // into nearby (other than originating) geometry + dualCellLargestSurfaceIncursion(vit, surfHit, hitSurface); + + if (surfHit.hit()) + { + surfaceIntersections.append + ( + pointIndexHitAndFeature(surfHit, hitSurface) + ); + + addSurfaceAndEdgeHits + ( + vit, + surfaceIntersections, + surfacePtReplaceDistCoeffSqr, + edgeSearchDistCoeffSqr, + surfaceHits, + featureEdgeHits + ); + } + } + } + + label nVerts = number_of_vertices(); + label nSurfHits = surfaceHits.size(); + label nFeatEdHits = featureEdgeHits.size(); + + if (Pstream::parRun()) + { + reduce(nVerts, sumOp<label>()); + reduce(nSurfHits, sumOp<label>()); + reduce(nFeatEdHits, sumOp<label>()); + } + + Info<< nl << "Conformation iteration " << iterationNo << nl + << " Number of vertices " << nVerts << nl + << " Number of surface hits " << nSurfHits << nl + << " Number of edge hits " << nFeatEdHits + << endl; + + totalHits = nSurfHits + nFeatEdHits; + + label nNotInserted = 0; + + if (totalHits > 0) + { + // In parallel, synchronise the surface trees + if (Pstream::parRun()) + { + nNotInserted += synchroniseSurfaceTrees(surfaceHits); + } + + insertSurfacePointPairs + ( + surfaceHits, + "surfaceConformationLocations_" + name(iterationNo) + ".obj" + ); + + // In parallel, synchronise the edge trees + if (Pstream::parRun()) + { + nNotInserted += synchroniseEdgeTrees(featureEdgeHits); + } + + insertEdgePointGroups + ( + featureEdgeHits, + "edgeConformationLocations_" + name(iterationNo) + ".obj" + ); + + if (Pstream::parRun()) + { + sync + ( + decomposition_().procBounds(), + referralVertices, + receivedVertices() + ); + } + } + + timeCheck("Conformation iteration " + name(iterationNo)); + + iterationNo++; + + if (iterationNo == maxIterations) + { + WarningIn("conformalVoronoiMesh::conformToSurface()") + << "Maximum surface conformation iterations (" + << maxIterations << ") reached." << endl; + } + + if (totalHits <= nNotInserted) + { + Info<< nl << "Total hits (" << totalHits + << ") less than number of failed insertions (" << nNotInserted + << "), stopping iterations" << endl; + break; + } + + if (totalHits < hitLimit) + { + Info<< nl << "Total hits (" << totalHits + << ") less than limit (" << hitLimit + << "), stopping iterations" << endl; + } + } + + edgeLocationTreePtr_.clear(); + surfacePtLocationTreePtr_.clear(); +} + + +Foam::label Foam::conformalVoronoiMesh::synchroniseSurfaceTrees +( + pointIndexHitAndFeatureList& surfaceHits +) +{ + Info<< " Surface tree synchronisation" << endl; + + pointIndexHitAndFeatureDynList synchronisedSurfLocations + ( + surfaceHits.size() + ); + + List<pointIndexHitAndFeatureDynList> procSurfLocations(Pstream::nProcs()); + + procSurfLocations[Pstream::myProcNo()] = surfaceHits; + + Pstream::gatherList(procSurfLocations); + Pstream::scatterList(procSurfLocations); + + List<labelHashSet> hits(Pstream::nProcs()); + + label nStoppedInsertion = 0; + + // Do the nearness tests here + for (label procI = 0; procI < Pstream::nProcs(); ++procI) + { + // Skip own points + if (procI >= Pstream::myProcNo()) + { + continue; + } + + const pointIndexHitAndFeatureList& otherSurfEdges = + procSurfLocations[procI]; + + forAll(otherSurfEdges, peI) + { + const Foam::point& pt = otherSurfEdges[peI].first().hitPoint(); + + pointIndexHit nearest; + pointIsNearSurfaceLocation(pt, nearest); + + pointIndexHit nearestEdge; + pointIsNearFeatureEdgeLocation(pt, nearestEdge); + + bool isNearFeaturePt = nearFeaturePt(pt); + + if (nearest.hit() || nearestEdge.hit() || isNearFeaturePt) + { + nStoppedInsertion++; + + if (!hits[procI].found(peI)) + { + hits[procI].insert(peI); + } + } + } + } + + Pstream::listCombineGather(hits, plusEqOp<labelHashSet>()); + Pstream::listCombineScatter(hits); + + forAll(surfaceHits, eI) + { + if (!hits[Pstream::myProcNo()].found(eI)) + { + synchronisedSurfLocations.append(surfaceHits[eI]); + } + } + + forAll(synchronisedSurfLocations, pI) + { + appendToSurfacePtTree + ( + synchronisedSurfLocations[pI].first().hitPoint() + ); + } + + const label nNotInserted = returnReduce(nStoppedInsertion, sumOp<label>()); + + Info<< " Not inserting total of " << nNotInserted << " locations" + << endl; + + surfaceHits = synchronisedSurfLocations; + + return nNotInserted; +} + + +Foam::label Foam::conformalVoronoiMesh::synchroniseEdgeTrees +( + pointIndexHitAndFeatureList& featureEdgeHits +) +{ + Info<< " Edge tree synchronisation" << endl; + + pointIndexHitAndFeatureDynList synchronisedEdgeLocations + ( + featureEdgeHits.size() + ); + + List<pointIndexHitAndFeatureDynList> procEdgeLocations(Pstream::nProcs()); + + procEdgeLocations[Pstream::myProcNo()] = featureEdgeHits; + + Pstream::gatherList(procEdgeLocations); + Pstream::scatterList(procEdgeLocations); + + List<labelHashSet> hits(Pstream::nProcs()); + + label nStoppedInsertion = 0; + + // Do the nearness tests here + for (label procI = 0; procI < Pstream::nProcs(); ++procI) + { + // Skip own points + if (procI >= Pstream::myProcNo()) + { + continue; + } + + pointIndexHitAndFeatureList& otherProcEdges = procEdgeLocations[procI]; + + forAll(otherProcEdges, peI) + { + const Foam::point& pt = otherProcEdges[peI].first().hitPoint(); + + pointIndexHit nearest; + pointIsNearFeatureEdgeLocation(pt, nearest); + + bool isNearFeaturePt = nearFeaturePt(pt); + + if (nearest.hit() || isNearFeaturePt) + { + nStoppedInsertion++; + + if (!hits[procI].found(peI)) + { + hits[procI].insert(peI); + } + } + } + } + + Pstream::listCombineGather(hits, plusEqOp<labelHashSet>()); + Pstream::listCombineScatter(hits); + + forAll(featureEdgeHits, eI) + { + if (!hits[Pstream::myProcNo()].found(eI)) + { + synchronisedEdgeLocations.append(featureEdgeHits[eI]); + } + } + + forAll(synchronisedEdgeLocations, pI) + { + appendToEdgeLocationTree + ( + synchronisedEdgeLocations[pI].first().hitPoint() + ); + } + + const label nNotInserted = returnReduce(nStoppedInsertion, sumOp<label>()); + + Info<< " Not inserting total of " << nNotInserted << " locations" + << endl; + + featureEdgeHits = synchronisedEdgeLocations; + + return nNotInserted; +} + + +bool Foam::conformalVoronoiMesh::locationConformsToInside +( + const pointIndexHitAndFeature& info +) const +{ + bool keepLocation = true; + + if (info.first().hit()) + { + vectorField norm(1); + + allGeometry_[info.second()].getNormal + ( + List<pointIndexHit>(1, info.first()), + norm + ); + + const vector& n = norm[0]; + + const scalar ppDist = pointPairDistance(info.first().hitPoint()); + + const Foam::point innerPoint = info.first().hitPoint() - ppDist*n; + + if (!geometryToConformTo_.inside(innerPoint)) + { + keepLocation = false; + } + } + else + { + keepLocation = false; + } + + return keepLocation; +} + + +bool Foam::conformalVoronoiMesh::dualCellSurfaceAnyIntersection +( + const Delaunay::Finite_vertices_iterator& vit +) const +{ + std::list<Facet> facets; + incident_facets(vit, std::back_inserter(facets)); + + for + ( + std::list<Facet>::iterator fit=facets.begin(); + fit != facets.end(); + ++fit + ) + { + if + ( + is_infinite(fit->first) + || is_infinite(fit->first->neighbor(fit->second)) + || !fit->first->hasInternalPoint() + || !fit->first->neighbor(fit->second)->hasInternalPoint() + ) + { + continue; + } + + Foam::point dE0 = fit->first->dual(); + Foam::point dE1 = fit->first->neighbor(fit->second)->dual(); + + if (Pstream::parRun()) + { + Foam::point& a = dE0; + Foam::point& b = dE1; + + bool inProc = clipLineToProc(topoint(vit->point()), a, b); + + // Check for the edge passing through a surface + if + ( + inProc + && geometryToConformTo_.findSurfaceAnyIntersection(a, b) + ) + { + return true; + } + } + else + { + if (geometryToConformTo_.findSurfaceAnyIntersection(dE0, dE1)) + { + return true; + } + } + } + + return false; +} + + +bool Foam::conformalVoronoiMesh::dualCellSurfaceAllIntersections +( + const Delaunay::Finite_vertices_iterator& vit, + pointIndexHitAndFeatureDynList& infoList +) const +{ + bool flagIntersection = false; + + std::list<Facet> facets; + incident_facets(vit, std::back_inserter(facets)); + + for + ( + std::list<Facet>::iterator fit = facets.begin(); + fit != facets.end(); + ++fit + ) + { + if + ( + is_infinite(fit->first) + || is_infinite(fit->first->neighbor(fit->second)) + || !fit->first->hasInternalPoint() + || !fit->first->neighbor(fit->second)->hasInternalPoint() +// || fit->first->hasFarPoint() +// || fit->first->neighbor(fit->second)->hasFarPoint() + ) + { + continue; + } + + // Construct the dual edge and search for intersections of the edge + // with the surface + Foam::point dE0 = fit->first->dual(); + Foam::point dE1 = fit->first->neighbor(fit->second)->dual(); + + pointIndexHit infoIntersection; + label hitSurfaceIntersection = -1; + + if (Pstream::parRun()) + { + bool inProc = clipLineToProc(topoint(vit->point()), dE0, dE1); + + if (!inProc) + { + continue; + } + } + + geometryToConformTo_.findSurfaceNearestIntersection + ( + dE0, + dE1, + infoIntersection, + hitSurfaceIntersection + ); + + if (infoIntersection.hit()) + { + vectorField norm(1); + + allGeometry_[hitSurfaceIntersection].getNormal + ( + List<pointIndexHit>(1, infoIntersection), + norm + ); + + const vector& n = norm[0]; + + pointFromPoint vertex = topoint(vit->point()); + + const plane p(infoIntersection.hitPoint(), n); + + const plane::ray r(vertex, n); + + const scalar d = p.normalIntersect(r); + + const Foam::point newPoint = vertex + d*n; + + pointIndexHitAndFeature info; + + geometryToConformTo_.findSurfaceNearest + ( + newPoint, + surfaceSearchDistanceSqr(newPoint), + info.first(), + info.second() + ); + + bool rejectPoint = false; + + if (!locationConformsToInside(info)) + { + rejectPoint = true; + } + + if (!rejectPoint && info.first().hit()) + { + if (!infoList.empty()) + { + forAll(infoList, hitI) + { + // Reject point if the point is already added + if + ( + infoList[hitI].first().index() + == info.first().index() + ) + { + rejectPoint = true; + break; + } + + const Foam::point& p + = infoList[hitI].first().hitPoint(); + + const scalar separationDistance = + mag(p - info.first().hitPoint()); + + const scalar minSepDist = + sqr + ( + cvMeshControls().removalDistCoeff() + *targetCellSize(p) + ); + + // Reject the point if it is too close to another + // surface point. + // Could merge the points? + if (separationDistance < minSepDist) + { + rejectPoint = true; + break; + } + } + } + } + + // The normal ray from the vertex will not always result in a hit + // because another surface may be in the way. + if (!rejectPoint && info.first().hit()) + { + flagIntersection = true; + infoList.append(info); + } + } + } + + return flagIntersection; +} + + +bool Foam::conformalVoronoiMesh::clipLineToProc +( + const Foam::point& pt, + Foam::point& a, + Foam::point& b +) const +{ + bool inProc = false; + + pointIndexHit findAnyIntersection = decomposition_().findLine(a, b); + + if (!findAnyIntersection.hit()) + { + pointIndexHit info = decomposition_().findLine(a, pt); + + if (!info.hit()) + { + inProc = true; + } + else + { + inProc = false; + } + } + else + { + pointIndexHit info = decomposition_().findLine(a, pt); + + if (!info.hit()) + { + inProc = true; + b = findAnyIntersection.hitPoint(); + } + else + { + inProc = true; + a = findAnyIntersection.hitPoint(); + } + } + + return inProc; +} + + +void Foam::conformalVoronoiMesh::dualCellLargestSurfaceProtrusion +( + const Delaunay::Finite_vertices_iterator& vit, + pointIndexHit& surfHitLargest, + label& hitSurfaceLargest +) const +{ + // Set no-hit data + surfHitLargest = pointIndexHit(); + hitSurfaceLargest = -1; + + std::list<Facet> facets; + finite_incident_facets(vit, std::back_inserter(facets)); + + pointFromPoint vert = topoint(vit->point()); + + scalar maxProtrusionDistance = maxSurfaceProtrusion(vert); + + for + ( + std::list<Facet>::iterator fit = facets.begin(); + fit != facets.end(); + ++fit + ) + { + Cell_handle c1 = fit->first; + Cell_handle c2 = fit->first->neighbor(fit->second); + + if + ( + is_infinite(c1) || is_infinite(c2) + || !c1->hasInternalPoint() || !c2->hasInternalPoint() + || !c1->real() || !c2->real() + ) + { + continue; + } + + Foam::point edgeMid = 0.5*(c1->dual() + c2->dual()); + + pointIndexHit surfHit; + label hitSurface; + + geometryToConformTo_.findSurfaceAnyIntersection + ( + vert, + edgeMid, + surfHit, + hitSurface + ); + + if (surfHit.hit()) + { + vectorField norm(1); + + allGeometry_[hitSurface].getNormal + ( + List<pointIndexHit>(1, surfHit), + norm + ); + + const vector& n = norm[0]; + + const scalar normalProtrusionDistance = + (edgeMid - surfHit.hitPoint()) & n; + + if (normalProtrusionDistance > maxProtrusionDistance) + { + surfHitLargest = surfHit; + hitSurfaceLargest = hitSurface; + + maxProtrusionDistance = normalProtrusionDistance; + } + } + } + + // Relying on short-circuit evaluation to not call for hitPoint when this + // is a miss + if + ( + surfHitLargest.hit() + && !positionOnThisProc(surfHitLargest.hitPoint()) + ) + { + // A protrusion was identified, but not penetrating on this processor, + // so set no-hit data and allow the other that should have this point + // referred to generate it. + surfHitLargest = pointIndexHit(); + hitSurfaceLargest = -1; + } +} + + +void Foam::conformalVoronoiMesh::dualCellLargestSurfaceIncursion +( + const Delaunay::Finite_vertices_iterator& vit, + pointIndexHit& surfHitLargest, + label& hitSurfaceLargest +) const +{ + // Set no-hit data + surfHitLargest = pointIndexHit(); + hitSurfaceLargest = -1; + + std::list<Facet> facets; + finite_incident_facets(vit, std::back_inserter(facets)); + + pointFromPoint vert = topoint(vit->point()); + + scalar minIncursionDistance = -maxSurfaceProtrusion(vert); + + for + ( + std::list<Facet>::iterator fit = facets.begin(); + fit != facets.end(); + ++fit + ) + { + Cell_handle c1 = fit->first; + Cell_handle c2 = fit->first->neighbor(fit->second); + + if + ( + is_infinite(c1) || is_infinite(c2) + || !c1->hasInternalPoint() || !c2->hasInternalPoint() + || !c1->real() || !c2->real() + ) + { + continue; + } + + Foam::point edgeMid = 0.5*(c1->dual() + c2->dual()); + + pointIndexHit surfHit; + label hitSurface; + + geometryToConformTo_.findSurfaceAnyIntersection + ( + vert, + edgeMid, + surfHit, + hitSurface + ); + + if (surfHit.hit()) + { + vectorField norm(1); + + allGeometry_[hitSurface].getNormal + ( + List<pointIndexHit>(1, surfHit), + norm + ); + + const vector& n = norm[0]; + + scalar normalIncursionDistance = + (edgeMid - surfHit.hitPoint()) & n; + + if (normalIncursionDistance < minIncursionDistance) + { + surfHitLargest = surfHit; + hitSurfaceLargest = hitSurface; + + minIncursionDistance = normalIncursionDistance; + + // Info<< nl << "# Incursion: " << endl; + // meshTools::writeOBJ(Info, vert); + // meshTools::writeOBJ(Info, edgeMid); + // Info<< "l Na Nb" << endl; + } + } + } + + // Relying on short-circuit evaluation to not call for hitPoint when this + // is a miss + if + ( + surfHitLargest.hit() + && !positionOnThisProc(surfHitLargest.hitPoint()) + ) + { + // A protrusion was identified, but not penetrating on this processor, + // so set no-hit data and allow the other that should have this point + // referred to generate it. + surfHitLargest = pointIndexHit(); + hitSurfaceLargest = -1; + } +} + + +void Foam::conformalVoronoiMesh::reportProcessorOccupancy() +{ + for + ( + Delaunay::Finite_vertices_iterator vit = finite_vertices_begin(); + vit != finite_vertices_end(); + vit++ + ) + { + if (vit->real()) + { + if (!positionOnThisProc(topoint(vit->point()))) + { + Pout<< topoint(vit->point()) << " is not on this processor " + << endl; + } + } + } +} + + +//void Foam::conformalVoronoiMesh::reportSurfaceConformationQuality() +//{ +// Info<< nl << "Check surface conformation quality" << endl; +// +// for +// ( +// Delaunay::Finite_vertices_iterator vit = finite_vertices_begin(); +// vit != finite_vertices_end(); +// vit++ +// ) +// { +// if (vit->internalOrBoundaryPoint()) +// { +// Foam::point vert(topoint(vit->point())); +// pointIndexHit surfHit; +// label hitSurface; +// +// dualCellLargestSurfaceProtrusion(vit, surfHit, hitSurface); +// +// if (surfHit.hit()) +// { +// Pout<< nl << "Residual penetration: " << nl +// << vit->index() << nl +// << vit->type() << nl +// << vit->ppMaster() << nl +// << "nearFeaturePt " +// << nearFeaturePt(surfHit.hitPoint()) << nl +// << vert << nl +// << surfHit.hitPoint() +// << endl; +// } +// } +// } +// +// { +// // Assess close surface points +// +// setVertexSizeAndAlignment(); +// +// for +// ( +// Delaunay::Finite_vertices_iterator vit = finite_vertices_begin(); +// vit != finite_vertices_end(); +// vit++ +// ) +// { +// if (vit->ppMaster()) +// { +// std::list<Vertex_handle> adjacentVertices; +// +// adjacent_vertices(vit, std::back_inserter(adjacentVertices)); +// +// Foam::point pt = topoint(vit->point()); +// +// // Pout<< nl << "vit: " << vit->index() << " " +// // << topoint(vit->point()) +// // << endl; +// +// // Pout<< adjacentVertices.size() << endl; +// +// for +// ( +// std::list<Vertex_handle>::iterator +// avit = adjacentVertices.begin(); +// avit != adjacentVertices.end(); +// ++avit +// ) +// { +// Vertex_handle avh = *avit; +// +// // The lower indexed vertex will perform the assessment +// if +// ( +// avh->ppMaster() +// && vit->index() < avh->index() +// && vit->type() != avh->type() +// ) +// { +// scalar targetSize = 0.2*averageAnyCellSize(vit, avh); +// +// // Pout<< "diff " << mag(pt - topoint(avh->point())) +// // << " " << targetSize << endl; +// +// if +// ( +// magSqr(pt - topoint(avh->point())) +// < sqr(targetSize) +// ) +// { +// Pout<< nl << "vit: " << vit->index() << " " +// << topoint(vit->point()) +// << endl; +// +// Pout<< " adjacent too close: " +// << avh->index() << " " +// << topoint(avh->point()) +// << endl; +// } +// } +// } +// } +// } +// } +//} + +void Foam::conformalVoronoiMesh::limitDisplacement +( + const Delaunay::Finite_vertices_iterator& vit, + vector& displacement, + label callCount +) const +{ + callCount++; + + // Do not allow infinite recursion + if (callCount > 7) + { + return; + } + + pointFromPoint pt = topoint(vit->point()); + Foam::point dispPt = pt + displacement; + + bool limit = false; + + pointIndexHit surfHit; + label hitSurface; + + if (!geometryToConformTo_.globalBounds().contains(dispPt)) + { + // If dispPt is outside bounding box then displacement cuts boundary + limit = true; + } + else if (geometryToConformTo_.findSurfaceAnyIntersection(pt, dispPt)) + { + // Full surface penetration test + limit = true; + } + else + { + // Testing if the displaced position is too close to the surface. + // Within twice the local surface point pair insertion distance is + // considered "too close" + + scalar searchDistanceSqr = sqr + ( + 2*vit->targetCellSize() + *cvMeshControls().pointPairDistanceCoeff() + ); + + geometryToConformTo_.findSurfaceNearest + ( + dispPt, + searchDistanceSqr, + surfHit, + hitSurface + ); + + if (surfHit.hit()) + { + limit = true; + + if (magSqr(pt - surfHit.hitPoint()) <= searchDistanceSqr) + { + // Cannot limit displacement, point closer than tolerance + return; + } + } + } + + if (limit) + { + // Halve the displacement and call this function again. Will continue + // recursively until the displacement is small enough. + + displacement *= 0.5; + + limitDisplacement(vit, displacement, callCount); + } +} + + +Foam::scalar Foam::conformalVoronoiMesh::angleBetweenSurfacePoints +( + Foam::point pA, + Foam::point pB +) const +{ + pointIndexHit pAhit; + label pAsurfaceHit = -1; + + const scalar searchDist = 5.0*targetCellSize(pA); + + geometryToConformTo_.findSurfaceNearest + ( + pA, + searchDist, + pAhit, + pAsurfaceHit + ); + + if (!pAhit.hit()) + { + return constant::mathematical::pi; + } + + vectorField norm(1); + + allGeometry_[pAsurfaceHit].getNormal + ( + List<pointIndexHit>(1, pAhit), + norm + ); + + const vector nA = norm[0]; + + pointIndexHit pBhit; + label pBsurfaceHit = -1; + + geometryToConformTo_.findSurfaceNearest + ( + pB, + searchDist, + pBhit, + pBsurfaceHit + ); + + if (!pBhit.hit()) + { + return constant::mathematical::pi; + } + + allGeometry_[pBsurfaceHit].getNormal + ( + List<pointIndexHit>(1, pBhit), + norm + ); + + const vector nB = norm[0]; + + return vectorTools::cosPhi(nA, nB); +} + + +bool Foam::conformalVoronoiMesh::nearSurfacePoint +( + pointIndexHitAndFeature& pHit +) const +{ + const Foam::point& pt = pHit.first().hitPoint(); + + pointIndexHit closePoint; + + const bool closeToSurfacePt = pointIsNearSurfaceLocation(pt, closePoint); + +// if +// ( +// closeToSurfacePt +// && mag(pt - closePoint.hitPoint()) > pointPairDistance(pt) +// ) +// { +// const scalar cosAngle +// = angleBetweenSurfacePoints(pt, closePoint.hitPoint()); +// +// // @todo make this tolerance run-time selectable? +// if (cosAngle < searchAngleOppositeSurface) +// { +// pointIndexHit pCloseHit; +// label pCloseSurfaceHit = -1; +// +// const scalar searchDist = targetCellSize(closePoint.hitPoint()); +// +// if (searchDist < SMALL) +// { +// Pout<< "WARNING: SMALL CELL SIZE" << endl; +// } +// +// geometryToConformTo_.findSurfaceNearest +// ( +// closePoint.hitPoint(), +// searchDist, +// pCloseHit, +// pCloseSurfaceHit +// ); +// +// vectorField norm(1); +// +// allGeometry_[pCloseSurfaceHit].getNormal +// ( +// List<pointIndexHit>(1, pCloseHit), +// norm +// ); +// +// const vector nA = norm[0]; +// +// pointIndexHit oppositeHit; +// label oppositeSurfaceHit = -1; +// +// geometryToConformTo_.findSurfaceNearestIntersection +// ( +// closePoint.hitPoint() + SMALL*nA, +// closePoint.hitPoint() + mag(pt - closePoint.hitPoint())*nA, +// oppositeHit, +// oppositeSurfaceHit +// ); +// +// if (oppositeHit.hit()) +// { +// // Replace point +// pHit.first() = oppositeHit; +// pHit.second() = oppositeSurfaceHit; +// +// appendToSurfacePtTree(pHit.first().hitPoint()); +// +// return !closeToSurfacePt; +// } +// } +// } +// else + { + appendToSurfacePtTree(pt); + } + + return closeToSurfacePt; +} + + +bool Foam::conformalVoronoiMesh::appendToSurfacePtTree +( + const Foam::point& pt +) const +{ + label startIndex = existingSurfacePtLocations_.size(); + + existingSurfacePtLocations_.append(pt); + + label endIndex = existingSurfacePtLocations_.size(); + + return surfacePtLocationTreePtr_().insert(startIndex, endIndex); +} + + +bool Foam::conformalVoronoiMesh::appendToEdgeLocationTree +( + const Foam::point& pt +) const +{ + label startIndex = existingEdgeLocations_.size(); + + existingEdgeLocations_.append(pt); + + label endIndex = existingEdgeLocations_.size(); + + return edgeLocationTreePtr_().insert(startIndex, endIndex); +} + + +Foam::List<Foam::pointIndexHit> +Foam::conformalVoronoiMesh::nearestFeatureEdgeLocations +( + const Foam::point& pt +) const +{ + const scalar exclusionRangeSqr = featureEdgeExclusionDistanceSqr(pt); + + labelList elems + = edgeLocationTreePtr_().findSphere(pt, exclusionRangeSqr); + + DynamicList<pointIndexHit> dynPointHit; + + forAll(elems, elemI) + { + label index = elems[elemI]; + + const Foam::point& pointI + = edgeLocationTreePtr_().shapes().shapePoints()[index]; + + pointIndexHit nearHit(true, pointI, index); + + dynPointHit.append(nearHit); + } + + return dynPointHit; +} + + +bool Foam::conformalVoronoiMesh::pointIsNearFeatureEdgeLocation +( + const Foam::point& pt +) const +{ + const scalar exclusionRangeSqr = featureEdgeExclusionDistanceSqr(pt); + + pointIndexHit info + = edgeLocationTreePtr_().findNearest(pt, exclusionRangeSqr); + + return info.hit(); +} + + +bool Foam::conformalVoronoiMesh::pointIsNearFeatureEdgeLocation +( + const Foam::point& pt, + pointIndexHit& info +) const +{ + const scalar exclusionRangeSqr = featureEdgeExclusionDistanceSqr(pt); + + info = edgeLocationTreePtr_().findNearest(pt, exclusionRangeSqr); + + return info.hit(); +} + + +bool Foam::conformalVoronoiMesh::pointIsNearSurfaceLocation +( + const Foam::point& pt +) const +{ + pointIndexHit info; + + pointIsNearSurfaceLocation(pt, info); + + return info.hit(); +} + + +bool Foam::conformalVoronoiMesh::pointIsNearSurfaceLocation +( + const Foam::point& pt, + pointIndexHit& info +) const +{ + const scalar exclusionRangeSqr = surfacePtExclusionDistanceSqr(pt); + + info = surfacePtLocationTreePtr_().findNearest(pt, exclusionRangeSqr); + + return info.hit(); +} + + +bool Foam::conformalVoronoiMesh::nearFeatureEdgeLocation +( + pointIndexHit& pHit +) const +{ + Foam::point pt = pHit.hitPoint(); + + const scalar exclusionRangeSqr = featureEdgeExclusionDistanceSqr(pt); + + bool closeToFeatureEdge = pointIsNearFeatureEdgeLocation(pt); + + if (closeToFeatureEdge) + { + List<pointIndexHit> nearHits = nearestFeatureEdgeLocations(pt); + + forAll(nearHits, elemI) + { + pointIndexHit& info = nearHits[elemI]; + + // Check if the edge location that the new edge location is near to + // "might" be on a different edge. If so, add it anyway. + pointIndexHit edgeHit; + label featureHit = -1; + + geometryToConformTo_.findEdgeNearest + ( + pt, + exclusionRangeSqr, + edgeHit, + featureHit + ); + + const extendedFeatureEdgeMesh& eMesh + = geometryToConformTo_.features()[featureHit]; + + const vector& edgeDir = eMesh.edgeDirections()[edgeHit.index()]; + + const vector lineBetweenPoints = pt - info.hitPoint(); + + const scalar cosAngle + = vectorTools::cosPhi(edgeDir, lineBetweenPoints); + + // Allow the point to be added if it is almost at right angles to + // the other point. Also check it is not the same point. + // Info<< cosAngle<< " " + // << radToDeg(acos(cosAngle)) << " " + // << searchConeAngle << " " + // << radToDeg(acos(searchConeAngle)) << endl; + + if + ( + mag(cosAngle) < searchConeAngle + && ( + mag(lineBetweenPoints) + > cvMeshControls().pointPairDistanceCoeff()*targetCellSize(pt) + ) + ) + { + pt = edgeHit.hitPoint(); + pHit.setPoint(pt); + closeToFeatureEdge = false; + } + else + { + closeToFeatureEdge = true; + break; + } + } + } + + if (!closeToFeatureEdge) + { + appendToEdgeLocationTree(pt); + } + + return closeToFeatureEdge; +} + + +void Foam::conformalVoronoiMesh::buildEdgeLocationTree +( + const DynamicList<Foam::point>& existingEdgeLocations +) const +{ + treeBoundBox overallBb + ( + geometryToConformTo_.globalBounds().extend(rndGen_, 1e-4) + ); + + overallBb.min() -= Foam::point(ROOTVSMALL, ROOTVSMALL, ROOTVSMALL); + overallBb.max() += Foam::point(ROOTVSMALL, ROOTVSMALL, ROOTVSMALL); + + edgeLocationTreePtr_.reset + ( + new dynamicIndexedOctree<dynamicTreeDataPoint> + ( + dynamicTreeDataPoint(existingEdgeLocations), + overallBb, // overall search domain + 10, // max levels, n/a + 20.0, // maximum ratio of cubes v.s. cells + 100.0 // max. duplicity; n/a since no bounding boxes. + ) + ); +} + + +void Foam::conformalVoronoiMesh::buildSurfacePtLocationTree +( + const DynamicList<Foam::point>& existingSurfacePtLocations +) const +{ + treeBoundBox overallBb + ( + geometryToConformTo_.globalBounds().extend(rndGen_, 1e-4) + ); + + overallBb.min() -= Foam::point(ROOTVSMALL, ROOTVSMALL, ROOTVSMALL); + overallBb.max() += Foam::point(ROOTVSMALL, ROOTVSMALL, ROOTVSMALL); + + surfacePtLocationTreePtr_.reset + ( + new dynamicIndexedOctree<dynamicTreeDataPoint> + ( + dynamicTreeDataPoint(existingSurfacePtLocations), + overallBb, // overall search domain + 10, // max levels, n/a + 20.0, // maximum ratio of cubes v.s. cells + 100.0 // max. duplicity; n/a since no bounding boxes. + ) + ); +} + + +void Foam::conformalVoronoiMesh::buildSizeAndAlignmentTree() const +{ + if (sizeAndAlignmentLocations_.empty()) + { + FatalErrorIn("buildSizeAndAlignmentTree()") + << "sizeAndAlignmentLocations empty, must be populated before " + << "sizeAndAlignmentTree can be built." + << exit(FatalError); + } + + treeBoundBox overallBb + ( + geometryToConformTo_.globalBounds().extend(rndGen_, 1e-4) + ); + + overallBb.min() -= Foam::point(ROOTVSMALL, ROOTVSMALL, ROOTVSMALL); + overallBb.max() += Foam::point(ROOTVSMALL, ROOTVSMALL, ROOTVSMALL); + + sizeAndAlignmentTreePtr_.reset + ( + new indexedOctree<treeDataPoint> + ( + treeDataPoint(sizeAndAlignmentLocations_), + overallBb, // overall search domain + 10, // max levels + 20.0, // maximum ratio of cubes v.s. cells + 100.0 // max. duplicity; n/a since no bounding boxes. + ) + ); +} + + +void Foam::conformalVoronoiMesh::addSurfaceAndEdgeHits +( + const Delaunay::Finite_vertices_iterator& vit, + const pointIndexHitAndFeatureDynList& surfaceIntersections, + scalar surfacePtReplaceDistCoeffSqr, + scalar edgeSearchDistCoeffSqr, + pointIndexHitAndFeatureDynList& surfaceHits, + pointIndexHitAndFeatureDynList& featureEdgeHits +) const +{ + const scalar cellSize = targetCellSize(topoint(vit->point())); + const scalar cellSizeSqr = sqr(cellSize); + + forAll(surfaceIntersections, sI) + { + pointIndexHitAndFeature surfHitI = surfaceIntersections[sI]; + + bool keepSurfacePoint = true; + + if (!surfHitI.first().hit()) + { + continue; + } + + bool isNearFeaturePt = nearFeaturePt(surfHitI.first().hitPoint()); + + bool isNearSurfacePt = nearSurfacePoint(surfHitI); + + if (isNearFeaturePt || isNearSurfacePt) + { + keepSurfacePoint = false; + } + + List<List<pointIndexHit> > edHitsByFeature; + + labelList featuresHit; + + const scalar searchRadiusSqr = edgeSearchDistCoeffSqr*cellSizeSqr; + + geometryToConformTo_.findAllNearestEdges + ( + surfHitI.first().hitPoint(), + searchRadiusSqr, + edHitsByFeature, + featuresHit + ); + + forAll(edHitsByFeature, i) + { + const label featureHit = featuresHit[i]; + + List<pointIndexHit>& edHits = edHitsByFeature[i]; + + forAll(edHits, eHitI) + { + pointIndexHit& edHit = edHits[eHitI]; + + if (edHit.hit()) + { + const Foam::point& edPt = edHit.hitPoint(); + + if (!nearFeaturePt(edPt)) + { + if + ( + magSqr(edPt - surfHitI.first().hitPoint()) + < surfacePtReplaceDistCoeffSqr*cellSizeSqr + ) + { + // If the point is within a given distance of a + // feature edge, give control to edge control points + // instead, this will prevent "pits" forming. + + keepSurfacePoint = false; + + // NEED TO REMOVE FROM THE SURFACE TREE... +// surfacePtLocationTreePtr_().remove +// ( +// existingSurfacePtLocations_.size() - 1 +// ); + } + + if + ( + !nearFeatureEdgeLocation + ( + edHit + ) + ) + { + // Do not place edge control points too close to a + // feature point or existing edge control points + featureEdgeHits.append + ( + pointIndexHitAndFeature(edHit, featureHit) + ); + } + } + } + } + } + + if (keepSurfacePoint) + { + surfaceHits.append(surfHitI); + } + } +} + + +void Foam::conformalVoronoiMesh::storeSurfaceConformation() +{ + Info<< nl << "Storing surface conformation" << endl; + + surfaceConformationVertices_.clear(); + + // Use a temporary dynamic list to speed up insertion. + DynamicList<Vb> tempSurfaceVertices(number_of_vertices()/10); + + for + ( + Delaunay::Finite_vertices_iterator vit = finite_vertices_begin(); + vit != finite_vertices_end(); + vit++ + ) + { + // Store points that are not referred, part of a pair, but not feature + // points + if + ( + !vit->referred() + && vit->boundaryPoint() + && !vit->featurePoint() + ) + { + tempSurfaceVertices.append + ( + Vb + ( + vit->point(), + vit->type() + ) + ); + } + } + + tempSurfaceVertices.shrink(); + + surfaceConformationVertices_.transfer(tempSurfaceVertices); + + Info<< " Stored " + << returnReduce + ( + label(surfaceConformationVertices_.size()), + sumOp<label>() + ) + << " vertices" << nl << endl; +} + + +void Foam::conformalVoronoiMesh::reinsertSurfaceConformation() +{ + Info<< nl << "Reinserting stored surface conformation" << endl; + + const label preReinsertionSize(number_of_vertices()); + + // It is assumed that the stored surface conformation is on the correct + // processor and does not need distributed + rangeInsertWithInfo + ( + surfaceConformationVertices_.begin(), + surfaceConformationVertices_.end(), + true + ); + + const label nInserted = label(number_of_vertices()) - preReinsertionSize; + const label nFailed = surfaceConformationVertices_.size() - nInserted; + + Info<< " " << returnReduce(nInserted, sumOp<label>()) + << " points reinserted, failed to insert " + << returnReduce(nFailed, sumOp<label>()) + << endl; +} + + +// ************************************************************************* // diff --git a/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/conformalVoronoiMesh/conformalVoronoiMeshFeaturePointSpecialisations.C b/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/conformalVoronoiMesh/conformalVoronoiMeshFeaturePointSpecialisations.C new file mode 100644 index 0000000000000000000000000000000000000000..2f7579cbbff95339c341b32c9857ec82dcc100b0 --- /dev/null +++ b/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/conformalVoronoiMesh/conformalVoronoiMeshFeaturePointSpecialisations.C @@ -0,0 +1,436 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2012 OpenFOAM Foundation + \\/ M anipulation | +------------------------------------------------------------------------------- +License + This file is part of OpenFOAM. + + OpenFOAM is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + OpenFOAM is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>. + +\*---------------------------------------------------------------------------*/ + +#include "conformalVoronoiMesh.H" +#include "vectorTools.H" + +using namespace Foam::vectorTools; + +// * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * * // + +Foam::List<Foam::extendedFeatureEdgeMesh::edgeStatus> +Foam::conformalVoronoiMesh::calcPointFeatureEdgesTypes +( + const extendedFeatureEdgeMesh& feMesh, + const labelList& pEds, + pointFeatureEdgesTypes& pFEdgeTypes +) +{ + List<extendedFeatureEdgeMesh::edgeStatus> allEdStat(pEds.size()); + + forAll(pEds, i) + { + label edgeI = pEds[i]; + + extendedFeatureEdgeMesh::edgeStatus& eS = allEdStat[i]; + + eS = feMesh.getEdgeStatus(edgeI); + + pFEdgeTypes(eS)++; + } + + if (debug) + { + Info<< pFEdgeTypes << endl; + } + + return allEdStat; +} + + +bool Foam::conformalVoronoiMesh::createSpecialisedFeaturePoint +( + const extendedFeatureEdgeMesh& feMesh, + const labelList& pEds, + const pointFeatureEdgesTypes& pFEdgesTypes, + const List<extendedFeatureEdgeMesh::edgeStatus>& allEdStat, + const label ptI, + DynamicList<Vb>& pts +) +{ + if + ( + !pFEdgesTypes.found(extendedFeatureEdgeMesh::EXTERNAL) + || !pFEdgesTypes.found(extendedFeatureEdgeMesh::INTERNAL) + ) + { + return false; + } + + if + ( + pFEdgesTypes[extendedFeatureEdgeMesh::EXTERNAL] == 2 + && pFEdgesTypes[extendedFeatureEdgeMesh::INTERNAL] == 1 + && pEds.size() == 3 + ) + { + Info<< "nExternal == 2 && nInternal == 1" << endl; + + const Foam::point& featPt = feMesh.points()[ptI]; + + if (!positionOnThisProc(featPt)) + { + return false; + } + + label nVert = number_of_vertices(); + + const label initialNumOfPoints = pts.size(); + + const scalar ppDist = pointPairDistance(featPt); + + const vectorField& normals = feMesh.normals(); + + const labelListList& edgeNormals = feMesh.edgeNormals(); + + label concaveEdgeI = -1; + labelList convexEdgesI(2, -1); + label nConvex = 0; + + forAll(pEds, i) + { + const extendedFeatureEdgeMesh::edgeStatus& eS = allEdStat[i]; + + if (eS == extendedFeatureEdgeMesh::INTERNAL) + { + concaveEdgeI = pEds[i]; + } + else if (eS == extendedFeatureEdgeMesh::EXTERNAL) + { + convexEdgesI[nConvex++] = pEds[i]; + } + else if (eS == extendedFeatureEdgeMesh::FLAT) + { + WarningIn("Foam::conformalVoronoiMesh::" + "createSpecialisedFeaturePoint") + << "Edge " << eS << " is flat" + << endl; + } + else + { + FatalErrorIn("Foam::conformalVoronoiMesh::" + "createSpecialisedFeaturePoint") + << "Edge " << eS << " not concave/convex" + << exit(FatalError); + } + } + + const vector& concaveEdgePlaneANormal = + normals[edgeNormals[concaveEdgeI][0]]; + + const vector& concaveEdgePlaneBNormal = + normals[edgeNormals[concaveEdgeI][1]]; + + // Intersect planes parallel to the concave edge planes offset + // by ppDist and the plane defined by featPt and the edge vector. + plane planeA + ( + featPt + ppDist*concaveEdgePlaneANormal, + concaveEdgePlaneANormal + ); + + plane planeB + ( + featPt + ppDist*concaveEdgePlaneBNormal, + concaveEdgePlaneBNormal + ); + + const vector& concaveEdgeDir = feMesh.edgeDirection + ( + concaveEdgeI, + ptI + ); + + // Todo,needed later but want to get rid of this. + const Foam::point concaveEdgeLocalFeatPt = + featPt + ppDist*concaveEdgeDir; + + // Finding the nearest point on the intersecting line to the edge + // point. Floating point errors often occur using planePlaneIntersect + + plane planeF(concaveEdgeLocalFeatPt, concaveEdgeDir); + + const Foam::point concaveEdgeExternalPt = planeF.planePlaneIntersect + ( + planeA, + planeB + ); + + // Redefine planes to be on the feature surfaces to project through + + planeA = plane(featPt, concaveEdgePlaneANormal); + + planeB = plane(featPt, concaveEdgePlaneBNormal); + + const Foam::point internalPtA = + concaveEdgeExternalPt + - 2.0*planeA.distance(concaveEdgeExternalPt) + *concaveEdgePlaneANormal; + + pts.append + ( + Vb(internalPtA, Vb::vtInternalFeaturePoint) + ); + + const Foam::point internalPtB = + concaveEdgeExternalPt + - 2.0*planeB.distance(concaveEdgeExternalPt) + *concaveEdgePlaneBNormal; + + pts.append + ( + Vb(internalPtB, Vb::vtInternalFeaturePoint) + ); + + // Add the external points + + Foam::point externalPtD; + Foam::point externalPtE; + + vector convexEdgePlaneCNormal(0,0,0); + vector convexEdgePlaneDNormal(0,0,0); + + const labelList& concaveEdgeNormals = edgeNormals[concaveEdgeI]; + const labelList& convexEdgeANormals = edgeNormals[convexEdgesI[0]]; + const labelList& convexEdgeBNormals = edgeNormals[convexEdgesI[1]]; + + forAll(concaveEdgeNormals, edgeNormalI) + { + bool convexEdgeA = false; + bool convexEdgeB = false; + + forAll(convexEdgeANormals, edgeAnormalI) + { + const vector& concaveNormal + = normals[concaveEdgeNormals[edgeNormalI]]; + const vector& convexNormal + = normals[convexEdgeANormals[edgeAnormalI]]; + + Info<< "Angle between vectors = " + << degAngleBetween(concaveNormal, convexNormal) << endl; + + // Need a looser tolerance, because sometimes adjacent triangles + // on the same surface will be slightly out of alignment. + if (areParallel(concaveNormal, convexNormal, tolParallel)) + { + convexEdgeA = true; + } + } + + forAll(convexEdgeBNormals, edgeBnormalI) + { + const vector& concaveNormal + = normals[concaveEdgeNormals[edgeNormalI]]; + const vector& convexNormal + = normals[convexEdgeBNormals[edgeBnormalI]]; + + Info<< "Angle between vectors = " + << degAngleBetween(concaveNormal, convexNormal) << endl; + + // Need a looser tolerance, because sometimes adjacent triangles + // on the same surface will be slightly out of alignment. + if (areParallel(concaveNormal, convexNormal, tolParallel)) + { + convexEdgeB = true; + } + } + + if ((convexEdgeA && convexEdgeB) || (!convexEdgeA && !convexEdgeB)) + { + WarningIn + ( + "Foam::conformalVoronoiMesh" + "::createSpecialisedFeaturePoint" + ) + << "Both or neither of the convex edges share the concave " + << "edge's normal." + << " convexEdgeA = " << convexEdgeA + << " convexEdgeB = " << convexEdgeB + << endl; + + // Remove points that have just been added before returning + for (label i = 0; i < 2; ++i) + { + pts.remove(); + nVert--; + } + + return false; + } + + if (convexEdgeA) + { + forAll(convexEdgeANormals, edgeAnormalI) + { + const vector& concaveNormal + = normals[concaveEdgeNormals[edgeNormalI]]; + const vector& convexNormal + = normals[convexEdgeANormals[edgeAnormalI]]; + + if + ( + !areParallel(concaveNormal, convexNormal, tolParallel) + ) + { + convexEdgePlaneCNormal = convexNormal; + + plane planeC(featPt, convexEdgePlaneCNormal); + + externalPtD = + internalPtA + + 2.0*planeC.distance(internalPtA) + *convexEdgePlaneCNormal; + + pts.append + ( + Vb(externalPtD, Vb::vtExternalFeaturePoint) + ); + } + } + } + + if (convexEdgeB) + { + forAll(convexEdgeBNormals, edgeBnormalI) + { + const vector& concaveNormal + = normals[concaveEdgeNormals[edgeNormalI]]; + const vector& convexNormal + = normals[convexEdgeBNormals[edgeBnormalI]]; + + if + ( + !areParallel(concaveNormal, convexNormal, tolParallel) + ) + { + convexEdgePlaneDNormal = convexNormal; + + plane planeD(featPt, convexEdgePlaneDNormal); + + externalPtE = + internalPtB + + 2.0*planeD.distance(internalPtB) + *convexEdgePlaneDNormal; + + pts.append + ( + Vb(externalPtE, Vb::vtExternalFeaturePoint) + ); + } + } + } + } + + pts.append + ( + Vb(concaveEdgeExternalPt, Vb::vtExternalFeaturePoint) + ); + + const scalar totalAngle = radToDeg + ( + constant::mathematical::pi + + radAngleBetween(concaveEdgePlaneANormal, concaveEdgePlaneBNormal) + ); + + if (totalAngle > cvMeshControls().maxQuadAngle()) + { + // Add additional mitreing points + //scalar angleSign = 1.0; + + + vector convexEdgesPlaneNormal = + 0.5*(convexEdgePlaneCNormal + convexEdgePlaneDNormal); + + plane planeM(featPt, convexEdgesPlaneNormal); + +// if +// ( +// geometryToConformTo_.outside +// ( +// featPt - convexEdgesPlaneNormal*ppDist +// ) +// ) +// { +// angleSign = -1.0; +// } + +// scalar phi = +// angleSign*acos(concaveEdgeDir & -convexEdgesPlaneNormal); +// +// scalar guard = +// ( +// 1.0 + sin(phi)*ppDist/mag +// ( +// concaveEdgeLocalFeatPt - concaveEdgeExternalPt +// ) +// )/cos(phi) - 1.0; + + const Foam::point internalPtF = + concaveEdgeExternalPt + //+ (2.0 + guard)*(concaveEdgeLocalFeatPt - concaveEdgeExternalPt); + + 2.0*(concaveEdgeLocalFeatPt - concaveEdgeExternalPt); + + pts.append + ( + Vb(internalPtF, Vb::vtInternalFeaturePoint) + ); + + const Foam::point externalPtG = + internalPtF + + 2.0*planeM.distance(internalPtF)*convexEdgesPlaneNormal; + + pts.append + ( + Vb(externalPtG, Vb::vtExternalFeaturePoint) + ); + } + + if (debug) + { + for (label ptI = initialNumOfPoints; ptI < pts.size(); ++ptI) + { + Info<< "Point " << ptI << " : "; + meshTools::writeOBJ(Info, topoint(pts[ptI].point())); + } + } + + return true; + } + else if + ( + pFEdgesTypes[extendedFeatureEdgeMesh::EXTERNAL] == 1 + && pFEdgesTypes[extendedFeatureEdgeMesh::INTERNAL] == 2 + ) + { + // Info<< "nExternal == 1 && nInternal == 2" << endl; + + return false; + } + + return false; +} + + +// ************************************************************************* // diff --git a/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/conformalVoronoiMesh/conformalVoronoiMeshFeaturePoints.C b/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/conformalVoronoiMesh/conformalVoronoiMeshFeaturePoints.C new file mode 100644 index 0000000000000000000000000000000000000000..028dd5a0df09cf18f6e1a55b3fd3e6be08fbc1ad --- /dev/null +++ b/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/conformalVoronoiMesh/conformalVoronoiMeshFeaturePoints.C @@ -0,0 +1,1235 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2012 OpenFOAM Foundation + \\/ M anipulation | +------------------------------------------------------------------------------- +License + This file is part of OpenFOAM. + + OpenFOAM is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + OpenFOAM is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>. + +\*---------------------------------------------------------------------------*/ + +#include "conformalVoronoiMesh.H" +#include "vectorTools.H" +#include "triangle.H" +#include "tetrahedron.H" +#include "const_circulator.H" + +using namespace Foam::vectorTools; + +// * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * * // + +void Foam::conformalVoronoiMesh::createEdgePointGroup +( + const extendedFeatureEdgeMesh& feMesh, + const pointIndexHit& edHit, + DynamicList<Vb>& pts +) +{ + label edgeI = edHit.index(); + + extendedFeatureEdgeMesh::edgeStatus edStatus = feMesh.getEdgeStatus(edgeI); + + switch (edStatus) + { + case extendedFeatureEdgeMesh::EXTERNAL: + { + createExternalEdgePointGroup(feMesh, edHit, pts); + break; + } + case extendedFeatureEdgeMesh::INTERNAL: + { + createInternalEdgePointGroup(feMesh, edHit, pts); + break; + } + case extendedFeatureEdgeMesh::FLAT: + { + createFlatEdgePointGroup(feMesh, edHit, pts); + break; + } + case extendedFeatureEdgeMesh::OPEN: + { + createOpenEdgePointGroup(feMesh, edHit, pts); + break; + } + case extendedFeatureEdgeMesh::MULTIPLE: + { + createMultipleEdgePointGroup(feMesh, edHit, pts); + break; + } + case extendedFeatureEdgeMesh::NONE: + { + break; + } + } +} + + +void Foam::conformalVoronoiMesh::createExternalEdgePointGroup +( + const extendedFeatureEdgeMesh& feMesh, + const pointIndexHit& edHit, + DynamicList<Vb>& pts +) +{ + const Foam::point& edgePt = edHit.hitPoint(); + + scalar ppDist = pointPairDistance(edgePt); + + const vectorField& feNormals = feMesh.normals(); + const labelList& edNormalIs = feMesh.edgeNormals()[edHit.index()]; + + // As this is an external edge, there are two normals by definition + const vector& nA = feNormals[edNormalIs[0]]; + const vector& nB = feNormals[edNormalIs[1]]; + + if (areParallel(nA, nB)) + { + // The normals are nearly parallel, so this is too sharp a feature to + // conform to. + return; + } + + // Normalised distance of reference point from edge point + vector refVec((nA + nB)/(1 + (nA & nB))); + + if (magSqr(refVec) > sqr(5.0)) + { + // Limit the size of the conformation + ppDist *= 5.0/mag(refVec); + + // Pout<< nl << "createExternalEdgePointGroup limit " + // << "edgePt " << edgePt << nl + // << "refVec " << refVec << nl + // << "mag(refVec) " << mag(refVec) << nl + // << "ppDist " << ppDist << nl + // << "nA " << nA << nl + // << "nB " << nB << nl + // << "(nA & nB) " << (nA & nB) << nl + // << endl; + } + + // Convex. So refPt will be inside domain and hence a master point + Foam::point refPt = edgePt - ppDist*refVec; + + // Result when the points are eventually inserted. + // Add number_of_vertices() at insertion of first vertex to all numbers: + // pt index type + // refPt 0 1 + // reflectedA 1 0 + // reflectedB 2 0 + + // Insert the master point pairing the the first slave + + if (!geometryToConformTo_.inside(refPt)) + { + return; + } + + pts.append + ( + Vb(refPt, Vb::vtInternalFeatureEdge) + ); + + // Insert the slave points by reflecting refPt in both faces. + // with each slave refering to the master + + Foam::point reflectedA = refPt + 2*ppDist*nA; + pts.append + ( + Vb(reflectedA, Vb::vtExternalFeatureEdge) + ); + + Foam::point reflectedB = refPt + 2*ppDist*nB; + pts.append + ( + Vb(reflectedB, Vb::vtExternalFeatureEdge) + ); +} + + +void Foam::conformalVoronoiMesh::createInternalEdgePointGroup +( + const extendedFeatureEdgeMesh& feMesh, + const pointIndexHit& edHit, + DynamicList<Vb>& pts +) +{ + const Foam::point& edgePt = edHit.hitPoint(); + + scalar ppDist = pointPairDistance(edgePt); + + const vectorField& feNormals = feMesh.normals(); + const labelList& edNormalIs = feMesh.edgeNormals()[edHit.index()]; + + // As this is an external edge, there are two normals by definition + const vector& nA = feNormals[edNormalIs[0]]; + const vector& nB = feNormals[edNormalIs[1]]; + + if (areParallel(nA, nB)) + { + // The normals are nearly parallel, so this is too sharp a feature to + // conform to. + + return; + } + + // Normalised distance of reference point from edge point + vector refVec((nA + nB)/(1 + (nA & nB))); + + if (magSqr(refVec) > sqr(5.0)) + { + // Limit the size of the conformation + ppDist *= 5.0/mag(refVec); + + // Pout<< nl << "createInternalEdgePointGroup limit " + // << "edgePt " << edgePt << nl + // << "refVec " << refVec << nl + // << "mag(refVec) " << mag(refVec) << nl + // << "ppDist " << ppDist << nl + // << "nA " << nA << nl + // << "nB " << nB << nl + // << "(nA & nB) " << (nA & nB) << nl + // << endl; + } + + // Concave. master and reflected points inside the domain. + Foam::point refPt = edgePt - ppDist*refVec; + + // Generate reflected master to be outside. + Foam::point reflMasterPt = refPt + 2*(edgePt - refPt); + + // Reflect reflMasterPt in both faces. + Foam::point reflectedA = reflMasterPt - 2*ppDist*nA; + + Foam::point reflectedB = reflMasterPt - 2*ppDist*nB; + + scalar totalAngle = + radToDeg(constant::mathematical::pi + radAngleBetween(nA, nB)); + + // Number of quadrants the angle should be split into + int nQuads = int(totalAngle/cvMeshControls().maxQuadAngle()) + 1; + + // The number of additional master points needed to obtain the + // required number of quadrants. + int nAddPoints = min(max(nQuads - 2, 0), 2); + + // Add number_of_vertices() at insertion of first vertex to all numbers: + // Result for nAddPoints 1 when the points are eventually inserted + // pt index type + // reflectedA 0 2 + // reflectedB 1 2 + // reflMasterPt 2 0 + + // Result for nAddPoints 1 when the points are eventually inserted + // pt index type + // reflectedA 0 3 + // reflectedB 1 3 + // refPt 2 3 + // reflMasterPt 3 0 + + // Result for nAddPoints 2 when the points are eventually inserted + // pt index type + // reflectedA 0 4 + // reflectedB 1 4 + // reflectedAa 2 4 + // reflectedBb 3 4 + // reflMasterPt 4 0 + + if + ( + !geometryToConformTo_.inside(reflectedA) + || !geometryToConformTo_.inside(reflectedB) + ) + { + return; + } + + // Master A is inside. + pts.append + ( + Vb(reflectedA, Vb::vtInternalFeatureEdge) + ); + + // Master B is inside. + pts.append + ( + Vb(reflectedB, Vb::vtInternalFeatureEdge) + ); + + if (nAddPoints == 1) + { + // One additinal point is the reflection of the slave point, + // i.e. the original reference point + pts.append + ( + Vb(refPt, Vb::vtInternalFeatureEdge) + ); + } + else if (nAddPoints == 2) + { + Foam::point reflectedAa = refPt + ppDist*nB; + pts.append + ( + Vb(reflectedAa, Vb::vtInternalFeatureEdge) + ); + + Foam::point reflectedBb = refPt + ppDist*nA; + pts.append + ( + Vb(reflectedBb, Vb::vtInternalFeatureEdge) + ); + } + + // Slave is outside. + pts.append + ( + Vb(reflMasterPt, Vb::vtExternalFeatureEdge) + ); +} + + +void Foam::conformalVoronoiMesh::createFlatEdgePointGroup +( + const extendedFeatureEdgeMesh& feMesh, + const pointIndexHit& edHit, + DynamicList<Vb>& pts +) +{ + const Foam::point& edgePt = edHit.hitPoint(); + + const scalar ppDist = pointPairDistance(edgePt); + + const vectorField& feNormals = feMesh.normals(); + const labelList& edNormalIs = feMesh.edgeNormals()[edHit.index()]; + + // As this is a flat edge, there are two normals by definition + const vector& nA = feNormals[edNormalIs[0]]; + const vector& nB = feNormals[edNormalIs[1]]; + + // Average normal to remove any bias to one side, although as this + // is a flat edge, the normals should be essentially the same + const vector n = 0.5*(nA + nB); + + // Direction along the surface to the control point, sense of edge + // direction not important, as +s and -s can be used because this + // is a flat edge + vector s = ppDist*(feMesh.edgeDirections()[edHit.index()] ^ n); + + createPointPair(ppDist, edgePt + s, n, pts); + createPointPair(ppDist, edgePt - s, n, pts); +} + + +void Foam::conformalVoronoiMesh::createOpenEdgePointGroup +( + const extendedFeatureEdgeMesh& feMesh, + const pointIndexHit& edHit, + DynamicList<Vb>& pts +) +{ +// // Assume it is a baffle and insert flat edge point pairs +// const Foam::point& edgePt = edHit.hitPoint(); +// +// const scalar ppDist = pointPairDistance(edgePt); +// +// const vectorField& feNormals = feMesh.normals(); +// const labelList& edNormalIs = feMesh.edgeNormals()[edHit.index()]; +// +// // As this is a flat edge, there are two normals by definition +// const vector& nA = feNormals[edNormalIs[0]]; +// const vector& nB = feNormals[edNormalIs[1]]; +// +// // Average normal to remove any bias to one side, although as this +// // is a flat edge, the normals should be essentially the same +// const vector n = 0.5*(nA + nB); +// +// // Direction along the surface to the control point, sense of edge +// // direction not important, as +s and -s can be used because this +// // is a flat edge +// vector s = ppDist*(feMesh.edgeDirections()[edHit.index()] ^ n); +// +// createBafflePointPair(ppDist, edgePt + s, n, pts); +// createBafflePointPair(ppDist, edgePt - s, n, pts); + + Info<< "NOT INSERTING OPEN EDGE POINT GROUP, NOT IMPLEMENTED" << endl; +} + + +void Foam::conformalVoronoiMesh::createMultipleEdgePointGroup +( + const extendedFeatureEdgeMesh& feMesh, + const pointIndexHit& edHit, + DynamicList<Vb>& pts +) +{ + Info<< "NOT INSERTING MULTIPLE EDGE POINT GROUP, NOT IMPLEMENTED" << endl; +} + + +void Foam::conformalVoronoiMesh::reinsertFeaturePoints(bool distribute) +{ + Info<< nl << "Reinserting stored feature points" << endl; + + label preReinsertionSize(number_of_vertices()); + + insertPoints(featureVertices_, distribute); + + const label nReinserted = returnReduce + ( + label(number_of_vertices()) - preReinsertionSize, + sumOp<label>() + ); + + Info<< " Reinserted " << nReinserted << " vertices" << endl; +} + + +void Foam::conformalVoronoiMesh::createMixedFeaturePoints +( + DynamicList<Vb>& pts +) +{ + if (cvMeshControls().mixedFeaturePointPPDistanceCoeff() < 0) + { + Info<< nl << "Skipping specialised handling for mixed feature points" + << endl; + return; + } + + const PtrList<extendedFeatureEdgeMesh>& feMeshes + ( + geometryToConformTo_.features() + ); + + forAll(feMeshes, i) + { + const extendedFeatureEdgeMesh& feMesh = feMeshes[i]; + const labelListList& pointsEdges = feMesh.pointEdges(); + const pointField& points = feMesh.points(); + + for + ( + label ptI = feMesh.mixedStart(); + ptI < feMesh.nonFeatureStart(); + ptI++ + ) + { + const Foam::point& featPt = points[ptI]; + + if (!positionOnThisProc(featPt)) + { + continue; + } + + const labelList& pEds = pointsEdges[ptI]; + + pointFeatureEdgesTypes pFEdgeTypes(ptI); + + const List<extendedFeatureEdgeMesh::edgeStatus> allEdStat + = calcPointFeatureEdgesTypes(feMesh, pEds, pFEdgeTypes); + + bool specialisedSuccess = false; + + if (cvMeshControls().specialiseFeaturePoints()) + { + specialisedSuccess = createSpecialisedFeaturePoint + ( + feMesh, pEds, pFEdgeTypes, allEdStat, ptI, pts + ); + } + + if (!specialisedSuccess) + { + // Specialisations available for some mixed feature points. For + // non-specialised feature points, inserting mixed internal and + // external edge groups at feature point. + + // Skipping unsupported mixed feature point types + bool skipEdge = false; + + forAll(pEds, e) + { + const label edgeI = pEds[e]; + + const extendedFeatureEdgeMesh::edgeStatus edStatus + = feMesh.getEdgeStatus(edgeI); + + if + ( + edStatus == extendedFeatureEdgeMesh::OPEN + || edStatus == extendedFeatureEdgeMesh::MULTIPLE + ) + { + Info<< "Edge type " << edStatus + << " found for mixed feature point " << ptI + << ". Not supported." + << endl; + + skipEdge = true; + } + } + + if (skipEdge) + { + Info<< "Skipping point " << ptI << nl << endl; + + continue; + } + +// createFeaturePoints(feMesh, ptI, pts, types); + + const Foam::point pt = points[ptI]; + + const scalar edgeGroupDistance = mixedFeaturePointDistance(pt); + + forAll(pEds, e) + { + const label edgeI = pEds[e]; + + const Foam::point edgePt = + pt + edgeGroupDistance*feMesh.edgeDirection(edgeI, ptI); + + const pointIndexHit edgeHit(true, edgePt, edgeI); + + createEdgePointGroup(feMesh, edgeHit, pts); + } + } + } + } +} +// +// +//void Foam::conformalVoronoiMesh::createFeaturePoints +//( +// DynamicList<Foam::point>& pts, +// DynamicList<label>& indices, +// DynamicList<label>& types +//) +//{ +// const PtrList<extendedFeatureEdgeMesh>& feMeshes +// ( +// geometryToConformTo_.features() +// ); +// +// forAll(feMeshes, i) +// { +// const extendedFeatureEdgeMesh& feMesh(feMeshes[i]); +// +// for +// ( +// label ptI = feMesh.convexStart(); +// ptI < feMesh.mixedStart(); +// ++ptI +// ) +// { +// const Foam::point& featPt = feMesh.points()[ptI]; +// +// if (!positionOnThisProc(featPt)) +// { +// continue; +// } +// +// const scalar searchRadiusSqr = 5.0*targetCellSize(featPt); +// +// labelList indices = surfacePtLocationTreePtr_().findSphere +// ( +// featPt, +// searchRadiusSqr +// ); +// +// pointField nearestSurfacePoints(indices.size()); +// +// forAll(indices, pI) +// { +// nearestSurfacePoints[pI] = +// surfaceConformationVertices_[indices[pI]]; +// } +// +// forAll(feMesh.) +// +// // Now find the nearest points within the edge cones. +// +// // Calculate preliminary surface point locations +// +// +// } +// } +//} + + +void Foam::conformalVoronoiMesh::insertFeaturePoints() +{ + Info<< nl << "Conforming to feature points" << endl; + + DynamicList<Vb> pts; + + const label preFeaturePointSize = number_of_vertices(); + + createFeaturePoints(pts); + + createMixedFeaturePoints(pts); + + // Points added using the createEdgePointGroup function will be labelled as + // internal/external feature edges. Relabel them as feature points, + // otherwise they are inserted as both feature points and surface points. + forAll(pts, pI) + { + Vb& pt = pts[pI]; + + if (pt.featureEdgePoint()) + { + if (pt.internalBoundaryPoint()) + { + pt.type() = Vb::vtInternalFeaturePoint; + } + else if (pt.externalBoundaryPoint()) + { + pt.type() = Vb::vtExternalFeaturePoint; + } + } + } + + // Insert the created points, distributing to the appropriate processor + insertPoints(pts, true); + + if (cvMeshControls().objOutput()) + { + writePoints("featureVertices.obj", pts); + } + + label nFeatureVertices = number_of_vertices() - preFeaturePointSize; + + if (Pstream::parRun()) + { + reduce(nFeatureVertices, sumOp<label>()); + } + + if (nFeatureVertices > 0) + { + Info<< " Inserted " << nFeatureVertices + << " feature vertices" << endl; + } + + featureVertices_.clear(); + featureVertices_.setSize(pts.size()); + + forAll(pts, pI) + { + featureVertices_[pI] = pts[pI]; + } + + constructFeaturePointLocations(); +} + + +void Foam::conformalVoronoiMesh::constructFeaturePointLocations() +{ + DynamicList<Foam::point> ftPtLocs; + + const PtrList<extendedFeatureEdgeMesh>& feMeshes + ( + geometryToConformTo_.features() + ); + + forAll(feMeshes, i) + { + const extendedFeatureEdgeMesh& feMesh(feMeshes[i]); + + if (cvMeshControls().mixedFeaturePointPPDistanceCoeff() < 0) + { + // Ignoring mixed feature points + for + ( + label ptI = feMesh.convexStart(); + ptI < feMesh.mixedStart(); + ptI++ + ) + { + ftPtLocs.append(feMesh.points()[ptI]); + } + } + else + { + for + ( + label ptI = feMesh.convexStart(); + ptI < feMesh.nonFeatureStart(); + ptI++ + ) + { + ftPtLocs.append(feMesh.points()[ptI]); + } + } + } + + featurePointLocations_.transfer(ftPtLocs); +} + + +Foam::List<Foam::pointIndexHit> +Foam::conformalVoronoiMesh::findSurfacePtLocationsNearFeaturePoint +( + const Foam::point& featurePoint +) const +{ + DynamicList<pointIndexHit> dynPointList; + + const scalar searchRadiusSqr = 3*targetCellSize(featurePoint); + + labelList surfacePtList = surfacePtLocationTreePtr_().findSphere + ( + featurePoint, + searchRadiusSqr + ); + + forAll(surfacePtList, elemI) + { + label index = surfacePtList[elemI]; + + const Foam::point& p + = surfacePtLocationTreePtr_().shapes().shapePoints()[index]; + + pointIndexHit nearHit(true, p, index); + + dynPointList.append(nearHit); + } + + return dynPointList.shrink(); +} + + +void Foam::conformalVoronoiMesh::addMasterAndSlavePoints +( + const DynamicList<Foam::point>& masterPoints, + const DynamicList<Foam::indexedVertexEnum::vertexType>& masterPointsTypes, + const Map<DynamicList<autoPtr<plane> > >& masterPointReflections, + DynamicList<Vb>& pts, + const label ptI +) const +{ + typedef DynamicList<autoPtr<plane> > planeDynList; + typedef Foam::indexedVertexEnum::vertexType vertexType; + + forAll(masterPoints, pI) + { + // Append master to the list of points + +// OFstream strMasters("fpm_" + name(ptI) + ".obj"); +// OFstream strSlaves("fps_" + name(ptI) + ".obj"); + + const Foam::point& masterPt = masterPoints[pI]; + const vertexType masterType = masterPointsTypes[pI]; + + pts.append + ( + Vb + ( + masterPt, + masterType + ) + ); + +// meshTools::writeOBJ(strMasters, masterPt); + + const planeDynList& masterPointPlanes = masterPointReflections[pI]; + + forAll(masterPointPlanes, planeI) + { + // Reflect master points in the planes and insert the slave points + + const plane& reflPlane = masterPointPlanes[planeI](); + + const Foam::point slavePt = + reflectPointInPlane(masterPt, reflPlane); + + const vertexType slaveType = + ( + masterType == Vb::vtInternalFeaturePoint + ? Vb::vtExternalFeaturePoint // true + : Vb::vtInternalFeaturePoint // false + ); + + pts.append + ( + Vb + ( + slavePt, + slaveType + ) + ); + +// meshTools::writeOBJ(strSlaves, slavePt); + } + } +} + + +Foam::label Foam::conformalVoronoiMesh::getSign +( + const extendedFeatureEdgeMesh::edgeStatus eStatus +) const +{ + if (eStatus == extendedFeatureEdgeMesh::EXTERNAL) + { + return -1; + } + else if (eStatus == extendedFeatureEdgeMesh::INTERNAL) + { + return 1; + } + + return 0; +} + + +void Foam::conformalVoronoiMesh::createMasterAndSlavePoints +( + const extendedFeatureEdgeMesh& feMesh, + const label ptI, + DynamicList<Vb>& pts +) const +{ + typedef DynamicList<autoPtr<plane> > planeDynList; + typedef Foam::indexedVertexEnum::vertexType vertexType; + typedef Foam::extendedFeatureEdgeMesh::edgeStatus edgeStatus; + + const Foam::point& featPt = feMesh.points()[ptI]; + + if (!positionOnThisProc(featPt)) + { + return; + } + + const scalar ppDist = pointPairDistance(featPt); + + // Maintain a list of master points and the planes to relect them in + DynamicList<Foam::point> masterPoints; + DynamicList<vertexType> masterPointsTypes; + Map<planeDynList> masterPointReflections; + + const labelList& featPtEdges = feMesh.featurePointEdges()[ptI]; + + const_circulator<labelList> circ(featPtEdges); + +// Info<< "Point = " << ptI << endl; + + // Loop around the edges of the feature point + if (circ.size()) do + { +// const edgeStatus eStatusPrev = feMesh.getEdgeStatus(circ.prev()); + const edgeStatus eStatusCurr = feMesh.getEdgeStatus(circ()); +// const edgeStatus eStatusNext = feMesh.getEdgeStatus(circ.next()); + +// Info<< "Prev = " +// << extendedFeatureEdgeMesh::edgeStatusNames_[eStatusPrev] +// << " Curr = " +// << extendedFeatureEdgeMesh::edgeStatusNames_[eStatusCurr] +//// << " Next = " +//// << extendedFeatureEdgeMesh::edgeStatusNames_[eStatusNext] +// << endl; + + // Get the direction in which to move the point in relation to the + // feature point + label sign = getSign(eStatusCurr); + + const vector n = sharedFaceNormal(feMesh, circ(), circ.next()); + + const vector pointMotionDirection = sign*0.5*ppDist*n; + + if (masterPoints.empty()) + { + // Initialise with the first master point + + Foam::point pt = featPt + pointMotionDirection; + + planeDynList firstPlane; + firstPlane.append(autoPtr<plane>(new plane(featPt, n))); + + masterPoints.append(pt); + + masterPointsTypes.append + ( + sign == 1 + ? Vb::vtExternalFeaturePoint // true + : Vb::vtInternalFeaturePoint // false + ); + + if + ( + masterPointsTypes.last() == Vb::vtInternalFeaturePoint + && !geometryToConformTo_.inside(masterPoints.last()) + ) + { + return; + } + + const Foam::point reflectedPoint = reflectPointInPlane + ( + masterPoints.last(), + firstPlane.last()() + ); + + if + ( + masterPointsTypes.last() == Vb::vtExternalFeaturePoint + && !geometryToConformTo_.inside(reflectedPoint) + ) + { + return; + } + + masterPointReflections.insert + ( + masterPoints.size() - 1, + firstPlane + ); + } +// else if +// ( +// eStatusPrev == extendedFeatureEdgeMesh::INTERNAL +// && eStatusCurr == extendedFeatureEdgeMesh::EXTERNAL +// ) +// { +// // Insert a new master point. +// Foam::point pt = featPt + pointMotionDirection; +// +// planeDynList firstPlane; +// firstPlane.append(autoPtr<plane>(new plane(featPt, n))); +// +// masterPoints.append(pt); +// +// masterPointsTypes.append +// ( +// sign == 1 +// ? Vb::vtExternalFeaturePoint // true +// : Vb::vtInternalFeaturePoint // false +// ); +// +// masterPointReflections.insert +// ( +// masterPoints.size() - 1, +// firstPlane +// ); +// } +// else if +// ( +// eStatusPrev == extendedFeatureEdgeMesh::EXTERNAL +// && eStatusCurr == extendedFeatureEdgeMesh::INTERNAL +// ) +// { +// +// } + else + { + // Just add this face contribution to the latest master point + + masterPoints.last() += pointMotionDirection; + + masterPointReflections[masterPoints.size() - 1].append + ( + autoPtr<plane>(new plane(featPt, n)) + ); + } + + } while (circ.circulate(CirculatorBase::CLOCKWISE)); + + addMasterAndSlavePoints + ( + masterPoints, + masterPointsTypes, + masterPointReflections, + pts, + ptI + ); +} + + +void Foam::conformalVoronoiMesh::createFeaturePoints(DynamicList<Vb>& pts) +{ + const PtrList<extendedFeatureEdgeMesh>& feMeshes + ( + geometryToConformTo_.features() + ); + + forAll(feMeshes, i) + { + Info<< indent << "Edge mesh = " << feMeshes[i].name() << nl << endl; + + const extendedFeatureEdgeMesh& feMesh(feMeshes[i]); + + for + ( + label ptI = feMesh.convexStart(); + ptI < feMesh.mixedStart(); + ptI++ + ) + { + createMasterAndSlavePoints(feMesh, ptI, pts); + } + } +} + + +//Foam::scalar Foam::conformalVoronoiMesh::pyramidVolume +//( +// const Foam::point& apex, +// const Foam::point& a, +// const Foam::point& b, +// const Foam::point& c, +// const bool printInfo +//) const +//{ +// triPointRef tri(a, b, c); +// +// tetPointRef tet(tri.a(), tri.b(), tri.c(), apex); +// +// scalar volume = tet.mag(); +// +//// scalar volume = (1.0/3.0)*constant::mathematical::pi; +//// +//// K::Circle_3 circle(toPoint(a), toPoint(b), toPoint(c)); +//// +//// scalar height = mag(topoint(circle.center()) - apex); +//// +//// volume *= circle.squared_radius()*height; +// +// if (printInfo) +// { +// Info<< "Calculating volume of pyramid..." << nl +// << " Apex : " << apex << nl +// << " Point a : " << a << nl +// << " Point b : " << b << nl +// << " Point c : " << c << nl +// << " Center : " << tri.centre() << nl +// << " Volume : " << volume << endl; +// } +// +// return volume; +//} + + +//void Foam::conformalVoronoiMesh::createPyramidMasterPoint +//( +// const Foam::point& apex, +// const vectorField& edgeDirections, +// Foam::point& masterPoint, +// vectorField& norms +//) const +//{ +// pointField basePoints(edgeDirections.size() + 1); +// +// forAll(edgeDirections, eI) +// { +// basePoints[eI] = edgeDirections[eI] + apex; +// } +// +// basePoints[edgeDirections.size() + 1] = apex; +// +// face f(identity(edgeDirections.size())); +// +// pyramidPointFaceRef p(f, apex); +// +// const scalar ppDist = pointPairDistance(apex); +// +// +// vector unitDir = f.centre(); +// unitDir /= mag(unitDir); +// +// masterPoint = apex + ppDist*unitDir; +// +// norms.setSize(edgeDirections.size()); +// +// forAll(norms, nI) +// { +// norms[nI] = +// } +//} + + +//void Foam::conformalVoronoiMesh::createConvexConcaveFeaturePoints +//( +// DynamicList<Foam::point>& pts, +// DynamicList<label>& indices, +// DynamicList<label>& types +//) +//{ +// const PtrList<extendedFeatureEdgeMesh>& feMeshes +// ( +// geometryToConformTo_.features() +// ); +// +// forAll(feMeshes, i) +// { +// const extendedFeatureEdgeMesh& feMesh(feMeshes[i]); +// +// for +// ( +// label ptI = feMesh.convexStart(); +// ptI < feMesh.mixedStart(); +// ptI++ +// ) +// { +// const Foam::point& apex = feMesh.points()[ptI]; +// +// if (!positionOnThisProc(apex)) +// { +// continue; +// } +// +// const vectorField& featPtEdgeDirections +// = feMesh.featurePointEdgeDirections(ptI); +// +// Foam::point masterPoint; +// vectorField tetNorms; +// +// createPyramidMasterPoint +// ( +// apex, +// featPtEdgeDirections, +// masterPoint, +// tetNorms +// ); +// +// +// +// // Result when the points are eventually inserted (example n = 4) +// // Add number_of_vertices() at insertion of first vertex to all +// // numbers: +// // pt index type +// // internalPt 0 1 +// // externalPt0 1 0 +// // externalPt1 2 0 +// // externalPt2 3 0 +// // externalPt3 4 0 +// +// // Result when the points are eventually inserted (example n = 5) +// // Add number_of_vertices() at insertion of first vertex to all +// // numbers: +// // pt index type +// // internalPt0 0 5 +// // internalPt1 1 5 +// // internalPt2 2 5 +// // internalPt3 3 5 +// // internalPt4 4 5 +// // externalPt 5 4 +// +// if (geometryToConformTo_.inside(masterPoint)) +// { +// +// } +// else +// { +// +// } +// +// pts.append(masterPoint); +// indices.append(0); +// types.append(1); +// +// label internalPtIndex = -1; +// +// forAll(tetNorms, nI) +// { +// const vector& n = tetNorms[nI]; +// +// Foam::point reflectedPoint +// = reflectPoint(featPt, masterPoint, n); +// +// pts.append(reflectedPoint); +// indices.append(0); +// types.append(internalPtIndex--); +// } +// } +// } +//} + + +Foam::vector Foam::conformalVoronoiMesh::sharedFaceNormal +( + const extendedFeatureEdgeMesh& feMesh, + const label edgeI, + const label nextEdgeI +) const +{ + const labelList& edgeInormals = feMesh.edgeNormals()[edgeI]; + const labelList& nextEdgeInormals = feMesh.edgeNormals()[nextEdgeI]; + + const vector& A1 = feMesh.normals()[edgeInormals[0]]; + const vector& A2 = feMesh.normals()[edgeInormals[1]]; + + const vector& B1 = feMesh.normals()[nextEdgeInormals[0]]; + const vector& B2 = feMesh.normals()[nextEdgeInormals[1]]; + + const scalar A1B1 = mag(A1 ^ B1); + const scalar A1B2 = mag(A1 ^ B2); + const scalar A2B1 = mag(A2 ^ B1); + const scalar A2B2 = mag(A2 ^ B2); + + if (A1B1 < A1B2 && A1B1 < A2B1 && A1B1 < A2B2) + { + return 0.5*(A1 + B1); + } + else if (A1B2 < A1B1 && A1B2 < A2B1 && A1B2 < A2B2) + { + return 0.5*(A1 + B2); + } + else if (A2B1 < A1B1 && A2B1 < A1B2 && A2B1 < A2B2) + { + return 0.5*(A2 + B1); + } + else + { + return 0.5*(A2 + B2); + } +} + + +Foam::List<Foam::point> Foam::conformalVoronoiMesh::reflectPointInPlanes +( + const Foam::point p, + const DynamicList<autoPtr<plane> >& planes +) const +{ + List<Foam::point> reflectedPoints(planes.size()); + + forAll(planes, planeI) + { + reflectedPoints[planeI] = reflectPointInPlane(p, planes[planeI]()); + } + + return reflectedPoints; +} + + +Foam::point Foam::conformalVoronoiMesh::reflectPointInPlane +( + const Foam::point p, + const plane& planeN +) const +{ + const vector reflectedPtDir = p - planeN.nearestPoint(p); + + if ((planeN.normal() & reflectedPtDir) > 0) + { + return p - 2.0*planeN.distance(p)*planeN.normal(); + } + else + { + return p + 2.0*planeN.distance(p)*planeN.normal(); + } +} diff --git a/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/conformalVoronoiMesh/conformalVoronoiMeshI.H b/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/conformalVoronoiMesh/conformalVoronoiMeshI.H new file mode 100644 index 0000000000000000000000000000000000000000..ca09259e0df443d538db00703e41926a703cee3f --- /dev/null +++ b/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/conformalVoronoiMesh/conformalVoronoiMeshI.H @@ -0,0 +1,692 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2012-2013 OpenFOAM Foundation + \\/ M anipulation | +------------------------------------------------------------------------------- +License + This file is part of OpenFOAM. + + OpenFOAM is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + OpenFOAM is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>. + +\*---------------------------------------------------------------------------*/ + +// * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * // + +inline Foam::scalar Foam::conformalVoronoiMesh::defaultCellSize() const +{ + return cvMeshControls().defaultCellSize(); +} + + +inline Foam::scalar Foam::conformalVoronoiMesh::targetCellSize +( + const Foam::point& pt +) const +{ + return cellShapeControls().cellSize(pt); +} + + +inline Foam::scalar Foam::conformalVoronoiMesh::averageCellSize +( + const Vertex_handle& vA, + const Vertex_handle& vB +) const +{ + // Arithmetic mean + // return 0.5*(vA->targetCellSize() + vB->targetCellSize()); + + // Geometric mean + return sqrt(vA->targetCellSize()*vB->targetCellSize()); + + // Harmonic mean + // return + // 2.0*(vA->targetCellSize()*vB->targetCellSize()) + // /(vA->targetCellSize() + vB->targetCellSize()); +} + + +inline Foam::scalar Foam::conformalVoronoiMesh::averageAnyCellSize +( + const Vertex_handle& vA, + const Vertex_handle& vB +) const +{ + if + ( + (!vA->internalOrBoundaryPoint() || vA->referred()) + && (!vB->internalOrBoundaryPoint() || vB->referred()) + ) + { + // There are no internalOrBoundaryPoints available, determine + // size from scratch + + // Geometric mean + return sqrt + ( + targetCellSize(topoint(vA->point())) + *targetCellSize(topoint(vB->point())) + ); + } + else if (!vB->internalOrBoundaryPoint() || vB->referred()) + { + return vA->targetCellSize(); + } + else if (!vA->internalOrBoundaryPoint() || vA->referred()) + { + return vB->targetCellSize(); + } + + return averageCellSize(vA, vB); +} + + +inline Foam::scalar Foam::conformalVoronoiMesh::averageAnyCellSize +( + const Delaunay::Finite_facets_iterator& fit +) const +{ + // Arithmetic mean + + scalar sizeSum = 0; + + label nProducts = 0; + + const Cell_handle c(fit->first); + const int oppositeVertex = fit->second; + + for (label i = 0; i < 3; i++) + { + Vertex_handle v = c->vertex(vertex_triple_index(oppositeVertex, i)); + + if (v->internalOrBoundaryPoint() && !v->referred()) + { + + sizeSum += v->targetCellSize(); + + nProducts++; + } + } + + if (nProducts < 1) + { + // There are no internalOrBoundaryPoints available, determine + // size from scratch + + for (label i = 0; i < 3; i++) + { + Vertex_handle v = c->vertex(vertex_triple_index(oppositeVertex, i)); + + sizeSum += targetCellSize(topoint(v->point())); + } + + nProducts = 3; + } + + if (sizeSum < 0) + { + WarningIn("averageAnyCellSize(const Delaunay::Finite_facets_iterator&)") + << "sizeSum = " << sizeSum + << endl; + + return 0; + } + + return pow(sizeSum, (1.0/nProducts)); +} + + +inline Foam::scalar Foam::conformalVoronoiMesh::pointPairDistance +( + const Foam::point& pt +) const +{ + return targetCellSize(pt)*cvMeshControls().pointPairDistanceCoeff(); +} + + +inline Foam::scalar Foam::conformalVoronoiMesh::mixedFeaturePointDistance +( + const Foam::point& pt +) const +{ + return + pointPairDistance(pt) + *cvMeshControls().mixedFeaturePointPPDistanceCoeff(); +} + + +inline Foam::scalar Foam::conformalVoronoiMesh::featurePointExclusionDistanceSqr +( + const Foam::point& pt +) const +{ + return + sqr + ( + targetCellSize(pt) + *cvMeshControls().featurePointExclusionDistanceCoeff() + ); +} + + +inline Foam::scalar Foam::conformalVoronoiMesh::featureEdgeExclusionDistanceSqr +( + const Foam::point& pt +) const +{ + return + sqr + ( + targetCellSize(pt) + *cvMeshControls().featureEdgeExclusionDistanceCoeff() + ); +} + + +inline Foam::scalar Foam::conformalVoronoiMesh::surfacePtExclusionDistanceSqr +( + const Foam::point& pt +) const +{ + return + sqr + ( + targetCellSize(pt) + *cvMeshControls().surfacePtExclusionDistanceCoeff() + ); +} + + +inline Foam::scalar Foam::conformalVoronoiMesh::surfaceSearchDistanceSqr +( + const Foam::point& pt +) const +{ + return + sqr(targetCellSize(pt)*cvMeshControls().surfaceSearchDistanceCoeff()); +} + + +inline Foam::scalar Foam::conformalVoronoiMesh::maxSurfaceProtrusion +( + const Foam::point& pt +) const +{ + return targetCellSize(pt)*cvMeshControls().maxSurfaceProtrusionCoeff(); +} + + +inline bool Foam::conformalVoronoiMesh::insertPoint +( + const Foam::point& p, + const indexedVertexEnum::vertexType type +) +{ + return insertPoint(toPoint<Point>(p), type); +} + + +inline bool Foam::conformalVoronoiMesh::insertPoint +( + const Point& P, + const indexedVertexEnum::vertexType type +) +{ + uint nVert = number_of_vertices(); + + Vertex_handle vh = insert(P); + + bool pointInserted = true; + + if (nVert == number_of_vertices()) + { + Pout<< "Failed to insert point : " << topoint(P) + << " of type " << type << endl; + pointInserted = false; + } + else + { + vh->index() = getNewVertexIndex(); + vh->type() = type; + } + + return pointInserted; +} + + +inline bool Foam::conformalVoronoiMesh::insertReferredPoint(const Vb& P) +{ + return insertReferredPoint(P.point(), P.index(), P.type(), P.procIndex()); +} + + +inline bool Foam::conformalVoronoiMesh::insertReferredPoint +( + const Foam::point& p, + const label index, + const indexedVertexEnum::vertexType type, + const label processor +) +{ + return insertReferredPoint(toPoint<Point>(p), index, type, processor); +} + + +inline bool Foam::conformalVoronoiMesh::insertReferredPoint +( + const Point& P, + const label index, + const indexedVertexEnum::vertexType type, + const label processor +) +{ + uint nVert = number_of_vertices(); + + Vertex_handle vh = insert(P); + + bool pointInserted = true; + + if (nVert == number_of_vertices()) + { + Pout<< "Failed to insert point " << topoint(P) + << " type: " << type << " index: " << index + << " proc: " << processor << endl; + pointInserted = false; + } + else + { + vh->index() = index; + vh->type() = type; + vh->procIndex() = processor; + } + + return pointInserted; +} + + +inline void Foam::conformalVoronoiMesh::createPointPair +( + const scalar ppDist, + const Foam::point& surfPt, + const vector& n, + DynamicList<Vb>& pts +) +{ + vector ppDistn = ppDist*n; + + pts.append + ( + Vb + ( + surfPt - ppDistn, + Vb::vtInternalSurface + ) + ); + + pts.append + ( + Vb + ( + surfPt + ppDistn, + Vb::vtExternalSurface + ) + ); +} + + +inline Foam::point Foam::conformalVoronoiMesh::perturbPoint +( + const Foam::point& pt +) const +{ + Foam::point perturbedPt(pt); + +// vector delta(xR/ni, yR/nj, zR/nk); +// scalar pert = randomPerturbationCoeff*cmptMin(delta); + + scalar pert = 1e-12*defaultCellSize(); + + perturbedPt.x() += pert*(rndGen_.scalar01() - 0.5); + perturbedPt.y() += pert*(rndGen_.scalar01() - 0.5); + perturbedPt.z() += pert*(rndGen_.scalar01() - 0.5); + + return perturbedPt; +} + + +inline void Foam::conformalVoronoiMesh::createBafflePointPair +( + const scalar ppDist, + const Foam::point& surfPt, + const vector& n, + DynamicList<Vb>& pts +) +{ + vector ppDistn = ppDist*n; + + pts.append + ( + Vb(surfPt - ppDistn, Vb::vtInternalSurface) + ); + + pts.append + ( + Vb(surfPt + ppDistn, Vb::vtInternalSurface) + ); +} + + +inline bool Foam::conformalVoronoiMesh::isPointPair +( + const Vertex_handle& vA, + const Vertex_handle& vB +) const +{ + // Want to do this topologically, but problem if vertices are redistributed + // so that one of the point pair is one processor and the other is on + // another. + + const Foam::point& ptA = topoint(vA->point()); + const Foam::point& ptB = topoint(vB->point()); + + if + ( + ( + vA->type() == Vb::vtInternalSurface + && vB->type() == Vb::vtExternalSurface + ) + || + ( + vB->type() == Vb::vtInternalSurface + && vA->type() == Vb::vtExternalSurface + ) + || + ( + vA->type() == Vb::vtInternalFeatureEdge + && vB->type() == Vb::vtExternalFeatureEdge + ) + || + ( + vB->type() == Vb::vtInternalFeatureEdge + && vA->type() == Vb::vtExternalFeatureEdge + ) + || + ( + vA->type() == Vb::vtInternalSurface + && vB->type() == Vb::vtExternalFeatureEdge + ) + || + ( + vB->type() == Vb::vtInternalSurface + && vA->type() == Vb::vtExternalFeatureEdge + ) + || + ( + vA->type() == Vb::vtExternalSurface + && vB->type() == Vb::vtInternalFeatureEdge + ) + || + ( + vB->type() == Vb::vtExternalSurface + && vA->type() == Vb::vtInternalFeatureEdge + ) + ) + { + const scalar distSqr = magSqr(ptA - ptB); + + const scalar ppDistSqr = sqr(2*pointPairDistance(0.5*(ptA + ptB))); + + if (distSqr > 1.001*ppDistSqr) + { + return false; + } + } + + return true; +} + + +inline bool Foam::conformalVoronoiMesh::isBoundaryDualFace +( + const Delaunay::Finite_edges_iterator& eit +) const +{ + Cell_handle c = eit->first; + Vertex_handle vA = c->vertex(eit->second); + Vertex_handle vB = c->vertex(eit->third); + +// if (vA->internalBoundaryPoint() && vB->externalBoundaryPoint()) +// { +// if (vA->index() == vB->index() - 1) +// { +// return true; +// } +// } +// else if (vA->externalBoundaryPoint() && vB->internalBoundaryPoint()) +// { +// if (vA->index() == vB->index() + 1) +// { +// return true; +// } +// } +// +// return false; + + // A dual face on the boundary will result from one Dv inside and + // one outside + return + ( + ( + (vA->internalOrBoundaryPoint() && !vA->referred()) + || (vB->internalOrBoundaryPoint() && !vB->referred()) + ) + && ( + !vA->internalOrBoundaryPoint() + || !vB->internalOrBoundaryPoint() + ) + ); +} + + +inline Foam::List<bool> Foam::conformalVoronoiMesh::dualFaceBoundaryPoints +( + const Delaunay::Finite_edges_iterator& eit +) const +{ + Cell_circulator ccStart = incident_cells(*eit); + Cell_circulator cc1 = ccStart; + Cell_circulator cc2 = cc1; + + // Advance the second circulator so that it always stays on the next + // cell around the edge; + cc2++; + + DynamicList<bool> tmpFaceBoundaryPoints; + + do + { + label cc1I = cc1->cellIndex(); + + label cc2I = cc2->cellIndex(); + + if (cc1I != cc2I) + { + if (cc1->boundaryDualVertex()) + { + tmpFaceBoundaryPoints.append(true); + } + else + { + tmpFaceBoundaryPoints.append(false); + } + } + + cc1++; + + cc2++; + + } while (cc1 != ccStart); + + return tmpFaceBoundaryPoints; +} + + +inline Foam::List<Foam::label> Foam::conformalVoronoiMesh::processorsAttached +( + const Delaunay::Finite_facets_iterator& fit +) const +{ + DynamicList<label> procsAttached(8); + + const Cell_handle c1(fit->first); + const int oppositeVertex = fit->second; + const Cell_handle c2(c1->neighbor(oppositeVertex)); + + FixedList<label, 4> c1Procs(c1->processorsAttached()); + + FixedList<label, 4> c2Procs(c2->processorsAttached()); + + forAll(c1Procs, aPI) + { + if (findIndex(procsAttached, c1Procs[aPI] == -1)) + { + procsAttached.append(c1Procs[aPI]); + } + + if (findIndex(procsAttached, c2Procs[aPI] == -1)) + { + procsAttached.append(c2Procs[aPI]); + } + } + + return List<label>(procsAttached); +} + + +inline bool Foam::conformalVoronoiMesh::isParallelDualEdge +( + const Delaunay::Finite_facets_iterator& fit +) const +{ + const Cell_handle c1(fit->first); + const int oppositeVertex = fit->second; + + return + ( + c1->vertex(vertex_triple_index(oppositeVertex, 0))->referred() + || c1->vertex(vertex_triple_index(oppositeVertex, 1))->referred() + || c1->vertex(vertex_triple_index(oppositeVertex, 2))->referred() + ); +} + + +inline bool Foam::conformalVoronoiMesh::isProcBoundaryEdge +( + const Delaunay::Finite_edges_iterator& eit +) const +{ + bool isProcBoundaryEdge = false; + + Cell_handle c = eit->first; + Vertex_handle vA = c->vertex(eit->second); + Vertex_handle vB = c->vertex(eit->third); + + if + ( + ( + (vA->referred() && !vB->referred()) + || (vB->referred() && !vA->referred()) + ) + && vA->internalOrBoundaryPoint() + && vB->internalOrBoundaryPoint() + ) + { + isProcBoundaryEdge = true; + } + + return isProcBoundaryEdge; +} + + +// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // + +inline Foam::conformalVoronoiMesh::CGALVector +Foam::conformalVoronoiMesh::toCGALVector(const Foam::vector& v) const +{ + return CGALVector(v.x(), v.y(), v.z()); +} + + +inline const Foam::Time& Foam::conformalVoronoiMesh::time() const +{ + return runTime_; +} + + +inline Foam::Random& Foam::conformalVoronoiMesh::rndGen() const +{ + return rndGen_; +} + + +inline const Foam::searchableSurfaces& +Foam::conformalVoronoiMesh::allGeometry() const +{ + return allGeometry_; +} + + +inline const Foam::conformationSurfaces& +Foam::conformalVoronoiMesh::geometryToConformTo() const +{ + return geometryToConformTo_; +} + + +inline const Foam::backgroundMeshDecomposition& +Foam::conformalVoronoiMesh::decomposition() const +{ + if (!Pstream::parRun()) + { + FatalErrorIn + ( + "inline const Foam::backgroundMeshDecomposition& " + "Foam::conformalVoronoiMesh::decomposition() const" + ) + << "The backgroundMeshDecomposition cannot be asked for in serial." + << exit(FatalError) << endl; + } + + return decomposition_(); +} + + +inline const Foam::cellShapeControl& +Foam::conformalVoronoiMesh::cellShapeControls() const +{ + return cellShapeControl_; +} + + +inline const Foam::cvControls& +Foam::conformalVoronoiMesh::cvMeshControls() const +{ + return cvMeshControls_; +} + + +// ************************************************************************* // diff --git a/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/conformalVoronoiMesh/conformalVoronoiMeshIO.C b/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/conformalVoronoiMesh/conformalVoronoiMeshIO.C new file mode 100644 index 0000000000000000000000000000000000000000..d5e09a88c31bd0d49f064551f5f0f5f1c33ed794 --- /dev/null +++ b/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/conformalVoronoiMesh/conformalVoronoiMeshIO.C @@ -0,0 +1,1784 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2012-2013 OpenFOAM Foundation + \\/ M anipulation | +------------------------------------------------------------------------------- +License + This file is part of OpenFOAM. + + OpenFOAM is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + OpenFOAM is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>. + +\*---------------------------------------------------------------------------*/ + +#include "conformalVoronoiMesh.H" +#include "IOstreams.H" +#include "OFstream.H" +#include "pointMesh.H" +#include "pointFields.H" +#include "ListOps.H" +#include "polyMeshFilter.H" +#include "polyTopoChange.H" +#include "PrintTable.H" +#include "pointMesh.H" + +// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // + +void Foam::conformalVoronoiMesh::timeCheck +( + const string& description +) const +{ + if (cvMeshControls().timeChecks()) + { + Info<< nl << "--- [ cpuTime " + << runTime_.elapsedCpuTime() << " s, " + << "delta " << runTime_.cpuTimeIncrement()<< " s"; + + if (description != word::null) + { + Info<< ", " << description << " "; + } + else + { + Info<< " "; + } + + Info<< "] --- " << endl; + + memInfo m; + + if (m.valid()) + { + PrintTable<word, label> memoryTable("Memory Usage (kB)"); + + memoryTable.add("mSize", m.size()); + memoryTable.add("mPeak", m.peak()); + memoryTable.add("mRss", m.rss()); + + Info<< incrIndent; + memoryTable.print(Info); + Info<< decrIndent; + } + } +} + + +void Foam::conformalVoronoiMesh::printVertexInfo() const +{ + label nInternal = 0; + label nInternalRef = 0; + label nUnassigned = 0; + label nUnassignedRef = 0; + label nInternalNearBoundary = 0; + label nInternalNearBoundaryRef = 0; + label nInternalSurface = 0; + label nInternalSurfaceRef = 0; + label nInternalFeatureEdge = 0; + label nInternalFeatureEdgeRef = 0; + label nInternalFeaturePoint = 0; + label nInternalFeaturePointRef = 0; + label nExternalSurface = 0; + label nExternalSurfaceRef = 0; + label nExternalFeatureEdge = 0; + label nExternalFeatureEdgeRef = 0; + label nExternalFeaturePoint = 0; + label nExternalFeaturePointRef = 0; + label nFar = 0; + label nReferred = 0; + + for + ( + Delaunay::Finite_vertices_iterator vit = finite_vertices_begin(); + vit != finite_vertices_end(); + ++vit + ) + { + if (vit->type() == Vb::vtInternal) + { + if (vit->referred()) + { + nReferred++; + nInternalRef++; + } + + nInternal++; + } + else if (vit->type() == Vb::vtUnassigned) + { + if (vit->referred()) + { + nReferred++; + nUnassignedRef++; + } + + nUnassigned++; + } + else if (vit->type() == Vb::vtInternalNearBoundary) + { + if (vit->referred()) + { + nReferred++; + nInternalNearBoundaryRef++; + } + + nInternalNearBoundary++; + } + else if (vit->type() == Vb::vtInternalSurface) + { + if (vit->referred()) + { + nReferred++; + nInternalSurfaceRef++; + } + + nInternalSurface++; + } + else if (vit->type() == Vb::vtInternalFeatureEdge) + { + if (vit->referred()) + { + nReferred++; + nInternalFeatureEdgeRef++; + } + + nInternalFeatureEdge++; + } + else if (vit->type() == Vb::vtInternalFeaturePoint) + { + if (vit->referred()) + { + nReferred++; + nInternalFeaturePointRef++; + } + + nInternalFeaturePoint++; + } + else if (vit->type() == Vb::vtExternalSurface) + { + if (vit->referred()) + { + nReferred++; + nExternalSurfaceRef++; + } + + nExternalSurface++; + } + else if (vit->type() == Vb::vtExternalFeatureEdge) + { + if (vit->referred()) + { + nReferred++; + nExternalFeatureEdgeRef++; + } + + nExternalFeatureEdge++; + } + else if (vit->type() == Vb::vtExternalFeaturePoint) + { + if (vit->referred()) + { + nReferred++; + nExternalFeaturePointRef++; + } + + nExternalFeaturePoint++; + } + else if (vit->type() == Vb::vtFar) + { + nFar++; + } + } + + label nTotalVertices + = nUnassigned + + nInternal + + nInternalNearBoundary + + nInternalSurface + + nInternalFeatureEdge + + nInternalFeaturePoint + + nExternalSurface + + nExternalFeatureEdge + + nExternalFeaturePoint + + nFar; + + if (nTotalVertices != label(number_of_vertices())) + { + WarningIn("Foam::conformalVoronoiMesh::printVertexInfo()") + << nTotalVertices << " does not equal " << number_of_vertices() + << endl; + } + + PrintTable<word, label> vertexTable("Vertex Type Information"); + + vertexTable.add("Total", nTotalVertices); + vertexTable.add("Unassigned", nUnassigned); + vertexTable.add("nInternal", nInternal); + vertexTable.add("nInternalNearBoundary", nInternalNearBoundary); + vertexTable.add("nInternalSurface", nInternalSurface); + vertexTable.add("nInternalFeatureEdge", nInternalFeatureEdge); + vertexTable.add("nInternalFeaturePoint", nInternalFeaturePoint); + vertexTable.add("nExternalSurface", nExternalSurface); + vertexTable.add("nExternalFeatureEdge", nExternalFeatureEdge); + vertexTable.add("nExternalFeaturePoint", nExternalFeaturePoint); + vertexTable.add("nFar", nFar); + vertexTable.add("nReferred", nReferred); + + Info<< endl; + vertexTable.print(Info); +} + + +void Foam::conformalVoronoiMesh::drawDelaunayCell +( + Ostream& os, + const Cell_handle& c, + label offset +) const +{ + // Supply offset as tet number + offset *= 4; + + os << "# cell index: " << label(c->cellIndex()) << endl; + + os << "# circumradius " + << mag(c->dual() - topoint(c->vertex(0)->point())) + << endl; + + for (int i = 0; i < 4; i++) + { + os << "# index / type / procIndex: " + << label(c->vertex(i)->index()) << " " + << label(c->vertex(i)->type()) << " " + << label(c->vertex(i)->procIndex()) << endl; + + meshTools::writeOBJ(os, topoint(c->vertex(i)->point())); + } + + os << "f " << 1 + offset << " " << 3 + offset << " " << 2 + offset << nl + << "f " << 2 + offset << " " << 3 + offset << " " << 4 + offset << nl + << "f " << 1 + offset << " " << 4 + offset << " " << 3 + offset << nl + << "f " << 1 + offset << " " << 2 + offset << " " << 4 + offset << endl; + +// os << "# cicumcentre " << endl; + +// meshTools::writeOBJ(os, c->dual()); + +// os << "l " << 1 + offset << " " << 5 + offset << endl; +} + + +void Foam::conformalVoronoiMesh::writePoints +( + const fileName& fName, + const Foam::indexedVertexEnum::vertexType startPointType, + const Foam::indexedVertexEnum::vertexType endPointType +) const +{ + OFstream str(runTime_.path()/fName); + + Pout<< nl << "Writing points of types:" << nl; + + forAllConstIter + ( + HashTable<int>, + Foam::indexedVertexEnum::vertexTypeNames_, + iter + ) + { + if (iter() >= startPointType && iter() <= endPointType) + { + Pout<< " " << iter.key() << nl; + } + } + + Pout<< "to " << str.name() << endl; + + for + ( + Delaunay::Finite_vertices_iterator vit = finite_vertices_begin(); + vit != finite_vertices_end(); + ++vit + ) + { + if (vit->type() >= startPointType && vit->type() <= endPointType) + { + meshTools::writeOBJ(str, topoint(vit->point())); + } + } +} + + +void Foam::conformalVoronoiMesh::writePoints +( + const fileName& fName, + const Foam::indexedVertexEnum::vertexType pointType +) const +{ + writePoints(fName, pointType, pointType); +} + + +void Foam::conformalVoronoiMesh::writeBoundaryPoints +( + const fileName& fName +) const +{ + OFstream str(runTime_.path()/fName); + + Pout<< nl << "Writing boundary points to " << str.name() << endl; + + for + ( + Delaunay::Finite_vertices_iterator vit = finite_vertices_begin(); + vit != finite_vertices_end(); + ++vit + ) + { + if (!vit->internalPoint()) + { + meshTools::writeOBJ(str, topoint(vit->point())); + } + } +} + + +void Foam::conformalVoronoiMesh::writePoints +( + const fileName& fName, + const List<Foam::point>& points +) const +{ + if (points.size()) + { + OFstream str(runTime_.path()/fName); + + Pout<< nl << "Writing " << points.size() << " points from pointList to " + << str.name() << endl; + + forAll(points, p) + { + meshTools::writeOBJ(str, points[p]); + } + } +} + + +void Foam::conformalVoronoiMesh::writePoints +( + const fileName& fName, + const List<Vb>& points +) const +{ + if (points.size()) + { + OFstream str(runTime_.path()/fName); + + Pout<< nl << "Writing " << points.size() << " points from pointList to " + << str.name() << endl; + + forAll(points, p) + { + meshTools::writeOBJ(str, topoint(points[p].point())); + } + } +} + + +void Foam::conformalVoronoiMesh::writeProcessorInterface +( + const fileName& fName, + const faceList& faces +) const +{ + OFstream str(runTime_.path()/fName); + + pointField points(number_of_finite_cells(), point::max); + + for + ( + Delaunay::Finite_cells_iterator cit = finite_cells_begin(); + cit != finite_cells_end(); + ++cit + ) + { + if (!cit->hasFarPoint() && !is_infinite(cit)) + { + points[cit->cellIndex()] = cit->dual(); + } + } + + meshTools::writeOBJ(str, faces, points); +} + + +void Foam::conformalVoronoiMesh::writeInternalDelaunayVertices +( + const fileName& instance +) const +{ + pointField internalDelaunayVertices(number_of_vertices()); + + label vertI = 0; + + for + ( + Delaunay::Finite_vertices_iterator vit = finite_vertices_begin(); + vit != finite_vertices_end(); + ++vit + ) + { + if (vit->internalPoint()) + { + internalDelaunayVertices[vertI++] = topoint(vit->point()); + } + } + + internalDelaunayVertices.setSize(vertI); + + pointIOField internalDVs + ( + IOobject + ( + "internalDelaunayVertices", + instance, + runTime_, + IOobject::NO_READ, + IOobject::AUTO_WRITE + ), + internalDelaunayVertices + ); + + Info<< nl + << "Writing " << internalDVs.name() + << " to " << internalDVs.instance() + << endl; + + internalDVs.write(); +} + + +void Foam::conformalVoronoiMesh::writeMesh(const fileName& instance) +{ + writeInternalDelaunayVertices(instance); + + // Per cell the Delaunay vertex + labelList cellToDelaunayVertex; + // Per patch, per face the Delaunay vertex + labelListList patchToDelaunayVertex; + // Per patch the start of the dual faces + labelList dualPatchStarts; + + { + pointField points; + labelList boundaryPts(number_of_finite_cells(), -1); + faceList faces; + labelList owner; + labelList neighbour; + wordList patchTypes; + wordList patchNames; + labelList patchSizes; + labelList procNeighbours; + pointField cellCentres; + + PackedBoolList boundaryFacesToRemove; + + calcDualMesh + ( + points, + boundaryPts, + faces, + owner, + neighbour, + patchTypes, + patchNames, + patchSizes, + dualPatchStarts, + procNeighbours, + cellCentres, + cellToDelaunayVertex, + patchToDelaunayVertex, + boundaryFacesToRemove + ); + + Info<< nl << "Writing polyMesh to " << instance << endl; + + writeMesh + ( + Foam::polyMesh::defaultRegion, + instance, + points, + boundaryPts, + faces, + owner, + neighbour, + patchTypes, + patchNames, + patchSizes, + dualPatchStarts, + procNeighbours, + cellCentres, + boundaryFacesToRemove + ); + } + + if (cvMeshControls().writeTetDualMesh()) + { + // Determine map from Delaunay vertex to Dual mesh + // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + // From all Delaunay vertices to cell (positive index) + // or patch face (negative index) + labelList vertexToDualAddressing(number_of_vertices(), 0); + + forAll(cellToDelaunayVertex, cellI) + { + label vertI = cellToDelaunayVertex[cellI]; + + if (vertexToDualAddressing[vertI] != 0) + { + FatalErrorIn("conformalVoronoiMesh::writeMesh(..)") + << "Delaunay vertex " << vertI + << " from cell " << cellI + << " is already mapped to " + << vertexToDualAddressing[vertI] + << exit(FatalError); + } + vertexToDualAddressing[vertI] = cellI+1; + } + + forAll(patchToDelaunayVertex, patchI) + { + const labelList& patchVertices = patchToDelaunayVertex[patchI]; + + forAll(patchVertices, i) + { + label vertI = patchVertices[i]; + + if (vertexToDualAddressing[vertI] > 0) + { + FatalErrorIn("conformalVoronoiMesh::writeMesh(..)") + << "Delaunay vertex " << vertI + << " from patch " << patchI + << " local index " << i + << " is already mapped to cell " + << vertexToDualAddressing[vertI]-1 + << exit(FatalError); + } + + // Vertex might be used by multiple faces. Which one to + // use? For now last one wins. + label dualFaceI = dualPatchStarts[patchI]+i; + vertexToDualAddressing[vertI] = -dualFaceI-1; + } + } + + + // Calculate tet mesh addressing + // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + pointField points; + labelList boundaryPts(number_of_finite_cells(), -1); + // From tet point back to Delaunay vertex index + labelList pointToDelaunayVertex; + faceList faces; + labelList owner; + labelList neighbour; + wordList patchTypes; + wordList patchNames; + labelList patchSizes; + labelList patchStarts; + pointField cellCentres; + + calcTetMesh + ( + points, + pointToDelaunayVertex, + faces, + owner, + neighbour, + patchTypes, + patchNames, + patchSizes, + patchStarts + ); + + + + // Calculate map from tet points to dual mesh cells/patch faces + // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + labelIOList pointDualAddressing + ( + IOobject + ( + "pointDualAddressing", + instance, + "tetDualMesh"/polyMesh::meshSubDir, + runTime_, + IOobject::NO_READ, + IOobject::AUTO_WRITE, + false + ), + UIndirectList<label> + ( + vertexToDualAddressing, + pointToDelaunayVertex + )() + ); + + label pointI = findIndex(pointDualAddressing, -1); + if (pointI != -1) + { + WarningIn + ( + "conformalVoronoiMesh::writeMesh\n" + "(\n" + " const fileName& instance,\n" + " bool filterFaces\n" + ")\n" + ) << "Delaunay vertex " << pointI + << " does not have a corresponding dual cell." << endl; + } + + Info<< "Writing map from tetDualMesh points to Voronoi mesh to " + << pointDualAddressing.objectPath() << endl; + pointDualAddressing.write(); + + + + // Write tet points corresponding to the Voronoi cell/face centre + // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + { + // Read Voronoi mesh + fvMesh mesh + ( + IOobject + ( + Foam::polyMesh::defaultRegion, + instance, + runTime_, + IOobject::MUST_READ + ) + ); + pointIOField dualPoints + ( + IOobject + ( + "dualPoints", + instance, + "tetDualMesh"/polyMesh::meshSubDir, + runTime_, + IOobject::NO_READ, + IOobject::AUTO_WRITE, + false + ), + points + ); + + forAll(pointDualAddressing, pointI) + { + label index = pointDualAddressing[pointI]; + + if (index > 0) + { + label cellI = index-1; + dualPoints[pointI] = mesh.cellCentres()[cellI]; + } + else if (index < 0) + { + label faceI = -index-1; + if (faceI >= mesh.nInternalFaces()) + { + dualPoints[pointI] = mesh.faceCentres()[faceI]; + } + } + } + + Info<< "Writing new tetDualMesh points mapped onto Voronoi mesh to " + << dualPoints.objectPath() << endl + << "Replace the polyMesh/points with these." << endl; + dualPoints.write(); + } + + + labelList procNeighbours(patchNames.size(), -1); + +// Info<< nl << "Writing tetDualMesh to " << instance << endl; + +// writeMesh +// ( +// "tetDualMesh", +// instance, +// points, +// boundaryPts, +// faces, +// owner, +// neighbour, +// patchTypes, +// patchNames, +// patchSizes, +// patchStarts, +// procNeighbours, +// cellCentres +// ); + } +} + + +Foam::autoPtr<Foam::fvMesh> Foam::conformalVoronoiMesh::createDummyMesh +( + const IOobject& io, + const wordList& patchTypes, + const wordList& patchNames, + const labelList& patchSizes, + const labelList& patchStarts, + const labelList& procNeighbours +) const +{ + autoPtr<fvMesh> meshPtr + ( + new fvMesh + ( + io, + xferCopy(pointField()), + xferCopy(faceList()), + xferCopy(cellList()) + ) + ); + fvMesh& mesh = meshPtr(); + + List<polyPatch*> patches(patchStarts.size()); + + forAll(patches, patchI) + { + if (patchTypes[patchI] == processorPolyPatch::typeName) + { + patches[patchI] = new processorPolyPatch + ( + patchNames[patchI], + 0, //patchSizes[p], + 0, //patchStarts[p], + patchI, + mesh.boundaryMesh(), + Pstream::myProcNo(), + procNeighbours[patchI], + coupledPolyPatch::COINCIDENTFULLMATCH + ); + } + else + { + patches[patchI] = polyPatch::New + ( + patchTypes[patchI], + patchNames[patchI], + 0, //patchSizes[p], + 0, //patchStarts[p], + patchI, + mesh.boundaryMesh() + ).ptr(); + } + } + mesh.addFvPatches(patches); + + return meshPtr; +} + + +void Foam::conformalVoronoiMesh::checkProcessorPatchesMatch +( + const wordList& patchTypes, + const labelList& patchSizes, + const labelList& procNeighbours +) const +{ + // Check patch sizes + labelListList procPatchSizes + ( + Pstream::nProcs(), + labelList(Pstream::nProcs(), -1) + ); + + forAll(patchTypes, patchI) + { + if (patchTypes[patchI] == processorPolyPatch::typeName) + { + procPatchSizes[Pstream::myProcNo()][procNeighbours[patchI]] + = patchSizes[patchI]; + } + } + + Pstream::gatherList(procPatchSizes); + + if (Pstream::master()) + { + bool allMatch = true; + + forAll(procPatchSizes, procI) + { + const labelList& patchSizes = procPatchSizes[procI]; + + forAll(patchSizes, patchI) + { + if (patchSizes[patchI] != procPatchSizes[patchI][procI]) + { + allMatch = false; + + Info<< indent << "Patches " << procI << " and " << patchI + << " have different sizes: " << patchSizes[patchI] + << " and " << procPatchSizes[patchI][procI] << endl; + } + } + } + + if (allMatch) + { + Info<< indent << "All processor patches have matching numbers of " + << "faces" << endl; + } + } +} + + +void Foam::conformalVoronoiMesh::reorderPoints +( + pointField& points, + labelList& boundaryPts, + faceList& faces, + const label nInternalFaces +) const +{ + Info<< incrIndent << indent << "Reordering points into internal/external" + << endl; + + labelList oldToNew(points.size(), 0); + + // Find points that are internal + for (label fI = nInternalFaces; fI < faces.size(); ++fI) + { + const face& f = faces[fI]; + + forAll(f, fpI) + { + oldToNew[f[fpI]] = 1; + } + } + + const label nInternalPoints = points.size() - sum(oldToNew); + + label countInternal = 0; + label countExternal = nInternalPoints; + + forAll(points, pI) + { + if (oldToNew[pI] == 0) + { + oldToNew[pI] = countInternal++; + } + else + { + oldToNew[pI] = countExternal++; + } + } + + Info<< indent + << "Number of internal points: " << countInternal << nl + << indent << "Number of external points: " << countExternal + << decrIndent << endl; + + inplaceReorder(oldToNew, points); + inplaceReorder(oldToNew, boundaryPts); + + forAll(faces, fI) + { + face& f = faces[fI]; + + forAll(f, fpI) + { + f[fpI] = oldToNew[f[fpI]]; + } + } +} + + +void Foam::conformalVoronoiMesh::reorderProcessorPatches +( + const word& meshName, + const fileName& instance, + const pointField& points, + faceList& faces, + const wordList& patchTypes, + const wordList& patchNames, + const labelList& patchSizes, + const labelList& patchStarts, + const labelList& procNeighbours +) const +{ + Info<< incrIndent << indent << "Reordering processor patches" << endl; + + Info<< incrIndent; + checkProcessorPatchesMatch(patchTypes, patchSizes, procNeighbours); + + // Create dummy mesh with correct proc boundaries to do sorting + autoPtr<fvMesh> sortMeshPtr + ( + createDummyMesh + ( + IOobject + ( + meshName, + instance, + runTime_, + IOobject::NO_READ, + IOobject::NO_WRITE, + false + ), + patchTypes, + patchNames, + patchSizes, + patchStarts, + procNeighbours + ) + ); + const fvMesh& sortMesh = sortMeshPtr(); + + // Change the transform type on processors to coincident full match. +// forAll(sortMesh.boundaryMesh(), patchI) +// { +// const polyPatch& patch = sortMesh.boundaryMesh()[patchI]; +// +// if (isA<processorPolyPatch>(patch)) +// { +// const processorPolyPatch& cpPatch +// = refCast<const processorPolyPatch>(patch); +// +// processorPolyPatch& pPatch +// = const_cast<processorPolyPatch&>(cpPatch); +// +// pPatch.transform() = coupledPolyPatch::COINCIDENTFULLMATCH; +// } +// } + + // Rotation on new faces. + labelList rotation(faces.size(), -1); + labelList faceMap(faces.size(), -1); + + PstreamBuffers pBufs(Pstream::nonBlocking); + + // Send ordering + forAll(sortMesh.boundaryMesh(), patchI) + { + const polyPatch& pp = sortMesh.boundaryMesh()[patchI]; + + if (isA<processorPolyPatch>(pp)) + { + refCast<const processorPolyPatch>(pp).initOrder + ( + pBufs, + primitivePatch + ( + SubList<face> + ( + faces, + patchSizes[patchI], + patchStarts[patchI] + ), + points + ) + ); + } + } + + pBufs.finishedSends(); + + // Receive and calculate ordering + bool anyChanged = false; + + forAll(sortMesh.boundaryMesh(), patchI) + { + const polyPatch& pp = sortMesh.boundaryMesh()[patchI]; + + if (isA<processorPolyPatch>(pp)) + { + labelList patchFaceMap(patchSizes[patchI], -1); + labelList patchFaceRotation(patchSizes[patchI], 0); + + bool changed = refCast<const processorPolyPatch>(pp).order + ( + pBufs, + primitivePatch + ( + SubList<face> + ( + faces, + patchSizes[patchI], + patchStarts[patchI] + ), + points + ), + patchFaceMap, + patchFaceRotation + ); + + if (changed) + { + // Merge patch face reordering into mesh face reordering table + label start = patchStarts[patchI]; + + forAll(patchFaceRotation, patchFaceI) + { + rotation[patchFaceI + start] + = patchFaceRotation[patchFaceI]; + } + + forAll(patchFaceMap, patchFaceI) + { + if (patchFaceMap[patchFaceI] != patchFaceI) + { + faceMap[patchFaceI + start] + = patchFaceMap[patchFaceI] + start; + } + } + + anyChanged = true; + } + } + } + + reduce(anyChanged, orOp<bool>()); + + if (anyChanged) + { + // Rotate faces (rotation is already in new face indices). + label nRotated = 0; + + forAll(rotation, faceI) + { + if (rotation[faceI] == -1) + { + continue; + } + + if (rotation[faceI] != 0) + { + inplaceRotateList<List, label>(faces[faceI], rotation[faceI]); + nRotated++; + } + } + + inplaceReorder(faceMap, faces); + + Info<< indent << returnReduce(nRotated, sumOp<label>()) + << " faces have been rotated" << decrIndent << decrIndent << endl; + } +} + + +void Foam::conformalVoronoiMesh::writeMesh +( + const word& meshName, + const fileName& instance, + pointField& points, + labelList& boundaryPts, + faceList& faces, + labelList& owner, + labelList& neighbour, + const wordList& patchTypes, + const wordList& patchNames, + const labelList& patchSizes, + const labelList& patchStarts, + const labelList& procNeighbours, + const pointField& cellCentres, + const PackedBoolList& boundaryFacesToRemove +) const +{ + if (cvMeshControls().objOutput()) + { + writeObjMesh(points, faces, word(meshName + ".obj")); + } + + reorderPoints(points, boundaryPts, faces, patchStarts[0]); + + if (Pstream::parRun()) + { + reorderProcessorPatches + ( + meshName, + instance, + points, + faces, + patchTypes, + patchNames, + patchSizes, + patchStarts, + procNeighbours + ); + } + + Info<< " Constructing mesh" << endl; + + timeCheck("Before fvMesh construction"); + + fvMesh mesh + ( + IOobject + ( + meshName, + instance, + runTime_, + IOobject::NO_READ, + IOobject::AUTO_WRITE + ), + xferMove(points), + xferMove(faces), + xferMove(owner), + xferMove(neighbour) + ); + + Info<< " Adding patches to mesh" << endl; + + List<polyPatch*> patches(patchStarts.size()); + + label nValidPatches = 0; + + forAll(patches, p) + { + if (patchTypes[p] == processorPolyPatch::typeName) + { + // Do not create empty processor patches + if (patchSizes[p] > 0) + { + patches[nValidPatches] = new processorPolyPatch + ( + patchNames[p], + patchSizes[p], + patchStarts[p], + nValidPatches, + mesh.boundaryMesh(), + Pstream::myProcNo(), + procNeighbours[p], + coupledPolyPatch::NOORDERING + ); + + nValidPatches++; + } + } + else + { + patches[nValidPatches] = polyPatch::New + ( + patchTypes[p], + patchNames[p], + patchSizes[p], + patchStarts[p], + nValidPatches, + mesh.boundaryMesh() + ).ptr(); + + nValidPatches++; + } + } + + // Add indirectPatchFaces to a face zone + { + labelList addr(boundaryFacesToRemove.count()); + label count = 0; + + forAll(boundaryFacesToRemove, faceI) + { + if (boundaryFacesToRemove[faceI]) + { + addr[count++] = faceI; + } + } + + label sz = mesh.faceZones().size(); + boolList flip(addr.size(), false); + mesh.faceZones().setSize(sz + 1); + mesh.faceZones().set + ( + sz, + new faceZone + ( + "indirectPatchFaces", + addr, + flip, + sz, + mesh.faceZones() + ) + ); + } + + patches.setSize(nValidPatches); + + mesh.addFvPatches(patches); + + timeCheck("Before fvMesh filtering"); + + autoPtr<polyMeshFilter> meshFilter; + + label nInitialBadFaces = 0; + + if (cvMeshControls().filterEdges()) + { + Info<< nl << "Filtering edges on polyMesh" << nl << endl; + + meshFilter.reset(new polyMeshFilter(mesh)); + + // Filter small edges only. This reduces the number of faces so that + // the face filtering is sped up. + nInitialBadFaces = meshFilter().filterEdges(0); + { + const autoPtr<fvMesh>& newMesh = meshFilter().filteredMesh(); + + polyTopoChange meshMod(newMesh); + + meshMod.changeMesh(mesh, false); + } + } + + if (cvMeshControls().filterFaces()) + { + Info<< nl << "Filtering faces on polyMesh" << nl << endl; + + meshFilter.reset(new polyMeshFilter(mesh)); + + meshFilter().filter(nInitialBadFaces); + { + const autoPtr<fvMesh>& newMesh = meshFilter().filteredMesh(); + + polyTopoChange meshMod(newMesh); + + meshMod.changeMesh(mesh, false); + } + } + + timeCheck("After fvMesh filtering"); + + mesh.setInstance(instance); + + if (!mesh.write()) + { + FatalErrorIn("Foam::conformalVoronoiMesh::writeMesh(..)") + << "Failed writing polyMesh." + << exit(FatalError); + } + else + { + Info<< nl << "Written filtered mesh to " + << mesh.polyMesh::instance() << nl + << endl; + } + + + volTensorField alignments + ( + IOobject + ( + "alignmentsField", + runTime_.timeName(), + runTime_, + IOobject::NO_READ, + IOobject::AUTO_WRITE + ), + mesh, + tensor::zero + ); + + forAll(mesh.cellCentres(), pI) + { + Vertex_handle nearV = + nearest_vertex + ( + toPoint<Point>(mesh.cellCentres()[pI]) + ); + alignments[pI] = nearV->alignment(); + } + alignments.write(); + + { + volVectorField alignmentx + ( + IOobject + ( + "alignmentsx", + runTime_.timeName(), + runTime_, + IOobject::NO_READ, + IOobject::AUTO_WRITE + ), + mesh, + vector::zero + ); + forAll(alignmentx, aI) + { + alignmentx[aI] = alignments[aI].x(); + } + alignmentx.write(); + } + { + volVectorField alignmenty + ( + IOobject + ( + "alignmentsy", + runTime_.timeName(), + runTime_, + IOobject::NO_READ, + IOobject::AUTO_WRITE + ), + mesh, + vector::zero + ); + forAll(alignmenty, aI) + { + alignmenty[aI] = alignments[aI].y(); + } + alignmenty.write(); + } + { + volVectorField alignmentz + ( + IOobject + ( + "alignmentsz", + runTime_.timeName(), + runTime_, + IOobject::NO_READ, + IOobject::AUTO_WRITE + ), + mesh, + vector::zero + ); + forAll(alignmentz, aI) + { + alignmentz[aI] = alignments[aI].z(); + } + alignmentz.write(); + } + labelIOList boundaryIOPts + ( + IOobject + ( + "boundaryPoints", + instance, + runTime_, + IOobject::NO_READ, + IOobject::AUTO_WRITE + ), + boundaryPts + ); + + + + + // Dump list of boundary points + forAll(mesh.boundaryMesh(), patchI) + { + const polyPatch& pp = mesh.boundaryMesh()[patchI]; + + if (!isA<coupledPolyPatch>(pp)) + { + forAll(pp, fI) + { + const face& boundaryFace = pp[fI]; + + forAll(boundaryFace, pI) + { + const label boundaryPointI = boundaryFace[pI]; + + boundaryIOPts[boundaryPointI] = boundaryPts[boundaryPointI]; + } + } + } + } + + boundaryIOPts.write(); + +// forAllConstIter(labelHashSet, pointsInPatch, pI) +// { +// const Foam::point& ptMaster = mesh.points()[pI.key()]; +// +// forAllConstIter(labelHashSet, pointsInPatch, ptI) +// { +// if (ptI.key() != pI.key()) +// { +// const Foam::point& ptSlave = mesh.points()[ptI.key()]; +// +// const scalar dist = mag(ptMaster - ptSlave); +// if (ptMaster == ptSlave) +// { +// Pout<< "Point(" << pI.key() << ") " << ptMaster +// << " == " +// << "(" << ptI.key() << ") " << ptSlave +// << endl; +// } +// else if (dist == 0) +// { +// Pout<< "Point(" << pI.key() << ") " << ptMaster +// << " ~= " +// << "(" << ptI.key() << ") " << ptSlave +// << endl; +// } +// } +// } +// } + +// writeCellSizes(mesh); + +// writeCellAlignments(mesh); + +// writeCellCentres(mesh); + +// findRemainingProtrusionSet(mesh); +} + + +void Foam::conformalVoronoiMesh::writeObjMesh +( + const pointField& points, + const faceList& faces, + const fileName& fName +) const +{ + OFstream str(runTime_.path()/fName); + + Pout<< nl << "Writing points and faces to " << str.name() << endl; + + forAll(points, p) + { + meshTools::writeOBJ(str, points[p]); + } + + forAll(faces, f) + { + str<< 'f'; + + const face& fP = faces[f]; + + forAll(fP, p) + { + str<< ' ' << fP[p] + 1; + } + + str<< nl; + } +} + + +void Foam::conformalVoronoiMesh::writeCellSizes +( + const fvMesh& mesh +) const +{ + { + timeCheck("Start writeCellSizes"); + + Info<< nl << "Create targetCellSize volScalarField" << endl; + + volScalarField targetCellSize + ( + IOobject + ( + "targetCellSize", + mesh.polyMesh::instance(), + mesh, + IOobject::NO_READ, + IOobject::AUTO_WRITE + ), + mesh, + dimensionedScalar("cellSize", dimLength, 0), + zeroGradientFvPatchScalarField::typeName + ); + + scalarField& cellSize = targetCellSize.internalField(); + + const vectorField& C = mesh.cellCentres(); + + forAll(cellSize, i) + { + cellSize[i] = cellShapeControls().cellSize(C[i]); + } + + // Info<< nl << "Create targetCellVolume volScalarField" << endl; + + // volScalarField targetCellVolume + // ( + // IOobject + // ( + // "targetCellVolume", + // mesh.polyMesh::instance(), + // mesh, + // IOobject::NO_READ, + // IOobject::AUTO_WRITE + // ), + // mesh, + // dimensionedScalar("cellVolume", dimLength, 0), + // zeroGradientFvPatchScalarField::typeName + // ); + + // targetCellVolume.internalField() = pow3(cellSize); + + // Info<< nl << "Create actualCellVolume volScalarField" << endl; + + // volScalarField actualCellVolume + // ( + // IOobject + // ( + // "actualCellVolume", + // mesh.polyMesh::instance(), + // mesh, + // IOobject::NO_READ, + // IOobject::AUTO_WRITE + // ), + // mesh, + // dimensionedScalar("cellVolume", dimVolume, 0), + // zeroGradientFvPatchScalarField::typeName + // ); + + // actualCellVolume.internalField() = mesh.cellVolumes(); + + // Info<< nl << "Create equivalentCellSize volScalarField" << endl; + + // volScalarField equivalentCellSize + // ( + // IOobject + // ( + // "equivalentCellSize", + // mesh.polyMesh::instance(), + // mesh, + // IOobject::NO_READ, + // IOobject::AUTO_WRITE + // ), + // mesh, + // dimensionedScalar("cellSize", dimLength, 0), + // zeroGradientFvPatchScalarField::typeName + // ); + + // equivalentCellSize.internalField() = pow + // ( + // actualCellVolume.internalField(), + // 1.0/3.0 + // ); + + targetCellSize.correctBoundaryConditions(); + // targetCellVolume.correctBoundaryConditions(); + // actualCellVolume.correctBoundaryConditions(); + // equivalentCellSize.correctBoundaryConditions(); + + targetCellSize.write(); + // targetCellVolume.write(); + // actualCellVolume.write(); + // equivalentCellSize.write(); + } + + // { + // polyMesh tetMesh + // ( + // IOobject + // ( + // "tetDualMesh", + // runTime_.constant(), + // runTime_, + // IOobject::MUST_READ + // ) + // ); + + // pointMesh ptMesh(tetMesh); + + // pointScalarField ptTargetCellSize + // ( + // IOobject + // ( + // "ptTargetCellSize", + // runTime_.timeName(), + // tetMesh, + // IOobject::NO_READ, + // IOobject::AUTO_WRITE + // ), + // ptMesh, + // dimensionedScalar("ptTargetCellSize", dimLength, 0), + // pointPatchVectorField::calculatedType() + // ); + + // scalarField& cellSize = ptTargetCellSize.internalField(); + + // const vectorField& P = tetMesh.points(); + + // forAll(cellSize, i) + // { + // cellSize[i] = cellShapeControls().cellSize(P[i]); + // } + + // ptTargetCellSize.write(); + // } +} + + +void Foam::conformalVoronoiMesh::writeCellAlignments +( + const fvMesh& mesh +) const +{ +// Info<< nl << "Create cellAlignments volTensorField" << endl; +// +// volTensorField cellAlignments +// ( +// IOobject +// ( +// "cellAlignments", +// mesh.polyMesh::instance(), +// mesh, +// IOobject::NO_READ, +// IOobject::AUTO_WRITE +// ), +// mesh, +// tensor::I, +// zeroGradientFvPatchTensorField::typeName +// ); +// +// tensorField& cellAlignment = cellAlignments.internalField(); +// +// const vectorField& C = mesh.cellCentres(); +// +// vectorField xDir(cellAlignment.size()); +// vectorField yDir(cellAlignment.size()); +// vectorField zDir(cellAlignment.size()); +// +// forAll(cellAlignment, i) +// { +// cellAlignment[i] = cellShapeControls().cellAlignment(C[i]); +// xDir[i] = cellAlignment[i] & vector(1, 0, 0); +// yDir[i] = cellAlignment[i] & vector(0, 1, 0); +// zDir[i] = cellAlignment[i] & vector(0, 0, 1); +// } +// +// OFstream xStr("xDir.obj"); +// OFstream yStr("yDir.obj"); +// OFstream zStr("zDir.obj"); +// +// forAll(xDir, i) +// { +// meshTools::writeOBJ(xStr, C[i], C[i] + xDir[i]); +// meshTools::writeOBJ(yStr, C[i], C[i] + yDir[i]); +// meshTools::writeOBJ(zStr, C[i], C[i] + zDir[i]); +// } +// +// cellAlignments.correctBoundaryConditions(); +// +// cellAlignments.write(); +} + + +void Foam::conformalVoronoiMesh::writeCellCentres +( + const fvMesh& mesh +) const +{ + Info<< "Writing components of cellCentre positions to volScalarFields" + << " ccx, ccy, ccz in " << runTime_.timeName() << endl; + + for (direction i=0; i<vector::nComponents; i++) + { + volScalarField cci + ( + IOobject + ( + "cc" + word(vector::componentNames[i]), + runTime_.timeName(), + mesh, + IOobject::NO_READ, + IOobject::AUTO_WRITE + ), + mesh.C().component(i) + ); + + cci.write(); + } +} + + +Foam::labelHashSet Foam::conformalVoronoiMesh::findRemainingProtrusionSet +( + const polyMesh& mesh +) const +{ + timeCheck("Start findRemainingProtrusionSet"); + + const polyBoundaryMesh& patches = mesh.boundaryMesh(); + + labelHashSet protrudingBoundaryPoints; + + forAll(patches, patchI) + { + const polyPatch& patch = patches[patchI]; + + forAll(patch.localPoints(), pLPI) + { + label meshPtI = patch.meshPoints()[pLPI]; + + const Foam::point& pt = patch.localPoints()[pLPI]; + + if + ( + geometryToConformTo_.wellOutside + ( + pt, + sqr(targetCellSize(pt)) + ) + ) + { + protrudingBoundaryPoints.insert(meshPtI); + } + } + } + + cellSet protrudingCells + ( + mesh, + "cvMesh_remainingProtrusions", + mesh.nCells()/1000 + ); + + forAllConstIter(labelHashSet, protrudingBoundaryPoints, iter) + { + const label pointI = iter.key(); + const labelList& pCells = mesh.pointCells()[pointI]; + + forAll(pCells, pCI) + { + protrudingCells.insert(pCells[pCI]); + } + } + + label protrudingCellsSize = protrudingCells.size(); + + reduce(protrudingCellsSize, sumOp<label>()); + + if (cvMeshControls().objOutput() && protrudingCellsSize > 0) + { + Info<< nl << "Found " << protrudingCellsSize + << " cells protruding from the surface, writing cellSet " + << protrudingCells.name() + << endl; + + protrudingCells.write(); + } + + return protrudingCells; +} + + +// ************************************************************************* // diff --git a/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/conformalVoronoiMesh/indexedCell/indexedCell.C b/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/conformalVoronoiMesh/indexedCell/indexedCell.C new file mode 100644 index 0000000000000000000000000000000000000000..bd4973b32b91f5e81e317fbf6b5d88376a246315 --- /dev/null +++ b/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/conformalVoronoiMesh/indexedCell/indexedCell.C @@ -0,0 +1,89 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2012 OpenFOAM Foundation + \\/ M anipulation | +------------------------------------------------------------------------------- +License + This file is part of OpenFOAM. + + OpenFOAM is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + OpenFOAM is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>. + +\*---------------------------------------------------------------------------*/ + +#include "indexedCell.H" + +// * * * * * * * * * * * * * * * * IOStream operators * * * * * * * * * * * // + +template<class Gt, class Cb> +Foam::Ostream& Foam::operator<< +( + Ostream& os, + const InfoProxy<CGAL::indexedCell<Gt, Cb> >& p +) +{ + const CGAL::indexedCell<Gt, Cb>& iv = p.t_; + + os << "Cell: "; + + if (iv.index_ == CGAL::indexedCell<Gt, Cb>::ctFar) + { + os << "far"; + } + else if (iv.index_ >= 0) + { + os << iv.index_; + } + else if (iv.index_ == CGAL::indexedCell<Gt, Cb>::ctInternal) + { + os << "internal"; + } + else if (iv.index_ == CGAL::indexedCell<Gt, Cb>::ctSurface) + { + os << "surface"; + } + else if (iv.index_ == CGAL::indexedCell<Gt, Cb>::ctFeatureEdge) + { + os << "featureEdge"; + } + else if (iv.index_ == CGAL::indexedCell<Gt, Cb>::ctFeaturePoint) + { + os << "featurePoint"; + } + else + { + os << "unassigned"; + } + + if (iv.parallelDualVertex()) + { + os << " (processor)"; + } + else + { + os << " (local)"; + } + + os << " filterCount: " << iv.filterCount_ << nl; + os << " " << iv.vertex(0)->info(); + os << " " << iv.vertex(1)->info(); + os << " " << iv.vertex(2)->info(); + os << " " << iv.vertex(3)->info(); + + return os; +} + + +// ************************************************************************* // diff --git a/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/conformalVoronoiMesh/indexedCell/indexedCell.H b/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/conformalVoronoiMesh/indexedCell/indexedCell.H new file mode 100644 index 0000000000000000000000000000000000000000..4669110b6e9edbb95dd1e0a9ea240576f95a49fd --- /dev/null +++ b/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/conformalVoronoiMesh/indexedCell/indexedCell.H @@ -0,0 +1,262 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2012 OpenFOAM Foundation + \\/ M anipulation | +------------------------------------------------------------------------------- +License + This file is part of OpenFOAM. + + OpenFOAM is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + OpenFOAM is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>. + +Class + indexedCell + +Description + An indexed form of CGAL::Triangulation_cell_base_3<K> used to keep + track of the Delaunay cells (tets) in the tessellation. + +SourceFiles + indexedCellI.H + indexedCell.C + +\*---------------------------------------------------------------------------*/ + +#ifndef indexedCell_H +#define indexedCell_H + +#include <CGAL/Triangulation_3.h> +#include <CGAL/Triangulation_cell_base_with_circumcenter_3.h> +#include "indexedVertex.H" +#include "List.H" +#include "globalIndex.H" +#include "Pstream.H" +#include "Swap.H" +#include "InfoProxy.H" +#include "tetCell.H" +#include "typeInfo.H" +#include "vectorTools.H" +#include "indexedCellEnum.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace CGAL +{ +template<class Gt, class Cb> class indexedCell; +} + +namespace Foam +{ +class Ostream; +template<class Gt, class Cb> Ostream& operator<< +( + Ostream&, + const Foam::InfoProxy<CGAL::indexedCell<Gt, Cb> >& +); +} + + +namespace CGAL +{ + +/*---------------------------------------------------------------------------*\ + Class indexedCell Declaration +\*---------------------------------------------------------------------------*/ + +template +< + class Gt, + class Cb=CGAL::Triangulation_cell_base_with_circumcenter_3<Gt> +> +class indexedCell +: + public Foam::indexedCellEnum, + public Cb +{ + // Private data + + //- The index for this Delaunay tetrahedral cell. Type information is + //- also carried: + + // ctFar : the dual point of this cell does not form part of the + // internal or boundary of the dual mesh + // >=0 : the (local) index of an internal or boundary dual point, + // not on a processor face + // < 0 && > ctFar : the (global) index of a dual point on a processor + // face + + int index_; + + //- The number of times that this Delaunay cell has been limited + // during filtering + int filterCount_; + + + // Private member functions + + //- Same as globallyOrderedCellVertices but without sorting + Foam::tetCell unsortedVertexGlobalIndices + ( + const Foam::globalIndex& globalDelaunayVertexIndices + ) const; + + +public: + + typedef typename Cb::Vertex_handle Vertex_handle; + typedef typename Cb::Cell_handle Cell_handle; + + template < typename TDS2 > + struct Rebind_TDS + { + typedef typename Cb::template Rebind_TDS<TDS2>::Other Cb2; + typedef indexedCell<Gt, Cb2> Other; + }; + + + // Constructors + + inline indexedCell(); + + inline indexedCell + ( + Vertex_handle v0, + Vertex_handle v1, + Vertex_handle v2, + Vertex_handle v3 + ); + + inline indexedCell + ( + Vertex_handle v0, + Vertex_handle v1, + Vertex_handle v2, + Vertex_handle v3, + Cell_handle n0, + Cell_handle n1, + Cell_handle n2, + Cell_handle n3 + ); + + + // Member Functions + + inline int& cellIndex(); + + inline int cellIndex() const; + +#ifdef CGAL_INEXACT + inline const Foam::point& dual(); +#else + inline const Foam::point dual(); +#endif + + inline bool unassigned() const; + + inline int& filterCount(); + + inline int filterCount() const; + + //- Is the Delaunay cell real, i.e. any real vertex + inline bool real() const; + + //- Does the Delaunay cell have a far point + inline bool hasFarPoint() const; + + //- Does the Delaunay cell have a feature point + inline bool hasFeaturePoint() const; + + //- Does the Delaunay cell have a seed point + inline bool hasSeedPoint() const; + + inline bool hasInternalPoint() const; + + //- Does the Dual vertex form part of a processor patch + inline bool parallelDualVertex() const; + + //- Does the Dual vertex form part of a processor patch + inline Foam::label dualVertexMasterProc() const; + + inline Foam::FixedList<Foam::label, 4> processorsAttached() const; + + //- Using the globalIndex object, return a list of four (sorted) global + // Delaunay vertex indices that uniquely identify this tet in parallel + inline Foam::tetCell vertexGlobalIndices + ( + const Foam::globalIndex& globalDelaunayVertexIndices + ) const; + + //- Using the globalIndex object, return a list of four vertices with + // so that the cell has a consistent orientation in parallel. + inline Foam::FixedList<Foam::label, 4> globallyOrderedCellVertices + ( + const Foam::globalIndex& globalDelaunayVertexIndices + ) const; + + //- Is the Delaunay cell part of the final dual mesh, i.e. any vertex + // form part of the internal or boundary definition + inline bool internalOrBoundaryDualVertex() const; + + //- Is the Delaunay cell real or referred (or mixed), i.e. all vertices + // form part of the real or referred internal or boundary definition + inline bool anyInternalOrBoundaryDualVertex() const; + + //- A dual vertex on the boundary will result from a Delaunay cell with + // least one Delaunay vertex outside and at least one inside + inline bool boundaryDualVertex() const; + + //- A dual vertex on a feature edge will result from this Delaunay cell + inline bool featureEdgeDualVertex() const; + + inline bool nearProcBoundary() const; + + inline bool potentialCoplanarCell() const; + + + // Info + + //- Return info proxy. + // Used to print indexedCell information to a stream + Foam::InfoProxy<indexedCell<Gt, Cb> > info() const + { + return *this; + } + + friend Foam::Ostream& Foam::operator<< <Gt, Cb> + ( + Foam::Ostream&, + const Foam::InfoProxy<indexedCell<Gt, Cb> >& + ); + +}; + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace CGAL + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#include "indexedCellI.H" + +#ifdef NoRepository +# include "indexedCell.C" +#endif + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#endif + +// ************************************************************************* // diff --git a/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/conformalVoronoiMesh/indexedCell/indexedCellChecks.C b/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/conformalVoronoiMesh/indexedCell/indexedCellChecks.C new file mode 100644 index 0000000000000000000000000000000000000000..7213739844d2035931f2177751a37ac76311ea1a --- /dev/null +++ b/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/conformalVoronoiMesh/indexedCell/indexedCellChecks.C @@ -0,0 +1,128 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2012 OpenFOAM Foundation + \\/ M anipulation | +------------------------------------------------------------------------------- +License + This file is part of OpenFOAM. + + OpenFOAM is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + OpenFOAM is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>. + +\*---------------------------------------------------------------------------*/ + +#include "plane.H" +#include "tetrahedron.H" +#include "pointConversion.H" +#include "CGALTriangulation3DKernel.H" + + +template <typename Cell> +Foam::scalar Foam::cvMeshChecks::coplanarTet +( + Cell& c, + const scalar tol +) +{ + tetPointRef tet + ( + topoint(c->vertex(0)->point()), + topoint(c->vertex(1)->point()), + topoint(c->vertex(2)->point()), + topoint(c->vertex(3)->point()) + ); + + const scalar quality = tet.quality(); + + if (quality < tol) + { + return quality; + } + + return 0; + +// plane triPlane +// ( +// topoint(c->vertex(0)->point()), +// topoint(c->vertex(1)->point()), +// topoint(c->vertex(2)->point()) +// ); +// +// const scalar distance = triPlane.distance(topoint(c->vertex(3)->point())); +// +// // Check if the four points are roughly coplanar. If they are then we +// // cannot calculate the circumcentre. Better test might be the volume +// // of the tet. +// if (distance < tol) +// { +// return 0; +// } +// +// return distance; +} + + +template <typename Cell> +bool Foam::cvMeshChecks::closePoints +( + Cell& c, + const scalar tol +) +{ + for (label v = 0; v < 4; ++v) + { + for (label vA = v + 1; vA < 4; ++vA) + { + if + ( + mag + ( + topoint(c->vertex(v)->point()) + - topoint(c->vertex(vA)->point()) + ) + < tol + ) + { + return true; + } + } + } + + return false; +} + + +template <typename Cell> +bool Foam::cvMeshChecks::smallVolume +( + Cell& c, + const scalar tol +) +{ + CGAL::Tetrahedron_3<baseK> tet + ( + c->vertex(0)->point(), + c->vertex(1)->point(), + c->vertex(2)->point(), + c->vertex(3)->point() + ); + + if (tet.volume() < tol) + { + return true; + } + + return false; +} diff --git a/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/conformalVoronoiMesh/indexedCell/indexedCellChecks.H b/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/conformalVoronoiMesh/indexedCell/indexedCellChecks.H new file mode 100644 index 0000000000000000000000000000000000000000..c040eafab67c1b07447377de165db13fb32b7dce --- /dev/null +++ b/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/conformalVoronoiMesh/indexedCell/indexedCellChecks.H @@ -0,0 +1,77 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2012 OpenFOAM Foundation + \\/ M anipulation | +------------------------------------------------------------------------------- +License + This file is part of OpenFOAM. + + OpenFOAM is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + OpenFOAM is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>. + +\*---------------------------------------------------------------------------*/ + +#ifndef indexedCellChecks_H +#define indexedCellChecks_H + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ + +namespace cvMeshChecks +{ + + template <typename Cell> + scalar coplanarTet + ( + Cell& c, + const scalar tol = 1e-12 + ); + + template <typename Cell> + bool closePoints + ( + Cell& c, + const scalar tol = 1e-12 + ); + + template <typename Cell> + bool smallVolume + ( + Cell& c, + const scalar tol = 0.0 + ); + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace cvMeshChecks + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace Foam + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#ifdef NoRepository +# include "indexedCellChecks.C" +#endif + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#endif + +// ************************************************************************* // diff --git a/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/conformalVoronoiMesh/indexedCell/indexedCellEnum.C b/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/conformalVoronoiMesh/indexedCell/indexedCellEnum.C new file mode 100644 index 0000000000000000000000000000000000000000..5d7d953948bb73934c550843bb1371d068a3b249 --- /dev/null +++ b/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/conformalVoronoiMesh/indexedCell/indexedCellEnum.C @@ -0,0 +1,46 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2012 OpenFOAM Foundation + \\/ M anipulation | +------------------------------------------------------------------------------- +License + This file is part of OpenFOAM. + + OpenFOAM is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + OpenFOAM is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>. + +\*---------------------------------------------------------------------------*/ + +#include "indexedCellEnum.H" + +// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * // + +template<> +const char* +Foam::NamedEnum<Foam::indexedCellEnum::cellTypes, 6>::names[] = +{ + "Unassigned", + "Internal", + "Surface", + "FeatureEdge", + "FeaturePoint", + "Far" +}; + +const Foam::NamedEnum<Foam::indexedCellEnum::cellTypes, 6> +cellTypesNames_; + + +// ************************************************************************* // diff --git a/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/conformalVoronoiMesh/indexedCell/indexedCellEnum.H b/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/conformalVoronoiMesh/indexedCell/indexedCellEnum.H new file mode 100644 index 0000000000000000000000000000000000000000..5ccef621e74d1bf80816da1fd6380a77779fac15 --- /dev/null +++ b/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/conformalVoronoiMesh/indexedCell/indexedCellEnum.H @@ -0,0 +1,80 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2012 OpenFOAM Foundation + \\/ M anipulation | +------------------------------------------------------------------------------- +License + This file is part of OpenFOAM. + + OpenFOAM is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + OpenFOAM is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>. + +Class + indexedCellEnum + +Description + +SourceFiles + indexedCellEnum.C + +\*---------------------------------------------------------------------------*/ + +#ifndef indexedCellEnum_H +#define indexedCellEnum_H + +#include "NamedEnum.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +class indexedCellEnum +{ +public: + + + enum cellTypes + { + ctUnassigned = INT_MIN, + ctFar = INT_MIN + 1, + ctInternal = INT_MIN + 2, + ctSurface = INT_MIN + 3, + ctFeatureEdge = INT_MIN + 4, + ctFeaturePoint = INT_MIN + 5 + }; + + static const Foam::NamedEnum<cellTypes, 6> cellTypesNames_; +}; + + +template<> +inline bool contiguous<indexedCellEnum>() +{ + return true; +} + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace Foam + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#endif + +// ************************************************************************* // diff --git a/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/conformalVoronoiMesh/indexedCell/indexedCellI.H b/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/conformalVoronoiMesh/indexedCell/indexedCellI.H new file mode 100644 index 0000000000000000000000000000000000000000..83434ba2f12712085d2ca796067708d195eddc8a --- /dev/null +++ b/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/conformalVoronoiMesh/indexedCell/indexedCellI.H @@ -0,0 +1,538 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2012 OpenFOAM Foundation + \\/ M anipulation | +------------------------------------------------------------------------------- +License + This file is part of OpenFOAM. + + OpenFOAM is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + OpenFOAM is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>. + +\*---------------------------------------------------------------------------*/ + +//#include "indexedCellChecks.H" + +template<class Gt, class Cb> +Foam::tetCell CGAL::indexedCell<Gt, Cb>::unsortedVertexGlobalIndices +( + const Foam::globalIndex& globalDelaunayVertexIndices +) const +{ + Foam::tetCell tVGI; + + for (int i = 0; i < 4; i++) + { + Vertex_handle v = this->vertex(i); + + // Finding the global index of each Delaunay vertex + tVGI[i] = globalDelaunayVertexIndices.toGlobal + ( + Foam::Pstream::myProcNo(), + v->index() + ); + } + + return tVGI; +} + + +// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // + +template<class Gt, class Cb> +CGAL::indexedCell<Gt, Cb>::indexedCell() +: + Cb(), + index_(ctUnassigned), + filterCount_(0) +{} + + +template<class Gt, class Cb> +CGAL::indexedCell<Gt, Cb>::indexedCell +( + Vertex_handle v0, Vertex_handle v1, Vertex_handle v2, Vertex_handle v3 +) +: + Cb(v0, v1, v2, v3), + index_(ctUnassigned), + filterCount_(0) +{} + + +template<class Gt, class Cb> +CGAL::indexedCell<Gt, Cb>::indexedCell +( + Vertex_handle v0, + Vertex_handle v1, + Vertex_handle v2, + Vertex_handle v3, + Cell_handle n0, + Cell_handle n1, + Cell_handle n2, + Cell_handle n3 +) +: + Cb(v0, v1, v2, v3, n0, n1, n2, n3), + index_(ctUnassigned), + filterCount_(0) +{} + + +// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // + +template<class Gt, class Cb> +int& CGAL::indexedCell<Gt, Cb>::cellIndex() +{ + return index_; +} + + +template<class Gt, class Cb> +int CGAL::indexedCell<Gt, Cb>::cellIndex() const +{ + return index_; +} + + +#ifdef CGAL_INEXACT + template<class Gt, class Cb> + const Foam::point& CGAL::indexedCell<Gt, Cb>::dual() + { + // if (Foam::cvMeshChecks::coplanarTet(*this, 1e-20) == 0) + // { + // Do exact calc + // } + + return reinterpret_cast<const Foam::point&>(this->circumcenter()); + } +#else + template<class Gt, class Cb> + const Foam::point CGAL::indexedCell<Gt, Cb>::dual() + { + const typename Gt::Point_3& P = this->circumcenter(); + + return Foam::point + ( + CGAL::to_double(P.x()), + CGAL::to_double(P.y()), + CGAL::to_double(P.z()) + ); + } +#endif + + +template<class Gt, class Cb> +inline bool CGAL::indexedCell<Gt, Cb>::unassigned() const +{ + return index_ == ctUnassigned; +} + + +template<class Gt, class Cb> +inline int& CGAL::indexedCell<Gt, Cb>::filterCount() +{ + return filterCount_; +} + + +template<class Gt, class Cb> +inline int CGAL::indexedCell<Gt, Cb>::filterCount() const +{ + return filterCount_; +} + + +template<class Gt, class Cb> +inline bool CGAL::indexedCell<Gt, Cb>::real() const +{ + return + ( + ( + this->vertex(0)->real() + || this->vertex(1)->real() + || this->vertex(2)->real() + || this->vertex(3)->real() + ) + && + !( + this->vertex(0)->farPoint() + || this->vertex(1)->farPoint() + || this->vertex(2)->farPoint() + || this->vertex(3)->farPoint() + ) + ); +} + + +template<class Gt, class Cb> +inline bool CGAL::indexedCell<Gt, Cb>::hasFarPoint() const +{ + return + ( + this->vertex(0)->farPoint() + || this->vertex(1)->farPoint() + || this->vertex(2)->farPoint() + || this->vertex(3)->farPoint() + ); +} + + +template<class Gt, class Cb> +inline bool CGAL::indexedCell<Gt, Cb>::hasFeaturePoint() const +{ + return + ( + this->vertex(0)->featurePoint() + || this->vertex(1)->featurePoint() + || this->vertex(2)->featurePoint() + || this->vertex(3)->featurePoint() + ); +} + + +template<class Gt, class Cb> +inline bool CGAL::indexedCell<Gt, Cb>::hasSeedPoint() const +{ + return + ( + this->vertex(0)->seedPoint() + || this->vertex(1)->seedPoint() + || this->vertex(2)->seedPoint() + || this->vertex(3)->seedPoint() + ); +} + + +template<class Gt, class Cb> +inline bool CGAL::indexedCell<Gt, Cb>::hasInternalPoint() const +{ + return + ( + this->vertex(0)->internalPoint() + || this->vertex(1)->internalPoint() + || this->vertex(2)->internalPoint() + || this->vertex(3)->internalPoint() + ); +} + + +template<class Gt, class Cb> +inline bool CGAL::indexedCell<Gt, Cb>::parallelDualVertex() const +{ + return + ( + !this->hasFarPoint() + && + ( + this->vertex(0)->referred() + || this->vertex(1)->referred() + || this->vertex(2)->referred() + || this->vertex(3)->referred() + ) + && + ( + this->vertex(0)->real() + || this->vertex(1)->real() + || this->vertex(2)->real() + || this->vertex(3)->real() + ) + ); +} + + +template<class Gt, class Cb> +inline Foam::label CGAL::indexedCell<Gt, Cb>::dualVertexMasterProc() const +{ + if (!parallelDualVertex()) + { + return -1; + } + + // The master processor is the lowest numbered of the four on this tet. + + int masterProc = Foam::Pstream::nProcs() + 1; + + for (int i = 0; i < 4; i++) + { + if (this->vertex(i)->referred()) + { + masterProc = min(masterProc, this->vertex(i)->procIndex()); + } + else + { + masterProc = min(masterProc, Foam::Pstream::myProcNo()); + } + } + + return masterProc; +} + + +template<class Gt, class Cb> +inline Foam::FixedList<Foam::label, 4> +CGAL::indexedCell<Gt, Cb>::processorsAttached() const +{ + if (!parallelDualVertex()) + { + return Foam::FixedList<Foam::label, 4>(Foam::Pstream::myProcNo()); + } + + Foam::FixedList<Foam::label, 4> procsAttached + ( + Foam::Pstream::myProcNo() + ); + + for (int i = 0; i < 4; i++) + { + if (this->vertex(i)->referred()) + { + procsAttached[i] = this->vertex(i)->procIndex(); + } + } + + return procsAttached; +} + + +template<class Gt, class Cb> +inline Foam::tetCell CGAL::indexedCell<Gt, Cb>::vertexGlobalIndices +( + const Foam::globalIndex& globalDelaunayVertexIndices +) const +{ + // tetVertexGlobalIndices + Foam::tetCell tVGI + = unsortedVertexGlobalIndices(globalDelaunayVertexIndices); + + // bubble sort + for (int i = 0; i < tVGI.size(); i++) + { + for (int j = tVGI.size() - 1 ; j > i; j--) + { + if (tVGI[j - 1] > tVGI[j]) + { + Foam::Swap(tVGI[j - 1], tVGI[j]); + } + } + } + + return tVGI; +} + + +template<class Gt, class Cb> +inline Foam::FixedList<Foam::label, 4> +CGAL::indexedCell<Gt, Cb>::globallyOrderedCellVertices +( + const Foam::globalIndex& globalDelaunayVertexIndices +) const +{ + // tetVertexGlobalIndices + Foam::tetCell tVGI + = unsortedVertexGlobalIndices(globalDelaunayVertexIndices); + + Foam::FixedList<Foam::label, 4> vertexMap(Foam::identity(4)); + + // bubble sort + for (int i = 0; i < tVGI.size(); i++) + { + for (int j = tVGI.size() - 1 ; j > i; j--) + { + if (tVGI[j - 1] > tVGI[j]) + { + Foam::Swap(tVGI[j - 1], tVGI[j]); + Foam::Swap(vertexMap[j - 1], vertexMap[j]); + } + } + } + + for (int i = 0; i < 4; i++) + { + tVGI[i] = vertexMap[i]; + } + + return tVGI; +} + + +template<class Gt, class Cb> +inline bool CGAL::indexedCell<Gt, Cb>::internalOrBoundaryDualVertex() const +{ + return + ( + this->vertex(0)->internalOrBoundaryPoint() + || this->vertex(1)->internalOrBoundaryPoint() + || this->vertex(2)->internalOrBoundaryPoint() + || this->vertex(3)->internalOrBoundaryPoint() + ); +} + + +template<class Gt, class Cb> +inline bool CGAL::indexedCell<Gt, Cb>::anyInternalOrBoundaryDualVertex() const +{ + return + ( + this->vertex(0)->internalOrBoundaryPoint() + || this->vertex(0)->externalBoundaryPoint() + || this->vertex(1)->internalOrBoundaryPoint() + || this->vertex(1)->externalBoundaryPoint() + || this->vertex(2)->internalOrBoundaryPoint() + || this->vertex(2)->externalBoundaryPoint() + || this->vertex(3)->internalOrBoundaryPoint() + || this->vertex(3)->externalBoundaryPoint() + ); +} + + +template<class Gt, class Cb> +inline bool CGAL::indexedCell<Gt, Cb>::boundaryDualVertex() const +{ + return + ( + ( + this->vertex(0)->internalBoundaryPoint() + || this->vertex(1)->internalBoundaryPoint() + || this->vertex(2)->internalBoundaryPoint() + || this->vertex(3)->internalBoundaryPoint() + ) + && ( + this->vertex(0)->externalBoundaryPoint() + || this->vertex(1)->externalBoundaryPoint() + || this->vertex(2)->externalBoundaryPoint() + || this->vertex(3)->externalBoundaryPoint() + ) + ); +} + + +template<class Gt, class Cb> +inline bool CGAL::indexedCell<Gt, Cb>::featureEdgeDualVertex() const +{ + return + ( + this->vertex(0)->featureEdgePoint() + && this->vertex(1)->featureEdgePoint() + && this->vertex(2)->featureEdgePoint() + && this->vertex(3)->featureEdgePoint() + ); +} + + +template<class Gt, class Cb> +inline bool CGAL::indexedCell<Gt, Cb>::nearProcBoundary() const +{ + return + ( + this->vertex(0)->nearProcBoundary() + || this->vertex(1)->nearProcBoundary() + || this->vertex(2)->nearProcBoundary() + || this->vertex(3)->nearProcBoundary() + ); +} + + +template<class Gt, class Cb> +inline bool CGAL::indexedCell<Gt, Cb>::potentialCoplanarCell() const +{ + Foam::label nMasters = 0; + Foam::label nSlaves = 0; + + Vertex_handle vM[2]; + Vertex_handle vS[2]; + + for (Foam::label i = 0; i < 4; ++i) + { + Vertex_handle v = this->vertex(i); + + if (v->internalBoundaryPoint()) + { + vM[nMasters] = v; + nMasters++; + } + + if (v->externalBoundaryPoint()) + { + vS[nSlaves] = v; + nSlaves++; + } + } + + Foam::label nPairs = 0; + + if (nMasters == 2 && nSlaves == 2) + { + Foam::vector vp0(Foam::vector::zero); + Foam::vector vp1(Foam::vector::zero); + + if + ( + vM[0]->type() == vS[0]->index() + && vM[0]->index() == vS[0]->type() + ) + { + vp0 = reinterpret_cast<const Foam::point&>(vM[0]->point()) + - reinterpret_cast<const Foam::point&>(vS[0]->point()); + nPairs++; + } + else if + ( + vM[0]->type() == vS[1]->index() + && vM[0]->index() == vS[1]->type() + ) + { + vp0 = reinterpret_cast<const Foam::point&>(vM[0]->point()) + - reinterpret_cast<const Foam::point&>(vS[1]->point()); + nPairs++; + } + + if + ( + vM[1]->type() == vS[0]->index() + && vM[1]->index() == vS[0]->type() + ) + { + vp1 = reinterpret_cast<const Foam::point&>(vM[1]->point()) + - reinterpret_cast<const Foam::point&>(vS[0]->point()); + nPairs++; + } + else if + ( + vM[1]->type() == vS[1]->index() + && vM[1]->index() == vS[1]->type() + ) + { + vp1 = reinterpret_cast<const Foam::point&>(vM[1]->point()) + - reinterpret_cast<const Foam::point&>(vS[1]->point()); + nPairs++; + } + + if (nPairs == 2) + { + if (Foam::vectorTools::areParallel(vp0, vp1)) + { + Foam::Pout<< "PARALLEL" << Foam::endl; + + return true; + } + } + } + + return false; +} + + +// * * * * * * * * * * * * * * * Friend Functions * * * * * * * * * * * * * // diff --git a/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/conformalVoronoiMesh/indexedVertex/indexedVertex.C b/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/conformalVoronoiMesh/indexedVertex/indexedVertex.C new file mode 100644 index 0000000000000000000000000000000000000000..5aa39368740d93ff1203ba896c98a6364755e512 --- /dev/null +++ b/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/conformalVoronoiMesh/indexedVertex/indexedVertex.C @@ -0,0 +1,185 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2012 OpenFOAM Foundation + \\/ M anipulation | +------------------------------------------------------------------------------- +License + This file is part of OpenFOAM. + + OpenFOAM is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + OpenFOAM is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>. + +\*---------------------------------------------------------------------------*/ + +#include "indexedVertex.H" +#include "point.H" +#include "Istream.H" +#include "Ostream.H" +#include "OStringStream.H" +#include "IStringStream.H" + +// * * * * * * * * * * * * * * * * IOStream operators * * * * * * * * * * * // + +Foam::Istream& Foam::operator>> +( + Istream& is, + CGAL::Point_3<baseK>& p +) +{ +// string data(is); +// +// std::istringstream stdIs; +// +// CGAL::set_ascii_mode(stdIs); +// +// stdIs.str(data); +// +// CGAL::Gmpz xNumer, xDenom; +// CGAL::Gmpz yNumer, yDenom; +// CGAL::Gmpz zNumer, zDenom; +// +// stdIs >> xNumer >> xDenom >> yNumer >> yDenom >> zNumer >> zDenom; +// +// CGAL::Gmpq x(xNumer, xDenom); +// CGAL::Gmpq y(yNumer, yDenom); +// CGAL::Gmpq z(zNumer, zDenom); +// +// p = CGAL::Point_3<baseK> +// ( +// CGAL::to_double(x), +// CGAL::to_double(y), +// CGAL::to_double(z) +// ); + + Foam::point pt; + + is >> pt.x() >> pt.y() >> pt.z(); + + p = CGAL::Point_3<baseK> + ( + pt.x(), + pt.y(), + pt.z() + ); + + return is; +} + + +Foam::Ostream& Foam::operator<< +( + Ostream& os, + const CGAL::Point_3<baseK>& p +) +{ +// CGAL::Gmpq x(CGAL::to_double(p.x())); +// CGAL::Gmpq y(CGAL::to_double(p.y())); +// CGAL::Gmpq z(CGAL::to_double(p.z())); +// +// std::ostringstream stdOs; +// +// CGAL::set_ascii_mode(stdOs); +// +// stdOs<< x.numerator() << ' ' << x.denominator() << ' ' +// << y.numerator() << ' ' << y.denominator() << ' ' +// << z.numerator() << ' ' << z.denominator(); +// +// os << stdOs.str(); + + os << CGAL::to_double(p.x()) << ' ' + << CGAL::to_double(p.y()) << ' ' + << CGAL::to_double(p.z()); + + return os; +} + + +template<class Gt, class Vb> +Foam::Ostream& Foam::operator<< +( + Ostream& os, + const CGAL::indexedVertex<Gt, Vb>& p +) +{ + os << p.point() + << p.index() + << static_cast<int>(p.type()) + << p.procIndex() + << p.alignment() + << p.targetCellSize(); + + return os; +} + + +template<class Gt, class Vb> +Foam::Istream& Foam::operator>> +( + Istream& is, + CGAL::indexedVertex<Gt, Vb>& p +) +{ + is >> p.point() + >> p.index(); + + int type; + is >> type; + + p.type() = static_cast<Foam::indexedVertexEnum::vertexType>(type); + + is >> p.procIndex() + >> p.alignment() + >> p.targetCellSize(); + + return is; +} + + +template<class Gt, class Vb> +Foam::Ostream& Foam::operator<< +( + Ostream& os, + const InfoProxy<CGAL::indexedVertex<Gt, Vb> >& p +) +{ + const CGAL::indexedVertex<Gt, Vb>& iv = p.t_; + + const Foam::point pt + ( + CGAL::to_double(iv.point().x()), + CGAL::to_double(iv.point().y()), + CGAL::to_double(iv.point().z()) + ); + + string referred + ( + Pstream::myProcNo() == iv.processor_ + ? string(" (local)") + : string(" (from " + name(iv.processor_) + ")") + ); + + os << iv.index_ << " " + << CGAL::indexedVertex<Gt, Vb>::vertexTypeNames_[iv.type_] + << " at:" << pt + << " size:" << iv.targetCellSize_ + << " alignment:" << iv.alignment_ + << referred.c_str() + << endl; + + return os; +} + + +// ************************************************************************* // diff --git a/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/conformalVoronoiMesh/indexedVertex/indexedVertex.H b/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/conformalVoronoiMesh/indexedVertex/indexedVertex.H new file mode 100644 index 0000000000000000000000000000000000000000..f39e90761d0666415b2ab03878a65addf72d2744 --- /dev/null +++ b/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/conformalVoronoiMesh/indexedVertex/indexedVertex.H @@ -0,0 +1,354 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2012 OpenFOAM Foundation + \\/ M anipulation | +------------------------------------------------------------------------------- +License + This file is part of OpenFOAM. + + OpenFOAM is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + OpenFOAM is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>. + +Class + indexedVertex + +Description + An indexed form of CGAL::Triangulation_vertex_base_3<K> used to keep + track of the Delaunay vertices in the tessellation. + +SourceFiles + indexedVertexI.H + indexedVertex.C + +\*---------------------------------------------------------------------------*/ + +#ifndef indexedVertex_H +#define indexedVertex_H + +#include <CGAL/Triangulation_3.h> +#include "CGALTriangulation3DKernel.H" +#include "tensor.H" +#include "InfoProxy.H" +#include "point.H" +#include "indexedVertexEnum.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace CGAL +{ +template<class Gt, class Vb> class indexedVertex; +} + +namespace Foam +{ + +class Ostream; +class Istream; + +template<class Gt, class Vb> Ostream& operator<< +( + Ostream&, + const Foam::InfoProxy<CGAL::indexedVertex<Gt, Vb> >& +); + +template<class Gt, class Vb> Ostream& operator<< +( + Ostream&, + const CGAL::indexedVertex<Gt, Vb>& +); + +template<class Gt, class Vb> Istream& operator>> +( + Istream&, + CGAL::indexedVertex<Gt, Vb>& +); + +inline Istream& operator>> +( + Istream& is, + CGAL::Point_3<baseK>& p +); + +inline Ostream& operator<< +( + Ostream& os, + const CGAL::Point_3<baseK>& p +); + +} // End namespace Foam + + +namespace CGAL +{ + +/*---------------------------------------------------------------------------*\ + Class indexedVertex Declaration +\*---------------------------------------------------------------------------*/ + +template<class Gt, class Vb = CGAL::Triangulation_vertex_base_3<Gt> > +class indexedVertex +: + public Foam::indexedVertexEnum, + public Vb +{ + // Private data + + //- Type of pair-point + vertexType type_; + + //- The index for this Delaunay vertex. For referred vertices, the + // index is negative for vertices that are the outer (slave) of point + // pairs + int index_; + + //- Number of the processor that owns this vertex + int processor_; + + //- Required alignment of the dual cell of this vertex + Foam::tensor alignment_; + + //- Target size of the dual cell of this vertex + Foam::scalar targetCellSize_; + + //- Specify whether the vertex is fixed or movable. +// bool vertexFixed_; + + +public: + + typedef typename Vb::Triangulation_data_structure Tds; + typedef typename Vb::Point Point; + typedef typename Tds::Vertex_handle Vertex_handle; + typedef typename Tds::Cell_handle Cell_handle; + + template<typename TDS2> + struct Rebind_TDS + { + typedef typename Vb::template Rebind_TDS<TDS2>::Other Vb2; + typedef indexedVertex<Gt,Vb2> Other; + }; + + // Constructors + + inline indexedVertex(); + + inline indexedVertex(const Point& p); + + inline indexedVertex(const Point& p, vertexType type); + + inline indexedVertex(const Foam::point& p, vertexType type); + + inline indexedVertex + ( + const Point& p, + int index, + vertexType type, + int processor + ); + + inline indexedVertex(const Point& p, Cell_handle f); + + inline indexedVertex(Cell_handle f); + + + // Member Functions + + inline int& index(); + + inline int index() const; + + inline vertexType& type(); + + inline vertexType type() const; + + inline Foam::tensor& alignment(); + + inline const Foam::tensor& alignment() const; + + inline Foam::scalar& targetCellSize(); + + inline Foam::scalar targetCellSize() const; + + inline bool uninitialised() const; + + //- Is point a far-point + inline bool farPoint() const; + + //- Is point internal, i.e. not on boundary + inline bool internalPoint() const; + + //- Is this a referred vertex + inline bool referred() const; + + //- Is this a "real" point on this processor, i.e. is internal or part + // of the boundary description, and not a "far" or "referred" point + inline bool real() const; + + // For referred vertices, what is the original processor index + inline int procIndex() const; + + // For referred vertices, set the original processor index + inline int& procIndex(); + + //- Set the point to be internal + inline void setInternal(); + + //- Is point internal and near the boundary + inline bool nearBoundary() const; + + //- Set the point to be near the boundary + inline void setNearBoundary(); + + //- Is point internal and near a proc boundary + inline bool nearProcBoundary() const; + + //- Set the point to be near a proc boundary + inline void setNearProcBoundary(); + + //- Either master or slave of pointPair. + inline bool boundaryPoint() const; + + //- Either original internal point or master of pointPair. + inline bool internalOrBoundaryPoint() const; + + //- Is point near the boundary or part of the boundary definition + inline bool nearOrOnBoundary() const; + + //- Part of a feature point + inline bool featurePoint() const; + + //- Part of a feature edge + inline bool featureEdgePoint() const; + + //- Part of a surface point pair + inline bool surfacePoint() const; + + inline bool internalBoundaryPoint() const; + + inline bool externalBoundaryPoint() const; + +// //- Is the vertex fixed or movable +// inline bool isVertexFixed() const; +// +// //- Fix the vertex so that it can't be moved +// inline void setVertexFixed(); + + inline indexedVertex& operator=(const indexedVertex& rhs) + { + Vb::operator=(rhs); + + this->type_ = rhs.type(); + this->index_ = rhs.index(); + this->processor_ = rhs.procIndex(); + this->alignment_ = rhs.alignment(); + this->targetCellSize_ = rhs.targetCellSize(); + + return *this; + } + + inline bool operator==(const indexedVertex& rhs) const + { + return + ( + //this->point() == rhs.point() + this->type_ == rhs.type() + && this->index_ == rhs.index() + && this->processor_ == rhs.procIndex() + ); + } + + inline bool operator!=(const indexedVertex& rhs) const + { + return !(*this == rhs); + } + + + // Info + + //- Return info proxy. + // Used to print indexedVertex information to a stream + Foam::InfoProxy<indexedVertex<Gt, Vb> > info() const + { + return *this; + } + + friend Foam::Ostream& Foam::operator<< <Gt, Vb> + ( + Foam::Ostream&, + const Foam::InfoProxy<indexedVertex<Gt, Vb> >& + ); + + friend Foam::Ostream& Foam::operator<< <Gt, Vb> + ( + Foam::Ostream&, + const indexedVertex<Gt, Vb>& + ); + + friend Foam::Istream& Foam::operator>> <Gt, Vb> + ( + Foam::Istream&, + indexedVertex<Gt, Vb>& + ); +}; + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace CGAL + +// * * * * * * * * * * * * * * * Global Functions * * * * * * * * * * * * * // + +#ifdef CGAL_INEXACT +namespace Foam +{ + // For inexact representations where the storage type is a double, the data + // is contiguous. This may not be true for exact number types. + template<> + inline bool contiguous + < + CGAL::indexedVertex + < + K, + CGAL::Triangulation_vertex_base_3<K> + > + >() + { + return true; + } + + + template<> + inline bool contiguous<CGAL::Triangulation_vertex_base_3<K>::Point>() + { + return true; + } + +} // End namespace Foam +#endif + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#include "indexedVertexI.H" + +#ifdef NoRepository +# include "indexedVertex.C" +#endif + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#endif + +// ************************************************************************* // diff --git a/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/conformalVoronoiMesh/indexedVertex/indexedVertexEnum.C b/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/conformalVoronoiMesh/indexedVertex/indexedVertexEnum.C new file mode 100644 index 0000000000000000000000000000000000000000..ee394b16fa62de04af248b5609c81baa1a2e9295 --- /dev/null +++ b/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/conformalVoronoiMesh/indexedVertex/indexedVertexEnum.C @@ -0,0 +1,88 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2012 OpenFOAM Foundation + \\/ M anipulation | +------------------------------------------------------------------------------- +License + This file is part of OpenFOAM. + + OpenFOAM is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + OpenFOAM is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>. + +\*---------------------------------------------------------------------------*/ + +#include "indexedVertexEnum.H" +#include "Pstream.H" + +// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * // + +template<> +const char* +Foam::NamedEnum<Foam::indexedVertexEnum::vertexType, 10>::names[] = +{ + "Unassigned", + "Internal", + "InternalNearBoundary", + "InternalSurface", + "InternalFeatureEdge", + "InternalFeaturePoint", + "ExternalSurface", + "ExternalFeatureEdge", + "ExternalFeaturePoint", + "Far" +}; + +const Foam::NamedEnum<Foam::indexedVertexEnum::vertexType, 10> +Foam::indexedVertexEnum::vertexTypeNames_; + + +template<> +const char* +Foam::NamedEnum<Foam::indexedVertexEnum::vertexMotion, 2>::names[] = +{ + "fixed", + "movable" +}; + +const Foam::NamedEnum<Foam::indexedVertexEnum::vertexMotion, 2> +vertexMotionNames_; + + +Foam::Ostream& Foam::operator<< +( + Ostream& os, + const Foam::indexedVertexEnum::vertexType& v +) +{ + os << static_cast<int>(v); + + return os; +} + +Foam::Istream& Foam::operator>> +( + Istream& is, + Foam::indexedVertexEnum::vertexType& v +) +{ + int type; + is >> type; + + v = static_cast<Foam::indexedVertexEnum::vertexType>(type); + + return is; +} + +// ************************************************************************* // diff --git a/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/conformalVoronoiMesh/indexedVertex/indexedVertexEnum.H b/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/conformalVoronoiMesh/indexedVertex/indexedVertexEnum.H new file mode 100644 index 0000000000000000000000000000000000000000..c597d8a17307cf790fee28c068f857c7c5f68691 --- /dev/null +++ b/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/conformalVoronoiMesh/indexedVertex/indexedVertexEnum.H @@ -0,0 +1,95 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2012 OpenFOAM Foundation + \\/ M anipulation | +------------------------------------------------------------------------------- +License + This file is part of OpenFOAM. + + OpenFOAM is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + OpenFOAM is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>. + +Class + indexedVertexEnum + +Description + +SourceFiles + indexedVertexEnum.C + +\*---------------------------------------------------------------------------*/ + +#ifndef indexedVertexEnum_H +#define indexedVertexEnum_H + +#include "NamedEnum.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +class indexedVertexEnum +{ +public: + + enum vertexType + { + vtUnassigned = 0, + vtInternal = 1, + vtInternalNearBoundary = 2, + vtInternalSurface = 3, + vtInternalFeatureEdge = 4, + vtInternalFeaturePoint = 5, + vtExternalSurface = 6, + vtExternalFeatureEdge = 7, + vtExternalFeaturePoint = 8, + vtFar = 9 + }; + + enum vertexMotion + { + fixed = 0, + movable = 1 + }; + + static const Foam::NamedEnum<vertexType, 10> vertexTypeNames_; + + static const Foam::NamedEnum<vertexMotion, 2> vertexMotionNames_; + + friend Ostream& operator<<(Foam::Ostream&, const vertexType&); + + friend Istream& operator>>(Foam::Istream&, vertexType&); +}; + + +template<> +inline bool contiguous<indexedVertexEnum>() +{ + return true; +} + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace Foam + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#endif + +// ************************************************************************* // diff --git a/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/conformalVoronoiMesh/indexedVertex/indexedVertexI.H b/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/conformalVoronoiMesh/indexedVertex/indexedVertexI.H new file mode 100644 index 0000000000000000000000000000000000000000..ea9e4db6d4630a70e75bc173a1a4daf5674eb6d7 --- /dev/null +++ b/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/conformalVoronoiMesh/indexedVertex/indexedVertexI.H @@ -0,0 +1,334 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2012 OpenFOAM Foundation + \\/ M anipulation | +------------------------------------------------------------------------------- +License + This file is part of OpenFOAM. + + OpenFOAM is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + OpenFOAM is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>. + +\*---------------------------------------------------------------------------*/ + +#include "Pstream.H" + +// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // + +template<class Gt, class Vb> +inline CGAL::indexedVertex<Gt, Vb>::indexedVertex() +: + Vb(), + type_(vtUnassigned), + index_(vtUnassigned), + processor_(Foam::Pstream::myProcNo()), + alignment_(Foam::tensor::zero), + targetCellSize_(0.0) +{} + + +template<class Gt, class Vb> +inline CGAL::indexedVertex<Gt, Vb>::indexedVertex(const Point& p) +: + Vb(p), + type_(vtUnassigned), + index_(vtUnassigned), + processor_(Foam::Pstream::myProcNo()), + alignment_(Foam::tensor::zero), + targetCellSize_(0.0) +{} + + +template<class Gt, class Vb> +inline CGAL::indexedVertex<Gt, Vb>::indexedVertex +( + const Point& p, + vertexType type +) +: + Vb(p), + type_(type), + index_(-1), + processor_(Foam::Pstream::myProcNo()), + alignment_(Foam::tensor::zero), + targetCellSize_(0.0) +{} + + +template<class Gt, class Vb> +inline CGAL::indexedVertex<Gt, Vb>::indexedVertex +( + const Foam::point& p, + vertexType type +) +: + Vb(Point(p.x(), p.y(), p.z())), + type_(type), + index_(-1), + processor_(Foam::Pstream::myProcNo()), + alignment_(Foam::tensor::zero), + targetCellSize_(0.0) +{} + + +template<class Gt, class Vb> +inline CGAL::indexedVertex<Gt, Vb>::indexedVertex +( + const Point& p, + int index, + vertexType type, + int processor +) +: + Vb(p), + type_(type), + index_(index), + processor_(processor), + alignment_(Foam::tensor::zero), + targetCellSize_(0.0) +{} + + +template<class Gt, class Vb> +inline CGAL::indexedVertex<Gt, Vb>::indexedVertex(const Point& p, Cell_handle f) +: + Vb(f, p), + type_(vtUnassigned), + index_(vtUnassigned), + processor_(Foam::Pstream::myProcNo()), + alignment_(Foam::tensor::zero), + targetCellSize_(0.0) +{} + + +template<class Gt, class Vb> +inline CGAL::indexedVertex<Gt, Vb>::indexedVertex(Cell_handle f) +: + Vb(f), + type_(vtUnassigned), + index_(vtUnassigned), + processor_(Foam::Pstream::myProcNo()), + alignment_(Foam::tensor::zero), + targetCellSize_(0.0) +{} + + +// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // + +template<class Gt, class Vb> +inline int& CGAL::indexedVertex<Gt, Vb>::index() +{ + return index_; +} + + +template<class Gt, class Vb> +inline int CGAL::indexedVertex<Gt, Vb>::index() const +{ + return index_; +} + + +template<class Gt, class Vb> +inline Foam::indexedVertexEnum::vertexType& +CGAL::indexedVertex<Gt, Vb>::type() +{ + return type_; +} + + +template<class Gt, class Vb> +inline Foam::indexedVertexEnum::vertexType +CGAL::indexedVertex<Gt, Vb>::type() const +{ + return type_; +} + + +template<class Gt, class Vb> +inline Foam::tensor& CGAL::indexedVertex<Gt, Vb>::alignment() +{ + return alignment_; +} + + +template<class Gt, class Vb> +inline const Foam::tensor& CGAL::indexedVertex<Gt, Vb>::alignment() const +{ + return alignment_; +} + + +template<class Gt, class Vb> +inline Foam::scalar& CGAL::indexedVertex<Gt, Vb>::targetCellSize() +{ + return targetCellSize_; +} + + +template<class Gt, class Vb> +inline Foam::scalar CGAL::indexedVertex<Gt, Vb>::targetCellSize() const +{ + return targetCellSize_; +} + + +template<class Gt, class Vb> +inline bool CGAL::indexedVertex<Gt, Vb>::uninitialised() const +{ + return type_ == vtUnassigned; +} + + +template<class Gt, class Vb> +inline bool CGAL::indexedVertex<Gt, Vb>::farPoint() const +{ + return type_ == vtFar; +} + + +template<class Gt, class Vb> +inline bool CGAL::indexedVertex<Gt, Vb>::internalPoint() const +{ + return type_ == vtInternal || type_ == vtInternalNearBoundary; +} + + +template<class Gt, class Vb> +inline bool CGAL::indexedVertex<Gt, Vb>::referred() const +{ + // Can't be zero as the first few points are far points which won't be + // referred + //return index_ < 0; + + // processor_ will be take the value of the processor that this vertex is + // from, so it cannot be on this processor. + return processor_ != Foam::Pstream::myProcNo(); +} + + +template<class Gt, class Vb> +inline bool CGAL::indexedVertex<Gt, Vb>::real() const +{ + return (internalPoint() || boundaryPoint()) && !referred(); +} + + +template<class Gt, class Vb> +inline int CGAL::indexedVertex<Gt, Vb>::procIndex() const +{ + return processor_; +} + + +template<class Gt, class Vb> +inline int& CGAL::indexedVertex<Gt, Vb>::procIndex() +{ + return processor_; +} + + +template<class Gt, class Vb> +inline void CGAL::indexedVertex<Gt, Vb>::setInternal() +{ + type_ = vtInternal; +} + + +template<class Gt, class Vb> +inline bool CGAL::indexedVertex<Gt, Vb>::nearBoundary() const +{ + return type_ == vtInternalNearBoundary; +} + + +template<class Gt, class Vb> +inline void CGAL::indexedVertex<Gt, Vb>::setNearBoundary() +{ + type_ = vtInternalNearBoundary; +} + + +template<class Gt, class Vb> +inline bool CGAL::indexedVertex<Gt, Vb>::boundaryPoint() const +{ + return type_ >= vtInternalSurface && !farPoint(); +} + + +template<class Gt, class Vb> +inline bool CGAL::indexedVertex<Gt, Vb>::internalOrBoundaryPoint() const +{ + return internalPoint() || internalBoundaryPoint(); +} + + +template<class Gt, class Vb> +inline bool CGAL::indexedVertex<Gt, Vb>::nearOrOnBoundary() const +{ + return boundaryPoint() || nearBoundary(); +} + + +template<class Gt, class Vb> +inline bool CGAL::indexedVertex<Gt, Vb>::internalBoundaryPoint() const +{ + return type_ >= vtInternalSurface && type_ <= vtInternalFeaturePoint; +} + + +template<class Gt, class Vb> +inline bool CGAL::indexedVertex<Gt, Vb>::externalBoundaryPoint() const +{ + return type_ >= vtExternalSurface && type_ <= vtExternalFeaturePoint; +} + + +template<class Gt, class Vb> +inline bool CGAL::indexedVertex<Gt, Vb>::featurePoint() const +{ + return type_ == vtInternalFeaturePoint || type_ == vtExternalFeaturePoint; +} + + +template<class Gt, class Vb> +inline bool CGAL::indexedVertex<Gt, Vb>::featureEdgePoint() const +{ + return type_ == vtInternalFeatureEdge || type_ == vtExternalFeatureEdge; +} + + +template<class Gt, class Vb> +inline bool CGAL::indexedVertex<Gt, Vb>::surfacePoint() const +{ + return type_ == vtInternalSurface || type_ == vtExternalSurface; +} + + +//template<class Gt, class Vb> +//inline bool CGAL::indexedVertex<Gt, Vb>::isVertexFixed() const +//{ +// return vertexFixed_; +//} +// +// +//template<class Gt, class Vb> +//inline void CGAL::indexedVertex<Gt, Vb>::setVertexFixed() +//{ +// vertexFixed_ = true; +//} + + +// * * * * * * * * * * * * * * * Friend Functions * * * * * * * * * * * * * // diff --git a/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/conformalVoronoiMesh/pointConversion.H b/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/conformalVoronoiMesh/pointConversion.H new file mode 100644 index 0000000000000000000000000000000000000000..6242a3a6feab4f4ccd89542efe3bca4c29a07a55 --- /dev/null +++ b/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/conformalVoronoiMesh/pointConversion.H @@ -0,0 +1,99 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2012 OpenFOAM Foundation + \\/ M anipulation | +------------------------------------------------------------------------------- +License + This file is part of OpenFOAM. + + OpenFOAM is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + OpenFOAM is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>. + +Class + pointConversion + +Description + + Conversion functions between point (FOAM::) and Point (CGAL) + +\*---------------------------------------------------------------------------*/ + +#ifndef pointConversion_H +#define pointConversion_H + +#include "point.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#ifdef CGAL_INEXACT + + // Define Point to be contiguous for inexact (double storage) kernel + typedef const Foam::point& pointFromPoint; + typedef const CGAL::Triangulation_vertex_base_3<K>::Point& PointFrompoint; + +#else + + typedef Foam::point pointFromPoint; + typedef CGAL::Triangulation_vertex_base_3<K>::Point PointFrompoint; + +#endif + +namespace Foam +{ + +#ifdef CGAL_INEXACT + + template<typename Point> + inline pointFromPoint topoint(const Point& P) + { + return reinterpret_cast<pointFromPoint>(P); + } + + template<typename Point> + inline PointFrompoint toPoint(const Foam::point& p) + { + return reinterpret_cast<PointFrompoint>(p); + } + +#else + + template<typename Point> + inline pointFromPoint topoint(const Point& P) + { + return Foam::point + ( + CGAL::to_double(P.x()), + CGAL::to_double(P.y()), + CGAL::to_double(P.z()) + ); + } + + template<typename Point> + inline Point toPoint(const Foam::point& p) + { + return Point(p.x(), p.y(), p.z()); + } + +#endif + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace Foam + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#endif + +// ************************************************************************* // diff --git a/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/conformalVoronoiMesh/pointFeatureEdgesTypes.H b/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/conformalVoronoiMesh/pointFeatureEdgesTypes.H new file mode 100644 index 0000000000000000000000000000000000000000..5bae06d86f198c3e8bd8ec49cea7bed9c3168cf7 --- /dev/null +++ b/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/conformalVoronoiMesh/pointFeatureEdgesTypes.H @@ -0,0 +1,93 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2012 OpenFOAM Foundation + \\/ M anipulation | +------------------------------------------------------------------------------- +License + This file is part of OpenFOAM. + + OpenFOAM is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + OpenFOAM is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>. + +Class + pointFeatureEdgesTypes + +Description + struct for holding information on the types of feature edges attached to + feature points + +\*---------------------------------------------------------------------------*/ + +#ifndef pointFeatureEdgesTypes_H +#define pointFeatureEdgesTypes_H + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ + +/*---------------------------------------------------------------------------*\ + Class pointFeatureEdgesTypes Declaration +\*---------------------------------------------------------------------------*/ + +//- Hold the types of feature edges attached to the point. +class pointFeatureEdgesTypes +: + public HashTable<label, extendedFeatureEdgeMesh::edgeStatus> +{ + label pointLabel_; + +public: + + pointFeatureEdgesTypes(const label pointLabel) + : + HashTable<label, extendedFeatureEdgeMesh::edgeStatus>(), + pointLabel_(pointLabel) + {} + + + friend Ostream& operator<<(Ostream& os, const pointFeatureEdgesTypes& p) + { + os << "Point = " << p.pointLabel_ << endl; + + for + ( + HashTable<label, extendedFeatureEdgeMesh::edgeStatus> + ::const_iterator iter = p.cbegin(); + iter != p.cend(); + ++iter + ) + { + os << " " + << extendedFeatureEdgeMesh::edgeStatusNames_[iter.key()] + << " = " + << iter() + << endl; + } + + return os; + } +}; + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace Foam + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#endif + +// ************************************************************************* // diff --git a/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/conformationSurfaces/conformationSurfaces.C b/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/conformationSurfaces/conformationSurfaces.C new file mode 100644 index 0000000000000000000000000000000000000000..64f753fb99d102e5309f06c345f36c4bd996c590 --- /dev/null +++ b/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/conformationSurfaces/conformationSurfaces.C @@ -0,0 +1,895 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2012 OpenFOAM Foundation + \\/ M anipulation | +------------------------------------------------------------------------------- +License + This file is part of OpenFOAM. + + OpenFOAM is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + OpenFOAM is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>. + +\*---------------------------------------------------------------------------*/ + +#include "conformationSurfaces.H" +#include "conformalVoronoiMesh.H" + +// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // + +Foam::conformationSurfaces::conformationSurfaces +( + const Time& runTime, + Random& rndGen, + const searchableSurfaces& allGeometry, + const dictionary& surfaceConformationDict +) +: + runTime_(runTime), + rndGen_(rndGen), + allGeometry_(allGeometry), + features_(), + locationInMesh_(surfaceConformationDict.lookup("locationInMesh")), + surfaces_(), + allGeometryToSurfaces_(), + baffleSurfaces_(), + patchNames_(0), + patchOffsets_(), + globalBounds_(), + referenceVolumeTypes_(0) +{ + const dictionary& surfacesDict + ( + surfaceConformationDict.subDict("geometryToConformTo") + ); + + const dictionary& additionalFeaturesDict + ( + surfaceConformationDict.subDict("additionalFeatures") + ); + + Info<< nl << "Reading geometryToConformTo" << endl; + + surfaces_.setSize(surfacesDict.size(), -1); + + allGeometryToSurfaces_.setSize(allGeometry_.size(), -1); + + baffleSurfaces_.setSize(surfacesDict.size(), false); + + // Features may be attached to host surfaces or independent + features_.setSize(surfacesDict.size() + additionalFeaturesDict.size()); + + label featureI = 0; + + patchOffsets_.setSize(surfacesDict.size(), -1); + + label surfI = 0; + + forAllConstIter(dictionary, surfacesDict, iter) + { + word surfaceName = iter().keyword(); + + surfaces_[surfI] = allGeometry_.findSurfaceID(surfaceName); + + allGeometryToSurfaces_[surfaces_[surfI]] = surfI; + + if (surfaces_[surfI] < 0) + { + FatalErrorIn("Foam::conformationSurfaces::conformationSurfaces") + << "No surface " << iter().keyword() << " found. " + << "Valid geometry is " << nl << allGeometry_.names() + << exit(FatalError); + } + + Info<< nl << " " << iter().keyword() << endl; + + patchOffsets_[surfI] = patchNames_.size(); + + patchNames_.append(allGeometry.regionNames()[surfaces_[surfI]]); + + const dictionary& surfaceSubDict(surfacesDict.subDict(surfaceName)); + + baffleSurfaces_[surfI] = Switch + ( + surfaceSubDict.lookupOrDefault("baffleSurface", false) + ); + + if (!baffleSurfaces_[surfI]) + { + if (!allGeometry_[surfaces_[surfI]].hasVolumeType()) + { + WarningIn("conformationSurfaces::conformationSurfaces(..)") + << "Non-baffle surface " + << allGeometry_[surfaces_[surfI]].name() + << " does not allow inside/outside queries." + << " This usually is an error." << endl; + } + } + + word featureMethod = surfaceSubDict.lookup("featureMethod"); + + if (featureMethod == "extendedFeatureEdgeMesh") + { + fileName feMeshName + ( + surfaceSubDict.lookup("extendedFeatureEdgeMesh") + ); + + Info<< " features: " << feMeshName<< endl; + + features_.set + ( + featureI++, + new extendedFeatureEdgeMesh + ( + IOobject + ( + feMeshName, + runTime_.time().constant(), + "extendedFeatureEdgeMesh", + runTime_.time(), + IOobject::MUST_READ, + IOobject::NO_WRITE + ) + ) + ); + } + else if (featureMethod == "extractFeatures") + { + notImplemented + ( + "conformationSurfaces::conformationSurfaces, " + "else if (featureMethod == \"extractFeatures\")" + ); + } + else if (featureMethod == "none") + { + // Currently nothing to do + } + else + { + FatalErrorIn("Foam::conformationSurfaces::conformationSurfaces") + << "No valid featureMethod found for surface " << surfaceName + << nl << "Use \"extendedFeatureEdgeMesh\" " + << "or \"extractFeatures\"." + << exit(FatalError); + } + + surfI++; + } + + if (!additionalFeaturesDict.empty()) + { + Info<< nl << "Reading additionalFeatures" << endl; + } + + forAllConstIter(dictionary, additionalFeaturesDict, iter) + { + word featureName = iter().keyword(); + + Info<< nl << " " << iter().keyword() << endl; + + const dictionary& featureSubDict + ( + additionalFeaturesDict.subDict(featureName) + ); + + word featureMethod = featureSubDict.lookupOrDefault + ( + "featureMethod", + word("none") + ); + + if (featureMethod == "extendedFeatureEdgeMesh") + { + fileName feMeshName + ( + featureSubDict.lookup("extendedFeatureEdgeMesh") + ); + + Info<< " features: " << feMeshName << endl; + + features_.set + ( + featureI++, + new extendedFeatureEdgeMesh + ( + IOobject + ( + feMeshName, + runTime_.time().constant(), + "extendedFeatureEdgeMesh", + runTime_.time(), + IOobject::MUST_READ, + IOobject::NO_WRITE + ) + ) + ); + } + } + + // Remove unnecessary space from the features list + features_.setSize(featureI); + + globalBounds_ = treeBoundBox + ( + searchableSurfacesQueries::bounds(allGeometry_, surfaces_) + ); + + // Extend the global bounds to stop the bound box sitting on the surfaces + // to be conformed to + //globalBounds_ = globalBounds_.extend(rndGen_, 1e-4); + + vector newSpan = 1e-4*globalBounds_.span(); + + globalBounds_.min() -= newSpan; + globalBounds_.max() += newSpan; + + // Look at all surfaces at determine whether the locationInMesh point is + // inside or outside each, to establish a signature for the domain to be + // meshed. + + referenceVolumeTypes_.setSize + ( + surfaces_.size(), + searchableSurface::UNKNOWN + ); + + + Info<< endl + << "Testing for locationInMesh " << locationInMesh_ << endl; + + forAll(surfaces_, s) + { + const searchableSurface& surface(allGeometry_[surfaces_[s]]); + + if (surface.hasVolumeType()) + { + pointField pts(1, locationInMesh_); + + List<searchableSurface::volumeType> vTypes + ( + pts.size(), + searchableSurface::UNKNOWN + ); + + surface.getVolumeType(pts, vTypes); + + referenceVolumeTypes_[s] = vTypes[0]; + + Info<< " is " + << searchableSurface::volumeTypeNames[referenceVolumeTypes_[s]] + << " surface " << surface.name() + << endl; + } + } +} + + +// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * // + +Foam::conformationSurfaces::~conformationSurfaces() +{} + + +// * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * * // + +bool Foam::conformationSurfaces::overlaps(const treeBoundBox& bb) const +{ + forAll(surfaces_, s) + { + if (allGeometry_[surfaces_[s]].overlaps(bb)) + { + return true; + } + } + + return false; +} + + +Foam::Field<bool> Foam::conformationSurfaces::inside +( + const pointField& samplePts +) const +{ + return wellInside(samplePts, scalarField(samplePts.size(), 0.0)); +} + + +bool Foam::conformationSurfaces::inside +( + const point& samplePt +) const +{ + return wellInside(pointField(1, samplePt), scalarField(1, 0))[0]; +} + + +Foam::Field<bool> Foam::conformationSurfaces::outside +( + const pointField& samplePts +) const +{ + return wellOutside(samplePts, scalarField(samplePts.size(), 0.0)); +} + + +bool Foam::conformationSurfaces::outside +( + const point& samplePt +) const +{ + return !inside(samplePt); +} + + +Foam::Field<bool> Foam::conformationSurfaces::wellInOutSide +( + const pointField& samplePts, + const scalarField& testDistSqr, + bool testForInside +) const +{ + List<List<searchableSurface::volumeType> > surfaceVolumeTests + ( + surfaces_.size(), + List<searchableSurface::volumeType> + ( + samplePts.size(), + searchableSurface::UNKNOWN + ) + ); + + // Get lists for the volumeTypes for each sample wrt each surface + forAll(surfaces_, s) + { + const searchableSurface& surface(allGeometry_[surfaces_[s]]); + + if (surface.hasVolumeType()) + { + surface.getVolumeType(samplePts, surfaceVolumeTests[s]); + } + } + + // Compare the volumeType result for each point wrt to each surface with the + // reference value and if the points are inside the surface by a given + // distanceSquared + + // Assume that the point is wellInside until demonstrated otherwise. + Field<bool> inOutSidePoint(samplePts.size(), testForInside); + + //Check if the points are inside the surface by the given distance squared + + labelList hitSurfaces; + + List<pointIndexHit> hitInfo; + + searchableSurfacesQueries::findNearest + ( + allGeometry_, + surfaces_, + samplePts, + testDistSqr, + hitSurfaces, + hitInfo + ); + + forAll(samplePts, i) + { + const pointIndexHit& pHit = hitInfo[i]; + + if (pHit.hit()) + { + // If the point is within range of the surface, then it can't be + // well (in|out)side + inOutSidePoint[i] = false; + + continue; + } + + forAll(surfaces_, s) + { + // If one of the pattern tests is failed, then the point cannot be + // inside, therefore, if this is a testForInside = true call, the + // result is false. If this is a testForInside = false call, then + // the result is true. + if (surfaceVolumeTests[s][i] != referenceVolumeTypes_[s]) + { + inOutSidePoint[i] = !testForInside; + + break; + } + } + } + + return inOutSidePoint; +} + + +Foam::Field<bool> Foam::conformationSurfaces::wellInside +( + const pointField& samplePts, + const scalarField& testDistSqr +) const +{ + return wellInOutSide(samplePts, testDistSqr, true); +} + + +bool Foam::conformationSurfaces::wellInside +( + const point& samplePt, + scalar testDistSqr +) const +{ + return wellInside(pointField(1, samplePt), scalarField(1, testDistSqr))[0]; +} + + +Foam::Field<bool> Foam::conformationSurfaces::wellOutside +( + const pointField& samplePts, + const scalarField& testDistSqr +) const +{ + return wellInOutSide(samplePts, testDistSqr, false); +} + + +bool Foam::conformationSurfaces::wellOutside +( + const point& samplePt, + scalar testDistSqr +) const +{ + return wellOutside(pointField(1, samplePt), scalarField(1, testDistSqr))[0]; +} + + +bool Foam::conformationSurfaces::findSurfaceAnyIntersection +( + const point& start, + const point& end +) const +{ + labelList hitSurfaces; + List<pointIndexHit> hitInfo; + + searchableSurfacesQueries::findAnyIntersection + ( + allGeometry_, + surfaces_, + pointField(1, start), + pointField(1, end), + hitSurfaces, + hitInfo + ); + + return hitInfo[0].hit(); +} + + +void Foam::conformationSurfaces::findSurfaceAnyIntersection +( + const point& start, + const point& end, + pointIndexHit& surfHit, + label& hitSurface +) const +{ + labelList hitSurfaces; + List<pointIndexHit> hitInfo; + + searchableSurfacesQueries::findAnyIntersection + ( + allGeometry_, + surfaces_, + pointField(1, start), + pointField(1, end), + hitSurfaces, + hitInfo + ); + + surfHit = hitInfo[0]; + + if (surfHit.hit()) + { + // hitSurfaces has returned the index of the entry in surfaces_ that was + // found, not the index of the surface in allGeometry_, translating this + // to allGeometry_ + + hitSurface = surfaces_[hitSurfaces[0]]; + } +} + + +void Foam::conformationSurfaces::findSurfaceNearestIntersection +( + const point& start, + const point& end, + pointIndexHit& surfHit, + label& hitSurface +) const +{ + labelList hitSurfacesStart; + List<pointIndexHit> hitInfoStart; + labelList hitSurfacesEnd; + List<pointIndexHit> hitInfoEnd; + + searchableSurfacesQueries::findNearestIntersection + ( + allGeometry_, + surfaces_, + pointField(1, start), + pointField(1, end), + hitSurfacesStart, + hitInfoStart, + hitSurfacesEnd, + hitInfoEnd + ); + + surfHit = hitInfoStart[0]; + + if (surfHit.hit()) + { + // hitSurfaces has returned the index of the entry in surfaces_ that was + // found, not the index of the surface in allGeometry_, translating this + // to allGeometry_ + + hitSurface = surfaces_[hitSurfacesStart[0]]; + } +} + + +void Foam::conformationSurfaces::findSurfaceNearest +( + const point& sample, + scalar nearestDistSqr, + pointIndexHit& surfHit, + label& hitSurface +) const +{ + labelList hitSurfaces; + List<pointIndexHit> surfaceHits; + + searchableSurfacesQueries::findNearest + ( + allGeometry_, + surfaces_, + pointField(1, sample), + scalarField(1, nearestDistSqr), + hitSurfaces, + surfaceHits + ); + + surfHit = surfaceHits[0]; + + if (surfHit.hit()) + { + // hitSurfaces has returned the index of the entry in surfaces_ that was + // found, not the index of the surface in allGeometry_, translating this + // to allGeometry_ + + hitSurface = surfaces_[hitSurfaces[0]]; + } +} + + +void Foam::conformationSurfaces::findSurfaceNearest +( + const pointField& samples, + const scalarField& nearestDistSqr, + List<pointIndexHit>& surfaceHits, + labelList& hitSurfaces +) const +{ + searchableSurfacesQueries::findNearest + ( + allGeometry_, + surfaces_, + samples, + nearestDistSqr, + hitSurfaces, + surfaceHits + ); + + forAll(surfaceHits, i) + { + if (surfaceHits[i].hit()) + { + // hitSurfaces has returned the index of the entry in surfaces_ that + // was found, not the index of the surface in allGeometry_, + // translating this to the surface in allGeometry_. + + hitSurfaces[i] = surfaces_[hitSurfaces[i]]; + } + } +} + + +void Foam::conformationSurfaces::findFeaturePointNearest +( + const point& sample, + scalar nearestDistSqr, + pointIndexHit& fpHit, + label& featureHit +) const +{ + // Work arrays + scalar minDistSqr = nearestDistSqr; + pointIndexHit hitInfo; + + forAll(features_, testI) + { + features_[testI].nearestFeaturePoint + ( + sample, + minDistSqr, + hitInfo + ); + + if (hitInfo.hit()) + { + minDistSqr = magSqr(hitInfo.hitPoint()- sample); + fpHit = hitInfo; + featureHit = testI; + } + } +} + + +void Foam::conformationSurfaces::findEdgeNearest +( + const point& sample, + scalar nearestDistSqr, + pointIndexHit& edgeHit, + label& featureHit +) const +{ + pointField samples(1, sample); + scalarField nearestDistsSqr(1, nearestDistSqr); + + List<pointIndexHit> edgeHits; + labelList featuresHit; + + findEdgeNearest + ( + samples, + nearestDistsSqr, + edgeHits, + featuresHit + ); + + edgeHit = edgeHits[0]; + featureHit = featuresHit[0]; +} + + +void Foam::conformationSurfaces::findEdgeNearest +( + const pointField& samples, + const scalarField& nearestDistsSqr, + List<pointIndexHit>& edgeHits, + labelList& featuresHit +) const +{ + // Initialise + featuresHit.setSize(samples.size()); + featuresHit = -1; + edgeHits.setSize(samples.size()); + + // Work arrays + scalarField minDistSqr(nearestDistsSqr); + List<pointIndexHit> hitInfo(samples.size()); + + forAll(features_, testI) + { + features_[testI].nearestFeatureEdge + ( + samples, + minDistSqr, + hitInfo + ); + + // Update minDistSqr and arguments + forAll(hitInfo, pointI) + { + if (hitInfo[pointI].hit()) + { + minDistSqr[pointI] = magSqr + ( + hitInfo[pointI].hitPoint() + - samples[pointI] + ); + edgeHits[pointI] = hitInfo[pointI]; + featuresHit[pointI] = testI; + } + } + } +} + + +void Foam::conformationSurfaces::findEdgeNearestByType +( + const point& sample, + scalar nearestDistSqr, + List<pointIndexHit>& edgeHits, + List<label>& featuresHit +) const +{ + // Initialise + featuresHit.setSize(extendedFeatureEdgeMesh::nEdgeTypes); + featuresHit = -1; + edgeHits.setSize(extendedFeatureEdgeMesh::nEdgeTypes); + + // Work arrays + scalarField minDistSqr(extendedFeatureEdgeMesh::nEdgeTypes, nearestDistSqr); + List<pointIndexHit> hitInfo(extendedFeatureEdgeMesh::nEdgeTypes); + + forAll(features_, testI) + { + features_[testI].nearestFeatureEdgeByType + ( + sample, + minDistSqr, + hitInfo + ); + + // Update minDistSqr and arguments + forAll(hitInfo, typeI) + { + if (hitInfo[typeI].hit()) + { + minDistSqr[typeI] = magSqr(hitInfo[typeI].hitPoint() - sample); + edgeHits[typeI] = hitInfo[typeI]; + featuresHit[typeI] = testI; + } + } + } +} + + +void Foam::conformationSurfaces::findAllNearestEdges +( + const point& sample, + const scalar searchRadiusSqr, + List<List<pointIndexHit> >& edgeHitsByFeature, + List<label>& featuresHit +) const +{ + // Initialise + //featuresHit.setSize(features_.size()); + //featuresHit = -1; + //edgeHitsByFeature.setSize(features_.size()); + + // Work arrays + List<pointIndexHit> hitInfo(extendedFeatureEdgeMesh::nEdgeTypes); + + forAll(features_, testI) + { + features_[testI].allNearestFeatureEdges + ( + sample, + searchRadiusSqr, + hitInfo + ); + + bool anyHit = false; + forAll(hitInfo, hitI) + { + if (hitInfo[hitI].hit()) + { + anyHit = true; + } + } + + if (anyHit) + { + edgeHitsByFeature.append(hitInfo); + featuresHit.append(testI); + } + } +} + + +void Foam::conformationSurfaces::writeFeatureObj(const fileName& prefix) const +{ + OFstream ftStr(runTime_.time().path()/prefix + "_allFeatures.obj"); + + Pout<< nl << "Writing all features to " << ftStr.name() << endl; + + label verti = 0; + + forAll(features_, i) + { + const extendedFeatureEdgeMesh& fEM(features_[i]); + const pointField pts(fEM.points()); + const edgeList eds(fEM.edges()); + + ftStr << "g " << fEM.name() << endl; + + forAll(eds, j) + { + const edge& e = eds[j]; + + meshTools::writeOBJ(ftStr, pts[e[0]]); verti++; + meshTools::writeOBJ(ftStr, pts[e[1]]); verti++; + ftStr << "l " << verti-1 << ' ' << verti << endl; + } + } +} + + +Foam::label Foam::conformationSurfaces::findPatch +( + const point& ptA, + const point& ptB +) const +{ + pointIndexHit surfHit; + label hitSurface; + + findSurfaceAnyIntersection(ptA, ptB, surfHit, hitSurface); + + if (!surfHit.hit()) + { + return -1; + } + + labelList surfLocalRegion; + + allGeometry_[hitSurface].getRegion + ( + List<pointIndexHit>(1, surfHit), + surfLocalRegion + ); + + return + surfLocalRegion[0] + patchOffsets_[allGeometryToSurfaces_[hitSurface]]; +} + + +Foam::label Foam::conformationSurfaces::findPatch(const point& pt) const +{ + pointIndexHit surfHit; + label hitSurface; + + findSurfaceNearest + ( + pt, + sqr(GREAT), + surfHit, + hitSurface + ); + + if (!surfHit.hit()) + { + return -1; + } + + labelList surfLocalRegion; + + allGeometry_[hitSurface].getRegion + ( + List<pointIndexHit>(1, surfHit), + surfLocalRegion + ); + + return + surfLocalRegion[0] + patchOffsets_[allGeometryToSurfaces_[hitSurface]]; +} + + +// ************************************************************************* // diff --git a/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/conformationSurfaces/conformationSurfaces.H b/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/conformationSurfaces/conformationSurfaces.H new file mode 100644 index 0000000000000000000000000000000000000000..3acb10d53a86eefb61b311a240cd89244c82c815 --- /dev/null +++ b/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/conformationSurfaces/conformationSurfaces.H @@ -0,0 +1,328 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2012 OpenFOAM Foundation + \\/ M anipulation | +------------------------------------------------------------------------------- +License + This file is part of OpenFOAM. + + OpenFOAM is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + OpenFOAM is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>. + +Class + Foam::conformationSurfaces + +Description + +SourceFiles + conformationSurfacesI.H + conformationSurfaces.C + +\*---------------------------------------------------------------------------*/ + +#ifndef conformationSurfaces_H +#define conformationSurfaces_H + +#include "searchableSurfaces.H" +#include "searchableSurfacesQueries.H" +#include "extendedFeatureEdgeMesh.H" +#include "boolList.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ + +/*---------------------------------------------------------------------------*\ + Class conformationSurfaces Declaration +\*---------------------------------------------------------------------------*/ + +class conformationSurfaces +{ + // Private data + + const Time& runTime_; + + Random& rndGen_; + + //- Reference to the searchableSurfaces object holding all geometry data + const searchableSurfaces& allGeometry_; + + //- A list of extendedFeatureEdgeMesh + PtrList<extendedFeatureEdgeMesh> features_; + + //- The location in the mesh that specifies which portion of surfaces is + // to be meshed. + point locationInMesh_; + + //- Indices of surfaces in allGeometry that are to be conformed to + labelList surfaces_; + + //- Reverse mapping, which entry in surfaces corresponds to the surface + // in allGeometry specified by the list index. -1 for a surface that + // isn't used. + labelList allGeometryToSurfaces_; + + //- A boolean value for each surface to be conformed to specifying if it + // is to be treated as a baffle + boolList baffleSurfaces_; + + //- A flat list of all of the names of the patches from all of the + // surfaces to be reproduced in the meshed geometry + List<word> patchNames_; + + //- The offset between the patch indices of the individual surface and + // the entry in the overall patch list + labelList patchOffsets_; + + //- The overall boundBox of all of the surfaces to be conformed to + treeBoundBox globalBounds_; + + //- The pattern/signature of volumeTypes representing a point in the + // domain to be meshed + List<searchableSurface::volumeType> referenceVolumeTypes_; + + + // Private Member Functions + + //- Disallow default bitwise copy construct + conformationSurfaces(const conformationSurfaces&); + + //- Disallow default bitwise assignment + void operator=(const conformationSurfaces&); + + +public: + + // Constructors + + //- Construct from dictionary and references to conformalVoronoiMesh and + // searchableSurfaces + conformationSurfaces + ( + const Time& runTime, + Random& rndGen, + const searchableSurfaces& allGeometry, + const dictionary& surfaceConformationDict + ); + + //- Destructor + ~conformationSurfaces(); + + + // Member Functions + + // Access + + //- Return reference to the searchableSurfaces object containing all + // of the geometry + inline const searchableSurfaces& geometry() const; + + //- Return the object holding the feature points and edges + inline const PtrList<extendedFeatureEdgeMesh>& features() const; + + //- Return the location to mesh + inline const point& locationInMesh() const; + + //- Return the surface indices + inline const labelList& surfaces() const; + + //- Return the patch names + inline const List<word>& patchNames() const; + + //- Return the global bounds + inline const treeBoundBox& globalBounds() const; + + + // Query + + //- Check if the supplied bound box overlaps any part of any of + // the surfaces + bool overlaps(const treeBoundBox& bb) const; + + //- Check if points are inside surfaces to conform to + Field<bool> inside(const pointField& samplePts) const; + + //- Check if point is inside surfaces to conform to + bool inside(const point& samplePt) const; + + //- Check if points are outside surfaces to conform to + Field<bool> outside(const pointField& samplePts) const; + + //- Check if point is outside surfaces to conform to + bool outside(const point& samplePt) const; + + //- Check if point is closer to the surfaces to conform to than + // testDistSqr, in which case return false, otherwise assess in or + // outside and return a result depending on the testForInside flag + Field<bool> wellInOutSide + ( + const pointField& samplePts, + const scalarField& testDistSqr, + bool testForInside + ) const; + + //- Check if point is inside surfaces to conform to by at least + // testDistSqr + Field<bool> wellInside + ( + const pointField& samplePts, + const scalarField& testDistSqr + ) const; + + bool wellInside + ( + const point& samplePt, + scalar testDistSqr + ) const; + + //- Check if point is outside surfaces to conform to by at least + // testDistSqr + Field<bool> wellOutside + ( + const pointField& samplePts, + const scalarField& testDistSqr + ) const; + + bool wellOutside + ( + const point& samplePt, + scalar testDistSqr + ) const; + + // Finding if the line joining start and end intersects the surface + bool findSurfaceAnyIntersection + ( + const point& start, + const point& end + ) const; + + //- Finding if the line joining start and end intersects the surface + // and returning the hit and surface information + void findSurfaceAnyIntersection + ( + const point& start, + const point& end, + pointIndexHit& surfHit, + label& hitSurface + ) const; + + //- Finding the nearestIntersection of the surface to start + void findSurfaceNearestIntersection + ( + const point& start, + const point& end, + pointIndexHit& surfHit, + label& hitSurface + ) const; + + //- Find the nearest point to the sample and return it to the + // pointIndexHit + void findSurfaceNearest + ( + const point& sample, + scalar nearestDistSqr, + pointIndexHit& surfHit, + label& hitSurface + ) const; + + void findSurfaceNearest + ( + const pointField& samples, + const scalarField& nearestDistSqr, + List<pointIndexHit>& hitInfo, + labelList& hitSurfaces + ) const; + + //- Find the nearest point on any feature edge + void findFeaturePointNearest + ( + const point& sample, + scalar nearestDistSqr, + pointIndexHit& fpHit, + label& featureHit + ) const; + + //- Find the nearest point on any feature edge + void findEdgeNearest + ( + const point& sample, + scalar nearestDistSqr, + pointIndexHit& edgeHit, + label& featureHit + ) const; + + void findEdgeNearest + ( + const pointField& samples, + const scalarField& nearestDistsSqr, + List<pointIndexHit>& edgeHits, + labelList& featuresHit + ) const; + + //- Find the nearest point on each type of feature edge + void findEdgeNearestByType + ( + const point& sample, + scalar nearestDistSqr, + List<pointIndexHit>& edgeHit, + List<label>& featuresHit + ) const; + + //- Find the nearest points on each feature edge that is within + // a given distance from the sample point. Will need to check for + // a hit or a miss because near edges may not have a nearest point + // on them which is perpendicular to the sample point. + void findAllNearestEdges + ( + const point& sample, + const scalar searchRadiusSqr, + List<List<pointIndexHit> >& edgeHitsByFeature, + List<label>& featuresHit + ) const; + + //- Find which patch is intersected by the line from one point to + // another + label findPatch(const point& ptA, const point& ptB) const; + + //- Find which patch is closest to the point + label findPatch(const point& pt) const; + + //- Is the surface a baffle + inline bool isBaffle(const label index) const; + + + // Write + + //- Write all components of all the extendedFeatureEdgeMeshes as + // an obj file + void writeFeatureObj(const fileName& prefix) const; + +}; + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace Foam + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#include "conformationSurfacesI.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#endif + +// ************************************************************************* // diff --git a/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/conformationSurfaces/conformationSurfacesI.H b/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/conformationSurfaces/conformationSurfacesI.H new file mode 100644 index 0000000000000000000000000000000000000000..a4a6595d315f0ea4fbe2dcd1f1d739f50dd6b943 --- /dev/null +++ b/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/conformationSurfaces/conformationSurfacesI.H @@ -0,0 +1,71 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2012 OpenFOAM Foundation + \\/ M anipulation | +------------------------------------------------------------------------------- +License + This file is part of OpenFOAM. + + OpenFOAM is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + OpenFOAM is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>. + +\*---------------------------------------------------------------------------*/ + +// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // + +const Foam::searchableSurfaces& Foam::conformationSurfaces::geometry() const +{ + return allGeometry_; +} + + +const Foam::PtrList<Foam::extendedFeatureEdgeMesh>& +Foam::conformationSurfaces::features() const +{ + return features_; +} + + +const Foam::point& Foam::conformationSurfaces::locationInMesh() const +{ + return locationInMesh_; +} + + +const Foam::labelList& Foam::conformationSurfaces::surfaces() const +{ + return surfaces_; +} + + +const Foam::List<Foam::word>& Foam::conformationSurfaces::patchNames() const +{ + return patchNames_; +} + + +const Foam::treeBoundBox& Foam::conformationSurfaces::globalBounds() const +{ + return globalBounds_; +} + + +bool Foam::conformationSurfaces::isBaffle(const label index) const +{ + return baffleSurfaces_[index]; +} + + +// ************************************************************************* // diff --git a/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/cvControls/cvControls.C b/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/cvControls/cvControls.C new file mode 100644 index 0000000000000000000000000000000000000000..04ff4833146627f83cdeec7f448144726e89beae --- /dev/null +++ b/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/cvControls/cvControls.C @@ -0,0 +1,227 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2012-2013 OpenFOAM Foundation + \\/ M anipulation | +------------------------------------------------------------------------------- +License + This file is part of OpenFOAM. + + OpenFOAM is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + OpenFOAM is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>. + +\*---------------------------------------------------------------------------*/ + +#include "cvControls.H" +#include "conformalVoronoiMesh.H" + +// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // + +Foam::cvControls::cvControls +( + const dictionary& cvMeshDict +) +: + cvMeshDict_(cvMeshDict) +{ + // Surface conformation controls + + const dictionary& surfDict(cvMeshDict_.subDict("surfaceConformation")); + + pointPairDistanceCoeff_ = readScalar + ( + surfDict.lookup("pointPairDistanceCoeff") + ); + + mixedFeaturePointPPDistanceCoeff_ = readScalar + ( + surfDict.lookup("mixedFeaturePointPPDistanceCoeff") + ); + + featurePointExclusionDistanceCoeff_ = readScalar + ( + surfDict.lookup("featurePointExclusionDistanceCoeff") + ); + + featureEdgeExclusionDistanceCoeff_ = readScalar + ( + surfDict.lookup("featureEdgeExclusionDistanceCoeff") + ); + + specialiseFeaturePoints_ = Switch + ( + surfDict.lookup("specialiseFeaturePoints") + ); + + surfaceSearchDistanceCoeff_ = readScalar + ( + surfDict.lookup("surfaceSearchDistanceCoeff") + ); + + maxSurfaceProtrusionCoeff_ = readScalar + ( + surfDict.lookup("maxSurfaceProtrusionCoeff") + ); + + maxQuadAngle_ = readScalar(surfDict.lookup("maxQuadAngle")); + + surfaceConformationRebuildFrequency_ = max + ( + 1, + readLabel(surfDict.lookup("surfaceConformationRebuildFrequency")) + ); + + // Controls for coarse surface conformation + + const dictionary& conformationControlsDict + ( + surfDict.subDict("conformationControls") + ); + + surfacePtExclusionDistanceCoeff_ = readScalar + ( + conformationControlsDict.lookup("surfacePtExclusionDistanceCoeff") + ); + + edgeSearchDistCoeffSqr_ = sqr + ( + readScalar + ( + conformationControlsDict.lookup("edgeSearchDistCoeff") + ) + ); + + surfacePtReplaceDistCoeffSqr_ = sqr + ( + readScalar + ( + conformationControlsDict.lookup("surfacePtReplaceDistCoeff") + ) + ); + + maxConformationIterations_ = readLabel + ( + conformationControlsDict.lookup("maxIterations") + ); + + iterationToInitialHitRatioLimit_ = readScalar + ( + conformationControlsDict.lookup("iterationToInitialHitRatioLimit") + ); + + + // Motion control controls + + const dictionary& motionDict(cvMeshDict_.subDict("motionControl")); + + defaultCellSize_ = readScalar(motionDict.lookup("defaultCellSize")); + + minimumCellSize_ = readScalar(motionDict.lookup("minimumCellSize")); + + objOutput_ = Switch(motionDict.lookupOrDefault<Switch>("objOutput", false)); + + timeChecks_ = Switch + ( + motionDict.lookupOrDefault<Switch>("timeChecks", false) + ); + + if (Pstream::parRun()) + { + maxLoadUnbalance_ = readScalar(motionDict.lookup("maxLoadUnbalance")); + } + else + { + maxLoadUnbalance_ = -1; + } + + alignmentSearchSpokes_ = readLabel + ( + motionDict.lookup("alignmentSearchSpokes") + ); + + cosAlignmentAcceptanceAngle_ = cos + ( + degToRad(readScalar(motionDict.lookup("alignmentAcceptanceAngle"))) + ); + + sizeAndAlignmentRebuildFrequency_ = max + ( + 1, + readLabel(motionDict.lookup("sizeAndAlignmentRebuildFrequency")) + ); + + // Point removal criteria + + const dictionary& insertionDict + ( + motionDict.subDict("pointInsertionCriteria") + ); + + insertionDistCoeff_ = readScalar + ( + insertionDict.lookup("cellCentreDistCoeff") + ); + + faceAreaRatioCoeff_ = readScalar + ( + insertionDict.lookup("faceAreaRatioCoeff") + ); + + cosInsertionAcceptanceAngle_ = cos + ( + degToRad(readScalar(insertionDict.lookup("acceptanceAngle"))) + ); + + // Point removal criteria + + const dictionary& removalDict + ( + motionDict.subDict("pointRemovalCriteria") + ); + + removalDistCoeff_ = readScalar + ( + removalDict.lookup("cellCentreDistCoeff") + ); + + // polyMesh filtering controls + + const dictionary& filteringDict(cvMeshDict_.subDict("polyMeshFiltering")); + + filterEdges_ = Switch + ( + filteringDict.lookupOrDefault<Switch>("filterEdges", true) + ); + + filterFaces_ = Switch + ( + filteringDict.lookupOrDefault<Switch>("filterFaces", false) + ); + + if (filterFaces_) + { + filterEdges_ = Switch::ON; + } + + writeTetDualMesh_ = Switch(filteringDict.lookup("writeTetDualMesh")); +} + + +// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * // + +Foam::cvControls::~cvControls() +{} + + +// ************************************************************************* // diff --git a/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/cvControls/cvControls.H b/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/cvControls/cvControls.H new file mode 100644 index 0000000000000000000000000000000000000000..884845e307c3c7416e3f6fd5d37a55e61e806f09 --- /dev/null +++ b/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/cvControls/cvControls.H @@ -0,0 +1,333 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2012-2013 OpenFOAM Foundation + \\/ M anipulation | +------------------------------------------------------------------------------- +License + This file is part of OpenFOAM. + + OpenFOAM is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + OpenFOAM is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>. + +Class + Foam::cvControls + +Description + Controls for the conformalVoronoiMesh mesh generator + +SourceFiles + cvControls.C + +\*---------------------------------------------------------------------------*/ + +#ifndef cvControls_H +#define cvControls_H + +#include "dictionary.H" +#include "Switch.H" +#include "vector.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ + +// Forward declaration of classes +class conformalVoronoiMesh; + +/*---------------------------------------------------------------------------*\ + Class cvControls Declaration +\*---------------------------------------------------------------------------*/ + +class cvControls +{ + // Private data + + //- Reference to the cvMeshDict + const dictionary& cvMeshDict_; + + // Surface conformation controls + + //- Point pair spacing coefficient - fraction of the local target + // cell size + scalar pointPairDistanceCoeff_; + + //- Distance along feature edge to place mixed feature point + // conformation groups - to be multiple of pointPairDistanceCoeff_. + scalar mixedFeaturePointPPDistanceCoeff_; + + //- Distance to a feature point within which surface and edge + // conformation points are excluded - fraction of the local target + // cell size + scalar featurePointExclusionDistanceCoeff_; + + //- Distance to an existing feature edge conformation location + // within which other edge conformation location are excluded - + // fraction of the local target cell size + scalar featureEdgeExclusionDistanceCoeff_; + + //- Switch for using specialised feature points + Switch specialiseFeaturePoints_; + + //- Surface search distance coefficient - fraction of the local + // target cell size + scalar surfaceSearchDistanceCoeff_; + + //- Maximum allowable protrusion through the surface before + // conformation points are added - fraction of the local target + // cell size + scalar maxSurfaceProtrusionCoeff_; + + //- Maximum quadrant angle allowed at a concave edge before + // additional "mitering" lines are added + scalar maxQuadAngle_; + + //- Now often to rebuild the surface conformation + label surfaceConformationRebuildFrequency_; + + + // Controls for coarse surface conformation + + //- Distance to an existing surface conformation point location + // within which other surface point locations are excluded + // - fraction of the local target cell size + scalar surfacePtExclusionDistanceCoeff_; + + //- Distance to search for feature edges near to + // surface protrusions - fraction of the local target + // cell size. + scalar edgeSearchDistCoeffSqr_; + + //- Proximity to a feature edge where a surface hit is + // not created, only the edge conformation is created + // - fraction of the local target cell size. + scalar surfacePtReplaceDistCoeffSqr_; + + //- Maximum allowed number surface conformation iterations. + label maxConformationIterations_; + + //- Termination criterion for conformation iterations. + // When the number of surface protrusions drops below this + // ratio of the initial number of protrusions. + scalar iterationToInitialHitRatioLimit_; + + + // Motion control controls + + + // Cell size criteria + + //- Default cell size + scalar defaultCellSize_; + + //- Minimum cell size + scalar minimumCellSize_; + + + //- Switch to control the output of obj files for debug + Switch objOutput_; + + //- Switch to control the reporting of detailed timeChecks + Switch timeChecks_; + + //- Allowed relative load unbalance + scalar maxLoadUnbalance_; + + //- Number of "spokes" to use to search for secondary alignment + // direction + label alignmentSearchSpokes_; + + //- cosine of angle of alignment with required direction within which a + // face will be accepted for rotation + scalar cosAlignmentAcceptanceAngle_; + + //- Now often to re-store the size and alignment data + label sizeAndAlignmentRebuildFrequency_; + + + // Point insertion criteria + + //- Length between Delaunay vertices above which a new Dv should be + // inserted - fraction of the local target cell size + scalar insertionDistCoeff_; + + //- Minimum dual face area corresponding to long Delaunay edge where + // a new Dv is to be inserted - fraction of the local target cell + // size + scalar faceAreaRatioCoeff_; + + //- cosine of the angle of alignment with the required direction + // within which a long De will be accepted for a new Dv insertion + scalar cosInsertionAcceptanceAngle_; + + + // Point removal criteria + + //- Length between Delaunay vertices below which a Dv should be + // removed - fraction of the local target cell size + scalar removalDistCoeff_; + + + // polyMesh filtering controls + + //- Activates the mesh edge filtering. On by default. + Switch filterEdges_; + + //- Activates the mesh face filtering. Off by default. + Switch filterFaces_; + + //- Write tet mesh at output time (it always writes the Voronoi) + Switch writeTetDualMesh_; + + + // Private Member Functions + + //- Disallow default bitwise copy construct + cvControls(const cvControls&); + + //- Disallow default bitwise assignment + void operator=(const cvControls&); + + +public: + + // Constructors + + //- Construct from references to conformalVoronoiMesh and dictionary + cvControls + ( + const dictionary& cvMeshDict + ); + + + //- Destructor + ~cvControls(); + + + // Member Functions + + // Access + + //- Return the cvMeshDict + inline const dictionary& cvMeshDict() const; + + //- Return the pointPairDistanceCoeff + inline scalar pointPairDistanceCoeff() const; + + //- Return the mixedFeaturePointPPDistanceCoeff + inline scalar mixedFeaturePointPPDistanceCoeff() const; + + //- Return the featurePointExclusionDistanceCoeff + inline scalar featurePointExclusionDistanceCoeff() const; + + //- Return the featureEdgeExclusionDistanceCoeff + inline scalar featureEdgeExclusionDistanceCoeff() const; + + //- Return the surfacePtExclusionDistanceCoeff + inline scalar surfacePtExclusionDistanceCoeff() const; + + //- Return whether to use specialised feature points + inline Switch specialiseFeaturePoints() const; + + //- Return the surfaceSearchDistanceCoeff + inline scalar surfaceSearchDistanceCoeff() const; + + //- Return the maxSurfaceProtrusionCoeff + inline scalar maxSurfaceProtrusionCoeff() const; + + //- Return the maxQuadAngle + inline scalar maxQuadAngle() const; + + //- Return the surfaceConformationRebuildFrequency + inline label surfaceConformationRebuildFrequency() const; + + //- Return the edgeSearchDistCoeffSqr for conformation. + scalar edgeSearchDistCoeffSqr() const; + + //- Return the surfacePtReplaceDistCoeffSqr for conformation. + scalar surfacePtReplaceDistCoeffSqr() const; + + //- Return the maxConformationIterations + label maxConformationIterations() const; + + //- Return the iterationToInitialHitRatioLimit + scalar iterationToInitialHitRatioLimit() const; + + //- Return the defaultCellSize + inline scalar defaultCellSize() const; + + //- Return the minimumCellSize + inline scalar minimumCellSize() const; + + //- Return the objOutput Switch + inline Switch objOutput() const; + + //- Return the timeChecks Switch + inline Switch timeChecks() const; + + //- Return the maxLoadUnbalance + inline scalar maxLoadUnbalance() const; + + //- Return the number of alignmentSearchSpokes to use + inline label alignmentSearchSpokes() const; + + //- Return the cosAlignmentAcceptanceAngle + inline scalar cosAlignmentAcceptanceAngle() const; + + //- Return the sizeAndAlignmentRebuildFrequency + inline label sizeAndAlignmentRebuildFrequency() const; + + //- Return the aspectRatio + inline scalar aspectRatio() const; + + //- Return the aspectRatioDirection + inline const vector& aspectRatioDirection() const; + + //- Return the insertionDistCoeff + inline scalar insertionDistCoeff() const; + + //- Return the faceAreaRatioCoeff + inline scalar faceAreaRatioCoeff() const; + + //- Return the cosInsertionAcceptanceAngle + inline scalar cosInsertionAcceptanceAngle() const; + + //- Return removalDistCoeff + inline scalar removalDistCoeff() const; + + //- Filter edges at output time + inline Switch filterEdges() const; + + //- Filter faces at output time + inline Switch filterFaces() const; + + //- Write tetMesh at output time + inline Switch writeTetDualMesh() const; +}; + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace Foam + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#include "cvControlsI.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#endif + +// ************************************************************************* // diff --git a/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/cvControls/cvControlsI.H b/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/cvControls/cvControlsI.H new file mode 100644 index 0000000000000000000000000000000000000000..6cccc292edf9bba6147c94d02674e590ff2b67c0 --- /dev/null +++ b/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/cvControls/cvControlsI.H @@ -0,0 +1,203 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2012-2013 OpenFOAM Foundation + \\/ M anipulation | +------------------------------------------------------------------------------- +License + This file is part of OpenFOAM. + + OpenFOAM is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + OpenFOAM is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>. + +\*---------------------------------------------------------------------------*/ + +// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // + +inline const Foam::dictionary& Foam::cvControls::cvMeshDict() const +{ + return cvMeshDict_; +} + + +inline Foam::scalar Foam::cvControls::pointPairDistanceCoeff() const +{ + return pointPairDistanceCoeff_; +} + + +inline Foam::scalar Foam::cvControls::mixedFeaturePointPPDistanceCoeff() const +{ + return mixedFeaturePointPPDistanceCoeff_; +} + + +inline Foam::scalar Foam::cvControls::featurePointExclusionDistanceCoeff() const +{ + return featurePointExclusionDistanceCoeff_; +} + + +inline Foam::scalar Foam::cvControls::featureEdgeExclusionDistanceCoeff() const +{ + return featureEdgeExclusionDistanceCoeff_; +} + +inline Foam::scalar Foam::cvControls::surfacePtExclusionDistanceCoeff() const +{ + return surfacePtExclusionDistanceCoeff_; +} + +inline Foam::Switch Foam::cvControls::specialiseFeaturePoints() const +{ + return specialiseFeaturePoints_; +} + +inline Foam::scalar Foam::cvControls::surfaceSearchDistanceCoeff() const +{ + return surfaceSearchDistanceCoeff_; +} + + +inline Foam::scalar Foam::cvControls::maxSurfaceProtrusionCoeff() const +{ + return maxSurfaceProtrusionCoeff_; +} + + +inline Foam::scalar Foam::cvControls::maxQuadAngle() const +{ + return maxQuadAngle_; +} + + +inline Foam::label Foam::cvControls::surfaceConformationRebuildFrequency() const +{ + return surfaceConformationRebuildFrequency_; +} + + +inline Foam::scalar Foam::cvControls::edgeSearchDistCoeffSqr() const +{ + return edgeSearchDistCoeffSqr_; +} + + +inline Foam::scalar Foam::cvControls::surfacePtReplaceDistCoeffSqr() const +{ + return surfacePtReplaceDistCoeffSqr_; +} + + +inline Foam::label Foam::cvControls::maxConformationIterations() const +{ + return maxConformationIterations_; +} + + +inline Foam::scalar Foam::cvControls::iterationToInitialHitRatioLimit() const +{ + return iterationToInitialHitRatioLimit_; +} + + +inline Foam::scalar Foam::cvControls::defaultCellSize() const +{ + return defaultCellSize_; +} + + +inline Foam::scalar Foam::cvControls::minimumCellSize() const +{ + return minimumCellSize_; +} + + +inline Foam::Switch Foam::cvControls::objOutput() const +{ + return objOutput_; +} + + +inline Foam::Switch Foam::cvControls::timeChecks() const +{ + return timeChecks_; +} + + +inline Foam::scalar Foam::cvControls::maxLoadUnbalance() const +{ + return maxLoadUnbalance_; +} + + +inline Foam::label Foam::cvControls::alignmentSearchSpokes() const +{ + return alignmentSearchSpokes_; +} + + +inline Foam::scalar Foam::cvControls::cosAlignmentAcceptanceAngle() const +{ + return cosAlignmentAcceptanceAngle_; +} + + +inline Foam::label Foam::cvControls::sizeAndAlignmentRebuildFrequency() const +{ + return sizeAndAlignmentRebuildFrequency_; +} + + +inline Foam::scalar Foam::cvControls::insertionDistCoeff() const +{ + return insertionDistCoeff_; +} + + +inline Foam::scalar Foam::cvControls::faceAreaRatioCoeff() const +{ + return faceAreaRatioCoeff_; +} + + +inline Foam::scalar Foam::cvControls::cosInsertionAcceptanceAngle() const +{ + return cosInsertionAcceptanceAngle_; +} + + +inline Foam::scalar Foam::cvControls::removalDistCoeff() const +{ + return removalDistCoeff_; +} + + +inline Foam::Switch Foam::cvControls::filterEdges() const +{ + return filterEdges_; +} + +inline Foam::Switch Foam::cvControls::filterFaces() const +{ + return filterFaces_; +} + +inline Foam::Switch Foam::cvControls::writeTetDualMesh() const +{ + return writeTetDualMesh_; +} + + +// ************************************************************************* // diff --git a/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/faceAreaWeightModel/faceAreaWeightModel/faceAreaWeightModel.C b/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/faceAreaWeightModel/faceAreaWeightModel/faceAreaWeightModel.C new file mode 100644 index 0000000000000000000000000000000000000000..88c1e0bef4b6b80a9f5500c5a18df0d42ac79a0b --- /dev/null +++ b/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/faceAreaWeightModel/faceAreaWeightModel/faceAreaWeightModel.C @@ -0,0 +1,99 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2012 OpenFOAM Foundation + \\/ M anipulation | +------------------------------------------------------------------------------- +License + This file is part of OpenFOAM. + + OpenFOAM is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + OpenFOAM is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>. + +\*---------------------------------------------------------------------------*/ + +#include "faceAreaWeightModel.H" +#include "addToRunTimeSelectionTable.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +defineTypeNameAndDebug(faceAreaWeightModel, 0); +defineRunTimeSelectionTable(faceAreaWeightModel, dictionary); + + +// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // + +faceAreaWeightModel::faceAreaWeightModel +( + const word& type, + const dictionary& relaxationDict +) +: + dictionary(relaxationDict), + coeffDict_(subDict(type + "Coeffs")) +{} + + +// * * * * * * * * * * * * * * * * * Selectors * * * * * * * * * * * * * * * // + +autoPtr<faceAreaWeightModel> faceAreaWeightModel::New +( + const dictionary& relaxationDict +) +{ + word faceAreaWeightModelTypeName + ( + relaxationDict.lookup("faceAreaWeightModel") + ); + + Info<< nl << "Selecting faceAreaWeightModel " + << faceAreaWeightModelTypeName << endl; + + dictionaryConstructorTable::iterator cstrIter = + dictionaryConstructorTablePtr_->find(faceAreaWeightModelTypeName); + + if (cstrIter == dictionaryConstructorTablePtr_->end()) + { + FatalErrorIn + ( + "faceAreaWeightModel::New(const dictionary&, " + "const conformalVoronoiMesh&)" + ) << "Unknown faceAreaWeightModel type " + << faceAreaWeightModelTypeName + << endl << endl + << "Valid faceAreaWeightModel types are :" << endl + << dictionaryConstructorTablePtr_->toc() + << exit(FatalError); + } + + return autoPtr<faceAreaWeightModel>(cstrIter()(relaxationDict)); +} + + +// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * // + +faceAreaWeightModel::~faceAreaWeightModel() +{} + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace Foam + +// ************************************************************************* // diff --git a/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/faceAreaWeightModel/faceAreaWeightModel/faceAreaWeightModel.H b/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/faceAreaWeightModel/faceAreaWeightModel/faceAreaWeightModel.H new file mode 100644 index 0000000000000000000000000000000000000000..d7afd964a6d7b0debcdd68d92172a66680681bd9 --- /dev/null +++ b/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/faceAreaWeightModel/faceAreaWeightModel/faceAreaWeightModel.H @@ -0,0 +1,142 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2012 OpenFOAM Foundation + \\/ M anipulation | +------------------------------------------------------------------------------- +License + This file is part of OpenFOAM. + + OpenFOAM is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + OpenFOAM is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>. + +Class + Foam::faceAreaWeightModel + +Description + Abstract base class for providing faceAreaWeight values to the cell motion + controller based on an argument faceAreaFraction value, typically the ratio + of the area of the face in question to the area of a square face with a side + length of the local target cell size. + +SourceFiles + faceAreaWeightModel.C + +\*---------------------------------------------------------------------------*/ + +#ifndef faceAreaWeightModel_H +#define faceAreaWeightModel_H + +#include "point.H" +#include "dictionary.H" +#include "autoPtr.H" +#include "runTimeSelectionTables.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ + +/*---------------------------------------------------------------------------*\ + Class faceAreaWeightModel Declaration +\*---------------------------------------------------------------------------*/ + +class faceAreaWeightModel +: + public dictionary +{ + +protected: + + // Protected data + + //- Method coeffs dictionary + dictionary coeffDict_; + +private: + + // Private Member Functions + + //- Disallow default bitwise copy construct + faceAreaWeightModel(const faceAreaWeightModel&); + + //- Disallow default bitwise assignment + void operator=(const faceAreaWeightModel&); + + +public: + + //- Runtime type information + TypeName("faceAreaWeightModel"); + + + // Declare run-time constructor selection table + + declareRunTimeSelectionTable + ( + autoPtr, + faceAreaWeightModel, + dictionary, + ( + const dictionary& faceAreaWeightDict + ), + (faceAreaWeightDict) + ); + + + // Constructors + + //- Construct from components + faceAreaWeightModel + ( + const word& type, + const dictionary& faceAreaWeightDict + ); + + + // Selectors + + //- Return a reference to the selected faceAreaWeightModel + static autoPtr<faceAreaWeightModel> New + ( + const dictionary& faceAreaWeightDict + ); + + + //- Destructor + virtual ~faceAreaWeightModel(); + + + // Member Functions + + //- Const access to the coeffs dictionary + const dictionary& coeffDict() const + { + return coeffDict_; + } + + //- Return the current faceAreaWeight coefficient + virtual scalar faceAreaWeight(scalar faceAreaFraction) const = 0; +}; + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace Foam + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#endif + +// ************************************************************************* // diff --git a/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/faceAreaWeightModel/piecewiseLinearRamp/piecewiseLinearRamp.C b/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/faceAreaWeightModel/piecewiseLinearRamp/piecewiseLinearRamp.C new file mode 100644 index 0000000000000000000000000000000000000000..07496e351777324c62ce6df3f625604b27f1dd6b --- /dev/null +++ b/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/faceAreaWeightModel/piecewiseLinearRamp/piecewiseLinearRamp.C @@ -0,0 +1,80 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2012 OpenFOAM Foundation + \\/ M anipulation | +------------------------------------------------------------------------------- +License + This file is part of OpenFOAM. + + OpenFOAM is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + OpenFOAM is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>. + +\*---------------------------------------------------------------------------*/ + +#include "piecewiseLinearRamp.H" +#include "addToRunTimeSelectionTable.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ + +// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * // + +defineTypeNameAndDebug(piecewiseLinearRamp, 0); +addToRunTimeSelectionTable +( + faceAreaWeightModel, + piecewiseLinearRamp, + dictionary +); + +// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // + +piecewiseLinearRamp::piecewiseLinearRamp +( + const dictionary& faceAreaWeightDict +) +: + faceAreaWeightModel(typeName, faceAreaWeightDict), + lAF_(readScalar(coeffDict().lookup("lowerAreaFraction"))), + uAF_(readScalar(coeffDict().lookup("upperAreaFraction"))) +{} + + +// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // + +scalar piecewiseLinearRamp::faceAreaWeight(scalar faceAreaFraction) const +{ + if (faceAreaFraction < lAF_) + { + return 0; + } + else if (faceAreaFraction < uAF_) + { + return faceAreaFraction/((uAF_ - lAF_)) - lAF_/(uAF_ - lAF_); + } + else + { + return 1; + } +} + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace Foam + +// ************************************************************************* // diff --git a/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/faceAreaWeightModel/piecewiseLinearRamp/piecewiseLinearRamp.H b/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/faceAreaWeightModel/piecewiseLinearRamp/piecewiseLinearRamp.H new file mode 100644 index 0000000000000000000000000000000000000000..58fd55da039529a8e7501ef39b8ff662d0e55b6c --- /dev/null +++ b/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/faceAreaWeightModel/piecewiseLinearRamp/piecewiseLinearRamp.H @@ -0,0 +1,98 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2012 OpenFOAM Foundation + \\/ M anipulation | +------------------------------------------------------------------------------- +License + This file is part of OpenFOAM. + + OpenFOAM is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + OpenFOAM is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>. + +Class + Foam::piecewiseLinearRamp + +Description + A linear ramp between 0 and 1 with definable start and end points. + +SourceFiles + piecewiseLinearRamp.C + +\*---------------------------------------------------------------------------*/ + +#ifndef piecewiseLinearRamp_H +#define piecewiseLinearRamp_H + +#include "faceAreaWeightModel.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ + +/*---------------------------------------------------------------------------*\ + Class piecewiseLinearRamp Declaration +\*---------------------------------------------------------------------------*/ + +class piecewiseLinearRamp +: + public faceAreaWeightModel +{ + +private: + + // Private data + + //- Face area fraction below which a weight of 0 is returned + scalar lAF_; + + //- Face area fraction above which a which of 1 is returned + scalar uAF_; + +public: + + //- Runtime type information + TypeName("piecewiseLinearRamp"); + + // Constructors + + //- Construct from components + piecewiseLinearRamp + ( + const dictionary& faceAreaWeightDict + ); + + + //- Destructor + virtual ~piecewiseLinearRamp() + {} + + + // Member Functions + + //- Return the faceAreaWeight + virtual scalar faceAreaWeight(scalar faceAreaFraction) const; +}; + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace Foam + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#endif + +// ************************************************************************* // diff --git a/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/initialPointsMethod/autoDensity/autoDensity.C b/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/initialPointsMethod/autoDensity/autoDensity.C new file mode 100644 index 0000000000000000000000000000000000000000..0aace4f77fca09c19a7c72a0d1873672bdd62762 --- /dev/null +++ b/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/initialPointsMethod/autoDensity/autoDensity.C @@ -0,0 +1,947 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2012 OpenFOAM Foundation + \\/ M anipulation | +------------------------------------------------------------------------------- +License + This file is part of OpenFOAM. + + OpenFOAM is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + OpenFOAM is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>. + +\*---------------------------------------------------------------------------*/ + +#include "autoDensity.H" +#include "addToRunTimeSelectionTable.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ + +// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * // + +defineTypeNameAndDebug(autoDensity, 0); +addToRunTimeSelectionTable +( + initialPointsMethod, + autoDensity, + dictionary +); + +// * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * // + +void Foam::autoDensity::writeOBJ +( + const treeBoundBox& bb, + fileName name +) const +{ + OFstream str(cvMesh_.time().path()/name + ".obj"); + + Pout<< "Writing " << str.name() << endl; + + pointField bbPoints(bb.points()); + + forAll(bbPoints, i) + { + meshTools::writeOBJ(str, bbPoints[i]); + } + + forAll(treeBoundBox::edges, i) + { + const edge& e = treeBoundBox::edges[i]; + + str << "l " << e[0] + 1 << ' ' << e[1] + 1 << nl; + } +} + +bool Foam::autoDensity::combinedOverlaps(const treeBoundBox& box) const +{ + if (Pstream::parRun()) + { + return + cvMesh_.decomposition().overlapsThisProcessor(box) + || cvMesh_.geometryToConformTo().overlaps(box); + } + + return cvMesh_.geometryToConformTo().overlaps(box); +} + + +bool Foam::autoDensity::combinedInside(const point& p) const +{ + if (Pstream::parRun()) + { + return + cvMesh_.decomposition().positionOnThisProcessor(p) + && cvMesh_.geometryToConformTo().inside(p); + } + + return cvMesh_.geometryToConformTo().inside(p); +} + + +Foam::Field<bool> Foam::autoDensity::combinedWellInside +( + const pointField& pts, + const scalarField& sizes +) const +{ + if (!Pstream::parRun()) + { + return cvMesh_.geometryToConformTo().wellInside + ( + pts, + minimumSurfaceDistanceCoeffSqr_*sqr(sizes) + ); + } + + Field<bool> inside(pts.size(), true); + + // Perform AND operation between testing the surfaces and the previous + // field, i.e the parallel result, or in serial, with true. + + Field<bool> insideA + ( + cvMesh_.geometryToConformTo().wellInside + ( + pts, + minimumSurfaceDistanceCoeffSqr_*sqr(sizes) + ) + ); + + Field<bool> insideB(cvMesh_.decomposition().positionOnThisProcessor(pts)); + + // inside = insideA && insideB; + + // Pout<< insideA << nl << insideB << endl; + + forAll(inside, i) + { + // if (inside[i] != (insideA[i] && insideB[i])) + // { + // Pout<< i << " not equal " << " " + // << pts[i] << " " << sizes[i] << " " + // << insideA[i] << " " + // << insideB[i] << " " + // << inside[i] + // << endl; + // } + + inside[i] = (insideA[i] && insideB[i]); + } + + return inside; +} + + +bool Foam::autoDensity::combinedWellInside +( + const point& p, + scalar size +) const +{ + bool inside = true; + + if (Pstream::parRun()) + { + inside = cvMesh_.decomposition().positionOnThisProcessor(p); + } + + // Perform AND operation between testing the surfaces and the previous + // result, i.e the parallel result, or in serial, with true. + inside = + inside + && cvMesh_.geometryToConformTo().wellInside + ( + p, + minimumSurfaceDistanceCoeffSqr_*sqr(size) + ); + + return inside; +} + + +void Foam::autoDensity::recurseAndFill +( + DynamicList<Vb::Point>& initialPoints, + const treeBoundBox& bb, + label levelLimit, + word recursionName +) const +{ + for (direction i = 0; i < 8; i++) + { + treeBoundBox subBB = bb.subBbox(i); + + word newName = recursionName + "_" + Foam::name(i); + + if (debug) + { + cvMesh_.timeCheck(newName); + } + + if (combinedOverlaps(subBB)) + { + if (levelLimit > 0) + { + recurseAndFill + ( + initialPoints, + subBB, + levelLimit - 1, + newName + ); + } + else + { + if (debug) + { + writeOBJ + ( + subBB, + word(newName + "_overlap") + ); + + Pout<< newName + "_overlap " << subBB << endl; + } + + if (!fillBox(initialPoints, subBB, true)) + { + recurseAndFill + ( + initialPoints, + subBB, + levelLimit - 1, + newName + ); + } + } + } + else if (combinedInside(subBB.midpoint())) + { + if (debug) + { + writeOBJ + ( + subBB, + newName + "_inside" + ); + + Pout<< newName + "_inside " << subBB << endl; + } + + if (!fillBox(initialPoints, subBB, false)) + { + recurseAndFill + ( + initialPoints, + subBB, + levelLimit - 1, + newName + ); + } + } + else + { + if (debug) + { + writeOBJ + ( + subBB, + newName + "_outside" + ); + } + } + } +} + + +bool Foam::autoDensity::fillBox +( + DynamicList<Vb::Point>& initialPoints, + const treeBoundBox& bb, + bool overlapping +) const +{ + const conformationSurfaces& geometry(cvMesh_.geometryToConformTo()); + + Random& rnd = cvMesh_.rndGen(); + + unsigned int initialSize = initialPoints.size(); + + scalar maxCellSize = -GREAT; + + scalar minCellSize = GREAT; + + scalar maxDensity = 1/pow3(minCellSize); + + scalar volumeAdded = 0.0; + + const point& min = bb.min(); + + vector span = bb.span(); + + scalar totalVolume = bb.volume(); + + label trialPoints = 0; + + bool wellInside = false; + + if (!overlapping) + { + // Check the nearest point on the surface to the box, if it is far + // enough away, then the surface sampling of the box can be skipped. + // Checking if the nearest piece of surface is at least 1.5*bb.span away + // from the bb.midpoint. + + pointIndexHit surfHit; + label hitSurface; + + geometry.findSurfaceNearest + ( + bb.midpoint(), + 2.25*magSqr(span), + surfHit, + hitSurface + ); + + if (!surfHit.hit()) + { + if (debug) + { + Pout<< "box wellInside, no need to sample surface." << endl; + } + + wellInside = true; + } + } + + if (!overlapping && !wellInside) + { + // If this is an inside box then then it is possible to fill points very + // close to the boundary, to prevent this, check the corners and sides + // of the box so ensure that they are "wellInside". If not, set as an + // overlapping box. + + pointField corners(bb.points()); + + scalarField cornerSizes = cvMesh_.cellShapeControls().cellSize(corners); + + Field<bool> insideCorners = combinedWellInside(corners, cornerSizes); + + // Pout<< corners << nl << cornerSizes << nl << insideCorners << endl; + + forAll(insideCorners, i) + { + // Use the sizes to improve the min/max cell size estimate + scalar s = cornerSizes[i]; + + if (s > maxCellSize) + { + maxCellSize = s; + } + + if (s < minCellSize) + { + minCellSize = max(s, minCellSizeLimit_); + } + + if (maxCellSize/minCellSize > maxSizeRatio_) + { + if (debug) + { + Pout<< "Abort fill at corner sample stage," + << " minCellSize " << minCellSize + << " maxCellSize " << maxCellSize + << " maxSizeRatio " << maxCellSize/minCellSize + << endl; + } + + return false; + } + + if (!insideCorners[i]) + { + // If one or more corners is not "wellInside", then treat this + // as an overlapping box. + + if (debug) + { + Pout<< "Inside box found to have some non-wellInside " + << "corners, using overlapping fill." + << endl; + } + + overlapping = true; + + break; + } + } + + if (!overlapping) + { + vector delta = span/(surfRes_ - 1); + + label nLine = 6*(surfRes_ - 2); + + pointField linePoints(nLine, vector::zero); + + scalarField lineSizes(nLine, 0.0); + + for (label i = 0; i < surfRes_; i++) + { + label lPI = 0; + + for (label j = 1; j < surfRes_ - 1 ; j++) + { + linePoints[lPI++] = + min + + vector(0, delta.y()*i, delta.z()*j); + + linePoints[lPI++] = + min + + vector + ( + delta.x()*(surfRes_ - 1), + delta.y()*i, + delta.z()*j + ); + + linePoints[lPI++] = + min + + vector(delta.x()*j, 0, delta.z()*i); + + linePoints[lPI++] = + min + + vector + ( + delta.x()*j, + delta.y()*(surfRes_ - 1), + delta.z()*i + ); + + linePoints[lPI++] = + min + + vector(delta.x()*i, delta.y()*j, 0); + + linePoints[lPI++] = + min + + vector + ( + delta.x()*i, + delta.y()*j, + delta.z()*(surfRes_ - 1) + ); + } + + lineSizes = cvMesh_.cellShapeControls().cellSize(linePoints); + + Field<bool> insideLines = combinedWellInside + ( + linePoints, + lineSizes + ); + + forAll(insideLines, i) + { + // Use the sizes to improve the min/max cell size estimate + scalar s = lineSizes[i]; + + if (s > maxCellSize) + { + maxCellSize = s; + } + + if (s < minCellSize) + { + minCellSize = max(s, minCellSizeLimit_); + } + + if (maxCellSize/minCellSize > maxSizeRatio_) + { + if (debug) + { + Pout<< "Abort fill at surface sample stage, " + << " minCellSize " << minCellSize + << " maxCellSize " << maxCellSize + << " maxSizeRatio " << maxCellSize/minCellSize + << endl; + } + + return false; + } + + if (!insideLines[i]) + { + // If one or more surface points is not "wellInside", + // then treat this as an overlapping box. + overlapping = true; + + if (debug) + { + Pout<< "Inside box found to have some non-" + << "wellInside surface points, using " + << "overlapping fill." + << endl; + } + + break; + } + } + } + } + } + + if (overlapping) + { + // Sample the box to find an estimate of the min size, and a volume + // estimate when overlapping == true. + + pointField samplePoints + ( + volRes_*volRes_*volRes_, + vector::zero + ); + + vector delta = span/volRes_; + + label pI = 0; + + for (label i = 0; i < volRes_; i++) + { + for (label j = 0; j < volRes_; j++) + { + for (label k = 0; k < volRes_; k++) + { + // Perturb the points to avoid creating degenerate positions + // in the Delaunay tessellation. + + samplePoints[pI++] = + min + + vector + ( + delta.x()*(i + 0.5 + 0.1*(rnd.scalar01() - 0.5)), + delta.y()*(j + 0.5 + 0.1*(rnd.scalar01() - 0.5)), + delta.z()*(k + 0.5 + 0.1*(rnd.scalar01() - 0.5)) + ); + } + } + } + + // Randomise the order of the points to (potentially) improve the speed + // of assessing the density ratio, and prevent a box being filled from a + // corner when only some these points are required. + shuffle(samplePoints); + + scalarField sampleSizes = cvMesh_.cellShapeControls().cellSize + ( + samplePoints + ); + + Field<bool> insidePoints = combinedWellInside + ( + samplePoints, + sampleSizes + ); + + label nInside = 0; + + forAll(insidePoints, i) + { + if (insidePoints[i]) + { + nInside++; + + scalar s = sampleSizes[i]; + + if (s > maxCellSize) + { + maxCellSize = s; + } + + if (s < minCellSize) + { + minCellSize = max(s, minCellSizeLimit_); + } + + if (maxCellSize/minCellSize > maxSizeRatio_) + { + if (debug) + { + Pout<< "Abort fill at sample stage," + << " minCellSize " << minCellSize + << " maxCellSize " << maxCellSize + << " maxSizeRatio " << maxCellSize/minCellSize + << endl; + } + + return false; + } + } + } + + if (nInside == 0) + { + if (debug) + { + Pout<< "No sample points found inside box" << endl; + } + + return true; + } + + if (debug) + { + Pout<< scalar(nInside)/scalar(samplePoints.size()) + << " full overlapping box" << endl; + } + + totalVolume *= scalar(nInside)/scalar(samplePoints.size()); + + if (debug) + { + Pout<< "Total volume to fill = " << totalVolume << endl; + } + + // Using the sampledPoints as the first test locations as they are + // randomly shuffled, but unfiormly sampling space and have wellInside + // and size data already + + maxDensity = 1/pow3(max(minCellSize, SMALL)); + + forAll(insidePoints, i) + { + if (insidePoints[i]) + { + trialPoints++; + + point p = samplePoints[i]; + + scalar localSize = sampleSizes[i]; + + scalar localDensity = 1/pow3(localSize); + + // No need to look at max/min cell size here, already handled + // by sampling + + // Accept possible placements proportional to the relative + // local density + + // TODO - is there a lot of cost in the 1/density calc? Could + // assess on + // (1/maxDensity)/(1/localDensity) = minVolume/localVolume + if (localDensity/maxDensity > rnd.scalar01()) + { + scalar localVolume = 1/localDensity; + + if (volumeAdded + localVolume > totalVolume) + { + // Add the final box with a probability of to the ratio + // of the remaining volume to the volume to be added, + // i.e. insert a box of volume 0.5 into a remaining + // volume of 0.1 20% of the time. + scalar addProbability = + (totalVolume - volumeAdded)/localVolume; + + scalar r = rnd.scalar01(); + + if (debug) + { + Pout<< "totalVolume " << totalVolume << nl + << "volumeAdded " << volumeAdded << nl + << "localVolume " << localVolume << nl + << "addProbability " << addProbability << nl + << "random " << r + << endl; + } + + if (addProbability > r) + { + // Place this volume before finishing filling this + // box + + // Pout<< "Final volume probability break accept" + // << endl; + + initialPoints.append + ( + Vb::Point(p.x(), p.y(), p.z()) + ); + + volumeAdded += localVolume; + } + + break; + } + + initialPoints.append(Vb::Point(p.x(), p.y(), p.z())); + + volumeAdded += localVolume; + } + } + } + } + + if (volumeAdded < totalVolume) + { + if (debug) + { + Pout<< "Adding random points, remaining volume " + << totalVolume - volumeAdded + << endl; + } + + maxDensity = 1/pow3(max(minCellSize, SMALL)); + + while (true) + { + trialPoints++; + + point p = min + cmptMultiply(span, rnd.vector01()); + + scalar localSize = cvMesh_.cellShapeControls().cellSize(p); + + bool insidePoint = false; + + if (!overlapping) + { + insidePoint = true; + } + else + { + // Determine if the point is "wellInside" the domain + insidePoint = combinedWellInside(p, localSize); + } + + if (insidePoint) + { + if (localSize > maxCellSize) + { + maxCellSize = localSize; + } + + if (localSize < minCellSize) + { + minCellSize = max(localSize, minCellSizeLimit_); + + localSize = minCellSize; + + // 1/(minimum cell size)^3, gives the maximum permissible + // point density + maxDensity = 1/pow3(max(minCellSize, SMALL)); + } + + if (maxCellSize/minCellSize > maxSizeRatio_) + { + if (debug) + { + Pout<< "Abort fill at random fill stage," + << " minCellSize " << minCellSize + << " maxCellSize " << maxCellSize + << " maxSizeRatio " << maxCellSize/minCellSize + << endl; + } + + // Discard any points already filled into this box by + // setting size of initialPoints back to its starting value + initialPoints.resize(initialSize); + + return false; + } + + scalar localDensity = 1/pow3(max(localSize, SMALL)); + + // Accept possible placements proportional to the relative local + // density + if (localDensity/maxDensity > rnd.scalar01()) + { + scalar localVolume = 1/localDensity; + + if (volumeAdded + localVolume > totalVolume) + { + // Add the final box with a probability of to the ratio + // of the remaining volume to the volume to be added, + // i.e. insert a box of volume 0.5 into a remaining + // volume of 0.1 20% of the time. + scalar addProbability = + (totalVolume - volumeAdded)/localVolume; + + scalar r = rnd.scalar01(); + + if (debug) + { + Pout<< "totalVolume " << totalVolume << nl + << "volumeAdded " << volumeAdded << nl + << "localVolume " << localVolume << nl + << "addProbability " << addProbability << nl + << "random " << r + << endl; + } + + if (addProbability > r) + { + // Place this volume before finishing filling this + // box + + // Pout<< "Final volume probability break accept" + // << endl; + + initialPoints.append + ( + Vb::Point(p.x(), p.y(), p.z()) + ); + + volumeAdded += localVolume; + } + + break; + } + + initialPoints.append(Vb::Point(p.x(), p.y(), p.z())); + + volumeAdded += localVolume; + } + } + } + } + + globalTrialPoints_ += trialPoints; + + if (debug) + { + Pout<< trialPoints + << " locations queried, " << initialPoints.size() - initialSize + << " points placed, (" + << scalar(initialPoints.size() - initialSize) + /scalar(max(trialPoints, 1)) + << " success rate)." << nl + << "minCellSize " << minCellSize + << ", maxCellSize " << maxCellSize + << ", ratio " << maxCellSize/minCellSize + << nl << endl; + } + + return true; +} + + +// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // + +autoDensity::autoDensity +( + const dictionary& initialPointsDict, + const conformalVoronoiMesh& cvMesh +) +: + initialPointsMethod(typeName, initialPointsDict, cvMesh), + globalTrialPoints_(0), + minCellSizeLimit_ + ( + detailsDict().lookupOrDefault<scalar>("minCellSizeLimit", 0.0) + ), + minLevels_(readLabel(detailsDict().lookup("minLevels"))), + maxSizeRatio_(readScalar(detailsDict().lookup("maxSizeRatio"))), + volRes_(readLabel(detailsDict().lookup("sampleResolution"))), + surfRes_ + ( + detailsDict().lookupOrDefault<label>("surfaceSampleResolution", volRes_) + ) +{ + if (maxSizeRatio_ <= 1.0) + { + maxSizeRatio_ = 2.0; + + WarningIn + ( + "autoDensity::autoDensity" + "(" + "const dictionary& initialPointsDict," + "const conformalVoronoiMesh& cvMesh" + ")" + ) + << "The maxSizeRatio must be greater than one to be sensible, " + << "setting to " << maxSizeRatio_ + << endl; + } +} + + +// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // + +List<Vb::Point> autoDensity::initialPoints() const +{ + treeBoundBox hierBB; + + // Pick up the bounds of this processor, or the whole geometry, depending + // on whether this is a parallel run. + if (Pstream::parRun()) + { + hierBB = cvMesh_.decomposition().procBounds(); + } + else + { + // Extend the global box to move it off large plane surfaces + hierBB = cvMesh_.geometryToConformTo().globalBounds().extend + ( + cvMesh_.rndGen(), + 1e-6 + ); + } + + DynamicList<Vb::Point> initialPoints; + + Info<< nl << " " << typeName << endl; + + if (debug) + { + Pout<< " Filling box " << hierBB << endl; + } + + recurseAndFill + ( + initialPoints, + hierBB, + minLevels_ - 1, + "recursionBox" + ); + + initialPoints.shrink(); + + label nInitialPoints = initialPoints.size(); + + if (Pstream::parRun()) + { + reduce(nInitialPoints, sumOp<label>()); + reduce(globalTrialPoints_, sumOp<label>()); + } + + Info<< " " << nInitialPoints << " points placed" << nl + << " " << globalTrialPoints_ << " locations queried" << nl + << " " + << scalar(nInitialPoints)/scalar(max(globalTrialPoints_, 1)) + << " success rate" + << endl; + + return initialPoints; +} + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace Foam + +// ************************************************************************* // diff --git a/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/initialPointsMethod/autoDensity/autoDensity.H b/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/initialPointsMethod/autoDensity/autoDensity.H new file mode 100644 index 0000000000000000000000000000000000000000..2ef7cb00b0e3fa6b737526dff9918acd94bdeac7 --- /dev/null +++ b/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/initialPointsMethod/autoDensity/autoDensity.H @@ -0,0 +1,171 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2012 OpenFOAM Foundation + \\/ M anipulation | +------------------------------------------------------------------------------- +License + This file is part of OpenFOAM. + + OpenFOAM is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + OpenFOAM is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>. + +Class + Foam::autoDensity + +Description + Choose random points inside the domain and place them with a probability + proportional to the target density of points. + +SourceFiles + autoDensity.C + +\*---------------------------------------------------------------------------*/ + +#ifndef autoDensity_H +#define autoDensity_H + +#include "initialPointsMethod.H" +#include "treeBoundBox.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ + +/*---------------------------------------------------------------------------*\ + Class autoDensity Declaration +\*---------------------------------------------------------------------------*/ + +class autoDensity +: + public initialPointsMethod +{ + +private: + + // Private data + + //- Trial points attempted to be placed in all boxes + mutable label globalTrialPoints_; + + //- Smallest minimum cell size allowed, i.e. to avoid high initial + // population of areas of small size + scalar minCellSizeLimit_; + + //- Minimum normal level of recursion, can be more if a high density + // ratio is detected + label minLevels_; + + //- Maximum allowed ratio of cell size in a box + scalar maxSizeRatio_; + + //- How fine should the initial sample of the volume a box be to + // investigate its cell sizes and volume fraction + label volRes_; + + //- How fine should the initial sample of the surface of a box be to + // investigate if it is near to a the geometry. + label surfRes_; + + + // Private Member Functions + + //- Check if the given box overlaps the geometry or, in parallel, the + // backgroundMeshDecomposition + bool combinedOverlaps(const treeBoundBox& box) const; + + //- Check if the given point is inside the geometry and, in parallel, + // the backgroundMeshDecomposition + bool combinedInside(const point& p) const; + + //- Check if the given points are wellInside the geometry and, in + // parallel, inside the backgroundMeshDecomposition + Field<bool> combinedWellInside + ( + const pointField& pts, + const scalarField& sizes + ) const; + + //- Check if the given points are wellInside the geometry and, in + // parallel, inside the backgroundMeshDecomposition + bool combinedWellInside + ( + const point& p, + scalar size + ) const; + + //- Write boundBox as obj + void writeOBJ + ( + const treeBoundBox& bb, + fileName name + ) const; + + //- Descend into octants of the supplied bound box + void recurseAndFill + ( + DynamicList<Vb::Point>& initialPoints, + const treeBoundBox& bb, + label levelLimit, + word recursionName + ) const; + + //- Fill the given box, optionally filling surface overlapping boxes. + // Returns true if the fill is successful, false if it is to be aborted + // in favour of further recursion. + bool fillBox + ( + DynamicList<Vb::Point>& initialPoints, + const treeBoundBox& bb, + bool overlapping + ) const; + + +public: + + //- Runtime type information + TypeName("autoDensity"); + + // Constructors + + //- Construct from components + autoDensity + ( + const dictionary& initialPointsDict, + const conformalVoronoiMesh& cvMesh + ); + + + //- Destructor + virtual ~autoDensity() + {} + + + // Member Functions + + //- Return the initial points for the conformalVoronoiMesh + virtual List<Vb::Point> initialPoints() const; +}; + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace Foam + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#endif + +// ************************************************************************* // diff --git a/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/initialPointsMethod/bodyCentredCubic/bodyCentredCubic.C b/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/initialPointsMethod/bodyCentredCubic/bodyCentredCubic.C new file mode 100644 index 0000000000000000000000000000000000000000..c69e7ac8fb314d334c595d103e9dd70ffe7fd9fc --- /dev/null +++ b/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/initialPointsMethod/bodyCentredCubic/bodyCentredCubic.C @@ -0,0 +1,194 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2012 OpenFOAM Foundation + \\/ M anipulation | +------------------------------------------------------------------------------- +License + This file is part of OpenFOAM. + + OpenFOAM is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + OpenFOAM is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>. + +\*---------------------------------------------------------------------------*/ + +#include "bodyCentredCubic.H" +#include "addToRunTimeSelectionTable.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ + +// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * // + +defineTypeNameAndDebug(bodyCentredCubic, 0); +addToRunTimeSelectionTable(initialPointsMethod, bodyCentredCubic, dictionary); + +// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // + +bodyCentredCubic::bodyCentredCubic +( + const dictionary& initialPointsDict, + const conformalVoronoiMesh& cvMesh +) +: + initialPointsMethod(typeName, initialPointsDict, cvMesh), + initialCellSize_(readScalar(detailsDict().lookup("initialCellSize"))), + randomiseInitialGrid_(detailsDict().lookup("randomiseInitialGrid")), + randomPerturbationCoeff_ + ( + readScalar(detailsDict().lookup("randomPerturbationCoeff")) + ) +{} + + +// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // + +List<Vb::Point> bodyCentredCubic::initialPoints() const +{ + boundBox bb; + + // Pick up the bounds of this processor, or the whole geometry, depending + // on whether this is a parallel run. + if (Pstream::parRun()) + { + bb = cvMesh_.decomposition().procBounds(); + } + else + { + bb = cvMesh_.geometryToConformTo().globalBounds(); + } + + scalar x0 = bb.min().x(); + scalar xR = bb.max().x() - x0; + label ni = label(xR/initialCellSize_); + + scalar y0 = bb.min().y(); + scalar yR = bb.max().y() - y0; + label nj = label(yR/initialCellSize_); + + scalar z0 = bb.min().z(); + scalar zR = bb.max().z() - z0; + label nk = label(zR/initialCellSize_); + + vector delta(xR/ni, yR/nj, zR/nk); + + delta *= pow((1.0/2.0),-(1.0/3.0)); + + Random& rndGen = cvMesh_.rndGen(); + + scalar pert = randomPerturbationCoeff_*cmptMin(delta); + + DynamicList<Vb::Point> initialPoints(ni*nj*nk/10); + + for (label i = 0; i < ni; i++) + { + for (label j = 0; j < nj; j++) + { + // Generating, testing and adding points one line at a time to + // reduce the memory requirement for cases with bounding boxes that + // are very large in comparison to the volume to be filled + + label pI = 0; + + pointField points(2*nk); + + for (label k = 0; k < nk; k++) + { + point pA + ( + x0 + i*delta.x(), + y0 + j*delta.y(), + z0 + k*delta.z() + ); + + point pB = pA + 0.5*delta; + + if (randomiseInitialGrid_) + { + pA.x() += pert*(rndGen.scalar01() - 0.5); + pA.y() += pert*(rndGen.scalar01() - 0.5); + pA.z() += pert*(rndGen.scalar01() - 0.5); + } + + if (Pstream::parRun()) + { + if (cvMesh_.decomposition().positionOnThisProcessor(pA)) + { + // Add this point in parallel only if this position is + // on this processor. + points[pI++] = pA; + } + } + else + { + points[pI++] = pA; + } + + if (randomiseInitialGrid_) + { + pB.x() += pert*(rndGen.scalar01() - 0.5); + pB.y() += pert*(rndGen.scalar01() - 0.5); + pB.z() += pert*(rndGen.scalar01() - 0.5); + } + + if (Pstream::parRun()) + { + if (cvMesh_.decomposition().positionOnThisProcessor(pB)) + { + // Add this point in parallel only if this position is + // on this processor. + points[pI++] = pB; + } + } + else + { + points[pI++] = pB; + } + } + + points.setSize(pI); + + Field<bool> insidePoints = cvMesh_.geometryToConformTo().wellInside + ( + points, + minimumSurfaceDistanceCoeffSqr_ + *sqr + ( + cvMesh_.cellShapeControls().cellSize(points) + ) + ); + + forAll(insidePoints, i) + { + if (insidePoints[i]) + { + const point& p(points[i]); + + initialPoints.append(Vb::Point(p.x(), p.y(), p.z())); + } + } + } + } + + return initialPoints.shrink(); +} + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace Foam + +// ************************************************************************* // diff --git a/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/initialPointsMethod/bodyCentredCubic/bodyCentredCubic.H b/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/initialPointsMethod/bodyCentredCubic/bodyCentredCubic.H new file mode 100644 index 0000000000000000000000000000000000000000..f75fa599d39e64a6a76f725e8378036f2bf17608 --- /dev/null +++ b/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/initialPointsMethod/bodyCentredCubic/bodyCentredCubic.H @@ -0,0 +1,104 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2012 OpenFOAM Foundation + \\/ M anipulation | +------------------------------------------------------------------------------- +License + This file is part of OpenFOAM. + + OpenFOAM is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + OpenFOAM is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>. + +Class + Foam::bodyCentredCubic + +Description + Generate a BCC lattice of points inside the surfaces to be + conformed to of the conformalVoronoiMesh + +SourceFiles + bodyCentredCubic.C + +\*---------------------------------------------------------------------------*/ + +#ifndef bodyCentredCubic_H +#define bodyCentredCubic_H + +#include "initialPointsMethod.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ + +/*---------------------------------------------------------------------------*\ + Class bodyCentredCubic Declaration +\*---------------------------------------------------------------------------*/ + +class bodyCentredCubic +: + public initialPointsMethod +{ + +private: + + // Private data + + //- The initial cell spacing + scalar initialCellSize_; + + //- Should the initial positions be randomised + Switch randomiseInitialGrid_; + + //- Randomise the initial positions by fraction of the initialCellSize_ + scalar randomPerturbationCoeff_; + + +public: + + //- Runtime type information + TypeName("bodyCentredCubic"); + + // Constructors + + //- Construct from components + bodyCentredCubic + ( + const dictionary& initialPointsDict, + const conformalVoronoiMesh& cvMesh + ); + + + //- Destructor + virtual ~bodyCentredCubic() + {} + + + // Member Functions + + //- Return the initial points for the conformalVoronoiMesh + virtual List<Vb::Point> initialPoints() const; +}; + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace Foam + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#endif + +// ************************************************************************* // diff --git a/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/initialPointsMethod/faceCentredCubic/faceCentredCubic.C b/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/initialPointsMethod/faceCentredCubic/faceCentredCubic.C new file mode 100644 index 0000000000000000000000000000000000000000..af2e7dfbf4d833d0e76585bc8c322bad152aa3a9 --- /dev/null +++ b/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/initialPointsMethod/faceCentredCubic/faceCentredCubic.C @@ -0,0 +1,255 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2012 OpenFOAM Foundation + \\/ M anipulation | +------------------------------------------------------------------------------- +License + This file is part of OpenFOAM. + + OpenFOAM is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + OpenFOAM is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>. + +\*---------------------------------------------------------------------------*/ + +#include "faceCentredCubic.H" +#include "addToRunTimeSelectionTable.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ + +// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * // + +defineTypeNameAndDebug(faceCentredCubic, 0); +addToRunTimeSelectionTable(initialPointsMethod, faceCentredCubic, dictionary); + +// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // + +faceCentredCubic::faceCentredCubic +( + const dictionary& initialPointsDict, + const conformalVoronoiMesh& cvMesh +) +: + initialPointsMethod(typeName, initialPointsDict, cvMesh), + initialCellSize_(readScalar(detailsDict().lookup("initialCellSize"))), + randomiseInitialGrid_(detailsDict().lookup("randomiseInitialGrid")), + randomPerturbationCoeff_ + ( + readScalar(detailsDict().lookup("randomPerturbationCoeff")) + ) +{} + + +// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // + +List<Vb::Point> faceCentredCubic::initialPoints() const +{ + boundBox bb; + + // Pick up the bounds of this processor, or the whole geometry, depending + // on whether this is a parallel run. + if (Pstream::parRun()) + { + bb = cvMesh_.decomposition().procBounds(); + } + else + { + bb = cvMesh_.geometryToConformTo().globalBounds(); + } + + scalar x0 = bb.min().x(); + scalar xR = bb.max().x() - x0; + label ni = label(xR/initialCellSize_); + + scalar y0 = bb.min().y(); + scalar yR = bb.max().y() - y0; + label nj = label(yR/initialCellSize_); + + scalar z0 = bb.min().z(); + scalar zR = bb.max().z() - z0; + label nk = label(zR/initialCellSize_); + + vector delta(xR/ni, yR/nj, zR/nk); + + delta *= pow((1.0/4.0),-(1.0/3.0)); + + Random& rndGen = cvMesh_.rndGen(); + + scalar pert = randomPerturbationCoeff_*cmptMin(delta); + + DynamicList<Vb::Point> initialPoints(ni*nj*nk/10); + + for (label i = 0; i < ni; i++) + { + for (label j = 0; j < nj; j++) + { + // Generating, testing and adding points one line at a time to + // reduce the memory requirement for cases with bounding boxes that + // are very large in comparison to the volume to be filled + + label pI = 0; + + pointField points(4*nk); + + for (label k = 0; k < nk; k++) + { + point p + ( + x0 + i*delta.x(), + y0 + j*delta.y(), + z0 + k*delta.z() + ); + + if (randomiseInitialGrid_) + { + p.x() += pert*(rndGen.scalar01() - 0.5); + p.y() += pert*(rndGen.scalar01() - 0.5); + p.z() += pert*(rndGen.scalar01() - 0.5); + } + + if (Pstream::parRun()) + { + if (cvMesh_.decomposition().positionOnThisProcessor(p)) + { + // Add this point in parallel only if this position is + // on this processor. + points[pI++] = p; + } + } + else + { + points[pI++] = p; + } + + p = point + ( + x0 + i*delta.x(), + y0 + (j + 0.5)*delta.y(), + z0 + (k + 0.5)*delta.z() + ); + + if (randomiseInitialGrid_) + { + p.x() += pert*(rndGen.scalar01() - 0.5); + p.y() += pert*(rndGen.scalar01() - 0.5); + p.z() += pert*(rndGen.scalar01() - 0.5); + } + + if (Pstream::parRun()) + { + if (cvMesh_.decomposition().positionOnThisProcessor(p)) + { + // Add this point in parallel only if this position is + // on this processor. + points[pI++] = p; + } + } + else + { + points[pI++] = p; + } + + p = point + ( + x0 + (i + 0.5)*delta.x(), + y0 + j*delta.y(), + z0 + (k + 0.5)*delta.z() + ); + + if (randomiseInitialGrid_) + { + p.x() += pert*(rndGen.scalar01() - 0.5); + p.y() += pert*(rndGen.scalar01() - 0.5); + p.z() += pert*(rndGen.scalar01() - 0.5); + } + + if (Pstream::parRun()) + { + if (cvMesh_.decomposition().positionOnThisProcessor(p)) + { + // Add this point in parallel only if this position is + // on this processor. + points[pI++] = p; + } + } + else + { + points[pI++] = p; + } + + p = point + ( + x0 + (i + 0.5)*delta.x(), + y0 + (j + 0.5)*delta.y(), + z0 + k*delta.z() + ); + + if (randomiseInitialGrid_) + { + p.x() += pert*(rndGen.scalar01() - 0.5); + p.y() += pert*(rndGen.scalar01() - 0.5); + p.z() += pert*(rndGen.scalar01() - 0.5); + } + + if (Pstream::parRun()) + { + if (cvMesh_.decomposition().positionOnThisProcessor(p)) + { + // Add this point in parallel only if this position is + // on this processor. + points[pI++] = p; + } + } + else + { + points[pI++] = p; + } + } + + points.setSize(pI); + + Field<bool> insidePoints = cvMesh_.geometryToConformTo().wellInside + ( + points, + minimumSurfaceDistanceCoeffSqr_ + *sqr + ( + cvMesh_.cellShapeControls().cellSize(points) + ) + ); + + forAll(insidePoints, i) + { + if (insidePoints[i]) + { + const point& p(points[i]); + + initialPoints.append(Vb::Point(p.x(), p.y(), p.z())); + } + } + } + } + + return initialPoints.shrink(); +} + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace Foam + +// ************************************************************************* // diff --git a/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/initialPointsMethod/faceCentredCubic/faceCentredCubic.H b/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/initialPointsMethod/faceCentredCubic/faceCentredCubic.H new file mode 100644 index 0000000000000000000000000000000000000000..3444b386c37fd6540a2083c93d25b7af26a3432f --- /dev/null +++ b/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/initialPointsMethod/faceCentredCubic/faceCentredCubic.H @@ -0,0 +1,104 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2012 OpenFOAM Foundation + \\/ M anipulation | +------------------------------------------------------------------------------- +License + This file is part of OpenFOAM. + + OpenFOAM is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + OpenFOAM is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>. + +Class + Foam::faceCentredCubic + +Description + Generate an FCC lattice of points inside the surfaces to be + conformed to of the conformalVoronoiMesh + +SourceFiles + faceCentredCubic.C + +\*---------------------------------------------------------------------------*/ + +#ifndef faceCentredCubic_H +#define faceCentredCubic_H + +#include "initialPointsMethod.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ + +/*---------------------------------------------------------------------------*\ + Class faceCentredCubic Declaration +\*---------------------------------------------------------------------------*/ + +class faceCentredCubic +: + public initialPointsMethod +{ + +private: + + // Private data + + //- The initial cell spacing + scalar initialCellSize_; + + //- Should the initial positions be randomised + Switch randomiseInitialGrid_; + + //- Randomise the initial positions by fraction of the initialCellSize_ + scalar randomPerturbationCoeff_; + + +public: + + //- Runtime type information + TypeName("faceCentredCubic"); + + // Constructors + + //- Construct from components + faceCentredCubic + ( + const dictionary& initialPointsDict, + const conformalVoronoiMesh& cvMesh + ); + + + //- Destructor + virtual ~faceCentredCubic() + {} + + + // Member Functions + + //- Return the initial points for the conformalVoronoiMesh + virtual List<Vb::Point> initialPoints() const; +}; + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace Foam + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#endif + +// ************************************************************************* // diff --git a/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/initialPointsMethod/initialPointsMethod/initialPointsMethod.C b/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/initialPointsMethod/initialPointsMethod/initialPointsMethod.C new file mode 100644 index 0000000000000000000000000000000000000000..bd0e6d732f535e76d8596ab4fd100cbac673a742 --- /dev/null +++ b/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/initialPointsMethod/initialPointsMethod/initialPointsMethod.C @@ -0,0 +1,112 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2012 OpenFOAM Foundation + \\/ M anipulation | +------------------------------------------------------------------------------- +License + This file is part of OpenFOAM. + + OpenFOAM is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + OpenFOAM is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>. + +\*---------------------------------------------------------------------------*/ + +#include "initialPointsMethod.H" +#include "addToRunTimeSelectionTable.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +defineTypeNameAndDebug(initialPointsMethod, 0); +defineRunTimeSelectionTable(initialPointsMethod, dictionary); + + +// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // + +initialPointsMethod::initialPointsMethod +( + const word& type, + const dictionary& initialPointsDict, + const conformalVoronoiMesh& cvMesh +) +: + dictionary(initialPointsDict), + cvMesh_(cvMesh), + detailsDict_(subDict(type + "Coeffs")), + minimumSurfaceDistanceCoeffSqr_ + ( + sqr + ( + readScalar + ( + initialPointsDict.lookup("minimumSurfaceDistanceCoeff") + ) + ) + ) +{} + + +// * * * * * * * * * * * * * * * * * Selectors * * * * * * * * * * * * * * * // + +autoPtr<initialPointsMethod> initialPointsMethod::New +( + const dictionary& initialPointsDict, + const conformalVoronoiMesh& cvMesh +) +{ + word initialPointsMethodTypeName + ( + initialPointsDict.lookup("initialPointsMethod") + ); + + Info<< nl << "Selecting initialPointsMethod " + << initialPointsMethodTypeName << endl; + + dictionaryConstructorTable::iterator cstrIter = + dictionaryConstructorTablePtr_->find(initialPointsMethodTypeName); + + if (cstrIter == dictionaryConstructorTablePtr_->end()) + { + FatalErrorIn + ( + "initialPointsMethod::New(dictionary&, " + "const conformalVoronoiMesh&)" + ) << "Unknown initialPointsMethod type " + << initialPointsMethodTypeName + << endl << endl + << "Valid initialPointsMethod types are :" << endl + << dictionaryConstructorTablePtr_->toc() + << exit(FatalError); + } + + return autoPtr<initialPointsMethod>(cstrIter()(initialPointsDict, cvMesh)); +} + + +// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * // + +initialPointsMethod::~initialPointsMethod() +{} + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace Foam + +// ************************************************************************* // diff --git a/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/initialPointsMethod/initialPointsMethod/initialPointsMethod.H b/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/initialPointsMethod/initialPointsMethod/initialPointsMethod.H new file mode 100644 index 0000000000000000000000000000000000000000..8c8df91c92ebef5fadb10560459974d30de07ddf --- /dev/null +++ b/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/initialPointsMethod/initialPointsMethod/initialPointsMethod.H @@ -0,0 +1,154 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2012 OpenFOAM Foundation + \\/ M anipulation | +------------------------------------------------------------------------------- +License + This file is part of OpenFOAM. + + OpenFOAM is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + OpenFOAM is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>. + +Class + Foam::initialPointsMethod + +Description + Abstract base class for generating initial points for a conformalVoronoiMesh + +SourceFiles + initialPointsMethod.C + +\*---------------------------------------------------------------------------*/ + +#ifndef initialPointsMethod_H +#define initialPointsMethod_H + +#include "point.H" +#include "conformalVoronoiMesh.H" +#include "backgroundMeshDecomposition.H" +#include "dictionary.H" +#include "Random.H" +#include "Switch.H" +#include "autoPtr.H" +#include "runTimeSelectionTables.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ + +/*---------------------------------------------------------------------------*\ + Class initialPointsMethod Declaration +\*---------------------------------------------------------------------------*/ + +class initialPointsMethod +: + public dictionary +{ + +protected: + + // Protected data + + //- Reference to the conformalVoronoiMesh holding this object + const conformalVoronoiMesh& cvMesh_; + + //- Method details dictionary + dictionary detailsDict_; + + //- Only allow the placement of initial points that are within the + // surfaces to be meshed by minimumSurfaceDistanceCoeff multiplied by + // the local target cell size. Store square of value. + scalar minimumSurfaceDistanceCoeffSqr_; + +private: + + // Private Member Functions + + //- Disallow default bitwise copy construct + initialPointsMethod(const initialPointsMethod&); + + //- Disallow default bitwise assignment + void operator=(const initialPointsMethod&); + + +public: + + //- Runtime type information + TypeName("initialPointsMethod"); + + + // Declare run-time constructor selection table + + declareRunTimeSelectionTable + ( + autoPtr, + initialPointsMethod, + dictionary, + ( + const dictionary& initialPointsDict, + const conformalVoronoiMesh& cvMesh + ), + (initialPointsDict, cvMesh) + ); + + + // Constructors + + //- Construct from components + initialPointsMethod + ( + const word& type, + const dictionary& initialPointsDict, + const conformalVoronoiMesh& cvMesh + ); + + + // Selectors + + //- Return a reference to the selected initialPointsMethod + static autoPtr<initialPointsMethod> New + ( + const dictionary& initialPointsDict, + const conformalVoronoiMesh& cvMesh + ); + + + //- Destructor + virtual ~initialPointsMethod(); + + + // Member Functions + + //- Const access to the details dictionary + const dictionary& detailsDict() const + { + return detailsDict_; + } + + //- Return the initial points for the conformalVoronoiMesh + virtual List<Vb::Point> initialPoints() const = 0; +}; + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace Foam + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#endif + +// ************************************************************************* // diff --git a/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/initialPointsMethod/pointFile/pointFile.C b/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/initialPointsMethod/pointFile/pointFile.C new file mode 100644 index 0000000000000000000000000000000000000000..19861f3e817b26968eca7e463f5ab5e01dddfdda --- /dev/null +++ b/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/initialPointsMethod/pointFile/pointFile.C @@ -0,0 +1,174 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2012 OpenFOAM Foundation + \\/ M anipulation | +------------------------------------------------------------------------------- +License + This file is part of OpenFOAM. + + OpenFOAM is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + OpenFOAM is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>. + +\*---------------------------------------------------------------------------*/ + +#include "pointFile.H" +#include "addToRunTimeSelectionTable.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ + +// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * // + +defineTypeNameAndDebug(pointFile, 0); +addToRunTimeSelectionTable(initialPointsMethod, pointFile, dictionary); + +// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // + +pointFile::pointFile +( + const dictionary& initialPointsDict, + const conformalVoronoiMesh& cvMesh +) +: + initialPointsMethod(typeName, initialPointsDict, cvMesh), + pointFileName_(detailsDict().lookup("pointFile")) +{} + + +// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // + +List<Vb::Point> pointFile::initialPoints() const +{ + pointIOField points + ( + IOobject + ( + pointFileName_.name(), + cvMesh_.time().constant(), + cvMesh_.time(), + IOobject::MUST_READ, + IOobject::NO_WRITE + ) + ); + + Info<< " Inserting points from file " << pointFileName_ << endl; + + if (points.empty()) + { + FatalErrorIn("List<Vb::Point> pointFile::initialPoints() const") + << "Point file contain no points" + << exit(FatalError) << endl; + } + + if (Pstream::parRun()) + { + // Testing filePath to see if the file originated in a processor + // directory, if so, assume that the points in each processor file + // are unique. They are unlikely to belong on the current + // processor as the background mesh is unlikely to be the same. + + const bool isParentFile = (points.objectPath() != points.filePath()); + + if (!isParentFile) + { + cvMesh_.decomposition().distributePoints(points); + } + else + { + // Otherwise, this is assumed to be points covering the whole + // domain, so filter the points to be only those on this processor + boolList procPt(cvMesh_.positionOnThisProc(points)); + + List<boolList> allProcPt(Pstream::nProcs()); + + allProcPt[Pstream::myProcNo()] = procPt; + + Pstream::gatherList(allProcPt); + + Pstream::scatterList(allProcPt); + + forAll(procPt, ptI) + { + bool foundAlready = false; + + forAll(allProcPt, procI) + { + // If a processor with a lower index has found this point + // to insert already, defer to it and don't insert. + if (foundAlready) + { + allProcPt[procI][ptI] = false; + } + else if (allProcPt[procI][ptI]) + { + foundAlready = true; + } + } + } + + procPt = allProcPt[Pstream::myProcNo()]; + + inplaceSubset(procPt, points); + } + } + + Field<bool> insidePoints = cvMesh_.geometryToConformTo().wellInside + ( + points, + minimumSurfaceDistanceCoeffSqr_ + *sqr + ( + cvMesh_.cellShapeControls().cellSize(points) + ) + ); + + DynamicList<Vb::Point> initialPoints(insidePoints.size()/10); + + forAll(insidePoints, i) + { + if (insidePoints[i]) + { + const point& p(points[i]); + + initialPoints.append(Vb::Point(p.x(), p.y(), p.z())); + } + } + + initialPoints.shrink(); + + label nPointsRejected = points.size() - initialPoints.size(); + + if (Pstream::parRun()) + { + reduce(nPointsRejected, sumOp<label>()); + } + + if (nPointsRejected) + { + Info<< " " << nPointsRejected << " points rejected from " + << pointFileName_.name() << endl; + } + + return initialPoints; +} + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace Foam + +// ************************************************************************* // diff --git a/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/initialPointsMethod/pointFile/pointFile.H b/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/initialPointsMethod/pointFile/pointFile.H new file mode 100644 index 0000000000000000000000000000000000000000..bcb898bac67e7ce41449791694f34b77b9206ae3 --- /dev/null +++ b/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/initialPointsMethod/pointFile/pointFile.H @@ -0,0 +1,100 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2012 OpenFOAM Foundation + \\/ M anipulation | +------------------------------------------------------------------------------- +License + This file is part of OpenFOAM. + + OpenFOAM is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + OpenFOAM is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>. + +Class + Foam::pointFile + +Description + Inserts points at locations specified in a pointFile into the surfaces to + be conformed to of the conformalVoronoiMesh + +SourceFiles + pointFile.C + +\*---------------------------------------------------------------------------*/ + +#ifndef pointFile_H +#define pointFile_H + +#include "fileName.H" +#include "pointIOField.H" +#include "initialPointsMethod.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ + +/*---------------------------------------------------------------------------*\ + Class pointFile Declaration +\*---------------------------------------------------------------------------*/ + +class pointFile +: + public initialPointsMethod +{ + +private: + + // Private data + + //- The initial cell spacing + fileName pointFileName_; + + +public: + + //- Runtime type information + TypeName("pointFile"); + + // Constructors + + //- Construct from components + pointFile + ( + const dictionary& initialPointsDict, + const conformalVoronoiMesh& cvMesh + ); + + + //- Destructor + virtual ~pointFile() + {} + + + // Member Functions + + //- Return the initial points for the conformalVoronoiMesh + virtual List<Vb::Point> initialPoints() const; +}; + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace Foam + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#endif + +// ************************************************************************* // diff --git a/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/initialPointsMethod/uniformGrid/uniformGrid.C b/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/initialPointsMethod/uniformGrid/uniformGrid.C new file mode 100644 index 0000000000000000000000000000000000000000..2538c90702d18efb3548ead731d88ab57bacf1ae --- /dev/null +++ b/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/initialPointsMethod/uniformGrid/uniformGrid.C @@ -0,0 +1,171 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2012 OpenFOAM Foundation + \\/ M anipulation | +------------------------------------------------------------------------------- +License + This file is part of OpenFOAM. + + OpenFOAM is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + OpenFOAM is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>. + +\*---------------------------------------------------------------------------*/ + +#include "uniformGrid.H" +#include "addToRunTimeSelectionTable.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ + +// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * // + +defineTypeNameAndDebug(uniformGrid, 0); +addToRunTimeSelectionTable(initialPointsMethod, uniformGrid, dictionary); + +// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // + +uniformGrid::uniformGrid +( + const dictionary& initialPointsDict, + const conformalVoronoiMesh& cvMesh +) +: + initialPointsMethod(typeName, initialPointsDict, cvMesh), + initialCellSize_(readScalar(detailsDict().lookup("initialCellSize"))), + randomiseInitialGrid_(detailsDict().lookup("randomiseInitialGrid")), + randomPerturbationCoeff_ + ( + readScalar(detailsDict().lookup("randomPerturbationCoeff")) + ) +{} + + +// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // + +List<Vb::Point> uniformGrid::initialPoints() const +{ + boundBox bb; + + // Pick up the bounds of this processor, or the whole geometry, depending + // on whether this is a parallel run. + if (Pstream::parRun()) + { + bb = cvMesh_.decomposition().procBounds(); + } + else + { + bb = cvMesh_.geometryToConformTo().globalBounds(); + } + + scalar x0 = bb.min().x(); + scalar xR = bb.max().x() - x0; + label ni = label(xR/initialCellSize_); + + scalar y0 = bb.min().y(); + scalar yR = bb.max().y() - y0; + label nj = label(yR/initialCellSize_); + + scalar z0 = bb.min().z(); + scalar zR = bb.max().z() - z0; + label nk = label(zR/initialCellSize_); + + vector delta(xR/ni, yR/nj, zR/nk); + + delta *= pow((1.0),-(1.0/3.0)); + + Random& rndGen = cvMesh_.rndGen(); + + scalar pert = randomPerturbationCoeff_*cmptMin(delta); + + // Initialise points list + DynamicList<Vb::Point> initialPoints(ni*nj*nk/10); + + for (label i = 0; i < ni; i++) + { + for (label j = 0; j < nj; j++) + { + // Generating, testing and adding points one line at a time to + // reduce the memory requirement for cases with bounding boxes that + // are very large in comparison to the volume to be filled + + label pI = 0; + + pointField points(nk); + + for (label k = 0; k < nk; k++) + { + point p + ( + x0 + (i + 0.5)*delta.x(), + y0 + (j + 0.5)*delta.y(), + z0 + (k + 0.5)*delta.z() + ); + + if (randomiseInitialGrid_) + { + p.x() += pert*(rndGen.scalar01() - 0.5); + p.y() += pert*(rndGen.scalar01() - 0.5); + p.z() += pert*(rndGen.scalar01() - 0.5); + } + + if + ( + Pstream::parRun() + && !cvMesh_.decomposition().positionOnThisProcessor(p) + ) + { + // Skip this point if, in parallel, this position is not on + // this processor. + continue; + } + + points[pI++] = p; + } + + points.setSize(pI); + + Field<bool> insidePoints = cvMesh_.geometryToConformTo().wellInside + ( + points, + minimumSurfaceDistanceCoeffSqr_ + *sqr + ( + cvMesh_.cellShapeControls().cellSize(points) + ) + ); + + forAll(insidePoints, i) + { + if (insidePoints[i]) + { + const point& p(points[i]); + + initialPoints.append(Vb::Point(p.x(), p.y(), p.z())); + } + } + } + } + + return initialPoints.shrink(); +} + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace Foam + +// ************************************************************************* // diff --git a/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/initialPointsMethod/uniformGrid/uniformGrid.H b/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/initialPointsMethod/uniformGrid/uniformGrid.H new file mode 100644 index 0000000000000000000000000000000000000000..913d2a5a986043f09ba71b99a527114d6fe89681 --- /dev/null +++ b/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/initialPointsMethod/uniformGrid/uniformGrid.H @@ -0,0 +1,104 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2012 OpenFOAM Foundation + \\/ M anipulation | +------------------------------------------------------------------------------- +License + This file is part of OpenFOAM. + + OpenFOAM is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + OpenFOAM is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>. + +Class + Foam::uniformGrid + +Description + Generate a uniform grid of points inside the surfaces to be + conformed to of the conformalVoronoiMesh + +SourceFiles + uniformGrid.C + +\*---------------------------------------------------------------------------*/ + +#ifndef uniformGrid_H +#define uniformGrid_H + +#include "initialPointsMethod.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ + +/*---------------------------------------------------------------------------*\ + Class uniformGrid Declaration +\*---------------------------------------------------------------------------*/ + +class uniformGrid +: + public initialPointsMethod +{ + +private: + + // Private data + + //- The initial cell spacing + scalar initialCellSize_; + + //- Should the initial positions be randomised + Switch randomiseInitialGrid_; + + //- Randomise the initial positions by fraction of the initialCellSize_ + scalar randomPerturbationCoeff_; + + +public: + + //- Runtime type information + TypeName("uniformGrid"); + + // Constructors + + //- Construct from components + uniformGrid + ( + const dictionary& initialPointsDict, + const conformalVoronoiMesh& cvMesh + ); + + + //- Destructor + virtual ~uniformGrid() + {} + + + // Member Functions + + //- Return the initial points for the conformalVoronoiMesh + virtual List<Vb::Point> initialPoints() const; +}; + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace Foam + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#endif + +// ************************************************************************* // diff --git a/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/relaxationModel/adaptiveLinear/adaptiveLinear.C b/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/relaxationModel/adaptiveLinear/adaptiveLinear.C new file mode 100644 index 0000000000000000000000000000000000000000..3e33715cb5af7b71c12c4de7931df3691f722595 --- /dev/null +++ b/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/relaxationModel/adaptiveLinear/adaptiveLinear.C @@ -0,0 +1,87 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2012 OpenFOAM Foundation + \\/ M anipulation | +------------------------------------------------------------------------------- +License + This file is part of OpenFOAM. + + OpenFOAM is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + OpenFOAM is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>. + +\*---------------------------------------------------------------------------*/ + +#include "adaptiveLinear.H" +#include "addToRunTimeSelectionTable.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ + +// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * // + +defineTypeNameAndDebug(adaptiveLinear, 0); +addToRunTimeSelectionTable(relaxationModel, adaptiveLinear, dictionary); + +// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // + +adaptiveLinear::adaptiveLinear +( + const dictionary& relaxationDict, + const Time& runTime +) +: + relaxationModel(typeName, relaxationDict, runTime), + relaxationStart_(readScalar(coeffDict().lookup("relaxationStart"))), + relaxationEnd_(readScalar(coeffDict().lookup("relaxationEnd"))), + lastTimeValue_(runTime_.time().timeOutputValue()), + relaxation_(relaxationStart_) +{} + + +// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // + +scalar adaptiveLinear::relaxation() +{ + if (runTime_.time().timeOutputValue() > lastTimeValue_) + { + scalar currentRelaxation = relaxation_; + + relaxation_ -= + (relaxation_ - relaxationEnd_) + /( + ( + runTime_.time().endTime().value() + - runTime_.time().timeOutputValue() + ) + /(runTime_.time().timeOutputValue() - lastTimeValue_) + + 1 + ); + + lastTimeValue_ = runTime_.time().timeOutputValue(); + + return currentRelaxation; + } + + return relaxation_; +} + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace Foam + +// ************************************************************************* // diff --git a/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/relaxationModel/adaptiveLinear/adaptiveLinear.H b/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/relaxationModel/adaptiveLinear/adaptiveLinear.H new file mode 100644 index 0000000000000000000000000000000000000000..02aa61256a5823f13e12c03f474102d60d41cf0c --- /dev/null +++ b/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/relaxationModel/adaptiveLinear/adaptiveLinear.H @@ -0,0 +1,110 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2012 OpenFOAM Foundation + \\/ M anipulation | +------------------------------------------------------------------------------- +License + This file is part of OpenFOAM. + + OpenFOAM is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + OpenFOAM is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>. + +Class + Foam::adaptiveLinear + +Description + Produces a linear ramp which adapts its gradient to changes in + endTime and deltaT to always arrive at the relaxationEnd value at the end of + the run + +SourceFiles + adaptiveLinear.C + +\*---------------------------------------------------------------------------*/ + +#ifndef adaptiveLinear_H +#define adaptiveLinear_H + +#include "relaxationModel.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ + +/*---------------------------------------------------------------------------*\ + Class adaptiveLinear Declaration +\*---------------------------------------------------------------------------*/ + +class adaptiveLinear +: + public relaxationModel +{ + +private: + + // Private data + + //- Relaxation coefficient at the start of the iteration sequence. + scalar relaxationStart_; + + //- Relaxation coefficient at the end of the iteration sequence. + scalar relaxationEnd_; + + //- Store the time when the last request was made for relaxation, + // prevents multiple calls to relaxation in a timestep from + // incrementing the value + scalar lastTimeValue_; + + //- Current relaxation value + scalar relaxation_; + + +public: + + //- Runtime type information + TypeName("adaptiveLinear"); + + // Constructors + + //- Construct from components + adaptiveLinear + ( + const dictionary& relaxationDict, + const Time& runTime + ); + + + //- Destructor + virtual ~adaptiveLinear() + {} + + + // Member Functions + + //- Return the current relaxation coefficient + virtual scalar relaxation(); +}; + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace Foam + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#endif + +// ************************************************************************* // diff --git a/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/relaxationModel/rampHoldFall/rampHoldFall.C b/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/relaxationModel/rampHoldFall/rampHoldFall.C new file mode 100644 index 0000000000000000000000000000000000000000..be9b2537b3931f92eb039d34bf86218396f24bc3 --- /dev/null +++ b/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/relaxationModel/rampHoldFall/rampHoldFall.C @@ -0,0 +1,103 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2012 OpenFOAM Foundation + \\/ M anipulation | +------------------------------------------------------------------------------- +License + This file is part of OpenFOAM. + + OpenFOAM is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + OpenFOAM is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>. + +\*---------------------------------------------------------------------------*/ + +#include "rampHoldFall.H" +#include "addToRunTimeSelectionTable.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ + +// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * // + +defineTypeNameAndDebug(rampHoldFall, 0); +addToRunTimeSelectionTable(relaxationModel, rampHoldFall, dictionary); + +// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // + +rampHoldFall::rampHoldFall +( + const dictionary& relaxationDict, + const Time& runTime +) +: + relaxationModel(typeName, relaxationDict, runTime), + rampStartRelaxation_(readScalar(coeffDict().lookup("rampStartRelaxation"))), + holdRelaxation_(readScalar(coeffDict().lookup("holdRelaxation"))), + fallEndRelaxation_(readScalar(coeffDict().lookup("fallEndRelaxation"))), + rampEndFraction_(readScalar(coeffDict().lookup("rampEndFraction"))), + fallStartFraction_(readScalar(coeffDict().lookup("fallStartFraction"))), + rampGradient_((holdRelaxation_ - rampStartRelaxation_)/(rampEndFraction_)), + fallGradient_ + ( + (fallEndRelaxation_ - holdRelaxation_)/(1 - fallStartFraction_) + ) +{} + + +// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // + +scalar rampHoldFall::relaxation() +{ + scalar t = runTime_.time().timeOutputValue(); + + scalar tStart = runTime_.time().startTime().value(); + scalar tEnd = runTime_.time().endTime().value(); + scalar tSpan = tEnd - tStart; + + if (tSpan < VSMALL) + { + return rampStartRelaxation_; + } + + if (t - tStart < rampEndFraction_*tSpan) + { + // Ramp + + return rampGradient_*((t - tStart)/tSpan) + rampStartRelaxation_; + } + else if (t - tStart > fallStartFraction_*tSpan) + { + // Fall + + return + fallGradient_*((t - tStart)/tSpan) + + fallEndRelaxation_ - fallGradient_; + } + else + { + //Hold + + return holdRelaxation_; + } +} + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace Foam + +// ************************************************************************* // diff --git a/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/relaxationModel/rampHoldFall/rampHoldFall.H b/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/relaxationModel/rampHoldFall/rampHoldFall.H new file mode 100644 index 0000000000000000000000000000000000000000..3c156c197119228cd2b028372fb3efe51ea69998 --- /dev/null +++ b/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/relaxationModel/rampHoldFall/rampHoldFall.H @@ -0,0 +1,115 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2012 OpenFOAM Foundation + \\/ M anipulation | +------------------------------------------------------------------------------- +License + This file is part of OpenFOAM. + + OpenFOAM is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + OpenFOAM is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>. + +Class + Foam::rampHoldFall + +Description + Piecewise linear function with a ramp from a start value to a plateaux + value, holding at this, then a linear fall to an end value. + +SourceFiles + rampHoldFall.C + +\*---------------------------------------------------------------------------*/ + +#ifndef rampHoldFall_H +#define rampHoldFall_H + +#include "relaxationModel.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ + +/*---------------------------------------------------------------------------*\ + Class rampHoldFall Declaration +\*---------------------------------------------------------------------------*/ + +class rampHoldFall +: + public relaxationModel +{ + +private: + + // Private data + + //- Relaxation coefficient at the start of the ramp + scalar rampStartRelaxation_; + + //- Relaxation coefficient for the hold portion + scalar holdRelaxation_; + + //- Relaxation coefficient at the end of the fall + scalar fallEndRelaxation_; + + //- Fraction through the run where the ramp ends and the hold starts + scalar rampEndFraction_; + + //- Fraction through the run where the hold ends and the fall starts + scalar fallStartFraction_; + + //- Gradient in ramp portion, normalised against time + scalar rampGradient_; + + //- Gradient in fall portion, normalised against time + scalar fallGradient_; + +public: + + //- Runtime type information + TypeName("rampHoldFall"); + + // Constructors + + //- Construct from components + rampHoldFall + ( + const dictionary& relaxationDict, + const Time& runTime + ); + + + //- Destructor + virtual ~rampHoldFall() + {} + + + // Member Functions + + //- Return the current relaxation coefficient + virtual scalar relaxation(); +}; + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace Foam + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#endif + +// ************************************************************************* // diff --git a/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/relaxationModel/relaxationModel/relaxationModel.C b/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/relaxationModel/relaxationModel/relaxationModel.C new file mode 100644 index 0000000000000000000000000000000000000000..76493390554c71640e85b5e4b4f8701a759bae49 --- /dev/null +++ b/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/relaxationModel/relaxationModel/relaxationModel.C @@ -0,0 +1,102 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2012 OpenFOAM Foundation + \\/ M anipulation | +------------------------------------------------------------------------------- +License + This file is part of OpenFOAM. + + OpenFOAM is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + OpenFOAM is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>. + +\*---------------------------------------------------------------------------*/ + +#include "relaxationModel.H" +#include "addToRunTimeSelectionTable.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +defineTypeNameAndDebug(relaxationModel, 0); +defineRunTimeSelectionTable(relaxationModel, dictionary); + + +// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // + +relaxationModel::relaxationModel +( + const word& type, + const dictionary& relaxationDict, + const Time& runTime +) +: + dictionary(relaxationDict), + runTime_(runTime), + coeffDict_(subDict(type + "Coeffs")) +{} + + +// * * * * * * * * * * * * * * * * * Selectors * * * * * * * * * * * * * * * // + +autoPtr<relaxationModel> relaxationModel::New +( + const dictionary& relaxationDict, + const Time& runTime +) +{ + word relaxationModelTypeName + ( + relaxationDict.lookup("relaxationModel") + ); + + Info<< nl << "Selecting relaxationModel " + << relaxationModelTypeName << endl; + + dictionaryConstructorTable::iterator cstrIter = + dictionaryConstructorTablePtr_->find(relaxationModelTypeName); + + if (cstrIter == dictionaryConstructorTablePtr_->end()) + { + FatalErrorIn + ( + "relaxationModel::New(const dictionary&, " + "const conformalVoronoiMesh&)" + ) << "Unknown relaxationModel type " + << relaxationModelTypeName + << endl << endl + << "Valid relaxationModel types are :" << endl + << dictionaryConstructorTablePtr_->toc() + << exit(FatalError); + } + + return autoPtr<relaxationModel>(cstrIter()(relaxationDict, runTime)); +} + + +// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * // + +relaxationModel::~relaxationModel() +{} + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace Foam + +// ************************************************************************* // diff --git a/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/relaxationModel/relaxationModel/relaxationModel.H b/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/relaxationModel/relaxationModel/relaxationModel.H new file mode 100644 index 0000000000000000000000000000000000000000..433a5d38e1f6fb1070159631a1719b0210f33046 --- /dev/null +++ b/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/relaxationModel/relaxationModel/relaxationModel.H @@ -0,0 +1,147 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2012 OpenFOAM Foundation + \\/ M anipulation | +------------------------------------------------------------------------------- +License + This file is part of OpenFOAM. + + OpenFOAM is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + OpenFOAM is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>. + +Class + Foam::relaxationModel + +Description + Abstract base class for providing relaxation values to the cell motion + controller + +SourceFiles + relaxationModel.C + +\*---------------------------------------------------------------------------*/ + +#ifndef relaxationModel_H +#define relaxationModel_H + +#include "point.H" +#include "Time.H" +#include "dictionary.H" +#include "autoPtr.H" +#include "runTimeSelectionTables.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ + +/*---------------------------------------------------------------------------*\ + Class relaxationModel Declaration +\*---------------------------------------------------------------------------*/ + +class relaxationModel +: + public dictionary +{ + +protected: + + // Protected data + + //- Reference to the conformalVoronoiMesh holding this cvControls object + const Time& runTime_; + + //- Method coeffs dictionary + dictionary coeffDict_; + +private: + + // Private Member Functions + + //- Disallow default bitwise copy construct + relaxationModel(const relaxationModel&); + + //- Disallow default bitwise assignment + void operator=(const relaxationModel&); + + +public: + + //- Runtime type information + TypeName("relaxationModel"); + + + // Declare run-time constructor selection table + + declareRunTimeSelectionTable + ( + autoPtr, + relaxationModel, + dictionary, + ( + const dictionary& relaxationDict, + const Time& runTime + ), + (relaxationDict, runTime) + ); + + + // Constructors + + //- Construct from components + relaxationModel + ( + const word& type, + const dictionary& relaxationDict, + const Time& runTime + ); + + + // Selectors + + //- Return a reference to the selected relaxationModel + static autoPtr<relaxationModel> New + ( + const dictionary& relaxationDict, + const Time& runTime + ); + + + //- Destructor + virtual ~relaxationModel(); + + + // Member Functions + + //- Const access to the coeffs dictionary + const dictionary& coeffDict() const + { + return coeffDict_; + } + + //- Return the current relaxation coefficient + virtual scalar relaxation() = 0; +}; + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace Foam + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#endif + +// ************************************************************************* // diff --git a/applications/utilities/mesh/generation/cvMesh/cvMesh.C b/applications/utilities/mesh/generation/cvMesh/cvMesh.C new file mode 100644 index 0000000000000000000000000000000000000000..e9487b909b8bafca164f8aa01d8ee6f299bd26dd --- /dev/null +++ b/applications/utilities/mesh/generation/cvMesh/cvMesh.C @@ -0,0 +1,124 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2011-2012 OpenFOAM Foundation + \\/ M anipulation | +------------------------------------------------------------------------------- +License + This file is part of OpenFOAM. + + OpenFOAM is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + OpenFOAM is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>. + +Application + cvMesh + +Description + Conformal Voronoi automatic mesh generator + +\*---------------------------------------------------------------------------*/ + +#include "argList.H" +#include "conformalVoronoiMesh.H" +#include "vtkSetWriter.H" + +using namespace Foam; + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +int main(int argc, char *argv[]) +{ + Foam::argList::addBoolOption + ( + "checkGeometry", + "check all surface geometry for quality" + ); + + #include "setRootCase.H" + #include "createTime.H" + + runTime.functionObjects().off(); + + const bool checkGeometry = args.optionFound("checkGeometry"); + + IOdictionary cvMeshDict + ( + IOobject + ( + "cvMeshDict", + runTime.system(), + runTime, + IOobject::MUST_READ_IF_MODIFIED, + IOobject::NO_WRITE + ) + ); + + + if (checkGeometry) + { + const searchableSurfaces allGeometry + ( + IOobject + ( + "cvSearchableSurfaces", + runTime.constant(), + "triSurface", + runTime, + IOobject::MUST_READ, + IOobject::NO_WRITE + ), + cvMeshDict.subDict("geometry") + ); + + // Write some stats + allGeometry.writeStats(List<wordList>(0), Info); + // Check topology + allGeometry.checkTopology(true); + // Check geometry + allGeometry.checkGeometry + ( + 100.0, // max size ratio + 1e-9, // intersection tolerance + autoPtr<writer<scalar> >(new vtkSetWriter<scalar>()), + 0.01, // min triangle quality + true + ); + + return 0; + } + + + conformalVoronoiMesh::debug = true; + + conformalVoronoiMesh mesh(runTime, cvMeshDict); + + + while (runTime.loop()) + { + Info<< nl << "Time = " << runTime.timeName() << endl; + + mesh.move(); + + Info<< nl << "ExecutionTime = " << runTime.elapsedCpuTime() << " s" + << " ClockTime = " << runTime.elapsedClockTime() << " s" + << endl; + } + + Info<< nl << "End" << nl << endl; + + return 0; +} + + +// ************************************************************************* // diff --git a/applications/utilities/mesh/generation/cvMesh/cvMeshBackgroundMesh/Make/files b/applications/utilities/mesh/generation/cvMesh/cvMeshBackgroundMesh/Make/files new file mode 100644 index 0000000000000000000000000000000000000000..58406b931afc7b1b1b72a8c3eb68587d2c2d210d --- /dev/null +++ b/applications/utilities/mesh/generation/cvMesh/cvMeshBackgroundMesh/Make/files @@ -0,0 +1,3 @@ +cvMeshBackgroundMesh.C + +EXE = $(FOAM_APPBIN)/cvMeshBackgroundMesh diff --git a/applications/utilities/mesh/generation/cvMesh/cvMeshBackgroundMesh/Make/options b/applications/utilities/mesh/generation/cvMesh/cvMeshBackgroundMesh/Make/options new file mode 100644 index 0000000000000000000000000000000000000000..0322435c8c9c6d6512c5e3ec2e0a91e08199d84f --- /dev/null +++ b/applications/utilities/mesh/generation/cvMesh/cvMeshBackgroundMesh/Make/options @@ -0,0 +1,33 @@ +EXE_DEBUG = -DFULLDEBUG -g -O0 +EXE_FROUNDING_MATH = -frounding-math +EXE_NDEBUG = -DNDEBUG + +include $(GENERAL_RULES)/CGAL + +EXE_INC = \ + ${EXE_FROUNDING_MATH} \ + ${EXE_NDEBUG} \ + ${CGAL_INC} \ + -I../conformalVoronoiMesh/lnInclude \ + -I$(LIB_SRC)/parallel/decompose/decompositionMethods/lnInclude \ + -I$(LIB_SRC)/edgeMesh/lnInclude \ + -I$(LIB_SRC)/triSurface/lnInclude \ + -I$(LIB_SRC)/finiteVolume/lnInclude \ + -I$(LIB_SRC)/meshTools/lnInclude \ + -I$(LIB_SRC)/dynamicMesh/lnInclude \ + -I../vectorTools + +EXE_LIBS = \ + $(CGAL_LIBS) \ + -lboost_thread \ + -lmpfr \ + -lgmp \ + -lconformalVoronoiMesh \ + -ldecompositionMethods /* -L$(FOAM_LIBBIN)/dummy -lscotchDecomp */ \ + -ledgeMesh \ + -ltriSurface \ + -lmeshTools \ + -lfileFormats \ + -lsampling \ + -ldynamicMesh \ + -lfiniteVolume diff --git a/applications/utilities/mesh/generation/cvMesh/cvMeshBackgroundMesh/cvMeshBackgroundMesh.C b/applications/utilities/mesh/generation/cvMesh/cvMeshBackgroundMesh/cvMeshBackgroundMesh.C new file mode 100644 index 0000000000000000000000000000000000000000..53766c59a02c2209f86ae725362b7a24eb8edeb5 --- /dev/null +++ b/applications/utilities/mesh/generation/cvMesh/cvMeshBackgroundMesh/cvMeshBackgroundMesh.C @@ -0,0 +1,775 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2012 OpenFOAM Foundation + \\/ M anipulation | +------------------------------------------------------------------------------- +License + This file is part of OpenFOAM. + + OpenFOAM is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + OpenFOAM is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>. + +Application + cvMeshBackGroundMesh + +Description + Writes out background mesh as constructed by cvMesh and constructs + distanceSurface. + +\*---------------------------------------------------------------------------*/ + +#include "PatchTools.H" +#include "argList.H" +#include "Time.H" +#include "triSurface.H" +#include "searchableSurfaces.H" +#include "conformationSurfaces.H" +#include "cellShapeControl.H" +#include "backgroundMeshDecomposition.H" +#include "cellShape.H" +#include "cellModeller.H" +#include "DynamicField.H" +#include "isoSurfaceCell.H" +#include "vtkSurfaceWriter.H" +#include "syncTools.H" + +using namespace Foam; + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +// Tolerance (as fraction of the bounding box). Needs to be fairly lax since +// usually meshes get written with limited precision (6 digits) +static const scalar defaultMergeTol = 1e-6; + +// Get merging distance when matching face centres +scalar getMergeDistance +( + const argList& args, + const Time& runTime, + const boundBox& bb +) +{ + scalar mergeTol = defaultMergeTol; + args.optionReadIfPresent("mergeTol", mergeTol); + + scalar writeTol = + Foam::pow(scalar(10.0), -scalar(IOstream::defaultPrecision())); + + Info<< "Merge tolerance : " << mergeTol << nl + << "Write tolerance : " << writeTol << endl; + + if (runTime.writeFormat() == IOstream::ASCII && mergeTol < writeTol) + { + FatalErrorIn("getMergeDistance") + << "Your current settings specify ASCII writing with " + << IOstream::defaultPrecision() << " digits precision." << endl + << "Your merging tolerance (" << mergeTol << ") is finer than this." + << endl + << "Please change your writeFormat to binary" + << " or increase the writePrecision" << endl + << "or adjust the merge tolerance (-mergeTol)." + << exit(FatalError); + } + + scalar mergeDist = mergeTol * bb.mag(); + + Info<< "Overall meshes bounding box : " << bb << nl + << "Relative tolerance : " << mergeTol << nl + << "Absolute matching distance : " << mergeDist << nl + << endl; + + return mergeDist; +} + + +void printMeshData(const polyMesh& mesh) +{ + // Collect all data on master + + globalIndex globalCells(mesh.nCells()); + labelListList patchNeiProcNo(Pstream::nProcs()); + labelListList patchSize(Pstream::nProcs()); + const labelList& pPatches = mesh.globalData().processorPatches(); + patchNeiProcNo[Pstream::myProcNo()].setSize(pPatches.size()); + patchSize[Pstream::myProcNo()].setSize(pPatches.size()); + forAll(pPatches, i) + { + const processorPolyPatch& ppp = refCast<const processorPolyPatch> + ( + mesh.boundaryMesh()[pPatches[i]] + ); + patchNeiProcNo[Pstream::myProcNo()][i] = ppp.neighbProcNo(); + patchSize[Pstream::myProcNo()][i] = ppp.size(); + } + Pstream::gatherList(patchNeiProcNo); + Pstream::gatherList(patchSize); + + + // Print stats + + globalIndex globalBoundaryFaces(mesh.nFaces()-mesh.nInternalFaces()); + + label maxProcCells = 0; + label totProcFaces = 0; + label maxProcPatches = 0; + label totProcPatches = 0; + label maxProcFaces = 0; + + for (label procI = 0; procI < Pstream::nProcs(); procI++) + { + Info<< endl + << "Processor " << procI << nl + << " Number of cells = " << globalCells.localSize(procI) + << endl; + + label nProcFaces = 0; + + const labelList& nei = patchNeiProcNo[procI]; + + forAll(patchNeiProcNo[procI], i) + { + Info<< " Number of faces shared with processor " + << patchNeiProcNo[procI][i] << " = " << patchSize[procI][i] + << endl; + + nProcFaces += patchSize[procI][i]; + } + + Info<< " Number of processor patches = " << nei.size() << nl + << " Number of processor faces = " << nProcFaces << nl + << " Number of boundary faces = " + << globalBoundaryFaces.localSize(procI) << endl; + + maxProcCells = max(maxProcCells, globalCells.localSize(procI)); + totProcFaces += nProcFaces; + totProcPatches += nei.size(); + maxProcPatches = max(maxProcPatches, nei.size()); + maxProcFaces = max(maxProcFaces, nProcFaces); + } + + // Stats + + scalar avgProcCells = scalar(globalCells.size())/Pstream::nProcs(); + scalar avgProcPatches = scalar(totProcPatches)/Pstream::nProcs(); + scalar avgProcFaces = scalar(totProcFaces)/Pstream::nProcs(); + + // In case of all faces on one processor. Just to avoid division by 0. + if (totProcPatches == 0) + { + avgProcPatches = 1; + } + if (totProcFaces == 0) + { + avgProcFaces = 1; + } + + Info<< nl + << "Number of processor faces = " << totProcFaces/2 << nl + << "Max number of cells = " << maxProcCells + << " (" << 100.0*(maxProcCells-avgProcCells)/avgProcCells + << "% above average " << avgProcCells << ")" << nl + << "Max number of processor patches = " << maxProcPatches + << " (" << 100.0*(maxProcPatches-avgProcPatches)/avgProcPatches + << "% above average " << avgProcPatches << ")" << nl + << "Max number of faces between processors = " << maxProcFaces + << " (" << 100.0*(maxProcFaces-avgProcFaces)/avgProcFaces + << "% above average " << avgProcFaces << ")" << nl + << endl; +} + + +// Return cellID +label cellLabel +( + const Vector<label>& nCells, + const label i, + const label j, + const label k +) +{ + return i*nCells[1]*nCells[2]+j*nCells[2]+k; +} + +label vtxLabel +( + const Vector<label>& nCells, + const label i, + const label j, + const label k +) +{ + Vector<label> nPoints + ( + nCells[0]+1, + nCells[1]+1, + nCells[2]+1 + ); + return i*nPoints[1]*nPoints[2]+j*nPoints[2]+k; +} + + +autoPtr<polyMesh> generateHexMesh +( + const IOobject& io, + const point& origin, + const vector& cellSize, + const Vector<label>& nCells +) +{ + pointField points; + if (nCells[0]+nCells[1]+nCells[2] > 0) + { + points.setSize((nCells[0]+1)*(nCells[1]+1)*(nCells[2]+1)); + + // Generate points + for (label i = 0; i <= nCells[0]; i++) + { + for (label j = 0; j <= nCells[1]; j++) + { + for (label k = 0; k <= nCells[2]; k++) + { + point pt = origin; + pt.x() += i*cellSize[0]; + pt.y() += j*cellSize[1]; + pt.z() += k*cellSize[2]; + points[vtxLabel(nCells, i, j, k)] = pt; + } + } + } + } + + + const cellModel& hex = *(cellModeller::lookup("hex")); + cellShapeList cellShapes(nCells[0]*nCells[1]*nCells[2]); + + labelList hexPoints(8); + label cellI = 0; + for (label i = 0; i < nCells[0]; i++) + { + for (label j = 0; j < nCells[1]; j++) + { + for (label k = 0; k < nCells[2]; k++) + { + hexPoints[0] = vtxLabel(nCells, i, j, k); + hexPoints[1] = vtxLabel(nCells, i+1, j, k); + hexPoints[2] = vtxLabel(nCells, i+1, j+1, k); + hexPoints[3] = vtxLabel(nCells, i, j+1, k); + hexPoints[4] = vtxLabel(nCells, i, j, k+1); + hexPoints[5] = vtxLabel(nCells, i+1, j, k+1); + hexPoints[6] = vtxLabel(nCells, i+1, j+1, k+1); + hexPoints[7] = vtxLabel(nCells, i, j+1, k+1); + cellShapes[cellI++] = cellShape(hex, hexPoints); + } + } + } + + faceListList boundary(0); + wordList patchNames(0); + wordList patchTypes(0); + word defaultFacesName = "defaultFaces"; + word defaultFacesType = polyPatch::typeName; + wordList patchPhysicalTypes(0); + + return autoPtr<polyMesh> + ( + new polyMesh + ( + io, + xferMoveTo<pointField>(points), + cellShapes, + boundary, + patchNames, + patchTypes, + defaultFacesName, + defaultFacesType, + patchPhysicalTypes + ) + ); +} + + +// Determine for every point a signed distance to the nearest surface +// (outside is positive) +tmp<scalarField> signedDistance +( + const scalarField& distSqr, + const pointField& points, + const searchableSurfaces& geometry, + const labelList& surfaces +) +{ + tmp<scalarField> tfld(new scalarField(points.size(), Foam::sqr(GREAT))); + scalarField& fld = tfld(); + + // Find nearest + List<pointIndexHit> nearest; + labelList nearestSurfaces; + searchableSurfacesQueries::findNearest + ( + geometry, + surfaces, + points, + scalarField(points.size(), Foam::sqr(GREAT)),//distSqr + nearestSurfaces, + nearest + ); + + // Determine sign of nearest. Sort by surface to do this. + DynamicField<point> surfPoints(points.size()); + DynamicList<label> surfIndices(points.size()); + + forAll(surfaces, surfI) + { + // Extract points on this surface + surfPoints.clear(); + surfIndices.clear(); + forAll(nearestSurfaces, i) + { + if (nearestSurfaces[i] == surfI) + { + surfPoints.append(points[i]); + surfIndices.append(i); + } + } + + // Calculate sideness of these surface points + label geomI = surfaces[surfI]; + List<searchableSurface::volumeType> volType; + geometry[geomI].getVolumeType(surfPoints, volType); + + // Push back to original + forAll(volType, i) + { + label pointI = surfIndices[i]; + scalar dist = mag(points[pointI] - nearest[pointI].hitPoint()); + + searchableSurface::volumeType vT = volType[i]; + + if (vT == searchableSurface::OUTSIDE) + { + fld[pointI] = dist; + } + else if (vT == searchableSurface::INSIDE) + { + fld[i] = -dist; + } + else + { + FatalErrorIn("signedDistance()") + << "getVolumeType failure, neither INSIDE or OUTSIDE" + << exit(FatalError); + } + } + } + + return tfld; +} + + + +// Main program: + +int main(int argc, char *argv[]) +{ + argList::addNote + ( + "Generate cvMesh-consistent representation of surfaces" + ); + argList::addBoolOption + ( + "writeMesh", + "write the resulting mesh and distance fields" + ); + argList::addOption + ( + "mergeTol", + "scalar", + "specify the merge distance relative to the bounding box size " + "(default 1e-6)" + ); + + #include "setRootCase.H" + #include "createTime.H" + runTime.functionObjects().off(); + + const bool writeMesh = args.optionFound("writeMesh"); + + if (writeMesh) + { + Info<< "Writing resulting mesh and cellDistance, pointDistance fields." + << nl << endl; + } + + + IOdictionary cvMeshDict + ( + IOobject + ( + "cvMeshDict", + runTime.system(), + runTime, + IOobject::MUST_READ_IF_MODIFIED, + IOobject::NO_WRITE + ) + ); + + // Define/load all geometry + searchableSurfaces allGeometry + ( + IOobject + ( + "cvSearchableSurfaces", + runTime.constant(), + "triSurface", + runTime, + IOobject::MUST_READ, + IOobject::NO_WRITE + ), + cvMeshDict.subDict("geometry") + ); + + Random rndGen(64293*Pstream::myProcNo()); + + conformationSurfaces geometryToConformTo + ( + runTime, + rndGen, + allGeometry, + cvMeshDict.subDict("surfaceConformation") + ); + + autoPtr<cellShapeControl> cellShapeControls + ( + cellShapeControl::New + ( + runTime, + cvMeshDict.subDict("motionControl"), + allGeometry, + geometryToConformTo + ) + ); + + + // Generate starting block mesh + vector cellSize; + { + const treeBoundBox& bb = geometryToConformTo.globalBounds(); + + // Determine the number of cells in each direction. + const vector span = bb.span(); + vector nScalarCells = span/cellShapeControls().defaultCellSize(); + + // Calculate initial cell size to be a little bit smaller than the + // defaultCellSize to avoid initial refinement triggering. + Vector<label> nCells = Vector<label> + ( + label(nScalarCells.x())+2, + label(nScalarCells.y())+2, + label(nScalarCells.z())+2 + ); + cellSize = vector + ( + span[0]/nCells[0], + span[1]/nCells[1], + span[2]/nCells[2] + ); + + Info<< "Generating initial hex mesh with" << nl + << " bounding box : " << bb << nl + << " nCells : " << nCells << nl + << " cellSize : " << cellSize << nl + << endl; + + autoPtr<polyMesh> meshPtr + ( + generateHexMesh + ( + IOobject + ( + polyMesh::defaultRegion, + runTime.constant(), + runTime + ), + bb.min(), + cellSize, + ( + Pstream::master() + ? nCells + : Vector<label>(0, 0, 0) + ) + ) + ); + Info<< "Writing initial hex mesh to " << meshPtr().instance() << nl + << endl; + meshPtr().write(); + } + + // Distribute the initial mesh + if (Pstream::parRun()) + { +# include "createMesh.H" + Info<< "Loaded mesh:" << endl; + printMeshData(mesh); + + // Allocate a decomposer + IOdictionary decompositionDict + ( + IOobject + ( + "decomposeParDict", + runTime.system(), + mesh, + IOobject::MUST_READ_IF_MODIFIED, + IOobject::NO_WRITE + ) + ); + + autoPtr<decompositionMethod> decomposer + ( + decompositionMethod::New + ( + decompositionDict + ) + ); + + labelList decomp = decomposer().decompose(mesh, mesh.cellCentres()); + + // Global matching tolerance + const scalar tolDim = getMergeDistance + ( + args, + runTime, + mesh.bounds() + ); + + // Mesh distribution engine + fvMeshDistribute distributor(mesh, tolDim); + + Info<< "Wanted distribution:" + << distributor.countCells(decomp) << nl << endl; + + // Do actual sending/receiving of mesh + autoPtr<mapDistributePolyMesh> map = distributor.distribute(decomp); + + // Print some statistics + //Info<< "After distribution:" << endl; + //printMeshData(mesh); + + mesh.setInstance(runTime.constant()); + Info<< "Writing redistributed mesh" << nl << endl; + mesh.write(); + } + + + Info<< "Refining backgroud mesh according to cell size specification" << nl + << endl; + + backgroundMeshDecomposition backgroundMesh + ( + 1.0, //spanScale,ratio of poly cell size v.s. hex cell size + 0.0, //minCellSizeLimit + 0, //minLevels + 4, //volRes, check multiple points per cell + 20.0, //maxCellWeightCoeff + runTime, + geometryToConformTo, + cellShapeControls(), + rndGen, + cvMeshDict + ); + + if (writeMesh) + { + runTime++; + Info<< "Writing mesh to " << runTime.timeName() << endl; + backgroundMesh.mesh().write(); + } + + const scalar tolDim = getMergeDistance + ( + args, + runTime, + backgroundMesh.mesh().bounds() + ); + + + faceList isoFaces; + pointField isoPoints; + + { + // Apply a distanceSurface to it. + const fvMesh& fvm = backgroundMesh.mesh(); + + volScalarField cellDistance + ( + IOobject + ( + "cellDistance", + fvm.time().timeName(), + fvm.time(), + IOobject::NO_READ, + IOobject::NO_WRITE, + false + ), + fvm, + dimensionedScalar("zero", dimLength, 0) + ); + + const searchableSurfaces& geometry = geometryToConformTo.geometry(); + const labelList& surfaces = geometryToConformTo.surfaces(); + + + // Get maximum search size per cell + scalarField distSqr(cellDistance.size()); + + const labelList& cellLevel = backgroundMesh.cellLevel(); + forAll(cellLevel, cellI) + { + // The largest edge of the cell will always be less than the + // span of the bounding box of the cell. + distSqr[cellI] = magSqr(cellSize)/pow(2, cellLevel[cellI]); + } + + { + // Internal field + cellDistance.internalField() = signedDistance + ( + distSqr, + fvm.C(), + geometry, + surfaces + ); + // Patch fields + forAll(fvm.C().boundaryField(), patchI) + { + const pointField& cc = fvm.C().boundaryField()[patchI]; + fvPatchScalarField& fld = cellDistance.boundaryField()[patchI]; + scalarField patchDistSqr + ( + fld.patch().patchInternalField(distSqr) + ); + fld = signedDistance(patchDistSqr, cc, geometry, surfaces); + } + + // On processor patches the fvm.C() will already be the cell centre + // on the opposite side so no need to swap cellDistance. + + if (writeMesh) + { + cellDistance.write(); + } + } + + + // Distance to points + pointScalarField pointDistance + ( + IOobject + ( + "pointDistance", + fvm.time().timeName(), + fvm.time(), + IOobject::NO_READ, + IOobject::NO_WRITE, + false + ), + pointMesh::New(fvm), + dimensionedScalar("zero", dimLength, 0) + ); + { + scalarField pointDistSqr(fvm.nPoints(), -sqr(GREAT)); + for (label faceI = 0; faceI < fvm.nInternalFaces(); faceI++) + { + label own = fvm.faceOwner()[faceI]; + label ownDistSqr = distSqr[own]; + + const face& f = fvm.faces()[faceI]; + forAll(f, fp) + { + pointDistSqr[f[fp]] = max(pointDistSqr[f[fp]], ownDistSqr); + } + } + syncTools::syncPointList + ( + fvm, + pointDistSqr, + maxEqOp<scalar>(), + -sqr(GREAT) // null value + ); + + pointDistance.internalField() = signedDistance + ( + pointDistSqr, + fvm.points(), + geometry, + surfaces + ); + + if (writeMesh) + { + pointDistance.write(); + } + } + + isoSurfaceCell iso + ( + fvm, + cellDistance, + pointDistance, + 0, //distance, + false //regularise + ); + + isoFaces.setSize(iso.size()); + forAll(isoFaces, i) + { + isoFaces[i] = iso[i].triFaceFace(); + } + isoPoints = iso.points(); + } + + + pointField mergedPoints; + faceList mergedFaces; + labelList pointMergeMap; + PatchTools::gatherAndMerge + ( + tolDim, + primitivePatch + ( + SubList<face>(isoFaces, isoFaces.size()), + isoPoints + ), + mergedPoints, + mergedFaces, + pointMergeMap + ); + + vtkSurfaceWriter writer; + writer.write + ( + runTime.path(), + "iso", + mergedPoints, + mergedFaces + ); + + Info<< "End\n" << endl; + + return 0; +} + + +// ************************************************************************* // diff --git a/applications/utilities/mesh/generation/cvMesh/cvMeshDict b/applications/utilities/mesh/generation/cvMesh/cvMeshDict new file mode 100644 index 0000000000000000000000000000000000000000..2c71c50e56e9acdc75727b7e98c3ffd13b823613 --- /dev/null +++ b/applications/utilities/mesh/generation/cvMesh/cvMeshDict @@ -0,0 +1,533 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: dev | +| \\ / A nd | Web: www.OpenFOAM.org | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ + +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + object cvMeshDict; +} + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + + +/* + +Control dictionary for cvMesh - polyhedral mesh generator. + +cvMesh phases: +1. fill volume with initial points (initialPoints subdictionary). An option + is to reread from previous set of points. + +2. internal point motion (motionControl subdictionary) + +3. every once in a while add point duplets/triplets to conform to + surfaces and features (surfaceConformation subdictionary) + +4. back to 2 + +5. construct polyMesh. + - filter (polyMeshFiltering subdictionary) + - check (meshQualityControls subdictionary) and undo filtering + + +See also cvControls.H in the conformalVoronoiMesh library + +*/ + + +// Important: +// ---------- +// Any scalar with a name <name>Coeff specifies a value that will be implemented +// as a faction of the local target cell size +// Any scalar with a name <name>Size specifies an absolute size. + + +// Geometry. Definition of all surfaces. All surfaces are of class +// searchableSurface. +// Surfaces need to be (almost) closed - use closedTriSurfaceMesh +// if they are not topologically closed. Surfaces need to be oriented so +// the space to be meshed is always on the inside of all surfaces. Use e.g. +// surfaceOrient. +geometry +{ + // Surface to conform to + flange.obj + { + type triSurfaceMesh; + } + + // Surface used for cell size control + ref7.stl + { + name ref7; + type triSurfaceMesh; + } + + // Surface used for cell size control + tunnel_APPROACH_INLET.obj + { + type triSurfaceMesh; + } +} + + +// Controls for conforming to the surfaces. +surfaceConformation +{ + // A point inside surfaces that is inside mesh. + locationInMesh (0 0 0); + + // How far apart are point-duplets generated. Balance this between + // - very low distance: little chance of interference from other + // surfaces + // - largish distance: less non-orthogonality in final cell + // (circumcentre far away from centroid) + pointPairDistanceCoeff 0.1; + + // Mixed feature points - connected to both inside and outside edges. + // Recreated by inserting triplets of points to recreate a single edge. + // Done for all edges emanating from point. triplets of points get inserted + // mixedFeaturePointPPDistanceCoeff distance away from feature point. + // Set to a negative number to disable. + mixedFeaturePointPPDistanceCoeff 5.0; //-1; + + // Distance to a feature point within which surface and edge + // conformation points are excluded - fraction of the local target + // cell size + featurePointExclusionDistanceCoeff 0.4; + + // Distance to an existing feature edge conformation location + // within which other edge conformation location are excluded - + // fraction of the local target cell size + featureEdgeExclusionDistanceCoeff 0.2; + + // Optimisation: do not check for surface intersection (of dual edges) + // for points near to surface. + surfaceSearchDistanceCoeff 2.5; + + // Maximum allowable protrusion through the surface before + // conformation points are added - fraction of the local target + // cell size. These small protusions are (hopefully) done by mesh filtering + // instead. + maxSurfaceProtrusionCoeff 0.1; + + // If feature edge with large angle (so more than 125 degrees) introduce + // additional points to create two half angled cells (= mitering). + maxQuadAngle 125; + + // Frequency to redo surface conformation (expensive). + surfaceConformationRebuildFrequency 10; + + // Initial and intermediate controls + coarseConformationControls + { + // Initial conformation + initial + { + // We've got a point poking through the surface. Don't do any + // surface conformation if near feature edge (since feature edge + // conformation should have priority) + + // distance to search for near feature edges + edgeSearchDistCoeff 1.1; + + // Proximity to a feature edge where a surface hit is + // not created, only the edge conformation is created + // - fraction of the local target cell size. Coarse + // conformation, initial protrusion tests. + surfacePtReplaceDistCoeff 0.5; + } + + // Same for iterations + iteration + { + edgeSearchDistCoeff 1.25; + surfacePtReplaceDistCoeff 0.7; + } + + // Stop either at maxIterations or if the number of surface pokes + // is very small (iterationToInitialHitRatioLimit * initial number) + // Note: perhaps iterationToInitialHitRatioLimit should be absolute + // count? + maxIterations 15; + + iterationToInitialHitRatioLimit 0.001; + } + + // Final (at endTime) controls + fineConformationControls + { + initial + { + edgeSearchDistCoeff 1.1; + surfacePtReplaceDistCoeff 0.5; + } + + iteration + { + edgeSearchDistCoeff 1.25; + surfacePtReplaceDistCoeff 0.7; + } + + maxIterations 15; + + iterationToInitialHitRatioLimit 0.001; + } + + // Geometry to mesh to + geometryToConformTo + { + flange.obj + { + featureMethod extendedFeatureEdgeMesh; // or none; + extendedFeatureEdgeMesh "flange.extendedFeatureEdgeMesh"; + } + } + + // Additional features. + additionalFeatures + { + //line + //{ + // featureMethod extendedFeatureEdgeMesh; // or none; + // extendedFeatureEdgeMesh "line.extendedFeatureEdgeMesh"; + //} + } +} + + +// Controls for seeding initial points and general control of the target +// cell size (used everywhere) +initialPoints +{ + // Do not place point closer than minimumSurfaceDistanceCoeff + // to the surface. Is fraction of local target cell size (see below) + minimumSurfaceDistanceCoeff 0.55; + + initialPointsMethod autoDensity; + // initialPointsMethod uniformGrid; + // initialPointsMethod bodyCentredCubic; + // initialPointsMethod pointFile; + + + // Take boundbox of all geometry. Sample with this box. If too much + // samples in box (due to target cell size) split box. + autoDensityDetails + { + // Initial number of refinement levels. Needs to be enough to pick + // up features due to size ratio. If not enough it will take longer + // to determine point seeding. + minLevels 4; + // Split box if ratio of min to max cell size larger than maxSizeRatio + maxSizeRatio 5.0; + // Per box sample 5x5x5 internally + sampleResolution 5; + // Additionally per face of the box sample 5x5 + surfaceSampleResolution 5; + } + + uniformGridDetails + { + // Absolute cell size. + initialCellSize 0.0015; + randomiseInitialGrid yes; + randomPerturbationCoeff 0.02; + } + + bodyCentredCubicDetails + { + initialCellSize 0.0015; + randomiseInitialGrid no; + randomPerturbationCoeff 0.1; + } + + pointFileDetails + { + // Reads points from file. Still rejects points that are too + // close to the surface (minimumSurfaceDistanceCoeff) or on the + // wrong side of the surfaces. + pointFile "constant/internalDelaunayVertices"; + } +} + + +// Control size of voronoi cells i.e. distance between points. This +// determines the target cell size which is used everywhere. +// It determines the cell size given a location. It then uses all +// the rules +// - defaultCellSize +// - cellShapeControl +// to determine target cell size. Rule with highest priority wins. If same +// priority smallest cell size wins. +motionControl +{ + // Absolute cell size of back ground mesh. This is the maximum cell size. + defaultCellSize 0.00075; + + // Absolute cell size of back ground mesh. This is the minimum cell size. + minimumCellSize 0; + + //cellShapeControl constantControl; + //cellShapeControl fileControl; + cellShapeControl surfaceControl; + + // Provide constant values for cell size and alignment + constantControlCoeffs + { + cellSize 0.00075; + cellAlignment (1 0 0 0 1 0 0 0 1); + } + + // Read in the points of the background grid used for cell shape control + // from a file, with corresponding files for alignment and size + fileControlCoeffs + { + pointFile ""; + sizesFile ""; + alignmentsFile ""; + } + + // Calculate the sizes and alignments from surfaces + surfaceControlCoeffs + { + ref7_outside + { + // optional name of geometry + surface ref7; + priority 1; + mode outside;//inside/bothSides + cellSizeFunction linearDistance; + + // cellSizeFunctions: + // uniform : uniform size + // uniformDistance : fixed size for all within distance + // linearSpatial : grading in specified direction only + // linearDistance : vary linearly as distance to surface + // surfaceOffsetLinearDistance : constant close to surface then + // fade like linearDistance + + // Vary from surfaceCellSize (close to the surface) to + // distanceCellSize (further than 'distance') + linearDistanceCoeffs + { + surfaceCellSize 1e-5; // absolute size + distanceCellSize $defaultCellSize; + distance 1.0; + } + } + + tunnel_APPROACH_INLET.obj + { + priority 1; + mode bothSides; + cellSizeFunction surfaceOffsetLinearDistance; + // Constant within a certain distance then linear fade away. + // Good for layers. + surfaceOffsetLinearDistanceCoeffs + { + surfaceCellSize 1e-5; + distanceCellSize $defaultCellSize; + surfaceOffset 0.1; + totalDistance 1.0; + } + } + } + + // Provide an aspect ratio and the direction in which it acts on the mesh. + // Default is 1.0 if this section is not present in the dictionary + cellAspectRatioControl + { + // Aspect ratio. + aspectRatio 2.0; + // Direction of action of the aspect ratio + aspectRatioDirection (1 0 0); + } + + // Underrelaxation for point motion. Simulated annealing: starts off at 1 + // and lowers to 0 (at simulation endTime) to converge points. + // adaptiveLinear is preferred choice. + // Points move by e.g. 10% of tet size. + relaxationModel adaptiveLinear; //rampHoldFall + + adaptiveLinearCoeffs + { + relaxationStart 1.0; + relaxationEnd 0.0; + } + + // Output lots and lots of .obj files + objOutput no; + + // Timing and memory usage. + timeChecks yes; + + // Number of rays in plane parallel to nearest surface. Used to detect + // next closest surfaces. Used to work out alignment (three vectors) + // to surface. + // Note that only the initial points (from the seeding) calculate this + // information so if these are not fine enough the alignment will + // not be correct. (any points added during the running will lookup + // this information from the nearest initial point since it is + // expensive) + alignmentSearchSpokes 36; + + // For each delaunay edge (between two vertices, becomes + // the Voronoi face normal) snap to the alignment direction if within + // alignmentAcceptanceAngle. Slightly > 45 is a good choice - prevents + // flipping. + alignmentAcceptanceAngle 48; + + // How often to rebuild the alignment info (expensive) + sizeAndAlignmentRebuildFrequency 20; + + // When to insert points. Not advisable change to + // these settings. + pointInsertionCriteria + { + // If edge larger than 1.75 target cell size + // (so tets too large/stretched) insert point + cellCentreDistCoeff 1.75; + // Do not insert point if voronoi face (on edge) very small. + faceAreaRatioCoeff 0.0025; + // Insert point only if edge closely aligned to local alignment + // direction. + acceptanceAngle 21.5; + } + + // Opposite: remove point if mesh too compressed. Do not change these + // settings. + pointRemovalCriteria + { + cellCentreDistCoeff 0.65; + } + + // How to determine the point motion. All edges got some direction. + // Sum all edge contributions to determine point motion. Weigh by + // face area so motion is preferentially determined by large faces + // (or more importantly ignore contribution from small faces). + // Do not change these settings. + faceAreaWeightModel piecewiseLinearRamp; + + piecewiseLinearRampCoeffs + { + lowerAreaFraction 0.5; + upperAreaFraction 1.0; + } +} + + +// After simulation, when converting to polyMesh, filter out small faces/edges. +// Do not change. See cvControls.H +polyMeshFiltering +{ + // Filter small edges + filterEdges on; + + // Filter small and sliver faces + filterFaces off; + + // Write the underlying Delaunay tet mesh at output time + writeTetDualMesh false; //true; + + // Upper limit on the size of faces to be filtered. + // fraction of the local target cell size + filterSizeCoeff 0.2; + + // Upper limit on how close two dual vertices can be before + // being merged, fraction of the local target cell size + mergeClosenessCoeff 1e-9; + + // To not filter: set maxNonOrtho to 1 (so check fails) and then + // set continueFilteringOnBadInitialPolyMesh to false. + continueFilteringOnBadInitialPolyMesh true; + + // When a face is "bad", what fraction should the filterSizeCoeff be + // reduced by. Recursive, so for a filterCount value of fC, the + // filterSizeCoeff is reduced by pow(filterErrorReductionCoeff, fC) + filterErrorReductionCoeff 0.5; + + // Maximum number of filterCount applications before a face + // is not attempted to be filtered + filterCountSkipThreshold 4; + + // Maximum number of permissible iterations of the face collapse + // algorithm. The value to choose will be related the maximum number + // of points on a face that is to be collapsed and how many faces + // around it need to be collapsed. + maxCollapseIterations 25; + + // Maximum number of times an to allow an equal faceSet to be + // returned from the face quality assessment before stopping iterations + // to break an infinitie loop. + maxConsecutiveEqualFaceSets 5; + // Remove little steps (almost perp to surface) by collapsing face. + surfaceStepFaceAngle 80; + // Do not collapse face to edge if should become edges + edgeCollapseGuardFraction 0.3; + // Only collapse face to point if high aspect ratio + maxCollapseFaceToPointSideLengthCoeff 0.35; +} + + +// Generic mesh quality settings. At any undoable phase these determine +// where to undo. Same as in snappyHexMeshDict +meshQualityControls +{ + //- Maximum non-orthogonality allowed. Set to 180 to disable. + maxNonOrtho 65; + + //- Max skewness allowed. Set to <0 to disable. + maxBoundarySkewness 50; + maxInternalSkewness 10; + + //- Max concaveness allowed. Is angle (in degrees) below which concavity + // is allowed. 0 is straight face, <0 would be convex face. + // Set to 180 to disable. + maxConcave 80; + + //- Minimum pyramid volume. Is absolute volume of cell pyramid. + // Set to a sensible fraction of the smallest cell volume expected. + // Set to very negative number (e.g. -1E30) to disable. + minVol -1E30; + + //- Minimum quality of the tet formed by the + // variable base point minimum decomposition triangles and + // the cell centre (so not face-centre decomposition). + // This has to be a positive number for tracking + // to work. Set to very negative number (e.g. -1E30) to + // disable. + // <0 = inside out tet, + // 0 = flat tet + // 1 = regular tet + minTetQuality 1e-30; + + //- Minimum absolute face area. Set to <0 to disable. + minArea -1; + + //- Minimum face twist. Set to <-1 to disable. dot product of face normal + //- and face centre triangles normal + minTwist 0.02; + + //- minimum normalised cell determinant + //- 1 = hex, <= 0 = folded or flattened illegal cell + minDeterminant 0.001; + + //- minFaceWeight (0 -> 0.5) + minFaceWeight 0.02; + + //- minVolRatio (0 -> 1) + minVolRatio 0.01; + + //must be >0 for Fluent compatibility + minTriangleTwist -1; +} + + +// ************************************************************************* // diff --git a/applications/utilities/mesh/generation/cvMesh/cvMeshSurfaceSimplify/Allwmake b/applications/utilities/mesh/generation/cvMesh/cvMeshSurfaceSimplify/Allwmake new file mode 100755 index 0000000000000000000000000000000000000000..98dec66c76bfc035c39136cff18ad685c707128c --- /dev/null +++ b/applications/utilities/mesh/generation/cvMesh/cvMeshSurfaceSimplify/Allwmake @@ -0,0 +1,10 @@ +#!/bin/sh +cd ${0%/*} || exit 1 # run from this directory +set -x + +if [ -d "${FASTDUALOCTREE_SRC_PATH}" ] +then + wmake +fi + +# ----------------------------------------------------------------- end-of-file diff --git a/applications/utilities/mesh/generation/cvMesh/cvMeshSurfaceSimplify/Make/files b/applications/utilities/mesh/generation/cvMesh/cvMeshSurfaceSimplify/Make/files new file mode 100644 index 0000000000000000000000000000000000000000..fbe4cfeda6cc8bd7e41dd0bc3e34eb92108cfce8 --- /dev/null +++ b/applications/utilities/mesh/generation/cvMesh/cvMeshSurfaceSimplify/Make/files @@ -0,0 +1,22 @@ +/* +cvMeshSurfaceSimplify_non_octree.C +MarchingCubes/MarchingCubes.cpp +MarchingCubes/ply.c +*/ + +/* +MarchingCubes = fastdualoctree_sgp + +$(MarchingCubes)/data_access.cpp +$(MarchingCubes)/fparser.cpp +$(MarchingCubes)/fpoptimizer.cpp +$(MarchingCubes)/MarchingCubes.cpp +$(MarchingCubes)/mc_draw.cpp +$(MarchingCubes)/morton.cpp +$(MarchingCubes)/opt_octree.cpp +$(MarchingCubes)/hash_octree.cpp +*/ + +cvMeshSurfaceSimplify.C + +EXE = $(FOAM_APPBIN)/cvMeshSurfaceSimplify diff --git a/applications/utilities/mesh/generation/cvMesh/cvMeshSurfaceSimplify/Make/options b/applications/utilities/mesh/generation/cvMesh/cvMeshSurfaceSimplify/Make/options new file mode 100644 index 0000000000000000000000000000000000000000..7bd92a24abf566234ee02a26c3615c10151286a1 --- /dev/null +++ b/applications/utilities/mesh/generation/cvMesh/cvMeshSurfaceSimplify/Make/options @@ -0,0 +1,28 @@ +MarchingCubes = fastdualoctree_sgp + +include $(GENERAL_RULES)/CGAL + +EXE_INC = \ + -DUNIX \ + -Wno-old-style-cast \ + /* -IMarchingCubes */ \ + -I$(FASTDUALOCTREE_SRC_PATH) \ + -I../conformalVoronoiMesh/lnInclude \ + -I$(LIB_SRC)/edgeMesh/lnInclude \ + -I$(LIB_SRC)/fileFormats/lnInclude \ + -I$(LIB_SRC)/triSurface/lnInclude \ + -I$(LIB_SRC)/meshTools/lnInclude + +EXE_LIBS = \ + $(CGAL_LIBS) \ + -lboost_thread \ + -lmpfr \ + -L$(FASTDUALOCTREE_SRC_PATH) -lperf_main \ + -lGL \ + -lconformalVoronoiMesh \ + -ldecompositionMethods -L$(FOAM_LIBBIN)/dummy -lscotchDecomp \ + -ledgeMesh \ + -lfileFormats \ + -ltriSurface \ + -lmeshTools \ + -ldynamicMesh diff --git a/applications/utilities/mesh/generation/cvMesh/cvMeshSurfaceSimplify/cvMeshSurfaceSimplify.C b/applications/utilities/mesh/generation/cvMesh/cvMeshSurfaceSimplify/cvMeshSurfaceSimplify.C new file mode 100644 index 0000000000000000000000000000000000000000..ae4f8812f7d7faaeac4abf525aa5262083993d80 --- /dev/null +++ b/applications/utilities/mesh/generation/cvMesh/cvMeshSurfaceSimplify/cvMeshSurfaceSimplify.C @@ -0,0 +1,639 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2012 OpenFOAM Foundation + \\/ M anipulation | +------------------------------------------------------------------------------- +License + This file is part of OpenFOAM. + + OpenFOAM is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + OpenFOAM is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>. + +Application + cvMeshSurfaceSimplify + +Description + Simplifies surfaces by resampling. + + Uses Thomas Lewiner's topology preserving MarchingCubes. + (http://zeus.mat.puc-rio.br/tomlew/tomlew_uk.php) + +\*---------------------------------------------------------------------------*/ + +#include "argList.H" +#include "Time.H" +#include "searchableSurfaces.H" +#include "conformationSurfaces.H" +#include "triSurfaceMesh.H" + +#include "opt_octree.h" +#include "cube.h" + +using namespace Foam; + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +class pointConversion +{ + const vector scale_; + + const vector offset_; + +public: + + //- Construct from components + pointConversion + ( + const vector scale, + const vector offset + ) + : + scale_(scale), + offset_(offset) + {} + + inline Point toLocal(const Foam::point& pt) const + { + Foam::point p = cmptMultiply(scale_, (pt + offset_)); + return Point(p.x(), p.y(), p.z()); + } + + inline Foam::point toGlobal(const Point& pt) const + { + point p(pt.x(), pt.y(), pt.z()); + return cmptDivide(p, scale_) - offset_; + } +}; + + + + +// For use in Fast-Dual Octree from Thomas Lewiner +class distanceCalc +: + public ::data_access +{ + + const Level min_level_; + + const conformationSurfaces& geometryToConformTo_; + + const pointConversion& converter_; + + + // Private Member Functions + + scalar signedDistance(const Foam::point& pt) const + { + const searchableSurfaces& geometry = geometryToConformTo_.geometry(); + const labelList& surfaces = geometryToConformTo_.surfaces(); + + static labelList nearestSurfaces; + static scalarField distance; + + static pointField samples(1); + samples[0] = pt; + + searchableSurfacesQueries::signedDistance + ( + geometry, + surfaces, + samples, + scalarField(1, GREAT), + searchableSurface::OUTSIDE, + nearestSurfaces, + distance + ); + + return distance[0]; + } + + +public: + + // Constructors + + //- Construct from components + distanceCalc + ( + Level max_level_, + real iso_val_, + Level min_level, + const conformationSurfaces& geometryToConformTo, + const pointConversion& converter + ) + : + data_access(max_level_,iso_val_), + min_level_(min_level), + geometryToConformTo_(geometryToConformTo), + converter_(converter) + {} + + + //- Destructor + virtual ~distanceCalc() + {} + + + // Member Functions + + //- test function + virtual bool need_refine( const Cube &c ) + { + int l = c.lv() ; + + if( l >= _max_level ) return false; + if( l < min_level_ ) return true; + + treeBoundBox bb + ( + converter_.toGlobal + ( + Point + ( + c.xmin(), + c.ymin(), + c.zmin() + ) + ), + converter_.toGlobal + ( + Point + ( + c.xmax(), + c.ymax(), + c.zmax() + ) + ) + ); + + const searchableSurfaces& geometry = + geometryToConformTo_.geometry(); + const labelList& surfaces = + geometryToConformTo_.surfaces(); + + + //- Uniform refinement around surface + { + forAll(surfaces, i) + { + if (geometry[surfaces[i]].overlaps(bb)) + { + return true; + } + } + return false; + } + + + ////- Surface intersects bb (but not using intersection test) + //scalar ccDist = signedDistance(bb.midpoint()); + //scalar ccVal = ccDist - _iso_val; + //if (mag(ccVal) < SMALL) + //{ + // return true; + //} + //const pointField points(bb.points()); + //forAll(points, pointI) + //{ + // scalar pointVal = signedDistance(points[pointI]) - _iso_val; + // if (ccVal*pointVal < 0) + // { + // return true; + // } + //} + //return false; + + + ////- Refinement based on intersection with multiple planes. + //// Does not work well - too high a ratio between + //// neighbouring cubes. + //const pointField points(bb.points()); + //const edgeList& edges = treeBoundBox::edges; + //pointField start(edges.size()); + //pointField end(edges.size()); + //forAll(edges, i) + //{ + // start[i] = points[edges[i][0]]; + // end[i] = points[edges[i][1]]; + //} + //Foam::List<Foam::List<pointIndexHit> > hitInfo; + //labelListList hitSurfaces; + //searchableSurfacesQueries::findAllIntersections + //( + // geometry, + // surfaces, + // start, + // end, + // hitSurfaces, + // hitInfo + //); + // + //// Count number of intersections + //label nInt = 0; + //forAll(hitSurfaces, edgeI) + //{ + // nInt += hitSurfaces[edgeI].size(); + //} + // + //if (nInt == 0) + //{ + // // No surface intersected. See if there is one inside + // forAll(surfaces, i) + // { + // if (geometry[surfaces[i]].overlaps(bb)) + // { + // return true; + // } + // } + // return false; + //} + // + //// Check multiple surfaces + //label baseSurfI = -1; + //forAll(hitSurfaces, edgeI) + //{ + // const labelList& hSurfs = hitSurfaces[edgeI]; + // forAll(hSurfs, i) + // { + // if (baseSurfI == -1) + // { + // baseSurfI = hSurfs[i]; + // } + // else if (baseSurfI != hSurfs[i]) + // { + // // Multiple surfaces + // return true; + // } + // } + //} + // + //// Get normals + //DynamicList<pointIndexHit> baseInfo(nInt); + //forAll(hitInfo, edgeI) + //{ + // const Foam::List<pointIndexHit>& hits = hitInfo[edgeI]; + // forAll(hits, i) + // { + // (void)hits[i].hitPoint(); + // baseInfo.append(hits[i]); + // } + //} + //vectorField normals; + //geometry[surfaces[baseSurfI]].getNormal(baseInfo, normals); + //for (label i = 1; i < normals.size(); ++i) + //{ + // if ((normals[0] & normals[i]) < 0.9) + // { + // return true; + // } + //} + //labelList regions; + //geometry[surfaces[baseSurfI]].getRegion(baseInfo, regions); + //for (label i = 1; i < regions.size(); ++i) + //{ + // if (regions[0] != regions[i]) + // { + // return true; + // } + //} + //return false; + + + + //samples[0] = point(c.xmin(), c.ymin(), c.zmin()); + //samples[1] = point(c.xmax(), c.ymin(), c.zmin()); + //samples[2] = point(c.xmax(), c.ymax(), c.zmin()); + //samples[3] = point(c.xmin(), c.ymax(), c.zmin()); + // + //samples[4] = point(c.xmin(), c.ymin(), c.zmax()); + //samples[5] = point(c.xmax(), c.ymin(), c.zmax()); + //samples[6] = point(c.xmax(), c.ymax(), c.zmax()); + //samples[7] = point(c.xmin(), c.ymax(), c.zmax()); + + //scalarField nearestDistSqr(8, GREAT); + // + //Foam::List<pointIndexHit> nearestInfo; + //surf_.findNearest(samples, nearestDistSqr, nearestInfo); + //vectorField normals; + //surf_.getNormal(nearestInfo, normals); + // + //for (label i = 1; i < normals.size(); ++i) + //{ + // if ((normals[0] & normals[i]) < 0.5) + // { + // return true; + // } + //} + //return false; + + //// Check if surface octree same level + //const labelList elems(surf_.tree().findBox(bb)); + // + //if (elems.size() > 1) + //{ + // return true; + //} + //else + //{ + // return false; + //} + } + + //- data function + virtual real value_at( const Cube &c ) + { + return signedDistance(converter_.toGlobal(c)) - _iso_val; + } +}; + + +// Main program: + +int main(int argc, char *argv[]) +{ + argList::addNote + ( + "Re-sample surfaces used in cvMesh operation" + ); + argList::validArgs.append("outputName"); + + #include "setRootCase.H" + #include "createTime.H" + runTime.functionObjects().off(); + + const fileName exportName = args.args()[1]; + + Info<< "Reading surfaces as specified in the cvMeshDict and" + << " writing a re-sampled surface to " << exportName + << nl << endl; + + cpuTime timer; + + IOdictionary cvMeshDict + ( + IOobject + ( + "cvMeshDict", + runTime.system(), + runTime, + IOobject::MUST_READ_IF_MODIFIED, + IOobject::NO_WRITE + ) + ); + + // Define/load all geometry + searchableSurfaces allGeometry + ( + IOobject + ( + "cvSearchableSurfaces", + runTime.constant(), + "triSurface", + runTime, + IOobject::MUST_READ, + IOobject::NO_WRITE + ), + cvMeshDict.subDict("geometry") + ); + + Info<< "Geometry read in = " + << timer.cpuTimeIncrement() << " s." << nl << endl; + + + Random rndGen(64293*Pstream::myProcNo()); + + conformationSurfaces geometryToConformTo + ( + runTime, + rndGen, + allGeometry, + cvMeshDict.subDict("surfaceConformation") + ); + + Info<< "Set up geometry in = " + << timer.cpuTimeIncrement() << " s." << nl << endl; + + + const searchableSurfaces& geometry = geometryToConformTo.geometry(); + const labelList& surfaces = geometryToConformTo.surfaces(); + + + const label minLevel = 2; + + // The max cube size follows from the minLevel and the default cube size + // (1) + const scalar maxSize = 1.0 / (1 << minLevel); + const scalar halfMaxSize = 0.5*maxSize; + + + // Scale the geometry to fit within + // halfMaxSize .. 1-halfMaxSize + + scalar wantedRange = 1.0-maxSize; + + const treeBoundBox bb = geometryToConformTo.globalBounds(); + + const vector scale = cmptDivide + ( + point(wantedRange, wantedRange, wantedRange), + bb.span() + ); + const vector offset = + cmptDivide + ( + point(halfMaxSize, halfMaxSize, halfMaxSize), + scale + ) + -bb.min(); + + + const pointConversion converter(scale, offset); + + + // Marching cubes + + OptOctree octree; + + distanceCalc ref + ( + 8, //maxLevel + 0.0, //distance + minLevel, //minLevel + geometryToConformTo, + converter + ); + + octree.refine(&ref); + octree.set_impl(&ref); + + Info<< "Calculated octree in = " + << timer.cpuTimeIncrement() << " s." << nl << endl; + + MarchingCubes& mc = octree.mc(); + + mc.clean_all() ; + octree.build_isosurface(&ref) ; + + Info<< "Constructed iso surface of distance in = " + << timer.cpuTimeIncrement() << " s." << nl << endl; + + // Write output file + if (mc.ntrigs() > 0) + { + Triangle* triangles = mc.triangles(); + label nTris = mc.ntrigs(); + Foam::DynamicList<labelledTri> tris(mc.ntrigs()); + for (label triI = 0; triI < nTris; ++triI) + { + const Triangle& t = triangles[triI]; + if (t.v1 != t.v2 && t.v1 != t.v3 && t.v2 != t.v3) + { + tris.append + ( + labelledTri + ( + triangles[triI].v1, + triangles[triI].v2, + triangles[triI].v3, + 0 // region + ) + ); + } + } + + + Point* vertices = mc.vertices(); + pointField points(mc.nverts()); + forAll(points, pointI) + { + const Point& v = vertices[pointI]; + points[pointI] = converter.toGlobal(v); + } + + + // Find correspondence to original surfaces + labelList regionOffsets(surfaces.size()); + label nRegions = 0; + forAll(surfaces, i) + { + const wordList& regions = geometry[surfaces[i]].regions(); + regionOffsets[i] = nRegions; + nRegions += regions.size(); + } + + + geometricSurfacePatchList patches(nRegions); + nRegions = 0; + forAll(surfaces, i) + { + const wordList& regions = geometry[surfaces[i]].regions(); + + forAll(regions, regionI) + { + patches[nRegions] = geometricSurfacePatch + ( + "patch", + geometry[surfaces[i]].name() + "_" + regions[regionI], + nRegions + ); + nRegions++; + } + } + + triSurface s(tris, patches, points, true); + tris.clearStorage(); + + Info<< "Extracted triSurface in = " + << timer.cpuTimeIncrement() << " s." << nl << endl; + + + // Find out region on local surface of nearest point + { + Foam::List<pointIndexHit> hitInfo; + labelList hitSurfaces; + geometryToConformTo.findSurfaceNearest + ( + s.faceCentres(), + scalarField(s.size(), sqr(GREAT)), + hitInfo, + hitSurfaces + ); + + // Get region + DynamicList<pointIndexHit> surfInfo(hitSurfaces.size()); + DynamicList<label> surfIndices(hitSurfaces.size()); + + forAll(surfaces, surfI) + { + // Extract info on this surface + surfInfo.clear(); + surfIndices.clear(); + forAll(hitSurfaces, triI) + { + if (hitSurfaces[triI] == surfI) + { + surfInfo.append(hitInfo[triI]); + surfIndices.append(triI); + } + } + + // Calculate sideness of these surface points + labelList region; + geometry[surfaces[surfI]].getRegion(surfInfo, region); + + forAll(region, i) + { + label triI = surfIndices[i]; + s[triI].region() = regionOffsets[surfI]+region[i]; + } + } + } + + Info<< "Re-patched surface in = " + << timer.cpuTimeIncrement() << " s." << nl << endl; + + triSurfaceMesh smesh + ( + IOobject + ( + exportName, + runTime.constant(), // instance + "triSurface", + runTime, // registry + IOobject::NO_READ, + IOobject::AUTO_WRITE, + false + ), + s + ); + + Info<< "writing surfMesh:\n " + << smesh.searchableSurface::objectPath() << nl << endl; + smesh.searchableSurface::write(); + + Info<< "Written surface in = " + << timer.cpuTimeIncrement() << " s." << nl << endl; + } + + mc.clean_all() ; + + Info<< "End\n" << endl; + + return 0; +} + + +// ************************************************************************* // diff --git a/applications/utilities/mesh/generation/cvMesh/cvMeshSurfaceSimplify/cvMeshSurfaceSimplify_non_octree.C b/applications/utilities/mesh/generation/cvMesh/cvMeshSurfaceSimplify/cvMeshSurfaceSimplify_non_octree.C new file mode 100644 index 0000000000000000000000000000000000000000..c3518ef1a0365e5359f9d402068a6914053049b9 --- /dev/null +++ b/applications/utilities/mesh/generation/cvMesh/cvMeshSurfaceSimplify/cvMeshSurfaceSimplify_non_octree.C @@ -0,0 +1,352 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2012 OpenFOAM Foundation + \\/ M anipulation | +------------------------------------------------------------------------------- +License + This file is part of OpenFOAM. + + OpenFOAM is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + OpenFOAM is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>. + +Application + cvMeshSurfaceSimplify + +Description + Simplifies surfaces by resampling. + + Uses Thomas Lewiner's topology preserving MarchingCubes. + +\*---------------------------------------------------------------------------*/ + +#include "argList.H" +#include "Time.H" +#include "searchableSurfaces.H" +#include "conformationSurfaces.H" +#include "triSurfaceMesh.H" + +#include "MarchingCubes.h" + + +using namespace Foam; + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +// Main program: + +int main(int argc, char *argv[]) +{ + argList::addNote + ( + "Re-sample surfaces used in cvMesh operation" + ); + //argList::validArgs.append("inputFile"); + argList::validArgs.append("(nx ny nz)"); + argList::validArgs.append("outputName"); + + #include "setRootCase.H" + #include "createTime.H" + runTime.functionObjects().off(); + + const Vector<label> n(IStringStream(args.args()[1])()); + const fileName exportName = args.args()[2]; + + Info<< "Reading surfaces as specified in the cvMeshDict and" + << " writing re-sampled " << n << " to " << exportName + << nl << endl; + + cpuTime timer; + + IOdictionary cvMeshDict + ( + IOobject + ( + "cvMeshDict", + runTime.system(), + runTime, + IOobject::MUST_READ_IF_MODIFIED, + IOobject::NO_WRITE + ) + ); + + // Define/load all geometry + searchableSurfaces allGeometry + ( + IOobject + ( + "cvSearchableSurfaces", + runTime.constant(), + "triSurface", + runTime, + IOobject::MUST_READ, + IOobject::NO_WRITE + ), + cvMeshDict.subDict("geometry") + ); + + Info<< "Geometry read in = " + << timer.cpuTimeIncrement() << " s." << nl << endl; + + + Random rndGen(64293*Pstream::myProcNo()); + + conformationSurfaces geometryToConformTo + ( + runTime, + rndGen, + allGeometry, + cvMeshDict.subDict("surfaceConformation") + ); + + Info<< "Set up geometry in = " + << timer.cpuTimeIncrement() << " s." << nl << endl; + + + + // Extend + treeBoundBox bb = geometryToConformTo.globalBounds(); + { + const vector smallVec = 0.1*bb.span(); + bb.min() -= smallVec; + bb.max() += smallVec; + } + + Info<< "Meshing to bounding box " << bb << nl << endl; + + const vector span(bb.span()); + const vector d + ( + span.x()/(n.x()-1), + span.y()/(n.y()-1), + span.z()/(n.z()-1) + ); + + MarchingCubes mc(span.x(), span.y(), span.z() ) ; + mc.set_resolution(n.x(), n.y(), n.z()); + mc.init_all() ; + + + // Generate points + pointField points(mc.size_x()*mc.size_y()*mc.size_z()); + label pointI = 0; + + point pt; + for( int k = 0 ; k < mc.size_z() ; k++ ) + { + pt.z() = bb.min().z() + k*d.z(); + for( int j = 0 ; j < mc.size_y() ; j++ ) + { + pt.y() = bb.min().y() + j*d.y(); + for( int i = 0 ; i < mc.size_x() ; i++ ) + { + pt.x() = bb.min().x() + i*d.x(); + points[pointI++] = pt; + } + } + } + + Info<< "Generated " << points.size() << " sampling points in = " + << timer.cpuTimeIncrement() << " s." << nl << endl; + + + // Compute data + const searchableSurfaces& geometry = geometryToConformTo.geometry(); + const labelList& surfaces = geometryToConformTo.surfaces(); + + scalarField signedDist; + labelList nearestSurfaces; + searchableSurfacesQueries::signedDistance + ( + geometry, + surfaces, + points, + scalarField(points.size(), sqr(GREAT)), + searchableSurface::OUTSIDE, // for non-closed surfaces treat as + // outside + nearestSurfaces, + signedDist + ); + + // Fill elements + pointI = 0; + for( int k = 0 ; k < mc.size_z() ; k++ ) + { + for( int j = 0 ; j < mc.size_y() ; j++ ) + { + for( int i = 0 ; i < mc.size_x() ; i++ ) + { + mc.set_data(float(signedDist[pointI++]), i, j, k); + } + } + } + + Info<< "Determined signed distance in = " + << timer.cpuTimeIncrement() << " s." << nl << endl; + + + mc.run() ; + + Info<< "Constructed iso surface in = " + << timer.cpuTimeIncrement() << " s." << nl << endl; + + + mc.clean_temps() ; + + + + // Write output file + if (mc.ntrigs() > 0) + { + Triangle* triangles = mc.triangles(); + List<labelledTri> tris(mc.ntrigs()); + forAll(tris, triI) + { + tris[triI] = labelledTri + ( + triangles[triI].v1, + triangles[triI].v2, + triangles[triI].v3, + 0 // region + ); + } + + + Vertex* vertices = mc.vertices(); + pointField points(mc.nverts()); + forAll(points, pointI) + { + Vertex& v = vertices[pointI]; + points[pointI] = point + ( + bb.min().x() + v.x*span.x()/mc.size_x(), + bb.min().y() + v.y*span.y()/mc.size_y(), + bb.min().z() + v.z*span.z()/mc.size_z() + ); + } + + + // Find correspondence to original surfaces + labelList regionOffsets(surfaces.size()); + label nRegions = 0; + forAll(surfaces, i) + { + const wordList& regions = geometry[surfaces[i]].regions(); + regionOffsets[i] = nRegions; + nRegions += regions.size(); + } + + + geometricSurfacePatchList patches(nRegions); + nRegions = 0; + forAll(surfaces, i) + { + const wordList& regions = geometry[surfaces[i]].regions(); + + forAll(regions, regionI) + { + patches[nRegions] = geometricSurfacePatch + ( + "patch", + geometry[surfaces[i]].name() + "_" + regions[regionI], + nRegions + ); + nRegions++; + } + } + + triSurface s(tris, patches, points, true); + + Info<< "Extracted triSurface in = " + << timer.cpuTimeIncrement() << " s." << nl << endl; + + + // Find out region on local surface of nearest point + { + List<pointIndexHit> hitInfo; + labelList hitSurfaces; + geometryToConformTo.findSurfaceNearest + ( + s.faceCentres(), + scalarField(s.size(), sqr(GREAT)), + hitInfo, + hitSurfaces + ); + + // Get region + DynamicList<pointIndexHit> surfInfo(hitSurfaces.size()); + DynamicList<label> surfIndices(hitSurfaces.size()); + + forAll(surfaces, surfI) + { + // Extract info on this surface + surfInfo.clear(); + surfIndices.clear(); + forAll(hitSurfaces, triI) + { + if (hitSurfaces[triI] == surfI) + { + surfInfo.append(hitInfo[triI]); + surfIndices.append(triI); + } + } + + // Calculate sideness of these surface points + labelList region; + geometry[surfaces[surfI]].getRegion(surfInfo, region); + + forAll(region, i) + { + label triI = surfIndices[i]; + s[triI].region() = regionOffsets[surfI]+region[i]; + } + } + } + + Info<< "Re-patched surface in = " + << timer.cpuTimeIncrement() << " s." << nl << endl; + + triSurfaceMesh smesh + ( + IOobject + ( + exportName, + runTime.constant(), // instance + "triSurface", + runTime, // registry + IOobject::NO_READ, + IOobject::AUTO_WRITE, + false + ), + s + ); + + Info<< "writing surfMesh:\n " + << smesh.searchableSurface::objectPath() << nl << endl; + smesh.searchableSurface::write(); + + Info<< "Written surface in = " + << timer.cpuTimeIncrement() << " s." << nl << endl; + } + + mc.clean_all() ; + + + Info<< "End\n" << endl; + + return 0; +} + + +// ************************************************************************* // diff --git a/applications/utilities/mesh/generation/cvMesh/vectorTools/vectorTools.H b/applications/utilities/mesh/generation/cvMesh/vectorTools/vectorTools.H new file mode 100644 index 0000000000000000000000000000000000000000..9fb39a159bafbfb8de882cb4b469fbf6e7d14af8 --- /dev/null +++ b/applications/utilities/mesh/generation/cvMesh/vectorTools/vectorTools.H @@ -0,0 +1,157 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2011 OpenFOAM Foundation + \\/ M anipulation | +------------------------------------------------------------------------------- +License + This file is part of OpenFOAM. + + OpenFOAM is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + OpenFOAM is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>. + +Class + Foam::vectorTools + +Description + Functions for analysing the relationships between vectors + +SourceFiles + +\*---------------------------------------------------------------------------*/ + +#ifndef vectorTools_H +#define vectorTools_H + +#include "vector.H" +#include "unitConversion.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ + +/*---------------------------------------------------------------------------*\ + Namespace vectorTools Declaration +\*---------------------------------------------------------------------------*/ + +//- Collection of functions for testing relationships between two vectors. +namespace vectorTools +{ + //- Test if a and b are parallel: a.b = 1 + // Uses the cross product, so the tolerance is proportional to + // the sine of the angle between a and b in radians + template <typename T> + bool areParallel + ( + const Vector<T>& a, + const Vector<T>& b, + const T& tolerance = SMALL + ) + { + return (mag(a ^ b) < tolerance) ? true : false; +// return ( mag( mag(a & b)/(mag(a)*mag(b)) - 1.0 ) < tolerance ) +// ? true +// : false; + } + + //- Test if a and b are orthogonal: a.b = 0 + // Uses the dot product, so the tolerance is proportional to + // the cosine of the angle between a and b in radians + template <typename T> + bool areOrthogonal + ( + const Vector<T>& a, + const Vector<T>& b, + const T& tolerance = SMALL + ) + { + return (mag(a & b) < tolerance) ? true : false; + } + + //- Test if angle between a and b is acute: a.b > 0 + template <typename T> + bool areAcute + ( + const Vector<T>& a, + const Vector<T>& b + ) + { + return ((a & b) > 0) ? true : false; + } + + //- Test if angle between a and b is obtuse: a.b < 0 + template <typename T> + bool areObtuse + ( + const Vector<T>& a, + const Vector<T>& b + ) + { + return ((a & b) < 0) ? true : false; + } + + //- Calculate angle between a and b in radians + template <typename T> + T cosPhi + ( + const Vector<T>& a, + const Vector<T>& b, + const T& tolerance = SMALL + ) + { + scalar cosPhi = (a & b)/(mag(a)*mag(b) + tolerance); + + // Enforce bounding between -1 and 1 + return min(max(cosPhi, -1), 1); + } + + //- Calculate angle between a and b in radians + template <typename T> + T radAngleBetween + ( + const Vector<T>& a, + const Vector<T>& b, + const T& tolerance = SMALL + ) + { + scalar cosPhi = (a & b)/(mag(a)*mag(b) + tolerance); + + // Enforce bounding between -1 and 1 + return acos( min(max(cosPhi, -1), 1) ); + } + + //- Calculate angle between a and b in degrees + template <typename T> + T degAngleBetween + ( + const Vector<T>& a, + const Vector<T>& b, + const T& tolerance = SMALL + ) + { + return radToDeg(radAngleBetween(a, b, tolerance)); + } + +} // End namespace vectorTools + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace Foam + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#endif + +// ************************************************************************* // diff --git a/applications/utilities/mesh/generation/extrude2DMesh/extrude2DMesh/extrude2DMesh/extrude2DMesh.C b/applications/utilities/mesh/generation/extrude2DMesh/extrude2DMesh/extrude2DMesh/extrude2DMesh.C index 9b70418abc323a59c3c6096f2592c27e38a53230..0bbe7d926a16733c25ff9b63d58ffea347a39642 100644 --- a/applications/utilities/mesh/generation/extrude2DMesh/extrude2DMesh/extrude2DMesh/extrude2DMesh.C +++ b/applications/utilities/mesh/generation/extrude2DMesh/extrude2DMesh/extrude2DMesh/extrude2DMesh.C @@ -2,7 +2,7 @@ ========= | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | - \\ / A nd | Copyright (C) 2012-2013 OpenFOAM Foundation + \\ / A nd | Copyright (C) 2012 OpenFOAM Foundation \\/ M anipulation | ------------------------------------------------------------------------------- License @@ -90,6 +90,7 @@ Foam::extrude2DMesh::extrude2DMesh dict_(dict), //patchDict_(dict.subDict("patchInfo")), model_(model), + modelType_(dict.lookup("extrudeModel")), patchType_(dict.lookup("patchType")), frontPatchI_(-1), backPatchI_(-1) diff --git a/applications/utilities/mesh/generation/extrude2DMesh/extrude2DMesh/extrude2DMesh/extrude2DMesh.H b/applications/utilities/mesh/generation/extrude2DMesh/extrude2DMesh/extrude2DMesh/extrude2DMesh.H index 0c5d143c0aab283dcdd892cee7360c541f1c83f0..3b6efd267efbcc44be597de5edac863b554c616d 100644 --- a/applications/utilities/mesh/generation/extrude2DMesh/extrude2DMesh/extrude2DMesh/extrude2DMesh.H +++ b/applications/utilities/mesh/generation/extrude2DMesh/extrude2DMesh/extrude2DMesh/extrude2DMesh.H @@ -2,7 +2,7 @@ ========= | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | - \\ / A nd | Copyright (C) 2012-2013 OpenFOAM Foundation + \\ / A nd | Copyright (C) 2012 OpenFOAM Foundation \\/ M anipulation | ------------------------------------------------------------------------------- License @@ -53,9 +53,10 @@ class polyMesh; class polyTopoChange; class mapPolyMesh; class mapDistributePolyMesh; +class polyBoundaryMesh; /*---------------------------------------------------------------------------*\ - Class extrude2DMesh Declaration + Class extrude2DMesh Declaration \*---------------------------------------------------------------------------*/ class extrude2DMesh @@ -65,24 +66,19 @@ class extrude2DMesh //- Reference to 2D mesh polyMesh& mesh_; - //- Extrusion dictionary const dictionary dict_; //const dictionary patchDict_; - //- The extrusion model const extrudeModel& model_; - //- Type of the patches that will be created by the extrusion. + const word modelType_; + const word patchType_; - //- Patch ID of the front patch label frontPatchI_; - - //- Patch ID of the back patch label backPatchI_; - // Private Member Functions //- Check the mesh is 2D @@ -97,7 +93,6 @@ class extrude2DMesh //- Disallow default bitwise assignment void operator=(const extrude2DMesh&); - public: //- Runtime type information @@ -105,8 +100,6 @@ public: // Constructors - - //- Construct from a 2D polyMesh, a dictionary and an extrusion model extrude2DMesh ( polyMesh&, @@ -121,36 +114,30 @@ public: // Member Functions - // Access - - //- Return the patch ID of the front patch - inline label frontPatchI() const - { - return frontPatchI_; - } - - //- Return the patch ID of the back patch - inline label backPatchI() const - { - return backPatchI_; - } + //- Add front and back patches + void addFrontBackPatches(); + //- Play commands into polyTopoChange to extrude mesh. + void setRefinement(polyTopoChange&); - // Edit + //- Force recalculation of locally stored data on topological change + void updateMesh(const mapPolyMesh&) + {} - //- Add front and back patches - void addFrontBackPatches(); + //- Force recalculation of locally stored data for mesh distribution + void distribute(const mapDistributePolyMesh&) + {} - //- Play commands into polyTopoChange to extrude mesh. - void setRefinement(polyTopoChange&); + label frontPatchI() const + { + return frontPatchI_; + } - //- Force recalculation of locally stored data on topological change - void updateMesh(const mapPolyMesh&) - {} + label backPatchI() const + { + return backPatchI_; + } - //- Force recalculation of locally stored data for mesh distribution - void distribute(const mapDistributePolyMesh&) - {} }; diff --git a/applications/utilities/mesh/generation/extrude2DMesh/extrude2DMeshDict b/applications/utilities/mesh/generation/extrude2DMesh/extrude2DMeshDict index fa1b37b304968eb9c86fa12ae33ce6253e638e61..5e53c29c886fa05b2158b0d032d85b5f6ed148b7 100644 --- a/applications/utilities/mesh/generation/extrude2DMesh/extrude2DMeshDict +++ b/applications/utilities/mesh/generation/extrude2DMesh/extrude2DMeshDict @@ -5,48 +5,42 @@ | \\ / A nd | Web: www.OpenFOAM.org | | \\/ M anipulation | | \*---------------------------------------------------------------------------*/ + FoamFile { - version 2.0; - format ascii; - class dictionary; - object extrude2DMeshDict; + version 2.0; + format ascii; + + root ""; + case ""; + instance ""; + local ""; + + class dictionary; + object extrude2DMeshDict; } + // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // -// Type of extrusion extrudeModel linearDirection; //extrudeModel wedge; -// Patch type the extruded patches will take patchType empty; //patchType wedge; -// Number of layers to extrude nLayers 1; -// Expansion ratio. If >1 then grows the layers expansionRatio 1.0; linearDirectionCoeffs { - // Direction of extrusion direction (0 0 1); - - // Width of newly extruded cells thickness 0.1; } wedgeCoeffs { - // Point the extrusion axis goes through - axisPt (0 0 0); - - // Axis to extrude around - axis (1 0 0); - - // Total angle of the wedge in degrees - angle 10; + axisPt (0 0 0); + axis (1 0 0); + angle 10; } - -// ************************************************************************* // \ No newline at end of file diff --git a/tutorials/mesh/cv2DMesh/OpenCFD/0.org/T b/tutorials/mesh/cv2DMesh/OpenCFD/0.org/T new file mode 100644 index 0000000000000000000000000000000000000000..9a6eca29ca3969af30086bdf9e4daee75ef1799d --- /dev/null +++ b/tutorials/mesh/cv2DMesh/OpenCFD/0.org/T @@ -0,0 +1,50 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: dev | +| \\ / A nd | Web: www.OpenFOAM.org | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class volScalarField; + object T; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +dimensions [0 0 0 1 0 0 0]; + +internalField uniform 1; + +boundaryField +{ + box_inlet + { + type fixedValue; + value uniform 1; + } + + box_outlet + { + type zeroGradient; + } + + box_bottom + { + type zeroGradient; + } + + box_top + { + type zeroGradient; + } + + letters_text + { + type zeroGradient; + } +} + +// ************************************************************************* // diff --git a/tutorials/mesh/cv2DMesh/OpenCFD/0.org/U b/tutorials/mesh/cv2DMesh/OpenCFD/0.org/U new file mode 100644 index 0000000000000000000000000000000000000000..8bfcf3d1780f8e110bb39e46e20a9ed4267a9971 --- /dev/null +++ b/tutorials/mesh/cv2DMesh/OpenCFD/0.org/U @@ -0,0 +1,59 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: dev | +| \\ / A nd | Web: www.OpenFOAM.org | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class volVectorField; + object U; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +dimensions [0 1 -1 0 0 0 0]; + +internalField uniform (0 0 0); + +boundaryField +{ + box_inlet + { + type fixedValue; + value uniform (3 0 0); + } + + box_outlet + { + type zeroGradient; + } + + box_bottom + { + type supersonicFreestream; + UInf (3 0 0); + pInf 1; + TInf 1; + gamma 1.4; + } + + box_top + { + type supersonicFreestream; + UInf (3 0 0); + pInf 1; + TInf 1; + gamma 1.4; + } + + letters_text + { + type fixedValue; + value uniform (0 0 0); + } +} + +// ************************************************************************* // diff --git a/tutorials/mesh/cv2DMesh/OpenCFD/0.org/p b/tutorials/mesh/cv2DMesh/OpenCFD/0.org/p new file mode 100644 index 0000000000000000000000000000000000000000..634675e05c3a50c8ecf1659596a2c05af308bf98 --- /dev/null +++ b/tutorials/mesh/cv2DMesh/OpenCFD/0.org/p @@ -0,0 +1,51 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: dev | +| \\ / A nd | Web: www.OpenFOAM.org | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class volScalarField; + object p; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +dimensions [1 -1 -2 0 0 0 0]; + +internalField uniform 1; + +boundaryField +{ + box_inlet + { + type fixedValue; + value uniform 1; + } + + box_outlet + { + type zeroGradient; + } + + box_bottom + { + type zeroGradient; + } + + box_top + { + type zeroGradient; + } + + letters_text + { + type zeroGradient; + } +} + + +// ************************************************************************* // diff --git a/tutorials/mesh/cv2DMesh/OpenCFD/Allclean b/tutorials/mesh/cv2DMesh/OpenCFD/Allclean new file mode 100755 index 0000000000000000000000000000000000000000..766547e755807945df7c6713bf32c6f18576fe0f --- /dev/null +++ b/tutorials/mesh/cv2DMesh/OpenCFD/Allclean @@ -0,0 +1,15 @@ +#!/bin/sh +cd ${0%/*} || exit 1 # run from this directory + +# Source tutorial run functions +. $WM_PROJECT_DIR/bin/tools/CleanFunctions + +rm -rf constant/extendedFeatureEdgeMesh > /dev/null 2>&1 +rm -rf constant/triSurface/*.eMesh > /dev/null 2>&1 +rm -rf 0 > /dev/null 2>&1 +rm -rf MeshedSurface.obj > /dev/null 2>&1 + +cleanCase + + +# ----------------------------------------------------------------- end-of-file diff --git a/tutorials/mesh/cv2DMesh/OpenCFD/Allrun b/tutorials/mesh/cv2DMesh/OpenCFD/Allrun new file mode 100755 index 0000000000000000000000000000000000000000..c86f5608da82f9be64ba958861c15324ed4c9c8c --- /dev/null +++ b/tutorials/mesh/cv2DMesh/OpenCFD/Allrun @@ -0,0 +1,15 @@ +#!/bin/sh +cd ${0%/*} || exit 1 # run from this directory + +# Source tutorial run functions +. $WM_PROJECT_DIR/bin/tools/RunFunctions + +cp system/controlDict.mesher system/controlDict + +runApplication surfaceFeatureExtract +runApplication cv2DMesh -overwrite +runApplication extrude2DMesh -overwrite polyMesh2D +runApplication checkMesh -allGeometry -allTopology -constant -noZero + + +# ----------------------------------------------------------------- end-of-file diff --git a/tutorials/mesh/cv2DMesh/OpenCFD/Allrun-rhoCentralFoam b/tutorials/mesh/cv2DMesh/OpenCFD/Allrun-rhoCentralFoam new file mode 100755 index 0000000000000000000000000000000000000000..a87455256146301b73272509a08181cf6c7b8506 --- /dev/null +++ b/tutorials/mesh/cv2DMesh/OpenCFD/Allrun-rhoCentralFoam @@ -0,0 +1,18 @@ +#!/bin/sh +cd ${0%/*} || exit 1 # run from this directory + +# Source tutorial run functions +. $WM_PROJECT_DIR/bin/tools/RunFunctions + +# Get the number of processors to run on from system/decomposeParDict +nProcs=$(getNumberOfProcessors) + +cp system/controlDict.rhoCentralFoam system/controlDict +cp -r 0.org 0 + +runApplication decomposePar +runParallel rhoCentralFoam $nProcs +runApplication reconstructPar + + +# ----------------------------------------------------------------- end-of-file diff --git a/tutorials/mesh/cv2DMesh/OpenCFD/constant/thermophysicalProperties b/tutorials/mesh/cv2DMesh/OpenCFD/constant/thermophysicalProperties new file mode 100644 index 0000000000000000000000000000000000000000..4f3963307118eeb9f80178bc25e7706e5661e3ef --- /dev/null +++ b/tutorials/mesh/cv2DMesh/OpenCFD/constant/thermophysicalProperties @@ -0,0 +1,43 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: dev | +| \\ / A nd | Web: www.OpenFOAM.org | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + location "constant"; + object thermophysicalProperties; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +thermoType hePsiThermo<pureMixture<const<hConst<perfectGas<specie>>,sensibleEnthalpy>>>; + +// Note: these are the properties for a "normalised" inviscid gas +// for which the speed of sound is 1 m/s at a temperature of 1K +// and gamma = 7/5 +mixture +{ + specie + { + nMoles 1; + molWeight 11640.3; + } + thermodynamics + { + Cp 2.5; + Hf 0; + } + transport + { + mu 0; + Pr 1; + } +} + + +// ************************************************************************* // diff --git a/tutorials/mesh/cv2DMesh/OpenCFD/constant/triSurface/opencfd_box.stl b/tutorials/mesh/cv2DMesh/OpenCFD/constant/triSurface/opencfd_box.stl new file mode 100644 index 0000000000000000000000000000000000000000..dd250ea5ae9e21d687a26b84003155908e6f9405 --- /dev/null +++ b/tutorials/mesh/cv2DMesh/OpenCFD/constant/triSurface/opencfd_box.stl @@ -0,0 +1,96 @@ +solid back + facet normal 0 0 -1 + outer loop + vertex -1.618703 -1.830978 -0.557967 + vertex 4.82342 2.27362 -0.557967 + vertex 4.82342 -1.830978 -0.557967 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -1.618703 -1.830978 -0.557967 + vertex -1.618703 2.27362 -0.557967 + vertex 4.82342 2.27362 -0.557967 + endloop + endfacet +endsolid back +solid front + facet normal 0 0 1 + outer loop + vertex 4.82342 2.27362 0.586404 + vertex -1.618703 -1.830978 0.586404 + vertex 4.82342 -1.830978 0.586404 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 4.82342 2.27362 0.586404 + vertex -1.618703 2.27362 0.586404 + vertex -1.618703 -1.830978 0.586404 + endloop + endfacet +endsolid front +solid bottom + facet normal -2.19049e-08 -1 2.0834e-07 + outer loop + vertex -1.618703 -1.830978 0.586404 + vertex -1.618703 -1.830978 -0.557967 + vertex 4.82342 -1.830978 -0.557967 + endloop + endfacet + facet normal -1.97144e-07 -1 -6.25021e-07 + outer loop + vertex 4.82342 -1.830978 -0.557967 + vertex 4.82342 -1.830978 0.586404 + vertex -1.618703 -1.830978 0.586404 + endloop + endfacet +endsolid bottom +solid top + facet normal 6.57148e-08 1 4.1668e-07 + outer loop + vertex 4.82342 2.27362 0.586404 + vertex 4.82342 2.27362 -0.557967 + vertex -1.618703 2.27362 -0.557967 + endloop + endfacet + facet normal 8.76197e-08 1 3.1251e-07 + outer loop + vertex -1.618703 2.27362 -0.557967 + vertex -1.618703 2.27362 0.586404 + vertex 4.82342 2.27362 0.586404 + endloop + endfacet +endsolid top +solid inlet + facet normal -1 2.54891e-07 -2.60425e-07 + outer loop + vertex -1.618703 -1.830978 -0.557967 + vertex -1.618703 2.27362 0.586404 + vertex -1.618703 2.27362 -0.557967 + endloop + endfacet + facet normal -1 1.69927e-07 -1.0417e-07 + outer loop + vertex -1.618703 -1.830978 -0.557967 + vertex -1.618703 -1.830978 0.586404 + vertex -1.618703 2.27362 0.586404 + endloop + endfacet +endsolid inlet +solid outlet + facet normal 1 0 8.33361e-07 + outer loop + vertex 4.82342 2.27362 -0.557967 + vertex 4.82342 -1.830978 0.586404 + vertex 4.82342 -1.830978 -0.557967 + endloop + endfacet + facet normal 1 -6.79708e-07 -4.16681e-07 + outer loop + vertex 4.82342 2.27362 -0.557967 + vertex 4.82342 2.27362 0.586404 + vertex 4.82342 -1.830978 0.586404 + endloop + endfacet +endsolid outlet diff --git a/tutorials/mesh/cv2DMesh/OpenCFD/constant/triSurface/opencfd_text.stl b/tutorials/mesh/cv2DMesh/OpenCFD/constant/triSurface/opencfd_text.stl new file mode 100644 index 0000000000000000000000000000000000000000..0c289a16cf676609859671dc1a20b82b7f7e3195 --- /dev/null +++ b/tutorials/mesh/cv2DMesh/OpenCFD/constant/triSurface/opencfd_text.stl @@ -0,0 +1,16466 @@ +solid text + facet normal -0.0721417 -0.997394 -0 + outer loop + vertex 0.436903 0.696938 0.489362 + vertex 0.436903 0.696938 -0.510638 + vertex 0.458558 0.695372 -0.510638 + endloop + endfacet + facet normal -0.0721417 -0.997394 0 + outer loop + vertex 0.436903 0.696938 0.489362 + vertex 0.458558 0.695372 -0.510638 + vertex 0.458558 0.695372 0.489362 + endloop + endfacet + facet normal -0.121287 -0.992617 -0 + outer loop + vertex 0.458558 0.695372 0.489362 + vertex 0.458558 0.695372 -0.510638 + vertex 0.479633 0.692796 -0.510638 + endloop + endfacet + facet normal -0.121287 -0.992617 0 + outer loop + vertex 0.458558 0.695372 0.489362 + vertex 0.479633 0.692796 -0.510638 + vertex 0.479633 0.692796 0.489362 + endloop + endfacet + facet normal -0.171015 -0.985268 -0 + outer loop + vertex 0.479633 0.692796 0.489362 + vertex 0.479633 0.692796 -0.510638 + vertex 0.500116 0.689241 -0.510638 + endloop + endfacet + facet normal -0.171015 -0.985268 0 + outer loop + vertex 0.479633 0.692796 0.489362 + vertex 0.500116 0.689241 -0.510638 + vertex 0.500116 0.689241 0.489362 + endloop + endfacet + facet normal -0.221101 -0.975251 -0 + outer loop + vertex 0.500116 0.689241 0.489362 + vertex 0.500116 0.689241 -0.510638 + vertex 0.519992 0.684735 -0.510638 + endloop + endfacet + facet normal -0.221101 -0.975251 0 + outer loop + vertex 0.500116 0.689241 0.489362 + vertex 0.519992 0.684735 -0.510638 + vertex 0.519992 0.684735 0.489362 + endloop + endfacet + facet normal -0.271312 -0.962492 -0 + outer loop + vertex 0.519992 0.684735 0.489362 + vertex 0.519992 0.684735 -0.510638 + vertex 0.53925 0.679306 -0.510638 + endloop + endfacet + facet normal -0.271312 -0.962492 0 + outer loop + vertex 0.519992 0.684735 0.489362 + vertex 0.53925 0.679306 -0.510638 + vertex 0.53925 0.679306 0.489362 + endloop + endfacet + facet normal -0.321405 -0.946942 -0 + outer loop + vertex 0.53925 0.679306 0.489362 + vertex 0.53925 0.679306 -0.510638 + vertex 0.557876 0.672985 -0.510638 + endloop + endfacet + facet normal -0.321405 -0.946942 0 + outer loop + vertex 0.53925 0.679306 0.489362 + vertex 0.557876 0.672985 -0.510638 + vertex 0.557876 0.672985 0.489362 + endloop + endfacet + facet normal -0.371124 -0.928583 -0 + outer loop + vertex 0.557876 0.672985 0.489362 + vertex 0.557876 0.672985 -0.510638 + vertex 0.575857 0.665798 -0.510638 + endloop + endfacet + facet normal -0.371124 -0.928583 0 + outer loop + vertex 0.557876 0.672985 0.489362 + vertex 0.575857 0.665798 -0.510638 + vertex 0.575857 0.665798 0.489362 + endloop + endfacet + facet normal -0.420217 -0.907424 -0 + outer loop + vertex 0.575857 0.665798 0.489362 + vertex 0.575857 0.665798 -0.510638 + vertex 0.593179 0.657776 -0.510638 + endloop + endfacet + facet normal -0.420217 -0.907424 0 + outer loop + vertex 0.575857 0.665798 0.489362 + vertex 0.593179 0.657776 -0.510638 + vertex 0.593179 0.657776 0.489362 + endloop + endfacet + facet normal -0.468435 -0.883498 -0 + outer loop + vertex 0.593179 0.657776 0.489362 + vertex 0.593179 0.657776 -0.510638 + vertex 0.60983 0.648948 -0.510638 + endloop + endfacet + facet normal -0.468435 -0.883498 0 + outer loop + vertex 0.593179 0.657776 0.489362 + vertex 0.60983 0.648948 -0.510638 + vertex 0.60983 0.648948 0.489362 + endloop + endfacet + facet normal -0.515532 -0.85687 -0 + outer loop + vertex 0.60983 0.648948 0.489362 + vertex 0.60983 0.648948 -0.510638 + vertex 0.625797 0.639342 -0.510638 + endloop + endfacet + facet normal -0.515532 -0.85687 0 + outer loop + vertex 0.60983 0.648948 0.489362 + vertex 0.625797 0.639342 -0.510638 + vertex 0.625797 0.639342 0.489362 + endloop + endfacet + facet normal -0.561277 -0.827628 -0 + outer loop + vertex 0.625797 0.639342 0.489362 + vertex 0.625797 0.639342 -0.510638 + vertex 0.641066 0.628986 -0.510638 + endloop + endfacet + facet normal -0.561277 -0.827628 0 + outer loop + vertex 0.625797 0.639342 0.489362 + vertex 0.641066 0.628986 -0.510638 + vertex 0.641066 0.628986 0.489362 + endloop + endfacet + facet normal -0.605455 -0.795879 -0 + outer loop + vertex 0.641066 0.628986 0.489362 + vertex 0.641066 0.628986 -0.510638 + vertex 0.655625 0.617911 -0.510638 + endloop + endfacet + facet normal -0.605455 -0.795879 0 + outer loop + vertex 0.641066 0.628986 0.489362 + vertex 0.655625 0.617911 -0.510638 + vertex 0.655625 0.617911 0.489362 + endloop + endfacet + facet normal -0.647866 -0.761754 -0 + outer loop + vertex 0.655625 0.617911 0.489362 + vertex 0.655625 0.617911 -0.510638 + vertex 0.669459 0.606145 -0.510638 + endloop + endfacet + facet normal -0.647866 -0.761754 0 + outer loop + vertex 0.655625 0.617911 0.489362 + vertex 0.669459 0.606145 -0.510638 + vertex 0.669459 0.606145 0.489362 + endloop + endfacet + facet normal -0.68833 -0.725398 -0 + outer loop + vertex 0.669459 0.606145 0.489362 + vertex 0.669459 0.606145 -0.510638 + vertex 0.682557 0.593716 -0.510638 + endloop + endfacet + facet normal -0.68833 -0.725398 0 + outer loop + vertex 0.669459 0.606145 0.489362 + vertex 0.682557 0.593716 -0.510638 + vertex 0.682557 0.593716 0.489362 + endloop + endfacet + facet normal -0.726691 -0.686964 -0 + outer loop + vertex 0.682557 0.593716 0.489362 + vertex 0.682557 0.593716 -0.510638 + vertex 0.694905 0.580655 -0.510638 + endloop + endfacet + facet normal -0.726691 -0.686964 0 + outer loop + vertex 0.682557 0.593716 0.489362 + vertex 0.694905 0.580655 -0.510638 + vertex 0.694905 0.580655 0.489362 + endloop + endfacet + facet normal -0.76281 -0.646623 -0 + outer loop + vertex 0.694905 0.580655 0.489362 + vertex 0.694905 0.580655 -0.510638 + vertex 0.70649 0.566988 -0.510638 + endloop + endfacet + facet normal -0.76281 -0.646623 0 + outer loop + vertex 0.694905 0.580655 0.489362 + vertex 0.70649 0.566988 -0.510638 + vertex 0.70649 0.566988 0.489362 + endloop + endfacet + facet normal -0.796576 -0.604539 -0 + outer loop + vertex 0.70649 0.566988 0.489362 + vertex 0.70649 0.566988 -0.510638 + vertex 0.717298 0.552746 -0.510638 + endloop + endfacet + facet normal -0.796576 -0.604539 0 + outer loop + vertex 0.70649 0.566988 0.489362 + vertex 0.717298 0.552746 -0.510638 + vertex 0.717298 0.552746 0.489362 + endloop + endfacet + facet normal -0.82789 -0.56089 -0 + outer loop + vertex 0.717298 0.552746 0.489362 + vertex 0.717298 0.552746 -0.510638 + vertex 0.727317 0.537958 -0.510638 + endloop + endfacet + facet normal -0.82789 -0.56089 0 + outer loop + vertex 0.717298 0.552746 0.489362 + vertex 0.727317 0.537958 -0.510638 + vertex 0.727317 0.537958 0.489362 + endloop + endfacet + facet normal -0.856678 -0.515851 -0 + outer loop + vertex 0.727317 0.537958 0.489362 + vertex 0.727317 0.537958 -0.510638 + vertex 0.736534 0.522652 -0.510638 + endloop + endfacet + facet normal -0.856678 -0.515851 0 + outer loop + vertex 0.727317 0.537958 0.489362 + vertex 0.736534 0.522652 -0.510638 + vertex 0.736534 0.522652 0.489362 + endloop + endfacet + facet normal -0.882885 -0.46959 -0 + outer loop + vertex 0.736534 0.522652 0.489362 + vertex 0.736534 0.522652 -0.510638 + vertex 0.744935 0.506856 -0.510638 + endloop + endfacet + facet normal -0.882885 -0.46959 0 + outer loop + vertex 0.736534 0.522652 0.489362 + vertex 0.744935 0.506856 -0.510638 + vertex 0.744935 0.506856 0.489362 + endloop + endfacet + facet normal -0.906467 -0.422278 -0 + outer loop + vertex 0.744935 0.506856 0.489362 + vertex 0.744935 0.506856 -0.510638 + vertex 0.752508 0.490601 -0.510638 + endloop + endfacet + facet normal -0.906467 -0.422278 0 + outer loop + vertex 0.744935 0.506856 0.489362 + vertex 0.752508 0.490601 -0.510638 + vertex 0.752508 0.490601 0.489362 + endloop + endfacet + facet normal -0.927396 -0.37408 -0 + outer loop + vertex 0.752508 0.490601 0.489362 + vertex 0.752508 0.490601 -0.510638 + vertex 0.759238 0.473915 -0.510638 + endloop + endfacet + facet normal -0.927396 -0.37408 0 + outer loop + vertex 0.752508 0.490601 0.489362 + vertex 0.759238 0.473915 -0.510638 + vertex 0.759238 0.473915 0.489362 + endloop + endfacet + facet normal -0.945659 -0.325161 -0 + outer loop + vertex 0.759238 0.473915 0.489362 + vertex 0.759238 0.473915 -0.510638 + vertex 0.765114 0.456826 -0.510638 + endloop + endfacet + facet normal -0.945659 -0.325161 0 + outer loop + vertex 0.759238 0.473915 0.489362 + vertex 0.765114 0.456826 -0.510638 + vertex 0.765114 0.456826 0.489362 + endloop + endfacet + facet normal -0.961252 -0.275673 -0 + outer loop + vertex 0.765114 0.456826 0.489362 + vertex 0.765114 0.456826 -0.510638 + vertex 0.770122 0.439365 -0.510638 + endloop + endfacet + facet normal -0.961252 -0.275673 0 + outer loop + vertex 0.765114 0.456826 0.489362 + vertex 0.770122 0.439365 -0.510638 + vertex 0.770122 0.439365 0.489362 + endloop + endfacet + facet normal -0.97418 -0.225773 -0 + outer loop + vertex 0.770122 0.439365 0.489362 + vertex 0.770122 0.439365 -0.510638 + vertex 0.774249 0.421558 -0.510638 + endloop + endfacet + facet normal -0.97418 -0.225773 0 + outer loop + vertex 0.770122 0.439365 0.489362 + vertex 0.774249 0.421558 -0.510638 + vertex 0.774249 0.421558 0.489362 + endloop + endfacet + facet normal -0.984461 -0.175603 -0 + outer loop + vertex 0.774249 0.421558 0.489362 + vertex 0.774249 0.421558 -0.510638 + vertex 0.777481 0.403436 -0.510638 + endloop + endfacet + facet normal -0.984461 -0.175603 0 + outer loop + vertex 0.774249 0.421558 0.489362 + vertex 0.777481 0.403436 -0.510638 + vertex 0.777481 0.403436 0.489362 + endloop + endfacet + facet normal -0.992117 -0.125314 -0 + outer loop + vertex 0.777481 0.403436 0.489362 + vertex 0.777481 0.403436 -0.510638 + vertex 0.779806 0.385028 -0.510638 + endloop + endfacet + facet normal -0.992117 -0.125314 0 + outer loop + vertex 0.777481 0.403436 0.489362 + vertex 0.779806 0.385028 -0.510638 + vertex 0.779806 0.385028 0.489362 + endloop + endfacet + facet normal -0.99718 -0.0750412 -0 + outer loop + vertex 0.779806 0.385028 0.489362 + vertex 0.779806 0.385028 -0.510638 + vertex 0.781211 0.366362 -0.510638 + endloop + endfacet + facet normal -0.99718 -0.0750412 0 + outer loop + vertex 0.779806 0.385028 0.489362 + vertex 0.781211 0.366362 -0.510638 + vertex 0.781211 0.366362 0.489362 + endloop + endfacet + facet normal -0.999689 -0.0249285 -0 + outer loop + vertex 0.781211 0.366362 0.489362 + vertex 0.781211 0.366362 -0.510638 + vertex 0.781682 0.347466 -0.510638 + endloop + endfacet + facet normal -0.999689 -0.0249285 0 + outer loop + vertex 0.781211 0.366362 0.489362 + vertex 0.781682 0.347466 -0.510638 + vertex 0.781682 0.347466 0.489362 + endloop + endfacet + facet normal -0.999687 0.0249986 0 + outer loop + vertex 0.781682 0.347466 0.489362 + vertex 0.781682 0.347466 -0.510638 + vertex 0.781224 0.329132 -0.510638 + endloop + endfacet + facet normal -0.999687 0.0249986 0 + outer loop + vertex 0.781682 0.347466 0.489362 + vertex 0.781224 0.329132 -0.510638 + vertex 0.781224 0.329132 0.489362 + endloop + endfacet + facet normal -0.99718 0.0750475 0 + outer loop + vertex 0.781224 0.329132 0.489362 + vertex 0.781224 0.329132 -0.510638 + vertex 0.779855 0.31095 -0.510638 + endloop + endfacet + facet normal -0.99718 0.0750475 0 + outer loop + vertex 0.781224 0.329132 0.489362 + vertex 0.779855 0.31095 -0.510638 + vertex 0.779855 0.31095 0.489362 + endloop + endfacet + facet normal -0.99215 0.125057 0 + outer loop + vertex 0.779855 0.31095 0.489362 + vertex 0.779855 0.31095 -0.510638 + vertex 0.777587 0.292954 -0.510638 + endloop + endfacet + facet normal -0.99215 0.125057 0 + outer loop + vertex 0.779855 0.31095 0.489362 + vertex 0.777587 0.292954 -0.510638 + vertex 0.777587 0.292954 0.489362 + endloop + endfacet + facet normal -0.984582 0.174923 0 + outer loop + vertex 0.777587 0.292954 0.489362 + vertex 0.777587 0.292954 -0.510638 + vertex 0.774429 0.275177 -0.510638 + endloop + endfacet + facet normal -0.984582 0.174923 0 + outer loop + vertex 0.777587 0.292954 0.489362 + vertex 0.774429 0.275177 -0.510638 + vertex 0.774429 0.275177 0.489362 + endloop + endfacet + facet normal -0.974465 0.22454 0 + outer loop + vertex 0.774429 0.275177 0.489362 + vertex 0.774429 0.275177 -0.510638 + vertex 0.77039 0.257652 -0.510638 + endloop + endfacet + facet normal -0.974465 0.22454 0 + outer loop + vertex 0.774429 0.275177 0.489362 + vertex 0.77039 0.257652 -0.510638 + vertex 0.77039 0.257652 0.489362 + endloop + endfacet + facet normal -0.961785 0.273806 0 + outer loop + vertex 0.77039 0.257652 0.489362 + vertex 0.77039 0.257652 -0.510638 + vertex 0.765482 0.24041 -0.510638 + endloop + endfacet + facet normal -0.961785 0.273806 0 + outer loop + vertex 0.77039 0.257652 0.489362 + vertex 0.765482 0.24041 -0.510638 + vertex 0.765482 0.24041 0.489362 + endloop + endfacet + facet normal -0.94653 0.322617 0 + outer loop + vertex 0.765482 0.24041 0.489362 + vertex 0.765482 0.24041 -0.510638 + vertex 0.759714 0.223487 -0.510638 + endloop + endfacet + facet normal -0.94653 0.322617 0 + outer loop + vertex 0.765482 0.24041 0.489362 + vertex 0.759714 0.223487 -0.510638 + vertex 0.759714 0.223487 0.489362 + endloop + endfacet + facet normal -0.928692 0.370853 0 + outer loop + vertex 0.759714 0.223487 0.489362 + vertex 0.759714 0.223487 -0.510638 + vertex 0.753095 0.206913 -0.510638 + endloop + endfacet + facet normal -0.928692 0.370853 0 + outer loop + vertex 0.759714 0.223487 0.489362 + vertex 0.753095 0.206913 -0.510638 + vertex 0.753095 0.206913 0.489362 + endloop + endfacet + facet normal -0.908263 0.4184 0 + outer loop + vertex 0.753095 0.206913 0.489362 + vertex 0.753095 0.206913 -0.510638 + vertex 0.745637 0.190722 -0.510638 + endloop + endfacet + facet normal -0.908263 0.4184 0 + outer loop + vertex 0.753095 0.206913 0.489362 + vertex 0.745637 0.190722 -0.510638 + vertex 0.745637 0.190722 0.489362 + endloop + endfacet + facet normal -0.885243 0.465129 0 + outer loop + vertex 0.745637 0.190722 0.489362 + vertex 0.745637 0.190722 -0.510638 + vertex 0.737349 0.174948 -0.510638 + endloop + endfacet + facet normal -0.885243 0.465129 0 + outer loop + vertex 0.745637 0.190722 0.489362 + vertex 0.737349 0.174948 -0.510638 + vertex 0.737349 0.174948 0.489362 + endloop + endfacet + facet normal -0.85964 0.5109 0 + outer loop + vertex 0.737349 0.174948 0.489362 + vertex 0.737349 0.174948 -0.510638 + vertex 0.72824 0.159622 -0.510638 + endloop + endfacet + facet normal -0.85964 0.5109 0 + outer loop + vertex 0.737349 0.174948 0.489362 + vertex 0.72824 0.159622 -0.510638 + vertex 0.72824 0.159622 0.489362 + endloop + endfacet + facet normal -0.83147 0.55557 0 + outer loop + vertex 0.72824 0.159622 0.489362 + vertex 0.72824 0.159622 -0.510638 + vertex 0.718322 0.144778 -0.510638 + endloop + endfacet + facet normal -0.83147 0.55557 0 + outer loop + vertex 0.72824 0.159622 0.489362 + vertex 0.718322 0.144778 -0.510638 + vertex 0.718322 0.144778 0.489362 + endloop + endfacet + facet normal -0.800765 0.598978 0 + outer loop + vertex 0.718322 0.144778 0.489362 + vertex 0.718322 0.144778 -0.510638 + vertex 0.707604 0.130449 -0.510638 + endloop + endfacet + facet normal -0.800765 0.598978 0 + outer loop + vertex 0.718322 0.144778 0.489362 + vertex 0.707604 0.130449 -0.510638 + vertex 0.707604 0.130449 0.489362 + endloop + endfacet + facet normal -0.767573 0.640961 0 + outer loop + vertex 0.707604 0.130449 0.489362 + vertex 0.707604 0.130449 -0.510638 + vertex 0.696095 0.116668 -0.510638 + endloop + endfacet + facet normal -0.767573 0.640961 0 + outer loop + vertex 0.707604 0.130449 0.489362 + vertex 0.696095 0.116668 -0.510638 + vertex 0.696095 0.116668 0.489362 + endloop + endfacet + facet normal -0.731961 0.681346 0 + outer loop + vertex 0.696095 0.116668 0.489362 + vertex 0.696095 0.116668 -0.510638 + vertex 0.683807 0.103466 -0.510638 + endloop + endfacet + facet normal -0.731961 0.681346 0 + outer loop + vertex 0.696095 0.116668 0.489362 + vertex 0.683807 0.103466 -0.510638 + vertex 0.683807 0.103466 0.489362 + endloop + endfacet + facet normal -0.694019 0.719957 0 + outer loop + vertex 0.683807 0.103466 0.489362 + vertex 0.683807 0.103466 -0.510638 + vertex 0.670749 0.0908786 -0.510638 + endloop + endfacet + facet normal -0.694019 0.719957 0 + outer loop + vertex 0.683807 0.103466 0.489362 + vertex 0.670749 0.0908786 -0.510638 + vertex 0.670749 0.0908786 0.489362 + endloop + endfacet + facet normal -0.653859 0.756616 0 + outer loop + vertex 0.670749 0.0908786 0.489362 + vertex 0.670749 0.0908786 -0.510638 + vertex 0.65693 0.0789369 -0.510638 + endloop + endfacet + facet normal -0.653859 0.756616 0 + outer loop + vertex 0.670749 0.0908786 0.489362 + vertex 0.65693 0.0789369 -0.510638 + vertex 0.65693 0.0789369 0.489362 + endloop + endfacet + facet normal -0.611623 0.791149 0 + outer loop + vertex 0.65693 0.0789369 0.489362 + vertex 0.65693 0.0789369 -0.510638 + vertex 0.642362 0.0676744 -0.510638 + endloop + endfacet + facet normal -0.611623 0.791149 0 + outer loop + vertex 0.65693 0.0789369 0.489362 + vertex 0.642362 0.0676744 -0.510638 + vertex 0.642362 0.0676744 0.489362 + endloop + endfacet + facet normal -0.56748 0.823387 0 + outer loop + vertex 0.642362 0.0676744 0.489362 + vertex 0.642362 0.0676744 -0.510638 + vertex 0.627054 0.0571239 -0.510638 + endloop + endfacet + facet normal -0.56748 0.823387 0 + outer loop + vertex 0.642362 0.0676744 0.489362 + vertex 0.627054 0.0571239 -0.510638 + vertex 0.627054 0.0571239 0.489362 + endloop + endfacet + facet normal -0.521621 0.853177 0 + outer loop + vertex 0.627054 0.0571239 0.489362 + vertex 0.627054 0.0571239 -0.510638 + vertex 0.611015 0.0473182 -0.510638 + endloop + endfacet + facet normal -0.521621 0.853177 0 + outer loop + vertex 0.627054 0.0571239 0.489362 + vertex 0.611015 0.0473182 -0.510638 + vertex 0.611015 0.0473182 0.489362 + endloop + endfacet + facet normal -0.474268 0.88038 0 + outer loop + vertex 0.611015 0.0473182 0.489362 + vertex 0.611015 0.0473182 -0.510638 + vertex 0.594257 0.0382904 -0.510638 + endloop + endfacet + facet normal -0.474268 0.88038 0 + outer loop + vertex 0.611015 0.0473182 0.489362 + vertex 0.594257 0.0382904 -0.510638 + vertex 0.594257 0.0382904 0.489362 + endloop + endfacet + facet normal -0.425661 0.904883 0 + outer loop + vertex 0.594257 0.0382904 0.489362 + vertex 0.594257 0.0382904 -0.510638 + vertex 0.576789 0.0300732 -0.510638 + endloop + endfacet + facet normal -0.425661 0.904883 0 + outer loop + vertex 0.594257 0.0382904 0.489362 + vertex 0.576789 0.0300732 -0.510638 + vertex 0.576789 0.0300732 0.489362 + endloop + endfacet + facet normal -0.37606 0.926596 0 + outer loop + vertex 0.576789 0.0300732 0.489362 + vertex 0.576789 0.0300732 -0.510638 + vertex 0.55862 0.0226996 -0.510638 + endloop + endfacet + facet normal -0.37606 0.926596 0 + outer loop + vertex 0.576789 0.0300732 0.489362 + vertex 0.55862 0.0226996 -0.510638 + vertex 0.55862 0.0226996 0.489362 + endloop + endfacet + facet normal -0.325736 0.945461 0 + outer loop + vertex 0.55862 0.0226996 0.489362 + vertex 0.55862 0.0226996 -0.510638 + vertex 0.539762 0.0162024 -0.510638 + endloop + endfacet + facet normal -0.325736 0.945461 0 + outer loop + vertex 0.55862 0.0226996 0.489362 + vertex 0.539762 0.0162024 -0.510638 + vertex 0.539762 0.0162024 0.489362 + endloop + endfacet + facet normal -0.27497 0.961453 0 + outer loop + vertex 0.539762 0.0162024 0.489362 + vertex 0.539762 0.0162024 -0.510638 + vertex 0.520224 0.0106145 -0.510638 + endloop + endfacet + facet normal -0.27497 0.961453 0 + outer loop + vertex 0.539762 0.0162024 0.489362 + vertex 0.520224 0.0106145 -0.510638 + vertex 0.520224 0.0106145 0.489362 + endloop + endfacet + facet normal -0.224043 0.974579 0 + outer loop + vertex 0.520224 0.0106145 0.489362 + vertex 0.520224 0.0106145 -0.510638 + vertex 0.500015 0.00596891 -0.510638 + endloop + endfacet + facet normal -0.224043 0.974579 0 + outer loop + vertex 0.520224 0.0106145 0.489362 + vertex 0.500015 0.00596891 -0.510638 + vertex 0.500015 0.00596891 0.489362 + endloop + endfacet + facet normal -0.17323 0.984881 0 + outer loop + vertex 0.500015 0.00596891 0.489362 + vertex 0.500015 0.00596891 -0.510638 + vertex 0.479147 0.00229839 -0.510638 + endloop + endfacet + facet normal -0.17323 0.984881 0 + outer loop + vertex 0.500015 0.00596891 0.489362 + vertex 0.479147 0.00229839 -0.510638 + vertex 0.479147 0.00229839 0.489362 + endloop + endfacet + facet normal -0.122796 0.992432 0 + outer loop + vertex 0.479147 0.00229839 0.489362 + vertex 0.479147 0.00229839 -0.510638 + vertex 0.457629 -0.00036413 -0.510638 + endloop + endfacet + facet normal -0.122796 0.992432 0 + outer loop + vertex 0.479147 0.00229839 0.489362 + vertex 0.457629 -0.00036413 -0.510638 + vertex 0.457629 -0.00036413 0.489362 + endloop + endfacet + facet normal -0.0729886 0.997333 0 + outer loop + vertex 0.457629 -0.00036413 0.489362 + vertex 0.457629 -0.00036413 -0.510638 + vertex 0.43547 -0.00198576 -0.510638 + endloop + endfacet + facet normal -0.0729886 0.997333 0 + outer loop + vertex 0.457629 -0.00036413 0.489362 + vertex 0.43547 -0.00198576 -0.510638 + vertex 0.43547 -0.00198576 0.489362 + endloop + endfacet + facet normal -0.0240339 0.999711 0 + outer loop + vertex 0.43547 -0.00198576 0.489362 + vertex 0.43547 -0.00198576 -0.510638 + vertex 0.412682 -0.00253361 -0.510638 + endloop + endfacet + facet normal -0.0240339 0.999711 0 + outer loop + vertex 0.43547 -0.00198576 0.489362 + vertex 0.412682 -0.00253361 -0.510638 + vertex 0.412682 -0.00253361 0.489362 + endloop + endfacet + facet normal 0.024717 0.999694 0 + outer loop + vertex 0.412682 -0.00253361 0.489362 + vertex 0.412682 -0.00253361 -0.510638 + vertex 0.390658 -0.00198906 -0.510638 + endloop + endfacet + facet normal 0.024717 0.999694 0 + outer loop + vertex 0.412682 -0.00253361 0.489362 + vertex 0.390658 -0.00198906 -0.510638 + vertex 0.390658 -0.00198906 0.489362 + endloop + endfacet + facet normal 0.0749079 0.99719 0 + outer loop + vertex 0.390658 -0.00198906 0.489362 + vertex 0.390658 -0.00198906 -0.510638 + vertex 0.369193 -0.000376658 -0.510638 + endloop + endfacet + facet normal 0.0749079 0.99719 0 + outer loop + vertex 0.390658 -0.00198906 0.489362 + vertex 0.369193 -0.000376658 -0.510638 + vertex 0.369193 -0.000376658 0.489362 + endloop + endfacet + facet normal 0.12574 0.992063 0 + outer loop + vertex 0.369193 -0.000376658 0.489362 + vertex 0.369193 -0.000376658 -0.510638 + vertex 0.348301 0.00227131 -0.510638 + endloop + endfacet + facet normal 0.12574 0.992063 0 + outer loop + vertex 0.369193 -0.000376658 0.489362 + vertex 0.348301 0.00227131 -0.510638 + vertex 0.348301 0.00227131 0.489362 + endloop + endfacet + facet normal 0.176977 0.984215 0 + outer loop + vertex 0.348301 0.00227131 0.489362 + vertex 0.348301 0.00227131 -0.510638 + vertex 0.327995 0.0059226 -0.510638 + endloop + endfacet + facet normal 0.176977 0.984215 0 + outer loop + vertex 0.348301 0.00227131 0.489362 + vertex 0.327995 0.0059226 -0.510638 + vertex 0.327995 0.0059226 0.489362 + endloop + endfacet + facet normal 0.228362 0.973576 0 + outer loop + vertex 0.327995 0.0059226 0.489362 + vertex 0.327995 0.0059226 -0.510638 + vertex 0.308289 0.010545 -0.510638 + endloop + endfacet + facet normal 0.228362 0.973576 0 + outer loop + vertex 0.327995 0.0059226 0.489362 + vertex 0.308289 0.010545 -0.510638 + vertex 0.308289 0.010545 0.489362 + endloop + endfacet + facet normal 0.279633 0.960107 0 + outer loop + vertex 0.308289 0.010545 0.489362 + vertex 0.308289 0.010545 -0.510638 + vertex 0.289194 0.0161063 -0.510638 + endloop + endfacet + facet normal 0.279633 0.960107 0 + outer loop + vertex 0.308289 0.010545 0.489362 + vertex 0.289194 0.0161063 -0.510638 + vertex 0.289194 0.0161063 0.489362 + endloop + endfacet + facet normal 0.330522 0.943798 0 + outer loop + vertex 0.289194 0.0161063 0.489362 + vertex 0.289194 0.0161063 -0.510638 + vertex 0.270725 0.0225743 -0.510638 + endloop + endfacet + facet normal 0.330522 0.943798 0 + outer loop + vertex 0.289194 0.0161063 0.489362 + vertex 0.270725 0.0225743 -0.510638 + vertex 0.270725 0.0225743 0.489362 + endloop + endfacet + facet normal 0.380766 0.924672 0 + outer loop + vertex 0.270725 0.0225743 0.489362 + vertex 0.270725 0.0225743 -0.510638 + vertex 0.252894 0.0299167 -0.510638 + endloop + endfacet + facet normal 0.380766 0.924672 0 + outer loop + vertex 0.270725 0.0225743 0.489362 + vertex 0.252894 0.0299167 -0.510638 + vertex 0.252894 0.0299167 0.489362 + endloop + endfacet + facet normal 0.430109 0.902777 0 + outer loop + vertex 0.252894 0.0299167 0.489362 + vertex 0.252894 0.0299167 -0.510638 + vertex 0.235715 0.0381013 -0.510638 + endloop + endfacet + facet normal 0.430109 0.902777 0 + outer loop + vertex 0.252894 0.0299167 0.489362 + vertex 0.235715 0.0381013 -0.510638 + vertex 0.235715 0.0381013 0.489362 + endloop + endfacet + facet normal 0.478308 0.878192 0 + outer loop + vertex 0.235715 0.0381013 0.489362 + vertex 0.235715 0.0381013 -0.510638 + vertex 0.219201 0.0470959 -0.510638 + endloop + endfacet + facet normal 0.478308 0.878192 0 + outer loop + vertex 0.235715 0.0381013 0.489362 + vertex 0.219201 0.0470959 -0.510638 + vertex 0.219201 0.0470959 0.489362 + endloop + endfacet + facet normal 0.52514 0.851016 0 + outer loop + vertex 0.219201 0.0470959 0.489362 + vertex 0.219201 0.0470959 -0.510638 + vertex 0.203364 0.0568684 -0.510638 + endloop + endfacet + facet normal 0.52514 0.851016 0 + outer loop + vertex 0.219201 0.0470959 0.489362 + vertex 0.203364 0.0568684 -0.510638 + vertex 0.203364 0.0568684 0.489362 + endloop + endfacet + facet normal 0.570398 0.821369 0 + outer loop + vertex 0.203364 0.0568684 0.489362 + vertex 0.203364 0.0568684 -0.510638 + vertex 0.188218 0.0673863 -0.510638 + endloop + endfacet + facet normal 0.570398 0.821369 0 + outer loop + vertex 0.203364 0.0568684 0.489362 + vertex 0.188218 0.0673863 -0.510638 + vertex 0.188218 0.0673863 0.489362 + endloop + endfacet + facet normal 0.613899 0.789385 0 + outer loop + vertex 0.188218 0.0673863 0.489362 + vertex 0.188218 0.0673863 -0.510638 + vertex 0.173776 0.0786176 -0.510638 + endloop + endfacet + facet normal 0.613899 0.789385 0 + outer loop + vertex 0.188218 0.0673863 0.489362 + vertex 0.173776 0.0786176 -0.510638 + vertex 0.173776 0.0786176 0.489362 + endloop + endfacet + facet normal 0.655486 0.755208 0 + outer loop + vertex 0.173776 0.0786176 0.489362 + vertex 0.173776 0.0786176 -0.510638 + vertex 0.160052 0.09053 -0.510638 + endloop + endfacet + facet normal 0.655486 0.755208 0 + outer loop + vertex 0.173776 0.0786176 0.489362 + vertex 0.160052 0.09053 -0.510638 + vertex 0.160052 0.09053 0.489362 + endloop + endfacet + facet normal 0.695021 0.718989 0 + outer loop + vertex 0.160052 0.09053 0.489362 + vertex 0.160052 0.09053 -0.510638 + vertex 0.147057 0.103091 -0.510638 + endloop + endfacet + facet normal 0.695021 0.718989 0 + outer loop + vertex 0.160052 0.09053 0.489362 + vertex 0.147057 0.103091 -0.510638 + vertex 0.147057 0.103091 0.489362 + endloop + endfacet + facet normal 0.732392 0.680883 0 + outer loop + vertex 0.147057 0.103091 0.489362 + vertex 0.147057 0.103091 -0.510638 + vertex 0.134806 0.116269 -0.510638 + endloop + endfacet + facet normal 0.732392 0.680883 0 + outer loop + vertex 0.147057 0.103091 0.489362 + vertex 0.134806 0.116269 -0.510638 + vertex 0.134806 0.116269 0.489362 + endloop + endfacet + facet normal 0.767507 0.641041 0 + outer loop + vertex 0.134806 0.116269 0.489362 + vertex 0.134806 0.116269 -0.510638 + vertex 0.123311 0.130032 -0.510638 + endloop + endfacet + facet normal 0.767507 0.641041 0 + outer loop + vertex 0.134806 0.116269 0.489362 + vertex 0.123311 0.130032 -0.510638 + vertex 0.123311 0.130032 0.489362 + endloop + endfacet + facet normal 0.800291 0.599612 0 + outer loop + vertex 0.123311 0.130032 0.489362 + vertex 0.123311 0.130032 -0.510638 + vertex 0.112586 0.144346 -0.510638 + endloop + endfacet + facet normal 0.800291 0.599612 0 + outer loop + vertex 0.123311 0.130032 0.489362 + vertex 0.112586 0.144346 -0.510638 + vertex 0.112586 0.144346 0.489362 + endloop + endfacet + facet normal 0.830685 0.556743 0 + outer loop + vertex 0.112586 0.144346 0.489362 + vertex 0.112586 0.144346 -0.510638 + vertex 0.102644 0.159181 -0.510638 + endloop + endfacet + facet normal 0.830685 0.556743 0 + outer loop + vertex 0.112586 0.144346 0.489362 + vertex 0.102644 0.159181 -0.510638 + vertex 0.102644 0.159181 0.489362 + endloop + endfacet + facet normal 0.858646 0.512568 0 + outer loop + vertex 0.102644 0.159181 0.489362 + vertex 0.102644 0.159181 -0.510638 + vertex 0.093497 0.174503 -0.510638 + endloop + endfacet + facet normal 0.858646 0.512568 0 + outer loop + vertex 0.102644 0.159181 0.489362 + vertex 0.093497 0.174503 -0.510638 + vertex 0.093497 0.174503 0.489362 + endloop + endfacet + facet normal 0.88414 0.467221 0 + outer loop + vertex 0.093497 0.174503 0.489362 + vertex 0.093497 0.174503 -0.510638 + vertex 0.0851591 0.190281 -0.510638 + endloop + endfacet + facet normal 0.88414 0.467221 0 + outer loop + vertex 0.093497 0.174503 0.489362 + vertex 0.0851591 0.190281 -0.510638 + vertex 0.0851591 0.190281 0.489362 + endloop + endfacet + facet normal 0.907142 0.420825 0 + outer loop + vertex 0.0851591 0.190281 0.489362 + vertex 0.0851591 0.190281 -0.510638 + vertex 0.0776433 0.206483 -0.510638 + endloop + endfacet + facet normal 0.907142 0.420825 0 + outer loop + vertex 0.0851591 0.190281 0.489362 + vertex 0.0776433 0.206483 -0.510638 + vertex 0.0776433 0.206483 0.489362 + endloop + endfacet + facet normal 0.927631 0.373498 0 + outer loop + vertex 0.0776433 0.206483 0.489362 + vertex 0.0776433 0.206483 -0.510638 + vertex 0.0709626 0.223075 -0.510638 + endloop + endfacet + facet normal 0.927631 0.373498 0 + outer loop + vertex 0.0776433 0.206483 0.489362 + vertex 0.0709626 0.223075 -0.510638 + vertex 0.0709626 0.223075 0.489362 + endloop + endfacet + facet normal 0.945593 0.325353 0 + outer loop + vertex 0.0709626 0.223075 0.489362 + vertex 0.0709626 0.223075 -0.510638 + vertex 0.0651301 0.240026 -0.510638 + endloop + endfacet + facet normal 0.945593 0.325353 0 + outer loop + vertex 0.0709626 0.223075 0.489362 + vertex 0.0651301 0.240026 -0.510638 + vertex 0.0651301 0.240026 0.489362 + endloop + endfacet + facet normal 0.961014 0.276499 0 + outer loop + vertex 0.0651301 0.240026 0.489362 + vertex 0.0651301 0.240026 -0.510638 + vertex 0.060159 0.257304 -0.510638 + endloop + endfacet + facet normal 0.961014 0.276499 0 + outer loop + vertex 0.0651301 0.240026 0.489362 + vertex 0.060159 0.257304 -0.510638 + vertex 0.060159 0.257304 0.489362 + endloop + endfacet + facet normal 0.973884 0.227045 0 + outer loop + vertex 0.060159 0.257304 0.489362 + vertex 0.060159 0.257304 -0.510638 + vertex 0.0560623 0.274877 -0.510638 + endloop + endfacet + facet normal 0.973884 0.227045 0 + outer loop + vertex 0.060159 0.257304 0.489362 + vertex 0.0560623 0.274877 -0.510638 + vertex 0.0560623 0.274877 0.489362 + endloop + endfacet + facet normal 0.984194 0.177095 0 + outer loop + vertex 0.0560623 0.274877 0.489362 + vertex 0.0560623 0.274877 -0.510638 + vertex 0.0528531 0.292711 -0.510638 + endloop + endfacet + facet normal 0.984194 0.177095 0 + outer loop + vertex 0.0560623 0.274877 0.489362 + vertex 0.0528531 0.292711 -0.510638 + vertex 0.0528531 0.292711 0.489362 + endloop + endfacet + facet normal 0.991934 0.126759 0 + outer loop + vertex 0.0528531 0.292711 0.489362 + vertex 0.0528531 0.292711 -0.510638 + vertex 0.0505447 0.310776 -0.510638 + endloop + endfacet + facet normal 0.991934 0.126759 0 + outer loop + vertex 0.0528531 0.292711 0.489362 + vertex 0.0505447 0.310776 -0.510638 + vertex 0.0505447 0.310776 0.489362 + endloop + endfacet + facet normal 0.997096 0.0761484 0 + outer loop + vertex 0.0505447 0.310776 0.489362 + vertex 0.0505447 0.310776 -0.510638 + vertex 0.04915 0.329038 -0.510638 + endloop + endfacet + facet normal 0.997096 0.0761484 0 + outer loop + vertex 0.0505447 0.310776 0.489362 + vertex 0.04915 0.329038 -0.510638 + vertex 0.04915 0.329038 0.489362 + endloop + endfacet + facet normal 0.999678 0.0253779 0 + outer loop + vertex 0.04915 0.329038 0.489362 + vertex 0.04915 0.329038 -0.510638 + vertex 0.0486821 0.347466 -0.510638 + endloop + endfacet + facet normal 0.999678 0.0253779 0 + outer loop + vertex 0.04915 0.329038 0.489362 + vertex 0.0486821 0.347466 -0.510638 + vertex 0.0486821 0.347466 0.489362 + endloop + endfacet + facet normal 0.999673 -0.0255719 0 + outer loop + vertex 0.0486821 0.347466 0.489362 + vertex 0.0486821 0.347466 -0.510638 + vertex 0.0491631 0.366268 -0.510638 + endloop + endfacet + facet normal 0.999673 -0.0255719 0 + outer loop + vertex 0.0486821 0.347466 0.489362 + vertex 0.0491631 0.366268 -0.510638 + vertex 0.0491631 0.366268 0.489362 + endloop + endfacet + facet normal 0.997044 -0.0768271 0 + outer loop + vertex 0.0491631 0.366268 0.489362 + vertex 0.0491631 0.366268 -0.510638 + vertex 0.0505952 0.384854 -0.510638 + endloop + endfacet + facet normal 0.997044 -0.0768271 0 + outer loop + vertex 0.0491631 0.366268 0.489362 + vertex 0.0505952 0.384854 -0.510638 + vertex 0.0505952 0.384854 0.489362 + endloop + endfacet + facet normal 0.991766 -0.128061 0 + outer loop + vertex 0.0505952 0.384854 0.489362 + vertex 0.0505952 0.384854 -0.510638 + vertex 0.0529633 0.403193 -0.510638 + endloop + endfacet + facet normal 0.991766 -0.128061 0 + outer loop + vertex 0.0505952 0.384854 0.489362 + vertex 0.0529633 0.403193 -0.510638 + vertex 0.0529633 0.403193 0.489362 + endloop + endfacet + facet normal 0.983828 -0.179114 0 + outer loop + vertex 0.0529633 0.403193 0.489362 + vertex 0.0529633 0.403193 -0.510638 + vertex 0.0562521 0.421258 -0.510638 + endloop + endfacet + facet normal 0.983828 -0.179114 0 + outer loop + vertex 0.0529633 0.403193 0.489362 + vertex 0.0562521 0.421258 -0.510638 + vertex 0.0562521 0.421258 0.489362 + endloop + endfacet + facet normal 0.973229 -0.229839 0 + outer loop + vertex 0.0562521 0.421258 0.489362 + vertex 0.0562521 0.421258 -0.510638 + vertex 0.0604462 0.439017 -0.510638 + endloop + endfacet + facet normal 0.973229 -0.229839 0 + outer loop + vertex 0.0562521 0.421258 0.489362 + vertex 0.0604462 0.439017 -0.510638 + vertex 0.0604462 0.439017 0.489362 + endloop + endfacet + facet normal 0.959973 -0.280091 0 + outer loop + vertex 0.0604462 0.439017 0.489362 + vertex 0.0604462 0.439017 -0.510638 + vertex 0.0655303 0.456442 -0.510638 + endloop + endfacet + facet normal 0.959973 -0.280091 0 + outer loop + vertex 0.0604462 0.439017 0.489362 + vertex 0.0655303 0.456442 -0.510638 + vertex 0.0655303 0.456442 0.489362 + endloop + endfacet + facet normal 0.944076 -0.329729 0 + outer loop + vertex 0.0655303 0.456442 0.489362 + vertex 0.0655303 0.456442 -0.510638 + vertex 0.071489 0.473503 -0.510638 + endloop + endfacet + facet normal 0.944076 -0.329729 0 + outer loop + vertex 0.0655303 0.456442 0.489362 + vertex 0.071489 0.473503 -0.510638 + vertex 0.071489 0.473503 0.489362 + endloop + endfacet + facet normal 0.925555 -0.378612 0 + outer loop + vertex 0.071489 0.473503 0.489362 + vertex 0.071489 0.473503 -0.510638 + vertex 0.0783071 0.490171 -0.510638 + endloop + endfacet + facet normal 0.925555 -0.378612 0 + outer loop + vertex 0.071489 0.473503 0.489362 + vertex 0.0783071 0.490171 -0.510638 + vertex 0.0783071 0.490171 0.489362 + endloop + endfacet + facet normal 0.904439 -0.426603 0 + outer loop + vertex 0.0783071 0.490171 0.489362 + vertex 0.0783071 0.490171 -0.510638 + vertex 0.0859692 0.506415 -0.510638 + endloop + endfacet + facet normal 0.904439 -0.426603 0 + outer loop + vertex 0.0783071 0.490171 0.489362 + vertex 0.0859692 0.506415 -0.510638 + vertex 0.0859692 0.506415 0.489362 + endloop + endfacet + facet normal 0.880762 -0.47356 0 + outer loop + vertex 0.0859692 0.506415 0.489362 + vertex 0.0859692 0.506415 -0.510638 + vertex 0.09446 0.522207 -0.510638 + endloop + endfacet + facet normal 0.880762 -0.47356 0 + outer loop + vertex 0.0859692 0.506415 0.489362 + vertex 0.09446 0.522207 -0.510638 + vertex 0.09446 0.522207 0.489362 + endloop + endfacet + facet normal 0.854563 -0.519347 0 + outer loop + vertex 0.09446 0.522207 0.489362 + vertex 0.09446 0.522207 -0.510638 + vertex 0.103764 0.537517 -0.510638 + endloop + endfacet + facet normal 0.854563 -0.519347 0 + outer loop + vertex 0.09446 0.522207 0.489362 + vertex 0.103764 0.537517 -0.510638 + vertex 0.103764 0.537517 0.489362 + endloop + endfacet + facet normal 0.825896 -0.563822 0 + outer loop + vertex 0.103764 0.537517 0.489362 + vertex 0.103764 0.537517 -0.510638 + vertex 0.113866 0.552314 -0.510638 + endloop + endfacet + facet normal 0.825896 -0.563822 0 + outer loop + vertex 0.103764 0.537517 0.489362 + vertex 0.113866 0.552314 -0.510638 + vertex 0.113866 0.552314 0.489362 + endloop + endfacet + facet normal 0.79482 -0.606845 0 + outer loop + vertex 0.113866 0.552314 0.489362 + vertex 0.113866 0.552314 -0.510638 + vertex 0.124751 0.566571 -0.510638 + endloop + endfacet + facet normal 0.79482 -0.606845 0 + outer loop + vertex 0.113866 0.552314 0.489362 + vertex 0.124751 0.566571 -0.510638 + vertex 0.124751 0.566571 0.489362 + endloop + endfacet + facet normal 0.761406 -0.648275 0 + outer loop + vertex 0.124751 0.566571 0.489362 + vertex 0.124751 0.566571 -0.510638 + vertex 0.136403 0.580256 -0.510638 + endloop + endfacet + facet normal 0.761406 -0.648275 0 + outer loop + vertex 0.124751 0.566571 0.489362 + vertex 0.136403 0.580256 -0.510638 + vertex 0.136403 0.580256 0.489362 + endloop + endfacet + facet normal 0.725739 -0.68797 0 + outer loop + vertex 0.136403 0.580256 0.489362 + vertex 0.136403 0.580256 -0.510638 + vertex 0.148807 0.593341 -0.510638 + endloop + endfacet + facet normal 0.725739 -0.68797 0 + outer loop + vertex 0.136403 0.580256 0.489362 + vertex 0.148807 0.593341 -0.510638 + vertex 0.148807 0.593341 0.489362 + endloop + endfacet + facet normal 0.687916 -0.72579 0 + outer loop + vertex 0.148807 0.593341 0.489362 + vertex 0.148807 0.593341 -0.510638 + vertex 0.161948 0.605796 -0.510638 + endloop + endfacet + facet normal 0.687916 -0.72579 0 + outer loop + vertex 0.148807 0.593341 0.489362 + vertex 0.161948 0.605796 -0.510638 + vertex 0.161948 0.605796 0.489362 + endloop + endfacet + facet normal 0.648054 -0.761594 0 + outer loop + vertex 0.161948 0.605796 0.489362 + vertex 0.161948 0.605796 -0.510638 + vertex 0.17581 0.617592 -0.510638 + endloop + endfacet + facet normal 0.648054 -0.761594 0 + outer loop + vertex 0.161948 0.605796 0.489362 + vertex 0.17581 0.617592 -0.510638 + vertex 0.17581 0.617592 0.489362 + endloop + endfacet + facet normal 0.606282 -0.79525 0 + outer loop + vertex 0.17581 0.617592 0.489362 + vertex 0.17581 0.617592 -0.510638 + vertex 0.190378 0.628698 -0.510638 + endloop + endfacet + facet normal 0.606282 -0.79525 0 + outer loop + vertex 0.17581 0.617592 0.489362 + vertex 0.190378 0.628698 -0.510638 + vertex 0.190378 0.628698 0.489362 + endloop + endfacet + facet normal 0.562745 -0.82663 0 + outer loop + vertex 0.190378 0.628698 0.489362 + vertex 0.190378 0.628698 -0.510638 + vertex 0.205637 0.639086 -0.510638 + endloop + endfacet + facet normal 0.562745 -0.82663 0 + outer loop + vertex 0.190378 0.628698 0.489362 + vertex 0.205637 0.639086 -0.510638 + vertex 0.205637 0.639086 0.489362 + endloop + endfacet + facet normal 0.517613 -0.855615 0 + outer loop + vertex 0.205637 0.639086 0.489362 + vertex 0.205637 0.639086 -0.510638 + vertex 0.221571 0.648726 -0.510638 + endloop + endfacet + facet normal 0.517613 -0.855615 0 + outer loop + vertex 0.205637 0.639086 0.489362 + vertex 0.221571 0.648726 -0.510638 + vertex 0.221571 0.648726 0.489362 + endloop + endfacet + facet normal 0.471065 -0.882098 0 + outer loop + vertex 0.221571 0.648726 0.489362 + vertex 0.221571 0.648726 -0.510638 + vertex 0.238165 0.657587 -0.510638 + endloop + endfacet + facet normal 0.471065 -0.882098 0 + outer loop + vertex 0.221571 0.648726 0.489362 + vertex 0.238165 0.657587 -0.510638 + vertex 0.238165 0.657587 0.489362 + endloop + endfacet + facet normal 0.423303 -0.905988 0 + outer loop + vertex 0.238165 0.657587 0.489362 + vertex 0.238165 0.657587 -0.510638 + vertex 0.255404 0.665642 -0.510638 + endloop + endfacet + facet normal 0.423303 -0.905988 0 + outer loop + vertex 0.238165 0.657587 0.489362 + vertex 0.255404 0.665642 -0.510638 + vertex 0.255404 0.665642 0.489362 + endloop + endfacet + facet normal 0.374533 -0.927214 0 + outer loop + vertex 0.255404 0.665642 0.489362 + vertex 0.255404 0.665642 -0.510638 + vertex 0.273272 0.672859 -0.510638 + endloop + endfacet + facet normal 0.374533 -0.927214 0 + outer loop + vertex 0.255404 0.665642 0.489362 + vertex 0.273272 0.672859 -0.510638 + vertex 0.273272 0.672859 0.489362 + endloop + endfacet + facet normal 0.32498 -0.945721 0 + outer loop + vertex 0.273272 0.672859 0.489362 + vertex 0.273272 0.672859 -0.510638 + vertex 0.291754 0.67921 -0.510638 + endloop + endfacet + facet normal 0.32498 -0.945721 0 + outer loop + vertex 0.273272 0.672859 0.489362 + vertex 0.291754 0.67921 -0.510638 + vertex 0.291754 0.67921 0.489362 + endloop + endfacet + facet normal 0.274881 -0.961478 0 + outer loop + vertex 0.291754 0.67921 0.489362 + vertex 0.291754 0.67921 -0.510638 + vertex 0.310835 0.684665 -0.510638 + endloop + endfacet + facet normal 0.274881 -0.961478 0 + outer loop + vertex 0.291754 0.67921 0.489362 + vertex 0.310835 0.684665 -0.510638 + vertex 0.310835 0.684665 0.489362 + endloop + endfacet + facet normal 0.224467 -0.974482 0 + outer loop + vertex 0.310835 0.684665 0.489362 + vertex 0.310835 0.684665 -0.510638 + vertex 0.330499 0.689195 -0.510638 + endloop + endfacet + facet normal 0.224467 -0.974482 0 + outer loop + vertex 0.310835 0.684665 0.489362 + vertex 0.330499 0.689195 -0.510638 + vertex 0.330499 0.689195 0.489362 + endloop + endfacet + facet normal 0.173977 -0.98475 0 + outer loop + vertex 0.330499 0.689195 0.489362 + vertex 0.330499 0.689195 -0.510638 + vertex 0.350731 0.692769 -0.510638 + endloop + endfacet + facet normal 0.173977 -0.98475 0 + outer loop + vertex 0.330499 0.689195 0.489362 + vertex 0.350731 0.692769 -0.510638 + vertex 0.350731 0.692769 0.489362 + endloop + endfacet + facet normal 0.123643 -0.992327 0 + outer loop + vertex 0.350731 0.692769 0.489362 + vertex 0.350731 0.692769 -0.510638 + vertex 0.371516 0.695359 -0.510638 + endloop + endfacet + facet normal 0.123643 -0.992327 0 + outer loop + vertex 0.350731 0.692769 0.489362 + vertex 0.371516 0.695359 -0.510638 + vertex 0.371516 0.695359 0.489362 + endloop + endfacet + facet normal 0.073691 -0.997281 0 + outer loop + vertex 0.371516 0.695359 0.489362 + vertex 0.371516 0.695359 -0.510638 + vertex 0.392838 0.696935 -0.510638 + endloop + endfacet + facet normal 0.073691 -0.997281 0 + outer loop + vertex 0.371516 0.695359 0.489362 + vertex 0.392838 0.696935 -0.510638 + vertex 0.392838 0.696935 0.489362 + endloop + endfacet + facet normal 0.024335 -0.999704 0 + outer loop + vertex 0.392838 0.696935 0.489362 + vertex 0.392838 0.696935 -0.510638 + vertex 0.414682 0.697466 -0.510638 + endloop + endfacet + facet normal 0.024335 -0.999704 0 + outer loop + vertex 0.392838 0.696935 0.489362 + vertex 0.414682 0.697466 -0.510638 + vertex 0.414682 0.697466 0.489362 + endloop + endfacet + facet normal -0.023783 -0.999717 0 + outer loop + vertex 0.436903 0.696938 -0.510638 + vertex 0.436903 0.696938 0.489362 + vertex 0.414682 0.697466 0.489362 + endloop + endfacet + facet normal -0.023783 -0.999717 0 + outer loop + vertex 0.436903 0.696938 -0.510638 + vertex 0.414682 0.697466 0.489362 + vertex 0.414682 0.697466 -0.510638 + endloop + endfacet + facet normal 0.0731231 -0.997323 0 + outer loop + vertex 0.429846 0.0878337 0.489362 + vertex 0.429846 0.0878337 -0.510638 + vertex 0.444727 0.0889248 -0.510638 + endloop + endfacet + facet normal 0.0731231 -0.997323 0 + outer loop + vertex 0.429846 0.0878337 0.489362 + vertex 0.444727 0.0889248 -0.510638 + vertex 0.444727 0.0889248 0.489362 + endloop + endfacet + facet normal 0.122419 -0.992479 0 + outer loop + vertex 0.444727 0.0889248 0.489362 + vertex 0.444727 0.0889248 -0.510638 + vertex 0.459309 0.0907234 -0.510638 + endloop + endfacet + facet normal 0.122419 -0.992479 0 + outer loop + vertex 0.444727 0.0889248 0.489362 + vertex 0.459309 0.0907234 -0.510638 + vertex 0.459309 0.0907234 0.489362 + endloop + endfacet + facet normal 0.171931 -0.985109 0 + outer loop + vertex 0.459309 0.0907234 0.489362 + vertex 0.459309 0.0907234 -0.510638 + vertex 0.473576 0.0932133 -0.510638 + endloop + endfacet + facet normal 0.171931 -0.985109 0 + outer loop + vertex 0.459309 0.0907234 0.489362 + vertex 0.473576 0.0932133 -0.510638 + vertex 0.473576 0.0932133 0.489362 + endloop + endfacet + facet normal 0.221489 -0.975163 0 + outer loop + vertex 0.473576 0.0932133 0.489362 + vertex 0.473576 0.0932133 -0.510638 + vertex 0.487511 0.0963784 -0.510638 + endloop + endfacet + facet normal 0.221489 -0.975163 0 + outer loop + vertex 0.473576 0.0932133 0.489362 + vertex 0.487511 0.0963784 -0.510638 + vertex 0.487511 0.0963784 0.489362 + endloop + endfacet + facet normal 0.270912 -0.962604 0 + outer loop + vertex 0.487511 0.0963784 0.489362 + vertex 0.487511 0.0963784 -0.510638 + vertex 0.501098 0.100202 -0.510638 + endloop + endfacet + facet normal 0.270912 -0.962604 0 + outer loop + vertex 0.487511 0.0963784 0.489362 + vertex 0.501098 0.100202 -0.510638 + vertex 0.501098 0.100202 0.489362 + endloop + endfacet + facet normal 0.320021 -0.94741 0 + outer loop + vertex 0.501098 0.100202 0.489362 + vertex 0.501098 0.100202 -0.510638 + vertex 0.514322 0.104669 -0.510638 + endloop + endfacet + facet normal 0.320021 -0.94741 0 + outer loop + vertex 0.501098 0.100202 0.489362 + vertex 0.514322 0.104669 -0.510638 + vertex 0.514322 0.104669 0.489362 + endloop + endfacet + facet normal 0.368634 -0.929575 0 + outer loop + vertex 0.514322 0.104669 0.489362 + vertex 0.514322 0.104669 -0.510638 + vertex 0.527165 0.109762 -0.510638 + endloop + endfacet + facet normal 0.368634 -0.929575 0 + outer loop + vertex 0.514322 0.104669 0.489362 + vertex 0.527165 0.109762 -0.510638 + vertex 0.527165 0.109762 0.489362 + endloop + endfacet + facet normal 0.41657 -0.909104 0 + outer loop + vertex 0.527165 0.109762 0.489362 + vertex 0.527165 0.109762 -0.510638 + vertex 0.539611 0.115465 -0.510638 + endloop + endfacet + facet normal 0.41657 -0.909104 0 + outer loop + vertex 0.527165 0.109762 0.489362 + vertex 0.539611 0.115465 -0.510638 + vertex 0.539611 0.115465 0.489362 + endloop + endfacet + facet normal 0.463649 -0.886019 0 + outer loop + vertex 0.539611 0.115465 0.489362 + vertex 0.539611 0.115465 -0.510638 + vertex 0.551645 0.121763 -0.510638 + endloop + endfacet + facet normal 0.463649 -0.886019 0 + outer loop + vertex 0.539611 0.115465 0.489362 + vertex 0.551645 0.121763 -0.510638 + vertex 0.551645 0.121763 0.489362 + endloop + endfacet + facet normal 0.509692 -0.860357 0 + outer loop + vertex 0.551645 0.121763 0.489362 + vertex 0.551645 0.121763 -0.510638 + vertex 0.56325 0.128638 -0.510638 + endloop + endfacet + facet normal 0.509692 -0.860357 0 + outer loop + vertex 0.551645 0.121763 0.489362 + vertex 0.56325 0.128638 -0.510638 + vertex 0.56325 0.128638 0.489362 + endloop + endfacet + facet normal 0.554528 -0.832165 0 + outer loop + vertex 0.56325 0.128638 0.489362 + vertex 0.56325 0.128638 -0.510638 + vertex 0.57441 0.136074 -0.510638 + endloop + endfacet + facet normal 0.554528 -0.832165 0 + outer loop + vertex 0.56325 0.128638 0.489362 + vertex 0.57441 0.136074 -0.510638 + vertex 0.57441 0.136074 0.489362 + endloop + endfacet + facet normal 0.597985 -0.801507 0 + outer loop + vertex 0.57441 0.136074 0.489362 + vertex 0.57441 0.136074 -0.510638 + vertex 0.585109 0.144056 -0.510638 + endloop + endfacet + facet normal 0.597985 -0.801507 0 + outer loop + vertex 0.57441 0.136074 0.489362 + vertex 0.585109 0.144056 -0.510638 + vertex 0.585109 0.144056 0.489362 + endloop + endfacet + facet normal 0.639897 -0.768461 0 + outer loop + vertex 0.585109 0.144056 0.489362 + vertex 0.585109 0.144056 -0.510638 + vertex 0.59533 0.152567 -0.510638 + endloop + endfacet + facet normal 0.639897 -0.768461 0 + outer loop + vertex 0.585109 0.144056 0.489362 + vertex 0.59533 0.152567 -0.510638 + vertex 0.59533 0.152567 0.489362 + endloop + endfacet + facet normal 0.680106 -0.733114 0 + outer loop + vertex 0.59533 0.152567 0.489362 + vertex 0.59533 0.152567 -0.510638 + vertex 0.605057 0.161591 -0.510638 + endloop + endfacet + facet normal 0.680106 -0.733114 0 + outer loop + vertex 0.59533 0.152567 0.489362 + vertex 0.605057 0.161591 -0.510638 + vertex 0.605057 0.161591 0.489362 + endloop + endfacet + facet normal 0.718459 -0.69557 0 + outer loop + vertex 0.605057 0.161591 0.489362 + vertex 0.605057 0.161591 -0.510638 + vertex 0.614275 0.171112 -0.510638 + endloop + endfacet + facet normal 0.718459 -0.69557 0 + outer loop + vertex 0.605057 0.161591 0.489362 + vertex 0.614275 0.171112 -0.510638 + vertex 0.614275 0.171112 0.489362 + endloop + endfacet + facet normal 0.754812 -0.655942 0 + outer loop + vertex 0.614275 0.171112 0.489362 + vertex 0.614275 0.171112 -0.510638 + vertex 0.622966 0.181113 -0.510638 + endloop + endfacet + facet normal 0.754812 -0.655942 0 + outer loop + vertex 0.614275 0.171112 0.489362 + vertex 0.622966 0.181113 -0.510638 + vertex 0.622966 0.181113 0.489362 + endloop + endfacet + facet normal 0.789026 -0.61436 0 + outer loop + vertex 0.622966 0.181113 0.489362 + vertex 0.622966 0.181113 -0.510638 + vertex 0.631114 0.191578 -0.510638 + endloop + endfacet + facet normal 0.789026 -0.61436 0 + outer loop + vertex 0.622966 0.181113 0.489362 + vertex 0.631114 0.191578 -0.510638 + vertex 0.631114 0.191578 0.489362 + endloop + endfacet + facet normal 0.820973 -0.570967 0 + outer loop + vertex 0.631114 0.191578 0.489362 + vertex 0.631114 0.191578 -0.510638 + vertex 0.638704 0.202492 -0.510638 + endloop + endfacet + facet normal 0.820973 -0.570967 0 + outer loop + vertex 0.631114 0.191578 0.489362 + vertex 0.638704 0.202492 -0.510638 + vertex 0.638704 0.202492 0.489362 + endloop + endfacet + facet normal 0.850537 -0.525916 0 + outer loop + vertex 0.638704 0.202492 0.489362 + vertex 0.638704 0.202492 -0.510638 + vertex 0.645719 0.213837 -0.510638 + endloop + endfacet + facet normal 0.850537 -0.525916 0 + outer loop + vertex 0.638704 0.202492 0.489362 + vertex 0.645719 0.213837 -0.510638 + vertex 0.645719 0.213837 0.489362 + endloop + endfacet + facet normal 0.877611 -0.479373 0 + outer loop + vertex 0.645719 0.213837 0.489362 + vertex 0.645719 0.213837 -0.510638 + vertex 0.652143 0.225597 -0.510638 + endloop + endfacet + facet normal 0.877611 -0.479373 0 + outer loop + vertex 0.645719 0.213837 0.489362 + vertex 0.652143 0.225597 -0.510638 + vertex 0.652143 0.225597 0.489362 + endloop + endfacet + facet normal 0.902105 -0.431516 0 + outer loop + vertex 0.652143 0.225597 0.489362 + vertex 0.652143 0.225597 -0.510638 + vertex 0.65796 0.237757 -0.510638 + endloop + endfacet + facet normal 0.902105 -0.431516 0 + outer loop + vertex 0.652143 0.225597 0.489362 + vertex 0.65796 0.237757 -0.510638 + vertex 0.65796 0.237757 0.489362 + endloop + endfacet + facet normal 0.923944 -0.382529 0 + outer loop + vertex 0.65796 0.237757 0.489362 + vertex 0.65796 0.237757 -0.510638 + vertex 0.663153 0.2503 -0.510638 + endloop + endfacet + facet normal 0.923944 -0.382529 0 + outer loop + vertex 0.65796 0.237757 0.489362 + vertex 0.663153 0.2503 -0.510638 + vertex 0.663153 0.2503 0.489362 + endloop + endfacet + facet normal 0.943062 -0.332617 0 + outer loop + vertex 0.663153 0.2503 0.489362 + vertex 0.663153 0.2503 -0.510638 + vertex 0.667706 0.26321 -0.510638 + endloop + endfacet + facet normal 0.943062 -0.332617 0 + outer loop + vertex 0.663153 0.2503 0.489362 + vertex 0.667706 0.26321 -0.510638 + vertex 0.667706 0.26321 0.489362 + endloop + endfacet + facet normal 0.959422 -0.281975 0 + outer loop + vertex 0.667706 0.26321 0.489362 + vertex 0.667706 0.26321 -0.510638 + vertex 0.671603 0.276471 -0.510638 + endloop + endfacet + facet normal 0.959422 -0.281975 0 + outer loop + vertex 0.667706 0.26321 0.489362 + vertex 0.671603 0.276471 -0.510638 + vertex 0.671603 0.276471 0.489362 + endloop + endfacet + facet normal 0.972997 -0.230819 0 + outer loop + vertex 0.671603 0.276471 0.489362 + vertex 0.671603 0.276471 -0.510638 + vertex 0.674829 0.290066 -0.510638 + endloop + endfacet + facet normal 0.972997 -0.230819 0 + outer loop + vertex 0.671603 0.276471 0.489362 + vertex 0.674829 0.290066 -0.510638 + vertex 0.674829 0.290066 0.489362 + endloop + endfacet + facet normal 0.983783 -0.179362 0 + outer loop + vertex 0.674829 0.290066 0.489362 + vertex 0.674829 0.290066 -0.510638 + vertex 0.677365 0.303979 -0.510638 + endloop + endfacet + facet normal 0.983783 -0.179362 0 + outer loop + vertex 0.674829 0.290066 0.489362 + vertex 0.677365 0.303979 -0.510638 + vertex 0.677365 0.303979 0.489362 + endloop + endfacet + facet normal 0.991798 -0.127815 0 + outer loop + vertex 0.677365 0.303979 0.489362 + vertex 0.677365 0.303979 -0.510638 + vertex 0.679197 0.318195 -0.510638 + endloop + endfacet + facet normal 0.991798 -0.127815 0 + outer loop + vertex 0.677365 0.303979 0.489362 + vertex 0.679197 0.318195 -0.510638 + vertex 0.679197 0.318195 0.489362 + endloop + endfacet + facet normal 0.997077 -0.0763974 0 + outer loop + vertex 0.679197 0.318195 0.489362 + vertex 0.679197 0.318195 -0.510638 + vertex 0.680308 0.332696 -0.510638 + endloop + endfacet + facet normal 0.997077 -0.0763974 0 + outer loop + vertex 0.679197 0.318195 0.489362 + vertex 0.680308 0.332696 -0.510638 + vertex 0.680308 0.332696 0.489362 + endloop + endfacet + facet normal 0.99968 -0.0253097 0 + outer loop + vertex 0.680308 0.332696 0.489362 + vertex 0.680308 0.332696 -0.510638 + vertex 0.680682 0.347466 -0.510638 + endloop + endfacet + facet normal 0.99968 -0.0253097 0 + outer loop + vertex 0.680308 0.332696 0.489362 + vertex 0.680682 0.347466 -0.510638 + vertex 0.680682 0.347466 0.489362 + endloop + endfacet + facet normal 0.999684 0.0251466 0 + outer loop + vertex 0.680682 0.347466 0.489362 + vertex 0.680682 0.347466 -0.510638 + vertex 0.680308 0.36233 -0.510638 + endloop + endfacet + facet normal 0.999684 0.0251466 0 + outer loop + vertex 0.680682 0.347466 0.489362 + vertex 0.680308 0.36233 -0.510638 + vertex 0.680308 0.36233 0.489362 + endloop + endfacet + facet normal 0.99711 0.0759765 0 + outer loop + vertex 0.680308 0.36233 0.489362 + vertex 0.680308 0.36233 -0.510638 + vertex 0.679197 0.376912 -0.510638 + endloop + endfacet + facet normal 0.99711 0.0759765 0 + outer loop + vertex 0.680308 0.36233 0.489362 + vertex 0.679197 0.376912 -0.510638 + vertex 0.679197 0.376912 0.489362 + endloop + endfacet + facet normal 0.991876 0.127209 0 + outer loop + vertex 0.679197 0.376912 0.489362 + vertex 0.679197 0.376912 -0.510638 + vertex 0.677365 0.391196 -0.510638 + endloop + endfacet + facet normal 0.991876 0.127209 0 + outer loop + vertex 0.679197 0.376912 0.489362 + vertex 0.677365 0.391196 -0.510638 + vertex 0.677365 0.391196 0.489362 + endloop + endfacet + facet normal 0.983913 0.178648 0 + outer loop + vertex 0.677365 0.391196 0.489362 + vertex 0.677365 0.391196 -0.510638 + vertex 0.674829 0.405167 -0.510638 + endloop + endfacet + facet normal 0.983913 0.178648 0 + outer loop + vertex 0.677365 0.391196 0.489362 + vertex 0.674829 0.405167 -0.510638 + vertex 0.674829 0.405167 0.489362 + endloop + endfacet + facet normal 0.973174 0.230069 0 + outer loop + vertex 0.674829 0.405167 0.489362 + vertex 0.674829 0.405167 -0.510638 + vertex 0.671604 0.418809 -0.510638 + endloop + endfacet + facet normal 0.973174 0.230069 0 + outer loop + vertex 0.674829 0.405167 0.489362 + vertex 0.671604 0.418809 -0.510638 + vertex 0.671604 0.418809 0.489362 + endloop + endfacet + facet normal 0.959633 0.281257 0 + outer loop + vertex 0.671604 0.418809 0.489362 + vertex 0.671604 0.418809 -0.510638 + vertex 0.667706 0.432106 -0.510638 + endloop + endfacet + facet normal 0.959633 0.281257 0 + outer loop + vertex 0.671604 0.418809 0.489362 + vertex 0.667706 0.432106 -0.510638 + vertex 0.667706 0.432106 0.489362 + endloop + endfacet + facet normal 0.943283 0.331989 0 + outer loop + vertex 0.667706 0.432106 0.489362 + vertex 0.667706 0.432106 -0.510638 + vertex 0.663153 0.445044 -0.510638 + endloop + endfacet + facet normal 0.943283 0.331989 0 + outer loop + vertex 0.667706 0.432106 0.489362 + vertex 0.663153 0.445044 -0.510638 + vertex 0.663153 0.445044 0.489362 + endloop + endfacet + facet normal 0.924146 0.382041 0 + outer loop + vertex 0.663153 0.445044 0.489362 + vertex 0.663153 0.445044 -0.510638 + vertex 0.65796 0.457606 -0.510638 + endloop + endfacet + facet normal 0.924146 0.382041 0 + outer loop + vertex 0.663153 0.445044 0.489362 + vertex 0.65796 0.457606 -0.510638 + vertex 0.65796 0.457606 0.489362 + endloop + endfacet + facet normal 0.902254 0.431205 0 + outer loop + vertex 0.65796 0.457606 0.489362 + vertex 0.65796 0.457606 -0.510638 + vertex 0.652143 0.469776 -0.510638 + endloop + endfacet + facet normal 0.902254 0.431205 0 + outer loop + vertex 0.65796 0.457606 0.489362 + vertex 0.652143 0.469776 -0.510638 + vertex 0.652143 0.469776 0.489362 + endloop + endfacet + facet normal 0.87767 0.479265 0 + outer loop + vertex 0.652143 0.469776 0.489362 + vertex 0.652143 0.469776 -0.510638 + vertex 0.645719 0.481541 -0.510638 + endloop + endfacet + facet normal 0.87767 0.479265 0 + outer loop + vertex 0.652143 0.469776 0.489362 + vertex 0.645719 0.481541 -0.510638 + vertex 0.645719 0.481541 0.489362 + endloop + endfacet + facet normal 0.850469 0.526024 0 + outer loop + vertex 0.645719 0.481541 0.489362 + vertex 0.645719 0.481541 -0.510638 + vertex 0.638704 0.492882 -0.510638 + endloop + endfacet + facet normal 0.850469 0.526024 0 + outer loop + vertex 0.645719 0.481541 0.489362 + vertex 0.638704 0.492882 -0.510638 + vertex 0.638704 0.492882 0.489362 + endloop + endfacet + facet normal 0.820745 0.571294 0 + outer loop + vertex 0.638704 0.492882 0.489362 + vertex 0.638704 0.492882 -0.510638 + vertex 0.631114 0.503786 -0.510638 + endloop + endfacet + facet normal 0.820745 0.571294 0 + outer loop + vertex 0.638704 0.492882 0.489362 + vertex 0.631114 0.503786 -0.510638 + vertex 0.631114 0.503786 0.489362 + endloop + endfacet + facet normal 0.78861 0.614893 0 + outer loop + vertex 0.631114 0.503786 0.489362 + vertex 0.631114 0.503786 -0.510638 + vertex 0.622966 0.514237 -0.510638 + endloop + endfacet + facet normal 0.78861 0.614893 0 + outer loop + vertex 0.631114 0.503786 0.489362 + vertex 0.622966 0.514237 -0.510638 + vertex 0.622966 0.514237 0.489362 + endloop + endfacet + facet normal 0.754187 0.65666 0 + outer loop + vertex 0.622966 0.514237 0.489362 + vertex 0.622966 0.514237 -0.510638 + vertex 0.614275 0.524219 -0.510638 + endloop + endfacet + facet normal 0.754187 0.65666 0 + outer loop + vertex 0.622966 0.514237 0.489362 + vertex 0.614275 0.524219 -0.510638 + vertex 0.614275 0.524219 0.489362 + endloop + endfacet + facet normal 0.717609 0.696446 0 + outer loop + vertex 0.614275 0.524219 0.489362 + vertex 0.614275 0.524219 -0.510638 + vertex 0.605057 0.533716 -0.510638 + endloop + endfacet + facet normal 0.717609 0.696446 0 + outer loop + vertex 0.614275 0.524219 0.489362 + vertex 0.605057 0.533716 -0.510638 + vertex 0.605057 0.533716 0.489362 + endloop + endfacet + facet normal 0.679027 0.734113 0 + outer loop + vertex 0.605057 0.533716 0.489362 + vertex 0.605057 0.533716 -0.510638 + vertex 0.59533 0.542714 -0.510638 + endloop + endfacet + facet normal 0.679027 0.734113 0 + outer loop + vertex 0.605057 0.533716 0.489362 + vertex 0.59533 0.542714 -0.510638 + vertex 0.59533 0.542714 0.489362 + endloop + endfacet + facet normal 0.638597 0.769541 0 + outer loop + vertex 0.59533 0.542714 0.489362 + vertex 0.59533 0.542714 -0.510638 + vertex 0.585109 0.551196 -0.510638 + endloop + endfacet + facet normal 0.638597 0.769541 0 + outer loop + vertex 0.59533 0.542714 0.489362 + vertex 0.585109 0.551196 -0.510638 + vertex 0.585109 0.551196 0.489362 + endloop + endfacet + facet normal 0.596478 0.80263 0 + outer loop + vertex 0.585109 0.551196 0.489362 + vertex 0.585109 0.551196 -0.510638 + vertex 0.57441 0.559146 -0.510638 + endloop + endfacet + facet normal 0.596478 0.80263 0 + outer loop + vertex 0.585109 0.551196 0.489362 + vertex 0.57441 0.559146 -0.510638 + vertex 0.57441 0.559146 0.489362 + endloop + endfacet + facet normal 0.552844 0.833285 0 + outer loop + vertex 0.57441 0.559146 0.489362 + vertex 0.57441 0.559146 -0.510638 + vertex 0.56325 0.56655 -0.510638 + endloop + endfacet + facet normal 0.552844 0.833285 0 + outer loop + vertex 0.57441 0.559146 0.489362 + vertex 0.56325 0.56655 -0.510638 + vertex 0.56325 0.56655 0.489362 + endloop + endfacet + facet normal 0.507865 0.861437 0 + outer loop + vertex 0.56325 0.56655 0.489362 + vertex 0.56325 0.56655 -0.510638 + vertex 0.551645 0.573392 -0.510638 + endloop + endfacet + facet normal 0.507865 0.861437 0 + outer loop + vertex 0.56325 0.56655 0.489362 + vertex 0.551645 0.573392 -0.510638 + vertex 0.551645 0.573392 0.489362 + endloop + endfacet + facet normal 0.461726 0.887022 0 + outer loop + vertex 0.551645 0.573392 0.489362 + vertex 0.551645 0.573392 -0.510638 + vertex 0.539611 0.579656 -0.510638 + endloop + endfacet + facet normal 0.461726 0.887022 0 + outer loop + vertex 0.551645 0.573392 0.489362 + vertex 0.539611 0.579656 -0.510638 + vertex 0.539611 0.579656 0.489362 + endloop + endfacet + facet normal 0.4146 0.910004 0 + outer loop + vertex 0.539611 0.579656 0.489362 + vertex 0.539611 0.579656 -0.510638 + vertex 0.527165 0.585327 -0.510638 + endloop + endfacet + facet normal 0.4146 0.910004 0 + outer loop + vertex 0.539611 0.579656 0.489362 + vertex 0.527165 0.585327 -0.510638 + vertex 0.527165 0.585327 0.489362 + endloop + endfacet + facet normal 0.36668 0.930347 0 + outer loop + vertex 0.527165 0.585327 0.489362 + vertex 0.527165 0.585327 -0.510638 + vertex 0.514322 0.590389 -0.510638 + endloop + endfacet + facet normal 0.36668 0.930347 0 + outer loop + vertex 0.527165 0.585327 0.489362 + vertex 0.514322 0.590389 -0.510638 + vertex 0.514322 0.590389 0.489362 + endloop + endfacet + facet normal 0.318137 0.948045 0 + outer loop + vertex 0.514322 0.590389 0.489362 + vertex 0.514322 0.590389 -0.510638 + vertex 0.501098 0.594826 -0.510638 + endloop + endfacet + facet normal 0.318137 0.948045 0 + outer loop + vertex 0.514322 0.590389 0.489362 + vertex 0.501098 0.594826 -0.510638 + vertex 0.501098 0.594826 0.489362 + endloop + endfacet + facet normal 0.269168 0.963093 0 + outer loop + vertex 0.501098 0.594826 0.489362 + vertex 0.501098 0.594826 -0.510638 + vertex 0.487511 0.598624 -0.510638 + endloop + endfacet + facet normal 0.269168 0.963093 0 + outer loop + vertex 0.501098 0.594826 0.489362 + vertex 0.487511 0.598624 -0.510638 + vertex 0.487511 0.598624 0.489362 + endloop + endfacet + facet normal 0.219944 0.975512 0 + outer loop + vertex 0.487511 0.598624 0.489362 + vertex 0.487511 0.598624 -0.510638 + vertex 0.473576 0.601766 -0.510638 + endloop + endfacet + facet normal 0.219944 0.975512 0 + outer loop + vertex 0.487511 0.598624 0.489362 + vertex 0.473576 0.601766 -0.510638 + vertex 0.473576 0.601766 0.489362 + endloop + endfacet + facet normal 0.170642 0.985333 0 + outer loop + vertex 0.473576 0.601766 0.489362 + vertex 0.473576 0.601766 -0.510638 + vertex 0.459309 0.604236 -0.510638 + endloop + endfacet + facet normal 0.170642 0.985333 0 + outer loop + vertex 0.473576 0.601766 0.489362 + vertex 0.459309 0.604236 -0.510638 + vertex 0.459309 0.604236 0.489362 + endloop + endfacet + facet normal 0.121443 0.992598 0 + outer loop + vertex 0.459309 0.604236 0.489362 + vertex 0.459309 0.604236 -0.510638 + vertex 0.444727 0.606021 -0.510638 + endloop + endfacet + facet normal 0.121443 0.992598 0 + outer loop + vertex 0.459309 0.604236 0.489362 + vertex 0.444727 0.606021 -0.510638 + vertex 0.444727 0.606021 0.489362 + endloop + endfacet + facet normal 0.0725067 0.997368 0 + outer loop + vertex 0.444727 0.606021 0.489362 + vertex 0.444727 0.606021 -0.510638 + vertex 0.429846 0.607102 -0.510638 + endloop + endfacet + facet normal 0.0725067 0.997368 0 + outer loop + vertex 0.444727 0.606021 0.489362 + vertex 0.429846 0.607102 -0.510638 + vertex 0.429846 0.607102 0.489362 + endloop + endfacet + facet normal 0.0240017 0.999712 0 + outer loop + vertex 0.429846 0.607102 0.489362 + vertex 0.429846 0.607102 -0.510638 + vertex 0.414682 0.607466 -0.510638 + endloop + endfacet + facet normal 0.0240017 0.999712 0 + outer loop + vertex 0.429846 0.607102 0.489362 + vertex 0.414682 0.607466 -0.510638 + vertex 0.414682 0.607466 0.489362 + endloop + endfacet + facet normal -0.0241597 0.999708 0 + outer loop + vertex 0.414682 0.607466 0.489362 + vertex 0.414682 0.607466 -0.510638 + vertex 0.399615 0.607102 -0.510638 + endloop + endfacet + facet normal -0.0241597 0.999708 0 + outer loop + vertex 0.414682 0.607466 0.489362 + vertex 0.399615 0.607102 -0.510638 + vertex 0.399615 0.607102 0.489362 + endloop + endfacet + facet normal -0.0729467 0.997336 0 + outer loop + vertex 0.399615 0.607102 0.489362 + vertex 0.399615 0.607102 -0.510638 + vertex 0.384824 0.60602 -0.510638 + endloop + endfacet + facet normal -0.0729467 0.997336 0 + outer loop + vertex 0.399615 0.607102 0.489362 + vertex 0.384824 0.60602 -0.510638 + vertex 0.384824 0.60602 0.489362 + endloop + endfacet + facet normal -0.122137 0.992513 0 + outer loop + vertex 0.384824 0.60602 0.489362 + vertex 0.384824 0.60602 -0.510638 + vertex 0.370326 0.604236 -0.510638 + endloop + endfacet + facet normal -0.122137 0.992513 0 + outer loop + vertex 0.384824 0.60602 0.489362 + vertex 0.370326 0.604236 -0.510638 + vertex 0.370326 0.604236 0.489362 + endloop + endfacet + facet normal -0.171554 0.985175 0 + outer loop + vertex 0.370326 0.604236 0.489362 + vertex 0.370326 0.604236 -0.510638 + vertex 0.356138 0.601766 -0.510638 + endloop + endfacet + facet normal -0.171554 0.985175 0 + outer loop + vertex 0.370326 0.604236 0.489362 + vertex 0.356138 0.601766 -0.510638 + vertex 0.356138 0.601766 0.489362 + endloop + endfacet + facet normal -0.221031 0.975267 0 + outer loop + vertex 0.356138 0.601766 0.489362 + vertex 0.356138 0.601766 -0.510638 + vertex 0.342275 0.598624 -0.510638 + endloop + endfacet + facet normal -0.221031 0.975267 0 + outer loop + vertex 0.356138 0.601766 0.489362 + vertex 0.342275 0.598624 -0.510638 + vertex 0.342275 0.598624 0.489362 + endloop + endfacet + facet normal -0.270399 0.962748 0 + outer loop + vertex 0.342275 0.598624 0.489362 + vertex 0.342275 0.598624 -0.510638 + vertex 0.328754 0.594826 -0.510638 + endloop + endfacet + facet normal -0.270399 0.962748 0 + outer loop + vertex 0.342275 0.598624 0.489362 + vertex 0.328754 0.594826 -0.510638 + vertex 0.328754 0.594826 0.489362 + endloop + endfacet + facet normal -0.319471 0.947596 0 + outer loop + vertex 0.328754 0.594826 0.489362 + vertex 0.328754 0.594826 -0.510638 + vertex 0.315592 0.590389 -0.510638 + endloop + endfacet + facet normal -0.319471 0.947596 0 + outer loop + vertex 0.328754 0.594826 0.489362 + vertex 0.315592 0.590389 -0.510638 + vertex 0.315592 0.590389 0.489362 + endloop + endfacet + facet normal -0.368075 0.929796 0 + outer loop + vertex 0.315592 0.590389 0.489362 + vertex 0.315592 0.590389 -0.510638 + vertex 0.302805 0.585327 -0.510638 + endloop + endfacet + facet normal -0.368075 0.929796 0 + outer loop + vertex 0.315592 0.590389 0.489362 + vertex 0.302805 0.585327 -0.510638 + vertex 0.302805 0.585327 0.489362 + endloop + endfacet + facet normal -0.416022 0.909355 0 + outer loop + vertex 0.302805 0.585327 0.489362 + vertex 0.302805 0.585327 -0.510638 + vertex 0.29041 0.579656 -0.510638 + endloop + endfacet + facet normal -0.416022 0.909355 0 + outer loop + vertex 0.302805 0.585327 0.489362 + vertex 0.29041 0.579656 -0.510638 + vertex 0.29041 0.579656 0.489362 + endloop + endfacet + facet normal -0.463139 0.886286 0 + outer loop + vertex 0.29041 0.579656 0.489362 + vertex 0.29041 0.579656 -0.510638 + vertex 0.278423 0.573392 -0.510638 + endloop + endfacet + facet normal -0.463139 0.886286 0 + outer loop + vertex 0.29041 0.579656 0.489362 + vertex 0.278423 0.573392 -0.510638 + vertex 0.278423 0.573392 0.489362 + endloop + endfacet + facet normal -0.50924 0.860624 0 + outer loop + vertex 0.278423 0.573392 0.489362 + vertex 0.278423 0.573392 -0.510638 + vertex 0.26686 0.56655 -0.510638 + endloop + endfacet + facet normal -0.50924 0.860624 0 + outer loop + vertex 0.278423 0.573392 0.489362 + vertex 0.26686 0.56655 -0.510638 + vertex 0.26686 0.56655 0.489362 + endloop + endfacet + facet normal -0.554154 0.832414 0 + outer loop + vertex 0.26686 0.56655 0.489362 + vertex 0.26686 0.56655 -0.510638 + vertex 0.255738 0.559146 -0.510638 + endloop + endfacet + facet normal -0.554154 0.832414 0 + outer loop + vertex 0.26686 0.56655 0.489362 + vertex 0.255738 0.559146 -0.510638 + vertex 0.255738 0.559146 0.489362 + endloop + endfacet + facet normal -0.597701 0.801719 0 + outer loop + vertex 0.255738 0.559146 0.489362 + vertex 0.255738 0.559146 -0.510638 + vertex 0.245074 0.551196 -0.510638 + endloop + endfacet + facet normal -0.597701 0.801719 0 + outer loop + vertex 0.255738 0.559146 0.489362 + vertex 0.245074 0.551196 -0.510638 + vertex 0.245074 0.551196 0.489362 + endloop + endfacet + facet normal -0.639718 0.76861 0 + outer loop + vertex 0.245074 0.551196 0.489362 + vertex 0.245074 0.551196 -0.510638 + vertex 0.234883 0.542714 -0.510638 + endloop + endfacet + facet normal -0.639718 0.76861 0 + outer loop + vertex 0.245074 0.551196 0.489362 + vertex 0.234883 0.542714 -0.510638 + vertex 0.234883 0.542714 0.489362 + endloop + endfacet + facet normal -0.680032 0.733182 0 + outer loop + vertex 0.234883 0.542714 0.489362 + vertex 0.234883 0.542714 -0.510638 + vertex 0.225182 0.533716 -0.510638 + endloop + endfacet + facet normal -0.680032 0.733182 0 + outer loop + vertex 0.234883 0.542714 0.489362 + vertex 0.225182 0.533716 -0.510638 + vertex 0.225182 0.533716 0.489362 + endloop + endfacet + facet normal -0.718493 0.695534 0 + outer loop + vertex 0.225182 0.533716 0.489362 + vertex 0.225182 0.533716 -0.510638 + vertex 0.215988 0.524219 -0.510638 + endloop + endfacet + facet normal -0.718493 0.695534 0 + outer loop + vertex 0.225182 0.533716 0.489362 + vertex 0.215988 0.524219 -0.510638 + vertex 0.215988 0.524219 0.489362 + endloop + endfacet + facet normal -0.754945 0.655788 0 + outer loop + vertex 0.215988 0.524219 0.489362 + vertex 0.215988 0.524219 -0.510638 + vertex 0.207317 0.514237 -0.510638 + endloop + endfacet + facet normal -0.754945 0.655788 0 + outer loop + vertex 0.215988 0.524219 0.489362 + vertex 0.207317 0.514237 -0.510638 + vertex 0.207317 0.514237 0.489362 + endloop + endfacet + facet normal -0.789245 0.614078 0 + outer loop + vertex 0.207317 0.514237 0.489362 + vertex 0.207317 0.514237 -0.510638 + vertex 0.199186 0.503786 -0.510638 + endloop + endfacet + facet normal -0.789245 0.614078 0 + outer loop + vertex 0.207317 0.514237 0.489362 + vertex 0.199186 0.503786 -0.510638 + vertex 0.199186 0.503786 0.489362 + endloop + endfacet + facet normal -0.821265 0.570546 0 + outer loop + vertex 0.199186 0.503786 0.489362 + vertex 0.199186 0.503786 -0.510638 + vertex 0.191611 0.492882 -0.510638 + endloop + endfacet + facet normal -0.821265 0.570546 0 + outer loop + vertex 0.199186 0.503786 0.489362 + vertex 0.191611 0.492882 -0.510638 + vertex 0.191611 0.492882 0.489362 + endloop + endfacet + facet normal -0.85088 0.52536 0 + outer loop + vertex 0.191611 0.492882 0.489362 + vertex 0.191611 0.492882 -0.510638 + vertex 0.184608 0.481541 -0.510638 + endloop + endfacet + facet normal -0.85088 0.52536 0 + outer loop + vertex 0.191611 0.492882 0.489362 + vertex 0.184608 0.481541 -0.510638 + vertex 0.184608 0.481541 0.489362 + endloop + endfacet + facet normal -0.877985 0.478688 0 + outer loop + vertex 0.184608 0.481541 0.489362 + vertex 0.184608 0.481541 -0.510638 + vertex 0.178194 0.469776 -0.510638 + endloop + endfacet + facet normal -0.877985 0.478688 0 + outer loop + vertex 0.184608 0.481541 0.489362 + vertex 0.178194 0.469776 -0.510638 + vertex 0.178194 0.469776 0.489362 + endloop + endfacet + facet normal -0.902486 0.43072 0 + outer loop + vertex 0.178194 0.469776 0.489362 + vertex 0.178194 0.469776 -0.510638 + vertex 0.172386 0.457606 -0.510638 + endloop + endfacet + facet normal -0.902486 0.43072 0 + outer loop + vertex 0.178194 0.469776 0.489362 + vertex 0.172386 0.457606 -0.510638 + vertex 0.172386 0.457606 0.489362 + endloop + endfacet + facet normal -0.924308 0.381648 0 + outer loop + vertex 0.172386 0.457606 0.489362 + vertex 0.172386 0.457606 -0.510638 + vertex 0.167199 0.445044 -0.510638 + endloop + endfacet + facet normal -0.924308 0.381648 0 + outer loop + vertex 0.172386 0.457606 0.489362 + vertex 0.167199 0.445044 -0.510638 + vertex 0.167199 0.445044 0.489362 + endloop + endfacet + facet normal -0.943391 0.331682 0 + outer loop + vertex 0.167199 0.445044 0.489362 + vertex 0.167199 0.445044 -0.510638 + vertex 0.16265 0.432106 -0.510638 + endloop + endfacet + facet normal -0.943391 0.331682 0 + outer loop + vertex 0.167199 0.445044 0.489362 + vertex 0.16265 0.432106 -0.510638 + vertex 0.16265 0.432106 0.489362 + endloop + endfacet + facet normal -0.959698 0.281032 0 + outer loop + vertex 0.16265 0.432106 0.489362 + vertex 0.16265 0.432106 -0.510638 + vertex 0.158756 0.418809 -0.510638 + endloop + endfacet + facet normal -0.959698 0.281032 0 + outer loop + vertex 0.16265 0.432106 0.489362 + vertex 0.158756 0.418809 -0.510638 + vertex 0.158756 0.418809 0.489362 + endloop + endfacet + facet normal -0.973211 0.229915 0 + outer loop + vertex 0.158756 0.418809 0.489362 + vertex 0.158756 0.418809 -0.510638 + vertex 0.155533 0.405167 -0.510638 + endloop + endfacet + facet normal -0.973211 0.229915 0 + outer loop + vertex 0.158756 0.418809 0.489362 + vertex 0.155533 0.405167 -0.510638 + vertex 0.155533 0.405167 0.489362 + endloop + endfacet + facet normal -0.98393 0.178553 0 + outer loop + vertex 0.155533 0.405167 0.489362 + vertex 0.155533 0.405167 -0.510638 + vertex 0.152998 0.391196 -0.510638 + endloop + endfacet + facet normal -0.98393 0.178553 0 + outer loop + vertex 0.155533 0.405167 0.489362 + vertex 0.152998 0.391196 -0.510638 + vertex 0.152998 0.391196 0.489362 + endloop + endfacet + facet normal -0.991882 0.127162 0 + outer loop + vertex 0.152998 0.391196 0.489362 + vertex 0.152998 0.391196 -0.510638 + vertex 0.151167 0.376912 -0.510638 + endloop + endfacet + facet normal -0.991882 0.127162 0 + outer loop + vertex 0.152998 0.391196 0.489362 + vertex 0.151167 0.376912 -0.510638 + vertex 0.151167 0.376912 0.489362 + endloop + endfacet + facet normal -0.997111 0.0759583 0 + outer loop + vertex 0.151167 0.376912 0.489362 + vertex 0.151167 0.376912 -0.510638 + vertex 0.150056 0.36233 -0.510638 + endloop + endfacet + facet normal -0.997111 0.0759583 0 + outer loop + vertex 0.151167 0.376912 0.489362 + vertex 0.150056 0.36233 -0.510638 + vertex 0.150056 0.36233 0.489362 + endloop + endfacet + facet normal -0.999684 0.0251486 0 + outer loop + vertex 0.150056 0.36233 0.489362 + vertex 0.150056 0.36233 -0.510638 + vertex 0.149682 0.347466 -0.510638 + endloop + endfacet + facet normal -0.999684 0.0251486 0 + outer loop + vertex 0.150056 0.36233 0.489362 + vertex 0.149682 0.347466 -0.510638 + vertex 0.149682 0.347466 0.489362 + endloop + endfacet + facet normal -0.99968 -0.0253065 -0 + outer loop + vertex 0.149682 0.347466 0.489362 + vertex 0.149682 0.347466 -0.510638 + vertex 0.150056 0.332696 -0.510638 + endloop + endfacet + facet normal -0.99968 -0.0253065 0 + outer loop + vertex 0.149682 0.347466 0.489362 + vertex 0.150056 0.332696 -0.510638 + vertex 0.150056 0.332696 0.489362 + endloop + endfacet + facet normal -0.997079 -0.076378 -0 + outer loop + vertex 0.150056 0.332696 0.489362 + vertex 0.150056 0.332696 -0.510638 + vertex 0.151167 0.318195 -0.510638 + endloop + endfacet + facet normal -0.997079 -0.076378 0 + outer loop + vertex 0.150056 0.332696 0.489362 + vertex 0.151167 0.318195 -0.510638 + vertex 0.151167 0.318195 0.489362 + endloop + endfacet + facet normal -0.991804 -0.127768 -0 + outer loop + vertex 0.151167 0.318195 0.489362 + vertex 0.151167 0.318195 -0.510638 + vertex 0.152998 0.303979 -0.510638 + endloop + endfacet + facet normal -0.991804 -0.127768 0 + outer loop + vertex 0.151167 0.318195 0.489362 + vertex 0.152998 0.303979 -0.510638 + vertex 0.152998 0.303979 0.489362 + endloop + endfacet + facet normal -0.983801 -0.179266 -0 + outer loop + vertex 0.152998 0.303979 0.489362 + vertex 0.152998 0.303979 -0.510638 + vertex 0.155533 0.290066 -0.510638 + endloop + endfacet + facet normal -0.983801 -0.179266 0 + outer loop + vertex 0.152998 0.303979 0.489362 + vertex 0.155533 0.290066 -0.510638 + vertex 0.155533 0.290066 0.489362 + endloop + endfacet + facet normal -0.973033 -0.230664 -0 + outer loop + vertex 0.155533 0.290066 0.489362 + vertex 0.155533 0.290066 -0.510638 + vertex 0.158756 0.276471 -0.510638 + endloop + endfacet + facet normal -0.973033 -0.230664 0 + outer loop + vertex 0.155533 0.290066 0.489362 + vertex 0.158756 0.276471 -0.510638 + vertex 0.158756 0.276471 0.489362 + endloop + endfacet + facet normal -0.959488 -0.281749 -0 + outer loop + vertex 0.158756 0.276471 0.489362 + vertex 0.158756 0.276471 -0.510638 + vertex 0.16265 0.26321 -0.510638 + endloop + endfacet + facet normal -0.959488 -0.281749 0 + outer loop + vertex 0.158756 0.276471 0.489362 + vertex 0.16265 0.26321 -0.510638 + vertex 0.16265 0.26321 0.489362 + endloop + endfacet + facet normal -0.94317 -0.33231 -0 + outer loop + vertex 0.16265 0.26321 0.489362 + vertex 0.16265 0.26321 -0.510638 + vertex 0.167199 0.2503 -0.510638 + endloop + endfacet + facet normal -0.94317 -0.33231 0 + outer loop + vertex 0.16265 0.26321 0.489362 + vertex 0.167199 0.2503 -0.510638 + vertex 0.167199 0.2503 0.489362 + endloop + endfacet + facet normal -0.924106 -0.382136 -0 + outer loop + vertex 0.167199 0.2503 0.489362 + vertex 0.167199 0.2503 -0.510638 + vertex 0.172386 0.237757 -0.510638 + endloop + endfacet + facet normal -0.924106 -0.382136 0 + outer loop + vertex 0.167199 0.2503 0.489362 + vertex 0.172386 0.237757 -0.510638 + vertex 0.172386 0.237757 0.489362 + endloop + endfacet + facet normal -0.902337 -0.43103 -0 + outer loop + vertex 0.172386 0.237757 0.489362 + vertex 0.172386 0.237757 -0.510638 + vertex 0.178194 0.225597 -0.510638 + endloop + endfacet + facet normal -0.902337 -0.43103 0 + outer loop + vertex 0.172386 0.237757 0.489362 + vertex 0.178194 0.225597 -0.510638 + vertex 0.178194 0.225597 0.489362 + endloop + endfacet + facet normal -0.877926 -0.478797 -0 + outer loop + vertex 0.178194 0.225597 0.489362 + vertex 0.178194 0.225597 -0.510638 + vertex 0.184608 0.213837 -0.510638 + endloop + endfacet + facet normal -0.877926 -0.478797 0 + outer loop + vertex 0.178194 0.225597 0.489362 + vertex 0.184608 0.213837 -0.510638 + vertex 0.184608 0.213837 0.489362 + endloop + endfacet + facet normal -0.850947 -0.525252 -0 + outer loop + vertex 0.184608 0.213837 0.489362 + vertex 0.184608 0.213837 -0.510638 + vertex 0.191611 0.202492 -0.510638 + endloop + endfacet + facet normal -0.850947 -0.525252 0 + outer loop + vertex 0.184608 0.213837 0.489362 + vertex 0.191611 0.202492 -0.510638 + vertex 0.191611 0.202492 0.489362 + endloop + endfacet + facet normal -0.821491 -0.570222 -0 + outer loop + vertex 0.191611 0.202492 0.489362 + vertex 0.191611 0.202492 -0.510638 + vertex 0.199186 0.191578 -0.510638 + endloop + endfacet + facet normal -0.821491 -0.570222 0 + outer loop + vertex 0.191611 0.202492 0.489362 + vertex 0.199186 0.191578 -0.510638 + vertex 0.199186 0.191578 0.489362 + endloop + endfacet + facet normal -0.78966 -0.613545 -0 + outer loop + vertex 0.199186 0.191578 0.489362 + vertex 0.199186 0.191578 -0.510638 + vertex 0.207317 0.181113 -0.510638 + endloop + endfacet + facet normal -0.78966 -0.613545 0 + outer loop + vertex 0.199186 0.191578 0.489362 + vertex 0.207317 0.181113 -0.510638 + vertex 0.207317 0.181113 0.489362 + endloop + endfacet + facet normal -0.755568 -0.65507 -0 + outer loop + vertex 0.207317 0.181113 0.489362 + vertex 0.207317 0.181113 -0.510638 + vertex 0.215988 0.171112 -0.510638 + endloop + endfacet + facet normal -0.755568 -0.65507 0 + outer loop + vertex 0.207317 0.181113 0.489362 + vertex 0.215988 0.171112 -0.510638 + vertex 0.215988 0.171112 0.489362 + endloop + endfacet + facet normal -0.719341 -0.694657 -0 + outer loop + vertex 0.215988 0.171112 0.489362 + vertex 0.215988 0.171112 -0.510638 + vertex 0.225182 0.161591 -0.510638 + endloop + endfacet + facet normal -0.719341 -0.694657 0 + outer loop + vertex 0.215988 0.171112 0.489362 + vertex 0.225182 0.161591 -0.510638 + vertex 0.225182 0.161591 0.489362 + endloop + endfacet + facet normal -0.68111 -0.732181 -0 + outer loop + vertex 0.225182 0.161591 0.489362 + vertex 0.225182 0.161591 -0.510638 + vertex 0.234883 0.152567 -0.510638 + endloop + endfacet + facet normal -0.68111 -0.732181 0 + outer loop + vertex 0.225182 0.161591 0.489362 + vertex 0.234883 0.152567 -0.510638 + vertex 0.234883 0.152567 0.489362 + endloop + endfacet + facet normal -0.641016 -0.767527 -0 + outer loop + vertex 0.234883 0.152567 0.489362 + vertex 0.234883 0.152567 -0.510638 + vertex 0.245074 0.144056 -0.510638 + endloop + endfacet + facet normal -0.641016 -0.767527 0 + outer loop + vertex 0.234883 0.152567 0.489362 + vertex 0.245074 0.144056 -0.510638 + vertex 0.245074 0.144056 0.489362 + endloop + endfacet + facet normal -0.599207 -0.800594 -0 + outer loop + vertex 0.245074 0.144056 0.489362 + vertex 0.245074 0.144056 -0.510638 + vertex 0.255738 0.136074 -0.510638 + endloop + endfacet + facet normal -0.599207 -0.800594 0 + outer loop + vertex 0.245074 0.144056 0.489362 + vertex 0.255738 0.136074 -0.510638 + vertex 0.255738 0.136074 0.489362 + endloop + endfacet + facet normal -0.555839 -0.83129 -0 + outer loop + vertex 0.255738 0.136074 0.489362 + vertex 0.255738 0.136074 -0.510638 + vertex 0.26686 0.128638 -0.510638 + endloop + endfacet + facet normal -0.555839 -0.83129 0 + outer loop + vertex 0.255738 0.136074 0.489362 + vertex 0.26686 0.128638 -0.510638 + vertex 0.26686 0.128638 0.489362 + endloop + endfacet + facet normal -0.511069 -0.85954 -0 + outer loop + vertex 0.26686 0.128638 0.489362 + vertex 0.26686 0.128638 -0.510638 + vertex 0.278423 0.121763 -0.510638 + endloop + endfacet + facet normal -0.511069 -0.85954 0 + outer loop + vertex 0.26686 0.128638 0.489362 + vertex 0.278423 0.121763 -0.510638 + vertex 0.278423 0.121763 0.489362 + endloop + endfacet + facet normal -0.465064 -0.885277 -0 + outer loop + vertex 0.278423 0.121763 0.489362 + vertex 0.278423 0.121763 -0.510638 + vertex 0.29041 0.115465 -0.510638 + endloop + endfacet + facet normal -0.465064 -0.885277 0 + outer loop + vertex 0.278423 0.121763 0.489362 + vertex 0.29041 0.115465 -0.510638 + vertex 0.29041 0.115465 0.489362 + endloop + endfacet + facet normal -0.417995 -0.908449 -0 + outer loop + vertex 0.29041 0.115465 0.489362 + vertex 0.29041 0.115465 -0.510638 + vertex 0.302805 0.109762 -0.510638 + endloop + endfacet + facet normal -0.417995 -0.908449 0 + outer loop + vertex 0.29041 0.115465 0.489362 + vertex 0.302805 0.109762 -0.510638 + vertex 0.302805 0.109762 0.489362 + endloop + endfacet + facet normal -0.370034 -0.929018 -0 + outer loop + vertex 0.302805 0.109762 0.489362 + vertex 0.302805 0.109762 -0.510638 + vertex 0.315592 0.104669 -0.510638 + endloop + endfacet + facet normal -0.370034 -0.929018 0 + outer loop + vertex 0.302805 0.109762 0.489362 + vertex 0.315592 0.104669 -0.510638 + vertex 0.315592 0.104669 0.489362 + endloop + endfacet + facet normal -0.321359 -0.946957 -0 + outer loop + vertex 0.315592 0.104669 0.489362 + vertex 0.315592 0.104669 -0.510638 + vertex 0.328754 0.100202 -0.510638 + endloop + endfacet + facet normal -0.321359 -0.946957 0 + outer loop + vertex 0.315592 0.104669 0.489362 + vertex 0.328754 0.100202 -0.510638 + vertex 0.328754 0.100202 0.489362 + endloop + endfacet + facet normal -0.27215 -0.962255 -0 + outer loop + vertex 0.328754 0.100202 0.489362 + vertex 0.328754 0.100202 -0.510638 + vertex 0.342275 0.0963784 -0.510638 + endloop + endfacet + facet normal -0.27215 -0.962255 0 + outer loop + vertex 0.328754 0.100202 0.489362 + vertex 0.342275 0.0963784 -0.510638 + vertex 0.342275 0.0963784 0.489362 + endloop + endfacet + facet normal -0.222586 -0.974913 -0 + outer loop + vertex 0.342275 0.0963784 0.489362 + vertex 0.342275 0.0963784 -0.510638 + vertex 0.356138 0.0932133 -0.510638 + endloop + endfacet + facet normal -0.222586 -0.974913 0 + outer loop + vertex 0.342275 0.0963784 0.489362 + vertex 0.356138 0.0932133 -0.510638 + vertex 0.356138 0.0932133 0.489362 + endloop + endfacet + facet normal -0.172849 -0.984948 -0 + outer loop + vertex 0.356138 0.0932133 0.489362 + vertex 0.356138 0.0932133 -0.510638 + vertex 0.370326 0.0907234 -0.510638 + endloop + endfacet + facet normal -0.172849 -0.984948 0 + outer loop + vertex 0.356138 0.0932133 0.489362 + vertex 0.370326 0.0907234 -0.510638 + vertex 0.370326 0.0907234 0.489362 + endloop + endfacet + facet normal -0.123117 -0.992392 -0 + outer loop + vertex 0.370326 0.0907234 0.489362 + vertex 0.370326 0.0907234 -0.510638 + vertex 0.384824 0.0889248 -0.510638 + endloop + endfacet + facet normal -0.123117 -0.992392 0 + outer loop + vertex 0.370326 0.0907234 0.489362 + vertex 0.384824 0.0889248 -0.510638 + vertex 0.384824 0.0889248 0.489362 + endloop + endfacet + facet normal -0.0735669 -0.99729 -0 + outer loop + vertex 0.384824 0.0889248 0.489362 + vertex 0.384824 0.0889248 -0.510638 + vertex 0.399615 0.0878337 -0.510638 + endloop + endfacet + facet normal -0.0735669 -0.99729 0 + outer loop + vertex 0.384824 0.0889248 0.489362 + vertex 0.399615 0.0878337 -0.510638 + vertex 0.399615 0.0878337 0.489362 + endloop + endfacet + facet normal -0.0243701 -0.999703 -0 + outer loop + vertex 0.399615 0.0878337 0.489362 + vertex 0.399615 0.0878337 -0.510638 + vertex 0.414682 0.0874664 -0.510638 + endloop + endfacet + facet normal -0.0243701 -0.999703 0 + outer loop + vertex 0.399615 0.0878337 0.489362 + vertex 0.414682 0.0874664 -0.510638 + vertex 0.414682 0.0874664 0.489362 + endloop + endfacet + facet normal 0.0242141 -0.999707 0 + outer loop + vertex 0.414682 0.0874664 0.489362 + vertex 0.414682 0.0874664 -0.510638 + vertex 0.429846 0.0878337 -0.510638 + endloop + endfacet + facet normal 0.0242141 -0.999707 0 + outer loop + vertex 0.414682 0.0874664 0.489362 + vertex 0.429846 0.0878337 -0.510638 + vertex 0.429846 0.0878337 0.489362 + endloop + endfacet + facet normal 1 0 0 + outer loop + vertex 0.883682 -0.223534 0.489362 + vertex 0.883682 -0.223534 -0.510638 + vertex 0.883682 0.455466 -0.510638 + endloop + endfacet + facet normal 1 -0 0 + outer loop + vertex 0.883682 -0.223534 0.489362 + vertex 0.883682 0.455466 -0.510638 + vertex 0.883682 0.455466 0.489362 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 0.883682 0.455466 0.489362 + vertex 0.883682 0.455466 -0.510638 + vertex 1.03768 0.455466 -0.510638 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 0.883682 0.455466 0.489362 + vertex 1.03768 0.455466 -0.510638 + vertex 1.03768 0.455466 0.489362 + endloop + endfacet + facet normal -0.0164809 -0.999864 -0 + outer loop + vertex 1.03768 0.455466 0.489362 + vertex 1.03768 0.455466 -0.510638 + vertex 1.05383 0.4552 -0.510638 + endloop + endfacet + facet normal -0.0164809 -0.999864 0 + outer loop + vertex 1.03768 0.455466 0.489362 + vertex 1.05383 0.4552 -0.510638 + vertex 1.05383 0.4552 0.489362 + endloop + endfacet + facet normal -0.0508651 -0.998706 -0 + outer loop + vertex 1.05383 0.4552 0.489362 + vertex 1.05383 0.4552 -0.510638 + vertex 1.06948 0.454403 -0.510638 + endloop + endfacet + facet normal -0.0508651 -0.998706 0 + outer loop + vertex 1.05383 0.4552 0.489362 + vertex 1.06948 0.454403 -0.510638 + vertex 1.06948 0.454403 0.489362 + endloop + endfacet + facet normal -0.0871752 -0.996193 -0 + outer loop + vertex 1.06948 0.454403 0.489362 + vertex 1.06948 0.454403 -0.510638 + vertex 1.08462 0.453078 -0.510638 + endloop + endfacet + facet normal -0.0871752 -0.996193 0 + outer loop + vertex 1.06948 0.454403 0.489362 + vertex 1.08462 0.453078 -0.510638 + vertex 1.08462 0.453078 0.489362 + endloop + endfacet + facet normal -0.125461 -0.992099 -0 + outer loop + vertex 1.08462 0.453078 0.489362 + vertex 1.08462 0.453078 -0.510638 + vertex 1.09925 0.451228 -0.510638 + endloop + endfacet + facet normal -0.125461 -0.992099 0 + outer loop + vertex 1.08462 0.453078 0.489362 + vertex 1.09925 0.451228 -0.510638 + vertex 1.09925 0.451228 0.489362 + endloop + endfacet + facet normal -0.165746 -0.986169 -0 + outer loop + vertex 1.09925 0.451228 0.489362 + vertex 1.09925 0.451228 -0.510638 + vertex 1.11337 0.448855 -0.510638 + endloop + endfacet + facet normal -0.165746 -0.986169 0 + outer loop + vertex 1.09925 0.451228 0.489362 + vertex 1.11337 0.448855 -0.510638 + vertex 1.11337 0.448855 0.489362 + endloop + endfacet + facet normal -0.208015 -0.978126 -0 + outer loop + vertex 1.11337 0.448855 0.489362 + vertex 1.11337 0.448855 -0.510638 + vertex 1.12697 0.445962 -0.510638 + endloop + endfacet + facet normal -0.208015 -0.978126 0 + outer loop + vertex 1.11337 0.448855 0.489362 + vertex 1.12697 0.445962 -0.510638 + vertex 1.12697 0.445962 0.489362 + endloop + endfacet + facet normal -0.252211 -0.967672 -0 + outer loop + vertex 1.12697 0.445962 0.489362 + vertex 1.12697 0.445962 -0.510638 + vertex 1.14005 0.442552 -0.510638 + endloop + endfacet + facet normal -0.252211 -0.967672 0 + outer loop + vertex 1.12697 0.445962 0.489362 + vertex 1.14005 0.442552 -0.510638 + vertex 1.14005 0.442552 0.489362 + endloop + endfacet + facet normal -0.298217 -0.954498 -0 + outer loop + vertex 1.14005 0.442552 0.489362 + vertex 1.14005 0.442552 -0.510638 + vertex 1.15262 0.438627 -0.510638 + endloop + endfacet + facet normal -0.298217 -0.954498 0 + outer loop + vertex 1.14005 0.442552 0.489362 + vertex 1.15262 0.438627 -0.510638 + vertex 1.15262 0.438627 0.489362 + endloop + endfacet + facet normal -0.345843 -0.938292 -0 + outer loop + vertex 1.15262 0.438627 0.489362 + vertex 1.15262 0.438627 -0.510638 + vertex 1.16465 0.43419 -0.510638 + endloop + endfacet + facet normal -0.345843 -0.938292 0 + outer loop + vertex 1.15262 0.438627 0.489362 + vertex 1.16465 0.43419 -0.510638 + vertex 1.16465 0.43419 0.489362 + endloop + endfacet + facet normal -0.394834 -0.918752 -0 + outer loop + vertex 1.16465 0.43419 0.489362 + vertex 1.16465 0.43419 -0.510638 + vertex 1.17616 0.429244 -0.510638 + endloop + endfacet + facet normal -0.394834 -0.918752 0 + outer loop + vertex 1.16465 0.43419 0.489362 + vertex 1.17616 0.429244 -0.510638 + vertex 1.17616 0.429244 0.489362 + endloop + endfacet + facet normal -0.444845 -0.895608 -0 + outer loop + vertex 1.17616 0.429244 0.489362 + vertex 1.17616 0.429244 -0.510638 + vertex 1.18714 0.423791 -0.510638 + endloop + endfacet + facet normal -0.444845 -0.895608 0 + outer loop + vertex 1.17616 0.429244 0.489362 + vertex 1.18714 0.423791 -0.510638 + vertex 1.18714 0.423791 0.489362 + endloop + endfacet + facet normal -0.495436 -0.868644 -0 + outer loop + vertex 1.18714 0.423791 0.489362 + vertex 1.18714 0.423791 -0.510638 + vertex 1.19759 0.417834 -0.510638 + endloop + endfacet + facet normal -0.495436 -0.868644 0 + outer loop + vertex 1.18714 0.423791 0.489362 + vertex 1.19759 0.417834 -0.510638 + vertex 1.19759 0.417834 0.489362 + endloop + endfacet + facet normal -0.546107 -0.837716 -0 + outer loop + vertex 1.19759 0.417834 0.489362 + vertex 1.19759 0.417834 -0.510638 + vertex 1.20749 0.411376 -0.510638 + endloop + endfacet + facet normal -0.546107 -0.837716 0 + outer loop + vertex 1.19759 0.417834 0.489362 + vertex 1.20749 0.411376 -0.510638 + vertex 1.20749 0.411376 0.489362 + endloop + endfacet + facet normal -0.596269 -0.802784 -0 + outer loop + vertex 1.20749 0.411376 0.489362 + vertex 1.20749 0.411376 -0.510638 + vertex 1.21686 0.404419 -0.510638 + endloop + endfacet + facet normal -0.596269 -0.802784 0 + outer loop + vertex 1.20749 0.411376 0.489362 + vertex 1.21686 0.404419 -0.510638 + vertex 1.21686 0.404419 0.489362 + endloop + endfacet + facet normal -0.645309 -0.763921 -0 + outer loop + vertex 1.21686 0.404419 0.489362 + vertex 1.21686 0.404419 -0.510638 + vertex 1.22568 0.396966 -0.510638 + endloop + endfacet + facet normal -0.645309 -0.763921 0 + outer loop + vertex 1.21686 0.404419 0.489362 + vertex 1.22568 0.396966 -0.510638 + vertex 1.22568 0.396966 0.489362 + endloop + endfacet + facet normal -0.692585 -0.721337 -0 + outer loop + vertex 1.22568 0.396966 0.489362 + vertex 1.22568 0.396966 -0.510638 + vertex 1.23396 0.38902 -0.510638 + endloop + endfacet + facet normal -0.692585 -0.721337 0 + outer loop + vertex 1.22568 0.396966 0.489362 + vertex 1.23396 0.38902 -0.510638 + vertex 1.23396 0.38902 0.489362 + endloop + endfacet + facet normal -0.737476 -0.675374 -0 + outer loop + vertex 1.23396 0.38902 0.489362 + vertex 1.23396 0.38902 -0.510638 + vertex 1.24168 0.380583 -0.510638 + endloop + endfacet + facet normal -0.737476 -0.675374 0 + outer loop + vertex 1.23396 0.38902 0.489362 + vertex 1.24168 0.380583 -0.510638 + vertex 1.24168 0.380583 0.489362 + endloop + endfacet + facet normal -0.779435 -0.626484 -0 + outer loop + vertex 1.24168 0.380583 0.489362 + vertex 1.24168 0.380583 -0.510638 + vertex 1.24886 0.371658 -0.510638 + endloop + endfacet + facet normal -0.779435 -0.626484 0 + outer loop + vertex 1.24168 0.380583 0.489362 + vertex 1.24886 0.371658 -0.510638 + vertex 1.24886 0.371658 0.489362 + endloop + endfacet + facet normal -0.817994 -0.575227 -0 + outer loop + vertex 1.24886 0.371658 0.489362 + vertex 1.24886 0.371658 -0.510638 + vertex 1.25548 0.362248 -0.510638 + endloop + endfacet + facet normal -0.817994 -0.575227 0 + outer loop + vertex 1.24886 0.371658 0.489362 + vertex 1.25548 0.362248 -0.510638 + vertex 1.25548 0.362248 0.489362 + endloop + endfacet + facet normal -0.852795 -0.522246 -0 + outer loop + vertex 1.25548 0.362248 0.489362 + vertex 1.25548 0.362248 -0.510638 + vertex 1.26153 0.352355 -0.510638 + endloop + endfacet + facet normal -0.852795 -0.522246 0 + outer loop + vertex 1.25548 0.362248 0.489362 + vertex 1.26153 0.352355 -0.510638 + vertex 1.26153 0.352355 0.489362 + endloop + endfacet + facet normal -0.883625 -0.468195 -0 + outer loop + vertex 1.26153 0.352355 0.489362 + vertex 1.26153 0.352355 -0.510638 + vertex 1.26703 0.341982 -0.510638 + endloop + endfacet + facet normal -0.883625 -0.468195 0 + outer loop + vertex 1.26153 0.352355 0.489362 + vertex 1.26703 0.341982 -0.510638 + vertex 1.26703 0.341982 0.489362 + endloop + endfacet + facet normal -0.9104 -0.413729 -0 + outer loop + vertex 1.26703 0.341982 0.489362 + vertex 1.26703 0.341982 -0.510638 + vertex 1.27196 0.331132 -0.510638 + endloop + endfacet + facet normal -0.9104 -0.413729 0 + outer loop + vertex 1.26703 0.341982 0.489362 + vertex 1.27196 0.331132 -0.510638 + vertex 1.27196 0.331132 0.489362 + endloop + endfacet + facet normal -0.933163 -0.359454 -0 + outer loop + vertex 1.27196 0.331132 0.489362 + vertex 1.27196 0.331132 -0.510638 + vertex 1.27632 0.319807 -0.510638 + endloop + endfacet + facet normal -0.933163 -0.359454 0 + outer loop + vertex 1.27196 0.331132 0.489362 + vertex 1.27632 0.319807 -0.510638 + vertex 1.27632 0.319807 0.489362 + endloop + endfacet + facet normal -0.952052 -0.305936 -0 + outer loop + vertex 1.27632 0.319807 0.489362 + vertex 1.27632 0.319807 -0.510638 + vertex 1.28011 0.30801 -0.510638 + endloop + endfacet + facet normal -0.952052 -0.305936 0 + outer loop + vertex 1.27632 0.319807 0.489362 + vertex 1.28011 0.30801 -0.510638 + vertex 1.28011 0.30801 0.489362 + endloop + endfacet + facet normal -0.967303 -0.253623 -0 + outer loop + vertex 1.28011 0.30801 0.489362 + vertex 1.28011 0.30801 -0.510638 + vertex 1.28333 0.295744 -0.510638 + endloop + endfacet + facet normal -0.967303 -0.253623 0 + outer loop + vertex 1.28011 0.30801 0.489362 + vertex 1.28333 0.295744 -0.510638 + vertex 1.28333 0.295744 0.489362 + endloop + endfacet + facet normal -0.9792 -0.202897 -0 + outer loop + vertex 1.28333 0.295744 0.489362 + vertex 1.28333 0.295744 -0.510638 + vertex 1.28597 0.283011 -0.510638 + endloop + endfacet + facet normal -0.9792 -0.202897 0 + outer loop + vertex 1.28333 0.295744 0.489362 + vertex 1.28597 0.283011 -0.510638 + vertex 1.28597 0.283011 0.489362 + endloop + endfacet + facet normal -0.988064 -0.154042 -0 + outer loop + vertex 1.28597 0.283011 0.489362 + vertex 1.28597 0.283011 -0.510638 + vertex 1.28803 0.269814 -0.510638 + endloop + endfacet + facet normal -0.988064 -0.154042 0 + outer loop + vertex 1.28597 0.283011 0.489362 + vertex 1.28803 0.269814 -0.510638 + vertex 1.28803 0.269814 0.489362 + endloop + endfacet + facet normal -0.994231 -0.107256 -0 + outer loop + vertex 1.28803 0.269814 0.489362 + vertex 1.28803 0.269814 -0.510638 + vertex 1.2895 0.256156 -0.510638 + endloop + endfacet + facet normal -0.994231 -0.107256 0 + outer loop + vertex 1.28803 0.269814 0.489362 + vertex 1.2895 0.256156 -0.510638 + vertex 1.2895 0.256156 0.489362 + endloop + endfacet + facet normal -0.998035 -0.0626611 -0 + outer loop + vertex 1.2895 0.256156 0.489362 + vertex 1.2895 0.256156 -0.510638 + vertex 1.29039 0.242039 -0.510638 + endloop + endfacet + facet normal -0.998035 -0.0626611 0 + outer loop + vertex 1.2895 0.256156 0.489362 + vertex 1.29039 0.242039 -0.510638 + vertex 1.29039 0.242039 0.489362 + endloop + endfacet + facet normal -0.999794 -0.0203154 -0 + outer loop + vertex 1.29039 0.242039 0.489362 + vertex 1.29039 0.242039 -0.510638 + vertex 1.29068 0.227466 -0.510638 + endloop + endfacet + facet normal -0.999794 -0.0203154 0 + outer loop + vertex 1.29039 0.242039 0.489362 + vertex 1.29068 0.227466 -0.510638 + vertex 1.29068 0.227466 0.489362 + endloop + endfacet + facet normal -0.999722 0.0235596 0 + outer loop + vertex 1.29068 0.227466 0.489362 + vertex 1.29068 0.227466 -0.510638 + vertex 1.29037 0.214102 -0.510638 + endloop + endfacet + facet normal -0.999722 0.0235596 0 + outer loop + vertex 1.29068 0.227466 0.489362 + vertex 1.29037 0.214102 -0.510638 + vertex 1.29037 0.214102 0.489362 + endloop + endfacet + facet normal -0.997456 0.071285 0 + outer loop + vertex 1.29037 0.214102 0.489362 + vertex 1.29037 0.214102 -0.510638 + vertex 1.28943 0.201016 -0.510638 + endloop + endfacet + facet normal -0.997456 0.071285 0 + outer loop + vertex 1.29037 0.214102 0.489362 + vertex 1.28943 0.201016 -0.510638 + vertex 1.28943 0.201016 0.489362 + endloop + endfacet + facet normal -0.992805 0.119742 0 + outer loop + vertex 1.28943 0.201016 0.489362 + vertex 1.28943 0.201016 -0.510638 + vertex 1.28789 0.188221 -0.510638 + endloop + endfacet + facet normal -0.992805 0.119742 0 + outer loop + vertex 1.28943 0.201016 0.489362 + vertex 1.28789 0.188221 -0.510638 + vertex 1.28789 0.188221 0.489362 + endloop + endfacet + facet normal -0.98566 0.168744 0 + outer loop + vertex 1.28789 0.188221 0.489362 + vertex 1.28789 0.188221 -0.510638 + vertex 1.28575 0.17573 -0.510638 + endloop + endfacet + facet normal -0.98566 0.168744 0 + outer loop + vertex 1.28789 0.188221 0.489362 + vertex 1.28575 0.17573 -0.510638 + vertex 1.28575 0.17573 0.489362 + endloop + endfacet + facet normal -0.975924 0.218112 0 + outer loop + vertex 1.28575 0.17573 0.489362 + vertex 1.28575 0.17573 -0.510638 + vertex 1.28303 0.163554 -0.510638 + endloop + endfacet + facet normal -0.975924 0.218112 0 + outer loop + vertex 1.28575 0.17573 0.489362 + vertex 1.28303 0.163554 -0.510638 + vertex 1.28303 0.163554 0.489362 + endloop + endfacet + facet normal -0.963515 0.267655 0 + outer loop + vertex 1.28303 0.163554 0.489362 + vertex 1.28303 0.163554 -0.510638 + vertex 1.27974 0.151706 -0.510638 + endloop + endfacet + facet normal -0.963515 0.267655 0 + outer loop + vertex 1.28303 0.163554 0.489362 + vertex 1.27974 0.151706 -0.510638 + vertex 1.27974 0.151706 0.489362 + endloop + endfacet + facet normal -0.948372 0.317159 0 + outer loop + vertex 1.27974 0.151706 0.489362 + vertex 1.27974 0.151706 -0.510638 + vertex 1.27589 0.140198 -0.510638 + endloop + endfacet + facet normal -0.948372 0.317159 0 + outer loop + vertex 1.27974 0.151706 0.489362 + vertex 1.27589 0.140198 -0.510638 + vertex 1.27589 0.140198 0.489362 + endloop + endfacet + facet normal -0.93045 0.366419 0 + outer loop + vertex 1.27589 0.140198 0.489362 + vertex 1.27589 0.140198 -0.510638 + vertex 1.2715 0.129043 -0.510638 + endloop + endfacet + facet normal -0.93045 0.366419 0 + outer loop + vertex 1.27589 0.140198 0.489362 + vertex 1.2715 0.129043 -0.510638 + vertex 1.2715 0.129043 0.489362 + endloop + endfacet + facet normal -0.909727 0.415208 0 + outer loop + vertex 1.2715 0.129043 0.489362 + vertex 1.2715 0.129043 -0.510638 + vertex 1.26657 0.118251 -0.510638 + endloop + endfacet + facet normal -0.909727 0.415208 0 + outer loop + vertex 1.2715 0.129043 0.489362 + vertex 1.26657 0.118251 -0.510638 + vertex 1.26657 0.118251 0.489362 + endloop + endfacet + facet normal -0.886208 0.463288 0 + outer loop + vertex 1.26657 0.118251 0.489362 + vertex 1.26657 0.118251 -0.510638 + vertex 1.26113 0.107837 -0.510638 + endloop + endfacet + facet normal -0.886208 0.463288 0 + outer loop + vertex 1.26657 0.118251 0.489362 + vertex 1.26113 0.107837 -0.510638 + vertex 1.26113 0.107837 0.489362 + endloop + endfacet + facet normal -0.859916 0.510436 0 + outer loop + vertex 1.26113 0.107837 0.489362 + vertex 1.26113 0.107837 -0.510638 + vertex 1.25518 0.097811 -0.510638 + endloop + endfacet + facet normal -0.859916 0.510436 0 + outer loop + vertex 1.26113 0.107837 0.489362 + vertex 1.25518 0.097811 -0.510638 + vertex 1.25518 0.097811 0.489362 + endloop + endfacet + facet normal -0.830903 0.556417 0 + outer loop + vertex 1.25518 0.097811 0.489362 + vertex 1.25518 0.097811 -0.510638 + vertex 1.24873 0.0881864 -0.510638 + endloop + endfacet + facet normal -0.830903 0.556417 0 + outer loop + vertex 1.25518 0.097811 0.489362 + vertex 1.24873 0.0881864 -0.510638 + vertex 1.24873 0.0881864 0.489362 + endloop + endfacet + facet normal -0.799247 0.601002 0 + outer loop + vertex 1.24873 0.0881864 0.489362 + vertex 1.24873 0.0881864 -0.510638 + vertex 1.2418 0.0789751 -0.510638 + endloop + endfacet + facet normal -0.799247 0.601002 0 + outer loop + vertex 1.24873 0.0881864 0.489362 + vertex 1.2418 0.0789751 -0.510638 + vertex 1.2418 0.0789751 0.489362 + endloop + endfacet + facet normal -0.765051 0.64397 0 + outer loop + vertex 1.2418 0.0789751 0.489362 + vertex 1.2418 0.0789751 -0.510638 + vertex 1.23441 0.0701894 -0.510638 + endloop + endfacet + facet normal -0.765051 0.64397 0 + outer loop + vertex 1.2418 0.0789751 0.489362 + vertex 1.23441 0.0701894 -0.510638 + vertex 1.23441 0.0701894 0.489362 + endloop + endfacet + facet normal -0.728447 0.685102 0 + outer loop + vertex 1.23441 0.0701894 0.489362 + vertex 1.23441 0.0701894 -0.510638 + vertex 1.22656 0.0618414 -0.510638 + endloop + endfacet + facet normal -0.728447 0.685102 0 + outer loop + vertex 1.23441 0.0701894 0.489362 + vertex 1.22656 0.0618414 -0.510638 + vertex 1.22656 0.0618414 0.489362 + endloop + endfacet + facet normal -0.68958 0.724209 0 + outer loop + vertex 1.22656 0.0618414 0.489362 + vertex 1.22656 0.0618414 -0.510638 + vertex 1.21826 0.0539434 -0.510638 + endloop + endfacet + facet normal -0.68958 0.724209 0 + outer loop + vertex 1.22656 0.0618414 0.489362 + vertex 1.21826 0.0539434 -0.510638 + vertex 1.21826 0.0539434 0.489362 + endloop + endfacet + facet normal -0.648628 0.761106 0 + outer loop + vertex 1.21826 0.0539434 0.489362 + vertex 1.21826 0.0539434 -0.510638 + vertex 1.20954 0.0465077 -0.510638 + endloop + endfacet + facet normal -0.648628 0.761106 0 + outer loop + vertex 1.21826 0.0539434 0.489362 + vertex 1.20954 0.0465077 -0.510638 + vertex 1.20954 0.0465077 0.489362 + endloop + endfacet + facet normal -0.605769 0.79564 0 + outer loop + vertex 1.20954 0.0465077 0.489362 + vertex 1.20954 0.0465077 -0.510638 + vertex 1.20039 0.0395464 -0.510638 + endloop + endfacet + facet normal -0.605769 0.79564 0 + outer loop + vertex 1.20954 0.0465077 0.489362 + vertex 1.20039 0.0395464 -0.510638 + vertex 1.20039 0.0395464 0.489362 + endloop + endfacet + facet normal -0.56122 0.827667 0 + outer loop + vertex 1.20039 0.0395464 0.489362 + vertex 1.20039 0.0395464 -0.510638 + vertex 1.19085 0.0330718 -0.510638 + endloop + endfacet + facet normal -0.56122 0.827667 0 + outer loop + vertex 1.20039 0.0395464 0.489362 + vertex 1.19085 0.0330718 -0.510638 + vertex 1.19085 0.0330718 0.489362 + endloop + endfacet + facet normal -0.515194 0.857074 0 + outer loop + vertex 1.19085 0.0330718 0.489362 + vertex 1.19085 0.0330718 -0.510638 + vertex 1.1809 0.027096 -0.510638 + endloop + endfacet + facet normal -0.515194 0.857074 0 + outer loop + vertex 1.19085 0.0330718 0.489362 + vertex 1.1809 0.027096 -0.510638 + vertex 1.1809 0.027096 0.489362 + endloop + endfacet + facet normal -0.467917 0.883773 0 + outer loop + vertex 1.1809 0.027096 0.489362 + vertex 1.1809 0.027096 -0.510638 + vertex 1.17058 0.0216314 -0.510638 + endloop + endfacet + facet normal -0.467917 0.883773 0 + outer loop + vertex 1.1809 0.027096 0.489362 + vertex 1.17058 0.0216314 -0.510638 + vertex 1.17058 0.0216314 0.489362 + endloop + endfacet + facet normal -0.419627 0.907697 0 + outer loop + vertex 1.17058 0.0216314 0.489362 + vertex 1.17058 0.0216314 -0.510638 + vertex 1.15989 0.0166901 -0.510638 + endloop + endfacet + facet normal -0.419627 0.907697 0 + outer loop + vertex 1.17058 0.0216314 0.489362 + vertex 1.15989 0.0166901 -0.510638 + vertex 1.15989 0.0166901 0.489362 + endloop + endfacet + facet normal -0.370554 0.928811 0 + outer loop + vertex 1.15989 0.0166901 0.489362 + vertex 1.15989 0.0166901 -0.510638 + vertex 1.14885 0.0122844 -0.510638 + endloop + endfacet + facet normal -0.370554 0.928811 0 + outer loop + vertex 1.15989 0.0166901 0.489362 + vertex 1.14885 0.0122844 -0.510638 + vertex 1.14885 0.0122844 0.489362 + endloop + endfacet + facet normal -0.320933 0.947102 0 + outer loop + vertex 1.14885 0.0122844 0.489362 + vertex 1.14885 0.0122844 -0.510638 + vertex 1.13747 0.00842639 -0.510638 + endloop + endfacet + facet normal -0.320933 0.947102 0 + outer loop + vertex 1.14885 0.0122844 0.489362 + vertex 1.13747 0.00842639 -0.510638 + vertex 1.13747 0.00842639 0.489362 + endloop + endfacet + facet normal -0.270992 0.962582 0 + outer loop + vertex 1.13747 0.00842639 0.489362 + vertex 1.13747 0.00842639 -0.510638 + vertex 1.12575 0.00512843 -0.510638 + endloop + endfacet + facet normal -0.270992 0.962582 0 + outer loop + vertex 1.13747 0.00842639 0.489362 + vertex 1.12575 0.00512843 -0.510638 + vertex 1.12575 0.00512843 0.489362 + endloop + endfacet + facet normal -0.220956 0.975284 0 + outer loop + vertex 1.12575 0.00512843 0.489362 + vertex 1.12575 0.00512843 -0.510638 + vertex 1.11372 0.00240269 -0.510638 + endloop + endfacet + facet normal -0.220956 0.975284 0 + outer loop + vertex 1.12575 0.00512843 0.489362 + vertex 1.11372 0.00240269 -0.510638 + vertex 1.11372 0.00240269 0.489362 + endloop + endfacet + facet normal -0.171035 0.985265 0 + outer loop + vertex 1.11372 0.00240269 0.489362 + vertex 1.11372 0.00240269 -0.510638 + vertex 1.10139 0.000261389 -0.510638 + endloop + endfacet + facet normal -0.171035 0.985265 0 + outer loop + vertex 1.11372 0.00240269 0.489362 + vertex 1.10139 0.000261389 -0.510638 + vertex 1.10139 0.000261389 0.489362 + endloop + endfacet + facet normal -0.121427 0.9926 0 + outer loop + vertex 1.10139 0.000261389 0.489362 + vertex 1.10139 0.000261389 -0.510638 + vertex 1.08876 -0.00128324 -0.510638 + endloop + endfacet + facet normal -0.121427 0.9926 0 + outer loop + vertex 1.10139 0.000261389 0.489362 + vertex 1.08876 -0.00128324 -0.510638 + vertex 1.08876 -0.00128324 0.489362 + endloop + endfacet + facet normal -0.0723187 0.997382 0 + outer loop + vertex 1.08876 -0.00128324 0.489362 + vertex 1.08876 -0.00128324 -0.510638 + vertex 1.07585 -0.00221898 -0.510638 + endloop + endfacet + facet normal -0.0723187 0.997382 0 + outer loop + vertex 1.08876 -0.00128324 0.489362 + vertex 1.07585 -0.00221898 -0.510638 + vertex 1.07585 -0.00221898 0.489362 + endloop + endfacet + facet normal -0.0238809 0.999715 0 + outer loop + vertex 1.07585 -0.00221898 0.489362 + vertex 1.07585 -0.00221898 -0.510638 + vertex 1.06268 -0.00253361 -0.510638 + endloop + endfacet + facet normal -0.0238809 0.999715 0 + outer loop + vertex 1.07585 -0.00221898 0.489362 + vertex 1.06268 -0.00253361 -0.510638 + vertex 1.06268 -0.00253361 0.489362 + endloop + endfacet + facet normal 0.00693788 0.999976 0 + outer loop + vertex 1.06268 -0.00253361 0.489362 + vertex 1.06268 -0.00253361 -0.510638 + vertex 1.05979 -0.00251354 -0.510638 + endloop + endfacet + facet normal 0.00693788 0.999976 0 + outer loop + vertex 1.06268 -0.00253361 0.489362 + vertex 1.05979 -0.00251354 -0.510638 + vertex 1.05979 -0.00251354 0.489362 + endloop + endfacet + facet normal 0.0209914 0.99978 0 + outer loop + vertex 1.05979 -0.00251354 0.489362 + vertex 1.05979 -0.00251354 -0.510638 + vertex 1.05691 -0.00245302 -0.510638 + endloop + endfacet + facet normal 0.0209914 0.99978 0 + outer loop + vertex 1.05979 -0.00251354 0.489362 + vertex 1.05691 -0.00245302 -0.510638 + vertex 1.05691 -0.00245302 0.489362 + endloop + endfacet + facet normal 0.0352738 0.999378 0 + outer loop + vertex 1.05691 -0.00245302 0.489362 + vertex 1.05691 -0.00245302 -0.510638 + vertex 1.05403 -0.00235161 -0.510638 + endloop + endfacet + facet normal 0.0352738 0.999378 0 + outer loop + vertex 1.05691 -0.00245302 0.489362 + vertex 1.05403 -0.00235161 -0.510638 + vertex 1.05403 -0.00235161 0.489362 + endloop + endfacet + facet normal 0.049749 0.998762 0 + outer loop + vertex 1.05403 -0.00235161 0.489362 + vertex 1.05403 -0.00235161 -0.510638 + vertex 1.05117 -0.00220887 -0.510638 + endloop + endfacet + facet normal 0.049749 0.998762 0 + outer loop + vertex 1.05403 -0.00235161 0.489362 + vertex 1.05117 -0.00220887 -0.510638 + vertex 1.05117 -0.00220887 0.489362 + endloop + endfacet + facet normal 0.0643761 0.997926 0 + outer loop + vertex 1.05117 -0.00220887 0.489362 + vertex 1.05117 -0.00220887 -0.510638 + vertex 1.04831 -0.00202435 -0.510638 + endloop + endfacet + facet normal 0.0643761 0.997926 0 + outer loop + vertex 1.05117 -0.00220887 0.489362 + vertex 1.04831 -0.00202435 -0.510638 + vertex 1.04831 -0.00202435 0.489362 + endloop + endfacet + facet normal 0.0791153 0.996865 0 + outer loop + vertex 1.04831 -0.00202435 0.489362 + vertex 1.04831 -0.00202435 -0.510638 + vertex 1.04545 -0.00179761 -0.510638 + endloop + endfacet + facet normal 0.0791153 0.996865 0 + outer loop + vertex 1.04831 -0.00202435 0.489362 + vertex 1.04545 -0.00179761 -0.510638 + vertex 1.04545 -0.00179761 0.489362 + endloop + endfacet + facet normal 0.0939245 0.995579 0 + outer loop + vertex 1.04545 -0.00179761 0.489362 + vertex 1.04545 -0.00179761 -0.510638 + vertex 1.04259 -0.0015282 -0.510638 + endloop + endfacet + facet normal 0.0939245 0.995579 0 + outer loop + vertex 1.04545 -0.00179761 0.489362 + vertex 1.04259 -0.0015282 -0.510638 + vertex 1.04259 -0.0015282 0.489362 + endloop + endfacet + facet normal 0.108762 0.994068 0 + outer loop + vertex 1.04259 -0.0015282 0.489362 + vertex 1.04259 -0.0015282 -0.510638 + vertex 1.03974 -0.00121568 -0.510638 + endloop + endfacet + facet normal 0.108762 0.994068 0 + outer loop + vertex 1.04259 -0.0015282 0.489362 + vertex 1.03974 -0.00121568 -0.510638 + vertex 1.03974 -0.00121568 0.489362 + endloop + endfacet + facet normal 0.12359 0.992333 0 + outer loop + vertex 1.03974 -0.00121568 0.489362 + vertex 1.03974 -0.00121568 -0.510638 + vertex 1.03688 -0.00085961 -0.510638 + endloop + endfacet + facet normal 0.12359 0.992333 0 + outer loop + vertex 1.03974 -0.00121568 0.489362 + vertex 1.03688 -0.00085961 -0.510638 + vertex 1.03688 -0.00085961 0.489362 + endloop + endfacet + facet normal 0.138364 0.990381 0 + outer loop + vertex 1.03688 -0.00085961 0.489362 + vertex 1.03688 -0.00085961 -0.510638 + vertex 1.03402 -0.000459536 -0.510638 + endloop + endfacet + facet normal 0.138364 0.990381 0 + outer loop + vertex 1.03688 -0.00085961 0.489362 + vertex 1.03402 -0.000459536 -0.510638 + vertex 1.03402 -0.000459536 0.489362 + endloop + endfacet + facet normal 0.153043 0.98822 0 + outer loop + vertex 1.03402 -0.000459536 0.489362 + vertex 1.03402 -0.000459536 -0.510638 + vertex 1.03115 -1.50171e-05 -0.510638 + endloop + endfacet + facet normal 0.153043 0.98822 0 + outer loop + vertex 1.03402 -0.000459536 0.489362 + vertex 1.03115 -1.50171e-05 -0.510638 + vertex 1.03115 -1.50171e-05 0.489362 + endloop + endfacet + facet normal 0.167587 0.985857 0 + outer loop + vertex 1.03115 -1.50171e-05 0.489362 + vertex 1.03115 -1.50171e-05 -0.510638 + vertex 1.02827 0.00047439 -0.510638 + endloop + endfacet + facet normal 0.167587 0.985857 0 + outer loop + vertex 1.03115 -1.50171e-05 0.489362 + vertex 1.02827 0.00047439 -0.510638 + vertex 1.02827 0.00047439 0.489362 + endloop + endfacet + facet normal 0.181965 0.983305 0 + outer loop + vertex 1.02827 0.00047439 0.489362 + vertex 1.02827 0.00047439 -0.510638 + vertex 1.02538 0.00100913 -0.510638 + endloop + endfacet + facet normal 0.181965 0.983305 0 + outer loop + vertex 1.02827 0.00047439 0.489362 + vertex 1.02538 0.00100913 -0.510638 + vertex 1.02538 0.00100913 0.489362 + endloop + endfacet + facet normal 0.196129 0.980578 0 + outer loop + vertex 1.02538 0.00100913 0.489362 + vertex 1.02538 0.00100913 -0.510638 + vertex 1.02247 0.00158965 -0.510638 + endloop + endfacet + facet normal 0.196129 0.980578 0 + outer loop + vertex 1.02538 0.00100913 0.489362 + vertex 1.02247 0.00158965 -0.510638 + vertex 1.02247 0.00158965 0.489362 + endloop + endfacet + facet normal 0.21006 0.977688 0 + outer loop + vertex 1.02247 0.00158965 0.489362 + vertex 1.02247 0.00158965 -0.510638 + vertex 1.01956 0.00221639 -0.510638 + endloop + endfacet + facet normal 0.21006 0.977688 0 + outer loop + vertex 1.02247 0.00158965 0.489362 + vertex 1.01956 0.00221639 -0.510638 + vertex 1.01956 0.00221639 0.489362 + endloop + endfacet + facet normal 0.223729 0.974651 0 + outer loop + vertex 1.01956 0.00221639 0.489362 + vertex 1.01956 0.00221639 -0.510638 + vertex 1.01662 0.0028898 -0.510638 + endloop + endfacet + facet normal 0.223729 0.974651 0 + outer loop + vertex 1.01956 0.00221639 0.489362 + vertex 1.01662 0.0028898 -0.510638 + vertex 1.01662 0.0028898 0.489362 + endloop + endfacet + facet normal 0.237092 0.971487 0 + outer loop + vertex 1.01662 0.0028898 0.489362 + vertex 1.01662 0.0028898 -0.510638 + vertex 1.01367 0.00361032 -0.510638 + endloop + endfacet + facet normal 0.237092 0.971487 0 + outer loop + vertex 1.01662 0.0028898 0.489362 + vertex 1.01367 0.00361032 -0.510638 + vertex 1.01367 0.00361032 0.489362 + endloop + endfacet + facet normal 0.25014 0.96821 0 + outer loop + vertex 1.01367 0.00361032 0.489362 + vertex 1.01367 0.00361032 -0.510638 + vertex 1.0107 0.00437839 -0.510638 + endloop + endfacet + facet normal 0.25014 0.96821 0 + outer loop + vertex 1.01367 0.00361032 0.489362 + vertex 1.0107 0.00437839 -0.510638 + vertex 1.0107 0.00437839 0.489362 + endloop + endfacet + facet normal 0.262844 0.964838 0 + outer loop + vertex 1.0107 0.00437839 0.489362 + vertex 1.0107 0.00437839 -0.510638 + vertex 1.0077 0.00519446 -0.510638 + endloop + endfacet + facet normal 0.262844 0.964838 0 + outer loop + vertex 1.0107 0.00437839 0.489362 + vertex 1.0077 0.00519446 -0.510638 + vertex 1.0077 0.00519446 0.489362 + endloop + endfacet + facet normal 0.275186 0.961391 0 + outer loop + vertex 1.0077 0.00519446 0.489362 + vertex 1.0077 0.00519446 -0.510638 + vertex 1.00468 0.00605898 -0.510638 + endloop + endfacet + facet normal 0.275186 0.961391 0 + outer loop + vertex 1.0077 0.00519446 0.489362 + vertex 1.00468 0.00605898 -0.510638 + vertex 1.00468 0.00605898 0.489362 + endloop + endfacet + facet normal 0.287139 0.957889 0 + outer loop + vertex 1.00468 0.00605898 0.489362 + vertex 1.00468 0.00605898 -0.510638 + vertex 1.00164 0.00697239 -0.510638 + endloop + endfacet + facet normal 0.287139 0.957889 0 + outer loop + vertex 1.00468 0.00605898 0.489362 + vertex 1.00164 0.00697239 -0.510638 + vertex 1.00164 0.00697239 0.489362 + endloop + endfacet + facet normal 0.298732 0.954337 0 + outer loop + vertex 1.00164 0.00697239 0.489362 + vertex 1.00164 0.00697239 -0.510638 + vertex 0.998559 0.00793513 -0.510638 + endloop + endfacet + facet normal 0.298732 0.954337 0 + outer loop + vertex 1.00164 0.00697239 0.489362 + vertex 0.998559 0.00793513 -0.510638 + vertex 0.998559 0.00793513 0.489362 + endloop + endfacet + facet normal 0.309904 0.950768 0 + outer loop + vertex 0.998559 0.00793513 0.489362 + vertex 0.998559 0.00793513 -0.510638 + vertex 0.995453 0.00894765 -0.510638 + endloop + endfacet + facet normal 0.309904 0.950768 0 + outer loop + vertex 0.998559 0.00793513 0.489362 + vertex 0.995453 0.00894765 -0.510638 + vertex 0.995453 0.00894765 0.489362 + endloop + endfacet + facet normal 0.320678 0.947188 0 + outer loop + vertex 0.995453 0.00894765 0.489362 + vertex 0.995453 0.00894765 -0.510638 + vertex 0.992314 0.0100104 -0.510638 + endloop + endfacet + facet normal 0.320678 0.947188 0 + outer loop + vertex 0.995453 0.00894765 0.489362 + vertex 0.992314 0.0100104 -0.510638 + vertex 0.992314 0.0100104 0.489362 + endloop + endfacet + facet normal 0.331047 0.943614 0 + outer loop + vertex 0.992314 0.0100104 0.489362 + vertex 0.992314 0.0100104 -0.510638 + vertex 0.98914 0.0111238 -0.510638 + endloop + endfacet + facet normal 0.331047 0.943614 0 + outer loop + vertex 0.992314 0.0100104 0.489362 + vertex 0.98914 0.0111238 -0.510638 + vertex 0.98914 0.0111238 0.489362 + endloop + endfacet + facet normal 0.341002 0.940063 0 + outer loop + vertex 0.98914 0.0111238 0.489362 + vertex 0.98914 0.0111238 -0.510638 + vertex 0.98593 0.0122883 -0.510638 + endloop + endfacet + facet normal 0.341002 0.940063 0 + outer loop + vertex 0.98914 0.0111238 0.489362 + vertex 0.98593 0.0122883 -0.510638 + vertex 0.98593 0.0122883 0.489362 + endloop + endfacet + facet normal 0.350543 0.936547 0 + outer loop + vertex 0.98593 0.0122883 0.489362 + vertex 0.98593 0.0122883 -0.510638 + vertex 0.982681 0.0135044 -0.510638 + endloop + endfacet + facet normal 0.350543 0.936547 0 + outer loop + vertex 0.98593 0.0122883 0.489362 + vertex 0.982681 0.0135044 -0.510638 + vertex 0.982681 0.0135044 0.489362 + endloop + endfacet + facet normal 0.359678 0.933077 0 + outer loop + vertex 0.982681 0.0135044 0.489362 + vertex 0.982681 0.0135044 -0.510638 + vertex 0.979392 0.0147725 -0.510638 + endloop + endfacet + facet normal 0.359678 0.933077 0 + outer loop + vertex 0.982681 0.0135044 0.489362 + vertex 0.979392 0.0147725 -0.510638 + vertex 0.979392 0.0147725 0.489362 + endloop + endfacet + facet normal 0.368405 0.929666 0 + outer loop + vertex 0.979392 0.0147725 0.489362 + vertex 0.979392 0.0147725 -0.510638 + vertex 0.976059 0.016093 -0.510638 + endloop + endfacet + facet normal 0.368405 0.929666 0 + outer loop + vertex 0.979392 0.0147725 0.489362 + vertex 0.976059 0.016093 -0.510638 + vertex 0.976059 0.016093 0.489362 + endloop + endfacet + facet normal 0.376728 0.926324 0 + outer loop + vertex 0.976059 0.016093 0.489362 + vertex 0.976059 0.016093 -0.510638 + vertex 0.972682 0.0174664 -0.510638 + endloop + endfacet + facet normal 0.376728 0.926324 0 + outer loop + vertex 0.976059 0.016093 0.489362 + vertex 0.972682 0.0174664 -0.510638 + vertex 0.972682 0.0174664 0.489362 + endloop + endfacet + facet normal -1 0 -0 + outer loop + vertex 0.972682 0.0174664 0.489362 + vertex 0.972682 0.0174664 -0.510638 + vertex 0.972682 -0.223534 -0.510638 + endloop + endfacet + facet normal -1 -0 0 + outer loop + vertex 0.972682 0.0174664 0.489362 + vertex 0.972682 -0.223534 -0.510638 + vertex 0.972682 -0.223534 0.489362 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex 0.972682 -0.223534 0.489362 + vertex 0.972682 -0.223534 -0.510638 + vertex 0.883682 -0.223534 -0.510638 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex 0.972682 -0.223534 0.489362 + vertex 0.883682 -0.223534 -0.510638 + vertex 0.883682 -0.223534 0.489362 + endloop + endfacet + facet normal -0.414837 -0.909896 -0 + outer loop + vertex 0.975389 0.0961864 0.489362 + vertex 0.975389 0.0961864 -0.510638 + vertex 0.978108 0.0949467 -0.510638 + endloop + endfacet + facet normal -0.414837 -0.909896 0 + outer loop + vertex 0.975389 0.0961864 0.489362 + vertex 0.978108 0.0949467 -0.510638 + vertex 0.978108 0.0949467 0.489362 + endloop + endfacet + facet normal -0.402055 -0.915615 -0 + outer loop + vertex 0.978108 0.0949467 0.489362 + vertex 0.978108 0.0949467 -0.510638 + vertex 0.980839 0.0937474 -0.510638 + endloop + endfacet + facet normal -0.402055 -0.915615 0 + outer loop + vertex 0.978108 0.0949467 0.489362 + vertex 0.980839 0.0937474 -0.510638 + vertex 0.980839 0.0937474 0.489362 + endloop + endfacet + facet normal -0.389165 -0.921168 -0 + outer loop + vertex 0.980839 0.0937474 0.489362 + vertex 0.980839 0.0937474 -0.510638 + vertex 0.983582 0.0925887 -0.510638 + endloop + endfacet + facet normal -0.389165 -0.921168 0 + outer loop + vertex 0.980839 0.0937474 0.489362 + vertex 0.983582 0.0925887 -0.510638 + vertex 0.983582 0.0925887 0.489362 + endloop + endfacet + facet normal -0.376162 -0.926554 -0 + outer loop + vertex 0.983582 0.0925887 0.489362 + vertex 0.983582 0.0925887 -0.510638 + vertex 0.986335 0.091471 -0.510638 + endloop + endfacet + facet normal -0.376162 -0.926554 0 + outer loop + vertex 0.983582 0.0925887 0.489362 + vertex 0.986335 0.091471 -0.510638 + vertex 0.986335 0.091471 0.489362 + endloop + endfacet + facet normal -0.363046 -0.931771 -0 + outer loop + vertex 0.986335 0.091471 0.489362 + vertex 0.986335 0.091471 -0.510638 + vertex 0.989098 0.0903944 -0.510638 + endloop + endfacet + facet normal -0.363046 -0.931771 0 + outer loop + vertex 0.986335 0.091471 0.489362 + vertex 0.989098 0.0903944 -0.510638 + vertex 0.989098 0.0903944 0.489362 + endloop + endfacet + facet normal -0.349814 -0.936819 -0 + outer loop + vertex 0.989098 0.0903944 0.489362 + vertex 0.989098 0.0903944 -0.510638 + vertex 0.991871 0.0893591 -0.510638 + endloop + endfacet + facet normal -0.349814 -0.936819 0 + outer loop + vertex 0.989098 0.0903944 0.489362 + vertex 0.991871 0.0893591 -0.510638 + vertex 0.991871 0.0893591 0.489362 + endloop + endfacet + facet normal -0.336473 -0.941693 -0 + outer loop + vertex 0.991871 0.0893591 0.489362 + vertex 0.991871 0.0893591 -0.510638 + vertex 0.994652 0.0883653 -0.510638 + endloop + endfacet + facet normal -0.336473 -0.941693 0 + outer loop + vertex 0.991871 0.0893591 0.489362 + vertex 0.994652 0.0883653 -0.510638 + vertex 0.994652 0.0883653 0.489362 + endloop + endfacet + facet normal -0.323007 -0.946396 -0 + outer loop + vertex 0.994652 0.0883653 0.489362 + vertex 0.994652 0.0883653 -0.510638 + vertex 0.997441 0.0874134 -0.510638 + endloop + endfacet + facet normal -0.323007 -0.946396 0 + outer loop + vertex 0.994652 0.0883653 0.489362 + vertex 0.997441 0.0874134 -0.510638 + vertex 0.997441 0.0874134 0.489362 + endloop + endfacet + facet normal -0.309415 -0.950927 -0 + outer loop + vertex 0.997441 0.0874134 0.489362 + vertex 0.997441 0.0874134 -0.510638 + vertex 1.00024 0.0865034 -0.510638 + endloop + endfacet + facet normal -0.309415 -0.950927 0 + outer loop + vertex 0.997441 0.0874134 0.489362 + vertex 1.00024 0.0865034 -0.510638 + vertex 1.00024 0.0865034 0.489362 + endloop + endfacet + facet normal -0.29572 -0.955275 -0 + outer loop + vertex 1.00024 0.0865034 0.489362 + vertex 1.00024 0.0865034 -0.510638 + vertex 1.00304 0.0856357 -0.510638 + endloop + endfacet + facet normal -0.29572 -0.955275 0 + outer loop + vertex 1.00024 0.0865034 0.489362 + vertex 1.00304 0.0856357 -0.510638 + vertex 1.00304 0.0856357 0.489362 + endloop + endfacet + facet normal -0.281862 -0.959455 -0 + outer loop + vertex 1.00304 0.0856357 0.489362 + vertex 1.00304 0.0856357 -0.510638 + vertex 1.00585 0.0848104 -0.510638 + endloop + endfacet + facet normal -0.281862 -0.959455 0 + outer loop + vertex 1.00304 0.0856357 0.489362 + vertex 1.00585 0.0848104 -0.510638 + vertex 1.00585 0.0848104 0.489362 + endloop + endfacet + facet normal -0.267904 -0.963446 -0 + outer loop + vertex 1.00585 0.0848104 0.489362 + vertex 1.00585 0.0848104 -0.510638 + vertex 1.00866 0.0840277 -0.510638 + endloop + endfacet + facet normal -0.267904 -0.963446 0 + outer loop + vertex 1.00585 0.0848104 0.489362 + vertex 1.00866 0.0840277 -0.510638 + vertex 1.00866 0.0840277 0.489362 + endloop + endfacet + facet normal -0.253803 -0.967256 -0 + outer loop + vertex 1.00866 0.0840277 0.489362 + vertex 1.00866 0.0840277 -0.510638 + vertex 1.01148 0.083288 -0.510638 + endloop + endfacet + facet normal -0.253803 -0.967256 0 + outer loop + vertex 1.00866 0.0840277 0.489362 + vertex 1.01148 0.083288 -0.510638 + vertex 1.01148 0.083288 0.489362 + endloop + endfacet + facet normal -0.239564 -0.970881 -0 + outer loop + vertex 1.01148 0.083288 0.489362 + vertex 1.01148 0.083288 -0.510638 + vertex 1.01431 0.0825914 -0.510638 + endloop + endfacet + facet normal -0.239564 -0.970881 0 + outer loop + vertex 1.01148 0.083288 0.489362 + vertex 1.01431 0.0825914 -0.510638 + vertex 1.01431 0.0825914 0.489362 + endloop + endfacet + facet normal -0.22519 -0.974315 -0 + outer loop + vertex 1.01431 0.0825914 0.489362 + vertex 1.01431 0.0825914 -0.510638 + vertex 1.01713 0.0819381 -0.510638 + endloop + endfacet + facet normal -0.22519 -0.974315 0 + outer loop + vertex 1.01431 0.0825914 0.489362 + vertex 1.01713 0.0819381 -0.510638 + vertex 1.01713 0.0819381 0.489362 + endloop + endfacet + facet normal -0.21068 -0.977555 -0 + outer loop + vertex 1.01713 0.0819381 0.489362 + vertex 1.01713 0.0819381 -0.510638 + vertex 1.01996 0.0813283 -0.510638 + endloop + endfacet + facet normal -0.21068 -0.977555 0 + outer loop + vertex 1.01713 0.0819381 0.489362 + vertex 1.01996 0.0813283 -0.510638 + vertex 1.01996 0.0813283 0.489362 + endloop + endfacet + facet normal -0.196022 -0.9806 -0 + outer loop + vertex 1.01996 0.0813283 0.489362 + vertex 1.01996 0.0813283 -0.510638 + vertex 1.02279 0.0807624 -0.510638 + endloop + endfacet + facet normal -0.196022 -0.9806 0 + outer loop + vertex 1.01996 0.0813283 0.489362 + vertex 1.02279 0.0807624 -0.510638 + vertex 1.02279 0.0807624 0.489362 + endloop + endfacet + facet normal -0.181224 -0.983442 -0 + outer loop + vertex 1.02279 0.0807624 0.489362 + vertex 1.02279 0.0807624 -0.510638 + vertex 1.02563 0.0802404 -0.510638 + endloop + endfacet + facet normal -0.181224 -0.983442 0 + outer loop + vertex 1.02279 0.0807624 0.489362 + vertex 1.02563 0.0802404 -0.510638 + vertex 1.02563 0.0802404 0.489362 + endloop + endfacet + facet normal -0.166272 -0.98608 -0 + outer loop + vertex 1.02563 0.0802404 0.489362 + vertex 1.02563 0.0802404 -0.510638 + vertex 1.02846 0.0797627 -0.510638 + endloop + endfacet + facet normal -0.166272 -0.98608 0 + outer loop + vertex 1.02563 0.0802404 0.489362 + vertex 1.02846 0.0797627 -0.510638 + vertex 1.02846 0.0797627 0.489362 + endloop + endfacet + facet normal -0.151175 -0.988507 -0 + outer loop + vertex 1.02846 0.0797627 0.489362 + vertex 1.02846 0.0797627 -0.510638 + vertex 1.03129 0.0793294 -0.510638 + endloop + endfacet + facet normal -0.151175 -0.988507 0 + outer loop + vertex 1.02846 0.0797627 0.489362 + vertex 1.03129 0.0793294 -0.510638 + vertex 1.03129 0.0793294 0.489362 + endloop + endfacet + facet normal -0.135929 -0.990719 -0 + outer loop + vertex 1.03129 0.0793294 0.489362 + vertex 1.03129 0.0793294 -0.510638 + vertex 1.03413 0.0789407 -0.510638 + endloop + endfacet + facet normal -0.135929 -0.990719 0 + outer loop + vertex 1.03129 0.0793294 0.489362 + vertex 1.03413 0.0789407 -0.510638 + vertex 1.03413 0.0789407 0.489362 + endloop + endfacet + facet normal -0.120525 -0.99271 -0 + outer loop + vertex 1.03413 0.0789407 0.489362 + vertex 1.03413 0.0789407 -0.510638 + vertex 1.03696 0.078597 -0.510638 + endloop + endfacet + facet normal -0.120525 -0.99271 0 + outer loop + vertex 1.03413 0.0789407 0.489362 + vertex 1.03696 0.078597 -0.510638 + vertex 1.03696 0.078597 0.489362 + endloop + endfacet + facet normal -0.104969 -0.994476 -0 + outer loop + vertex 1.03696 0.078597 0.489362 + vertex 1.03696 0.078597 -0.510638 + vertex 1.03979 0.0782984 -0.510638 + endloop + endfacet + facet normal -0.104969 -0.994476 0 + outer loop + vertex 1.03696 0.078597 0.489362 + vertex 1.03979 0.0782984 -0.510638 + vertex 1.03979 0.0782984 0.489362 + endloop + endfacet + facet normal -0.0892553 -0.996009 -0 + outer loop + vertex 1.03979 0.0782984 0.489362 + vertex 1.03979 0.0782984 -0.510638 + vertex 1.04261 0.0780451 -0.510638 + endloop + endfacet + facet normal -0.0892553 -0.996009 0 + outer loop + vertex 1.03979 0.0782984 0.489362 + vertex 1.04261 0.0780451 -0.510638 + vertex 1.04261 0.0780451 0.489362 + endloop + endfacet + facet normal -0.0733829 -0.997304 -0 + outer loop + vertex 1.04261 0.0780451 0.489362 + vertex 1.04261 0.0780451 -0.510638 + vertex 1.04544 0.0778373 -0.510638 + endloop + endfacet + facet normal -0.0733829 -0.997304 0 + outer loop + vertex 1.04261 0.0780451 0.489362 + vertex 1.04544 0.0778373 -0.510638 + vertex 1.04544 0.0778373 0.489362 + endloop + endfacet + facet normal -0.057355 -0.998354 -0 + outer loop + vertex 1.04544 0.0778373 0.489362 + vertex 1.04544 0.0778373 -0.510638 + vertex 1.04826 0.0776754 -0.510638 + endloop + endfacet + facet normal -0.057355 -0.998354 0 + outer loop + vertex 1.04544 0.0778373 0.489362 + vertex 1.04826 0.0776754 -0.510638 + vertex 1.04826 0.0776754 0.489362 + endloop + endfacet + facet normal -0.0411658 -0.999152 -0 + outer loop + vertex 1.04826 0.0776754 0.489362 + vertex 1.04826 0.0776754 -0.510638 + vertex 1.05107 0.0775594 -0.510638 + endloop + endfacet + facet normal -0.0411658 -0.999152 0 + outer loop + vertex 1.04826 0.0776754 0.489362 + vertex 1.05107 0.0775594 -0.510638 + vertex 1.05107 0.0775594 0.489362 + endloop + endfacet + facet normal -0.0248173 -0.999692 -0 + outer loop + vertex 1.05107 0.0775594 0.489362 + vertex 1.05107 0.0775594 -0.510638 + vertex 1.05388 0.0774897 -0.510638 + endloop + endfacet + facet normal -0.0248173 -0.999692 0 + outer loop + vertex 1.05107 0.0775594 0.489362 + vertex 1.05388 0.0774897 -0.510638 + vertex 1.05388 0.0774897 0.489362 + endloop + endfacet + facet normal -0.0083109 -0.999965 -0 + outer loop + vertex 1.05388 0.0774897 0.489362 + vertex 1.05388 0.0774897 -0.510638 + vertex 1.05668 0.0774664 -0.510638 + endloop + endfacet + facet normal -0.0083109 -0.999965 0 + outer loop + vertex 1.05388 0.0774897 0.489362 + vertex 1.05668 0.0774664 -0.510638 + vertex 1.05668 0.0774664 0.489362 + endloop + endfacet + facet normal 0.0257429 -0.999669 0 + outer loop + vertex 1.05668 0.0774664 0.489362 + vertex 1.05668 0.0774664 -0.510638 + vertex 1.0649 0.0776781 -0.510638 + endloop + endfacet + facet normal 0.0257429 -0.999669 0 + outer loop + vertex 1.05668 0.0774664 0.489362 + vertex 1.0649 0.0776781 -0.510638 + vertex 1.0649 0.0776781 0.489362 + endloop + endfacet + facet normal 0.0778446 -0.996966 0 + outer loop + vertex 1.0649 0.0776781 0.489362 + vertex 1.0649 0.0776781 -0.510638 + vertex 1.07296 0.0783075 -0.510638 + endloop + endfacet + facet normal 0.0778446 -0.996966 0 + outer loop + vertex 1.0649 0.0776781 0.489362 + vertex 1.07296 0.0783075 -0.510638 + vertex 1.07296 0.0783075 0.489362 + endloop + endfacet + facet normal 0.130403 -0.991461 0 + outer loop + vertex 1.07296 0.0783075 0.489362 + vertex 1.07296 0.0783075 -0.510638 + vertex 1.08086 0.0793453 -0.510638 + endloop + endfacet + facet normal 0.130403 -0.991461 0 + outer loop + vertex 1.07296 0.0783075 0.489362 + vertex 1.08086 0.0793453 -0.510638 + vertex 1.08086 0.0793453 0.489362 + endloop + endfacet + facet normal 0.183185 -0.983079 0 + outer loop + vertex 1.08086 0.0793453 0.489362 + vertex 1.08086 0.0793453 -0.510638 + vertex 1.08857 0.0807825 -0.510638 + endloop + endfacet + facet normal 0.183185 -0.983079 0 + outer loop + vertex 1.08086 0.0793453 0.489362 + vertex 1.08857 0.0807825 -0.510638 + vertex 1.08857 0.0807825 0.489362 + endloop + endfacet + facet normal 0.235941 -0.971767 0 + outer loop + vertex 1.08857 0.0807825 0.489362 + vertex 1.08857 0.0807825 -0.510638 + vertex 1.09609 0.0826098 -0.510638 + endloop + endfacet + facet normal 0.235941 -0.971767 0 + outer loop + vertex 1.08857 0.0807825 0.489362 + vertex 1.09609 0.0826098 -0.510638 + vertex 1.09609 0.0826098 0.489362 + endloop + endfacet + facet normal 0.288414 -0.957506 0 + outer loop + vertex 1.09609 0.0826098 0.489362 + vertex 1.09609 0.0826098 -0.510638 + vertex 1.10343 0.0848183 -0.510638 + endloop + endfacet + facet normal 0.288414 -0.957506 0 + outer loop + vertex 1.09609 0.0826098 0.489362 + vertex 1.10343 0.0848183 -0.510638 + vertex 1.10343 0.0848183 0.489362 + endloop + endfacet + facet normal 0.340346 -0.9403 0 + outer loop + vertex 1.10343 0.0848183 0.489362 + vertex 1.10343 0.0848183 -0.510638 + vertex 1.11056 0.0873988 -0.510638 + endloop + endfacet + facet normal 0.340346 -0.9403 0 + outer loop + vertex 1.10343 0.0848183 0.489362 + vertex 1.11056 0.0873988 -0.510638 + vertex 1.11056 0.0873988 0.489362 + endloop + endfacet + facet normal 0.391483 -0.920185 0 + outer loop + vertex 1.11056 0.0873988 0.489362 + vertex 1.11056 0.0873988 -0.510638 + vertex 1.11747 0.0903422 -0.510638 + endloop + endfacet + facet normal 0.391483 -0.920185 0 + outer loop + vertex 1.11056 0.0873988 0.489362 + vertex 1.11747 0.0903422 -0.510638 + vertex 1.11747 0.0903422 0.489362 + endloop + endfacet + facet normal 0.441579 -0.897223 0 + outer loop + vertex 1.11747 0.0903422 0.489362 + vertex 1.11747 0.0903422 -0.510638 + vertex 1.12417 0.0936393 -0.510638 + endloop + endfacet + facet normal 0.441579 -0.897223 0 + outer loop + vertex 1.11747 0.0903422 0.489362 + vertex 1.12417 0.0936393 -0.510638 + vertex 1.12417 0.0936393 0.489362 + endloop + endfacet + facet normal 0.490397 -0.871499 0 + outer loop + vertex 1.12417 0.0936393 0.489362 + vertex 1.12417 0.0936393 -0.510638 + vertex 1.13065 0.0972812 -0.510638 + endloop + endfacet + facet normal 0.490397 -0.871499 0 + outer loop + vertex 1.12417 0.0936393 0.489362 + vertex 1.13065 0.0972812 -0.510638 + vertex 1.13065 0.0972812 0.489362 + endloop + endfacet + facet normal 0.537716 -0.843126 0 + outer loop + vertex 1.13065 0.0972812 0.489362 + vertex 1.13065 0.0972812 -0.510638 + vertex 1.13688 0.101259 -0.510638 + endloop + endfacet + facet normal 0.537716 -0.843126 0 + outer loop + vertex 1.13065 0.0972812 0.489362 + vertex 1.13688 0.101259 -0.510638 + vertex 1.13688 0.101259 0.489362 + endloop + endfacet + facet normal 0.583332 -0.812234 0 + outer loop + vertex 1.13688 0.101259 0.489362 + vertex 1.13688 0.101259 -0.510638 + vertex 1.14287 0.105562 -0.510638 + endloop + endfacet + facet normal 0.583332 -0.812234 0 + outer loop + vertex 1.13688 0.101259 0.489362 + vertex 1.14287 0.105562 -0.510638 + vertex 1.14287 0.105562 0.489362 + endloop + endfacet + facet normal 0.627062 -0.778969 0 + outer loop + vertex 1.14287 0.105562 0.489362 + vertex 1.14287 0.105562 -0.510638 + vertex 1.14862 0.110184 -0.510638 + endloop + endfacet + facet normal 0.627062 -0.778969 0 + outer loop + vertex 1.14287 0.105562 0.489362 + vertex 1.14862 0.110184 -0.510638 + vertex 1.14862 0.110184 0.489362 + endloop + endfacet + facet normal 0.66874 -0.743496 0 + outer loop + vertex 1.14862 0.110184 0.489362 + vertex 1.14862 0.110184 -0.510638 + vertex 1.1541 0.115113 -0.510638 + endloop + endfacet + facet normal 0.66874 -0.743496 0 + outer loop + vertex 1.14862 0.110184 0.489362 + vertex 1.1541 0.115113 -0.510638 + vertex 1.1541 0.115113 0.489362 + endloop + endfacet + facet normal 0.708226 -0.705986 0 + outer loop + vertex 1.1541 0.115113 0.489362 + vertex 1.1541 0.115113 -0.510638 + vertex 1.15931 0.120341 -0.510638 + endloop + endfacet + facet normal 0.708226 -0.705986 0 + outer loop + vertex 1.1541 0.115113 0.489362 + vertex 1.15931 0.120341 -0.510638 + vertex 1.15931 0.120341 0.489362 + endloop + endfacet + facet normal 0.745398 -0.66662 0 + outer loop + vertex 1.15931 0.120341 0.489362 + vertex 1.15931 0.120341 -0.510638 + vertex 1.16424 0.12586 -0.510638 + endloop + endfacet + facet normal 0.745398 -0.66662 0 + outer loop + vertex 1.15931 0.120341 0.489362 + vertex 1.16424 0.12586 -0.510638 + vertex 1.16424 0.12586 0.489362 + endloop + endfacet + facet normal 0.780156 -0.625585 0 + outer loop + vertex 1.16424 0.12586 0.489362 + vertex 1.16424 0.12586 -0.510638 + vertex 1.16889 0.131659 -0.510638 + endloop + endfacet + facet normal 0.780156 -0.625585 0 + outer loop + vertex 1.16424 0.12586 0.489362 + vertex 1.16889 0.131659 -0.510638 + vertex 1.16889 0.131659 0.489362 + endloop + endfacet + facet normal 0.812415 -0.58308 0 + outer loop + vertex 1.16889 0.131659 0.489362 + vertex 1.16889 0.131659 -0.510638 + vertex 1.17325 0.13773 -0.510638 + endloop + endfacet + facet normal 0.812415 -0.58308 0 + outer loop + vertex 1.16889 0.131659 0.489362 + vertex 1.17325 0.13773 -0.510638 + vertex 1.17325 0.13773 0.489362 + endloop + endfacet + facet normal 0.84213 -0.539274 0 + outer loop + vertex 1.17325 0.13773 0.489362 + vertex 1.17325 0.13773 -0.510638 + vertex 1.17731 0.144064 -0.510638 + endloop + endfacet + facet normal 0.84213 -0.539274 0 + outer loop + vertex 1.17325 0.13773 0.489362 + vertex 1.17731 0.144064 -0.510638 + vertex 1.17731 0.144064 0.489362 + endloop + endfacet + facet normal 0.869254 -0.494365 0 + outer loop + vertex 1.17731 0.144064 0.489362 + vertex 1.17731 0.144064 -0.510638 + vertex 1.18105 0.150652 -0.510638 + endloop + endfacet + facet normal 0.869254 -0.494365 0 + outer loop + vertex 1.17731 0.144064 0.489362 + vertex 1.18105 0.150652 -0.510638 + vertex 1.18105 0.150652 0.489362 + endloop + endfacet + facet normal 0.893763 -0.448539 0 + outer loop + vertex 1.18105 0.150652 0.489362 + vertex 1.18105 0.150652 -0.510638 + vertex 1.18448 0.157483 -0.510638 + endloop + endfacet + facet normal 0.893763 -0.448539 0 + outer loop + vertex 1.18105 0.150652 0.489362 + vertex 1.18448 0.157483 -0.510638 + vertex 1.18448 0.157483 0.489362 + endloop + endfacet + facet normal 0.915643 -0.401991 0 + outer loop + vertex 1.18448 0.157483 0.489362 + vertex 1.18448 0.157483 -0.510638 + vertex 1.18758 0.164551 -0.510638 + endloop + endfacet + facet normal 0.915643 -0.401991 0 + outer loop + vertex 1.18448 0.157483 0.489362 + vertex 1.18758 0.164551 -0.510638 + vertex 1.18758 0.164551 0.489362 + endloop + endfacet + facet normal 0.934915 -0.354872 0 + outer loop + vertex 1.18758 0.164551 0.489362 + vertex 1.18758 0.164551 -0.510638 + vertex 1.19035 0.171844 -0.510638 + endloop + endfacet + facet normal 0.934915 -0.354872 0 + outer loop + vertex 1.18758 0.164551 0.489362 + vertex 1.19035 0.171844 -0.510638 + vertex 1.19035 0.171844 0.489362 + endloop + endfacet + facet normal 0.951591 -0.307367 0 + outer loop + vertex 1.19035 0.171844 0.489362 + vertex 1.19035 0.171844 -0.510638 + vertex 1.19278 0.179354 -0.510638 + endloop + endfacet + facet normal 0.951591 -0.307367 0 + outer loop + vertex 1.19035 0.171844 0.489362 + vertex 1.19278 0.179354 -0.510638 + vertex 1.19278 0.179354 0.489362 + endloop + endfacet + facet normal 0.965702 -0.259654 0 + outer loop + vertex 1.19278 0.179354 0.489362 + vertex 1.19278 0.179354 -0.510638 + vertex 1.19485 0.187073 -0.510638 + endloop + endfacet + facet normal 0.965702 -0.259654 0 + outer loop + vertex 1.19278 0.179354 0.489362 + vertex 1.19485 0.187073 -0.510638 + vertex 1.19485 0.187073 0.489362 + endloop + endfacet + facet normal 0.977299 -0.211865 0 + outer loop + vertex 1.19485 0.187073 0.489362 + vertex 1.19485 0.187073 -0.510638 + vertex 1.19657 0.19499 -0.510638 + endloop + endfacet + facet normal 0.977299 -0.211865 0 + outer loop + vertex 1.19485 0.187073 0.489362 + vertex 1.19657 0.19499 -0.510638 + vertex 1.19657 0.19499 0.489362 + endloop + endfacet + facet normal 0.986431 -0.164178 0 + outer loop + vertex 1.19657 0.19499 0.489362 + vertex 1.19657 0.19499 -0.510638 + vertex 1.19792 0.203097 -0.510638 + endloop + endfacet + facet normal 0.986431 -0.164178 0 + outer loop + vertex 1.19657 0.19499 0.489362 + vertex 1.19792 0.203097 -0.510638 + vertex 1.19792 0.203097 0.489362 + endloop + endfacet + facet normal 0.993166 -0.116712 0 + outer loop + vertex 1.19792 0.203097 0.489362 + vertex 1.19792 0.203097 -0.510638 + vertex 1.19889 0.211385 -0.510638 + endloop + endfacet + facet normal 0.993166 -0.116712 0 + outer loop + vertex 1.19792 0.203097 0.489362 + vertex 1.19889 0.211385 -0.510638 + vertex 1.19889 0.211385 0.489362 + endloop + endfacet + facet normal 0.997573 -0.0696282 0 + outer loop + vertex 1.19889 0.211385 0.489362 + vertex 1.19889 0.211385 -0.510638 + vertex 1.19948 0.219845 -0.510638 + endloop + endfacet + facet normal 0.997573 -0.0696282 0 + outer loop + vertex 1.19889 0.211385 0.489362 + vertex 1.19948 0.219845 -0.510638 + vertex 1.19948 0.219845 0.489362 + endloop + endfacet + facet normal 0.999735 -0.0230288 0 + outer loop + vertex 1.19948 0.219845 0.489362 + vertex 1.19948 0.219845 -0.510638 + vertex 1.19968 0.228466 -0.510638 + endloop + endfacet + facet normal 0.999735 -0.0230288 0 + outer loop + vertex 1.19948 0.219845 0.489362 + vertex 1.19968 0.228466 -0.510638 + vertex 1.19968 0.228466 0.489362 + endloop + endfacet + facet normal 0.999841 0.0178212 0 + outer loop + vertex 1.19968 0.228466 0.489362 + vertex 1.19968 0.228466 -0.510638 + vertex 1.19952 0.237636 -0.510638 + endloop + endfacet + facet normal 0.999841 0.0178212 0 + outer loop + vertex 1.19968 0.228466 0.489362 + vertex 1.19952 0.237636 -0.510638 + vertex 1.19952 0.237636 0.489362 + endloop + endfacet + facet normal 0.998492 0.0549031 0 + outer loop + vertex 1.19952 0.237636 0.489362 + vertex 1.19952 0.237636 -0.510638 + vertex 1.19903 0.246542 -0.510638 + endloop + endfacet + facet normal 0.998492 0.0549031 0 + outer loop + vertex 1.19952 0.237636 0.489362 + vertex 1.19903 0.246542 -0.510638 + vertex 1.19903 0.246542 0.489362 + endloop + endfacet + facet normal 0.995569 0.0940305 0 + outer loop + vertex 1.19903 0.246542 0.489362 + vertex 1.19903 0.246542 -0.510638 + vertex 1.19821 0.255181 -0.510638 + endloop + endfacet + facet normal 0.995569 0.0940305 0 + outer loop + vertex 1.19903 0.246542 0.489362 + vertex 1.19821 0.255181 -0.510638 + vertex 1.19821 0.255181 0.489362 + endloop + endfacet + facet normal 0.99082 0.135185 0 + outer loop + vertex 1.19821 0.255181 0.489362 + vertex 1.19821 0.255181 -0.510638 + vertex 1.19707 0.263551 -0.510638 + endloop + endfacet + facet normal 0.99082 0.135185 0 + outer loop + vertex 1.19821 0.255181 0.489362 + vertex 1.19707 0.263551 -0.510638 + vertex 1.19707 0.263551 0.489362 + endloop + endfacet + facet normal 0.983962 0.178377 0 + outer loop + vertex 1.19707 0.263551 0.489362 + vertex 1.19707 0.263551 -0.510638 + vertex 1.1956 0.271647 -0.510638 + endloop + endfacet + facet normal 0.983962 0.178377 0 + outer loop + vertex 1.19707 0.263551 0.489362 + vertex 1.1956 0.271647 -0.510638 + vertex 1.1956 0.271647 0.489362 + endloop + endfacet + facet normal 0.974697 0.223531 0 + outer loop + vertex 1.1956 0.271647 0.489362 + vertex 1.1956 0.271647 -0.510638 + vertex 1.19381 0.279466 -0.510638 + endloop + endfacet + facet normal 0.974697 0.223531 0 + outer loop + vertex 1.1956 0.271647 0.489362 + vertex 1.19381 0.279466 -0.510638 + vertex 1.19381 0.279466 0.489362 + endloop + endfacet + facet normal 0.962714 0.270523 0 + outer loop + vertex 1.19381 0.279466 0.489362 + vertex 1.19381 0.279466 -0.510638 + vertex 1.19169 0.287006 -0.510638 + endloop + endfacet + facet normal 0.962714 0.270523 0 + outer loop + vertex 1.19381 0.279466 0.489362 + vertex 1.19169 0.287006 -0.510638 + vertex 1.19169 0.287006 0.489362 + endloop + endfacet + facet normal 0.947696 0.319175 0 + outer loop + vertex 1.19169 0.287006 0.489362 + vertex 1.19169 0.287006 -0.510638 + vertex 1.18925 0.294262 -0.510638 + endloop + endfacet + facet normal 0.947696 0.319175 0 + outer loop + vertex 1.19169 0.287006 0.489362 + vertex 1.18925 0.294262 -0.510638 + vertex 1.18925 0.294262 0.489362 + endloop + endfacet + facet normal 0.929354 0.369189 0 + outer loop + vertex 1.18925 0.294262 0.489362 + vertex 1.18925 0.294262 -0.510638 + vertex 1.18648 0.301231 -0.510638 + endloop + endfacet + facet normal 0.929354 0.369189 0 + outer loop + vertex 1.18925 0.294262 0.489362 + vertex 1.18648 0.301231 -0.510638 + vertex 1.18648 0.301231 0.489362 + endloop + endfacet + facet normal 0.90742 0.420225 0 + outer loop + vertex 1.18648 0.301231 0.489362 + vertex 1.18648 0.301231 -0.510638 + vertex 1.18339 0.307911 -0.510638 + endloop + endfacet + facet normal 0.90742 0.420225 0 + outer loop + vertex 1.18648 0.301231 0.489362 + vertex 1.18339 0.307911 -0.510638 + vertex 1.18339 0.307911 0.489362 + endloop + endfacet + facet normal 0.881675 0.471857 0 + outer loop + vertex 1.18339 0.307911 0.489362 + vertex 1.18339 0.307911 -0.510638 + vertex 1.17997 0.314297 -0.510638 + endloop + endfacet + facet normal 0.881675 0.471857 0 + outer loop + vertex 1.18339 0.307911 0.489362 + vertex 1.17997 0.314297 -0.510638 + vertex 1.17997 0.314297 0.489362 + endloop + endfacet + facet normal 0.851994 0.523552 0 + outer loop + vertex 1.17997 0.314297 0.489362 + vertex 1.17997 0.314297 -0.510638 + vertex 1.17623 0.320386 -0.510638 + endloop + endfacet + facet normal 0.851994 0.523552 0 + outer loop + vertex 1.17997 0.314297 0.489362 + vertex 1.17623 0.320386 -0.510638 + vertex 1.17623 0.320386 0.489362 + endloop + endfacet + facet normal 0.818343 0.57473 0 + outer loop + vertex 1.17623 0.320386 0.489362 + vertex 1.17623 0.320386 -0.510638 + vertex 1.17216 0.326176 -0.510638 + endloop + endfacet + facet normal 0.818343 0.57473 0 + outer loop + vertex 1.17623 0.320386 0.489362 + vertex 1.17216 0.326176 -0.510638 + vertex 1.17216 0.326176 0.489362 + endloop + endfacet + facet normal 0.780808 0.624772 0 + outer loop + vertex 1.17216 0.326176 0.489362 + vertex 1.17216 0.326176 -0.510638 + vertex 1.16777 0.331662 -0.510638 + endloop + endfacet + facet normal 0.780808 0.624772 0 + outer loop + vertex 1.17216 0.326176 0.489362 + vertex 1.16777 0.331662 -0.510638 + vertex 1.16777 0.331662 0.489362 + endloop + endfacet + facet normal 0.739605 0.673042 0 + outer loop + vertex 1.16777 0.331662 0.489362 + vertex 1.16777 0.331662 -0.510638 + vertex 1.16306 0.336841 -0.510638 + endloop + endfacet + facet normal 0.739605 0.673042 0 + outer loop + vertex 1.16777 0.331662 0.489362 + vertex 1.16306 0.336841 -0.510638 + vertex 1.16306 0.336841 0.489362 + endloop + endfacet + facet normal 0.695076 0.718937 0 + outer loop + vertex 1.16306 0.336841 0.489362 + vertex 1.16306 0.336841 -0.510638 + vertex 1.15802 0.341711 -0.510638 + endloop + endfacet + facet normal 0.695076 0.718937 0 + outer loop + vertex 1.16306 0.336841 0.489362 + vertex 1.15802 0.341711 -0.510638 + vertex 1.15802 0.341711 0.489362 + endloop + endfacet + facet normal 0.647674 0.761917 0 + outer loop + vertex 1.15802 0.341711 0.489362 + vertex 1.15802 0.341711 -0.510638 + vertex 1.15266 0.346267 -0.510638 + endloop + endfacet + facet normal 0.647674 0.761917 0 + outer loop + vertex 1.15802 0.341711 0.489362 + vertex 1.15266 0.346267 -0.510638 + vertex 1.15266 0.346267 0.489362 + endloop + endfacet + facet normal 0.597967 0.801521 0 + outer loop + vertex 1.15266 0.346267 0.489362 + vertex 1.15266 0.346267 -0.510638 + vertex 1.14698 0.350506 -0.510638 + endloop + endfacet + facet normal 0.597967 0.801521 0 + outer loop + vertex 1.15266 0.346267 0.489362 + vertex 1.14698 0.350506 -0.510638 + vertex 1.14698 0.350506 0.489362 + endloop + endfacet + facet normal 0.546557 0.837422 0 + outer loop + vertex 1.14698 0.350506 0.489362 + vertex 1.14698 0.350506 -0.510638 + vertex 1.14097 0.354426 -0.510638 + endloop + endfacet + facet normal 0.546557 0.837422 0 + outer loop + vertex 1.14698 0.350506 0.489362 + vertex 1.14097 0.354426 -0.510638 + vertex 1.14097 0.354426 0.489362 + endloop + endfacet + facet normal 0.494091 0.86941 0 + outer loop + vertex 1.14097 0.354426 0.489362 + vertex 1.14097 0.354426 -0.510638 + vertex 1.13465 0.358022 -0.510638 + endloop + endfacet + facet normal 0.494091 0.86941 0 + outer loop + vertex 1.14097 0.354426 0.489362 + vertex 1.13465 0.358022 -0.510638 + vertex 1.13465 0.358022 0.489362 + endloop + endfacet + facet normal 0.441206 0.897406 0 + outer loop + vertex 1.13465 0.358022 0.489362 + vertex 1.13465 0.358022 -0.510638 + vertex 1.128 0.361291 -0.510638 + endloop + endfacet + facet normal 0.441206 0.897406 0 + outer loop + vertex 1.13465 0.358022 0.489362 + vertex 1.128 0.361291 -0.510638 + vertex 1.128 0.361291 0.489362 + endloop + endfacet + facet normal 0.388492 0.921452 0 + outer loop + vertex 1.128 0.361291 0.489362 + vertex 1.128 0.361291 -0.510638 + vertex 1.12102 0.364231 -0.510638 + endloop + endfacet + facet normal 0.388492 0.921452 0 + outer loop + vertex 1.128 0.361291 0.489362 + vertex 1.12102 0.364231 -0.510638 + vertex 1.12102 0.364231 0.489362 + endloop + endfacet + facet normal 0.336477 0.941692 0 + outer loop + vertex 1.12102 0.364231 0.489362 + vertex 1.12102 0.364231 -0.510638 + vertex 1.11373 0.366837 -0.510638 + endloop + endfacet + facet normal 0.336477 0.941692 0 + outer loop + vertex 1.12102 0.364231 0.489362 + vertex 1.11373 0.366837 -0.510638 + vertex 1.11373 0.366837 0.489362 + endloop + endfacet + facet normal 0.285598 0.958349 0 + outer loop + vertex 1.11373 0.366837 0.489362 + vertex 1.11373 0.366837 -0.510638 + vertex 1.10611 0.369106 -0.510638 + endloop + endfacet + facet normal 0.285598 0.958349 0 + outer loop + vertex 1.11373 0.366837 0.489362 + vertex 1.10611 0.369106 -0.510638 + vertex 1.10611 0.369106 0.489362 + endloop + endfacet + facet normal 0.236225 0.971698 0 + outer loop + vertex 1.10611 0.369106 0.489362 + vertex 1.10611 0.369106 -0.510638 + vertex 1.09818 0.371036 -0.510638 + endloop + endfacet + facet normal 0.236225 0.971698 0 + outer loop + vertex 1.10611 0.369106 0.489362 + vertex 1.09818 0.371036 -0.510638 + vertex 1.09818 0.371036 0.489362 + endloop + endfacet + facet normal 0.188627 0.982049 0 + outer loop + vertex 1.09818 0.371036 0.489362 + vertex 1.09818 0.371036 -0.510638 + vertex 1.08992 0.372622 -0.510638 + endloop + endfacet + facet normal 0.188627 0.982049 0 + outer loop + vertex 1.09818 0.371036 0.489362 + vertex 1.08992 0.372622 -0.510638 + vertex 1.08992 0.372622 0.489362 + endloop + endfacet + facet normal 0.142996 0.989723 0 + outer loop + vertex 1.08992 0.372622 0.489362 + vertex 1.08992 0.372622 -0.510638 + vertex 1.08134 0.373861 -0.510638 + endloop + endfacet + facet normal 0.142996 0.989723 0 + outer loop + vertex 1.08992 0.372622 0.489362 + vertex 1.08134 0.373861 -0.510638 + vertex 1.08134 0.373861 0.489362 + endloop + endfacet + facet normal 0.0994503 0.995043 0 + outer loop + vertex 1.08134 0.373861 0.489362 + vertex 1.08134 0.373861 -0.510638 + vertex 1.07244 0.374751 -0.510638 + endloop + endfacet + facet normal 0.0994503 0.995043 0 + outer loop + vertex 1.08134 0.373861 0.489362 + vertex 1.07244 0.374751 -0.510638 + vertex 1.07244 0.374751 0.489362 + endloop + endfacet + facet normal 0.0580503 0.998314 0 + outer loop + vertex 1.07244 0.374751 0.489362 + vertex 1.07244 0.374751 -0.510638 + vertex 1.06322 0.375287 -0.510638 + endloop + endfacet + facet normal 0.0580503 0.998314 0 + outer loop + vertex 1.07244 0.374751 0.489362 + vertex 1.06322 0.375287 -0.510638 + vertex 1.06322 0.375287 0.489362 + endloop + endfacet + facet normal 0.018806 0.999823 0 + outer loop + vertex 1.06322 0.375287 0.489362 + vertex 1.06322 0.375287 -0.510638 + vertex 1.05368 0.375466 -0.510638 + endloop + endfacet + facet normal 0.018806 0.999823 0 + outer loop + vertex 1.06322 0.375287 0.489362 + vertex 1.05368 0.375466 -0.510638 + vertex 1.05368 0.375466 0.489362 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex 1.05368 0.375466 0.489362 + vertex 1.05368 0.375466 -0.510638 + vertex 0.972682 0.375466 -0.510638 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex 1.05368 0.375466 0.489362 + vertex 0.972682 0.375466 -0.510638 + vertex 0.972682 0.375466 0.489362 + endloop + endfacet + facet normal -1 0 -0 + outer loop + vertex 0.972682 0.375466 0.489362 + vertex 0.972682 0.375466 -0.510638 + vertex 0.972682 0.0974664 -0.510638 + endloop + endfacet + facet normal -1 -0 0 + outer loop + vertex 0.972682 0.375466 0.489362 + vertex 0.972682 0.0974664 -0.510638 + vertex 0.972682 0.0974664 0.489362 + endloop + endfacet + facet normal -0.427486 -0.904022 -0 + outer loop + vertex 0.972682 0.0974664 0.489362 + vertex 0.972682 0.0974664 -0.510638 + vertex 0.975389 0.0961864 -0.510638 + endloop + endfacet + facet normal -0.427486 -0.904022 0 + outer loop + vertex 0.972682 0.0974664 0.489362 + vertex 0.975389 0.0961864 -0.510638 + vertex 0.975389 0.0961864 0.489362 + endloop + endfacet + facet normal -0.53695 0.843614 0 + outer loop + vertex 1.7593 0.0469297 0.489362 + vertex 1.7593 0.0469297 -0.510638 + vertex 1.75394 0.0435191 -0.510638 + endloop + endfacet + facet normal -0.53695 0.843614 0 + outer loop + vertex 1.7593 0.0469297 0.489362 + vertex 1.75394 0.0435191 -0.510638 + vertex 1.75394 0.0435191 0.489362 + endloop + endfacet + facet normal -0.523995 0.851721 0 + outer loop + vertex 1.75394 0.0435191 0.489362 + vertex 1.75394 0.0435191 -0.510638 + vertex 1.7486 0.0402344 -0.510638 + endloop + endfacet + facet normal -0.523995 0.851721 0 + outer loop + vertex 1.75394 0.0435191 0.489362 + vertex 1.7486 0.0402344 -0.510638 + vertex 1.7486 0.0402344 0.489362 + endloop + endfacet + facet normal -0.510105 0.860112 0 + outer loop + vertex 1.7486 0.0402344 0.489362 + vertex 1.7486 0.0402344 -0.510638 + vertex 1.74327 0.037075 -0.510638 + endloop + endfacet + facet normal -0.510105 0.860112 0 + outer loop + vertex 1.7486 0.0402344 0.489362 + vertex 1.74327 0.037075 -0.510638 + vertex 1.74327 0.037075 0.489362 + endloop + endfacet + facet normal -0.4953 0.868722 0 + outer loop + vertex 1.74327 0.037075 0.489362 + vertex 1.74327 0.037075 -0.510638 + vertex 1.73795 0.0340405 -0.510638 + endloop + endfacet + facet normal -0.4953 0.868722 0 + outer loop + vertex 1.74327 0.037075 0.489362 + vertex 1.73795 0.0340405 -0.510638 + vertex 1.73795 0.0340405 0.489362 + endloop + endfacet + facet normal -0.47959 0.877493 0 + outer loop + vertex 1.73795 0.0340405 0.489362 + vertex 1.73795 0.0340405 -0.510638 + vertex 1.73263 0.0311304 -0.510638 + endloop + endfacet + facet normal -0.47959 0.877493 0 + outer loop + vertex 1.73795 0.0340405 0.489362 + vertex 1.73263 0.0311304 -0.510638 + vertex 1.73263 0.0311304 0.489362 + endloop + endfacet + facet normal -0.46298 0.886369 0 + outer loop + vertex 1.73263 0.0311304 0.489362 + vertex 1.73263 0.0311304 -0.510638 + vertex 1.72729 0.0283443 -0.510638 + endloop + endfacet + facet normal -0.46298 0.886369 0 + outer loop + vertex 1.73263 0.0311304 0.489362 + vertex 1.72729 0.0283443 -0.510638 + vertex 1.72729 0.0283443 0.489362 + endloop + endfacet + facet normal -0.445526 0.895269 0 + outer loop + vertex 1.72729 0.0283443 0.489362 + vertex 1.72729 0.0283443 -0.510638 + vertex 1.72194 0.0256818 -0.510638 + endloop + endfacet + facet normal -0.445526 0.895269 0 + outer loop + vertex 1.72729 0.0283443 0.489362 + vertex 1.72194 0.0256818 -0.510638 + vertex 1.72194 0.0256818 0.489362 + endloop + endfacet + facet normal -0.427249 0.904134 0 + outer loop + vertex 1.72194 0.0256818 0.489362 + vertex 1.72194 0.0256818 -0.510638 + vertex 1.71657 0.0231424 -0.510638 + endloop + endfacet + facet normal -0.427249 0.904134 0 + outer loop + vertex 1.72194 0.0256818 0.489362 + vertex 1.71657 0.0231424 -0.510638 + vertex 1.71657 0.0231424 0.489362 + endloop + endfacet + facet normal -0.408218 0.912884 0 + outer loop + vertex 1.71657 0.0231424 0.489362 + vertex 1.71657 0.0231424 -0.510638 + vertex 1.71116 0.0207256 -0.510638 + endloop + endfacet + facet normal -0.408218 0.912884 0 + outer loop + vertex 1.71657 0.0231424 0.489362 + vertex 1.71116 0.0207256 -0.510638 + vertex 1.71116 0.0207256 0.489362 + endloop + endfacet + facet normal -0.388494 0.921451 0 + outer loop + vertex 1.71116 0.0207256 0.489362 + vertex 1.71116 0.0207256 -0.510638 + vertex 1.70572 0.0184311 -0.510638 + endloop + endfacet + facet normal -0.388494 0.921451 0 + outer loop + vertex 1.71116 0.0207256 0.489362 + vertex 1.70572 0.0184311 -0.510638 + vertex 1.70572 0.0184311 0.489362 + endloop + endfacet + facet normal -0.368154 0.929765 0 + outer loop + vertex 1.70572 0.0184311 0.489362 + vertex 1.70572 0.0184311 -0.510638 + vertex 1.70023 0.0162584 -0.510638 + endloop + endfacet + facet normal -0.368154 0.929765 0 + outer loop + vertex 1.70572 0.0184311 0.489362 + vertex 1.70023 0.0162584 -0.510638 + vertex 1.70023 0.0162584 0.489362 + endloop + endfacet + facet normal -0.347293 0.937757 0 + outer loop + vertex 1.70023 0.0162584 0.489362 + vertex 1.70023 0.0162584 -0.510638 + vertex 1.69469 0.014207 -0.510638 + endloop + endfacet + facet normal -0.347293 0.937757 0 + outer loop + vertex 1.70023 0.0162584 0.489362 + vertex 1.69469 0.014207 -0.510638 + vertex 1.69469 0.014207 0.489362 + endloop + endfacet + facet normal -0.326001 0.945369 0 + outer loop + vertex 1.69469 0.014207 0.489362 + vertex 1.69469 0.014207 -0.510638 + vertex 1.6891 0.0122765 -0.510638 + endloop + endfacet + facet normal -0.326001 0.945369 0 + outer loop + vertex 1.69469 0.014207 0.489362 + vertex 1.6891 0.0122765 -0.510638 + vertex 1.6891 0.0122765 0.489362 + endloop + endfacet + facet normal -0.304386 0.952549 0 + outer loop + vertex 1.6891 0.0122765 0.489362 + vertex 1.6891 0.0122765 -0.510638 + vertex 1.68343 0.0104664 -0.510638 + endloop + endfacet + facet normal -0.304386 0.952549 0 + outer loop + vertex 1.6891 0.0122765 0.489362 + vertex 1.68343 0.0104664 -0.510638 + vertex 1.68343 0.0104664 0.489362 + endloop + endfacet + facet normal -0.282544 0.959254 0 + outer loop + vertex 1.68343 0.0104664 0.489362 + vertex 1.68343 0.0104664 -0.510638 + vertex 1.67769 0.00877632 -0.510638 + endloop + endfacet + facet normal -0.282544 0.959254 0 + outer loop + vertex 1.68343 0.0104664 0.489362 + vertex 1.67769 0.00877632 -0.510638 + vertex 1.67769 0.00877632 0.489362 + endloop + endfacet + facet normal -0.260603 0.965446 0 + outer loop + vertex 1.67769 0.00877632 0.489362 + vertex 1.67769 0.00877632 -0.510638 + vertex 1.67188 0.0072058 -0.510638 + endloop + endfacet + facet normal -0.260603 0.965446 0 + outer loop + vertex 1.67769 0.00877632 0.489362 + vertex 1.67188 0.0072058 -0.510638 + vertex 1.67188 0.0072058 0.489362 + endloop + endfacet + facet normal -0.238656 0.971104 0 + outer loop + vertex 1.67188 0.0072058 0.489362 + vertex 1.67188 0.0072058 -0.510638 + vertex 1.66597 0.00575439 -0.510638 + endloop + endfacet + facet normal -0.238656 0.971104 0 + outer loop + vertex 1.67188 0.0072058 0.489362 + vertex 1.66597 0.00575439 -0.510638 + vertex 1.66597 0.00575439 0.489362 + endloop + endfacet + facet normal -0.216821 0.976211 0 + outer loop + vertex 1.66597 0.00575439 0.489362 + vertex 1.66597 0.00575439 -0.510638 + vertex 1.65997 0.00442165 -0.510638 + endloop + endfacet + facet normal -0.216821 0.976211 0 + outer loop + vertex 1.66597 0.00575439 0.489362 + vertex 1.65997 0.00442165 -0.510638 + vertex 1.65997 0.00442165 0.489362 + endloop + endfacet + facet normal -0.195197 0.980764 0 + outer loop + vertex 1.65997 0.00442165 0.489362 + vertex 1.65997 0.00442165 -0.510638 + vertex 1.65387 0.00320713 -0.510638 + endloop + endfacet + facet normal -0.195197 0.980764 0 + outer loop + vertex 1.65997 0.00442165 0.489362 + vertex 1.65387 0.00320713 -0.510638 + vertex 1.65387 0.00320713 0.489362 + endloop + endfacet + facet normal -0.173886 0.984766 0 + outer loop + vertex 1.65387 0.00320713 0.489362 + vertex 1.65387 0.00320713 -0.510638 + vertex 1.64766 0.00211039 -0.510638 + endloop + endfacet + facet normal -0.173886 0.984766 0 + outer loop + vertex 1.65387 0.00320713 0.489362 + vertex 1.64766 0.00211039 -0.510638 + vertex 1.64766 0.00211039 0.489362 + endloop + endfacet + facet normal -0.152973 0.98823 0 + outer loop + vertex 1.64766 0.00211039 0.489362 + vertex 1.64766 0.00211039 -0.510638 + vertex 1.64133 0.00113098 -0.510638 + endloop + endfacet + facet normal -0.152973 0.98823 0 + outer loop + vertex 1.64766 0.00211039 0.489362 + vertex 1.64133 0.00113098 -0.510638 + vertex 1.64133 0.00113098 0.489362 + endloop + endfacet + facet normal -0.132538 0.991178 0 + outer loop + vertex 1.64133 0.00113098 0.489362 + vertex 1.64133 0.00113098 -0.510638 + vertex 1.63488 0.000268462 -0.510638 + endloop + endfacet + facet normal -0.132538 0.991178 0 + outer loop + vertex 1.64133 0.00113098 0.489362 + vertex 1.63488 0.000268462 -0.510638 + vertex 1.63488 0.000268462 0.489362 + endloop + endfacet + facet normal -0.112655 0.993634 0 + outer loop + vertex 1.63488 0.000268462 0.489362 + vertex 1.63488 0.000268462 -0.510638 + vertex 1.6283 -0.000477612 -0.510638 + endloop + endfacet + facet normal -0.112655 0.993634 0 + outer loop + vertex 1.63488 0.000268462 0.489362 + vertex 1.6283 -0.000477612 -0.510638 + vertex 1.6283 -0.000477612 0.489362 + endloop + endfacet + facet normal -0.0933819 0.99563 0 + outer loop + vertex 1.6283 -0.000477612 0.489362 + vertex 1.6283 -0.000477612 -0.510638 + vertex 1.62158 -0.00110769 -0.510638 + endloop + endfacet + facet normal -0.0933819 0.99563 0 + outer loop + vertex 1.6283 -0.000477612 0.489362 + vertex 1.62158 -0.00110769 -0.510638 + vertex 1.62158 -0.00110769 0.489362 + endloop + endfacet + facet normal -0.0747679 0.997201 0 + outer loop + vertex 1.62158 -0.00110769 0.489362 + vertex 1.62158 -0.00110769 -0.510638 + vertex 1.61472 -0.0016222 -0.510638 + endloop + endfacet + facet normal -0.0747679 0.997201 0 + outer loop + vertex 1.62158 -0.00110769 0.489362 + vertex 1.61472 -0.0016222 -0.510638 + vertex 1.61472 -0.0016222 0.489362 + endloop + endfacet + facet normal -0.0568538 0.998383 0 + outer loop + vertex 1.61472 -0.0016222 0.489362 + vertex 1.61472 -0.0016222 -0.510638 + vertex 1.6077 -0.00202161 -0.510638 + endloop + endfacet + facet normal -0.0568538 0.998383 0 + outer loop + vertex 1.61472 -0.0016222 0.489362 + vertex 1.6077 -0.00202161 -0.510638 + vertex 1.6077 -0.00202161 0.489362 + endloop + endfacet + facet normal -0.0396679 0.999213 0 + outer loop + vertex 1.6077 -0.00202161 0.489362 + vertex 1.6077 -0.00202161 -0.510638 + vertex 1.60053 -0.00230635 -0.510638 + endloop + endfacet + facet normal -0.0396679 0.999213 0 + outer loop + vertex 1.6077 -0.00202161 0.489362 + vertex 1.60053 -0.00230635 -0.510638 + vertex 1.60053 -0.00230635 0.489362 + endloop + endfacet + facet normal -0.0232306 0.99973 0 + outer loop + vertex 1.60053 -0.00230635 0.489362 + vertex 1.60053 -0.00230635 -0.510638 + vertex 1.59319 -0.00247687 -0.510638 + endloop + endfacet + facet normal -0.0232306 0.99973 0 + outer loop + vertex 1.60053 -0.00230635 0.489362 + vertex 1.59319 -0.00247687 -0.510638 + vertex 1.59319 -0.00247687 0.489362 + endloop + endfacet + facet normal -0.00755401 0.999971 0 + outer loop + vertex 1.59319 -0.00247687 0.489362 + vertex 1.59319 -0.00247687 -0.510638 + vertex 1.58568 -0.00253361 -0.510638 + endloop + endfacet + facet normal -0.00755401 0.999971 0 + outer loop + vertex 1.59319 -0.00247687 0.489362 + vertex 1.58568 -0.00253361 -0.510638 + vertex 1.58568 -0.00253361 0.489362 + endloop + endfacet + facet normal 0.0274989 0.999622 0 + outer loop + vertex 1.58568 -0.00253361 0.489362 + vertex 1.58568 -0.00253361 -0.510638 + vertex 1.57189 -0.00215418 -0.510638 + endloop + endfacet + facet normal 0.0274989 0.999622 0 + outer loop + vertex 1.58568 -0.00253361 0.489362 + vertex 1.57189 -0.00215418 -0.510638 + vertex 1.57189 -0.00215418 0.489362 + endloop + endfacet + facet normal 0.0836271 0.996497 0 + outer loop + vertex 1.57189 -0.00215418 0.489362 + vertex 1.57189 -0.00215418 -0.510638 + vertex 1.55851 -0.00103166 -0.510638 + endloop + endfacet + facet normal 0.0836271 0.996497 0 + outer loop + vertex 1.57189 -0.00215418 0.489362 + vertex 1.55851 -0.00103166 -0.510638 + vertex 1.55851 -0.00103166 0.489362 + endloop + endfacet + facet normal 0.14077 0.990042 0 + outer loop + vertex 1.55851 -0.00103166 0.489362 + vertex 1.55851 -0.00103166 -0.510638 + vertex 1.54556 0.00081041 -0.510638 + endloop + endfacet + facet normal 0.14077 0.990042 0 + outer loop + vertex 1.55851 -0.00103166 0.489362 + vertex 1.54556 0.00081041 -0.510638 + vertex 1.54556 0.00081041 0.489362 + endloop + endfacet + facet normal 0.198507 0.9801 0 + outer loop + vertex 1.54556 0.00081041 0.489362 + vertex 1.54556 0.00081041 -0.510638 + vertex 1.53303 0.00334848 -0.510638 + endloop + endfacet + facet normal 0.198507 0.9801 0 + outer loop + vertex 1.54556 0.00081041 0.489362 + vertex 1.53303 0.00334848 -0.510638 + vertex 1.53303 0.00334848 0.489362 + endloop + endfacet + facet normal 0.256381 0.966576 0 + outer loop + vertex 1.53303 0.00334848 0.489362 + vertex 1.53303 0.00334848 -0.510638 + vertex 1.52092 0.006559 -0.510638 + endloop + endfacet + facet normal 0.256381 0.966576 0 + outer loop + vertex 1.53303 0.00334848 0.489362 + vertex 1.52092 0.006559 -0.510638 + vertex 1.52092 0.006559 0.489362 + endloop + endfacet + facet normal 0.313921 0.949449 0 + outer loop + vertex 1.52092 0.006559 0.489362 + vertex 1.52092 0.006559 -0.510638 + vertex 1.50925 0.0104184 -0.510638 + endloop + endfacet + facet normal 0.313921 0.949449 0 + outer loop + vertex 1.52092 0.006559 0.489362 + vertex 1.50925 0.0104184 -0.510638 + vertex 1.50925 0.0104184 0.489362 + endloop + endfacet + facet normal 0.370643 0.928776 0 + outer loop + vertex 1.50925 0.0104184 0.489362 + vertex 1.50925 0.0104184 -0.510638 + vertex 1.49801 0.0149032 -0.510638 + endloop + endfacet + facet normal 0.370643 0.928776 0 + outer loop + vertex 1.50925 0.0104184 0.489362 + vertex 1.49801 0.0149032 -0.510638 + vertex 1.49801 0.0149032 0.489362 + endloop + endfacet + facet normal 0.426086 0.904682 0 + outer loop + vertex 1.49801 0.0149032 0.489362 + vertex 1.49801 0.0149032 -0.510638 + vertex 1.48721 0.0199897 -0.510638 + endloop + endfacet + facet normal 0.426086 0.904682 0 + outer loop + vertex 1.49801 0.0149032 0.489362 + vertex 1.48721 0.0199897 -0.510638 + vertex 1.48721 0.0199897 0.489362 + endloop + endfacet + facet normal 0.479823 0.877366 0 + outer loop + vertex 1.48721 0.0199897 0.489362 + vertex 1.48721 0.0199897 -0.510638 + vertex 1.47685 0.0256544 -0.510638 + endloop + endfacet + facet normal 0.479823 0.877366 0 + outer loop + vertex 1.48721 0.0199897 0.489362 + vertex 1.47685 0.0256544 -0.510638 + vertex 1.47685 0.0256544 0.489362 + endloop + endfacet + facet normal 0.53147 0.847077 0 + outer loop + vertex 1.47685 0.0256544 0.489362 + vertex 1.47685 0.0256544 -0.510638 + vertex 1.46694 0.0318738 -0.510638 + endloop + endfacet + facet normal 0.53147 0.847077 0 + outer loop + vertex 1.47685 0.0256544 0.489362 + vertex 1.46694 0.0318738 -0.510638 + vertex 1.46694 0.0318738 0.489362 + endloop + endfacet + facet normal 0.580702 0.814116 0 + outer loop + vertex 1.46694 0.0318738 0.489362 + vertex 1.46694 0.0318738 -0.510638 + vertex 1.45748 0.0386243 -0.510638 + endloop + endfacet + facet normal 0.580702 0.814116 0 + outer loop + vertex 1.46694 0.0318738 0.489362 + vertex 1.45748 0.0386243 -0.510638 + vertex 1.45748 0.0386243 0.489362 + endloop + endfacet + facet normal 0.627272 0.7788 0 + outer loop + vertex 1.45748 0.0386243 0.489362 + vertex 1.45748 0.0386243 -0.510638 + vertex 1.44847 0.0458824 -0.510638 + endloop + endfacet + facet normal 0.627272 0.7788 0 + outer loop + vertex 1.45748 0.0386243 0.489362 + vertex 1.44847 0.0458824 -0.510638 + vertex 1.44847 0.0458824 0.489362 + endloop + endfacet + facet normal 0.670983 0.741473 0 + outer loop + vertex 1.44847 0.0458824 0.489362 + vertex 1.44847 0.0458824 -0.510638 + vertex 1.43991 0.0536245 -0.510638 + endloop + endfacet + facet normal 0.670983 0.741473 0 + outer loop + vertex 1.44847 0.0458824 0.489362 + vertex 1.43991 0.0536245 -0.510638 + vertex 1.43991 0.0536245 0.489362 + endloop + endfacet + facet normal 0.711719 0.702464 0 + outer loop + vertex 1.43991 0.0536245 0.489362 + vertex 1.43991 0.0536245 -0.510638 + vertex 1.43181 0.061827 -0.510638 + endloop + endfacet + facet normal 0.711719 0.702464 0 + outer loop + vertex 1.43991 0.0536245 0.489362 + vertex 1.43181 0.061827 -0.510638 + vertex 1.43181 0.061827 0.489362 + endloop + endfacet + facet normal 0.749419 0.662096 0 + outer loop + vertex 1.43181 0.061827 0.489362 + vertex 1.43181 0.061827 -0.510638 + vertex 1.42418 0.0704664 -0.510638 + endloop + endfacet + facet normal 0.749419 0.662096 0 + outer loop + vertex 1.43181 0.061827 0.489362 + vertex 1.42418 0.0704664 -0.510638 + vertex 1.42418 0.0704664 0.489362 + endloop + endfacet + facet normal 0.784076 0.620664 0 + outer loop + vertex 1.42418 0.0704664 0.489362 + vertex 1.42418 0.0704664 -0.510638 + vertex 1.41702 0.0795191 -0.510638 + endloop + endfacet + facet normal 0.784076 0.620664 0 + outer loop + vertex 1.42418 0.0704664 0.489362 + vertex 1.41702 0.0795191 -0.510638 + vertex 1.41702 0.0795191 0.489362 + endloop + endfacet + facet normal 0.815722 0.578444 0 + outer loop + vertex 1.41702 0.0795191 0.489362 + vertex 1.41702 0.0795191 -0.510638 + vertex 1.41032 0.0889617 -0.510638 + endloop + endfacet + facet normal 0.815722 0.578444 0 + outer loop + vertex 1.41702 0.0795191 0.489362 + vertex 1.41032 0.0889617 -0.510638 + vertex 1.41032 0.0889617 0.489362 + endloop + endfacet + facet normal 0.844433 0.535662 0 + outer loop + vertex 1.41032 0.0889617 0.489362 + vertex 1.41032 0.0889617 -0.510638 + vertex 1.4041 0.0987704 -0.510638 + endloop + endfacet + facet normal 0.844433 0.535662 0 + outer loop + vertex 1.41032 0.0889617 0.489362 + vertex 1.4041 0.0987704 -0.510638 + vertex 1.4041 0.0987704 0.489362 + endloop + endfacet + facet normal 0.870308 0.492508 0 + outer loop + vertex 1.4041 0.0987704 0.489362 + vertex 1.4041 0.0987704 -0.510638 + vertex 1.39835 0.108922 -0.510638 + endloop + endfacet + facet normal 0.870308 0.492508 0 + outer loop + vertex 1.4041 0.0987704 0.489362 + vertex 1.39835 0.108922 -0.510638 + vertex 1.39835 0.108922 0.489362 + endloop + endfacet + facet normal 0.893451 0.449161 0 + outer loop + vertex 1.39835 0.108922 0.489362 + vertex 1.39835 0.108922 -0.510638 + vertex 1.39309 0.119392 -0.510638 + endloop + endfacet + facet normal 0.893451 0.449161 0 + outer loop + vertex 1.39835 0.108922 0.489362 + vertex 1.39309 0.119392 -0.510638 + vertex 1.39309 0.119392 0.489362 + endloop + endfacet + facet normal 0.913984 0.405751 0 + outer loop + vertex 1.39309 0.119392 0.489362 + vertex 1.39309 0.119392 -0.510638 + vertex 1.38831 0.130158 -0.510638 + endloop + endfacet + facet normal 0.913984 0.405751 0 + outer loop + vertex 1.39309 0.119392 0.489362 + vertex 1.38831 0.130158 -0.510638 + vertex 1.38831 0.130158 0.489362 + endloop + endfacet + facet normal 0.932038 0.36236 0 + outer loop + vertex 1.38831 0.130158 0.489362 + vertex 1.38831 0.130158 -0.510638 + vertex 1.38402 0.141196 -0.510638 + endloop + endfacet + facet normal 0.932038 0.36236 0 + outer loop + vertex 1.38831 0.130158 0.489362 + vertex 1.38402 0.141196 -0.510638 + vertex 1.38402 0.141196 0.489362 + endloop + endfacet + facet normal 0.947731 0.31907 0 + outer loop + vertex 1.38402 0.141196 0.489362 + vertex 1.38402 0.141196 -0.510638 + vertex 1.38022 0.152483 -0.510638 + endloop + endfacet + facet normal 0.947731 0.31907 0 + outer loop + vertex 1.38402 0.141196 0.489362 + vertex 1.38022 0.152483 -0.510638 + vertex 1.38022 0.152483 0.489362 + endloop + endfacet + facet normal 0.961176 0.275937 0 + outer loop + vertex 1.38022 0.152483 0.489362 + vertex 1.38022 0.152483 -0.510638 + vertex 1.37691 0.163994 -0.510638 + endloop + endfacet + facet normal 0.961176 0.275937 0 + outer loop + vertex 1.38022 0.152483 0.489362 + vertex 1.37691 0.163994 -0.510638 + vertex 1.37691 0.163994 0.489362 + endloop + endfacet + facet normal 0.972481 0.232981 0 + outer loop + vertex 1.37691 0.163994 0.489362 + vertex 1.37691 0.163994 -0.510638 + vertex 1.37411 0.175707 -0.510638 + endloop + endfacet + facet normal 0.972481 0.232981 0 + outer loop + vertex 1.37691 0.163994 0.489362 + vertex 1.37411 0.175707 -0.510638 + vertex 1.37411 0.175707 0.489362 + endloop + endfacet + facet normal 0.981742 0.190217 0 + outer loop + vertex 1.37411 0.175707 0.489362 + vertex 1.37411 0.175707 -0.510638 + vertex 1.3718 0.187598 -0.510638 + endloop + endfacet + facet normal 0.981742 0.190217 0 + outer loop + vertex 1.37411 0.175707 0.489362 + vertex 1.3718 0.187598 -0.510638 + vertex 1.3718 0.187598 0.489362 + endloop + endfacet + facet normal 0.989041 0.147644 0 + outer loop + vertex 1.3718 0.187598 0.489362 + vertex 1.3718 0.187598 -0.510638 + vertex 1.37001 0.199642 -0.510638 + endloop + endfacet + facet normal 0.989041 0.147644 0 + outer loop + vertex 1.3718 0.187598 0.489362 + vertex 1.37001 0.199642 -0.510638 + vertex 1.37001 0.199642 0.489362 + endloop + endfacet + facet normal 0.994444 0.105262 0 + outer loop + vertex 1.37001 0.199642 0.489362 + vertex 1.37001 0.199642 -0.510638 + vertex 1.36872 0.211818 -0.510638 + endloop + endfacet + facet normal 0.994444 0.105262 0 + outer loop + vertex 1.37001 0.199642 0.489362 + vertex 1.36872 0.211818 -0.510638 + vertex 1.36872 0.211818 0.489362 + endloop + endfacet + facet normal 0.998011 0.0630384 0 + outer loop + vertex 1.36872 0.211818 0.489362 + vertex 1.36872 0.211818 -0.510638 + vertex 1.36794 0.2241 -0.510638 + endloop + endfacet + facet normal 0.998011 0.0630384 0 + outer loop + vertex 1.36872 0.211818 0.489362 + vertex 1.36794 0.2241 -0.510638 + vertex 1.36794 0.2241 0.489362 + endloop + endfacet + facet normal 0.99978 0.0209721 0 + outer loop + vertex 1.36794 0.2241 0.489362 + vertex 1.36794 0.2241 -0.510638 + vertex 1.36768 0.236466 -0.510638 + endloop + endfacet + facet normal 0.99978 0.0209721 0 + outer loop + vertex 1.36794 0.2241 0.489362 + vertex 1.36768 0.236466 -0.510638 + vertex 1.36768 0.236466 0.489362 + endloop + endfacet + facet normal 0.999776 -0.0211845 0 + outer loop + vertex 1.36768 0.236466 0.489362 + vertex 1.36768 0.236466 -0.510638 + vertex 1.36797 0.249918 -0.510638 + endloop + endfacet + facet normal 0.999776 -0.0211845 0 + outer loop + vertex 1.36768 0.236466 0.489362 + vertex 1.36797 0.249918 -0.510638 + vertex 1.36797 0.249918 0.489362 + endloop + endfacet + facet normal 0.997928 -0.0643331 0 + outer loop + vertex 1.36797 0.249918 0.489362 + vertex 1.36797 0.249918 -0.510638 + vertex 1.36881 0.263066 -0.510638 + endloop + endfacet + facet normal 0.997928 -0.0643331 0 + outer loop + vertex 1.36797 0.249918 0.489362 + vertex 1.36881 0.263066 -0.510638 + vertex 1.36881 0.263066 0.489362 + endloop + endfacet + facet normal 0.994106 -0.108414 0 + outer loop + vertex 1.36881 0.263066 0.489362 + vertex 1.36881 0.263066 -0.510638 + vertex 1.37021 0.275898 -0.510638 + endloop + endfacet + facet normal 0.994106 -0.108414 0 + outer loop + vertex 1.36881 0.263066 0.489362 + vertex 1.37021 0.275898 -0.510638 + vertex 1.37021 0.275898 0.489362 + endloop + endfacet + facet normal 0.988174 -0.153339 0 + outer loop + vertex 1.37021 0.275898 0.489362 + vertex 1.37021 0.275898 -0.510638 + vertex 1.37216 0.288406 -0.510638 + endloop + endfacet + facet normal 0.988174 -0.153339 0 + outer loop + vertex 1.37021 0.275898 0.489362 + vertex 1.37216 0.288406 -0.510638 + vertex 1.37216 0.288406 0.489362 + endloop + endfacet + facet normal 0.98 -0.198999 0 + outer loop + vertex 1.37216 0.288406 0.489362 + vertex 1.37216 0.288406 -0.510638 + vertex 1.37463 0.300578 -0.510638 + endloop + endfacet + facet normal 0.98 -0.198999 0 + outer loop + vertex 1.37216 0.288406 0.489362 + vertex 1.37463 0.300578 -0.510638 + vertex 1.37463 0.300578 0.489362 + endloop + endfacet + facet normal 0.969457 -0.245261 0 + outer loop + vertex 1.37463 0.300578 0.489362 + vertex 1.37463 0.300578 -0.510638 + vertex 1.37762 0.312402 -0.510638 + endloop + endfacet + facet normal 0.969457 -0.245261 0 + outer loop + vertex 1.37463 0.300578 0.489362 + vertex 1.37762 0.312402 -0.510638 + vertex 1.37762 0.312402 0.489362 + endloop + endfacet + facet normal 0.956422 -0.291987 0 + outer loop + vertex 1.37762 0.312402 0.489362 + vertex 1.37762 0.312402 -0.510638 + vertex 1.38112 0.32387 -0.510638 + endloop + endfacet + facet normal 0.956422 -0.291987 0 + outer loop + vertex 1.37762 0.312402 0.489362 + vertex 1.38112 0.32387 -0.510638 + vertex 1.38112 0.32387 0.489362 + endloop + endfacet + facet normal 0.940786 -0.339001 0 + outer loop + vertex 1.38112 0.32387 0.489362 + vertex 1.38112 0.32387 -0.510638 + vertex 1.38512 0.33497 -0.510638 + endloop + endfacet + facet normal 0.940786 -0.339001 0 + outer loop + vertex 1.38112 0.32387 0.489362 + vertex 1.38512 0.33497 -0.510638 + vertex 1.38512 0.33497 0.489362 + endloop + endfacet + facet normal 0.92245 -0.386116 0 + outer loop + vertex 1.38512 0.33497 0.489362 + vertex 1.38512 0.33497 -0.510638 + vertex 1.38961 0.34569 -0.510638 + endloop + endfacet + facet normal 0.92245 -0.386116 0 + outer loop + vertex 1.38512 0.33497 0.489362 + vertex 1.38961 0.34569 -0.510638 + vertex 1.38961 0.34569 0.489362 + endloop + endfacet + facet normal 0.901329 -0.433134 0 + outer loop + vertex 1.38961 0.34569 0.489362 + vertex 1.38961 0.34569 -0.510638 + vertex 1.39457 0.356022 -0.510638 + endloop + endfacet + facet normal 0.901329 -0.433134 0 + outer loop + vertex 1.38961 0.34569 0.489362 + vertex 1.39457 0.356022 -0.510638 + vertex 1.39457 0.356022 0.489362 + endloop + endfacet + facet normal 0.877363 -0.479827 0 + outer loop + vertex 1.39457 0.356022 0.489362 + vertex 1.39457 0.356022 -0.510638 + vertex 1.4 0.365954 -0.510638 + endloop + endfacet + facet normal 0.877363 -0.479827 0 + outer loop + vertex 1.39457 0.356022 0.489362 + vertex 1.4 0.365954 -0.510638 + vertex 1.4 0.365954 0.489362 + endloop + endfacet + facet normal 0.85052 -0.525943 0 + outer loop + vertex 1.4 0.365954 0.489362 + vertex 1.4 0.365954 -0.510638 + vertex 1.40589 0.375474 -0.510638 + endloop + endfacet + facet normal 0.85052 -0.525943 0 + outer loop + vertex 1.4 0.365954 0.489362 + vertex 1.40589 0.375474 -0.510638 + vertex 1.40589 0.375474 0.489362 + endloop + endfacet + facet normal 0.820789 -0.571232 0 + outer loop + vertex 1.40589 0.375474 0.489362 + vertex 1.40589 0.375474 -0.510638 + vertex 1.41222 0.384574 -0.510638 + endloop + endfacet + facet normal 0.820789 -0.571232 0 + outer loop + vertex 1.40589 0.375474 0.489362 + vertex 1.41222 0.384574 -0.510638 + vertex 1.41222 0.384574 0.489362 + endloop + endfacet + facet normal 0.788202 -0.615417 0 + outer loop + vertex 1.41222 0.384574 0.489362 + vertex 1.41222 0.384574 -0.510638 + vertex 1.41899 0.393241 -0.510638 + endloop + endfacet + facet normal 0.788202 -0.615417 0 + outer loop + vertex 1.41222 0.384574 0.489362 + vertex 1.41899 0.393241 -0.510638 + vertex 1.41899 0.393241 0.489362 + endloop + endfacet + facet normal 0.752814 -0.658234 0 + outer loop + vertex 1.41899 0.393241 0.489362 + vertex 1.41899 0.393241 -0.510638 + vertex 1.42618 0.401466 -0.510638 + endloop + endfacet + facet normal 0.752814 -0.658234 0 + outer loop + vertex 1.41899 0.393241 0.489362 + vertex 1.42618 0.401466 -0.510638 + vertex 1.42618 0.401466 0.489362 + endloop + endfacet + facet normal 0.714731 -0.699399 0 + outer loop + vertex 1.42618 0.401466 0.489362 + vertex 1.42618 0.401466 -0.510638 + vertex 1.43379 0.409238 -0.510638 + endloop + endfacet + facet normal 0.714731 -0.699399 0 + outer loop + vertex 1.42618 0.401466 0.489362 + vertex 1.43379 0.409238 -0.510638 + vertex 1.43379 0.409238 0.489362 + endloop + endfacet + facet normal 0.674085 -0.738654 0 + outer loop + vertex 1.43379 0.409238 0.489362 + vertex 1.43379 0.409238 -0.510638 + vertex 1.44179 0.416545 -0.510638 + endloop + endfacet + facet normal 0.674085 -0.738654 0 + outer loop + vertex 1.43379 0.409238 0.489362 + vertex 1.44179 0.416545 -0.510638 + vertex 1.44179 0.416545 0.489362 + endloop + endfacet + facet normal 0.63105 -0.775742 0 + outer loop + vertex 1.44179 0.416545 0.489362 + vertex 1.44179 0.416545 -0.510638 + vertex 1.45019 0.423378 -0.510638 + endloop + endfacet + facet normal 0.63105 -0.775742 0 + outer loop + vertex 1.44179 0.416545 0.489362 + vertex 1.45019 0.423378 -0.510638 + vertex 1.45019 0.423378 0.489362 + endloop + endfacet + facet normal 0.585845 -0.810423 0 + outer loop + vertex 1.45019 0.423378 0.489362 + vertex 1.45019 0.423378 -0.510638 + vertex 1.45897 0.429726 -0.510638 + endloop + endfacet + facet normal 0.585845 -0.810423 0 + outer loop + vertex 1.45019 0.423378 0.489362 + vertex 1.45897 0.429726 -0.510638 + vertex 1.45897 0.429726 0.489362 + endloop + endfacet + facet normal 0.538698 -0.842499 0 + outer loop + vertex 1.45897 0.429726 0.489362 + vertex 1.45897 0.429726 -0.510638 + vertex 1.46813 0.435578 -0.510638 + endloop + endfacet + facet normal 0.538698 -0.842499 0 + outer loop + vertex 1.45897 0.429726 0.489362 + vertex 1.46813 0.435578 -0.510638 + vertex 1.46813 0.435578 0.489362 + endloop + endfacet + facet normal 0.489887 -0.871786 0 + outer loop + vertex 1.46813 0.435578 0.489362 + vertex 1.46813 0.435578 -0.510638 + vertex 1.47764 0.440922 -0.510638 + endloop + endfacet + facet normal 0.489887 -0.871786 0 + outer loop + vertex 1.46813 0.435578 0.489362 + vertex 1.47764 0.440922 -0.510638 + vertex 1.47764 0.440922 0.489362 + endloop + endfacet + facet normal 0.439702 -0.898144 0 + outer loop + vertex 1.47764 0.440922 0.489362 + vertex 1.47764 0.440922 -0.510638 + vertex 1.4875 0.44575 -0.510638 + endloop + endfacet + facet normal 0.439702 -0.898144 0 + outer loop + vertex 1.47764 0.440922 0.489362 + vertex 1.4875 0.44575 -0.510638 + vertex 1.4875 0.44575 0.489362 + endloop + endfacet + facet normal 0.388441 -0.921474 0 + outer loop + vertex 1.4875 0.44575 0.489362 + vertex 1.4875 0.44575 -0.510638 + vertex 1.4977 0.45005 -0.510638 + endloop + endfacet + facet normal 0.388441 -0.921474 0 + outer loop + vertex 1.4875 0.44575 0.489362 + vertex 1.4977 0.45005 -0.510638 + vertex 1.4977 0.45005 0.489362 + endloop + endfacet + facet normal 0.336419 -0.941712 0 + outer loop + vertex 1.4977 0.45005 0.489362 + vertex 1.4977 0.45005 -0.510638 + vertex 1.50823 0.45381 -0.510638 + endloop + endfacet + facet normal 0.336419 -0.941712 0 + outer loop + vertex 1.4977 0.45005 0.489362 + vertex 1.50823 0.45381 -0.510638 + vertex 1.50823 0.45381 0.489362 + endloop + endfacet + facet normal 0.283945 -0.95884 0 + outer loop + vertex 1.50823 0.45381 0.489362 + vertex 1.50823 0.45381 -0.510638 + vertex 1.51907 0.457022 -0.510638 + endloop + endfacet + facet normal 0.283945 -0.95884 0 + outer loop + vertex 1.50823 0.45381 0.489362 + vertex 1.51907 0.457022 -0.510638 + vertex 1.51907 0.457022 0.489362 + endloop + endfacet + facet normal 0.231324 -0.972877 0 + outer loop + vertex 1.51907 0.457022 0.489362 + vertex 1.51907 0.457022 -0.510638 + vertex 1.53022 0.459674 -0.510638 + endloop + endfacet + facet normal 0.231324 -0.972877 0 + outer loop + vertex 1.51907 0.457022 0.489362 + vertex 1.53022 0.459674 -0.510638 + vertex 1.53022 0.459674 0.489362 + endloop + endfacet + facet normal 0.178845 -0.983877 0 + outer loop + vertex 1.53022 0.459674 0.489362 + vertex 1.53022 0.459674 -0.510638 + vertex 1.54167 0.461754 -0.510638 + endloop + endfacet + facet normal 0.178845 -0.983877 0 + outer loop + vertex 1.53022 0.459674 0.489362 + vertex 1.54167 0.461754 -0.510638 + vertex 1.54167 0.461754 0.489362 + endloop + endfacet + facet normal 0.126777 -0.991931 0 + outer loop + vertex 1.54167 0.461754 0.489362 + vertex 1.54167 0.461754 -0.510638 + vertex 1.5534 0.463254 -0.510638 + endloop + endfacet + facet normal 0.126777 -0.991931 0 + outer loop + vertex 1.54167 0.461754 0.489362 + vertex 1.5534 0.463254 -0.510638 + vertex 1.5534 0.463254 0.489362 + endloop + endfacet + facet normal 0.075368 -0.997156 0 + outer loop + vertex 1.5534 0.463254 0.489362 + vertex 1.5534 0.463254 -0.510638 + vertex 1.56541 0.464162 -0.510638 + endloop + endfacet + facet normal 0.075368 -0.997156 0 + outer loop + vertex 1.5534 0.463254 0.489362 + vertex 1.56541 0.464162 -0.510638 + vertex 1.56541 0.464162 0.489362 + endloop + endfacet + facet normal 0.0248367 -0.999692 0 + outer loop + vertex 1.56541 0.464162 0.489362 + vertex 1.56541 0.464162 -0.510638 + vertex 1.57768 0.464466 -0.510638 + endloop + endfacet + facet normal 0.0248367 -0.999692 0 + outer loop + vertex 1.56541 0.464162 0.489362 + vertex 1.57768 0.464466 -0.510638 + vertex 1.57768 0.464466 0.489362 + endloop + endfacet + facet normal -0.022963 -0.999736 -0 + outer loop + vertex 1.57768 0.464466 0.489362 + vertex 1.57768 0.464466 -0.510638 + vertex 1.58944 0.464196 -0.510638 + endloop + endfacet + facet normal -0.022963 -0.999736 0 + outer loop + vertex 1.57768 0.464466 0.489362 + vertex 1.58944 0.464196 -0.510638 + vertex 1.58944 0.464196 0.489362 + endloop + endfacet + facet normal -0.0705857 -0.997506 -0 + outer loop + vertex 1.58944 0.464196 0.489362 + vertex 1.58944 0.464196 -0.510638 + vertex 1.6009 0.463385 -0.510638 + endloop + endfacet + facet normal -0.0705857 -0.997506 0 + outer loop + vertex 1.58944 0.464196 0.489362 + vertex 1.6009 0.463385 -0.510638 + vertex 1.6009 0.463385 0.489362 + endloop + endfacet + facet normal -0.120338 -0.992733 -0 + outer loop + vertex 1.6009 0.463385 0.489362 + vertex 1.6009 0.463385 -0.510638 + vertex 1.61206 0.462033 -0.510638 + endloop + endfacet + facet normal -0.120338 -0.992733 0 + outer loop + vertex 1.6009 0.463385 0.489362 + vertex 1.61206 0.462033 -0.510638 + vertex 1.61206 0.462033 0.489362 + endloop + endfacet + facet normal -0.172072 -0.985084 -0 + outer loop + vertex 1.61206 0.462033 0.489362 + vertex 1.61206 0.462033 -0.510638 + vertex 1.62291 0.460137 -0.510638 + endloop + endfacet + facet normal -0.172072 -0.985084 0 + outer loop + vertex 1.61206 0.462033 0.489362 + vertex 1.62291 0.460137 -0.510638 + vertex 1.62291 0.460137 0.489362 + endloop + endfacet + facet normal -0.225543 -0.974233 -0 + outer loop + vertex 1.62291 0.460137 0.489362 + vertex 1.62291 0.460137 -0.510638 + vertex 1.63345 0.457698 -0.510638 + endloop + endfacet + facet normal -0.225543 -0.974233 0 + outer loop + vertex 1.62291 0.460137 0.489362 + vertex 1.63345 0.457698 -0.510638 + vertex 1.63345 0.457698 0.489362 + endloop + endfacet + facet normal -0.28043 -0.959875 -0 + outer loop + vertex 1.63345 0.457698 0.489362 + vertex 1.63345 0.457698 -0.510638 + vertex 1.64366 0.454715 -0.510638 + endloop + endfacet + facet normal -0.28043 -0.959875 0 + outer loop + vertex 1.63345 0.457698 0.489362 + vertex 1.64366 0.454715 -0.510638 + vertex 1.64366 0.454715 0.489362 + endloop + endfacet + facet normal -0.336313 -0.94175 -0 + outer loop + vertex 1.64366 0.454715 0.489362 + vertex 1.64366 0.454715 -0.510638 + vertex 1.65354 0.451186 -0.510638 + endloop + endfacet + facet normal -0.336313 -0.94175 0 + outer loop + vertex 1.64366 0.454715 0.489362 + vertex 1.65354 0.451186 -0.510638 + vertex 1.65354 0.451186 0.489362 + endloop + endfacet + facet normal -0.392699 -0.919667 -0 + outer loop + vertex 1.65354 0.451186 0.489362 + vertex 1.65354 0.451186 -0.510638 + vertex 1.66308 0.447111 -0.510638 + endloop + endfacet + facet normal -0.392699 -0.919667 0 + outer loop + vertex 1.65354 0.451186 0.489362 + vertex 1.66308 0.447111 -0.510638 + vertex 1.66308 0.447111 0.489362 + endloop + endfacet + facet normal -0.44901 -0.893527 -0 + outer loop + vertex 1.66308 0.447111 0.489362 + vertex 1.66308 0.447111 -0.510638 + vertex 1.67228 0.442488 -0.510638 + endloop + endfacet + facet normal -0.44901 -0.893527 0 + outer loop + vertex 1.66308 0.447111 0.489362 + vertex 1.67228 0.442488 -0.510638 + vertex 1.67228 0.442488 0.489362 + endloop + endfacet + facet normal -0.504622 -0.86334 -0 + outer loop + vertex 1.67228 0.442488 0.489362 + vertex 1.67228 0.442488 -0.510638 + vertex 1.68113 0.437318 -0.510638 + endloop + endfacet + facet normal -0.504622 -0.86334 0 + outer loop + vertex 1.67228 0.442488 0.489362 + vertex 1.68113 0.437318 -0.510638 + vertex 1.68113 0.437318 0.489362 + endloop + endfacet + facet normal -0.558893 -0.82924 -0 + outer loop + vertex 1.68113 0.437318 0.489362 + vertex 1.68113 0.437318 -0.510638 + vertex 1.68961 0.431599 -0.510638 + endloop + endfacet + facet normal -0.558893 -0.82924 0 + outer loop + vertex 1.68113 0.437318 0.489362 + vertex 1.68961 0.431599 -0.510638 + vertex 1.68961 0.431599 0.489362 + endloop + endfacet + facet normal -0.611186 -0.791487 -0 + outer loop + vertex 1.68961 0.431599 0.489362 + vertex 1.68961 0.431599 -0.510638 + vertex 1.69773 0.42533 -0.510638 + endloop + endfacet + facet normal -0.611186 -0.791487 0 + outer loop + vertex 1.68961 0.431599 0.489362 + vertex 1.69773 0.42533 -0.510638 + vertex 1.69773 0.42533 0.489362 + endloop + endfacet + facet normal -0.660913 -0.750462 -0 + outer loop + vertex 1.69773 0.42533 0.489362 + vertex 1.69773 0.42533 -0.510638 + vertex 1.70547 0.418511 -0.510638 + endloop + endfacet + facet normal -0.660913 -0.750462 0 + outer loop + vertex 1.69773 0.42533 0.489362 + vertex 1.70547 0.418511 -0.510638 + vertex 1.70547 0.418511 0.489362 + endloop + endfacet + facet normal -0.707569 -0.706645 -0 + outer loop + vertex 1.70547 0.418511 0.489362 + vertex 1.70547 0.418511 -0.510638 + vertex 1.71283 0.41114 -0.510638 + endloop + endfacet + facet normal -0.707569 -0.706645 0 + outer loop + vertex 1.70547 0.418511 0.489362 + vertex 1.71283 0.41114 -0.510638 + vertex 1.71283 0.41114 0.489362 + endloop + endfacet + facet normal -0.750741 -0.660596 -0 + outer loop + vertex 1.71283 0.41114 0.489362 + vertex 1.71283 0.41114 -0.510638 + vertex 1.71981 0.403216 -0.510638 + endloop + endfacet + facet normal -0.750741 -0.660596 0 + outer loop + vertex 1.71283 0.41114 0.489362 + vertex 1.71981 0.403216 -0.510638 + vertex 1.71981 0.403216 0.489362 + endloop + endfacet + facet normal -0.790147 -0.612917 -0 + outer loop + vertex 1.71981 0.403216 0.489362 + vertex 1.71981 0.403216 -0.510638 + vertex 1.72638 0.39474 -0.510638 + endloop + endfacet + facet normal -0.790147 -0.612917 0 + outer loop + vertex 1.71981 0.403216 0.489362 + vertex 1.72638 0.39474 -0.510638 + vertex 1.72638 0.39474 0.489362 + endloop + endfacet + facet normal -0.825634 -0.564206 -0 + outer loop + vertex 1.72638 0.39474 0.489362 + vertex 1.72638 0.39474 -0.510638 + vertex 1.73255 0.385709 -0.510638 + endloop + endfacet + facet normal -0.825634 -0.564206 0 + outer loop + vertex 1.72638 0.39474 0.489362 + vertex 1.73255 0.385709 -0.510638 + vertex 1.73255 0.385709 0.489362 + endloop + endfacet + facet normal -0.857162 -0.515047 -0 + outer loop + vertex 1.73255 0.385709 0.489362 + vertex 1.73255 0.385709 -0.510638 + vertex 1.73831 0.376122 -0.510638 + endloop + endfacet + facet normal -0.857162 -0.515047 0 + outer loop + vertex 1.73255 0.385709 0.489362 + vertex 1.73831 0.376122 -0.510638 + vertex 1.73831 0.376122 0.489362 + endloop + endfacet + facet normal -0.884795 -0.465981 -0 + outer loop + vertex 1.73831 0.376122 0.489362 + vertex 1.73831 0.376122 -0.510638 + vertex 1.74366 0.36598 -0.510638 + endloop + endfacet + facet normal -0.884795 -0.465981 0 + outer loop + vertex 1.73831 0.376122 0.489362 + vertex 1.74366 0.36598 -0.510638 + vertex 1.74366 0.36598 0.489362 + endloop + endfacet + facet normal -0.908686 -0.417479 -0 + outer loop + vertex 1.74366 0.36598 0.489362 + vertex 1.74366 0.36598 -0.510638 + vertex 1.74857 0.355281 -0.510638 + endloop + endfacet + facet normal -0.908686 -0.417479 0 + outer loop + vertex 1.74366 0.36598 0.489362 + vertex 1.74857 0.355281 -0.510638 + vertex 1.74857 0.355281 0.489362 + endloop + endfacet + facet normal -0.929061 -0.369926 -0 + outer loop + vertex 1.74857 0.355281 0.489362 + vertex 1.74857 0.355281 -0.510638 + vertex 1.75305 0.344024 -0.510638 + endloop + endfacet + facet normal -0.929061 -0.369926 0 + outer loop + vertex 1.74857 0.355281 0.489362 + vertex 1.75305 0.344024 -0.510638 + vertex 1.75305 0.344024 0.489362 + endloop + endfacet + facet normal -0.946181 -0.323637 -0 + outer loop + vertex 1.75305 0.344024 0.489362 + vertex 1.75305 0.344024 -0.510638 + vertex 1.75709 0.332209 -0.510638 + endloop + endfacet + facet normal -0.946181 -0.323637 0 + outer loop + vertex 1.75305 0.344024 0.489362 + vertex 1.75709 0.332209 -0.510638 + vertex 1.75709 0.332209 0.489362 + endloop + endfacet + facet normal -0.960332 -0.27886 -0 + outer loop + vertex 1.75709 0.332209 0.489362 + vertex 1.75709 0.332209 -0.510638 + vertex 1.76069 0.319834 -0.510638 + endloop + endfacet + facet normal -0.960332 -0.27886 0 + outer loop + vertex 1.75709 0.332209 0.489362 + vertex 1.76069 0.319834 -0.510638 + vertex 1.76069 0.319834 0.489362 + endloop + endfacet + facet normal -0.971812 -0.235755 -0 + outer loop + vertex 1.76069 0.319834 0.489362 + vertex 1.76069 0.319834 -0.510638 + vertex 1.76383 0.306898 -0.510638 + endloop + endfacet + facet normal -0.971812 -0.235755 0 + outer loop + vertex 1.76069 0.319834 0.489362 + vertex 1.76383 0.306898 -0.510638 + vertex 1.76383 0.306898 0.489362 + endloop + endfacet + facet normal -0.980914 -0.194442 -0 + outer loop + vertex 1.76383 0.306898 0.489362 + vertex 1.76383 0.306898 -0.510638 + vertex 1.7665 0.293402 -0.510638 + endloop + endfacet + facet normal -0.980914 -0.194442 0 + outer loop + vertex 1.76383 0.306898 0.489362 + vertex 1.7665 0.293402 -0.510638 + vertex 1.7665 0.293402 0.489362 + endloop + endfacet + facet normal -0.987918 -0.154978 -0 + outer loop + vertex 1.7665 0.293402 0.489362 + vertex 1.7665 0.293402 -0.510638 + vertex 1.76871 0.279343 -0.510638 + endloop + endfacet + facet normal -0.987918 -0.154978 0 + outer loop + vertex 1.7665 0.293402 0.489362 + vertex 1.76871 0.279343 -0.510638 + vertex 1.76871 0.279343 0.489362 + endloop + endfacet + facet normal -0.993089 -0.117364 -0 + outer loop + vertex 1.76871 0.279343 0.489362 + vertex 1.76871 0.279343 -0.510638 + vertex 1.77043 0.26472 -0.510638 + endloop + endfacet + facet normal -0.993089 -0.117364 0 + outer loop + vertex 1.76871 0.279343 0.489362 + vertex 1.77043 0.26472 -0.510638 + vertex 1.77043 0.26472 0.489362 + endloop + endfacet + facet normal -0.996664 -0.0816088 -0 + outer loop + vertex 1.77043 0.26472 0.489362 + vertex 1.77043 0.26472 -0.510638 + vertex 1.77168 0.249534 -0.510638 + endloop + endfacet + facet normal -0.996664 -0.0816088 0 + outer loop + vertex 1.77043 0.26472 0.489362 + vertex 1.77168 0.249534 -0.510638 + vertex 1.77168 0.249534 0.489362 + endloop + endfacet + facet normal -0.998864 -0.0476566 -0 + outer loop + vertex 1.77168 0.249534 0.489362 + vertex 1.77168 0.249534 -0.510638 + vertex 1.77243 0.233783 -0.510638 + endloop + endfacet + facet normal -0.998864 -0.0476566 0 + outer loop + vertex 1.77168 0.249534 0.489362 + vertex 1.77243 0.233783 -0.510638 + vertex 1.77243 0.233783 0.489362 + endloop + endfacet + facet normal -0.999881 -0.0154502 -0 + outer loop + vertex 1.77243 0.233783 0.489362 + vertex 1.77243 0.233783 -0.510638 + vertex 1.77268 0.217466 -0.510638 + endloop + endfacet + facet normal -0.999881 -0.0154502 0 + outer loop + vertex 1.77243 0.233783 0.489362 + vertex 1.77268 0.217466 -0.510638 + vertex 1.77268 0.217466 0.489362 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex 1.77268 0.217466 0.489362 + vertex 1.77268 0.217466 -0.510638 + vertex 1.45668 0.217466 -0.510638 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex 1.77268 0.217466 0.489362 + vertex 1.45668 0.217466 -0.510638 + vertex 1.45668 0.217466 0.489362 + endloop + endfacet + facet normal -0.985203 -0.171394 -0 + outer loop + vertex 1.45668 0.217466 0.489362 + vertex 1.45668 0.217466 -0.510638 + vertex 1.45821 0.20871 -0.510638 + endloop + endfacet + facet normal -0.985203 -0.171394 0 + outer loop + vertex 1.45668 0.217466 0.489362 + vertex 1.45821 0.20871 -0.510638 + vertex 1.45821 0.20871 0.489362 + endloop + endfacet + facet normal -0.978862 -0.204522 -0 + outer loop + vertex 1.45821 0.20871 0.489362 + vertex 1.45821 0.20871 -0.510638 + vertex 1.45998 0.200241 -0.510638 + endloop + endfacet + facet normal -0.978862 -0.204522 0 + outer loop + vertex 1.45821 0.20871 0.489362 + vertex 1.45998 0.200241 -0.510638 + vertex 1.45998 0.200241 0.489362 + endloop + endfacet + facet normal -0.970976 -0.239175 -0 + outer loop + vertex 1.45998 0.200241 0.489362 + vertex 1.45998 0.200241 -0.510638 + vertex 1.46199 0.192059 -0.510638 + endloop + endfacet + facet normal -0.970976 -0.239175 0 + outer loop + vertex 1.45998 0.200241 0.489362 + vertex 1.46199 0.192059 -0.510638 + vertex 1.46199 0.192059 0.489362 + endloop + endfacet + facet normal -0.961345 -0.275346 -0 + outer loop + vertex 1.46199 0.192059 0.489362 + vertex 1.46199 0.192059 -0.510638 + vertex 1.46425 0.184167 -0.510638 + endloop + endfacet + facet normal -0.961345 -0.275346 0 + outer loop + vertex 1.46199 0.192059 0.489362 + vertex 1.46425 0.184167 -0.510638 + vertex 1.46425 0.184167 0.489362 + endloop + endfacet + facet normal -0.949759 -0.312981 -0 + outer loop + vertex 1.46425 0.184167 0.489362 + vertex 1.46425 0.184167 -0.510638 + vertex 1.46676 0.176564 -0.510638 + endloop + endfacet + facet normal -0.949759 -0.312981 0 + outer loop + vertex 1.46425 0.184167 0.489362 + vertex 1.46676 0.176564 -0.510638 + vertex 1.46676 0.176564 0.489362 + endloop + endfacet + facet normal -0.936015 -0.351961 -0 + outer loop + vertex 1.46676 0.176564 0.489362 + vertex 1.46676 0.176564 -0.510638 + vertex 1.46951 0.16925 -0.510638 + endloop + endfacet + facet normal -0.936015 -0.351961 0 + outer loop + vertex 1.46676 0.176564 0.489362 + vertex 1.46951 0.16925 -0.510638 + vertex 1.46951 0.16925 0.489362 + endloop + endfacet + facet normal -0.919889 -0.392178 -0 + outer loop + vertex 1.46951 0.16925 0.489362 + vertex 1.46951 0.16925 -0.510638 + vertex 1.4725 0.162228 -0.510638 + endloop + endfacet + facet normal -0.919889 -0.392178 0 + outer loop + vertex 1.46951 0.16925 0.489362 + vertex 1.4725 0.162228 -0.510638 + vertex 1.4725 0.162228 0.489362 + endloop + endfacet + facet normal -0.901183 -0.433439 -0 + outer loop + vertex 1.4725 0.162228 0.489362 + vertex 1.4725 0.162228 -0.510638 + vertex 1.47574 0.155497 -0.510638 + endloop + endfacet + facet normal -0.901183 -0.433439 0 + outer loop + vertex 1.4725 0.162228 0.489362 + vertex 1.47574 0.155497 -0.510638 + vertex 1.47574 0.155497 0.489362 + endloop + endfacet + facet normal -0.879713 -0.475506 -0 + outer loop + vertex 1.47574 0.155497 0.489362 + vertex 1.47574 0.155497 -0.510638 + vertex 1.47922 0.149057 -0.510638 + endloop + endfacet + facet normal -0.879713 -0.475506 0 + outer loop + vertex 1.47574 0.155497 0.489362 + vertex 1.47922 0.149057 -0.510638 + vertex 1.47922 0.149057 0.489362 + endloop + endfacet + facet normal -0.855316 -0.518106 -0 + outer loop + vertex 1.47922 0.149057 0.489362 + vertex 1.47922 0.149057 -0.510638 + vertex 1.48294 0.142911 -0.510638 + endloop + endfacet + facet normal -0.855316 -0.518106 0 + outer loop + vertex 1.47922 0.149057 0.489362 + vertex 1.48294 0.142911 -0.510638 + vertex 1.48294 0.142911 0.489362 + endloop + endfacet + facet normal -0.827892 -0.560888 -0 + outer loop + vertex 1.48294 0.142911 0.489362 + vertex 1.48294 0.142911 -0.510638 + vertex 1.48691 0.137058 -0.510638 + endloop + endfacet + facet normal -0.827892 -0.560888 0 + outer loop + vertex 1.48294 0.142911 0.489362 + vertex 1.48691 0.137058 -0.510638 + vertex 1.48691 0.137058 0.489362 + endloop + endfacet + facet normal -0.797387 -0.603468 -0 + outer loop + vertex 1.48691 0.137058 0.489362 + vertex 1.48691 0.137058 -0.510638 + vertex 1.49111 0.131498 -0.510638 + endloop + endfacet + facet normal -0.797387 -0.603468 0 + outer loop + vertex 1.48691 0.137058 0.489362 + vertex 1.49111 0.131498 -0.510638 + vertex 1.49111 0.131498 0.489362 + endloop + endfacet + facet normal -0.763822 -0.645427 -0 + outer loop + vertex 1.49111 0.131498 0.489362 + vertex 1.49111 0.131498 -0.510638 + vertex 1.49556 0.126234 -0.510638 + endloop + endfacet + facet normal -0.763822 -0.645427 0 + outer loop + vertex 1.49111 0.131498 0.489362 + vertex 1.49556 0.126234 -0.510638 + vertex 1.49556 0.126234 0.489362 + endloop + endfacet + facet normal -0.727283 -0.686338 -0 + outer loop + vertex 1.49556 0.126234 0.489362 + vertex 1.49556 0.126234 -0.510638 + vertex 1.50025 0.121265 -0.510638 + endloop + endfacet + facet normal -0.727283 -0.686338 0 + outer loop + vertex 1.49556 0.126234 0.489362 + vertex 1.50025 0.121265 -0.510638 + vertex 1.50025 0.121265 0.489362 + endloop + endfacet + facet normal -0.687961 -0.725748 -0 + outer loop + vertex 1.50025 0.121265 0.489362 + vertex 1.50025 0.121265 -0.510638 + vertex 1.50518 0.116591 -0.510638 + endloop + endfacet + facet normal -0.687961 -0.725748 0 + outer loop + vertex 1.50025 0.121265 0.489362 + vertex 1.50518 0.116591 -0.510638 + vertex 1.50518 0.116591 0.489362 + endloop + endfacet + facet normal -0.646118 -0.763237 -0 + outer loop + vertex 1.50518 0.116591 0.489362 + vertex 1.50518 0.116591 -0.510638 + vertex 1.51035 0.112215 -0.510638 + endloop + endfacet + facet normal -0.646118 -0.763237 0 + outer loop + vertex 1.50518 0.116591 0.489362 + vertex 1.51035 0.112215 -0.510638 + vertex 1.51035 0.112215 0.489362 + endloop + endfacet + facet normal -0.602087 -0.798431 -0 + outer loop + vertex 1.51035 0.112215 0.489362 + vertex 1.51035 0.112215 -0.510638 + vertex 1.51576 0.108136 -0.510638 + endloop + endfacet + facet normal -0.602087 -0.798431 0 + outer loop + vertex 1.51035 0.112215 0.489362 + vertex 1.51576 0.108136 -0.510638 + vertex 1.51576 0.108136 0.489362 + endloop + endfacet + facet normal -0.556276 -0.830998 -0 + outer loop + vertex 1.51576 0.108136 0.489362 + vertex 1.51576 0.108136 -0.510638 + vertex 1.52141 0.104354 -0.510638 + endloop + endfacet + facet normal -0.556276 -0.830998 0 + outer loop + vertex 1.51576 0.108136 0.489362 + vertex 1.52141 0.104354 -0.510638 + vertex 1.52141 0.104354 0.489362 + endloop + endfacet + facet normal -0.509132 -0.860688 -0 + outer loop + vertex 1.52141 0.104354 0.489362 + vertex 1.52141 0.104354 -0.510638 + vertex 1.5273 0.100872 -0.510638 + endloop + endfacet + facet normal -0.509132 -0.860688 0 + outer loop + vertex 1.52141 0.104354 0.489362 + vertex 1.5273 0.100872 -0.510638 + vertex 1.5273 0.100872 0.489362 + endloop + endfacet + facet normal -0.461123 -0.887336 -0 + outer loop + vertex 1.5273 0.100872 0.489362 + vertex 1.5273 0.100872 -0.510638 + vertex 1.53342 0.0976886 -0.510638 + endloop + endfacet + facet normal -0.461123 -0.887336 0 + outer loop + vertex 1.5273 0.100872 0.489362 + vertex 1.53342 0.0976886 -0.510638 + vertex 1.53342 0.0976886 0.489362 + endloop + endfacet + facet normal -0.412714 -0.910861 -0 + outer loop + vertex 1.53342 0.0976886 0.489362 + vertex 1.53342 0.0976886 -0.510638 + vertex 1.53979 0.0948054 -0.510638 + endloop + endfacet + facet normal -0.412714 -0.910861 0 + outer loop + vertex 1.53342 0.0976886 0.489362 + vertex 1.53979 0.0948054 -0.510638 + vertex 1.53979 0.0948054 0.489362 + endloop + endfacet + facet normal -0.364363 -0.931257 -0 + outer loop + vertex 1.53979 0.0948054 0.489362 + vertex 1.53979 0.0948054 -0.510638 + vertex 1.54639 0.0922228 -0.510638 + endloop + endfacet + facet normal -0.364363 -0.931257 0 + outer loop + vertex 1.53979 0.0948054 0.489362 + vertex 1.54639 0.0922228 -0.510638 + vertex 1.54639 0.0922228 0.489362 + endloop + endfacet + facet normal -0.316485 -0.948598 -0 + outer loop + vertex 1.54639 0.0922228 0.489362 + vertex 1.54639 0.0922228 -0.510638 + vertex 1.55322 0.0899416 -0.510638 + endloop + endfacet + facet normal -0.316485 -0.948598 0 + outer loop + vertex 1.54639 0.0922228 0.489362 + vertex 1.55322 0.0899416 -0.510638 + vertex 1.55322 0.0899416 0.489362 + endloop + endfacet + facet normal -0.269445 -0.963016 -0 + outer loop + vertex 1.55322 0.0899416 0.489362 + vertex 1.55322 0.0899416 -0.510638 + vertex 1.5603 0.0879624 -0.510638 + endloop + endfacet + facet normal -0.269445 -0.963016 0 + outer loop + vertex 1.55322 0.0899416 0.489362 + vertex 1.5603 0.0879624 -0.510638 + vertex 1.5603 0.0879624 0.489362 + endloop + endfacet + facet normal -0.223549 -0.974693 -0 + outer loop + vertex 1.5603 0.0879624 0.489362 + vertex 1.5603 0.0879624 -0.510638 + vertex 1.56761 0.0862858 -0.510638 + endloop + endfacet + facet normal -0.223549 -0.974693 0 + outer loop + vertex 1.5603 0.0879624 0.489362 + vertex 1.56761 0.0862858 -0.510638 + vertex 1.56761 0.0862858 0.489362 + endloop + endfacet + facet normal -0.179052 -0.98384 -0 + outer loop + vertex 1.56761 0.0862858 0.489362 + vertex 1.56761 0.0862858 -0.510638 + vertex 1.57515 0.0849126 -0.510638 + endloop + endfacet + facet normal -0.179052 -0.98384 0 + outer loop + vertex 1.56761 0.0862858 0.489362 + vertex 1.57515 0.0849126 -0.510638 + vertex 1.57515 0.0849126 0.489362 + endloop + endfacet + facet normal -0.136143 -0.990689 -0 + outer loop + vertex 1.57515 0.0849126 0.489362 + vertex 1.57515 0.0849126 -0.510638 + vertex 1.58293 0.0838434 -0.510638 + endloop + endfacet + facet normal -0.136143 -0.990689 0 + outer loop + vertex 1.57515 0.0849126 0.489362 + vertex 1.58293 0.0838434 -0.510638 + vertex 1.58293 0.0838434 0.489362 + endloop + endfacet + facet normal -0.0949564 -0.995481 -0 + outer loop + vertex 1.58293 0.0838434 0.489362 + vertex 1.58293 0.0838434 -0.510638 + vertex 1.59095 0.0830788 -0.510638 + endloop + endfacet + facet normal -0.0949564 -0.995481 0 + outer loop + vertex 1.58293 0.0838434 0.489362 + vertex 1.59095 0.0830788 -0.510638 + vertex 1.59095 0.0830788 0.489362 + endloop + endfacet + facet normal -0.0555807 -0.998454 -0 + outer loop + vertex 1.59095 0.0830788 0.489362 + vertex 1.59095 0.0830788 -0.510638 + vertex 1.5992 0.0826196 -0.510638 + endloop + endfacet + facet normal -0.0555807 -0.998454 0 + outer loop + vertex 1.59095 0.0830788 0.489362 + vertex 1.5992 0.0826196 -0.510638 + vertex 1.5992 0.0826196 0.489362 + endloop + endfacet + facet normal -0.0180586 -0.999837 -0 + outer loop + vertex 1.5992 0.0826196 0.489362 + vertex 1.5992 0.0826196 -0.510638 + vertex 1.60768 0.0824664 -0.510638 + endloop + endfacet + facet normal -0.0180586 -0.999837 0 + outer loop + vertex 1.5992 0.0826196 0.489362 + vertex 1.60768 0.0824664 -0.510638 + vertex 1.60768 0.0824664 0.489362 + endloop + endfacet + facet normal 0.0123232 -0.999924 0 + outer loop + vertex 1.60768 0.0824664 0.489362 + vertex 1.60768 0.0824664 -0.510638 + vertex 1.61307 0.0825328 -0.510638 + endloop + endfacet + facet normal 0.0123232 -0.999924 0 + outer loop + vertex 1.60768 0.0824664 0.489362 + vertex 1.61307 0.0825328 -0.510638 + vertex 1.61307 0.0825328 0.489362 + endloop + endfacet + facet normal 0.0369219 -0.999318 0 + outer loop + vertex 1.61307 0.0825328 0.489362 + vertex 1.61307 0.0825328 -0.510638 + vertex 1.61844 0.0827313 -0.510638 + endloop + endfacet + facet normal 0.0369219 -0.999318 0 + outer loop + vertex 1.61307 0.0825328 0.489362 + vertex 1.61844 0.0827313 -0.510638 + vertex 1.61844 0.0827313 0.489362 + endloop + endfacet + facet normal 0.061368 -0.998115 0 + outer loop + vertex 1.61844 0.0827313 0.489362 + vertex 1.61844 0.0827313 -0.510638 + vertex 1.6238 0.0830604 -0.510638 + endloop + endfacet + facet normal 0.061368 -0.998115 0 + outer loop + vertex 1.61844 0.0827313 0.489362 + vertex 1.6238 0.0830604 -0.510638 + vertex 1.6238 0.0830604 0.489362 + endloop + endfacet + facet normal 0.0856083 -0.996329 0 + outer loop + vertex 1.6238 0.0830604 0.489362 + vertex 1.6238 0.0830604 -0.510638 + vertex 1.62913 0.0835188 -0.510638 + endloop + endfacet + facet normal 0.0856083 -0.996329 0 + outer loop + vertex 1.6238 0.0830604 0.489362 + vertex 1.62913 0.0835188 -0.510638 + vertex 1.62913 0.0835188 0.489362 + endloop + endfacet + facet normal 0.10959 -0.993977 0 + outer loop + vertex 1.62913 0.0835188 0.489362 + vertex 1.62913 0.0835188 -0.510638 + vertex 1.63445 0.0841053 -0.510638 + endloop + endfacet + facet normal 0.10959 -0.993977 0 + outer loop + vertex 1.62913 0.0835188 0.489362 + vertex 1.63445 0.0841053 -0.510638 + vertex 1.63445 0.0841053 0.489362 + endloop + endfacet + facet normal 0.133261 -0.991081 0 + outer loop + vertex 1.63445 0.0841053 0.489362 + vertex 1.63445 0.0841053 -0.510638 + vertex 1.63975 0.0848184 -0.510638 + endloop + endfacet + facet normal 0.133261 -0.991081 0 + outer loop + vertex 1.63445 0.0841053 0.489362 + vertex 1.63975 0.0848184 -0.510638 + vertex 1.63975 0.0848184 0.489362 + endloop + endfacet + facet normal 0.156575 -0.987666 0 + outer loop + vertex 1.63975 0.0848184 0.489362 + vertex 1.63975 0.0848184 -0.510638 + vertex 1.64504 0.0856568 -0.510638 + endloop + endfacet + facet normal 0.156575 -0.987666 0 + outer loop + vertex 1.63975 0.0848184 0.489362 + vertex 1.64504 0.0856568 -0.510638 + vertex 1.64504 0.0856568 0.489362 + endloop + endfacet + facet normal 0.17949 -0.98376 0 + outer loop + vertex 1.64504 0.0856568 0.489362 + vertex 1.64504 0.0856568 -0.510638 + vertex 1.65032 0.0866193 -0.510638 + endloop + endfacet + facet normal 0.17949 -0.98376 0 + outer loop + vertex 1.64504 0.0856568 0.489362 + vertex 1.65032 0.0866193 -0.510638 + vertex 1.65032 0.0866193 0.489362 + endloop + endfacet + facet normal 0.201962 -0.979393 0 + outer loop + vertex 1.65032 0.0866193 0.489362 + vertex 1.65032 0.0866193 -0.510638 + vertex 1.65558 0.0877044 -0.510638 + endloop + endfacet + facet normal 0.201962 -0.979393 0 + outer loop + vertex 1.65032 0.0866193 0.489362 + vertex 1.65558 0.0877044 -0.510638 + vertex 1.65558 0.0877044 0.489362 + endloop + endfacet + facet normal 0.223957 -0.974599 0 + outer loop + vertex 1.65558 0.0877044 0.489362 + vertex 1.65558 0.0877044 -0.510638 + vertex 1.66083 0.0889108 -0.510638 + endloop + endfacet + facet normal 0.223957 -0.974599 0 + outer loop + vertex 1.65558 0.0877044 0.489362 + vertex 1.66083 0.0889108 -0.510638 + vertex 1.66083 0.0889108 0.489362 + endloop + endfacet + facet normal 0.245441 -0.969412 0 + outer loop + vertex 1.66083 0.0889108 0.489362 + vertex 1.66083 0.0889108 -0.510638 + vertex 1.66607 0.0902373 -0.510638 + endloop + endfacet + facet normal 0.245441 -0.969412 0 + outer loop + vertex 1.66083 0.0889108 0.489362 + vertex 1.66607 0.0902373 -0.510638 + vertex 1.66607 0.0902373 0.489362 + endloop + endfacet + facet normal 0.266391 -0.963865 0 + outer loop + vertex 1.66607 0.0902373 0.489362 + vertex 1.66607 0.0902373 -0.510638 + vertex 1.6713 0.0916824 -0.510638 + endloop + endfacet + facet normal 0.266391 -0.963865 0 + outer loop + vertex 1.66607 0.0902373 0.489362 + vertex 1.6713 0.0916824 -0.510638 + vertex 1.6713 0.0916824 0.489362 + endloop + endfacet + facet normal 0.286777 -0.957997 0 + outer loop + vertex 1.6713 0.0916824 0.489362 + vertex 1.6713 0.0916824 -0.510638 + vertex 1.67652 0.0932448 -0.510638 + endloop + endfacet + facet normal 0.286777 -0.957997 0 + outer loop + vertex 1.6713 0.0916824 0.489362 + vertex 1.67652 0.0932448 -0.510638 + vertex 1.67652 0.0932448 0.489362 + endloop + endfacet + facet normal 0.306586 -0.951843 0 + outer loop + vertex 1.67652 0.0932448 0.489362 + vertex 1.67652 0.0932448 -0.510638 + vertex 1.68173 0.0949233 -0.510638 + endloop + endfacet + facet normal 0.306586 -0.951843 0 + outer loop + vertex 1.67652 0.0932448 0.489362 + vertex 1.68173 0.0949233 -0.510638 + vertex 1.68173 0.0949233 0.489362 + endloop + endfacet + facet normal 0.325796 -0.94544 0 + outer loop + vertex 1.68173 0.0949233 0.489362 + vertex 1.68173 0.0949233 -0.510638 + vertex 1.68693 0.0967164 -0.510638 + endloop + endfacet + facet normal 0.325796 -0.94544 0 + outer loop + vertex 1.68173 0.0949233 0.489362 + vertex 1.68693 0.0967164 -0.510638 + vertex 1.68693 0.0967164 0.489362 + endloop + endfacet + facet normal 0.344406 -0.938821 0 + outer loop + vertex 1.68693 0.0967164 0.489362 + vertex 1.68693 0.0967164 -0.510638 + vertex 1.69213 0.0986228 -0.510638 + endloop + endfacet + facet normal 0.344406 -0.938821 0 + outer loop + vertex 1.68693 0.0967164 0.489362 + vertex 1.69213 0.0986228 -0.510638 + vertex 1.69213 0.0986228 0.489362 + endloop + endfacet + facet normal 0.362398 -0.932024 0 + outer loop + vertex 1.69213 0.0986228 0.489362 + vertex 1.69213 0.0986228 -0.510638 + vertex 1.69732 0.100641 -0.510638 + endloop + endfacet + facet normal 0.362398 -0.932024 0 + outer loop + vertex 1.69213 0.0986228 0.489362 + vertex 1.69732 0.100641 -0.510638 + vertex 1.69732 0.100641 0.489362 + endloop + endfacet + facet normal 0.379777 -0.925078 0 + outer loop + vertex 1.69732 0.100641 0.489362 + vertex 1.69732 0.100641 -0.510638 + vertex 1.70251 0.10277 -0.510638 + endloop + endfacet + facet normal 0.379777 -0.925078 0 + outer loop + vertex 1.69732 0.100641 0.489362 + vertex 1.70251 0.10277 -0.510638 + vertex 1.70251 0.10277 0.489362 + endloop + endfacet + facet normal 0.39654 -0.918017 0 + outer loop + vertex 1.70251 0.10277 0.489362 + vertex 1.70251 0.10277 -0.510638 + vertex 1.70769 0.105009 -0.510638 + endloop + endfacet + facet normal 0.39654 -0.918017 0 + outer loop + vertex 1.70251 0.10277 0.489362 + vertex 1.70769 0.105009 -0.510638 + vertex 1.70769 0.105009 0.489362 + endloop + endfacet + facet normal 0.412686 -0.910874 0 + outer loop + vertex 1.70769 0.105009 0.489362 + vertex 1.70769 0.105009 -0.510638 + vertex 1.71287 0.107355 -0.510638 + endloop + endfacet + facet normal 0.412686 -0.910874 0 + outer loop + vertex 1.70769 0.105009 0.489362 + vertex 1.71287 0.107355 -0.510638 + vertex 1.71287 0.107355 0.489362 + endloop + endfacet + facet normal 0.428222 -0.903674 0 + outer loop + vertex 1.71287 0.107355 0.489362 + vertex 1.71287 0.107355 -0.510638 + vertex 1.71804 0.109808 -0.510638 + endloop + endfacet + facet normal 0.428222 -0.903674 0 + outer loop + vertex 1.71287 0.107355 0.489362 + vertex 1.71804 0.109808 -0.510638 + vertex 1.71804 0.109808 0.489362 + endloop + endfacet + facet normal 0.443151 -0.896447 0 + outer loop + vertex 1.71804 0.109808 0.489362 + vertex 1.71804 0.109808 -0.510638 + vertex 1.72322 0.112367 -0.510638 + endloop + endfacet + facet normal 0.443151 -0.896447 0 + outer loop + vertex 1.71804 0.109808 0.489362 + vertex 1.72322 0.112367 -0.510638 + vertex 1.72322 0.112367 0.489362 + endloop + endfacet + facet normal 0.457486 -0.889217 0 + outer loop + vertex 1.72322 0.112367 0.489362 + vertex 1.72322 0.112367 -0.510638 + vertex 1.72839 0.115029 -0.510638 + endloop + endfacet + facet normal 0.457486 -0.889217 0 + outer loop + vertex 1.72322 0.112367 0.489362 + vertex 1.72839 0.115029 -0.510638 + vertex 1.72839 0.115029 0.489362 + endloop + endfacet + facet normal 0.471233 -0.882009 0 + outer loop + vertex 1.72839 0.115029 0.489362 + vertex 1.72839 0.115029 -0.510638 + vertex 1.73357 0.117794 -0.510638 + endloop + endfacet + facet normal 0.471233 -0.882009 0 + outer loop + vertex 1.72839 0.115029 0.489362 + vertex 1.73357 0.117794 -0.510638 + vertex 1.73357 0.117794 0.489362 + endloop + endfacet + facet normal 0.48441 -0.874841 0 + outer loop + vertex 1.73357 0.117794 0.489362 + vertex 1.73357 0.117794 -0.510638 + vertex 1.73875 0.120661 -0.510638 + endloop + endfacet + facet normal 0.48441 -0.874841 0 + outer loop + vertex 1.73357 0.117794 0.489362 + vertex 1.73875 0.120661 -0.510638 + vertex 1.73875 0.120661 0.489362 + endloop + endfacet + facet normal 0.497022 -0.867738 0 + outer loop + vertex 1.73875 0.120661 0.489362 + vertex 1.73875 0.120661 -0.510638 + vertex 1.74393 0.123627 -0.510638 + endloop + endfacet + facet normal 0.497022 -0.867738 0 + outer loop + vertex 1.73875 0.120661 0.489362 + vertex 1.74393 0.123627 -0.510638 + vertex 1.74393 0.123627 0.489362 + endloop + endfacet + facet normal 0.509089 -0.860714 0 + outer loop + vertex 1.74393 0.123627 0.489362 + vertex 1.74393 0.123627 -0.510638 + vertex 1.74911 0.126692 -0.510638 + endloop + endfacet + facet normal 0.509089 -0.860714 0 + outer loop + vertex 1.74393 0.123627 0.489362 + vertex 1.74911 0.126692 -0.510638 + vertex 1.74911 0.126692 0.489362 + endloop + endfacet + facet normal 0.520623 -0.853787 0 + outer loop + vertex 1.74911 0.126692 0.489362 + vertex 1.74911 0.126692 -0.510638 + vertex 1.75429 0.129855 -0.510638 + endloop + endfacet + facet normal 0.520623 -0.853787 0 + outer loop + vertex 1.74911 0.126692 0.489362 + vertex 1.75429 0.129855 -0.510638 + vertex 1.75429 0.129855 0.489362 + endloop + endfacet + facet normal 0.531643 -0.846968 0 + outer loop + vertex 1.75429 0.129855 0.489362 + vertex 1.75429 0.129855 -0.510638 + vertex 1.75949 0.133113 -0.510638 + endloop + endfacet + facet normal 0.531643 -0.846968 0 + outer loop + vertex 1.75429 0.129855 0.489362 + vertex 1.75949 0.133113 -0.510638 + vertex 1.75949 0.133113 0.489362 + endloop + endfacet + facet normal 0.542166 -0.840272 0 + outer loop + vertex 1.75949 0.133113 0.489362 + vertex 1.75949 0.133113 -0.510638 + vertex 1.76468 0.136466 -0.510638 + endloop + endfacet + facet normal 0.542166 -0.840272 0 + outer loop + vertex 1.75949 0.133113 0.489362 + vertex 1.76468 0.136466 -0.510638 + vertex 1.76468 0.136466 0.489362 + endloop + endfacet + facet normal -1 0 -0 + outer loop + vertex 1.76468 0.136466 0.489362 + vertex 1.76468 0.136466 -0.510638 + vertex 1.76468 0.0504664 -0.510638 + endloop + endfacet + facet normal -1 -0 0 + outer loop + vertex 1.76468 0.136466 0.489362 + vertex 1.76468 0.0504664 -0.510638 + vertex 1.76468 0.0504664 0.489362 + endloop + endfacet + facet normal -0.548978 0.835837 0 + outer loop + vertex 1.76468 0.0504664 0.489362 + vertex 1.76468 0.0504664 -0.510638 + vertex 1.7593 0.0469297 -0.510638 + endloop + endfacet + facet normal -0.548978 0.835837 0 + outer loop + vertex 1.76468 0.0504664 0.489362 + vertex 1.7593 0.0469297 -0.510638 + vertex 1.7593 0.0469297 0.489362 + endloop + endfacet + facet normal 0.995002 0.0998513 0 + outer loop + vertex 1.68426 0.283182 0.489362 + vertex 1.68426 0.283182 -0.510638 + vertex 1.68361 0.289728 -0.510638 + endloop + endfacet + facet normal 0.995002 0.0998513 0 + outer loop + vertex 1.68426 0.283182 0.489362 + vertex 1.68361 0.289728 -0.510638 + vertex 1.68361 0.289728 0.489362 + endloop + endfacet + facet normal 0.990349 0.138598 0 + outer loop + vertex 1.68361 0.289728 0.489362 + vertex 1.68361 0.289728 -0.510638 + vertex 1.68271 0.296098 -0.510638 + endloop + endfacet + facet normal 0.990349 0.138598 0 + outer loop + vertex 1.68361 0.289728 0.489362 + vertex 1.68271 0.296098 -0.510638 + vertex 1.68271 0.296098 0.489362 + endloop + endfacet + facet normal 0.983933 0.178536 0 + outer loop + vertex 1.68271 0.296098 0.489362 + vertex 1.68271 0.296098 -0.510638 + vertex 1.68159 0.30229 -0.510638 + endloop + endfacet + facet normal 0.983933 0.178536 0 + outer loop + vertex 1.68271 0.296098 0.489362 + vertex 1.68159 0.30229 -0.510638 + vertex 1.68159 0.30229 0.489362 + endloop + endfacet + facet normal 0.975582 0.219637 0 + outer loop + vertex 1.68159 0.30229 0.489362 + vertex 1.68159 0.30229 -0.510638 + vertex 1.68024 0.3083 -0.510638 + endloop + endfacet + facet normal 0.975582 0.219637 0 + outer loop + vertex 1.68159 0.30229 0.489362 + vertex 1.68024 0.3083 -0.510638 + vertex 1.68024 0.3083 0.489362 + endloop + endfacet + facet normal 0.96512 0.26181 0 + outer loop + vertex 1.68024 0.3083 0.489362 + vertex 1.68024 0.3083 -0.510638 + vertex 1.67866 0.314122 -0.510638 + endloop + endfacet + facet normal 0.96512 0.26181 0 + outer loop + vertex 1.68024 0.3083 0.489362 + vertex 1.67866 0.314122 -0.510638 + vertex 1.67866 0.314122 0.489362 + endloop + endfacet + facet normal 0.952362 0.304971 0 + outer loop + vertex 1.67866 0.314122 0.489362 + vertex 1.67866 0.314122 -0.510638 + vertex 1.67685 0.319754 -0.510638 + endloop + endfacet + facet normal 0.952362 0.304971 0 + outer loop + vertex 1.67866 0.314122 0.489362 + vertex 1.67685 0.319754 -0.510638 + vertex 1.67685 0.319754 0.489362 + endloop + endfacet + facet normal 0.937127 0.34899 0 + outer loop + vertex 1.67685 0.319754 0.489362 + vertex 1.67685 0.319754 -0.510638 + vertex 1.67483 0.325192 -0.510638 + endloop + endfacet + facet normal 0.937127 0.34899 0 + outer loop + vertex 1.67685 0.319754 0.489362 + vertex 1.67483 0.325192 -0.510638 + vertex 1.67483 0.325192 0.489362 + endloop + endfacet + facet normal 0.919248 0.393679 0 + outer loop + vertex 1.67483 0.325192 0.489362 + vertex 1.67483 0.325192 -0.510638 + vertex 1.67259 0.33043 -0.510638 + endloop + endfacet + facet normal 0.919248 0.393679 0 + outer loop + vertex 1.67483 0.325192 0.489362 + vertex 1.67259 0.33043 -0.510638 + vertex 1.67259 0.33043 0.489362 + endloop + endfacet + facet normal 0.898561 0.438848 0 + outer loop + vertex 1.67259 0.33043 0.489362 + vertex 1.67259 0.33043 -0.510638 + vertex 1.67013 0.335466 -0.510638 + endloop + endfacet + facet normal 0.898561 0.438848 0 + outer loop + vertex 1.67259 0.33043 0.489362 + vertex 1.67013 0.335466 -0.510638 + vertex 1.67013 0.335466 0.489362 + endloop + endfacet + facet normal 0.874929 0.484252 0 + outer loop + vertex 1.67013 0.335466 0.489362 + vertex 1.67013 0.335466 -0.510638 + vertex 1.66745 0.340296 -0.510638 + endloop + endfacet + facet normal 0.874929 0.484252 0 + outer loop + vertex 1.67013 0.335466 0.489362 + vertex 1.66745 0.340296 -0.510638 + vertex 1.66745 0.340296 0.489362 + endloop + endfacet + facet normal 0.848256 0.529587 0 + outer loop + vertex 1.66745 0.340296 0.489362 + vertex 1.66745 0.340296 -0.510638 + vertex 1.66457 0.344914 -0.510638 + endloop + endfacet + facet normal 0.848256 0.529587 0 + outer loop + vertex 1.66745 0.340296 0.489362 + vertex 1.66457 0.344914 -0.510638 + vertex 1.66457 0.344914 0.489362 + endloop + endfacet + facet normal 0.818466 0.574555 0 + outer loop + vertex 1.66457 0.344914 0.489362 + vertex 1.66457 0.344914 -0.510638 + vertex 1.66148 0.349318 -0.510638 + endloop + endfacet + facet normal 0.818466 0.574555 0 + outer loop + vertex 1.66457 0.344914 0.489362 + vertex 1.66148 0.349318 -0.510638 + vertex 1.66148 0.349318 0.489362 + endloop + endfacet + facet normal 0.785553 0.618794 0 + outer loop + vertex 1.66148 0.349318 0.489362 + vertex 1.66148 0.349318 -0.510638 + vertex 1.65818 0.353504 -0.510638 + endloop + endfacet + facet normal 0.785553 0.618794 0 + outer loop + vertex 1.66148 0.349318 0.489362 + vertex 1.65818 0.353504 -0.510638 + vertex 1.65818 0.353504 0.489362 + endloop + endfacet + facet normal 0.749553 0.661945 0 + outer loop + vertex 1.65818 0.353504 0.489362 + vertex 1.65818 0.353504 -0.510638 + vertex 1.65468 0.357466 -0.510638 + endloop + endfacet + facet normal 0.749553 0.661945 0 + outer loop + vertex 1.65818 0.353504 0.489362 + vertex 1.65468 0.357466 -0.510638 + vertex 1.65468 0.357466 0.489362 + endloop + endfacet + facet normal 0.710564 0.703632 0 + outer loop + vertex 1.65468 0.357466 0.489362 + vertex 1.65468 0.357466 -0.510638 + vertex 1.65098 0.361202 -0.510638 + endloop + endfacet + facet normal 0.710564 0.703632 0 + outer loop + vertex 1.65468 0.357466 0.489362 + vertex 1.65098 0.361202 -0.510638 + vertex 1.65098 0.361202 0.489362 + endloop + endfacet + facet normal 0.668772 0.743468 0 + outer loop + vertex 1.65098 0.361202 0.489362 + vertex 1.65098 0.361202 -0.510638 + vertex 1.64709 0.364708 -0.510638 + endloop + endfacet + facet normal 0.668772 0.743468 0 + outer loop + vertex 1.65098 0.361202 0.489362 + vertex 1.64709 0.364708 -0.510638 + vertex 1.64709 0.364708 0.489362 + endloop + endfacet + facet normal 0.624399 0.781106 0 + outer loop + vertex 1.64709 0.364708 0.489362 + vertex 1.64709 0.364708 -0.510638 + vertex 1.64299 0.367978 -0.510638 + endloop + endfacet + facet normal 0.624399 0.781106 0 + outer loop + vertex 1.64709 0.364708 0.489362 + vertex 1.64299 0.367978 -0.510638 + vertex 1.64299 0.367978 0.489362 + endloop + endfacet + facet normal 0.577741 0.81622 0 + outer loop + vertex 1.64299 0.367978 0.489362 + vertex 1.64299 0.367978 -0.510638 + vertex 1.63871 0.37101 -0.510638 + endloop + endfacet + facet normal 0.577741 0.81622 0 + outer loop + vertex 1.64299 0.367978 0.489362 + vertex 1.63871 0.37101 -0.510638 + vertex 1.63871 0.37101 0.489362 + endloop + endfacet + facet normal 0.529151 0.848528 0 + outer loop + vertex 1.63871 0.37101 0.489362 + vertex 1.63871 0.37101 -0.510638 + vertex 1.63424 0.3738 -0.510638 + endloop + endfacet + facet normal 0.529151 0.848528 0 + outer loop + vertex 1.63871 0.37101 0.489362 + vertex 1.63424 0.3738 -0.510638 + vertex 1.63424 0.3738 0.489362 + endloop + endfacet + facet normal 0.479013 0.877808 0 + outer loop + vertex 1.63424 0.3738 0.489362 + vertex 1.63424 0.3738 -0.510638 + vertex 1.62958 0.376342 -0.510638 + endloop + endfacet + facet normal 0.479013 0.877808 0 + outer loop + vertex 1.63424 0.3738 0.489362 + vertex 1.62958 0.376342 -0.510638 + vertex 1.62958 0.376342 0.489362 + endloop + endfacet + facet normal 0.427732 0.903906 0 + outer loop + vertex 1.62958 0.376342 0.489362 + vertex 1.62958 0.376342 -0.510638 + vertex 1.62473 0.378634 -0.510638 + endloop + endfacet + facet normal 0.427732 0.903906 0 + outer loop + vertex 1.62958 0.376342 0.489362 + vertex 1.62473 0.378634 -0.510638 + vertex 1.62473 0.378634 0.489362 + endloop + endfacet + facet normal 0.37574 0.926725 0 + outer loop + vertex 1.62473 0.378634 0.489362 + vertex 1.62473 0.378634 -0.510638 + vertex 1.61971 0.380672 -0.510638 + endloop + endfacet + facet normal 0.37574 0.926725 0 + outer loop + vertex 1.62473 0.378634 0.489362 + vertex 1.61971 0.380672 -0.510638 + vertex 1.61971 0.380672 0.489362 + endloop + endfacet + facet normal 0.32344 0.946249 0 + outer loop + vertex 1.61971 0.380672 0.489362 + vertex 1.61971 0.380672 -0.510638 + vertex 1.61451 0.38245 -0.510638 + endloop + endfacet + facet normal 0.32344 0.946249 0 + outer loop + vertex 1.61971 0.380672 0.489362 + vertex 1.61451 0.38245 -0.510638 + vertex 1.61451 0.38245 0.489362 + endloop + endfacet + facet normal 0.27124 0.962512 0 + outer loop + vertex 1.61451 0.38245 0.489362 + vertex 1.61451 0.38245 -0.510638 + vertex 1.60913 0.383966 -0.510638 + endloop + endfacet + facet normal 0.27124 0.962512 0 + outer loop + vertex 1.61451 0.38245 0.489362 + vertex 1.60913 0.383966 -0.510638 + vertex 1.60913 0.383966 0.489362 + endloop + endfacet + facet normal 0.219503 0.975612 0 + outer loop + vertex 1.60913 0.383966 0.489362 + vertex 1.60913 0.383966 -0.510638 + vertex 1.60357 0.385216 -0.510638 + endloop + endfacet + facet normal 0.219503 0.975612 0 + outer loop + vertex 1.60913 0.383966 0.489362 + vertex 1.60357 0.385216 -0.510638 + vertex 1.60357 0.385216 0.489362 + endloop + endfacet + facet normal 0.168544 0.985694 0 + outer loop + vertex 1.60357 0.385216 0.489362 + vertex 1.60357 0.385216 -0.510638 + vertex 1.59785 0.386194 -0.510638 + endloop + endfacet + facet normal 0.168544 0.985694 0 + outer loop + vertex 1.60357 0.385216 0.489362 + vertex 1.59785 0.386194 -0.510638 + vertex 1.59785 0.386194 0.489362 + endloop + endfacet + facet normal 0.118647 0.992936 0 + outer loop + vertex 1.59785 0.386194 0.489362 + vertex 1.59785 0.386194 -0.510638 + vertex 1.59196 0.386898 -0.510638 + endloop + endfacet + facet normal 0.118647 0.992936 0 + outer loop + vertex 1.59785 0.386194 0.489362 + vertex 1.59196 0.386898 -0.510638 + vertex 1.59196 0.386898 0.489362 + endloop + endfacet + facet normal 0.0700513 0.997543 0 + outer loop + vertex 1.59196 0.386898 0.489362 + vertex 1.59196 0.386898 -0.510638 + vertex 1.5859 0.387324 -0.510638 + endloop + endfacet + facet normal 0.0700513 0.997543 0 + outer loop + vertex 1.59196 0.386898 0.489362 + vertex 1.5859 0.387324 -0.510638 + vertex 1.5859 0.387324 0.489362 + endloop + endfacet + facet normal 0.0229321 0.999737 0 + outer loop + vertex 1.5859 0.387324 0.489362 + vertex 1.5859 0.387324 -0.510638 + vertex 1.57968 0.387466 -0.510638 + endloop + endfacet + facet normal 0.0229321 0.999737 0 + outer loop + vertex 1.5859 0.387324 0.489362 + vertex 1.57968 0.387466 -0.510638 + vertex 1.57968 0.387466 0.489362 + endloop + endfacet + facet normal -0.019819 0.999804 0 + outer loop + vertex 1.57968 0.387466 0.489362 + vertex 1.57968 0.387466 -0.510638 + vertex 1.57297 0.387333 -0.510638 + endloop + endfacet + facet normal -0.019819 0.999804 0 + outer loop + vertex 1.57968 0.387466 0.489362 + vertex 1.57297 0.387333 -0.510638 + vertex 1.57297 0.387333 0.489362 + endloop + endfacet + facet normal -0.0607887 0.998151 0 + outer loop + vertex 1.57297 0.387333 0.489362 + vertex 1.57297 0.387333 -0.510638 + vertex 1.56644 0.386936 -0.510638 + endloop + endfacet + facet normal -0.0607887 0.998151 0 + outer loop + vertex 1.57297 0.387333 0.489362 + vertex 1.56644 0.386936 -0.510638 + vertex 1.56644 0.386936 0.489362 + endloop + endfacet + facet normal -0.103454 0.994634 0 + outer loop + vertex 1.56644 0.386936 0.489362 + vertex 1.56644 0.386936 -0.510638 + vertex 1.56009 0.386275 -0.510638 + endloop + endfacet + facet normal -0.103454 0.994634 0 + outer loop + vertex 1.56644 0.386936 0.489362 + vertex 1.56009 0.386275 -0.510638 + vertex 1.56009 0.386275 0.489362 + endloop + endfacet + facet normal -0.1477 0.989032 0 + outer loop + vertex 1.56009 0.386275 0.489362 + vertex 1.56009 0.386275 -0.510638 + vertex 1.55393 0.385354 -0.510638 + endloop + endfacet + facet normal -0.1477 0.989032 0 + outer loop + vertex 1.56009 0.386275 0.489362 + vertex 1.55393 0.385354 -0.510638 + vertex 1.55393 0.385354 0.489362 + endloop + endfacet + facet normal -0.193367 0.981126 0 + outer loop + vertex 1.55393 0.385354 0.489362 + vertex 1.55393 0.385354 -0.510638 + vertex 1.54794 0.384175 -0.510638 + endloop + endfacet + facet normal -0.193367 0.981126 0 + outer loop + vertex 1.55393 0.385354 0.489362 + vertex 1.54794 0.384175 -0.510638 + vertex 1.54794 0.384175 0.489362 + endloop + endfacet + facet normal -0.240255 0.97071 0 + outer loop + vertex 1.54794 0.384175 0.489362 + vertex 1.54794 0.384175 -0.510638 + vertex 1.54214 0.382738 -0.510638 + endloop + endfacet + facet normal -0.240255 0.97071 0 + outer loop + vertex 1.54794 0.384175 0.489362 + vertex 1.54214 0.382738 -0.510638 + vertex 1.54214 0.382738 0.489362 + endloop + endfacet + facet normal -0.288103 0.957599 0 + outer loop + vertex 1.54214 0.382738 0.489362 + vertex 1.54214 0.382738 -0.510638 + vertex 1.53652 0.381047 -0.510638 + endloop + endfacet + facet normal -0.288103 0.957599 0 + outer loop + vertex 1.54214 0.382738 0.489362 + vertex 1.53652 0.381047 -0.510638 + vertex 1.53652 0.381047 0.489362 + endloop + endfacet + facet normal -0.3366 0.941648 0 + outer loop + vertex 1.53652 0.381047 0.489362 + vertex 1.53652 0.381047 -0.510638 + vertex 1.53108 0.379104 -0.510638 + endloop + endfacet + facet normal -0.3366 0.941648 0 + outer loop + vertex 1.53652 0.381047 0.489362 + vertex 1.53108 0.379104 -0.510638 + vertex 1.53108 0.379104 0.489362 + endloop + endfacet + facet normal -0.385396 0.922751 0 + outer loop + vertex 1.53108 0.379104 0.489362 + vertex 1.53108 0.379104 -0.510638 + vertex 1.52583 0.376909 -0.510638 + endloop + endfacet + facet normal -0.385396 0.922751 0 + outer loop + vertex 1.53108 0.379104 0.489362 + vertex 1.52583 0.376909 -0.510638 + vertex 1.52583 0.376909 0.489362 + endloop + endfacet + facet normal -0.434088 0.90087 0 + outer loop + vertex 1.52583 0.376909 0.489362 + vertex 1.52583 0.376909 -0.510638 + vertex 1.52076 0.374466 -0.510638 + endloop + endfacet + facet normal -0.434088 0.90087 0 + outer loop + vertex 1.52583 0.376909 0.489362 + vertex 1.52076 0.374466 -0.510638 + vertex 1.52076 0.374466 0.489362 + endloop + endfacet + facet normal -0.482286 0.876014 0 + outer loop + vertex 1.52076 0.374466 0.489362 + vertex 1.52076 0.374466 -0.510638 + vertex 1.51587 0.371777 -0.510638 + endloop + endfacet + facet normal -0.482286 0.876014 0 + outer loop + vertex 1.52076 0.374466 0.489362 + vertex 1.51587 0.371777 -0.510638 + vertex 1.51587 0.371777 0.489362 + endloop + endfacet + facet normal -0.529544 0.848282 0 + outer loop + vertex 1.51587 0.371777 0.489362 + vertex 1.51587 0.371777 -0.510638 + vertex 1.51117 0.368842 -0.510638 + endloop + endfacet + facet normal -0.529544 0.848282 0 + outer loop + vertex 1.51587 0.371777 0.489362 + vertex 1.51117 0.368842 -0.510638 + vertex 1.51117 0.368842 0.489362 + endloop + endfacet + facet normal -0.57544 0.817844 0 + outer loop + vertex 1.51117 0.368842 0.489362 + vertex 1.51117 0.368842 -0.510638 + vertex 1.50665 0.365665 -0.510638 + endloop + endfacet + facet normal -0.57544 0.817844 0 + outer loop + vertex 1.51117 0.368842 0.489362 + vertex 1.50665 0.365665 -0.510638 + vertex 1.50665 0.365665 0.489362 + endloop + endfacet + facet normal -0.61961 0.78491 0 + outer loop + vertex 1.50665 0.365665 0.489362 + vertex 1.50665 0.365665 -0.510638 + vertex 1.50233 0.362248 -0.510638 + endloop + endfacet + facet normal -0.61961 0.78491 0 + outer loop + vertex 1.50665 0.365665 0.489362 + vertex 1.50233 0.362248 -0.510638 + vertex 1.50233 0.362248 0.489362 + endloop + endfacet + facet normal -0.661676 0.74979 0 + outer loop + vertex 1.50233 0.362248 0.489362 + vertex 1.50233 0.362248 -0.510638 + vertex 1.49818 0.358591 -0.510638 + endloop + endfacet + facet normal -0.661676 0.74979 0 + outer loop + vertex 1.50233 0.362248 0.489362 + vertex 1.49818 0.358591 -0.510638 + vertex 1.49818 0.358591 0.489362 + endloop + endfacet + facet normal -0.701357 0.71281 0 + outer loop + vertex 1.49818 0.358591 0.489362 + vertex 1.49818 0.358591 -0.510638 + vertex 1.49423 0.354698 -0.510638 + endloop + endfacet + facet normal -0.701357 0.71281 0 + outer loop + vertex 1.49818 0.358591 0.489362 + vertex 1.49423 0.354698 -0.510638 + vertex 1.49423 0.354698 0.489362 + endloop + endfacet + facet normal -0.738417 0.674344 0 + outer loop + vertex 1.49423 0.354698 0.489362 + vertex 1.49423 0.354698 -0.510638 + vertex 1.49046 0.350571 -0.510638 + endloop + endfacet + facet normal -0.738417 0.674344 0 + outer loop + vertex 1.49423 0.354698 0.489362 + vertex 1.49046 0.350571 -0.510638 + vertex 1.49046 0.350571 0.489362 + endloop + endfacet + facet normal -0.772712 0.634757 0 + outer loop + vertex 1.49046 0.350571 0.489362 + vertex 1.49046 0.350571 -0.510638 + vertex 1.48687 0.34621 -0.510638 + endloop + endfacet + facet normal -0.772712 0.634757 0 + outer loop + vertex 1.49046 0.350571 0.489362 + vertex 1.48687 0.34621 -0.510638 + vertex 1.48687 0.34621 0.489362 + endloop + endfacet + facet normal -0.80413 0.594453 0 + outer loop + vertex 1.48687 0.34621 0.489362 + vertex 1.48687 0.34621 -0.510638 + vertex 1.48348 0.341619 -0.510638 + endloop + endfacet + facet normal -0.80413 0.594453 0 + outer loop + vertex 1.48687 0.34621 0.489362 + vertex 1.48348 0.341619 -0.510638 + vertex 1.48348 0.341619 0.489362 + endloop + endfacet + facet normal -0.832653 0.553794 0 + outer loop + vertex 1.48348 0.341619 0.489362 + vertex 1.48348 0.341619 -0.510638 + vertex 1.48027 0.3368 -0.510638 + endloop + endfacet + facet normal -0.832653 0.553794 0 + outer loop + vertex 1.48348 0.341619 0.489362 + vertex 1.48027 0.3368 -0.510638 + vertex 1.48027 0.3368 0.489362 + endloop + endfacet + facet normal -0.858333 0.513093 0 + outer loop + vertex 1.48027 0.3368 0.489362 + vertex 1.48027 0.3368 -0.510638 + vertex 1.47726 0.331753 -0.510638 + endloop + endfacet + facet normal -0.858333 0.513093 0 + outer loop + vertex 1.48027 0.3368 0.489362 + vertex 1.47726 0.331753 -0.510638 + vertex 1.47726 0.331753 0.489362 + endloop + endfacet + facet normal -0.881233 0.472682 0 + outer loop + vertex 1.47726 0.331753 0.489362 + vertex 1.47726 0.331753 -0.510638 + vertex 1.47443 0.326482 -0.510638 + endloop + endfacet + facet normal -0.881233 0.472682 0 + outer loop + vertex 1.47726 0.331753 0.489362 + vertex 1.47443 0.326482 -0.510638 + vertex 1.47443 0.326482 0.489362 + endloop + endfacet + facet normal -0.901488 0.432804 0 + outer loop + vertex 1.47443 0.326482 0.489362 + vertex 1.47443 0.326482 -0.510638 + vertex 1.47179 0.320989 -0.510638 + endloop + endfacet + facet normal -0.901488 0.432804 0 + outer loop + vertex 1.47443 0.326482 0.489362 + vertex 1.47179 0.320989 -0.510638 + vertex 1.47179 0.320989 0.489362 + endloop + endfacet + facet normal -0.919247 0.393681 0 + outer loop + vertex 1.47179 0.320989 0.489362 + vertex 1.47179 0.320989 -0.510638 + vertex 1.46935 0.315274 -0.510638 + endloop + endfacet + facet normal -0.919247 0.393681 0 + outer loop + vertex 1.47179 0.320989 0.489362 + vertex 1.46935 0.315274 -0.510638 + vertex 1.46935 0.315274 0.489362 + endloop + endfacet + facet normal -0.934674 0.355506 0 + outer loop + vertex 1.46935 0.315274 0.489362 + vertex 1.46935 0.315274 -0.510638 + vertex 1.46709 0.309341 -0.510638 + endloop + endfacet + facet normal -0.934674 0.355506 0 + outer loop + vertex 1.46935 0.315274 0.489362 + vertex 1.46709 0.309341 -0.510638 + vertex 1.46709 0.309341 0.489362 + endloop + endfacet + facet normal -0.947957 0.318398 0 + outer loop + vertex 1.46709 0.309341 0.489362 + vertex 1.46709 0.309341 -0.510638 + vertex 1.46502 0.303192 -0.510638 + endloop + endfacet + facet normal -0.947957 0.318398 0 + outer loop + vertex 1.46709 0.309341 0.489362 + vertex 1.46502 0.303192 -0.510638 + vertex 1.46502 0.303192 0.489362 + endloop + endfacet + facet normal -0.95928 0.282458 0 + outer loop + vertex 1.46502 0.303192 0.489362 + vertex 1.46502 0.303192 -0.510638 + vertex 1.46315 0.296827 -0.510638 + endloop + endfacet + facet normal -0.95928 0.282458 0 + outer loop + vertex 1.46502 0.303192 0.489362 + vertex 1.46315 0.296827 -0.510638 + vertex 1.46315 0.296827 0.489362 + endloop + endfacet + facet normal -0.968823 0.247755 0 + outer loop + vertex 1.46315 0.296827 0.489362 + vertex 1.46315 0.296827 -0.510638 + vertex 1.46147 0.29025 -0.510638 + endloop + endfacet + facet normal -0.968823 0.247755 0 + outer loop + vertex 1.46315 0.296827 0.489362 + vertex 1.46147 0.29025 -0.510638 + vertex 1.46147 0.29025 0.489362 + endloop + endfacet + facet normal -0.976758 0.214345 0 + outer loop + vertex 1.46147 0.29025 0.489362 + vertex 1.46147 0.29025 -0.510638 + vertex 1.45998 0.283463 -0.510638 + endloop + endfacet + facet normal -0.976758 0.214345 0 + outer loop + vertex 1.46147 0.29025 0.489362 + vertex 1.45998 0.283463 -0.510638 + vertex 1.45998 0.283463 0.489362 + endloop + endfacet + facet normal -0.983256 0.182228 0 + outer loop + vertex 1.45998 0.283463 0.489362 + vertex 1.45998 0.283463 -0.510638 + vertex 1.45868 0.276466 -0.510638 + endloop + endfacet + facet normal -0.983256 0.182228 0 + outer loop + vertex 1.45998 0.283463 0.489362 + vertex 1.45868 0.276466 -0.510638 + vertex 1.45868 0.276466 0.489362 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 1.45868 0.276466 0.489362 + vertex 1.45868 0.276466 -0.510638 + vertex 1.68468 0.276466 -0.510638 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 1.45868 0.276466 0.489362 + vertex 1.68468 0.276466 -0.510638 + vertex 1.68468 0.276466 0.489362 + endloop + endfacet + facet normal 0.998052 0.0623935 0 + outer loop + vertex 1.68468 0.276466 0.489362 + vertex 1.68468 0.276466 -0.510638 + vertex 1.68426 0.283182 -0.510638 + endloop + endfacet + facet normal 0.998052 0.0623935 0 + outer loop + vertex 1.68468 0.276466 0.489362 + vertex 1.68426 0.283182 -0.510638 + vertex 1.68426 0.283182 0.489362 + endloop + endfacet + facet normal 0.775385 -0.631488 0 + outer loop + vertex 1.95768 0.396466 0.489362 + vertex 1.95768 0.396466 -0.510638 + vertex 1.96114 0.400706 -0.510638 + endloop + endfacet + facet normal 0.775385 -0.631488 0 + outer loop + vertex 1.95768 0.396466 0.489362 + vertex 1.96114 0.400706 -0.510638 + vertex 1.96114 0.400706 0.489362 + endloop + endfacet + facet normal 0.756888 -0.653545 0 + outer loop + vertex 1.96114 0.400706 0.489362 + vertex 1.96114 0.400706 -0.510638 + vertex 1.96469 0.404824 -0.510638 + endloop + endfacet + facet normal 0.756888 -0.653545 0 + outer loop + vertex 1.96114 0.400706 0.489362 + vertex 1.96469 0.404824 -0.510638 + vertex 1.96469 0.404824 0.489362 + endloop + endfacet + facet normal 0.737771 -0.675051 0 + outer loop + vertex 1.96469 0.404824 0.489362 + vertex 1.96469 0.404824 -0.510638 + vertex 1.96835 0.408819 -0.510638 + endloop + endfacet + facet normal 0.737771 -0.675051 0 + outer loop + vertex 1.96469 0.404824 0.489362 + vertex 1.96835 0.408819 -0.510638 + vertex 1.96835 0.408819 0.489362 + endloop + endfacet + facet normal 0.718059 -0.695982 0 + outer loop + vertex 1.96835 0.408819 0.489362 + vertex 1.96835 0.408819 -0.510638 + vertex 1.9721 0.41269 -0.510638 + endloop + endfacet + facet normal 0.718059 -0.695982 0 + outer loop + vertex 1.96835 0.408819 0.489362 + vertex 1.9721 0.41269 -0.510638 + vertex 1.9721 0.41269 0.489362 + endloop + endfacet + facet normal 0.697754 -0.716337 0 + outer loop + vertex 1.9721 0.41269 0.489362 + vertex 1.9721 0.41269 -0.510638 + vertex 1.97594 0.416434 -0.510638 + endloop + endfacet + facet normal 0.697754 -0.716337 0 + outer loop + vertex 1.9721 0.41269 0.489362 + vertex 1.97594 0.416434 -0.510638 + vertex 1.97594 0.416434 0.489362 + endloop + endfacet + facet normal 0.676887 -0.736087 0 + outer loop + vertex 1.97594 0.416434 0.489362 + vertex 1.97594 0.416434 -0.510638 + vertex 1.97987 0.42005 -0.510638 + endloop + endfacet + facet normal 0.676887 -0.736087 0 + outer loop + vertex 1.97594 0.416434 0.489362 + vertex 1.97987 0.42005 -0.510638 + vertex 1.97987 0.42005 0.489362 + endloop + endfacet + facet normal 0.655441 -0.755247 0 + outer loop + vertex 1.97987 0.42005 0.489362 + vertex 1.97987 0.42005 -0.510638 + vertex 1.98389 0.423537 -0.510638 + endloop + endfacet + facet normal 0.655441 -0.755247 0 + outer loop + vertex 1.97987 0.42005 0.489362 + vertex 1.98389 0.423537 -0.510638 + vertex 1.98389 0.423537 0.489362 + endloop + endfacet + facet normal 0.633438 -0.773794 0 + outer loop + vertex 1.98389 0.423537 0.489362 + vertex 1.98389 0.423537 -0.510638 + vertex 1.98799 0.426894 -0.510638 + endloop + endfacet + facet normal 0.633438 -0.773794 0 + outer loop + vertex 1.98389 0.423537 0.489362 + vertex 1.98799 0.426894 -0.510638 + vertex 1.98799 0.426894 0.489362 + endloop + endfacet + facet normal 0.610884 -0.79172 0 + outer loop + vertex 1.98799 0.426894 0.489362 + vertex 1.98799 0.426894 -0.510638 + vertex 1.99217 0.430117 -0.510638 + endloop + endfacet + facet normal 0.610884 -0.79172 0 + outer loop + vertex 1.98799 0.426894 0.489362 + vertex 1.99217 0.430117 -0.510638 + vertex 1.99217 0.430117 0.489362 + endloop + endfacet + facet normal 0.587776 -0.809024 0 + outer loop + vertex 1.99217 0.430117 0.489362 + vertex 1.99217 0.430117 -0.510638 + vertex 1.99642 0.433207 -0.510638 + endloop + endfacet + facet normal 0.587776 -0.809024 0 + outer loop + vertex 1.99217 0.430117 0.489362 + vertex 1.99642 0.433207 -0.510638 + vertex 1.99642 0.433207 0.489362 + endloop + endfacet + facet normal 0.564133 -0.825684 0 + outer loop + vertex 1.99642 0.433207 0.489362 + vertex 1.99642 0.433207 -0.510638 + vertex 2.00075 0.436161 -0.510638 + endloop + endfacet + facet normal 0.564133 -0.825684 0 + outer loop + vertex 1.99642 0.433207 0.489362 + vertex 2.00075 0.436161 -0.510638 + vertex 2.00075 0.436161 0.489362 + endloop + endfacet + facet normal 0.539944 -0.841701 0 + outer loop + vertex 2.00075 0.436161 0.489362 + vertex 2.00075 0.436161 -0.510638 + vertex 2.00514 0.438978 -0.510638 + endloop + endfacet + facet normal 0.539944 -0.841701 0 + outer loop + vertex 2.00075 0.436161 0.489362 + vertex 2.00514 0.438978 -0.510638 + vertex 2.00514 0.438978 0.489362 + endloop + endfacet + facet normal 0.515231 -0.857052 0 + outer loop + vertex 2.00514 0.438978 0.489362 + vertex 2.00514 0.438978 -0.510638 + vertex 2.00959 0.441657 -0.510638 + endloop + endfacet + facet normal 0.515231 -0.857052 0 + outer loop + vertex 2.00514 0.438978 0.489362 + vertex 2.00959 0.441657 -0.510638 + vertex 2.00959 0.441657 0.489362 + endloop + endfacet + facet normal 0.489966 -0.871741 0 + outer loop + vertex 2.00959 0.441657 0.489362 + vertex 2.00959 0.441657 -0.510638 + vertex 2.01411 0.444195 -0.510638 + endloop + endfacet + facet normal 0.489966 -0.871741 0 + outer loop + vertex 2.00959 0.441657 0.489362 + vertex 2.01411 0.444195 -0.510638 + vertex 2.01411 0.444195 0.489362 + endloop + endfacet + facet normal 0.464192 -0.885735 0 + outer loop + vertex 2.01411 0.444195 0.489362 + vertex 2.01411 0.444195 -0.510638 + vertex 2.01868 0.446591 -0.510638 + endloop + endfacet + facet normal 0.464192 -0.885735 0 + outer loop + vertex 2.01411 0.444195 0.489362 + vertex 2.01868 0.446591 -0.510638 + vertex 2.01868 0.446591 0.489362 + endloop + endfacet + facet normal 0.437871 -0.899038 0 + outer loop + vertex 2.01868 0.446591 0.489362 + vertex 2.01868 0.446591 -0.510638 + vertex 2.02331 0.448844 -0.510638 + endloop + endfacet + facet normal 0.437871 -0.899038 0 + outer loop + vertex 2.01868 0.446591 0.489362 + vertex 2.02331 0.448844 -0.510638 + vertex 2.02331 0.448844 0.489362 + endloop + endfacet + facet normal 0.411021 -0.911626 0 + outer loop + vertex 2.02331 0.448844 0.489362 + vertex 2.02331 0.448844 -0.510638 + vertex 2.02798 0.450953 -0.510638 + endloop + endfacet + facet normal 0.411021 -0.911626 0 + outer loop + vertex 2.02331 0.448844 0.489362 + vertex 2.02798 0.450953 -0.510638 + vertex 2.02798 0.450953 0.489362 + endloop + endfacet + facet normal 0.383647 -0.92348 0 + outer loop + vertex 2.02798 0.450953 0.489362 + vertex 2.02798 0.450953 -0.510638 + vertex 2.03271 0.452914 -0.510638 + endloop + endfacet + facet normal 0.383647 -0.92348 0 + outer loop + vertex 2.02798 0.450953 0.489362 + vertex 2.03271 0.452914 -0.510638 + vertex 2.03271 0.452914 0.489362 + endloop + endfacet + facet normal 0.355752 -0.93458 0 + outer loop + vertex 2.03271 0.452914 0.489362 + vertex 2.03271 0.452914 -0.510638 + vertex 2.03747 0.454728 -0.510638 + endloop + endfacet + facet normal 0.355752 -0.93458 0 + outer loop + vertex 2.03271 0.452914 0.489362 + vertex 2.03747 0.454728 -0.510638 + vertex 2.03747 0.454728 0.489362 + endloop + endfacet + facet normal 0.32734 -0.944907 0 + outer loop + vertex 2.03747 0.454728 0.489362 + vertex 2.03747 0.454728 -0.510638 + vertex 2.04227 0.456392 -0.510638 + endloop + endfacet + facet normal 0.32734 -0.944907 0 + outer loop + vertex 2.03747 0.454728 0.489362 + vertex 2.04227 0.456392 -0.510638 + vertex 2.04227 0.456392 0.489362 + endloop + endfacet + facet normal 0.298409 -0.954438 0 + outer loop + vertex 2.04227 0.456392 0.489362 + vertex 2.04227 0.456392 -0.510638 + vertex 2.04711 0.457905 -0.510638 + endloop + endfacet + facet normal 0.298409 -0.954438 0 + outer loop + vertex 2.04227 0.456392 0.489362 + vertex 2.04711 0.457905 -0.510638 + vertex 2.04711 0.457905 0.489362 + endloop + endfacet + facet normal 0.268976 -0.963147 0 + outer loop + vertex 2.04711 0.457905 0.489362 + vertex 2.04711 0.457905 -0.510638 + vertex 2.05199 0.459266 -0.510638 + endloop + endfacet + facet normal 0.268976 -0.963147 0 + outer loop + vertex 2.04711 0.457905 0.489362 + vertex 2.05199 0.459266 -0.510638 + vertex 2.05199 0.459266 0.489362 + endloop + endfacet + facet normal 0.239038 -0.97101 0 + outer loop + vertex 2.05199 0.459266 0.489362 + vertex 2.05199 0.459266 -0.510638 + vertex 2.05689 0.460472 -0.510638 + endloop + endfacet + facet normal 0.239038 -0.97101 0 + outer loop + vertex 2.05199 0.459266 0.489362 + vertex 2.05689 0.460472 -0.510638 + vertex 2.05689 0.460472 0.489362 + endloop + endfacet + facet normal 0.208599 -0.978001 0 + outer loop + vertex 2.05689 0.460472 0.489362 + vertex 2.05689 0.460472 -0.510638 + vertex 2.06181 0.461522 -0.510638 + endloop + endfacet + facet normal 0.208599 -0.978001 0 + outer loop + vertex 2.05689 0.460472 0.489362 + vertex 2.06181 0.461522 -0.510638 + vertex 2.06181 0.461522 0.489362 + endloop + endfacet + facet normal 0.177694 -0.984086 0 + outer loop + vertex 2.06181 0.461522 0.489362 + vertex 2.06181 0.461522 -0.510638 + vertex 2.06676 0.462415 -0.510638 + endloop + endfacet + facet normal 0.177694 -0.984086 0 + outer loop + vertex 2.06181 0.461522 0.489362 + vertex 2.06676 0.462415 -0.510638 + vertex 2.06676 0.462415 0.489362 + endloop + endfacet + facet normal 0.146313 -0.989238 0 + outer loop + vertex 2.06676 0.462415 0.489362 + vertex 2.06676 0.462415 -0.510638 + vertex 2.07172 0.46315 -0.510638 + endloop + endfacet + facet normal 0.146313 -0.989238 0 + outer loop + vertex 2.06676 0.462415 0.489362 + vertex 2.07172 0.46315 -0.510638 + vertex 2.07172 0.46315 0.489362 + endloop + endfacet + facet normal 0.114496 -0.993424 0 + outer loop + vertex 2.07172 0.46315 0.489362 + vertex 2.07172 0.46315 -0.510638 + vertex 2.0767 0.463723 -0.510638 + endloop + endfacet + facet normal 0.114496 -0.993424 0 + outer loop + vertex 2.07172 0.46315 0.489362 + vertex 2.0767 0.463723 -0.510638 + vertex 2.0767 0.463723 0.489362 + endloop + endfacet + facet normal 0.0822571 -0.996611 0 + outer loop + vertex 2.0767 0.463723 0.489362 + vertex 2.0767 0.463723 -0.510638 + vertex 2.08169 0.464135 -0.510638 + endloop + endfacet + facet normal 0.0822571 -0.996611 0 + outer loop + vertex 2.0767 0.463723 0.489362 + vertex 2.08169 0.464135 -0.510638 + vertex 2.08169 0.464135 0.489362 + endloop + endfacet + facet normal 0.0496191 -0.998768 0 + outer loop + vertex 2.08169 0.464135 0.489362 + vertex 2.08169 0.464135 -0.510638 + vertex 2.08668 0.464383 -0.510638 + endloop + endfacet + facet normal 0.0496191 -0.998768 0 + outer loop + vertex 2.08169 0.464135 0.489362 + vertex 2.08668 0.464383 -0.510638 + vertex 2.08668 0.464383 0.489362 + endloop + endfacet + facet normal 0.0166175 -0.999862 0 + outer loop + vertex 2.08668 0.464383 0.489362 + vertex 2.08668 0.464383 -0.510638 + vertex 2.09168 0.464466 -0.510638 + endloop + endfacet + facet normal 0.0166175 -0.999862 0 + outer loop + vertex 2.08668 0.464383 0.489362 + vertex 2.09168 0.464466 -0.510638 + vertex 2.09168 0.464466 0.489362 + endloop + endfacet + facet normal -0.0229369 -0.999737 -0 + outer loop + vertex 2.09168 0.464466 0.489362 + vertex 2.09168 0.464466 -0.510638 + vertex 2.10012 0.464273 -0.510638 + endloop + endfacet + facet normal -0.0229369 -0.999737 0 + outer loop + vertex 2.09168 0.464466 0.489362 + vertex 2.10012 0.464273 -0.510638 + vertex 2.10012 0.464273 0.489362 + endloop + endfacet + facet normal -0.0697847 -0.997562 -0 + outer loop + vertex 2.10012 0.464273 0.489362 + vertex 2.10012 0.464273 -0.510638 + vertex 2.10844 0.463691 -0.510638 + endloop + endfacet + facet normal -0.0697847 -0.997562 0 + outer loop + vertex 2.10012 0.464273 0.489362 + vertex 2.10844 0.463691 -0.510638 + vertex 2.10844 0.463691 0.489362 + endloop + endfacet + facet normal -0.117934 -0.993021 -0 + outer loop + vertex 2.10844 0.463691 0.489362 + vertex 2.10844 0.463691 -0.510638 + vertex 2.11662 0.462719 -0.510638 + endloop + endfacet + facet normal -0.117934 -0.993021 0 + outer loop + vertex 2.10844 0.463691 0.489362 + vertex 2.11662 0.462719 -0.510638 + vertex 2.11662 0.462719 0.489362 + endloop + endfacet + facet normal -0.167264 -0.985912 -0 + outer loop + vertex 2.11662 0.462719 0.489362 + vertex 2.11662 0.462719 -0.510638 + vertex 2.12465 0.461356 -0.510638 + endloop + endfacet + facet normal -0.167264 -0.985912 0 + outer loop + vertex 2.11662 0.462719 0.489362 + vertex 2.12465 0.461356 -0.510638 + vertex 2.12465 0.461356 0.489362 + endloop + endfacet + facet normal -0.217623 -0.976033 -0 + outer loop + vertex 2.12465 0.461356 0.489362 + vertex 2.12465 0.461356 -0.510638 + vertex 2.13253 0.459601 -0.510638 + endloop + endfacet + facet normal -0.217623 -0.976033 0 + outer loop + vertex 2.12465 0.461356 0.489362 + vertex 2.13253 0.459601 -0.510638 + vertex 2.13253 0.459601 0.489362 + endloop + endfacet + facet normal -0.268812 -0.963193 -0 + outer loop + vertex 2.13253 0.459601 0.489362 + vertex 2.13253 0.459601 -0.510638 + vertex 2.14023 0.45745 -0.510638 + endloop + endfacet + facet normal -0.268812 -0.963193 0 + outer loop + vertex 2.13253 0.459601 0.489362 + vertex 2.14023 0.45745 -0.510638 + vertex 2.14023 0.45745 0.489362 + endloop + endfacet + facet normal -0.320576 -0.947223 -0 + outer loop + vertex 2.14023 0.45745 0.489362 + vertex 2.14023 0.45745 -0.510638 + vertex 2.14776 0.454904 -0.510638 + endloop + endfacet + facet normal -0.320576 -0.947223 0 + outer loop + vertex 2.14023 0.45745 0.489362 + vertex 2.14776 0.454904 -0.510638 + vertex 2.14776 0.454904 0.489362 + endloop + endfacet + facet normal -0.37264 -0.927976 -0 + outer loop + vertex 2.14776 0.454904 0.489362 + vertex 2.14776 0.454904 -0.510638 + vertex 2.15509 0.45196 -0.510638 + endloop + endfacet + facet normal -0.37264 -0.927976 0 + outer loop + vertex 2.14776 0.454904 0.489362 + vertex 2.15509 0.45196 -0.510638 + vertex 2.15509 0.45196 0.489362 + endloop + endfacet + facet normal -0.424667 -0.90535 -0 + outer loop + vertex 2.15509 0.45196 0.489362 + vertex 2.15509 0.45196 -0.510638 + vertex 2.16221 0.448617 -0.510638 + endloop + endfacet + facet normal -0.424667 -0.90535 0 + outer loop + vertex 2.15509 0.45196 0.489362 + vertex 2.16221 0.448617 -0.510638 + vertex 2.16221 0.448617 0.489362 + endloop + endfacet + facet normal -0.476268 -0.8793 -0 + outer loop + vertex 2.16221 0.448617 0.489362 + vertex 2.16221 0.448617 -0.510638 + vertex 2.16913 0.444874 -0.510638 + endloop + endfacet + facet normal -0.476268 -0.8793 0 + outer loop + vertex 2.16221 0.448617 0.489362 + vertex 2.16913 0.444874 -0.510638 + vertex 2.16913 0.444874 0.489362 + endloop + endfacet + facet normal -0.527053 -0.849832 -0 + outer loop + vertex 2.16913 0.444874 0.489362 + vertex 2.16913 0.444874 -0.510638 + vertex 2.17581 0.440728 -0.510638 + endloop + endfacet + facet normal -0.527053 -0.849832 0 + outer loop + vertex 2.16913 0.444874 0.489362 + vertex 2.17581 0.440728 -0.510638 + vertex 2.17581 0.440728 0.489362 + endloop + endfacet + facet normal -0.576589 -0.817035 -0 + outer loop + vertex 2.17581 0.440728 0.489362 + vertex 2.17581 0.440728 -0.510638 + vertex 2.18226 0.436178 -0.510638 + endloop + endfacet + facet normal -0.576589 -0.817035 0 + outer loop + vertex 2.17581 0.440728 0.489362 + vertex 2.18226 0.436178 -0.510638 + vertex 2.18226 0.436178 0.489362 + endloop + endfacet + facet normal -0.624462 -0.781055 -0 + outer loop + vertex 2.18226 0.436178 0.489362 + vertex 2.18226 0.436178 -0.510638 + vertex 2.18846 0.431223 -0.510638 + endloop + endfacet + facet normal -0.624462 -0.781055 0 + outer loop + vertex 2.18226 0.436178 0.489362 + vertex 2.18846 0.431223 -0.510638 + vertex 2.18846 0.431223 0.489362 + endloop + endfacet + facet normal -0.670252 -0.742134 -0 + outer loop + vertex 2.18846 0.431223 0.489362 + vertex 2.18846 0.431223 -0.510638 + vertex 2.19439 0.425862 -0.510638 + endloop + endfacet + facet normal -0.670252 -0.742134 0 + outer loop + vertex 2.18846 0.431223 0.489362 + vertex 2.19439 0.425862 -0.510638 + vertex 2.19439 0.425862 0.489362 + endloop + endfacet + facet normal -0.713597 -0.700557 -0 + outer loop + vertex 2.19439 0.425862 0.489362 + vertex 2.19439 0.425862 -0.510638 + vertex 2.20006 0.420091 -0.510638 + endloop + endfacet + facet normal -0.713597 -0.700557 0 + outer loop + vertex 2.19439 0.425862 0.489362 + vertex 2.20006 0.420091 -0.510638 + vertex 2.20006 0.420091 0.489362 + endloop + endfacet + facet normal -0.75417 -0.65668 -0 + outer loop + vertex 2.20006 0.420091 0.489362 + vertex 2.20006 0.420091 -0.510638 + vertex 2.20544 0.413911 -0.510638 + endloop + endfacet + facet normal -0.75417 -0.65668 0 + outer loop + vertex 2.20006 0.420091 0.489362 + vertex 2.20544 0.413911 -0.510638 + vertex 2.20544 0.413911 0.489362 + endloop + endfacet + facet normal -0.791679 -0.610937 -0 + outer loop + vertex 2.20544 0.413911 0.489362 + vertex 2.20544 0.413911 -0.510638 + vertex 2.21053 0.407319 -0.510638 + endloop + endfacet + facet normal -0.791679 -0.610937 0 + outer loop + vertex 2.20544 0.413911 0.489362 + vertex 2.21053 0.407319 -0.510638 + vertex 2.21053 0.407319 0.489362 + endloop + endfacet + facet normal -0.82597 -0.563714 -0 + outer loop + vertex 2.21053 0.407319 0.489362 + vertex 2.21053 0.407319 -0.510638 + vertex 2.21531 0.400314 -0.510638 + endloop + endfacet + facet normal -0.82597 -0.563714 0 + outer loop + vertex 2.21053 0.407319 0.489362 + vertex 2.21531 0.400314 -0.510638 + vertex 2.21531 0.400314 0.489362 + endloop + endfacet + facet normal -0.856897 -0.515487 -0 + outer loop + vertex 2.21531 0.400314 0.489362 + vertex 2.21531 0.400314 -0.510638 + vertex 2.21977 0.392895 -0.510638 + endloop + endfacet + facet normal -0.856897 -0.515487 0 + outer loop + vertex 2.21531 0.400314 0.489362 + vertex 2.21977 0.392895 -0.510638 + vertex 2.21977 0.392895 0.489362 + endloop + endfacet + facet normal -0.884416 -0.466699 -0 + outer loop + vertex 2.21977 0.392895 0.489362 + vertex 2.21977 0.392895 -0.510638 + vertex 2.2239 0.385059 -0.510638 + endloop + endfacet + facet normal -0.884416 -0.466699 0 + outer loop + vertex 2.21977 0.392895 0.489362 + vertex 2.2239 0.385059 -0.510638 + vertex 2.2239 0.385059 0.489362 + endloop + endfacet + facet normal -0.908574 -0.417725 -0 + outer loop + vertex 2.2239 0.385059 0.489362 + vertex 2.2239 0.385059 -0.510638 + vertex 2.2277 0.376805 -0.510638 + endloop + endfacet + facet normal -0.908574 -0.417725 0 + outer loop + vertex 2.2239 0.385059 0.489362 + vertex 2.2277 0.376805 -0.510638 + vertex 2.2277 0.376805 0.489362 + endloop + endfacet + facet normal -0.929423 -0.369016 -0 + outer loop + vertex 2.2277 0.376805 0.489362 + vertex 2.2277 0.376805 -0.510638 + vertex 2.23114 0.368132 -0.510638 + endloop + endfacet + facet normal -0.929423 -0.369016 0 + outer loop + vertex 2.2277 0.376805 0.489362 + vertex 2.23114 0.368132 -0.510638 + vertex 2.23114 0.368132 0.489362 + endloop + endfacet + facet normal -0.947123 -0.320871 -0 + outer loop + vertex 2.23114 0.368132 0.489362 + vertex 2.23114 0.368132 -0.510638 + vertex 2.23422 0.359039 -0.510638 + endloop + endfacet + facet normal -0.947123 -0.320871 0 + outer loop + vertex 2.23114 0.368132 0.489362 + vertex 2.23422 0.359039 -0.510638 + vertex 2.23422 0.359039 0.489362 + endloop + endfacet + facet normal -0.961848 -0.273584 -0 + outer loop + vertex 2.23422 0.359039 0.489362 + vertex 2.23422 0.359039 -0.510638 + vertex 2.23693 0.349522 -0.510638 + endloop + endfacet + facet normal -0.961848 -0.273584 0 + outer loop + vertex 2.23422 0.359039 0.489362 + vertex 2.23693 0.349522 -0.510638 + vertex 2.23693 0.349522 0.489362 + endloop + endfacet + facet normal -0.973796 -0.227423 -0 + outer loop + vertex 2.23693 0.349522 0.489362 + vertex 2.23693 0.349522 -0.510638 + vertex 2.23925 0.339582 -0.510638 + endloop + endfacet + facet normal -0.973796 -0.227423 0 + outer loop + vertex 2.23693 0.349522 0.489362 + vertex 2.23925 0.339582 -0.510638 + vertex 2.23925 0.339582 0.489362 + endloop + endfacet + facet normal -0.983194 -0.182562 -0 + outer loop + vertex 2.23925 0.339582 0.489362 + vertex 2.23925 0.339582 -0.510638 + vertex 2.24118 0.329216 -0.510638 + endloop + endfacet + facet normal -0.983194 -0.182562 0 + outer loop + vertex 2.23925 0.339582 0.489362 + vertex 2.24118 0.329216 -0.510638 + vertex 2.24118 0.329216 0.489362 + endloop + endfacet + facet normal -0.990268 -0.139171 -0 + outer loop + vertex 2.24118 0.329216 0.489362 + vertex 2.24118 0.329216 -0.510638 + vertex 2.24269 0.318423 -0.510638 + endloop + endfacet + facet normal -0.990268 -0.139171 0 + outer loop + vertex 2.24118 0.329216 0.489362 + vertex 2.24269 0.318423 -0.510638 + vertex 2.24269 0.318423 0.489362 + endloop + endfacet + facet normal -0.995252 -0.0973329 -0 + outer loop + vertex 2.24269 0.318423 0.489362 + vertex 2.24269 0.318423 -0.510638 + vertex 2.24379 0.307202 -0.510638 + endloop + endfacet + facet normal -0.995252 -0.0973329 0 + outer loop + vertex 2.24269 0.318423 0.489362 + vertex 2.24379 0.307202 -0.510638 + vertex 2.24379 0.307202 0.489362 + endloop + endfacet + facet normal -0.998366 -0.0571385 -0 + outer loop + vertex 2.24379 0.307202 0.489362 + vertex 2.24379 0.307202 -0.510638 + vertex 2.24446 0.29555 -0.510638 + endloop + endfacet + facet normal -0.998366 -0.0571385 0 + outer loop + vertex 2.24379 0.307202 0.489362 + vertex 2.24446 0.29555 -0.510638 + vertex 2.24446 0.29555 0.489362 + endloop + endfacet + facet normal -0.999827 -0.0186029 -0 + outer loop + vertex 2.24446 0.29555 0.489362 + vertex 2.24446 0.29555 -0.510638 + vertex 2.24468 0.283466 -0.510638 + endloop + endfacet + facet normal -0.999827 -0.0186029 0 + outer loop + vertex 2.24446 0.29555 0.489362 + vertex 2.24468 0.283466 -0.510638 + vertex 2.24468 0.283466 0.489362 + endloop + endfacet + facet normal -1 0 -0 + outer loop + vertex 2.24468 0.283466 0.489362 + vertex 2.24468 0.283466 -0.510638 + vertex 2.24468 0.00646639 -0.510638 + endloop + endfacet + facet normal -1 -0 0 + outer loop + vertex 2.24468 0.283466 0.489362 + vertex 2.24468 0.00646639 -0.510638 + vertex 2.24468 0.00646639 0.489362 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex 2.24468 0.00646639 0.489362 + vertex 2.24468 0.00646639 -0.510638 + vertex 2.15568 0.00646639 -0.510638 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex 2.24468 0.00646639 0.489362 + vertex 2.15568 0.00646639 -0.510638 + vertex 2.15568 0.00646639 0.489362 + endloop + endfacet + facet normal 1 0 0 + outer loop + vertex 2.15568 0.00646639 0.489362 + vertex 2.15568 0.00646639 -0.510638 + vertex 2.15568 0.284466 -0.510638 + endloop + endfacet + facet normal 1 -0 0 + outer loop + vertex 2.15568 0.00646639 0.489362 + vertex 2.15568 0.284466 -0.510638 + vertex 2.15568 0.284466 0.489362 + endloop + endfacet + facet normal 0.999851 0.0172871 0 + outer loop + vertex 2.15568 0.284466 0.489362 + vertex 2.15568 0.284466 -0.510638 + vertex 2.15557 0.290989 -0.510638 + endloop + endfacet + facet normal 0.999851 0.0172871 0 + outer loop + vertex 2.15568 0.284466 0.489362 + vertex 2.15557 0.290989 -0.510638 + vertex 2.15557 0.290989 0.489362 + endloop + endfacet + facet normal 0.998606 0.0527807 0 + outer loop + vertex 2.15557 0.290989 0.489362 + vertex 2.15557 0.290989 -0.510638 + vertex 2.15523 0.297354 -0.510638 + endloop + endfacet + facet normal 0.998606 0.0527807 0 + outer loop + vertex 2.15557 0.290989 0.489362 + vertex 2.15523 0.297354 -0.510638 + vertex 2.15523 0.297354 0.489362 + endloop + endfacet + facet normal 0.995996 0.0893944 0 + outer loop + vertex 2.15523 0.297354 0.489362 + vertex 2.15523 0.297354 -0.510638 + vertex 2.15468 0.303556 -0.510638 + endloop + endfacet + facet normal 0.995996 0.0893944 0 + outer loop + vertex 2.15523 0.297354 0.489362 + vertex 2.15468 0.303556 -0.510638 + vertex 2.15468 0.303556 0.489362 + endloop + endfacet + facet normal 0.991875 0.127214 0 + outer loop + vertex 2.15468 0.303556 0.489362 + vertex 2.15468 0.303556 -0.510638 + vertex 2.1539 0.309592 -0.510638 + endloop + endfacet + facet normal 0.991875 0.127214 0 + outer loop + vertex 2.15468 0.303556 0.489362 + vertex 2.1539 0.309592 -0.510638 + vertex 2.1539 0.309592 0.489362 + endloop + endfacet + facet normal 0.986092 0.1662 0 + outer loop + vertex 2.1539 0.309592 0.489362 + vertex 2.1539 0.309592 -0.510638 + vertex 2.15291 0.315457 -0.510638 + endloop + endfacet + facet normal 0.986092 0.1662 0 + outer loop + vertex 2.1539 0.309592 0.489362 + vertex 2.15291 0.315457 -0.510638 + vertex 2.15291 0.315457 0.489362 + endloop + endfacet + facet normal 0.978489 0.206298 0 + outer loop + vertex 2.15291 0.315457 0.489362 + vertex 2.15291 0.315457 -0.510638 + vertex 2.15171 0.321146 -0.510638 + endloop + endfacet + facet normal 0.978489 0.206298 0 + outer loop + vertex 2.15291 0.315457 0.489362 + vertex 2.15171 0.321146 -0.510638 + vertex 2.15171 0.321146 0.489362 + endloop + endfacet + facet normal 0.968885 0.24751 0 + outer loop + vertex 2.15171 0.321146 0.489362 + vertex 2.15171 0.321146 -0.510638 + vertex 2.15031 0.326656 -0.510638 + endloop + endfacet + facet normal 0.968885 0.24751 0 + outer loop + vertex 2.15171 0.321146 0.489362 + vertex 2.15031 0.326656 -0.510638 + vertex 2.15031 0.326656 0.489362 + endloop + endfacet + facet normal 0.957082 0.289817 0 + outer loop + vertex 2.15031 0.326656 0.489362 + vertex 2.15031 0.326656 -0.510638 + vertex 2.14869 0.33198 -0.510638 + endloop + endfacet + facet normal 0.957082 0.289817 0 + outer loop + vertex 2.15031 0.326656 0.489362 + vertex 2.14869 0.33198 -0.510638 + vertex 2.14869 0.33198 0.489362 + endloop + endfacet + facet normal 0.942907 0.333057 0 + outer loop + vertex 2.14869 0.33198 0.489362 + vertex 2.14869 0.33198 -0.510638 + vertex 2.14688 0.337116 -0.510638 + endloop + endfacet + facet normal 0.942907 0.333057 0 + outer loop + vertex 2.14869 0.33198 0.489362 + vertex 2.14688 0.337116 -0.510638 + vertex 2.14688 0.337116 0.489362 + endloop + endfacet + facet normal 0.926153 0.377149 0 + outer loop + vertex 2.14688 0.337116 0.489362 + vertex 2.14688 0.337116 -0.510638 + vertex 2.14487 0.342059 -0.510638 + endloop + endfacet + facet normal 0.926153 0.377149 0 + outer loop + vertex 2.14688 0.337116 0.489362 + vertex 2.14487 0.342059 -0.510638 + vertex 2.14487 0.342059 0.489362 + endloop + endfacet + facet normal 0.906606 0.421978 0 + outer loop + vertex 2.14487 0.342059 0.489362 + vertex 2.14487 0.342059 -0.510638 + vertex 2.14266 0.346804 -0.510638 + endloop + endfacet + facet normal 0.906606 0.421978 0 + outer loop + vertex 2.14487 0.342059 0.489362 + vertex 2.14266 0.346804 -0.510638 + vertex 2.14266 0.346804 0.489362 + endloop + endfacet + facet normal 0.884112 0.467276 0 + outer loop + vertex 2.14266 0.346804 0.489362 + vertex 2.14266 0.346804 -0.510638 + vertex 2.14026 0.351346 -0.510638 + endloop + endfacet + facet normal 0.884112 0.467276 0 + outer loop + vertex 2.14266 0.346804 0.489362 + vertex 2.14026 0.351346 -0.510638 + vertex 2.14026 0.351346 0.489362 + endloop + endfacet + facet normal 0.858486 0.512837 0 + outer loop + vertex 2.14026 0.351346 0.489362 + vertex 2.14026 0.351346 -0.510638 + vertex 2.13767 0.355682 -0.510638 + endloop + endfacet + facet normal 0.858486 0.512837 0 + outer loop + vertex 2.14026 0.351346 0.489362 + vertex 2.13767 0.355682 -0.510638 + vertex 2.13767 0.355682 0.489362 + endloop + endfacet + facet normal 0.829582 0.558385 0 + outer loop + vertex 2.13767 0.355682 0.489362 + vertex 2.13767 0.355682 -0.510638 + vertex 2.13489 0.359807 -0.510638 + endloop + endfacet + facet normal 0.829582 0.558385 0 + outer loop + vertex 2.13767 0.355682 0.489362 + vertex 2.13489 0.359807 -0.510638 + vertex 2.13489 0.359807 0.489362 + endloop + endfacet + facet normal 0.797295 0.603589 0 + outer loop + vertex 2.13489 0.359807 0.489362 + vertex 2.13489 0.359807 -0.510638 + vertex 2.13193 0.363716 -0.510638 + endloop + endfacet + facet normal 0.797295 0.603589 0 + outer loop + vertex 2.13489 0.359807 0.489362 + vertex 2.13193 0.363716 -0.510638 + vertex 2.13193 0.363716 0.489362 + endloop + endfacet + facet normal 0.76157 0.648083 0 + outer loop + vertex 2.13193 0.363716 0.489362 + vertex 2.13193 0.363716 -0.510638 + vertex 2.12879 0.367406 -0.510638 + endloop + endfacet + facet normal 0.76157 0.648083 0 + outer loop + vertex 2.13193 0.363716 0.489362 + vertex 2.12879 0.367406 -0.510638 + vertex 2.12879 0.367406 0.489362 + endloop + endfacet + facet normal 0.72241 0.691465 0 + outer loop + vertex 2.12879 0.367406 0.489362 + vertex 2.12879 0.367406 -0.510638 + vertex 2.12548 0.37087 -0.510638 + endloop + endfacet + facet normal 0.72241 0.691465 0 + outer loop + vertex 2.12879 0.367406 0.489362 + vertex 2.12548 0.37087 -0.510638 + vertex 2.12548 0.37087 0.489362 + endloop + endfacet + facet normal 0.67989 0.733314 0 + outer loop + vertex 2.12548 0.37087 0.489362 + vertex 2.12548 0.37087 -0.510638 + vertex 2.12199 0.374106 -0.510638 + endloop + endfacet + facet normal 0.67989 0.733314 0 + outer loop + vertex 2.12548 0.37087 0.489362 + vertex 2.12199 0.374106 -0.510638 + vertex 2.12199 0.374106 0.489362 + endloop + endfacet + facet normal 0.634159 0.773202 0 + outer loop + vertex 2.12199 0.374106 0.489362 + vertex 2.12199 0.374106 -0.510638 + vertex 2.11832 0.377109 -0.510638 + endloop + endfacet + facet normal 0.634159 0.773202 0 + outer loop + vertex 2.12199 0.374106 0.489362 + vertex 2.11832 0.377109 -0.510638 + vertex 2.11832 0.377109 0.489362 + endloop + endfacet + facet normal 0.585483 0.810685 0 + outer loop + vertex 2.11832 0.377109 0.489362 + vertex 2.11832 0.377109 -0.510638 + vertex 2.1145 0.379874 -0.510638 + endloop + endfacet + facet normal 0.585483 0.810685 0 + outer loop + vertex 2.11832 0.377109 0.489362 + vertex 2.1145 0.379874 -0.510638 + vertex 2.1145 0.379874 0.489362 + endloop + endfacet + facet normal 0.534117 0.84541 0 + outer loop + vertex 2.1145 0.379874 0.489362 + vertex 2.1145 0.379874 -0.510638 + vertex 2.1105 0.382396 -0.510638 + endloop + endfacet + facet normal 0.534117 0.84541 0 + outer loop + vertex 2.1145 0.379874 0.489362 + vertex 2.1105 0.382396 -0.510638 + vertex 2.1105 0.382396 0.489362 + endloop + endfacet + facet normal 0.480476 0.877008 0 + outer loop + vertex 2.1105 0.382396 0.489362 + vertex 2.1105 0.382396 -0.510638 + vertex 2.10635 0.384672 -0.510638 + endloop + endfacet + facet normal 0.480476 0.877008 0 + outer loop + vertex 2.1105 0.382396 0.489362 + vertex 2.10635 0.384672 -0.510638 + vertex 2.10635 0.384672 0.489362 + endloop + endfacet + facet normal 0.425027 0.90518 0 + outer loop + vertex 2.10635 0.384672 0.489362 + vertex 2.10635 0.384672 -0.510638 + vertex 2.10204 0.386697 -0.510638 + endloop + endfacet + facet normal 0.425027 0.90518 0 + outer loop + vertex 2.10635 0.384672 0.489362 + vertex 2.10204 0.386697 -0.510638 + vertex 2.10204 0.386697 0.489362 + endloop + endfacet + facet normal 0.368209 0.929743 0 + outer loop + vertex 2.10204 0.386697 0.489362 + vertex 2.10204 0.386697 -0.510638 + vertex 2.09757 0.388466 -0.510638 + endloop + endfacet + facet normal 0.368209 0.929743 0 + outer loop + vertex 2.10204 0.386697 0.489362 + vertex 2.09757 0.388466 -0.510638 + vertex 2.09757 0.388466 0.489362 + endloop + endfacet + facet normal 0.310567 0.950552 0 + outer loop + vertex 2.09757 0.388466 0.489362 + vertex 2.09757 0.388466 -0.510638 + vertex 2.09295 0.389976 -0.510638 + endloop + endfacet + facet normal 0.310567 0.950552 0 + outer loop + vertex 2.09757 0.388466 0.489362 + vertex 2.09295 0.389976 -0.510638 + vertex 2.09295 0.389976 0.489362 + endloop + endfacet + facet normal 0.252591 0.967573 0 + outer loop + vertex 2.09295 0.389976 0.489362 + vertex 2.09295 0.389976 -0.510638 + vertex 2.08818 0.39122 -0.510638 + endloop + endfacet + facet normal 0.252591 0.967573 0 + outer loop + vertex 2.09295 0.389976 0.489362 + vertex 2.08818 0.39122 -0.510638 + vertex 2.08818 0.39122 0.489362 + endloop + endfacet + facet normal 0.194797 0.980844 0 + outer loop + vertex 2.08818 0.39122 0.489362 + vertex 2.08818 0.39122 -0.510638 + vertex 2.08327 0.392196 -0.510638 + endloop + endfacet + facet normal 0.194797 0.980844 0 + outer loop + vertex 2.08818 0.39122 0.489362 + vertex 2.08327 0.392196 -0.510638 + vertex 2.08327 0.392196 0.489362 + endloop + endfacet + facet normal 0.137616 0.990486 0 + outer loop + vertex 2.08327 0.392196 0.489362 + vertex 2.08327 0.392196 -0.510638 + vertex 2.07821 0.392899 -0.510638 + endloop + endfacet + facet normal 0.137616 0.990486 0 + outer loop + vertex 2.08327 0.392196 0.489362 + vertex 2.07821 0.392899 -0.510638 + vertex 2.07821 0.392899 0.489362 + endloop + endfacet + facet normal 0.0814786 0.996675 0 + outer loop + vertex 2.07821 0.392899 0.489362 + vertex 2.07821 0.392899 -0.510638 + vertex 2.07301 0.393324 -0.510638 + endloop + endfacet + facet normal 0.0814786 0.996675 0 + outer loop + vertex 2.07821 0.392899 0.489362 + vertex 2.07301 0.393324 -0.510638 + vertex 2.07301 0.393324 0.489362 + endloop + endfacet + facet normal 0.0267318 0.999643 0 + outer loop + vertex 2.07301 0.393324 0.489362 + vertex 2.07301 0.393324 -0.510638 + vertex 2.06768 0.393466 -0.510638 + endloop + endfacet + facet normal 0.0267318 0.999643 0 + outer loop + vertex 2.07301 0.393324 0.489362 + vertex 2.06768 0.393466 -0.510638 + vertex 2.06768 0.393466 0.489362 + endloop + endfacet + facet normal -0.0156 0.999878 0 + outer loop + vertex 2.06768 0.393466 0.489362 + vertex 2.06768 0.393466 -0.510638 + vertex 2.06381 0.393406 -0.510638 + endloop + endfacet + facet normal -0.0156 0.999878 0 + outer loop + vertex 2.06768 0.393466 0.489362 + vertex 2.06381 0.393406 -0.510638 + vertex 2.06381 0.393406 0.489362 + endloop + endfacet + facet normal -0.0477545 0.998859 0 + outer loop + vertex 2.06381 0.393406 0.489362 + vertex 2.06381 0.393406 -0.510638 + vertex 2.05998 0.393223 -0.510638 + endloop + endfacet + facet normal -0.0477545 0.998859 0 + outer loop + vertex 2.06381 0.393406 0.489362 + vertex 2.05998 0.393223 -0.510638 + vertex 2.05998 0.393223 0.489362 + endloop + endfacet + facet normal -0.0811412 0.996703 0 + outer loop + vertex 2.05998 0.393223 0.489362 + vertex 2.05998 0.393223 -0.510638 + vertex 2.0562 0.392915 -0.510638 + endloop + endfacet + facet normal -0.0811412 0.996703 0 + outer loop + vertex 2.05998 0.393223 0.489362 + vertex 2.0562 0.392915 -0.510638 + vertex 2.0562 0.392915 0.489362 + endloop + endfacet + facet normal -0.115573 0.993299 0 + outer loop + vertex 2.0562 0.392915 0.489362 + vertex 2.0562 0.392915 -0.510638 + vertex 2.05246 0.39248 -0.510638 + endloop + endfacet + facet normal -0.115573 0.993299 0 + outer loop + vertex 2.0562 0.392915 0.489362 + vertex 2.05246 0.39248 -0.510638 + vertex 2.05246 0.39248 0.489362 + endloop + endfacet + facet normal -0.150797 0.988565 0 + outer loop + vertex 2.05246 0.39248 0.489362 + vertex 2.05246 0.39248 -0.510638 + vertex 2.04876 0.391915 -0.510638 + endloop + endfacet + facet normal -0.150797 0.988565 0 + outer loop + vertex 2.05246 0.39248 0.489362 + vertex 2.04876 0.391915 -0.510638 + vertex 2.04876 0.391915 0.489362 + endloop + endfacet + facet normal -0.186569 0.982442 0 + outer loop + vertex 2.04876 0.391915 0.489362 + vertex 2.04876 0.391915 -0.510638 + vertex 2.04509 0.391218 -0.510638 + endloop + endfacet + facet normal -0.186569 0.982442 0 + outer loop + vertex 2.04876 0.391915 0.489362 + vertex 2.04509 0.391218 -0.510638 + vertex 2.04509 0.391218 0.489362 + endloop + endfacet + facet normal -0.222599 0.97491 0 + outer loop + vertex 2.04509 0.391218 0.489362 + vertex 2.04509 0.391218 -0.510638 + vertex 2.04145 0.390387 -0.510638 + endloop + endfacet + facet normal -0.222599 0.97491 0 + outer loop + vertex 2.04509 0.391218 0.489362 + vertex 2.04145 0.390387 -0.510638 + vertex 2.04145 0.390387 0.489362 + endloop + endfacet + facet normal -0.258607 0.965983 0 + outer loop + vertex 2.04145 0.390387 0.489362 + vertex 2.04145 0.390387 -0.510638 + vertex 2.03783 0.389418 -0.510638 + endloop + endfacet + facet normal -0.258607 0.965983 0 + outer loop + vertex 2.04145 0.390387 0.489362 + vertex 2.03783 0.389418 -0.510638 + vertex 2.03783 0.389418 0.489362 + endloop + endfacet + facet normal -0.294304 0.955712 0 + outer loop + vertex 2.03783 0.389418 0.489362 + vertex 2.03783 0.389418 -0.510638 + vertex 2.03423 0.388309 -0.510638 + endloop + endfacet + facet normal -0.294304 0.955712 0 + outer loop + vertex 2.03783 0.389418 0.489362 + vertex 2.03423 0.388309 -0.510638 + vertex 2.03423 0.388309 0.489362 + endloop + endfacet + facet normal -0.329423 0.944183 0 + outer loop + vertex 2.03423 0.388309 0.489362 + vertex 2.03423 0.388309 -0.510638 + vertex 2.03065 0.387059 -0.510638 + endloop + endfacet + facet normal -0.329423 0.944183 0 + outer loop + vertex 2.03423 0.388309 0.489362 + vertex 2.03065 0.387059 -0.510638 + vertex 2.03065 0.387059 0.489362 + endloop + endfacet + facet normal -0.36366 0.931532 0 + outer loop + vertex 2.03065 0.387059 0.489362 + vertex 2.03065 0.387059 -0.510638 + vertex 2.02707 0.385664 -0.510638 + endloop + endfacet + facet normal -0.36366 0.931532 0 + outer loop + vertex 2.03065 0.387059 0.489362 + vertex 2.02707 0.385664 -0.510638 + vertex 2.02707 0.385664 0.489362 + endloop + endfacet + facet normal -0.396839 0.917888 0 + outer loop + vertex 2.02707 0.385664 0.489362 + vertex 2.02707 0.385664 -0.510638 + vertex 2.02351 0.384122 -0.510638 + endloop + endfacet + facet normal -0.396839 0.917888 0 + outer loop + vertex 2.02707 0.385664 0.489362 + vertex 2.02351 0.384122 -0.510638 + vertex 2.02351 0.384122 0.489362 + endloop + endfacet + facet normal -0.428737 0.903429 0 + outer loop + vertex 2.02351 0.384122 0.489362 + vertex 2.02351 0.384122 -0.510638 + vertex 2.01994 0.382431 -0.510638 + endloop + endfacet + facet normal -0.428737 0.903429 0 + outer loop + vertex 2.02351 0.384122 0.489362 + vertex 2.01994 0.382431 -0.510638 + vertex 2.01994 0.382431 0.489362 + endloop + endfacet + facet normal -0.459222 0.888322 0 + outer loop + vertex 2.01994 0.382431 0.489362 + vertex 2.01994 0.382431 -0.510638 + vertex 2.01638 0.380588 -0.510638 + endloop + endfacet + facet normal -0.459222 0.888322 0 + outer loop + vertex 2.01994 0.382431 0.489362 + vertex 2.01638 0.380588 -0.510638 + vertex 2.01638 0.380588 0.489362 + endloop + endfacet + facet normal -0.488127 0.872773 0 + outer loop + vertex 2.01638 0.380588 0.489362 + vertex 2.01638 0.380588 -0.510638 + vertex 2.01281 0.378591 -0.510638 + endloop + endfacet + facet normal -0.488127 0.872773 0 + outer loop + vertex 2.01638 0.380588 0.489362 + vertex 2.01281 0.378591 -0.510638 + vertex 2.01281 0.378591 0.489362 + endloop + endfacet + facet normal -0.515423 0.856936 0 + outer loop + vertex 2.01281 0.378591 0.489362 + vertex 2.01281 0.378591 -0.510638 + vertex 2.00923 0.376438 -0.510638 + endloop + endfacet + facet normal -0.515423 0.856936 0 + outer loop + vertex 2.01281 0.378591 0.489362 + vertex 2.00923 0.376438 -0.510638 + vertex 2.00923 0.376438 0.489362 + endloop + endfacet + facet normal -0.541063 0.840982 0 + outer loop + vertex 2.00923 0.376438 0.489362 + vertex 2.00923 0.376438 -0.510638 + vertex 2.00563 0.374125 -0.510638 + endloop + endfacet + facet normal -0.541063 0.840982 0 + outer loop + vertex 2.00923 0.376438 0.489362 + vertex 2.00563 0.374125 -0.510638 + vertex 2.00563 0.374125 0.489362 + endloop + endfacet + facet normal -0.564998 0.825092 0 + outer loop + vertex 2.00563 0.374125 0.489362 + vertex 2.00563 0.374125 -0.510638 + vertex 2.00202 0.37165 -0.510638 + endloop + endfacet + facet normal -0.564998 0.825092 0 + outer loop + vertex 2.00563 0.374125 0.489362 + vertex 2.00202 0.37165 -0.510638 + vertex 2.00202 0.37165 0.489362 + endloop + endfacet + facet normal -0.587303 0.809367 0 + outer loop + vertex 2.00202 0.37165 0.489362 + vertex 2.00202 0.37165 -0.510638 + vertex 1.99838 0.369012 -0.510638 + endloop + endfacet + facet normal -0.587303 0.809367 0 + outer loop + vertex 2.00202 0.37165 0.489362 + vertex 1.99838 0.369012 -0.510638 + vertex 1.99838 0.369012 0.489362 + endloop + endfacet + facet normal -0.607966 0.793963 0 + outer loop + vertex 1.99838 0.369012 0.489362 + vertex 1.99838 0.369012 -0.510638 + vertex 1.99472 0.366207 -0.510638 + endloop + endfacet + facet normal -0.607966 0.793963 0 + outer loop + vertex 1.99838 0.369012 0.489362 + vertex 1.99472 0.366207 -0.510638 + vertex 1.99472 0.366207 0.489362 + endloop + endfacet + facet normal -0.627069 0.778963 0 + outer loop + vertex 1.99472 0.366207 0.489362 + vertex 1.99472 0.366207 -0.510638 + vertex 1.99103 0.363233 -0.510638 + endloop + endfacet + facet normal -0.627069 0.778963 0 + outer loop + vertex 1.99472 0.366207 0.489362 + vertex 1.99103 0.363233 -0.510638 + vertex 1.99103 0.363233 0.489362 + endloop + endfacet + facet normal -0.644684 0.76445 0 + outer loop + vertex 1.99103 0.363233 0.489362 + vertex 1.99103 0.363233 -0.510638 + vertex 1.9873 0.360088 -0.510638 + endloop + endfacet + facet normal -0.644684 0.76445 0 + outer loop + vertex 1.99103 0.363233 0.489362 + vertex 1.9873 0.360088 -0.510638 + vertex 1.9873 0.360088 0.489362 + endloop + endfacet + facet normal -0.660874 0.750497 0 + outer loop + vertex 1.9873 0.360088 0.489362 + vertex 1.9873 0.360088 -0.510638 + vertex 1.98353 0.356769 -0.510638 + endloop + endfacet + facet normal -0.660874 0.750497 0 + outer loop + vertex 1.9873 0.360088 0.489362 + vertex 1.98353 0.356769 -0.510638 + vertex 1.98353 0.356769 0.489362 + endloop + endfacet + facet normal -0.675737 0.737143 0 + outer loop + vertex 1.98353 0.356769 0.489362 + vertex 1.98353 0.356769 -0.510638 + vertex 1.97971 0.353274 -0.510638 + endloop + endfacet + facet normal -0.675737 0.737143 0 + outer loop + vertex 1.98353 0.356769 0.489362 + vertex 1.97971 0.353274 -0.510638 + vertex 1.97971 0.353274 0.489362 + endloop + endfacet + facet normal -0.689347 0.724432 0 + outer loop + vertex 1.97971 0.353274 0.489362 + vertex 1.97971 0.353274 -0.510638 + vertex 1.97585 0.349601 -0.510638 + endloop + endfacet + facet normal -0.689347 0.724432 0 + outer loop + vertex 1.97971 0.353274 0.489362 + vertex 1.97585 0.349601 -0.510638 + vertex 1.97585 0.349601 0.489362 + endloop + endfacet + facet normal -0.7018 0.712374 0 + outer loop + vertex 1.97585 0.349601 0.489362 + vertex 1.97585 0.349601 -0.510638 + vertex 1.97194 0.345746 -0.510638 + endloop + endfacet + facet normal -0.7018 0.712374 0 + outer loop + vertex 1.97585 0.349601 0.489362 + vertex 1.97194 0.345746 -0.510638 + vertex 1.97194 0.345746 0.489362 + endloop + endfacet + facet normal -0.71317 0.700991 0 + outer loop + vertex 1.97194 0.345746 0.489362 + vertex 1.97194 0.345746 -0.510638 + vertex 1.96797 0.341707 -0.510638 + endloop + endfacet + facet normal -0.71317 0.700991 0 + outer loop + vertex 1.97194 0.345746 0.489362 + vertex 1.96797 0.341707 -0.510638 + vertex 1.96797 0.341707 0.489362 + endloop + endfacet + facet normal -0.723562 0.69026 0 + outer loop + vertex 1.96797 0.341707 0.489362 + vertex 1.96797 0.341707 -0.510638 + vertex 1.96394 0.337483 -0.510638 + endloop + endfacet + facet normal -0.723562 0.69026 0 + outer loop + vertex 1.96797 0.341707 0.489362 + vertex 1.96394 0.337483 -0.510638 + vertex 1.96394 0.337483 0.489362 + endloop + endfacet + facet normal -0.733017 0.68021 0 + outer loop + vertex 1.96394 0.337483 0.489362 + vertex 1.96394 0.337483 -0.510638 + vertex 1.95985 0.33307 -0.510638 + endloop + endfacet + facet normal -0.733017 0.68021 0 + outer loop + vertex 1.96394 0.337483 0.489362 + vertex 1.95985 0.33307 -0.510638 + vertex 1.95985 0.33307 0.489362 + endloop + endfacet + facet normal -0.741631 0.670808 0 + outer loop + vertex 1.95985 0.33307 0.489362 + vertex 1.95985 0.33307 -0.510638 + vertex 1.95568 0.328466 -0.510638 + endloop + endfacet + facet normal -0.741631 0.670808 0 + outer loop + vertex 1.95985 0.33307 0.489362 + vertex 1.95568 0.328466 -0.510638 + vertex 1.95568 0.328466 0.489362 + endloop + endfacet + facet normal -1 0 -0 + outer loop + vertex 1.95568 0.328466 0.489362 + vertex 1.95568 0.328466 -0.510638 + vertex 1.95568 0.00646639 -0.510638 + endloop + endfacet + facet normal -1 -0 0 + outer loop + vertex 1.95568 0.328466 0.489362 + vertex 1.95568 0.00646639 -0.510638 + vertex 1.95568 0.00646639 0.489362 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex 1.95568 0.00646639 0.489362 + vertex 1.95568 0.00646639 -0.510638 + vertex 1.86668 0.00646639 -0.510638 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex 1.95568 0.00646639 0.489362 + vertex 1.86668 0.00646639 -0.510638 + vertex 1.86668 0.00646639 0.489362 + endloop + endfacet + facet normal 1 0 0 + outer loop + vertex 1.86668 0.00646639 0.489362 + vertex 1.86668 0.00646639 -0.510638 + vertex 1.86668 0.455466 -0.510638 + endloop + endfacet + facet normal 1 -0 0 + outer loop + vertex 1.86668 0.00646639 0.489362 + vertex 1.86668 0.455466 -0.510638 + vertex 1.86668 0.455466 0.489362 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 1.86668 0.455466 0.489362 + vertex 1.86668 0.455466 -0.510638 + vertex 1.95568 0.455466 -0.510638 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 1.86668 0.455466 0.489362 + vertex 1.95568 0.455466 -0.510638 + vertex 1.95568 0.455466 0.489362 + endloop + endfacet + facet normal -1 0 -0 + outer loop + vertex 1.95568 0.455466 0.489362 + vertex 1.95568 0.455466 -0.510638 + vertex 1.95568 0.396466 -0.510638 + endloop + endfacet + facet normal -1 -0 0 + outer loop + vertex 1.95568 0.455466 0.489362 + vertex 1.95568 0.396466 -0.510638 + vertex 1.95568 0.396466 0.489362 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 1.95568 0.396466 0.489362 + vertex 1.95568 0.396466 -0.510638 + vertex 1.95768 0.396466 -0.510638 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 1.95568 0.396466 0.489362 + vertex 1.95768 0.396466 -0.510638 + vertex 1.95768 0.396466 0.489362 + endloop + endfacet + facet normal 0.487934 0.872881 0 + outer loop + vertex 2.95332 0.541277 0.489362 + vertex 2.95332 0.541277 -0.510638 + vertex 2.94504 0.545908 -0.510638 + endloop + endfacet + facet normal 0.487934 0.872881 0 + outer loop + vertex 2.95332 0.541277 0.489362 + vertex 2.94504 0.545908 -0.510638 + vertex 2.94504 0.545908 0.489362 + endloop + endfacet + facet normal 0.47667 0.879082 0 + outer loop + vertex 2.94504 0.545908 0.489362 + vertex 2.94504 0.545908 -0.510638 + vertex 2.93682 0.550362 -0.510638 + endloop + endfacet + facet normal 0.47667 0.879082 0 + outer loop + vertex 2.94504 0.545908 0.489362 + vertex 2.93682 0.550362 -0.510638 + vertex 2.93682 0.550362 0.489362 + endloop + endfacet + facet normal 0.464851 0.885389 0 + outer loop + vertex 2.93682 0.550362 0.489362 + vertex 2.93682 0.550362 -0.510638 + vertex 2.92868 0.554638 -0.510638 + endloop + endfacet + facet normal 0.464851 0.885389 0 + outer loop + vertex 2.93682 0.550362 0.489362 + vertex 2.92868 0.554638 -0.510638 + vertex 2.92868 0.554638 0.489362 + endloop + endfacet + facet normal 0.452488 0.891771 0 + outer loop + vertex 2.92868 0.554638 0.489362 + vertex 2.92868 0.554638 -0.510638 + vertex 2.92059 0.55874 -0.510638 + endloop + endfacet + facet normal 0.452488 0.891771 0 + outer loop + vertex 2.92868 0.554638 0.489362 + vertex 2.92059 0.55874 -0.510638 + vertex 2.92059 0.55874 0.489362 + endloop + endfacet + facet normal 0.439575 0.898206 0 + outer loop + vertex 2.92059 0.55874 0.489362 + vertex 2.92059 0.55874 -0.510638 + vertex 2.91257 0.562667 -0.510638 + endloop + endfacet + facet normal 0.439575 0.898206 0 + outer loop + vertex 2.92059 0.55874 0.489362 + vertex 2.91257 0.562667 -0.510638 + vertex 2.91257 0.562667 0.489362 + endloop + endfacet + facet normal 0.426099 0.904677 0 + outer loop + vertex 2.91257 0.562667 0.489362 + vertex 2.91257 0.562667 -0.510638 + vertex 2.9046 0.56642 -0.510638 + endloop + endfacet + facet normal 0.426099 0.904677 0 + outer loop + vertex 2.91257 0.562667 0.489362 + vertex 2.9046 0.56642 -0.510638 + vertex 2.9046 0.56642 0.489362 + endloop + endfacet + facet normal 0.412068 0.911153 0 + outer loop + vertex 2.9046 0.56642 0.489362 + vertex 2.9046 0.56642 -0.510638 + vertex 2.89668 0.570001 -0.510638 + endloop + endfacet + facet normal 0.412068 0.911153 0 + outer loop + vertex 2.9046 0.56642 0.489362 + vertex 2.89668 0.570001 -0.510638 + vertex 2.89668 0.570001 0.489362 + endloop + endfacet + facet normal 0.397471 0.917615 0 + outer loop + vertex 2.89668 0.570001 0.489362 + vertex 2.89668 0.570001 -0.510638 + vertex 2.88881 0.573412 -0.510638 + endloop + endfacet + facet normal 0.397471 0.917615 0 + outer loop + vertex 2.89668 0.570001 0.489362 + vertex 2.88881 0.573412 -0.510638 + vertex 2.88881 0.573412 0.489362 + endloop + endfacet + facet normal 0.382343 0.924021 0 + outer loop + vertex 2.88881 0.573412 0.489362 + vertex 2.88881 0.573412 -0.510638 + vertex 2.88098 0.576652 -0.510638 + endloop + endfacet + facet normal 0.382343 0.924021 0 + outer loop + vertex 2.88881 0.573412 0.489362 + vertex 2.88098 0.576652 -0.510638 + vertex 2.88098 0.576652 0.489362 + endloop + endfacet + facet normal 0.366665 0.930353 0 + outer loop + vertex 2.88098 0.576652 0.489362 + vertex 2.88098 0.576652 -0.510638 + vertex 2.87319 0.579723 -0.510638 + endloop + endfacet + facet normal 0.366665 0.930353 0 + outer loop + vertex 2.88098 0.576652 0.489362 + vertex 2.87319 0.579723 -0.510638 + vertex 2.87319 0.579723 0.489362 + endloop + endfacet + facet normal 0.350464 0.936576 0 + outer loop + vertex 2.87319 0.579723 0.489362 + vertex 2.87319 0.579723 -0.510638 + vertex 2.86543 0.582627 -0.510638 + endloop + endfacet + facet normal 0.350464 0.936576 0 + outer loop + vertex 2.87319 0.579723 0.489362 + vertex 2.86543 0.582627 -0.510638 + vertex 2.86543 0.582627 0.489362 + endloop + endfacet + facet normal 0.333756 0.94266 0 + outer loop + vertex 2.86543 0.582627 0.489362 + vertex 2.86543 0.582627 -0.510638 + vertex 2.8577 0.585363 -0.510638 + endloop + endfacet + facet normal 0.333756 0.94266 0 + outer loop + vertex 2.86543 0.582627 0.489362 + vertex 2.8577 0.585363 -0.510638 + vertex 2.8577 0.585363 0.489362 + endloop + endfacet + facet normal 0.316556 0.948574 0 + outer loop + vertex 2.8577 0.585363 0.489362 + vertex 2.8577 0.585363 -0.510638 + vertex 2.84999 0.587935 -0.510638 + endloop + endfacet + facet normal 0.316556 0.948574 0 + outer loop + vertex 2.8577 0.585363 0.489362 + vertex 2.84999 0.587935 -0.510638 + vertex 2.84999 0.587935 0.489362 + endloop + endfacet + facet normal 0.298907 0.954282 0 + outer loop + vertex 2.84999 0.587935 0.489362 + vertex 2.84999 0.587935 -0.510638 + vertex 2.84231 0.590342 -0.510638 + endloop + endfacet + facet normal 0.298907 0.954282 0 + outer loop + vertex 2.84999 0.587935 0.489362 + vertex 2.84231 0.590342 -0.510638 + vertex 2.84231 0.590342 0.489362 + endloop + endfacet + facet normal 0.280833 0.959757 0 + outer loop + vertex 2.84231 0.590342 0.489362 + vertex 2.84231 0.590342 -0.510638 + vertex 2.83464 0.592585 -0.510638 + endloop + endfacet + facet normal 0.280833 0.959757 0 + outer loop + vertex 2.84231 0.590342 0.489362 + vertex 2.83464 0.592585 -0.510638 + vertex 2.83464 0.592585 0.489362 + endloop + endfacet + facet normal 0.262363 0.964969 0 + outer loop + vertex 2.83464 0.592585 0.489362 + vertex 2.83464 0.592585 -0.510638 + vertex 2.82699 0.594666 -0.510638 + endloop + endfacet + facet normal 0.262363 0.964969 0 + outer loop + vertex 2.83464 0.592585 0.489362 + vertex 2.82699 0.594666 -0.510638 + vertex 2.82699 0.594666 0.489362 + endloop + endfacet + facet normal 0.243546 0.969889 0 + outer loop + vertex 2.82699 0.594666 0.489362 + vertex 2.82699 0.594666 -0.510638 + vertex 2.81934 0.596586 -0.510638 + endloop + endfacet + facet normal 0.243546 0.969889 0 + outer loop + vertex 2.82699 0.594666 0.489362 + vertex 2.81934 0.596586 -0.510638 + vertex 2.81934 0.596586 0.489362 + endloop + endfacet + facet normal 0.224433 0.97449 0 + outer loop + vertex 2.81934 0.596586 0.489362 + vertex 2.81934 0.596586 -0.510638 + vertex 2.8117 0.598347 -0.510638 + endloop + endfacet + facet normal 0.224433 0.97449 0 + outer loop + vertex 2.81934 0.596586 0.489362 + vertex 2.8117 0.598347 -0.510638 + vertex 2.8117 0.598347 0.489362 + endloop + endfacet + facet normal 0.205058 0.97875 0 + outer loop + vertex 2.8117 0.598347 0.489362 + vertex 2.8117 0.598347 -0.510638 + vertex 2.80405 0.599948 -0.510638 + endloop + endfacet + facet normal 0.205058 0.97875 0 + outer loop + vertex 2.8117 0.598347 0.489362 + vertex 2.80405 0.599948 -0.510638 + vertex 2.80405 0.599948 0.489362 + endloop + endfacet + facet normal 0.185485 0.982647 0 + outer loop + vertex 2.80405 0.599948 0.489362 + vertex 2.80405 0.599948 -0.510638 + vertex 2.79641 0.601391 -0.510638 + endloop + endfacet + facet normal 0.185485 0.982647 0 + outer loop + vertex 2.80405 0.599948 0.489362 + vertex 2.79641 0.601391 -0.510638 + vertex 2.79641 0.601391 0.489362 + endloop + endfacet + facet normal 0.165758 0.986166 0 + outer loop + vertex 2.79641 0.601391 0.489362 + vertex 2.79641 0.601391 -0.510638 + vertex 2.78875 0.602678 -0.510638 + endloop + endfacet + facet normal 0.165758 0.986166 0 + outer loop + vertex 2.79641 0.601391 0.489362 + vertex 2.78875 0.602678 -0.510638 + vertex 2.78875 0.602678 0.489362 + endloop + endfacet + facet normal 0.145937 0.989294 0 + outer loop + vertex 2.78875 0.602678 0.489362 + vertex 2.78875 0.602678 -0.510638 + vertex 2.78108 0.60381 -0.510638 + endloop + endfacet + facet normal 0.145937 0.989294 0 + outer loop + vertex 2.78875 0.602678 0.489362 + vertex 2.78108 0.60381 -0.510638 + vertex 2.78108 0.60381 0.489362 + endloop + endfacet + facet normal 0.12608 0.99202 0 + outer loop + vertex 2.78108 0.60381 0.489362 + vertex 2.78108 0.60381 -0.510638 + vertex 2.77339 0.604786 -0.510638 + endloop + endfacet + facet normal 0.12608 0.99202 0 + outer loop + vertex 2.78108 0.60381 0.489362 + vertex 2.77339 0.604786 -0.510638 + vertex 2.77339 0.604786 0.489362 + endloop + endfacet + facet normal 0.106241 0.99434 0 + outer loop + vertex 2.77339 0.604786 0.489362 + vertex 2.77339 0.604786 -0.510638 + vertex 2.76569 0.60561 -0.510638 + endloop + endfacet + facet normal 0.106241 0.99434 0 + outer loop + vertex 2.77339 0.604786 0.489362 + vertex 2.76569 0.60561 -0.510638 + vertex 2.76569 0.60561 0.489362 + endloop + endfacet + facet normal 0.0864818 0.996253 0 + outer loop + vertex 2.76569 0.60561 0.489362 + vertex 2.76569 0.60561 -0.510638 + vertex 2.75795 0.606281 -0.510638 + endloop + endfacet + facet normal 0.0864818 0.996253 0 + outer loop + vertex 2.76569 0.60561 0.489362 + vertex 2.75795 0.606281 -0.510638 + vertex 2.75795 0.606281 0.489362 + endloop + endfacet + facet normal 0.0668592 0.997762 0 + outer loop + vertex 2.75795 0.606281 0.489362 + vertex 2.75795 0.606281 -0.510638 + vertex 2.75019 0.606801 -0.510638 + endloop + endfacet + facet normal 0.0668592 0.997762 0 + outer loop + vertex 2.75795 0.606281 0.489362 + vertex 2.75019 0.606801 -0.510638 + vertex 2.75019 0.606801 0.489362 + endloop + endfacet + facet normal 0.0474284 0.998875 0 + outer loop + vertex 2.75019 0.606801 0.489362 + vertex 2.75019 0.606801 -0.510638 + vertex 2.74239 0.607172 -0.510638 + endloop + endfacet + facet normal 0.0474284 0.998875 0 + outer loop + vertex 2.75019 0.606801 0.489362 + vertex 2.74239 0.607172 -0.510638 + vertex 2.74239 0.607172 0.489362 + endloop + endfacet + facet normal 0.0282356 0.999601 0 + outer loop + vertex 2.74239 0.607172 0.489362 + vertex 2.74239 0.607172 -0.510638 + vertex 2.73456 0.607393 -0.510638 + endloop + endfacet + facet normal 0.0282356 0.999601 0 + outer loop + vertex 2.74239 0.607172 0.489362 + vertex 2.73456 0.607393 -0.510638 + vertex 2.73456 0.607393 0.489362 + endloop + endfacet + facet normal 0.00932919 0.999956 0 + outer loop + vertex 2.73456 0.607393 0.489362 + vertex 2.73456 0.607393 -0.510638 + vertex 2.72668 0.607466 -0.510638 + endloop + endfacet + facet normal 0.00932919 0.999956 0 + outer loop + vertex 2.73456 0.607393 0.489362 + vertex 2.72668 0.607466 -0.510638 + vertex 2.72668 0.607466 0.489362 + endloop + endfacet + facet normal -0.0237336 0.999718 0 + outer loop + vertex 2.72668 0.607466 0.489362 + vertex 2.72668 0.607466 -0.510638 + vertex 2.71122 0.607099 -0.510638 + endloop + endfacet + facet normal -0.0237336 0.999718 0 + outer loop + vertex 2.72668 0.607466 0.489362 + vertex 2.71122 0.607099 -0.510638 + vertex 2.71122 0.607099 0.489362 + endloop + endfacet + facet normal -0.0717079 0.997426 0 + outer loop + vertex 2.71122 0.607099 0.489362 + vertex 2.71122 0.607099 -0.510638 + vertex 2.69604 0.606008 -0.510638 + endloop + endfacet + facet normal -0.0717079 0.997426 0 + outer loop + vertex 2.71122 0.607099 0.489362 + vertex 2.69604 0.606008 -0.510638 + vertex 2.69604 0.606008 0.489362 + endloop + endfacet + facet normal -0.12005 0.992768 0 + outer loop + vertex 2.69604 0.606008 0.489362 + vertex 2.69604 0.606008 -0.510638 + vertex 2.68116 0.604209 -0.510638 + endloop + endfacet + facet normal -0.12005 0.992768 0 + outer loop + vertex 2.69604 0.606008 0.489362 + vertex 2.68116 0.604209 -0.510638 + vertex 2.68116 0.604209 0.489362 + endloop + endfacet + facet normal -0.168629 0.98568 0 + outer loop + vertex 2.68116 0.604209 0.489362 + vertex 2.68116 0.604209 -0.510638 + vertex 2.6666 0.601717 -0.510638 + endloop + endfacet + facet normal -0.168629 0.98568 0 + outer loop + vertex 2.68116 0.604209 0.489362 + vertex 2.6666 0.601717 -0.510638 + vertex 2.6666 0.601717 0.489362 + endloop + endfacet + facet normal -0.217289 0.976107 0 + outer loop + vertex 2.6666 0.601717 0.489362 + vertex 2.6666 0.601717 -0.510638 + vertex 2.65237 0.59855 -0.510638 + endloop + endfacet + facet normal -0.217289 0.976107 0 + outer loop + vertex 2.6666 0.601717 0.489362 + vertex 2.65237 0.59855 -0.510638 + vertex 2.65237 0.59855 0.489362 + endloop + endfacet + facet normal -0.265874 0.964008 0 + outer loop + vertex 2.65237 0.59855 0.489362 + vertex 2.65237 0.59855 -0.510638 + vertex 2.63849 0.594723 -0.510638 + endloop + endfacet + facet normal -0.265874 0.964008 0 + outer loop + vertex 2.65237 0.59855 0.489362 + vertex 2.63849 0.594723 -0.510638 + vertex 2.63849 0.594723 0.489362 + endloop + endfacet + facet normal -0.31422 0.94935 0 + outer loop + vertex 2.63849 0.594723 0.489362 + vertex 2.63849 0.594723 -0.510638 + vertex 2.62498 0.590251 -0.510638 + endloop + endfacet + facet normal -0.31422 0.94935 0 + outer loop + vertex 2.63849 0.594723 0.489362 + vertex 2.62498 0.590251 -0.510638 + vertex 2.62498 0.590251 0.489362 + endloop + endfacet + facet normal -0.362168 0.932113 0 + outer loop + vertex 2.62498 0.590251 0.489362 + vertex 2.62498 0.590251 -0.510638 + vertex 2.61186 0.585152 -0.510638 + endloop + endfacet + facet normal -0.362168 0.932113 0 + outer loop + vertex 2.62498 0.590251 0.489362 + vertex 2.61186 0.585152 -0.510638 + vertex 2.61186 0.585152 0.489362 + endloop + endfacet + facet normal -0.409541 0.912292 0 + outer loop + vertex 2.61186 0.585152 0.489362 + vertex 2.61186 0.585152 -0.510638 + vertex 2.59913 0.579441 -0.510638 + endloop + endfacet + facet normal -0.409541 0.912292 0 + outer loop + vertex 2.61186 0.585152 0.489362 + vertex 2.59913 0.579441 -0.510638 + vertex 2.59913 0.579441 0.489362 + endloop + endfacet + facet normal -0.456185 0.889885 0 + outer loop + vertex 2.59913 0.579441 0.489362 + vertex 2.59913 0.579441 -0.510638 + vertex 2.58683 0.573133 -0.510638 + endloop + endfacet + facet normal -0.456185 0.889885 0 + outer loop + vertex 2.59913 0.579441 0.489362 + vertex 2.58683 0.573133 -0.510638 + vertex 2.58683 0.573133 0.489362 + endloop + endfacet + facet normal -0.501922 0.864913 0 + outer loop + vertex 2.58683 0.573133 0.489362 + vertex 2.58683 0.573133 -0.510638 + vertex 2.57496 0.566246 -0.510638 + endloop + endfacet + facet normal -0.501922 0.864913 0 + outer loop + vertex 2.58683 0.573133 0.489362 + vertex 2.57496 0.566246 -0.510638 + vertex 2.57496 0.566246 0.489362 + endloop + endfacet + facet normal -0.546585 0.837404 0 + outer loop + vertex 2.57496 0.566246 0.489362 + vertex 2.57496 0.566246 -0.510638 + vertex 2.56355 0.558794 -0.510638 + endloop + endfacet + facet normal -0.546585 0.837404 0 + outer loop + vertex 2.57496 0.566246 0.489362 + vertex 2.56355 0.558794 -0.510638 + vertex 2.56355 0.558794 0.489362 + endloop + endfacet + facet normal -0.590016 0.807392 0 + outer loop + vertex 2.56355 0.558794 0.489362 + vertex 2.56355 0.558794 -0.510638 + vertex 2.5526 0.550795 -0.510638 + endloop + endfacet + facet normal -0.590016 0.807392 0 + outer loop + vertex 2.56355 0.558794 0.489362 + vertex 2.5526 0.550795 -0.510638 + vertex 2.5526 0.550795 0.489362 + endloop + endfacet + facet normal -0.632032 0.774942 0 + outer loop + vertex 2.5526 0.550795 0.489362 + vertex 2.5526 0.550795 -0.510638 + vertex 2.54214 0.542264 -0.510638 + endloop + endfacet + facet normal -0.632032 0.774942 0 + outer loop + vertex 2.5526 0.550795 0.489362 + vertex 2.54214 0.542264 -0.510638 + vertex 2.54214 0.542264 0.489362 + endloop + endfacet + facet normal -0.672487 0.740109 0 + outer loop + vertex 2.54214 0.542264 0.489362 + vertex 2.54214 0.542264 -0.510638 + vertex 2.53218 0.533216 -0.510638 + endloop + endfacet + facet normal -0.672487 0.740109 0 + outer loop + vertex 2.54214 0.542264 0.489362 + vertex 2.53218 0.533216 -0.510638 + vertex 2.53218 0.533216 0.489362 + endloop + endfacet + facet normal -0.711202 0.702988 0 + outer loop + vertex 2.53218 0.533216 0.489362 + vertex 2.53218 0.533216 -0.510638 + vertex 2.52275 0.523669 -0.510638 + endloop + endfacet + facet normal -0.711202 0.702988 0 + outer loop + vertex 2.53218 0.533216 0.489362 + vertex 2.52275 0.523669 -0.510638 + vertex 2.52275 0.523669 0.489362 + endloop + endfacet + facet normal -0.748014 0.663683 0 + outer loop + vertex 2.52275 0.523669 0.489362 + vertex 2.52275 0.523669 -0.510638 + vertex 2.51384 0.513638 -0.510638 + endloop + endfacet + facet normal -0.748014 0.663683 0 + outer loop + vertex 2.52275 0.523669 0.489362 + vertex 2.51384 0.513638 -0.510638 + vertex 2.51384 0.513638 0.489362 + endloop + endfacet + facet normal -0.78279 0.622286 0 + outer loop + vertex 2.51384 0.513638 0.489362 + vertex 2.51384 0.513638 -0.510638 + vertex 2.5055 0.503138 -0.510638 + endloop + endfacet + facet normal -0.78279 0.622286 0 + outer loop + vertex 2.51384 0.513638 0.489362 + vertex 2.5055 0.503138 -0.510638 + vertex 2.5055 0.503138 0.489362 + endloop + endfacet + facet normal -0.815371 0.578938 0 + outer loop + vertex 2.5055 0.503138 0.489362 + vertex 2.5055 0.503138 -0.510638 + vertex 2.49772 0.492187 -0.510638 + endloop + endfacet + facet normal -0.815371 0.578938 0 + outer loop + vertex 2.5055 0.503138 0.489362 + vertex 2.49772 0.492187 -0.510638 + vertex 2.49772 0.492187 0.489362 + endloop + endfacet + facet normal -0.845613 0.533797 0 + outer loop + vertex 2.49772 0.492187 0.489362 + vertex 2.49772 0.492187 -0.510638 + vertex 2.49053 0.4808 -0.510638 + endloop + endfacet + facet normal -0.845613 0.533797 0 + outer loop + vertex 2.49772 0.492187 0.489362 + vertex 2.49053 0.4808 -0.510638 + vertex 2.49053 0.4808 0.489362 + endloop + endfacet + facet normal -0.873393 0.487016 0 + outer loop + vertex 2.49053 0.4808 0.489362 + vertex 2.49053 0.4808 -0.510638 + vertex 2.48395 0.468992 -0.510638 + endloop + endfacet + facet normal -0.873393 0.487016 0 + outer loop + vertex 2.49053 0.4808 0.489362 + vertex 2.48395 0.468992 -0.510638 + vertex 2.48395 0.468992 0.489362 + endloop + endfacet + facet normal -0.898598 0.438772 0 + outer loop + vertex 2.48395 0.468992 0.489362 + vertex 2.48395 0.468992 -0.510638 + vertex 2.47799 0.456781 -0.510638 + endloop + endfacet + facet normal -0.898598 0.438772 0 + outer loop + vertex 2.48395 0.468992 0.489362 + vertex 2.47799 0.456781 -0.510638 + vertex 2.47799 0.456781 0.489362 + endloop + endfacet + facet normal -0.921128 0.38926 0 + outer loop + vertex 2.47799 0.456781 0.489362 + vertex 2.47799 0.456781 -0.510638 + vertex 2.47266 0.444182 -0.510638 + endloop + endfacet + facet normal -0.921128 0.38926 0 + outer loop + vertex 2.47799 0.456781 0.489362 + vertex 2.47266 0.444182 -0.510638 + vertex 2.47266 0.444182 0.489362 + endloop + endfacet + facet normal -0.940899 0.338688 0 + outer loop + vertex 2.47266 0.444182 0.489362 + vertex 2.47266 0.444182 -0.510638 + vertex 2.46799 0.43121 -0.510638 + endloop + endfacet + facet normal -0.940899 0.338688 0 + outer loop + vertex 2.47266 0.444182 0.489362 + vertex 2.46799 0.43121 -0.510638 + vertex 2.46799 0.43121 0.489362 + endloop + endfacet + facet normal -0.957848 0.287275 0 + outer loop + vertex 2.46799 0.43121 0.489362 + vertex 2.46799 0.43121 -0.510638 + vertex 2.464 0.417883 -0.510638 + endloop + endfacet + facet normal -0.957848 0.287275 0 + outer loop + vertex 2.46799 0.43121 0.489362 + vertex 2.464 0.417883 -0.510638 + vertex 2.464 0.417883 0.489362 + endloop + endfacet + facet normal -0.971931 0.235264 0 + outer loop + vertex 2.464 0.417883 0.489362 + vertex 2.464 0.417883 -0.510638 + vertex 2.46069 0.404216 -0.510638 + endloop + endfacet + facet normal -0.971931 0.235264 0 + outer loop + vertex 2.464 0.417883 0.489362 + vertex 2.46069 0.404216 -0.510638 + vertex 2.46069 0.404216 0.489362 + endloop + endfacet + facet normal -0.983136 0.182877 0 + outer loop + vertex 2.46069 0.404216 0.489362 + vertex 2.46069 0.404216 -0.510638 + vertex 2.45809 0.390224 -0.510638 + endloop + endfacet + facet normal -0.983136 0.182877 0 + outer loop + vertex 2.46069 0.404216 0.489362 + vertex 2.45809 0.390224 -0.510638 + vertex 2.45809 0.390224 0.489362 + endloop + endfacet + facet normal -0.991468 0.130348 0 + outer loop + vertex 2.45809 0.390224 0.489362 + vertex 2.45809 0.390224 -0.510638 + vertex 2.45621 0.375925 -0.510638 + endloop + endfacet + facet normal -0.991468 0.130348 0 + outer loop + vertex 2.45809 0.390224 0.489362 + vertex 2.45621 0.375925 -0.510638 + vertex 2.45621 0.375925 0.489362 + endloop + endfacet + facet normal -0.99696 0.0779154 0 + outer loop + vertex 2.45621 0.375925 0.489362 + vertex 2.45621 0.375925 -0.510638 + vertex 2.45507 0.361334 -0.510638 + endloop + endfacet + facet normal -0.99696 0.0779154 0 + outer loop + vertex 2.45621 0.375925 0.489362 + vertex 2.45507 0.361334 -0.510638 + vertex 2.45507 0.361334 0.489362 + endloop + endfacet + facet normal -0.999667 0.02581 0 + outer loop + vertex 2.45507 0.361334 0.489362 + vertex 2.45507 0.361334 -0.510638 + vertex 2.45468 0.346466 -0.510638 + endloop + endfacet + facet normal -0.999667 0.02581 0 + outer loop + vertex 2.45507 0.361334 0.489362 + vertex 2.45468 0.346466 -0.510638 + vertex 2.45468 0.346466 0.489362 + endloop + endfacet + facet normal -0.999699 -0.0245414 -0 + outer loop + vertex 2.45468 0.346466 0.489362 + vertex 2.45468 0.346466 -0.510638 + vertex 2.45505 0.331325 -0.510638 + endloop + endfacet + facet normal -0.999699 -0.0245414 0 + outer loop + vertex 2.45468 0.346466 0.489362 + vertex 2.45505 0.331325 -0.510638 + vertex 2.45505 0.331325 0.489362 + endloop + endfacet + facet normal -0.997233 -0.0743382 -0 + outer loop + vertex 2.45505 0.331325 0.489362 + vertex 2.45505 0.331325 -0.510638 + vertex 2.45616 0.316511 -0.510638 + endloop + endfacet + facet normal -0.997233 -0.0743382 0 + outer loop + vertex 2.45505 0.331325 0.489362 + vertex 2.45616 0.316511 -0.510638 + vertex 2.45616 0.316511 0.489362 + endloop + endfacet + facet normal -0.992151 -0.125046 -0 + outer loop + vertex 2.45616 0.316511 0.489362 + vertex 2.45616 0.316511 -0.510638 + vertex 2.45798 0.302035 -0.510638 + endloop + endfacet + facet normal -0.992151 -0.125046 0 + outer loop + vertex 2.45616 0.316511 0.489362 + vertex 2.45798 0.302035 -0.510638 + vertex 2.45798 0.302035 0.489362 + endloop + endfacet + facet normal -0.984317 -0.176411 -0 + outer loop + vertex 2.45798 0.302035 0.489362 + vertex 2.45798 0.302035 -0.510638 + vertex 2.46051 0.287913 -0.510638 + endloop + endfacet + facet normal -0.984317 -0.176411 0 + outer loop + vertex 2.45798 0.302035 0.489362 + vertex 2.46051 0.287913 -0.510638 + vertex 2.46051 0.287913 0.489362 + endloop + endfacet + facet normal -0.973614 -0.228201 -0 + outer loop + vertex 2.46051 0.287913 0.489362 + vertex 2.46051 0.287913 -0.510638 + vertex 2.46374 0.274156 -0.510638 + endloop + endfacet + facet normal -0.973614 -0.228201 0 + outer loop + vertex 2.46051 0.287913 0.489362 + vertex 2.46374 0.274156 -0.510638 + vertex 2.46374 0.274156 0.489362 + endloop + endfacet + facet normal -0.959952 -0.280164 -0 + outer loop + vertex 2.46374 0.274156 0.489362 + vertex 2.46374 0.274156 -0.510638 + vertex 2.46764 0.260778 -0.510638 + endloop + endfacet + facet normal -0.959952 -0.280164 0 + outer loop + vertex 2.46374 0.274156 0.489362 + vertex 2.46764 0.260778 -0.510638 + vertex 2.46764 0.260778 0.489362 + endloop + endfacet + facet normal -0.943264 -0.332043 -0 + outer loop + vertex 2.46764 0.260778 0.489362 + vertex 2.46764 0.260778 -0.510638 + vertex 2.47221 0.247793 -0.510638 + endloop + endfacet + facet normal -0.943264 -0.332043 0 + outer loop + vertex 2.46764 0.260778 0.489362 + vertex 2.47221 0.247793 -0.510638 + vertex 2.47221 0.247793 0.489362 + endloop + endfacet + facet normal -0.923532 -0.383521 -0 + outer loop + vertex 2.47221 0.247793 0.489362 + vertex 2.47221 0.247793 -0.510638 + vertex 2.47744 0.235212 -0.510638 + endloop + endfacet + facet normal -0.923532 -0.383521 0 + outer loop + vertex 2.47221 0.247793 0.489362 + vertex 2.47744 0.235212 -0.510638 + vertex 2.47744 0.235212 0.489362 + endloop + endfacet + facet normal -0.900759 -0.434319 -0 + outer loop + vertex 2.47744 0.235212 0.489362 + vertex 2.47744 0.235212 -0.510638 + vertex 2.4833 0.223049 -0.510638 + endloop + endfacet + facet normal -0.900759 -0.434319 0 + outer loop + vertex 2.47744 0.235212 0.489362 + vertex 2.4833 0.223049 -0.510638 + vertex 2.4833 0.223049 0.489362 + endloop + endfacet + facet normal -0.874983 -0.484154 -0 + outer loop + vertex 2.4833 0.223049 0.489362 + vertex 2.4833 0.223049 -0.510638 + vertex 2.48979 0.211318 -0.510638 + endloop + endfacet + facet normal -0.874983 -0.484154 0 + outer loop + vertex 2.4833 0.223049 0.489362 + vertex 2.48979 0.211318 -0.510638 + vertex 2.48979 0.211318 0.489362 + endloop + endfacet + facet normal -0.846302 -0.532703 -0 + outer loop + vertex 2.48979 0.211318 0.489362 + vertex 2.48979 0.211318 -0.510638 + vertex 2.4969 0.200032 -0.510638 + endloop + endfacet + facet normal -0.846302 -0.532703 0 + outer loop + vertex 2.48979 0.211318 0.489362 + vertex 2.4969 0.200032 -0.510638 + vertex 2.4969 0.200032 0.489362 + endloop + endfacet + facet normal -0.814821 -0.579712 -0 + outer loop + vertex 2.4969 0.200032 0.489362 + vertex 2.4969 0.200032 -0.510638 + vertex 2.5046 0.189202 -0.510638 + endloop + endfacet + facet normal -0.814821 -0.579712 0 + outer loop + vertex 2.4969 0.200032 0.489362 + vertex 2.5046 0.189202 -0.510638 + vertex 2.5046 0.189202 0.489362 + endloop + endfacet + facet normal -0.780714 -0.624889 -0 + outer loop + vertex 2.5046 0.189202 0.489362 + vertex 2.5046 0.189202 -0.510638 + vertex 2.51289 0.178844 -0.510638 + endloop + endfacet + facet normal -0.780714 -0.624889 0 + outer loop + vertex 2.5046 0.189202 0.489362 + vertex 2.51289 0.178844 -0.510638 + vertex 2.51289 0.178844 0.489362 + endloop + endfacet + facet normal -0.744149 -0.668014 -0 + outer loop + vertex 2.51289 0.178844 0.489362 + vertex 2.51289 0.178844 -0.510638 + vertex 2.52176 0.168969 -0.510638 + endloop + endfacet + facet normal -0.744149 -0.668014 0 + outer loop + vertex 2.51289 0.178844 0.489362 + vertex 2.52176 0.168969 -0.510638 + vertex 2.52176 0.168969 0.489362 + endloop + endfacet + facet normal -0.705351 -0.708858 -0 + outer loop + vertex 2.52176 0.168969 0.489362 + vertex 2.52176 0.168969 -0.510638 + vertex 2.53118 0.159591 -0.510638 + endloop + endfacet + facet normal -0.705351 -0.708858 0 + outer loop + vertex 2.52176 0.168969 0.489362 + vertex 2.53118 0.159591 -0.510638 + vertex 2.53118 0.159591 0.489362 + endloop + endfacet + facet normal -0.664555 -0.747239 -0 + outer loop + vertex 2.53118 0.159591 0.489362 + vertex 2.53118 0.159591 -0.510638 + vertex 2.54115 0.150724 -0.510638 + endloop + endfacet + facet normal -0.664555 -0.747239 0 + outer loop + vertex 2.53118 0.159591 0.489362 + vertex 2.54115 0.150724 -0.510638 + vertex 2.54115 0.150724 0.489362 + endloop + endfacet + facet normal -0.622015 -0.783005 -0 + outer loop + vertex 2.54115 0.150724 0.489362 + vertex 2.54115 0.150724 -0.510638 + vertex 2.55166 0.142379 -0.510638 + endloop + endfacet + facet normal -0.622015 -0.783005 0 + outer loop + vertex 2.54115 0.150724 0.489362 + vertex 2.55166 0.142379 -0.510638 + vertex 2.55166 0.142379 0.489362 + endloop + endfacet + facet normal -0.577991 -0.816043 -0 + outer loop + vertex 2.55166 0.142379 0.489362 + vertex 2.55166 0.142379 -0.510638 + vertex 2.56268 0.13457 -0.510638 + endloop + endfacet + facet normal -0.577991 -0.816043 0 + outer loop + vertex 2.55166 0.142379 0.489362 + vertex 2.56268 0.13457 -0.510638 + vertex 2.56268 0.13457 0.489362 + endloop + endfacet + facet normal -0.532751 -0.846272 -0 + outer loop + vertex 2.56268 0.13457 0.489362 + vertex 2.56268 0.13457 -0.510638 + vertex 2.57421 0.127311 -0.510638 + endloop + endfacet + facet normal -0.532751 -0.846272 0 + outer loop + vertex 2.56268 0.13457 0.489362 + vertex 2.57421 0.127311 -0.510638 + vertex 2.57421 0.127311 0.489362 + endloop + endfacet + facet normal -0.486557 -0.873649 -0 + outer loop + vertex 2.57421 0.127311 0.489362 + vertex 2.57421 0.127311 -0.510638 + vertex 2.58624 0.120615 -0.510638 + endloop + endfacet + facet normal -0.486557 -0.873649 0 + outer loop + vertex 2.57421 0.127311 0.489362 + vertex 2.58624 0.120615 -0.510638 + vertex 2.58624 0.120615 0.489362 + endloop + endfacet + facet normal -0.439669 -0.89816 -0 + outer loop + vertex 2.58624 0.120615 0.489362 + vertex 2.58624 0.120615 -0.510638 + vertex 2.59874 0.114493 -0.510638 + endloop + endfacet + facet normal -0.439669 -0.89816 0 + outer loop + vertex 2.58624 0.120615 0.489362 + vertex 2.59874 0.114493 -0.510638 + vertex 2.59874 0.114493 0.489362 + endloop + endfacet + facet normal -0.392326 -0.919826 -0 + outer loop + vertex 2.59874 0.114493 0.489362 + vertex 2.59874 0.114493 -0.510638 + vertex 2.61171 0.108961 -0.510638 + endloop + endfacet + facet normal -0.392326 -0.919826 0 + outer loop + vertex 2.59874 0.114493 0.489362 + vertex 2.61171 0.108961 -0.510638 + vertex 2.61171 0.108961 0.489362 + endloop + endfacet + facet normal -0.344774 -0.938686 -0 + outer loop + vertex 2.61171 0.108961 0.489362 + vertex 2.61171 0.108961 -0.510638 + vertex 2.62514 0.10403 -0.510638 + endloop + endfacet + facet normal -0.344774 -0.938686 0 + outer loop + vertex 2.61171 0.108961 0.489362 + vertex 2.62514 0.10403 -0.510638 + vertex 2.62514 0.10403 0.489362 + endloop + endfacet + facet normal -0.297218 -0.95481 -0 + outer loop + vertex 2.62514 0.10403 0.489362 + vertex 2.62514 0.10403 -0.510638 + vertex 2.639 0.0997144 -0.510638 + endloop + endfacet + facet normal -0.297218 -0.95481 0 + outer loop + vertex 2.62514 0.10403 0.489362 + vertex 2.639 0.0997144 -0.510638 + vertex 2.639 0.0997144 0.489362 + endloop + endfacet + facet normal -0.249865 -0.968281 -0 + outer loop + vertex 2.639 0.0997144 0.489362 + vertex 2.639 0.0997144 -0.510638 + vertex 2.65329 0.0960266 -0.510638 + endloop + endfacet + facet normal -0.249865 -0.968281 0 + outer loop + vertex 2.639 0.0997144 0.489362 + vertex 2.65329 0.0960266 -0.510638 + vertex 2.65329 0.0960266 0.489362 + endloop + endfacet + facet normal -0.202887 -0.979202 -0 + outer loop + vertex 2.65329 0.0960266 0.489362 + vertex 2.65329 0.0960266 -0.510638 + vertex 2.668 0.0929799 -0.510638 + endloop + endfacet + facet normal -0.202887 -0.979202 0 + outer loop + vertex 2.65329 0.0960266 0.489362 + vertex 2.668 0.0929799 -0.510638 + vertex 2.668 0.0929799 0.489362 + endloop + endfacet + facet normal -0.156444 -0.987687 -0 + outer loop + vertex 2.668 0.0929799 0.489362 + vertex 2.668 0.0929799 -0.510638 + vertex 2.6831 0.0905874 -0.510638 + endloop + endfacet + facet normal -0.156444 -0.987687 0 + outer loop + vertex 2.668 0.0929799 0.489362 + vertex 2.6831 0.0905874 -0.510638 + vertex 2.6831 0.0905874 0.489362 + endloop + endfacet + facet normal -0.110681 -0.993856 -0 + outer loop + vertex 2.6831 0.0905874 0.489362 + vertex 2.6831 0.0905874 -0.510638 + vertex 2.69859 0.0888622 -0.510638 + endloop + endfacet + facet normal -0.110681 -0.993856 0 + outer loop + vertex 2.6831 0.0905874 0.489362 + vertex 2.69859 0.0888622 -0.510638 + vertex 2.69859 0.0888622 0.489362 + endloop + endfacet + facet normal -0.06571 -0.997839 -0 + outer loop + vertex 2.69859 0.0888622 0.489362 + vertex 2.69859 0.0888622 -0.510638 + vertex 2.71446 0.0878175 -0.510638 + endloop + endfacet + facet normal -0.06571 -0.997839 0 + outer loop + vertex 2.69859 0.0888622 0.489362 + vertex 2.71446 0.0878175 -0.510638 + vertex 2.71446 0.0878175 0.489362 + endloop + endfacet + facet normal -0.021638 -0.999766 -0 + outer loop + vertex 2.71446 0.0878175 0.489362 + vertex 2.71446 0.0878175 -0.510638 + vertex 2.73068 0.0874664 -0.510638 + endloop + endfacet + facet normal -0.021638 -0.999766 0 + outer loop + vertex 2.71446 0.0878175 0.489362 + vertex 2.73068 0.0874664 -0.510638 + vertex 2.73068 0.0874664 0.489362 + endloop + endfacet + facet normal 0.0116325 -0.999932 0 + outer loop + vertex 2.73068 0.0874664 0.489362 + vertex 2.73068 0.0874664 -0.510638 + vertex 2.7384 0.0875562 -0.510638 + endloop + endfacet + facet normal 0.0116325 -0.999932 0 + outer loop + vertex 2.73068 0.0874664 0.489362 + vertex 2.7384 0.0875562 -0.510638 + vertex 2.7384 0.0875562 0.489362 + endloop + endfacet + facet normal 0.0346109 -0.999401 0 + outer loop + vertex 2.7384 0.0875562 0.489362 + vertex 2.7384 0.0875562 -0.510638 + vertex 2.74617 0.0878252 -0.510638 + endloop + endfacet + facet normal 0.0346109 -0.999401 0 + outer loop + vertex 2.7384 0.0875562 0.489362 + vertex 2.74617 0.0878252 -0.510638 + vertex 2.74617 0.0878252 0.489362 + endloop + endfacet + facet normal 0.0571877 -0.998363 0 + outer loop + vertex 2.74617 0.0878252 0.489362 + vertex 2.74617 0.0878252 -0.510638 + vertex 2.75398 0.0882724 -0.510638 + endloop + endfacet + facet normal 0.0571877 -0.998363 0 + outer loop + vertex 2.74617 0.0878252 0.489362 + vertex 2.75398 0.0882724 -0.510638 + vertex 2.75398 0.0882724 0.489362 + endloop + endfacet + facet normal 0.0793646 -0.996846 0 + outer loop + vertex 2.75398 0.0882724 0.489362 + vertex 2.75398 0.0882724 -0.510638 + vertex 2.76182 0.0888969 -0.510638 + endloop + endfacet + facet normal 0.0793646 -0.996846 0 + outer loop + vertex 2.75398 0.0882724 0.489362 + vertex 2.76182 0.0888969 -0.510638 + vertex 2.76182 0.0888969 0.489362 + endloop + endfacet + facet normal 0.101146 -0.994872 0 + outer loop + vertex 2.76182 0.0888969 0.489362 + vertex 2.76182 0.0888969 -0.510638 + vertex 2.7697 0.0896979 -0.510638 + endloop + endfacet + facet normal 0.101146 -0.994872 0 + outer loop + vertex 2.76182 0.0888969 0.489362 + vertex 2.7697 0.0896979 -0.510638 + vertex 2.7697 0.0896979 0.489362 + endloop + endfacet + facet normal 0.122531 -0.992465 0 + outer loop + vertex 2.7697 0.0896979 0.489362 + vertex 2.7697 0.0896979 -0.510638 + vertex 2.77761 0.0906744 -0.510638 + endloop + endfacet + facet normal 0.122531 -0.992465 0 + outer loop + vertex 2.7697 0.0896979 0.489362 + vertex 2.77761 0.0906744 -0.510638 + vertex 2.77761 0.0906744 0.489362 + endloop + endfacet + facet normal 0.143531 -0.989646 0 + outer loop + vertex 2.77761 0.0906744 0.489362 + vertex 2.77761 0.0906744 -0.510638 + vertex 2.78555 0.0918256 -0.510638 + endloop + endfacet + facet normal 0.143531 -0.989646 0 + outer loop + vertex 2.77761 0.0906744 0.489362 + vertex 2.78555 0.0918256 -0.510638 + vertex 2.78555 0.0918256 0.489362 + endloop + endfacet + facet normal 0.164145 -0.986436 0 + outer loop + vertex 2.78555 0.0918256 0.489362 + vertex 2.78555 0.0918256 -0.510638 + vertex 2.79351 0.0931505 -0.510638 + endloop + endfacet + facet normal 0.164145 -0.986436 0 + outer loop + vertex 2.78555 0.0918256 0.489362 + vertex 2.79351 0.0931505 -0.510638 + vertex 2.79351 0.0931505 0.489362 + endloop + endfacet + facet normal 0.184386 -0.982854 0 + outer loop + vertex 2.79351 0.0931505 0.489362 + vertex 2.79351 0.0931505 -0.510638 + vertex 2.80149 0.0946484 -0.510638 + endloop + endfacet + facet normal 0.184386 -0.982854 0 + outer loop + vertex 2.79351 0.0931505 0.489362 + vertex 2.80149 0.0946484 -0.510638 + vertex 2.80149 0.0946484 0.489362 + endloop + endfacet + facet normal 0.204261 -0.978917 0 + outer loop + vertex 2.80149 0.0946484 0.489362 + vertex 2.80149 0.0946484 -0.510638 + vertex 2.8095 0.0963182 -0.510638 + endloop + endfacet + facet normal 0.204261 -0.978917 0 + outer loop + vertex 2.80149 0.0946484 0.489362 + vertex 2.8095 0.0963182 -0.510638 + vertex 2.8095 0.0963182 0.489362 + endloop + endfacet + facet normal 0.223774 -0.974641 0 + outer loop + vertex 2.8095 0.0963182 0.489362 + vertex 2.8095 0.0963182 -0.510638 + vertex 2.81752 0.0981592 -0.510638 + endloop + endfacet + facet normal 0.223774 -0.974641 0 + outer loop + vertex 2.8095 0.0963182 0.489362 + vertex 2.81752 0.0981592 -0.510638 + vertex 2.81752 0.0981592 0.489362 + endloop + endfacet + facet normal 0.242929 -0.970044 0 + outer loop + vertex 2.81752 0.0981592 0.489362 + vertex 2.81752 0.0981592 -0.510638 + vertex 2.82555 0.10017 -0.510638 + endloop + endfacet + facet normal 0.242929 -0.970044 0 + outer loop + vertex 2.81752 0.0981592 0.489362 + vertex 2.82555 0.10017 -0.510638 + vertex 2.82555 0.10017 0.489362 + endloop + endfacet + facet normal 0.261747 -0.965136 0 + outer loop + vertex 2.82555 0.10017 0.489362 + vertex 2.82555 0.10017 -0.510638 + vertex 2.83359 0.102351 -0.510638 + endloop + endfacet + facet normal 0.261747 -0.965136 0 + outer loop + vertex 2.82555 0.10017 0.489362 + vertex 2.83359 0.102351 -0.510638 + vertex 2.83359 0.102351 0.489362 + endloop + endfacet + facet normal 0.280231 -0.959933 0 + outer loop + vertex 2.83359 0.102351 0.489362 + vertex 2.83359 0.102351 -0.510638 + vertex 2.84163 0.1047 -0.510638 + endloop + endfacet + facet normal 0.280231 -0.959933 0 + outer loop + vertex 2.83359 0.102351 0.489362 + vertex 2.84163 0.1047 -0.510638 + vertex 2.84163 0.1047 0.489362 + endloop + endfacet + facet normal 0.298389 -0.954444 0 + outer loop + vertex 2.84163 0.1047 0.489362 + vertex 2.84163 0.1047 -0.510638 + vertex 2.84968 0.107216 -0.510638 + endloop + endfacet + facet normal 0.298389 -0.954444 0 + outer loop + vertex 2.84163 0.1047 0.489362 + vertex 2.84968 0.107216 -0.510638 + vertex 2.84968 0.107216 0.489362 + endloop + endfacet + facet normal 0.31623 -0.948683 0 + outer loop + vertex 2.84968 0.107216 0.489362 + vertex 2.84968 0.107216 -0.510638 + vertex 2.85773 0.1099 -0.510638 + endloop + endfacet + facet normal 0.31623 -0.948683 0 + outer loop + vertex 2.84968 0.107216 0.489362 + vertex 2.85773 0.1099 -0.510638 + vertex 2.85773 0.1099 0.489362 + endloop + endfacet + facet normal 0.333764 -0.942657 0 + outer loop + vertex 2.85773 0.1099 0.489362 + vertex 2.85773 0.1099 -0.510638 + vertex 2.86578 0.112749 -0.510638 + endloop + endfacet + facet normal 0.333764 -0.942657 0 + outer loop + vertex 2.85773 0.1099 0.489362 + vertex 2.86578 0.112749 -0.510638 + vertex 2.86578 0.112749 0.489362 + endloop + endfacet + facet normal 0.350999 -0.936376 0 + outer loop + vertex 2.86578 0.112749 0.489362 + vertex 2.86578 0.112749 -0.510638 + vertex 2.87382 0.115762 -0.510638 + endloop + endfacet + facet normal 0.350999 -0.936376 0 + outer loop + vertex 2.86578 0.112749 0.489362 + vertex 2.87382 0.115762 -0.510638 + vertex 2.87382 0.115762 0.489362 + endloop + endfacet + facet normal 0.367944 -0.929848 0 + outer loop + vertex 2.87382 0.115762 0.489362 + vertex 2.87382 0.115762 -0.510638 + vertex 2.88185 0.11894 -0.510638 + endloop + endfacet + facet normal 0.367944 -0.929848 0 + outer loop + vertex 2.87382 0.115762 0.489362 + vertex 2.88185 0.11894 -0.510638 + vertex 2.88185 0.11894 0.489362 + endloop + endfacet + facet normal 0.384618 -0.923076 0 + outer loop + vertex 2.88185 0.11894 0.489362 + vertex 2.88185 0.11894 -0.510638 + vertex 2.88987 0.122281 -0.510638 + endloop + endfacet + facet normal 0.384618 -0.923076 0 + outer loop + vertex 2.88185 0.11894 0.489362 + vertex 2.88987 0.122281 -0.510638 + vertex 2.88987 0.122281 0.489362 + endloop + endfacet + facet normal 0.401009 -0.916074 0 + outer loop + vertex 2.88987 0.122281 0.489362 + vertex 2.88987 0.122281 -0.510638 + vertex 2.89787 0.125784 -0.510638 + endloop + endfacet + facet normal 0.401009 -0.916074 0 + outer loop + vertex 2.88987 0.122281 0.489362 + vertex 2.89787 0.125784 -0.510638 + vertex 2.89787 0.125784 0.489362 + endloop + endfacet + facet normal 0.417136 -0.908844 0 + outer loop + vertex 2.89787 0.125784 0.489362 + vertex 2.89787 0.125784 -0.510638 + vertex 2.90585 0.129449 -0.510638 + endloop + endfacet + facet normal 0.417136 -0.908844 0 + outer loop + vertex 2.89787 0.125784 0.489362 + vertex 2.90585 0.129449 -0.510638 + vertex 2.90585 0.129449 0.489362 + endloop + endfacet + facet normal 0.433005 -0.901391 0 + outer loop + vertex 2.90585 0.129449 0.489362 + vertex 2.90585 0.129449 -0.510638 + vertex 2.91382 0.133274 -0.510638 + endloop + endfacet + facet normal 0.433005 -0.901391 0 + outer loop + vertex 2.90585 0.129449 0.489362 + vertex 2.91382 0.133274 -0.510638 + vertex 2.91382 0.133274 0.489362 + endloop + endfacet + facet normal 0.448637 -0.893714 0 + outer loop + vertex 2.91382 0.133274 0.489362 + vertex 2.91382 0.133274 -0.510638 + vertex 2.92175 0.137258 -0.510638 + endloop + endfacet + facet normal 0.448637 -0.893714 0 + outer loop + vertex 2.91382 0.133274 0.489362 + vertex 2.92175 0.137258 -0.510638 + vertex 2.92175 0.137258 0.489362 + endloop + endfacet + facet normal 0.464015 -0.885827 0 + outer loop + vertex 2.92175 0.137258 0.489362 + vertex 2.92175 0.137258 -0.510638 + vertex 2.92966 0.141402 -0.510638 + endloop + endfacet + facet normal 0.464015 -0.885827 0 + outer loop + vertex 2.92175 0.137258 0.489362 + vertex 2.92966 0.141402 -0.510638 + vertex 2.92966 0.141402 0.489362 + endloop + endfacet + facet normal 0.479171 -0.877722 0 + outer loop + vertex 2.92966 0.141402 0.489362 + vertex 2.92966 0.141402 -0.510638 + vertex 2.93754 0.145703 -0.510638 + endloop + endfacet + facet normal 0.479171 -0.877722 0 + outer loop + vertex 2.92966 0.141402 0.489362 + vertex 2.93754 0.145703 -0.510638 + vertex 2.93754 0.145703 0.489362 + endloop + endfacet + facet normal 0.494086 -0.869413 0 + outer loop + vertex 2.93754 0.145703 0.489362 + vertex 2.93754 0.145703 -0.510638 + vertex 2.94539 0.15016 -0.510638 + endloop + endfacet + facet normal 0.494086 -0.869413 0 + outer loop + vertex 2.93754 0.145703 0.489362 + vertex 2.94539 0.15016 -0.510638 + vertex 2.94539 0.15016 0.489362 + endloop + endfacet + facet normal 0.508791 -0.86089 0 + outer loop + vertex 2.94539 0.15016 0.489362 + vertex 2.94539 0.15016 -0.510638 + vertex 2.95319 0.154774 -0.510638 + endloop + endfacet + facet normal 0.508791 -0.86089 0 + outer loop + vertex 2.94539 0.15016 0.489362 + vertex 2.95319 0.154774 -0.510638 + vertex 2.95319 0.154774 0.489362 + endloop + endfacet + facet normal 0.523269 -0.852168 0 + outer loop + vertex 2.95319 0.154774 0.489362 + vertex 2.95319 0.154774 -0.510638 + vertex 2.96096 0.159543 -0.510638 + endloop + endfacet + facet normal 0.523269 -0.852168 0 + outer loop + vertex 2.95319 0.154774 0.489362 + vertex 2.96096 0.159543 -0.510638 + vertex 2.96096 0.159543 0.489362 + endloop + endfacet + facet normal 0.537546 -0.843234 0 + outer loop + vertex 2.96096 0.159543 0.489362 + vertex 2.96096 0.159543 -0.510638 + vertex 2.96868 0.164466 -0.510638 + endloop + endfacet + facet normal 0.537546 -0.843234 0 + outer loop + vertex 2.96096 0.159543 0.489362 + vertex 2.96868 0.164466 -0.510638 + vertex 2.96868 0.164466 0.489362 + endloop + endfacet + facet normal -1 0 -0 + outer loop + vertex 2.96868 0.164466 0.489362 + vertex 2.96868 0.164466 -0.510638 + vertex 2.96868 0.0574664 -0.510638 + endloop + endfacet + facet normal -1 -0 0 + outer loop + vertex 2.96868 0.164466 0.489362 + vertex 2.96868 0.0574664 -0.510638 + vertex 2.96868 0.0574664 0.489362 + endloop + endfacet + facet normal -0.458324 0.888785 0 + outer loop + vertex 2.96868 0.0574664 0.489362 + vertex 2.96868 0.0574664 -0.510638 + vertex 2.96196 0.0540003 -0.510638 + endloop + endfacet + facet normal -0.458324 0.888785 0 + outer loop + vertex 2.96868 0.0574664 0.489362 + vertex 2.96196 0.0540003 -0.510638 + vertex 2.96196 0.0540003 0.489362 + endloop + endfacet + facet normal -0.448531 0.893767 0 + outer loop + vertex 2.96196 0.0540003 0.489362 + vertex 2.96196 0.0540003 -0.510638 + vertex 2.95519 0.0506042 -0.510638 + endloop + endfacet + facet normal -0.448531 0.893767 0 + outer loop + vertex 2.96196 0.0540003 0.489362 + vertex 2.95519 0.0506042 -0.510638 + vertex 2.95519 0.0506042 0.489362 + endloop + endfacet + facet normal -0.438006 0.898972 0 + outer loop + vertex 2.95519 0.0506042 0.489362 + vertex 2.95519 0.0506042 -0.510638 + vertex 2.94837 0.0472814 -0.510638 + endloop + endfacet + facet normal -0.438006 0.898972 0 + outer loop + vertex 2.95519 0.0506042 0.489362 + vertex 2.94837 0.0472814 -0.510638 + vertex 2.94837 0.0472814 0.489362 + endloop + endfacet + facet normal -0.42679 0.904351 0 + outer loop + vertex 2.94837 0.0472814 0.489362 + vertex 2.94837 0.0472814 -0.510638 + vertex 2.9415 0.0440353 -0.510638 + endloop + endfacet + facet normal -0.42679 0.904351 0 + outer loop + vertex 2.94837 0.0472814 0.489362 + vertex 2.9415 0.0440353 -0.510638 + vertex 2.9415 0.0440353 0.489362 + endloop + endfacet + facet normal -0.4149 0.909867 0 + outer loop + vertex 2.9415 0.0440353 0.489362 + vertex 2.9415 0.0440353 -0.510638 + vertex 2.93455 0.0408692 -0.510638 + endloop + endfacet + facet normal -0.4149 0.909867 0 + outer loop + vertex 2.9415 0.0440353 0.489362 + vertex 2.93455 0.0408692 -0.510638 + vertex 2.93455 0.0408692 0.489362 + endloop + endfacet + facet normal -0.402356 0.915483 0 + outer loop + vertex 2.93455 0.0408692 0.489362 + vertex 2.93455 0.0408692 -0.510638 + vertex 2.92754 0.0377864 -0.510638 + endloop + endfacet + facet normal -0.402356 0.915483 0 + outer loop + vertex 2.93455 0.0408692 0.489362 + vertex 2.92754 0.0377864 -0.510638 + vertex 2.92754 0.0377864 0.489362 + endloop + endfacet + facet normal -0.389172 0.921165 0 + outer loop + vertex 2.92754 0.0377864 0.489362 + vertex 2.92754 0.0377864 -0.510638 + vertex 2.92045 0.0347903 -0.510638 + endloop + endfacet + facet normal -0.389172 0.921165 0 + outer loop + vertex 2.92754 0.0377864 0.489362 + vertex 2.92045 0.0347903 -0.510638 + vertex 2.92045 0.0347903 0.489362 + endloop + endfacet + facet normal -0.375399 0.926863 0 + outer loop + vertex 2.92045 0.0347903 0.489362 + vertex 2.92045 0.0347903 -0.510638 + vertex 2.91327 0.0318842 -0.510638 + endloop + endfacet + facet normal -0.375399 0.926863 0 + outer loop + vertex 2.92045 0.0347903 0.489362 + vertex 2.91327 0.0318842 -0.510638 + vertex 2.91327 0.0318842 0.489362 + endloop + endfacet + facet normal -0.361048 0.932547 0 + outer loop + vertex 2.91327 0.0318842 0.489362 + vertex 2.91327 0.0318842 -0.510638 + vertex 2.90601 0.0290714 -0.510638 + endloop + endfacet + facet normal -0.361048 0.932547 0 + outer loop + vertex 2.91327 0.0318842 0.489362 + vertex 2.90601 0.0290714 -0.510638 + vertex 2.90601 0.0290714 0.489362 + endloop + endfacet + facet normal -0.346175 0.93817 0 + outer loop + vertex 2.90601 0.0290714 0.489362 + vertex 2.90601 0.0290714 -0.510638 + vertex 2.89864 0.0263553 -0.510638 + endloop + endfacet + facet normal -0.346175 0.93817 0 + outer loop + vertex 2.90601 0.0290714 0.489362 + vertex 2.89864 0.0263553 -0.510638 + vertex 2.89864 0.0263553 0.489362 + endloop + endfacet + facet normal -0.330799 0.943701 0 + outer loop + vertex 2.89864 0.0263553 0.489362 + vertex 2.89864 0.0263553 -0.510638 + vertex 2.89118 0.0237392 -0.510638 + endloop + endfacet + facet normal -0.330799 0.943701 0 + outer loop + vertex 2.89864 0.0263553 0.489362 + vertex 2.89118 0.0237392 -0.510638 + vertex 2.89118 0.0237392 0.489362 + endloop + endfacet + facet normal -0.314973 0.949101 0 + outer loop + vertex 2.89118 0.0237392 0.489362 + vertex 2.89118 0.0237392 -0.510638 + vertex 2.88361 0.0212264 -0.510638 + endloop + endfacet + facet normal -0.314973 0.949101 0 + outer loop + vertex 2.89118 0.0237392 0.489362 + vertex 2.88361 0.0212264 -0.510638 + vertex 2.88361 0.0212264 0.489362 + endloop + endfacet + facet normal -0.298741 0.954334 0 + outer loop + vertex 2.88361 0.0212264 0.489362 + vertex 2.88361 0.0212264 -0.510638 + vertex 2.87592 0.0188203 -0.510638 + endloop + endfacet + facet normal -0.298741 0.954334 0 + outer loop + vertex 2.88361 0.0212264 0.489362 + vertex 2.87592 0.0188203 -0.510638 + vertex 2.87592 0.0188203 0.489362 + endloop + endfacet + facet normal -0.28215 0.95937 0 + outer loop + vertex 2.87592 0.0188203 0.489362 + vertex 2.87592 0.0188203 -0.510638 + vertex 2.86812 0.0165242 -0.510638 + endloop + endfacet + facet normal -0.28215 0.95937 0 + outer loop + vertex 2.87592 0.0188203 0.489362 + vertex 2.86812 0.0165242 -0.510638 + vertex 2.86812 0.0165242 0.489362 + endloop + endfacet + facet normal -0.265251 0.964179 0 + outer loop + vertex 2.86812 0.0165242 0.489362 + vertex 2.86812 0.0165242 -0.510638 + vertex 2.86018 0.0143414 -0.510638 + endloop + endfacet + facet normal -0.265251 0.964179 0 + outer loop + vertex 2.86812 0.0165242 0.489362 + vertex 2.86018 0.0143414 -0.510638 + vertex 2.86018 0.0143414 0.489362 + endloop + endfacet + facet normal -0.248093 0.968736 0 + outer loop + vertex 2.86018 0.0143414 0.489362 + vertex 2.86018 0.0143414 -0.510638 + vertex 2.85211 0.0122753 -0.510638 + endloop + endfacet + facet normal -0.248093 0.968736 0 + outer loop + vertex 2.86018 0.0143414 0.489362 + vertex 2.85211 0.0122753 -0.510638 + vertex 2.85211 0.0122753 0.489362 + endloop + endfacet + facet normal -0.230721 0.97302 0 + outer loop + vertex 2.85211 0.0122753 0.489362 + vertex 2.85211 0.0122753 -0.510638 + vertex 2.84391 0.0103292 -0.510638 + endloop + endfacet + facet normal -0.230721 0.97302 0 + outer loop + vertex 2.85211 0.0122753 0.489362 + vertex 2.84391 0.0103292 -0.510638 + vertex 2.84391 0.0103292 0.489362 + endloop + endfacet + facet normal -0.213201 0.977008 0 + outer loop + vertex 2.84391 0.0103292 0.489362 + vertex 2.84391 0.0103292 -0.510638 + vertex 2.83555 0.00850639 -0.510638 + endloop + endfacet + facet normal -0.213201 0.977008 0 + outer loop + vertex 2.84391 0.0103292 0.489362 + vertex 2.83555 0.00850639 -0.510638 + vertex 2.83555 0.00850639 0.489362 + endloop + endfacet + facet normal -0.195572 0.980689 0 + outer loop + vertex 2.83555 0.00850639 0.489362 + vertex 2.83555 0.00850639 -0.510638 + vertex 2.82705 0.00681028 -0.510638 + endloop + endfacet + facet normal -0.195572 0.980689 0 + outer loop + vertex 2.83555 0.00850639 0.489362 + vertex 2.82705 0.00681028 -0.510638 + vertex 2.82705 0.00681028 0.489362 + endloop + endfacet + facet normal -0.177894 0.98405 0 + outer loop + vertex 2.82705 0.00681028 0.489362 + vertex 2.82705 0.00681028 -0.510638 + vertex 2.81839 0.00524417 -0.510638 + endloop + endfacet + facet normal -0.177894 0.98405 0 + outer loop + vertex 2.82705 0.00681028 0.489362 + vertex 2.81839 0.00524417 -0.510638 + vertex 2.81839 0.00524417 0.489362 + endloop + endfacet + facet normal -0.160209 0.987083 0 + outer loop + vertex 2.81839 0.00524417 0.489362 + vertex 2.81839 0.00524417 -0.510638 + vertex 2.80956 0.00381139 -0.510638 + endloop + endfacet + facet normal -0.160209 0.987083 0 + outer loop + vertex 2.81839 0.00524417 0.489362 + vertex 2.80956 0.00381139 -0.510638 + vertex 2.80956 0.00381139 0.489362 + endloop + endfacet + facet normal -0.142567 0.989785 0 + outer loop + vertex 2.80956 0.00381139 0.489362 + vertex 2.80956 0.00381139 -0.510638 + vertex 2.80056 0.00251528 -0.510638 + endloop + endfacet + facet normal -0.142567 0.989785 0 + outer loop + vertex 2.80956 0.00381139 0.489362 + vertex 2.80056 0.00251528 -0.510638 + vertex 2.80056 0.00251528 0.489362 + endloop + endfacet + facet normal -0.125014 0.992155 0 + outer loop + vertex 2.80056 0.00251528 0.489362 + vertex 2.80056 0.00251528 -0.510638 + vertex 2.79138 0.00135917 -0.510638 + endloop + endfacet + facet normal -0.125014 0.992155 0 + outer loop + vertex 2.80056 0.00251528 0.489362 + vertex 2.79138 0.00135917 -0.510638 + vertex 2.79138 0.00135917 0.489362 + endloop + endfacet + facet normal -0.107593 0.994195 0 + outer loop + vertex 2.79138 0.00135917 0.489362 + vertex 2.79138 0.00135917 -0.510638 + vertex 2.78203 0.000346389 -0.510638 + endloop + endfacet + facet normal -0.107593 0.994195 0 + outer loop + vertex 2.79138 0.00135917 0.489362 + vertex 2.78203 0.000346389 -0.510638 + vertex 2.78203 0.000346389 0.489362 + endloop + endfacet + facet normal -0.090343 0.995911 0 + outer loop + vertex 2.78203 0.000346389 0.489362 + vertex 2.78203 0.000346389 -0.510638 + vertex 2.77248 -0.000519722 -0.510638 + endloop + endfacet + facet normal -0.090343 0.995911 0 + outer loop + vertex 2.78203 0.000346389 0.489362 + vertex 2.77248 -0.000519722 -0.510638 + vertex 2.77248 -0.000519722 0.489362 + endloop + endfacet + facet normal -0.0733007 0.99731 0 + outer loop + vertex 2.77248 -0.000519722 0.489362 + vertex 2.77248 -0.000519722 -0.510638 + vertex 2.76274 -0.00123583 -0.510638 + endloop + endfacet + facet normal -0.0733007 0.99731 0 + outer loop + vertex 2.77248 -0.000519722 0.489362 + vertex 2.76274 -0.00123583 -0.510638 + vertex 2.76274 -0.00123583 0.489362 + endloop + endfacet + facet normal -0.0564977 0.998403 0 + outer loop + vertex 2.76274 -0.00123583 0.489362 + vertex 2.76274 -0.00123583 -0.510638 + vertex 2.75279 -0.00179861 -0.510638 + endloop + endfacet + facet normal -0.0564977 0.998403 0 + outer loop + vertex 2.76274 -0.00123583 0.489362 + vertex 2.75279 -0.00179861 -0.510638 + vertex 2.75279 -0.00179861 0.489362 + endloop + endfacet + facet normal -0.039967 0.999201 0 + outer loop + vertex 2.75279 -0.00179861 0.489362 + vertex 2.75279 -0.00179861 -0.510638 + vertex 2.74264 -0.00220472 -0.510638 + endloop + endfacet + facet normal -0.039967 0.999201 0 + outer loop + vertex 2.75279 -0.00179861 0.489362 + vertex 2.74264 -0.00220472 -0.510638 + vertex 2.74264 -0.00220472 0.489362 + endloop + endfacet + facet normal -0.0237328 0.999718 0 + outer loop + vertex 2.74264 -0.00220472 0.489362 + vertex 2.74264 -0.00220472 -0.510638 + vertex 2.73227 -0.00245083 -0.510638 + endloop + endfacet + facet normal -0.0237328 0.999718 0 + outer loop + vertex 2.74264 -0.00220472 0.489362 + vertex 2.73227 -0.00245083 -0.510638 + vertex 2.73227 -0.00245083 0.489362 + endloop + endfacet + facet normal -0.00781807 0.999969 0 + outer loop + vertex 2.73227 -0.00245083 0.489362 + vertex 2.73227 -0.00245083 -0.510638 + vertex 2.72168 -0.00253361 -0.510638 + endloop + endfacet + facet normal -0.00781807 0.999969 0 + outer loop + vertex 2.73227 -0.00245083 0.489362 + vertex 2.72168 -0.00253361 -0.510638 + vertex 2.72168 -0.00253361 0.489362 + endloop + endfacet + facet normal 0.0257626 0.999668 0 + outer loop + vertex 2.72168 -0.00253361 0.489362 + vertex 2.72168 -0.00253361 -0.510638 + vertex 2.69656 -0.00188622 -0.510638 + endloop + endfacet + facet normal 0.0257626 0.999668 0 + outer loop + vertex 2.72168 -0.00253361 0.489362 + vertex 2.69656 -0.00188622 -0.510638 + vertex 2.69656 -0.00188622 0.489362 + endloop + endfacet + facet normal 0.0785756 0.996908 0 + outer loop + vertex 2.69656 -0.00188622 0.489362 + vertex 2.69656 -0.00188622 -0.510638 + vertex 2.67239 1.87089e-05 -0.510638 + endloop + endfacet + facet normal 0.0785756 0.996908 0 + outer loop + vertex 2.69656 -0.00188622 0.489362 + vertex 2.67239 1.87089e-05 -0.510638 + vertex 2.67239 1.87089e-05 0.489362 + endloop + endfacet + facet normal 0.132599 0.99117 0 + outer loop + vertex 2.67239 1.87089e-05 0.489362 + vertex 2.67239 1.87089e-05 -0.510638 + vertex 2.64917 0.00312541 -0.510638 + endloop + endfacet + facet normal 0.132599 0.99117 0 + outer loop + vertex 2.67239 1.87089e-05 0.489362 + vertex 2.64917 0.00312541 -0.510638 + vertex 2.64917 0.00312541 0.489362 + endloop + endfacet + facet normal 0.18746 0.982272 0 + outer loop + vertex 2.64917 0.00312541 0.489362 + vertex 2.64917 0.00312541 -0.510638 + vertex 2.62689 0.00737811 -0.510638 + endloop + endfacet + facet normal 0.18746 0.982272 0 + outer loop + vertex 2.64917 0.00312541 0.489362 + vertex 2.62689 0.00737811 -0.510638 + vertex 2.62689 0.00737811 0.489362 + endloop + endfacet + facet normal 0.242743 0.970091 0 + outer loop + vertex 2.62689 0.00737811 0.489362 + vertex 2.62689 0.00737811 -0.510638 + vertex 2.60553 0.012721 -0.510638 + endloop + endfacet + facet normal 0.242743 0.970091 0 + outer loop + vertex 2.62689 0.00737811 0.489362 + vertex 2.60553 0.012721 -0.510638 + vertex 2.60553 0.012721 0.489362 + endloop + endfacet + facet normal 0.298004 0.954565 0 + outer loop + vertex 2.60553 0.012721 0.489362 + vertex 2.60553 0.012721 -0.510638 + vertex 2.58511 0.0190984 -0.510638 + endloop + endfacet + facet normal 0.298004 0.954565 0 + outer loop + vertex 2.60553 0.012721 0.489362 + vertex 2.58511 0.0190984 -0.510638 + vertex 2.58511 0.0190984 0.489362 + endloop + endfacet + facet normal 0.352788 0.935703 0 + outer loop + vertex 2.58511 0.0190984 0.489362 + vertex 2.58511 0.0190984 -0.510638 + vertex 2.5656 0.0264544 -0.510638 + endloop + endfacet + facet normal 0.352788 0.935703 0 + outer loop + vertex 2.58511 0.0190984 0.489362 + vertex 2.5656 0.0264544 -0.510638 + vertex 2.5656 0.0264544 0.489362 + endloop + endfacet + facet normal 0.406637 0.91359 0 + outer loop + vertex 2.5656 0.0264544 0.489362 + vertex 2.5656 0.0264544 -0.510638 + vertex 2.547 0.0347334 -0.510638 + endloop + endfacet + facet normal 0.406637 0.91359 0 + outer loop + vertex 2.5656 0.0264544 0.489362 + vertex 2.547 0.0347334 -0.510638 + vertex 2.547 0.0347334 0.489362 + endloop + endfacet + facet normal 0.45912 0.888374 0 + outer loop + vertex 2.547 0.0347334 0.489362 + vertex 2.547 0.0347334 -0.510638 + vertex 2.5293 0.0438794 -0.510638 + endloop + endfacet + facet normal 0.45912 0.888374 0 + outer loop + vertex 2.547 0.0347334 0.489362 + vertex 2.5293 0.0438794 -0.510638 + vertex 2.5293 0.0438794 0.489362 + endloop + endfacet + facet normal 0.509846 0.860266 0 + outer loop + vertex 2.5293 0.0438794 0.489362 + vertex 2.5293 0.0438794 -0.510638 + vertex 2.5125 0.0538368 -0.510638 + endloop + endfacet + facet normal 0.509846 0.860266 0 + outer loop + vertex 2.5293 0.0438794 0.489362 + vertex 2.5125 0.0538368 -0.510638 + vertex 2.5125 0.0538368 0.489362 + endloop + endfacet + facet normal 0.558474 0.829522 0 + outer loop + vertex 2.5125 0.0538368 0.489362 + vertex 2.5125 0.0538368 -0.510638 + vertex 2.49659 0.0645497 -0.510638 + endloop + endfacet + facet normal 0.558474 0.829522 0 + outer loop + vertex 2.5125 0.0538368 0.489362 + vertex 2.49659 0.0645497 -0.510638 + vertex 2.49659 0.0645497 0.489362 + endloop + endfacet + facet normal 0.604728 0.796432 0 + outer loop + vertex 2.49659 0.0645497 0.489362 + vertex 2.49659 0.0645497 -0.510638 + vertex 2.48155 0.0759624 -0.510638 + endloop + endfacet + facet normal 0.604728 0.796432 0 + outer loop + vertex 2.49659 0.0645497 0.489362 + vertex 2.48155 0.0759624 -0.510638 + vertex 2.48155 0.0759624 0.489362 + endloop + endfacet + facet normal 0.648404 0.761296 0 + outer loop + vertex 2.48155 0.0759624 0.489362 + vertex 2.48155 0.0759624 -0.510638 + vertex 2.4674 0.0880191 -0.510638 + endloop + endfacet + facet normal 0.648404 0.761296 0 + outer loop + vertex 2.48155 0.0759624 0.489362 + vertex 2.4674 0.0880191 -0.510638 + vertex 2.4674 0.0880191 0.489362 + endloop + endfacet + facet normal 0.689353 0.724425 0 + outer loop + vertex 2.4674 0.0880191 0.489362 + vertex 2.4674 0.0880191 -0.510638 + vertex 2.45411 0.100664 -0.510638 + endloop + endfacet + facet normal 0.689353 0.724425 0 + outer loop + vertex 2.4674 0.0880191 0.489362 + vertex 2.45411 0.100664 -0.510638 + vertex 2.45411 0.100664 0.489362 + endloop + endfacet + facet normal 0.727495 0.686113 0 + outer loop + vertex 2.45411 0.100664 0.489362 + vertex 2.45411 0.100664 -0.510638 + vertex 2.44168 0.113841 -0.510638 + endloop + endfacet + facet normal 0.727495 0.686113 0 + outer loop + vertex 2.45411 0.100664 0.489362 + vertex 2.44168 0.113841 -0.510638 + vertex 2.44168 0.113841 0.489362 + endloop + endfacet + facet normal 0.762805 0.646628 0 + outer loop + vertex 2.44168 0.113841 0.489362 + vertex 2.44168 0.113841 -0.510638 + vertex 2.43011 0.127495 -0.510638 + endloop + endfacet + facet normal 0.762805 0.646628 0 + outer loop + vertex 2.44168 0.113841 0.489362 + vertex 2.43011 0.127495 -0.510638 + vertex 2.43011 0.127495 0.489362 + endloop + endfacet + facet normal 0.795306 0.606208 0 + outer loop + vertex 2.43011 0.127495 0.489362 + vertex 2.43011 0.127495 -0.510638 + vertex 2.41938 0.14157 -0.510638 + endloop + endfacet + facet normal 0.795306 0.606208 0 + outer loop + vertex 2.43011 0.127495 0.489362 + vertex 2.41938 0.14157 -0.510638 + vertex 2.41938 0.14157 0.489362 + endloop + endfacet + facet normal 0.825065 0.565038 0 + outer loop + vertex 2.41938 0.14157 0.489362 + vertex 2.41938 0.14157 -0.510638 + vertex 2.40949 0.15601 -0.510638 + endloop + endfacet + facet normal 0.825065 0.565038 0 + outer loop + vertex 2.41938 0.14157 0.489362 + vertex 2.40949 0.15601 -0.510638 + vertex 2.40949 0.15601 0.489362 + endloop + endfacet + facet normal 0.852155 0.52329 0 + outer loop + vertex 2.40949 0.15601 0.489362 + vertex 2.40949 0.15601 -0.510638 + vertex 2.40043 0.17076 -0.510638 + endloop + endfacet + facet normal 0.852155 0.52329 0 + outer loop + vertex 2.40949 0.15601 0.489362 + vertex 2.40043 0.17076 -0.510638 + vertex 2.40043 0.17076 0.489362 + endloop + endfacet + facet normal 0.876691 0.481055 0 + outer loop + vertex 2.40043 0.17076 0.489362 + vertex 2.40043 0.17076 -0.510638 + vertex 2.3922 0.185763 -0.510638 + endloop + endfacet + facet normal 0.876691 0.481055 0 + outer loop + vertex 2.40043 0.17076 0.489362 + vertex 2.3922 0.185763 -0.510638 + vertex 2.3922 0.185763 0.489362 + endloop + endfacet + facet normal 0.898778 0.438405 0 + outer loop + vertex 2.3922 0.185763 0.489362 + vertex 2.3922 0.185763 -0.510638 + vertex 2.38479 0.200963 -0.510638 + endloop + endfacet + facet normal 0.898778 0.438405 0 + outer loop + vertex 2.3922 0.185763 0.489362 + vertex 2.38479 0.200963 -0.510638 + vertex 2.38479 0.200963 0.489362 + endloop + endfacet + facet normal 0.918526 0.395361 0 + outer loop + vertex 2.38479 0.200963 0.489362 + vertex 2.38479 0.200963 -0.510638 + vertex 2.37818 0.216306 -0.510638 + endloop + endfacet + facet normal 0.918526 0.395361 0 + outer loop + vertex 2.38479 0.200963 0.489362 + vertex 2.37818 0.216306 -0.510638 + vertex 2.37818 0.216306 0.489362 + endloop + endfacet + facet normal 0.936042 0.351889 0 + outer loop + vertex 2.37818 0.216306 0.489362 + vertex 2.37818 0.216306 -0.510638 + vertex 2.37238 0.231735 -0.510638 + endloop + endfacet + facet normal 0.936042 0.351889 0 + outer loop + vertex 2.37818 0.216306 0.489362 + vertex 2.37238 0.231735 -0.510638 + vertex 2.37238 0.231735 0.489362 + endloop + endfacet + facet normal 0.951402 0.307952 0 + outer loop + vertex 2.37238 0.231735 0.489362 + vertex 2.37238 0.231735 -0.510638 + vertex 2.36738 0.247194 -0.510638 + endloop + endfacet + facet normal 0.951402 0.307952 0 + outer loop + vertex 2.37238 0.231735 0.489362 + vertex 2.36738 0.247194 -0.510638 + vertex 2.36738 0.247194 0.489362 + endloop + endfacet + facet normal 0.964681 0.263422 0 + outer loop + vertex 2.36738 0.247194 0.489362 + vertex 2.36738 0.247194 -0.510638 + vertex 2.36316 0.262628 -0.510638 + endloop + endfacet + facet normal 0.964681 0.263422 0 + outer loop + vertex 2.36738 0.247194 0.489362 + vertex 2.36316 0.262628 -0.510638 + vertex 2.36316 0.262628 0.489362 + endloop + endfacet + facet normal 0.97591 0.218173 0 + outer loop + vertex 2.36316 0.262628 0.489362 + vertex 2.36316 0.262628 -0.510638 + vertex 2.35973 0.277981 -0.510638 + endloop + endfacet + facet normal 0.97591 0.218173 0 + outer loop + vertex 2.36316 0.262628 0.489362 + vertex 2.35973 0.277981 -0.510638 + vertex 2.35973 0.277981 0.489362 + endloop + endfacet + facet normal 0.985092 0.172026 0 + outer loop + vertex 2.35973 0.277981 0.489362 + vertex 2.35973 0.277981 -0.510638 + vertex 2.35707 0.293197 -0.510638 + endloop + endfacet + facet normal 0.985092 0.172026 0 + outer loop + vertex 2.35973 0.277981 0.489362 + vertex 2.35707 0.293197 -0.510638 + vertex 2.35707 0.293197 0.489362 + endloop + endfacet + facet normal 0.992186 0.12477 0 + outer loop + vertex 2.35707 0.293197 0.489362 + vertex 2.35707 0.293197 -0.510638 + vertex 2.35519 0.308221 -0.510638 + endloop + endfacet + facet normal 0.992186 0.12477 0 + outer loop + vertex 2.35707 0.293197 0.489362 + vertex 2.35519 0.308221 -0.510638 + vertex 2.35519 0.308221 0.489362 + endloop + endfacet + facet normal 0.997097 0.0761373 0 + outer loop + vertex 2.35519 0.308221 0.489362 + vertex 2.35519 0.308221 -0.510638 + vertex 2.35406 0.322996 -0.510638 + endloop + endfacet + facet normal 0.997097 0.0761373 0 + outer loop + vertex 2.35519 0.308221 0.489362 + vertex 2.35406 0.322996 -0.510638 + vertex 2.35406 0.322996 0.489362 + endloop + endfacet + facet normal 0.999665 0.0258751 0 + outer loop + vertex 2.35406 0.322996 0.489362 + vertex 2.35406 0.322996 -0.510638 + vertex 2.35368 0.337466 -0.510638 + endloop + endfacet + facet normal 0.999665 0.0258751 0 + outer loop + vertex 2.35406 0.322996 0.489362 + vertex 2.35368 0.337466 -0.510638 + vertex 2.35368 0.337466 0.489362 + endloop + endfacet + facet normal 0.999682 -0.025211 0 + outer loop + vertex 2.35368 0.337466 0.489362 + vertex 2.35368 0.337466 -0.510638 + vertex 2.3542 0.358076 -0.510638 + endloop + endfacet + facet normal 0.999682 -0.025211 0 + outer loop + vertex 2.35368 0.337466 0.489362 + vertex 2.3542 0.358076 -0.510638 + vertex 2.3542 0.358076 0.489362 + endloop + endfacet + facet normal 0.997092 -0.0762033 0 + outer loop + vertex 2.3542 0.358076 0.489362 + vertex 2.3542 0.358076 -0.510638 + vertex 2.35575 0.378291 -0.510638 + endloop + endfacet + facet normal 0.997092 -0.0762033 0 + outer loop + vertex 2.3542 0.358076 0.489362 + vertex 2.35575 0.378291 -0.510638 + vertex 2.35575 0.378291 0.489362 + endloop + endfacet + facet normal 0.991818 -0.127662 0 + outer loop + vertex 2.35575 0.378291 0.489362 + vertex 2.35575 0.378291 -0.510638 + vertex 2.3583 0.39809 -0.510638 + endloop + endfacet + facet normal 0.991818 -0.127662 0 + outer loop + vertex 2.35575 0.378291 0.489362 + vertex 2.3583 0.39809 -0.510638 + vertex 2.3583 0.39809 0.489362 + endloop + endfacet + facet normal 0.983779 -0.179386 0 + outer loop + vertex 2.3583 0.39809 0.489362 + vertex 2.3583 0.39809 -0.510638 + vertex 2.36183 0.417452 -0.510638 + endloop + endfacet + facet normal 0.983779 -0.179386 0 + outer loop + vertex 2.3583 0.39809 0.489362 + vertex 2.36183 0.417452 -0.510638 + vertex 2.36183 0.417452 0.489362 + endloop + endfacet + facet normal 0.972921 -0.231139 0 + outer loop + vertex 2.36183 0.417452 0.489362 + vertex 2.36183 0.417452 -0.510638 + vertex 2.36632 0.436355 -0.510638 + endloop + endfacet + facet normal 0.972921 -0.231139 0 + outer loop + vertex 2.36183 0.417452 0.489362 + vertex 2.36632 0.436355 -0.510638 + vertex 2.36632 0.436355 0.489362 + endloop + endfacet + facet normal 0.959208 -0.282702 0 + outer loop + vertex 2.36632 0.436355 0.489362 + vertex 2.36632 0.436355 -0.510638 + vertex 2.37175 0.454778 -0.510638 + endloop + endfacet + facet normal 0.959208 -0.282702 0 + outer loop + vertex 2.36632 0.436355 0.489362 + vertex 2.37175 0.454778 -0.510638 + vertex 2.37175 0.454778 0.489362 + endloop + endfacet + facet normal 0.942629 -0.333842 0 + outer loop + vertex 2.37175 0.454778 0.489362 + vertex 2.37175 0.454778 -0.510638 + vertex 2.37809 0.4727 -0.510638 + endloop + endfacet + facet normal 0.942629 -0.333842 0 + outer loop + vertex 2.37175 0.454778 0.489362 + vertex 2.37809 0.4727 -0.510638 + vertex 2.37809 0.4727 0.489362 + endloop + endfacet + facet normal 0.923203 -0.384312 0 + outer loop + vertex 2.37809 0.4727 0.489362 + vertex 2.37809 0.4727 -0.510638 + vertex 2.38534 0.490099 -0.510638 + endloop + endfacet + facet normal 0.923203 -0.384312 0 + outer loop + vertex 2.37809 0.4727 0.489362 + vertex 2.38534 0.490099 -0.510638 + vertex 2.38534 0.490099 0.489362 + endloop + endfacet + facet normal 0.90097 -0.433882 0 + outer loop + vertex 2.38534 0.490099 0.489362 + vertex 2.38534 0.490099 -0.510638 + vertex 2.39345 0.506954 -0.510638 + endloop + endfacet + facet normal 0.90097 -0.433882 0 + outer loop + vertex 2.38534 0.490099 0.489362 + vertex 2.39345 0.506954 -0.510638 + vertex 2.39345 0.506954 0.489362 + endloop + endfacet + facet normal 0.875979 -0.482348 0 + outer loop + vertex 2.39345 0.506954 0.489362 + vertex 2.39345 0.506954 -0.510638 + vertex 2.40242 0.523244 -0.510638 + endloop + endfacet + facet normal 0.875979 -0.482348 0 + outer loop + vertex 2.39345 0.506954 0.489362 + vertex 2.40242 0.523244 -0.510638 + vertex 2.40242 0.523244 0.489362 + endloop + endfacet + facet normal 0.848327 -0.529472 0 + outer loop + vertex 2.40242 0.523244 0.489362 + vertex 2.40242 0.523244 -0.510638 + vertex 2.41222 0.538947 -0.510638 + endloop + endfacet + facet normal 0.848327 -0.529472 0 + outer loop + vertex 2.40242 0.523244 0.489362 + vertex 2.41222 0.538947 -0.510638 + vertex 2.41222 0.538947 0.489362 + endloop + endfacet + facet normal 0.818116 -0.575053 0 + outer loop + vertex 2.41222 0.538947 0.489362 + vertex 2.41222 0.538947 -0.510638 + vertex 2.42283 0.554042 -0.510638 + endloop + endfacet + facet normal 0.818116 -0.575053 0 + outer loop + vertex 2.41222 0.538947 0.489362 + vertex 2.42283 0.554042 -0.510638 + vertex 2.42283 0.554042 0.489362 + endloop + endfacet + facet normal 0.785465 -0.618906 0 + outer loop + vertex 2.42283 0.554042 0.489362 + vertex 2.42283 0.554042 -0.510638 + vertex 2.43423 0.568508 -0.510638 + endloop + endfacet + facet normal 0.785465 -0.618906 0 + outer loop + vertex 2.42283 0.554042 0.489362 + vertex 2.43423 0.568508 -0.510638 + vertex 2.43423 0.568508 0.489362 + endloop + endfacet + facet normal 0.75051 -0.660859 0 + outer loop + vertex 2.43423 0.568508 0.489362 + vertex 2.43423 0.568508 -0.510638 + vertex 2.4464 0.582323 -0.510638 + endloop + endfacet + facet normal 0.75051 -0.660859 0 + outer loop + vertex 2.43423 0.568508 0.489362 + vertex 2.4464 0.582323 -0.510638 + vertex 2.4464 0.582323 0.489362 + endloop + endfacet + facet normal 0.713415 -0.700742 0 + outer loop + vertex 2.4464 0.582323 0.489362 + vertex 2.4464 0.582323 -0.510638 + vertex 2.45931 0.595466 -0.510638 + endloop + endfacet + facet normal 0.713415 -0.700742 0 + outer loop + vertex 2.4464 0.582323 0.489362 + vertex 2.45931 0.595466 -0.510638 + vertex 2.45931 0.595466 0.489362 + endloop + endfacet + facet normal 0.674336 -0.738424 0 + outer loop + vertex 2.45931 0.595466 0.489362 + vertex 2.45931 0.595466 -0.510638 + vertex 2.47294 0.607916 -0.510638 + endloop + endfacet + facet normal 0.674336 -0.738424 0 + outer loop + vertex 2.45931 0.595466 0.489362 + vertex 2.47294 0.607916 -0.510638 + vertex 2.47294 0.607916 0.489362 + endloop + endfacet + facet normal 0.63345 -0.773783 0 + outer loop + vertex 2.47294 0.607916 0.489362 + vertex 2.47294 0.607916 -0.510638 + vertex 2.48728 0.619651 -0.510638 + endloop + endfacet + facet normal 0.63345 -0.773783 0 + outer loop + vertex 2.47294 0.607916 0.489362 + vertex 2.48728 0.619651 -0.510638 + vertex 2.48728 0.619651 0.489362 + endloop + endfacet + facet normal 0.590946 -0.806711 0 + outer loop + vertex 2.48728 0.619651 0.489362 + vertex 2.48728 0.619651 -0.510638 + vertex 2.50229 0.63065 -0.510638 + endloop + endfacet + facet normal 0.590946 -0.806711 0 + outer loop + vertex 2.48728 0.619651 0.489362 + vertex 2.50229 0.63065 -0.510638 + vertex 2.50229 0.63065 0.489362 + endloop + endfacet + facet normal 0.547012 -0.837125 0 + outer loop + vertex 2.50229 0.63065 0.489362 + vertex 2.50229 0.63065 -0.510638 + vertex 2.51796 0.640892 -0.510638 + endloop + endfacet + facet normal 0.547012 -0.837125 0 + outer loop + vertex 2.50229 0.63065 0.489362 + vertex 2.51796 0.640892 -0.510638 + vertex 2.51796 0.640892 0.489362 + endloop + endfacet + facet normal 0.501829 -0.864967 0 + outer loop + vertex 2.51796 0.640892 0.489362 + vertex 2.51796 0.640892 -0.510638 + vertex 2.53428 0.650355 -0.510638 + endloop + endfacet + facet normal 0.501829 -0.864967 0 + outer loop + vertex 2.51796 0.640892 0.489362 + vertex 2.53428 0.650355 -0.510638 + vertex 2.53428 0.650355 0.489362 + endloop + endfacet + facet normal 0.455607 -0.890181 0 + outer loop + vertex 2.53428 0.650355 0.489362 + vertex 2.53428 0.650355 -0.510638 + vertex 2.5512 0.659018 -0.510638 + endloop + endfacet + facet normal 0.455607 -0.890181 0 + outer loop + vertex 2.53428 0.650355 0.489362 + vertex 2.5512 0.659018 -0.510638 + vertex 2.5512 0.659018 0.489362 + endloop + endfacet + facet normal 0.408526 -0.912747 0 + outer loop + vertex 2.5512 0.659018 0.489362 + vertex 2.5512 0.659018 -0.510638 + vertex 2.56872 0.66686 -0.510638 + endloop + endfacet + facet normal 0.408526 -0.912747 0 + outer loop + vertex 2.5512 0.659018 0.489362 + vertex 2.56872 0.66686 -0.510638 + vertex 2.56872 0.66686 0.489362 + endloop + endfacet + facet normal 0.36079 -0.932647 0 + outer loop + vertex 2.56872 0.66686 0.489362 + vertex 2.56872 0.66686 -0.510638 + vertex 2.58681 0.673859 -0.510638 + endloop + endfacet + facet normal 0.36079 -0.932647 0 + outer loop + vertex 2.56872 0.66686 0.489362 + vertex 2.58681 0.673859 -0.510638 + vertex 2.58681 0.673859 0.489362 + endloop + endfacet + facet normal 0.312583 -0.94989 0 + outer loop + vertex 2.58681 0.673859 0.489362 + vertex 2.58681 0.673859 -0.510638 + vertex 2.60546 0.679994 -0.510638 + endloop + endfacet + facet normal 0.312583 -0.94989 0 + outer loop + vertex 2.58681 0.673859 0.489362 + vertex 2.60546 0.679994 -0.510638 + vertex 2.60546 0.679994 0.489362 + endloop + endfacet + facet normal 0.264089 -0.964498 0 + outer loop + vertex 2.60546 0.679994 0.489362 + vertex 2.60546 0.679994 -0.510638 + vertex 2.62463 0.685244 -0.510638 + endloop + endfacet + facet normal 0.264089 -0.964498 0 + outer loop + vertex 2.60546 0.679994 0.489362 + vertex 2.62463 0.685244 -0.510638 + vertex 2.62463 0.685244 0.489362 + endloop + endfacet + facet normal 0.215493 -0.976505 0 + outer loop + vertex 2.62463 0.685244 0.489362 + vertex 2.62463 0.685244 -0.510638 + vertex 2.64431 0.689587 -0.510638 + endloop + endfacet + facet normal 0.215493 -0.976505 0 + outer loop + vertex 2.62463 0.685244 0.489362 + vertex 2.64431 0.689587 -0.510638 + vertex 2.64431 0.689587 0.489362 + endloop + endfacet + facet normal 0.166963 -0.985963 0 + outer loop + vertex 2.64431 0.689587 0.489362 + vertex 2.64431 0.689587 -0.510638 + vertex 2.66448 0.693002 -0.510638 + endloop + endfacet + facet normal 0.166963 -0.985963 0 + outer loop + vertex 2.64431 0.689587 0.489362 + vertex 2.66448 0.693002 -0.510638 + vertex 2.66448 0.693002 0.489362 + endloop + endfacet + facet normal 0.118669 -0.992934 0 + outer loop + vertex 2.66448 0.693002 0.489362 + vertex 2.66448 0.693002 -0.510638 + vertex 2.68511 0.695468 -0.510638 + endloop + endfacet + facet normal 0.118669 -0.992934 0 + outer loop + vertex 2.66448 0.693002 0.489362 + vertex 2.68511 0.695468 -0.510638 + vertex 2.68511 0.695468 0.489362 + endloop + endfacet + facet normal 0.0707659 -0.997493 0 + outer loop + vertex 2.68511 0.695468 0.489362 + vertex 2.68511 0.695468 -0.510638 + vertex 2.70619 0.696963 -0.510638 + endloop + endfacet + facet normal 0.0707659 -0.997493 0 + outer loop + vertex 2.68511 0.695468 0.489362 + vertex 2.70619 0.696963 -0.510638 + vertex 2.70619 0.696963 0.489362 + endloop + endfacet + facet normal 0.0233987 -0.999726 0 + outer loop + vertex 2.70619 0.696963 0.489362 + vertex 2.70619 0.696963 -0.510638 + vertex 2.72768 0.697466 -0.510638 + endloop + endfacet + facet normal 0.0233987 -0.999726 0 + outer loop + vertex 2.70619 0.696963 0.489362 + vertex 2.72768 0.697466 -0.510638 + vertex 2.72768 0.697466 0.489362 + endloop + endfacet + facet normal -0.00810214 -0.999967 -0 + outer loop + vertex 2.72768 0.697466 0.489362 + vertex 2.72768 0.697466 -0.510638 + vertex 2.73469 0.69741 -0.510638 + endloop + endfacet + facet normal -0.00810214 -0.999967 0 + outer loop + vertex 2.72768 0.697466 0.489362 + vertex 2.73469 0.69741 -0.510638 + vertex 2.73469 0.69741 0.489362 + endloop + endfacet + facet normal -0.0244107 -0.999702 -0 + outer loop + vertex 2.73469 0.69741 0.489362 + vertex 2.73469 0.69741 -0.510638 + vertex 2.7417 0.697238 -0.510638 + endloop + endfacet + facet normal -0.0244107 -0.999702 0 + outer loop + vertex 2.73469 0.69741 0.489362 + vertex 2.7417 0.697238 -0.510638 + vertex 2.7417 0.697238 0.489362 + endloop + endfacet + facet normal -0.0407653 -0.999169 -0 + outer loop + vertex 2.7417 0.697238 0.489362 + vertex 2.7417 0.697238 -0.510638 + vertex 2.74873 0.696952 -0.510638 + endloop + endfacet + facet normal -0.0407653 -0.999169 0 + outer loop + vertex 2.7417 0.697238 0.489362 + vertex 2.74873 0.696952 -0.510638 + vertex 2.74873 0.696952 0.489362 + endloop + endfacet + facet normal -0.0571262 -0.998367 -0 + outer loop + vertex 2.74873 0.696952 0.489362 + vertex 2.74873 0.696952 -0.510638 + vertex 2.75578 0.696548 -0.510638 + endloop + endfacet + facet normal -0.0571262 -0.998367 0 + outer loop + vertex 2.74873 0.696952 0.489362 + vertex 2.75578 0.696548 -0.510638 + vertex 2.75578 0.696548 0.489362 + endloop + endfacet + facet normal -0.0734577 -0.997298 -0 + outer loop + vertex 2.75578 0.696548 0.489362 + vertex 2.75578 0.696548 -0.510638 + vertex 2.76286 0.696027 -0.510638 + endloop + endfacet + facet normal -0.0734577 -0.997298 0 + outer loop + vertex 2.75578 0.696548 0.489362 + vertex 2.76286 0.696027 -0.510638 + vertex 2.76286 0.696027 0.489362 + endloop + endfacet + facet normal -0.0897126 -0.995968 -0 + outer loop + vertex 2.76286 0.696027 0.489362 + vertex 2.76286 0.696027 -0.510638 + vertex 2.76997 0.695386 -0.510638 + endloop + endfacet + facet normal -0.0897126 -0.995968 0 + outer loop + vertex 2.76286 0.696027 0.489362 + vertex 2.76997 0.695386 -0.510638 + vertex 2.76997 0.695386 0.489362 + endloop + endfacet + facet normal -0.105842 -0.994383 -0 + outer loop + vertex 2.76997 0.695386 0.489362 + vertex 2.76997 0.695386 -0.510638 + vertex 2.77711 0.694626 -0.510638 + endloop + endfacet + facet normal -0.105842 -0.994383 0 + outer loop + vertex 2.76997 0.695386 0.489362 + vertex 2.77711 0.694626 -0.510638 + vertex 2.77711 0.694626 0.489362 + endloop + endfacet + facet normal -0.121808 -0.992554 -0 + outer loop + vertex 2.77711 0.694626 0.489362 + vertex 2.77711 0.694626 -0.510638 + vertex 2.78429 0.693745 -0.510638 + endloop + endfacet + facet normal -0.121808 -0.992554 0 + outer loop + vertex 2.77711 0.694626 0.489362 + vertex 2.78429 0.693745 -0.510638 + vertex 2.78429 0.693745 0.489362 + endloop + endfacet + facet normal -0.137563 -0.990493 -0 + outer loop + vertex 2.78429 0.693745 0.489362 + vertex 2.78429 0.693745 -0.510638 + vertex 2.79152 0.692741 -0.510638 + endloop + endfacet + facet normal -0.137563 -0.990493 0 + outer loop + vertex 2.78429 0.693745 0.489362 + vertex 2.79152 0.692741 -0.510638 + vertex 2.79152 0.692741 0.489362 + endloop + endfacet + facet normal -0.153082 -0.988213 -0 + outer loop + vertex 2.79152 0.692741 0.489362 + vertex 2.79152 0.692741 -0.510638 + vertex 2.79879 0.691615 -0.510638 + endloop + endfacet + facet normal -0.153082 -0.988213 0 + outer loop + vertex 2.79152 0.692741 0.489362 + vertex 2.79879 0.691615 -0.510638 + vertex 2.79879 0.691615 0.489362 + endloop + endfacet + facet normal -0.168327 -0.985731 -0 + outer loop + vertex 2.79879 0.691615 0.489362 + vertex 2.79879 0.691615 -0.510638 + vertex 2.80612 0.690363 -0.510638 + endloop + endfacet + facet normal -0.168327 -0.985731 0 + outer loop + vertex 2.79879 0.691615 0.489362 + vertex 2.80612 0.690363 -0.510638 + vertex 2.80612 0.690363 0.489362 + endloop + endfacet + facet normal -0.183271 -0.983062 -0 + outer loop + vertex 2.80612 0.690363 0.489362 + vertex 2.80612 0.690363 -0.510638 + vertex 2.81351 0.688986 -0.510638 + endloop + endfacet + facet normal -0.183271 -0.983062 0 + outer loop + vertex 2.80612 0.690363 0.489362 + vertex 2.81351 0.688986 -0.510638 + vertex 2.81351 0.688986 0.489362 + endloop + endfacet + facet normal -0.197873 -0.980228 -0 + outer loop + vertex 2.81351 0.688986 0.489362 + vertex 2.81351 0.688986 -0.510638 + vertex 2.82095 0.687483 -0.510638 + endloop + endfacet + facet normal -0.197873 -0.980228 0 + outer loop + vertex 2.81351 0.688986 0.489362 + vertex 2.82095 0.687483 -0.510638 + vertex 2.82095 0.687483 0.489362 + endloop + endfacet + facet normal -0.212123 -0.977243 -0 + outer loop + vertex 2.82095 0.687483 0.489362 + vertex 2.82095 0.687483 -0.510638 + vertex 2.82847 0.685852 -0.510638 + endloop + endfacet + facet normal -0.212123 -0.977243 0 + outer loop + vertex 2.82095 0.687483 0.489362 + vertex 2.82847 0.685852 -0.510638 + vertex 2.82847 0.685852 0.489362 + endloop + endfacet + facet normal -0.225986 -0.974131 -0 + outer loop + vertex 2.82847 0.685852 0.489362 + vertex 2.82847 0.685852 -0.510638 + vertex 2.83606 0.684091 -0.510638 + endloop + endfacet + facet normal -0.225986 -0.974131 0 + outer loop + vertex 2.82847 0.685852 0.489362 + vertex 2.83606 0.684091 -0.510638 + vertex 2.83606 0.684091 0.489362 + endloop + endfacet + facet normal -0.23945 -0.970909 -0 + outer loop + vertex 2.83606 0.684091 0.489362 + vertex 2.83606 0.684091 -0.510638 + vertex 2.84372 0.682201 -0.510638 + endloop + endfacet + facet normal -0.23945 -0.970909 0 + outer loop + vertex 2.83606 0.684091 0.489362 + vertex 2.84372 0.682201 -0.510638 + vertex 2.84372 0.682201 0.489362 + endloop + endfacet + facet normal -0.252509 -0.967594 -0 + outer loop + vertex 2.84372 0.682201 0.489362 + vertex 2.84372 0.682201 -0.510638 + vertex 2.85147 0.68018 -0.510638 + endloop + endfacet + facet normal -0.252509 -0.967594 0 + outer loop + vertex 2.84372 0.682201 0.489362 + vertex 2.85147 0.68018 -0.510638 + vertex 2.85147 0.68018 0.489362 + endloop + endfacet + facet normal -0.265145 -0.964209 -0 + outer loop + vertex 2.85147 0.68018 0.489362 + vertex 2.85147 0.68018 -0.510638 + vertex 2.8593 0.678026 -0.510638 + endloop + endfacet + facet normal -0.265145 -0.964209 0 + outer loop + vertex 2.85147 0.68018 0.489362 + vertex 2.8593 0.678026 -0.510638 + vertex 2.8593 0.678026 0.489362 + endloop + endfacet + facet normal -0.277341 -0.960772 -0 + outer loop + vertex 2.8593 0.678026 0.489362 + vertex 2.8593 0.678026 -0.510638 + vertex 2.86722 0.67574 -0.510638 + endloop + endfacet + facet normal -0.277341 -0.960772 0 + outer loop + vertex 2.8593 0.678026 0.489362 + vertex 2.86722 0.67574 -0.510638 + vertex 2.86722 0.67574 0.489362 + endloop + endfacet + facet normal -0.289106 -0.957297 -0 + outer loop + vertex 2.86722 0.67574 0.489362 + vertex 2.86722 0.67574 -0.510638 + vertex 2.87524 0.673318 -0.510638 + endloop + endfacet + facet normal -0.289106 -0.957297 0 + outer loop + vertex 2.86722 0.67574 0.489362 + vertex 2.87524 0.673318 -0.510638 + vertex 2.87524 0.673318 0.489362 + endloop + endfacet + facet normal -0.300432 -0.953803 -0 + outer loop + vertex 2.87524 0.673318 0.489362 + vertex 2.87524 0.673318 -0.510638 + vertex 2.88335 0.670761 -0.510638 + endloop + endfacet + facet normal -0.300432 -0.953803 0 + outer loop + vertex 2.87524 0.673318 0.489362 + vertex 2.88335 0.670761 -0.510638 + vertex 2.88335 0.670761 0.489362 + endloop + endfacet + facet normal -0.311317 -0.950306 -0 + outer loop + vertex 2.88335 0.670761 0.489362 + vertex 2.88335 0.670761 -0.510638 + vertex 2.89158 0.668068 -0.510638 + endloop + endfacet + facet normal -0.311317 -0.950306 0 + outer loop + vertex 2.88335 0.670761 0.489362 + vertex 2.89158 0.668068 -0.510638 + vertex 2.89158 0.668068 0.489362 + endloop + endfacet + facet normal -0.321756 -0.946823 -0 + outer loop + vertex 2.89158 0.668068 0.489362 + vertex 2.89158 0.668068 -0.510638 + vertex 2.89991 0.665237 -0.510638 + endloop + endfacet + facet normal -0.321756 -0.946823 0 + outer loop + vertex 2.89158 0.668068 0.489362 + vertex 2.89991 0.665237 -0.510638 + vertex 2.89991 0.665237 0.489362 + endloop + endfacet + facet normal -0.331766 -0.943362 -0 + outer loop + vertex 2.89991 0.665237 0.489362 + vertex 2.89991 0.665237 -0.510638 + vertex 2.90835 0.662266 -0.510638 + endloop + endfacet + facet normal -0.331766 -0.943362 0 + outer loop + vertex 2.89991 0.665237 0.489362 + vertex 2.90835 0.662266 -0.510638 + vertex 2.90835 0.662266 0.489362 + endloop + endfacet + facet normal -0.341346 -0.939938 -0 + outer loop + vertex 2.90835 0.662266 0.489362 + vertex 2.90835 0.662266 -0.510638 + vertex 2.91692 0.659156 -0.510638 + endloop + endfacet + facet normal -0.341346 -0.939938 0 + outer loop + vertex 2.90835 0.662266 0.489362 + vertex 2.91692 0.659156 -0.510638 + vertex 2.91692 0.659156 0.489362 + endloop + endfacet + facet normal -0.350509 -0.936559 -0 + outer loop + vertex 2.91692 0.659156 0.489362 + vertex 2.91692 0.659156 -0.510638 + vertex 2.92561 0.655905 -0.510638 + endloop + endfacet + facet normal -0.350509 -0.936559 0 + outer loop + vertex 2.91692 0.659156 0.489362 + vertex 2.92561 0.655905 -0.510638 + vertex 2.92561 0.655905 0.489362 + endloop + endfacet + facet normal -0.359251 -0.933241 -0 + outer loop + vertex 2.92561 0.655905 0.489362 + vertex 2.92561 0.655905 -0.510638 + vertex 2.93442 0.652511 -0.510638 + endloop + endfacet + facet normal -0.359251 -0.933241 0 + outer loop + vertex 2.92561 0.655905 0.489362 + vertex 2.93442 0.652511 -0.510638 + vertex 2.93442 0.652511 0.489362 + endloop + endfacet + facet normal -0.367587 -0.929989 -0 + outer loop + vertex 2.93442 0.652511 0.489362 + vertex 2.93442 0.652511 -0.510638 + vertex 2.94337 0.648975 -0.510638 + endloop + endfacet + facet normal -0.367587 -0.929989 0 + outer loop + vertex 2.93442 0.652511 0.489362 + vertex 2.94337 0.648975 -0.510638 + vertex 2.94337 0.648975 0.489362 + endloop + endfacet + facet normal -0.375532 -0.926809 -0 + outer loop + vertex 2.94337 0.648975 0.489362 + vertex 2.94337 0.648975 -0.510638 + vertex 2.95245 0.645293 -0.510638 + endloop + endfacet + facet normal -0.375532 -0.926809 0 + outer loop + vertex 2.94337 0.648975 0.489362 + vertex 2.95245 0.645293 -0.510638 + vertex 2.95245 0.645293 0.489362 + endloop + endfacet + facet normal -0.383085 -0.923713 -0 + outer loop + vertex 2.95245 0.645293 0.489362 + vertex 2.95245 0.645293 -0.510638 + vertex 2.96168 0.641466 -0.510638 + endloop + endfacet + facet normal -0.383085 -0.923713 0 + outer loop + vertex 2.95245 0.645293 0.489362 + vertex 2.96168 0.641466 -0.510638 + vertex 2.96168 0.641466 0.489362 + endloop + endfacet + facet normal -1 0 -0 + outer loop + vertex 2.96168 0.641466 0.489362 + vertex 2.96168 0.641466 -0.510638 + vertex 2.96168 0.536466 -0.510638 + endloop + endfacet + facet normal -1 -0 0 + outer loop + vertex 2.96168 0.641466 0.489362 + vertex 2.96168 0.536466 -0.510638 + vertex 2.96168 0.536466 0.489362 + endloop + endfacet + facet normal 0.498688 0.866782 0 + outer loop + vertex 2.96168 0.536466 0.489362 + vertex 2.96168 0.536466 -0.510638 + vertex 2.95332 0.541277 -0.510638 + endloop + endfacet + facet normal 0.498688 0.866782 0 + outer loop + vertex 2.96168 0.536466 0.489362 + vertex 2.95332 0.541277 -0.510638 + vertex 2.95332 0.541277 0.489362 + endloop + endfacet + facet normal -1 0 -0 + outer loop + vertex 3.18768 0.600466 0.489362 + vertex 3.18768 0.600466 -0.510638 + vertex 3.18768 0.411466 -0.510638 + endloop + endfacet + facet normal -1 -0 0 + outer loop + vertex 3.18768 0.600466 0.489362 + vertex 3.18768 0.411466 -0.510638 + vertex 3.18768 0.411466 0.489362 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 3.18768 0.411466 0.489362 + vertex 3.18768 0.411466 -0.510638 + vertex 3.45368 0.411466 -0.510638 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 3.18768 0.411466 0.489362 + vertex 3.45368 0.411466 -0.510638 + vertex 3.45368 0.411466 0.489362 + endloop + endfacet + facet normal -1 0 -0 + outer loop + vertex 3.45368 0.411466 0.489362 + vertex 3.45368 0.411466 -0.510638 + vertex 3.45368 0.323466 -0.510638 + endloop + endfacet + facet normal -1 -0 0 + outer loop + vertex 3.45368 0.411466 0.489362 + vertex 3.45368 0.323466 -0.510638 + vertex 3.45368 0.323466 0.489362 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex 3.45368 0.323466 0.489362 + vertex 3.45368 0.323466 -0.510638 + vertex 3.18768 0.323466 -0.510638 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex 3.45368 0.323466 0.489362 + vertex 3.18768 0.323466 -0.510638 + vertex 3.18768 0.323466 0.489362 + endloop + endfacet + facet normal -1 0 -0 + outer loop + vertex 3.18768 0.323466 0.489362 + vertex 3.18768 0.323466 -0.510638 + vertex 3.18768 0.00646639 -0.510638 + endloop + endfacet + facet normal -1 -0 0 + outer loop + vertex 3.18768 0.323466 0.489362 + vertex 3.18768 0.00646639 -0.510638 + vertex 3.18768 0.00646639 0.489362 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex 3.18768 0.00646639 0.489362 + vertex 3.18768 0.00646639 -0.510638 + vertex 3.08968 0.00646639 -0.510638 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex 3.18768 0.00646639 0.489362 + vertex 3.08968 0.00646639 -0.510638 + vertex 3.08968 0.00646639 0.489362 + endloop + endfacet + facet normal 1 0 0 + outer loop + vertex 3.08968 0.00646639 0.489362 + vertex 3.08968 0.00646639 -0.510638 + vertex 3.08968 0.688466 -0.510638 + endloop + endfacet + facet normal 1 -0 0 + outer loop + vertex 3.08968 0.00646639 0.489362 + vertex 3.08968 0.688466 -0.510638 + vertex 3.08968 0.688466 0.489362 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 3.08968 0.688466 0.489362 + vertex 3.08968 0.688466 -0.510638 + vertex 3.45368 0.688466 -0.510638 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 3.08968 0.688466 0.489362 + vertex 3.45368 0.688466 -0.510638 + vertex 3.45368 0.688466 0.489362 + endloop + endfacet + facet normal -1 0 -0 + outer loop + vertex 3.45368 0.688466 0.489362 + vertex 3.45368 0.688466 -0.510638 + vertex 3.45368 0.600466 -0.510638 + endloop + endfacet + facet normal -1 -0 0 + outer loop + vertex 3.45368 0.688466 0.489362 + vertex 3.45368 0.600466 -0.510638 + vertex 3.45368 0.600466 0.489362 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex 3.45368 0.600466 0.489362 + vertex 3.45368 0.600466 -0.510638 + vertex 3.18768 0.600466 -0.510638 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex 3.45368 0.600466 0.489362 + vertex 3.18768 0.600466 -0.510638 + vertex 3.18768 0.600466 0.489362 + endloop + endfacet + facet normal -0.023964 -0.999713 -0 + outer loop + vertex 3.82368 0.688466 0.489362 + vertex 3.82368 0.688466 -0.510638 + vertex 3.84841 0.687874 -0.510638 + endloop + endfacet + facet normal -0.023964 -0.999713 0 + outer loop + vertex 3.82368 0.688466 0.489362 + vertex 3.84841 0.687874 -0.510638 + vertex 3.84841 0.687874 0.489362 + endloop + endfacet + facet normal -0.0732709 -0.997312 -0 + outer loop + vertex 3.84841 0.687874 0.489362 + vertex 3.84841 0.687874 -0.510638 + vertex 3.87221 0.686125 -0.510638 + endloop + endfacet + facet normal -0.0732709 -0.997312 0 + outer loop + vertex 3.84841 0.687874 0.489362 + vertex 3.87221 0.686125 -0.510638 + vertex 3.87221 0.686125 0.489362 + endloop + endfacet + facet normal -0.124081 -0.992272 -0 + outer loop + vertex 3.87221 0.686125 0.489362 + vertex 3.87221 0.686125 -0.510638 + vertex 3.89508 0.683265 -0.510638 + endloop + endfacet + facet normal -0.124081 -0.992272 0 + outer loop + vertex 3.87221 0.686125 0.489362 + vertex 3.89508 0.683265 -0.510638 + vertex 3.89508 0.683265 0.489362 + endloop + endfacet + facet normal -0.176114 -0.98437 -0 + outer loop + vertex 3.89508 0.683265 0.489362 + vertex 3.89508 0.683265 -0.510638 + vertex 3.91703 0.679338 -0.510638 + endloop + endfacet + facet normal -0.176114 -0.98437 0 + outer loop + vertex 3.89508 0.683265 0.489362 + vertex 3.91703 0.679338 -0.510638 + vertex 3.91703 0.679338 0.489362 + endloop + endfacet + facet normal -0.229054 -0.973414 -0 + outer loop + vertex 3.91703 0.679338 0.489362 + vertex 3.91703 0.679338 -0.510638 + vertex 3.93807 0.674388 -0.510638 + endloop + endfacet + facet normal -0.229054 -0.973414 0 + outer loop + vertex 3.91703 0.679338 0.489362 + vertex 3.93807 0.674388 -0.510638 + vertex 3.93807 0.674388 0.489362 + endloop + endfacet + facet normal -0.282534 -0.959257 -0 + outer loop + vertex 3.93807 0.674388 0.489362 + vertex 3.93807 0.674388 -0.510638 + vertex 3.9582 0.668458 -0.510638 + endloop + endfacet + facet normal -0.282534 -0.959257 0 + outer loop + vertex 3.93807 0.674388 0.489362 + vertex 3.9582 0.668458 -0.510638 + vertex 3.9582 0.668458 0.489362 + endloop + endfacet + facet normal -0.33615 -0.941808 -0 + outer loop + vertex 3.9582 0.668458 0.489362 + vertex 3.9582 0.668458 -0.510638 + vertex 3.97743 0.661594 -0.510638 + endloop + endfacet + facet normal -0.33615 -0.941808 0 + outer loop + vertex 3.9582 0.668458 0.489362 + vertex 3.97743 0.661594 -0.510638 + vertex 3.97743 0.661594 0.489362 + endloop + endfacet + facet normal -0.389475 -0.921037 -0 + outer loop + vertex 3.97743 0.661594 0.489362 + vertex 3.97743 0.661594 -0.510638 + vertex 3.99577 0.65384 -0.510638 + endloop + endfacet + facet normal -0.389475 -0.921037 0 + outer loop + vertex 3.97743 0.661594 0.489362 + vertex 3.99577 0.65384 -0.510638 + vertex 3.99577 0.65384 0.489362 + endloop + endfacet + facet normal -0.442072 -0.89698 -0 + outer loop + vertex 3.99577 0.65384 0.489362 + vertex 3.99577 0.65384 -0.510638 + vertex 4.01322 0.645239 -0.510638 + endloop + endfacet + facet normal -0.442072 -0.89698 0 + outer loop + vertex 3.99577 0.65384 0.489362 + vertex 4.01322 0.645239 -0.510638 + vertex 4.01322 0.645239 0.489362 + endloop + endfacet + facet normal -0.493504 -0.869743 -0 + outer loop + vertex 4.01322 0.645239 0.489362 + vertex 4.01322 0.645239 -0.510638 + vertex 4.02979 0.635837 -0.510638 + endloop + endfacet + facet normal -0.493504 -0.869743 0 + outer loop + vertex 4.01322 0.645239 0.489362 + vertex 4.02979 0.635837 -0.510638 + vertex 4.02979 0.635837 0.489362 + endloop + endfacet + facet normal -0.54336 -0.8395 -0 + outer loop + vertex 4.02979 0.635837 0.489362 + vertex 4.02979 0.635837 -0.510638 + vertex 4.04549 0.625676 -0.510638 + endloop + endfacet + facet normal -0.54336 -0.8395 0 + outer loop + vertex 4.02979 0.635837 0.489362 + vertex 4.04549 0.625676 -0.510638 + vertex 4.04549 0.625676 0.489362 + endloop + endfacet + facet normal -0.591288 -0.806461 -0 + outer loop + vertex 4.04549 0.625676 0.489362 + vertex 4.04549 0.625676 -0.510638 + vertex 4.06032 0.614802 -0.510638 + endloop + endfacet + facet normal -0.591288 -0.806461 0 + outer loop + vertex 4.04549 0.625676 0.489362 + vertex 4.06032 0.614802 -0.510638 + vertex 4.06032 0.614802 0.489362 + endloop + endfacet + facet normal -0.636939 -0.770915 -0 + outer loop + vertex 4.06032 0.614802 0.489362 + vertex 4.06032 0.614802 -0.510638 + vertex 4.07429 0.603259 -0.510638 + endloop + endfacet + facet normal -0.636939 -0.770915 0 + outer loop + vertex 4.06032 0.614802 0.489362 + vertex 4.07429 0.603259 -0.510638 + vertex 4.07429 0.603259 0.489362 + endloop + endfacet + facet normal -0.680079 -0.733139 -0 + outer loop + vertex 4.07429 0.603259 0.489362 + vertex 4.07429 0.603259 -0.510638 + vertex 4.08741 0.591091 -0.510638 + endloop + endfacet + facet normal -0.680079 -0.733139 0 + outer loop + vertex 4.07429 0.603259 0.489362 + vertex 4.08741 0.591091 -0.510638 + vertex 4.08741 0.591091 0.489362 + endloop + endfacet + facet normal -0.720495 -0.69346 -0 + outer loop + vertex 4.08741 0.591091 0.489362 + vertex 4.08741 0.591091 -0.510638 + vertex 4.09968 0.578341 -0.510638 + endloop + endfacet + facet normal -0.720495 -0.69346 0 + outer loop + vertex 4.08741 0.591091 0.489362 + vertex 4.09968 0.578341 -0.510638 + vertex 4.09968 0.578341 0.489362 + endloop + endfacet + facet normal -0.758035 -0.652214 -0 + outer loop + vertex 4.09968 0.578341 0.489362 + vertex 4.09968 0.578341 -0.510638 + vertex 4.11111 0.565055 -0.510638 + endloop + endfacet + facet normal -0.758035 -0.652214 0 + outer loop + vertex 4.09968 0.578341 0.489362 + vertex 4.11111 0.565055 -0.510638 + vertex 4.11111 0.565055 0.489362 + endloop + endfacet + facet normal -0.792653 -0.609673 -0 + outer loop + vertex 4.11111 0.565055 0.489362 + vertex 4.11111 0.565055 -0.510638 + vertex 4.12171 0.551277 -0.510638 + endloop + endfacet + facet normal -0.792653 -0.609673 0 + outer loop + vertex 4.11111 0.565055 0.489362 + vertex 4.12171 0.551277 -0.510638 + vertex 4.12171 0.551277 0.489362 + endloop + endfacet + facet normal -0.824297 -0.566157 -0 + outer loop + vertex 4.12171 0.551277 0.489362 + vertex 4.12171 0.551277 -0.510638 + vertex 4.13148 0.53705 -0.510638 + endloop + endfacet + facet normal -0.824297 -0.566157 0 + outer loop + vertex 4.12171 0.551277 0.489362 + vertex 4.13148 0.53705 -0.510638 + vertex 4.13148 0.53705 0.489362 + endloop + endfacet + facet normal -0.853016 -0.521885 -0 + outer loop + vertex 4.13148 0.53705 0.489362 + vertex 4.13148 0.53705 -0.510638 + vertex 4.14043 0.52242 -0.510638 + endloop + endfacet + facet normal -0.853016 -0.521885 0 + outer loop + vertex 4.13148 0.53705 0.489362 + vertex 4.14043 0.52242 -0.510638 + vertex 4.14043 0.52242 0.489362 + endloop + endfacet + facet normal -0.878852 -0.477095 -0 + outer loop + vertex 4.14043 0.52242 0.489362 + vertex 4.14043 0.52242 -0.510638 + vertex 4.14857 0.507429 -0.510638 + endloop + endfacet + facet normal -0.878852 -0.477095 0 + outer loop + vertex 4.14043 0.52242 0.489362 + vertex 4.14857 0.507429 -0.510638 + vertex 4.14857 0.507429 0.489362 + endloop + endfacet + facet normal -0.901889 -0.431967 -0 + outer loop + vertex 4.14857 0.507429 0.489362 + vertex 4.14857 0.507429 -0.510638 + vertex 4.1559 0.492123 -0.510638 + endloop + endfacet + facet normal -0.901889 -0.431967 0 + outer loop + vertex 4.14857 0.507429 0.489362 + vertex 4.1559 0.492123 -0.510638 + vertex 4.1559 0.492123 0.489362 + endloop + endfacet + facet normal -0.922219 -0.386668 -0 + outer loop + vertex 4.1559 0.492123 0.489362 + vertex 4.1559 0.492123 -0.510638 + vertex 4.16243 0.476546 -0.510638 + endloop + endfacet + facet normal -0.922219 -0.386668 0 + outer loop + vertex 4.1559 0.492123 0.489362 + vertex 4.16243 0.476546 -0.510638 + vertex 4.16243 0.476546 0.489362 + endloop + endfacet + facet normal -0.93997 -0.341256 -0 + outer loop + vertex 4.16243 0.476546 0.489362 + vertex 4.16243 0.476546 -0.510638 + vertex 4.16817 0.460742 -0.510638 + endloop + endfacet + facet normal -0.93997 -0.341256 0 + outer loop + vertex 4.16243 0.476546 0.489362 + vertex 4.16817 0.460742 -0.510638 + vertex 4.16817 0.460742 0.489362 + endloop + endfacet + facet normal -0.955243 -0.295823 -0 + outer loop + vertex 4.16817 0.460742 0.489362 + vertex 4.16817 0.460742 -0.510638 + vertex 4.17312 0.444754 -0.510638 + endloop + endfacet + facet normal -0.955243 -0.295823 0 + outer loop + vertex 4.16817 0.460742 0.489362 + vertex 4.17312 0.444754 -0.510638 + vertex 4.17312 0.444754 0.489362 + endloop + endfacet + facet normal -0.968141 -0.250405 -0 + outer loop + vertex 4.17312 0.444754 0.489362 + vertex 4.17312 0.444754 -0.510638 + vertex 4.17729 0.428628 -0.510638 + endloop + endfacet + facet normal -0.968141 -0.250405 0 + outer loop + vertex 4.17312 0.444754 0.489362 + vertex 4.17729 0.428628 -0.510638 + vertex 4.17729 0.428628 0.489362 + endloop + endfacet + facet normal -0.978755 -0.205035 -0 + outer loop + vertex 4.17729 0.428628 0.489362 + vertex 4.17729 0.428628 -0.510638 + vertex 4.18069 0.412408 -0.510638 + endloop + endfacet + facet normal -0.978755 -0.205035 0 + outer loop + vertex 4.17729 0.428628 0.489362 + vertex 4.18069 0.412408 -0.510638 + vertex 4.18069 0.412408 0.489362 + endloop + endfacet + facet normal -0.987175 -0.15964 -0 + outer loop + vertex 4.18069 0.412408 0.489362 + vertex 4.18069 0.412408 -0.510638 + vertex 4.18332 0.396137 -0.510638 + endloop + endfacet + facet normal -0.987175 -0.15964 0 + outer loop + vertex 4.18069 0.412408 0.489362 + vertex 4.18332 0.396137 -0.510638 + vertex 4.18332 0.396137 0.489362 + endloop + endfacet + facet normal -0.993457 -0.114205 -0 + outer loop + vertex 4.18332 0.396137 0.489362 + vertex 4.18332 0.396137 -0.510638 + vertex 4.18519 0.379861 -0.510638 + endloop + endfacet + facet normal -0.993457 -0.114205 0 + outer loop + vertex 4.18332 0.396137 0.489362 + vertex 4.18519 0.379861 -0.510638 + vertex 4.18519 0.379861 0.489362 + endloop + endfacet + facet normal -0.99764 -0.0686685 -0 + outer loop + vertex 4.18519 0.379861 0.489362 + vertex 4.18519 0.379861 -0.510638 + vertex 4.18631 0.363622 -0.510638 + endloop + endfacet + facet normal -0.99764 -0.0686685 0 + outer loop + vertex 4.18519 0.379861 0.489362 + vertex 4.18631 0.363622 -0.510638 + vertex 4.18631 0.363622 0.489362 + endloop + endfacet + facet normal -0.999736 -0.0229563 -0 + outer loop + vertex 4.18631 0.363622 0.489362 + vertex 4.18631 0.363622 -0.510638 + vertex 4.18668 0.347466 -0.510638 + endloop + endfacet + facet normal -0.999736 -0.0229563 0 + outer loop + vertex 4.18631 0.363622 0.489362 + vertex 4.18668 0.347466 -0.510638 + vertex 4.18668 0.347466 0.489362 + endloop + endfacet + facet normal -0.999661 0.0260389 0 + outer loop + vertex 4.18668 0.347466 0.489362 + vertex 4.18668 0.347466 -0.510638 + vertex 4.18623 0.330002 -0.510638 + endloop + endfacet + facet normal -0.999661 0.0260389 0 + outer loop + vertex 4.18668 0.347466 0.489362 + vertex 4.18623 0.330002 -0.510638 + vertex 4.18623 0.330002 0.489362 + endloop + endfacet + facet normal -0.996962 0.0778935 0 + outer loop + vertex 4.18623 0.330002 0.489362 + vertex 4.18623 0.330002 -0.510638 + vertex 4.18487 0.312633 -0.510638 + endloop + endfacet + facet normal -0.996962 0.0778935 0 + outer loop + vertex 4.18623 0.330002 0.489362 + vertex 4.18487 0.312633 -0.510638 + vertex 4.18487 0.312633 0.489362 + endloop + endfacet + facet normal -0.991599 0.129347 0 + outer loop + vertex 4.18487 0.312633 0.489362 + vertex 4.18487 0.312633 -0.510638 + vertex 4.18262 0.295393 -0.510638 + endloop + endfacet + facet normal -0.991599 0.129347 0 + outer loop + vertex 4.18487 0.312633 0.489362 + vertex 4.18262 0.295393 -0.510638 + vertex 4.18262 0.295393 0.489362 + endloop + endfacet + facet normal -0.983616 0.180277 0 + outer loop + vertex 4.18262 0.295393 0.489362 + vertex 4.18262 0.295393 -0.510638 + vertex 4.17949 0.278319 -0.510638 + endloop + endfacet + facet normal -0.983616 0.180277 0 + outer loop + vertex 4.18262 0.295393 0.489362 + vertex 4.17949 0.278319 -0.510638 + vertex 4.17949 0.278319 0.489362 + endloop + endfacet + facet normal -0.973049 0.2306 0 + outer loop + vertex 4.17949 0.278319 0.489362 + vertex 4.17949 0.278319 -0.510638 + vertex 4.17549 0.261443 -0.510638 + endloop + endfacet + facet normal -0.973049 0.2306 0 + outer loop + vertex 4.17949 0.278319 0.489362 + vertex 4.17549 0.261443 -0.510638 + vertex 4.17549 0.261443 0.489362 + endloop + endfacet + facet normal -0.959931 0.280236 0 + outer loop + vertex 4.17549 0.261443 0.489362 + vertex 4.17549 0.261443 -0.510638 + vertex 4.17063 0.244802 -0.510638 + endloop + endfacet + facet normal -0.959931 0.280236 0 + outer loop + vertex 4.17549 0.261443 0.489362 + vertex 4.17063 0.244802 -0.510638 + vertex 4.17063 0.244802 0.489362 + endloop + endfacet + facet normal -0.944284 0.329131 0 + outer loop + vertex 4.17063 0.244802 0.489362 + vertex 4.17063 0.244802 -0.510638 + vertex 4.16493 0.228431 -0.510638 + endloop + endfacet + facet normal -0.944284 0.329131 0 + outer loop + vertex 4.17063 0.244802 0.489362 + vertex 4.16493 0.228431 -0.510638 + vertex 4.16493 0.228431 0.489362 + endloop + endfacet + facet normal -0.926148 0.37716 0 + outer loop + vertex 4.16493 0.228431 0.489362 + vertex 4.16493 0.228431 -0.510638 + vertex 4.15839 0.212364 -0.510638 + endloop + endfacet + facet normal -0.926148 0.37716 0 + outer loop + vertex 4.16493 0.228431 0.489362 + vertex 4.15839 0.212364 -0.510638 + vertex 4.15839 0.212364 0.489362 + endloop + endfacet + facet normal -0.905527 0.424289 0 + outer loop + vertex 4.15839 0.212364 0.489362 + vertex 4.15839 0.212364 -0.510638 + vertex 4.15102 0.196635 -0.510638 + endloop + endfacet + facet normal -0.905527 0.424289 0 + outer loop + vertex 4.15839 0.212364 0.489362 + vertex 4.15102 0.196635 -0.510638 + vertex 4.15102 0.196635 0.489362 + endloop + endfacet + facet normal -0.882448 0.47041 0 + outer loop + vertex 4.15102 0.196635 0.489362 + vertex 4.15102 0.196635 -0.510638 + vertex 4.14283 0.181281 -0.510638 + endloop + endfacet + facet normal -0.882448 0.47041 0 + outer loop + vertex 4.15102 0.196635 0.489362 + vertex 4.14283 0.181281 -0.510638 + vertex 4.14283 0.181281 0.489362 + endloop + endfacet + facet normal -0.856932 0.51543 0 + outer loop + vertex 4.14283 0.181281 0.489362 + vertex 4.14283 0.181281 -0.510638 + vertex 4.13384 0.166336 -0.510638 + endloop + endfacet + facet normal -0.856932 0.51543 0 + outer loop + vertex 4.14283 0.181281 0.489362 + vertex 4.13384 0.166336 -0.510638 + vertex 4.13384 0.166336 0.489362 + endloop + endfacet + facet normal -0.829001 0.559248 0 + outer loop + vertex 4.13384 0.166336 0.489362 + vertex 4.13384 0.166336 -0.510638 + vertex 4.12406 0.151834 -0.510638 + endloop + endfacet + facet normal -0.829001 0.559248 0 + outer loop + vertex 4.13384 0.166336 0.489362 + vertex 4.12406 0.151834 -0.510638 + vertex 4.12406 0.151834 0.489362 + endloop + endfacet + facet normal -0.798682 0.601753 0 + outer loop + vertex 4.12406 0.151834 0.489362 + vertex 4.12406 0.151834 -0.510638 + vertex 4.11349 0.137812 -0.510638 + endloop + endfacet + facet normal -0.798682 0.601753 0 + outer loop + vertex 4.12406 0.151834 0.489362 + vertex 4.11349 0.137812 -0.510638 + vertex 4.11349 0.137812 0.489362 + endloop + endfacet + facet normal -0.765999 0.642842 0 + outer loop + vertex 4.11349 0.137812 0.489362 + vertex 4.11349 0.137812 -0.510638 + vertex 4.10216 0.124302 -0.510638 + endloop + endfacet + facet normal -0.765999 0.642842 0 + outer loop + vertex 4.11349 0.137812 0.489362 + vertex 4.10216 0.124302 -0.510638 + vertex 4.10216 0.124302 0.489362 + endloop + endfacet + facet normal -0.731013 0.682364 0 + outer loop + vertex 4.10216 0.124302 0.489362 + vertex 4.10216 0.124302 -0.510638 + vertex 4.09006 0.111341 -0.510638 + endloop + endfacet + facet normal -0.731013 0.682364 0 + outer loop + vertex 4.10216 0.124302 0.489362 + vertex 4.09006 0.111341 -0.510638 + vertex 4.09006 0.111341 0.489362 + endloop + endfacet + facet normal -0.693787 0.72018 0 + outer loop + vertex 4.09006 0.111341 0.489362 + vertex 4.09006 0.111341 -0.510638 + vertex 4.07721 0.0989639 -0.510638 + endloop + endfacet + facet normal -0.693787 0.72018 0 + outer loop + vertex 4.09006 0.111341 0.489362 + vertex 4.07721 0.0989639 -0.510638 + vertex 4.07721 0.0989639 0.489362 + endloop + endfacet + facet normal -0.654406 0.756144 0 + outer loop + vertex 4.07721 0.0989639 0.489362 + vertex 4.07721 0.0989639 -0.510638 + vertex 4.06362 0.0872046 -0.510638 + endloop + endfacet + facet normal -0.654406 0.756144 0 + outer loop + vertex 4.07721 0.0989639 0.489362 + vertex 4.06362 0.0872046 -0.510638 + vertex 4.06362 0.0872046 0.489362 + endloop + endfacet + facet normal -0.612971 0.790105 0 + outer loop + vertex 4.06362 0.0872046 0.489362 + vertex 4.06362 0.0872046 -0.510638 + vertex 4.04931 0.0760984 -0.510638 + endloop + endfacet + facet normal -0.612971 0.790105 0 + outer loop + vertex 4.06362 0.0872046 0.489362 + vertex 4.04931 0.0760984 -0.510638 + vertex 4.04931 0.0760984 0.489362 + endloop + endfacet + facet normal -0.569612 0.821914 0 + outer loop + vertex 4.04931 0.0760984 0.489362 + vertex 4.04931 0.0760984 -0.510638 + vertex 4.03427 0.0656802 -0.510638 + endloop + endfacet + facet normal -0.569612 0.821914 0 + outer loop + vertex 4.04931 0.0760984 0.489362 + vertex 4.03427 0.0656802 -0.510638 + vertex 4.03427 0.0656802 0.489362 + endloop + endfacet + facet normal -0.52447 0.851429 0 + outer loop + vertex 4.03427 0.0656802 0.489362 + vertex 4.03427 0.0656802 -0.510638 + vertex 4.01853 0.0559849 -0.510638 + endloop + endfacet + facet normal -0.52447 0.851429 0 + outer loop + vertex 4.03427 0.0656802 0.489362 + vertex 4.01853 0.0559849 -0.510638 + vertex 4.01853 0.0559849 0.489362 + endloop + endfacet + facet normal -0.477746 0.878498 0 + outer loop + vertex 4.01853 0.0559849 0.489362 + vertex 4.01853 0.0559849 -0.510638 + vertex 4.0021 0.0470474 -0.510638 + endloop + endfacet + facet normal -0.477746 0.878498 0 + outer loop + vertex 4.01853 0.0559849 0.489362 + vertex 4.0021 0.0470474 -0.510638 + vertex 4.0021 0.0470474 0.489362 + endloop + endfacet + facet normal -0.429622 0.903009 0 + outer loop + vertex 4.0021 0.0470474 0.489362 + vertex 4.0021 0.0470474 -0.510638 + vertex 3.98498 0.0389025 -0.510638 + endloop + endfacet + facet normal -0.429622 0.903009 0 + outer loop + vertex 4.0021 0.0470474 0.489362 + vertex 3.98498 0.0389025 -0.510638 + vertex 3.98498 0.0389025 0.489362 + endloop + endfacet + facet normal -0.380336 0.924848 0 + outer loop + vertex 3.98498 0.0389025 0.489362 + vertex 3.98498 0.0389025 -0.510638 + vertex 3.96719 0.0315852 -0.510638 + endloop + endfacet + facet normal -0.380336 0.924848 0 + outer loop + vertex 3.98498 0.0389025 0.489362 + vertex 3.96719 0.0315852 -0.510638 + vertex 3.96719 0.0315852 0.489362 + endloop + endfacet + facet normal -0.330131 0.943935 0 + outer loop + vertex 3.96719 0.0315852 0.489362 + vertex 3.96719 0.0315852 -0.510638 + vertex 3.94873 0.0251304 -0.510638 + endloop + endfacet + facet normal -0.330131 0.943935 0 + outer loop + vertex 3.96719 0.0315852 0.489362 + vertex 3.94873 0.0251304 -0.510638 + vertex 3.94873 0.0251304 0.489362 + endloop + endfacet + facet normal -0.279271 0.960212 0 + outer loop + vertex 3.94873 0.0251304 0.489362 + vertex 3.94873 0.0251304 -0.510638 + vertex 3.92962 0.0195729 -0.510638 + endloop + endfacet + facet normal -0.279271 0.960212 0 + outer loop + vertex 3.94873 0.0251304 0.489362 + vertex 3.92962 0.0195729 -0.510638 + vertex 3.92962 0.0195729 0.489362 + endloop + endfacet + facet normal -0.228029 0.973654 0 + outer loop + vertex 3.92962 0.0195729 0.489362 + vertex 3.92962 0.0195729 -0.510638 + vertex 3.90987 0.0149476 -0.510638 + endloop + endfacet + facet normal -0.228029 0.973654 0 + outer loop + vertex 3.92962 0.0195729 0.489362 + vertex 3.90987 0.0149476 -0.510638 + vertex 3.90987 0.0149476 0.489362 + endloop + endfacet + facet normal -0.176679 0.984269 0 + outer loop + vertex 3.90987 0.0149476 0.489362 + vertex 3.90987 0.0149476 -0.510638 + vertex 3.88949 0.0112894 -0.510638 + endloop + endfacet + facet normal -0.176679 0.984269 0 + outer loop + vertex 3.90987 0.0149476 0.489362 + vertex 3.88949 0.0112894 -0.510638 + vertex 3.88949 0.0112894 0.489362 + endloop + endfacet + facet normal -0.125491 0.992095 0 + outer loop + vertex 3.88949 0.0112894 0.489362 + vertex 3.88949 0.0112894 -0.510638 + vertex 3.86849 0.0086332 -0.510638 + endloop + endfacet + facet normal -0.125491 0.992095 0 + outer loop + vertex 3.88949 0.0112894 0.489362 + vertex 3.86849 0.0086332 -0.510638 + vertex 3.86849 0.0086332 0.489362 + endloop + endfacet + facet normal -0.0747322 0.997204 0 + outer loop + vertex 3.86849 0.0086332 0.489362 + vertex 3.86849 0.0086332 -0.510638 + vertex 3.84689 0.00701391 -0.510638 + endloop + endfacet + facet normal -0.0747322 0.997204 0 + outer loop + vertex 3.86849 0.0086332 0.489362 + vertex 3.84689 0.00701391 -0.510638 + vertex 3.84689 0.00701391 0.489362 + endloop + endfacet + facet normal -0.0246501 0.999696 0 + outer loop + vertex 3.84689 0.00701391 0.489362 + vertex 3.84689 0.00701391 -0.510638 + vertex 3.82468 0.00646639 -0.510638 + endloop + endfacet + facet normal -0.0246501 0.999696 0 + outer loop + vertex 3.84689 0.00701391 0.489362 + vertex 3.82468 0.00646639 -0.510638 + vertex 3.82468 0.00646639 0.489362 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex 3.82468 0.00646639 0.489362 + vertex 3.82468 0.00646639 -0.510638 + vertex 3.55868 0.00646639 -0.510638 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex 3.82468 0.00646639 0.489362 + vertex 3.55868 0.00646639 -0.510638 + vertex 3.55868 0.00646639 0.489362 + endloop + endfacet + facet normal 1 0 0 + outer loop + vertex 3.55868 0.00646639 0.489362 + vertex 3.55868 0.00646639 -0.510638 + vertex 3.55868 0.688466 -0.510638 + endloop + endfacet + facet normal 1 -0 0 + outer loop + vertex 3.55868 0.00646639 0.489362 + vertex 3.55868 0.688466 -0.510638 + vertex 3.55868 0.688466 0.489362 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 3.55868 0.688466 0.489362 + vertex 3.55868 0.688466 -0.510638 + vertex 3.82368 0.688466 -0.510638 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 3.55868 0.688466 0.489362 + vertex 3.82368 0.688466 -0.510638 + vertex 3.82368 0.688466 0.489362 + endloop + endfacet + facet normal 0.0255959 -0.999672 0 + outer loop + vertex 3.81268 0.0944664 0.489362 + vertex 3.81268 0.0944664 -0.510638 + vertex 3.83432 0.0950203 -0.510638 + endloop + endfacet + facet normal 0.0255959 -0.999672 0 + outer loop + vertex 3.81268 0.0944664 0.489362 + vertex 3.83432 0.0950203 -0.510638 + vertex 3.83432 0.0950203 0.489362 + endloop + endfacet + facet normal 0.0788981 -0.996883 0 + outer loop + vertex 3.83432 0.0950203 0.489362 + vertex 3.83432 0.0950203 -0.510638 + vertex 3.85484 0.0966445 -0.510638 + endloop + endfacet + facet normal 0.0788981 -0.996883 0 + outer loop + vertex 3.83432 0.0950203 0.489362 + vertex 3.85484 0.0966445 -0.510638 + vertex 3.85484 0.0966445 0.489362 + endloop + endfacet + facet normal 0.134501 -0.990913 0 + outer loop + vertex 3.85484 0.0966445 0.489362 + vertex 3.85484 0.0966445 -0.510638 + vertex 3.87427 0.0992824 -0.510638 + endloop + endfacet + facet normal 0.134501 -0.990913 0 + outer loop + vertex 3.85484 0.0966445 0.489362 + vertex 3.87427 0.0992824 -0.510638 + vertex 3.87427 0.0992824 0.489362 + endloop + endfacet + facet normal 0.192025 -0.98139 0 + outer loop + vertex 3.87427 0.0992824 0.489362 + vertex 3.87427 0.0992824 -0.510638 + vertex 3.89265 0.102878 -0.510638 + endloop + endfacet + facet normal 0.192025 -0.98139 0 + outer loop + vertex 3.87427 0.0992824 0.489362 + vertex 3.89265 0.102878 -0.510638 + vertex 3.89265 0.102878 0.489362 + endloop + endfacet + facet normal 0.250978 -0.967993 0 + outer loop + vertex 3.89265 0.102878 0.489362 + vertex 3.89265 0.102878 -0.510638 + vertex 3.90999 0.107374 -0.510638 + endloop + endfacet + facet normal 0.250978 -0.967993 0 + outer loop + vertex 3.89265 0.102878 0.489362 + vertex 3.90999 0.107374 -0.510638 + vertex 3.90999 0.107374 0.489362 + endloop + endfacet + facet normal 0.310763 -0.950488 0 + outer loop + vertex 3.90999 0.107374 0.489362 + vertex 3.90999 0.107374 -0.510638 + vertex 3.92632 0.112714 -0.510638 + endloop + endfacet + facet normal 0.310763 -0.950488 0 + outer loop + vertex 3.90999 0.107374 0.489362 + vertex 3.92632 0.112714 -0.510638 + vertex 3.92632 0.112714 0.489362 + endloop + endfacet + facet normal 0.370704 -0.928751 0 + outer loop + vertex 3.92632 0.112714 0.489362 + vertex 3.92632 0.112714 -0.510638 + vertex 3.94168 0.118843 -0.510638 + endloop + endfacet + facet normal 0.370704 -0.928751 0 + outer loop + vertex 3.92632 0.112714 0.489362 + vertex 3.94168 0.118843 -0.510638 + vertex 3.94168 0.118843 0.489362 + endloop + endfacet + facet normal 0.430058 -0.902801 0 + outer loop + vertex 3.94168 0.118843 0.489362 + vertex 3.94168 0.118843 -0.510638 + vertex 3.95608 0.125703 -0.510638 + endloop + endfacet + facet normal 0.430058 -0.902801 0 + outer loop + vertex 3.94168 0.118843 0.489362 + vertex 3.95608 0.125703 -0.510638 + vertex 3.95608 0.125703 0.489362 + endloop + endfacet + facet normal 0.488088 -0.872794 0 + outer loop + vertex 3.95608 0.125703 0.489362 + vertex 3.95608 0.125703 -0.510638 + vertex 3.96955 0.133238 -0.510638 + endloop + endfacet + facet normal 0.488088 -0.872794 0 + outer loop + vertex 3.95608 0.125703 0.489362 + vertex 3.96955 0.133238 -0.510638 + vertex 3.96955 0.133238 0.489362 + endloop + endfacet + facet normal 0.544076 -0.839036 0 + outer loop + vertex 3.96955 0.133238 0.489362 + vertex 3.96955 0.133238 -0.510638 + vertex 3.98213 0.141392 -0.510638 + endloop + endfacet + facet normal 0.544076 -0.839036 0 + outer loop + vertex 3.96955 0.133238 0.489362 + vertex 3.98213 0.141392 -0.510638 + vertex 3.98213 0.141392 0.489362 + endloop + endfacet + facet normal 0.597379 -0.801959 0 + outer loop + vertex 3.98213 0.141392 0.489362 + vertex 3.98213 0.141392 -0.510638 + vertex 3.99383 0.150108 -0.510638 + endloop + endfacet + facet normal 0.597379 -0.801959 0 + outer loop + vertex 3.98213 0.141392 0.489362 + vertex 3.99383 0.150108 -0.510638 + vertex 3.99383 0.150108 0.489362 + endloop + endfacet + facet normal 0.64747 -0.762091 0 + outer loop + vertex 3.99383 0.150108 0.489362 + vertex 3.99383 0.150108 -0.510638 + vertex 4.00468 0.15933 -0.510638 + endloop + endfacet + facet normal 0.64747 -0.762091 0 + outer loop + vertex 3.99383 0.150108 0.489362 + vertex 4.00468 0.15933 -0.510638 + vertex 4.00468 0.15933 0.489362 + endloop + endfacet + facet normal 0.693952 -0.720021 0 + outer loop + vertex 4.00468 0.15933 0.489362 + vertex 4.00468 0.15933 -0.510638 + vertex 4.01472 0.169002 -0.510638 + endloop + endfacet + facet normal 0.693952 -0.720021 0 + outer loop + vertex 4.00468 0.15933 0.489362 + vertex 4.01472 0.169002 -0.510638 + vertex 4.01472 0.169002 0.489362 + endloop + endfacet + facet normal 0.736584 -0.676346 0 + outer loop + vertex 4.01472 0.169002 0.489362 + vertex 4.01472 0.169002 -0.510638 + vertex 4.02396 0.179066 -0.510638 + endloop + endfacet + facet normal 0.736584 -0.676346 0 + outer loop + vertex 4.01472 0.169002 0.489362 + vertex 4.02396 0.179066 -0.510638 + vertex 4.02396 0.179066 0.489362 + endloop + endfacet + facet normal 0.775243 -0.631664 0 + outer loop + vertex 4.02396 0.179066 0.489362 + vertex 4.02396 0.179066 -0.510638 + vertex 4.03243 0.189466 -0.510638 + endloop + endfacet + facet normal 0.775243 -0.631664 0 + outer loop + vertex 4.02396 0.179066 0.489362 + vertex 4.03243 0.189466 -0.510638 + vertex 4.03243 0.189466 0.489362 + endloop + endfacet + facet normal 0.809939 -0.586514 0 + outer loop + vertex 4.03243 0.189466 0.489362 + vertex 4.03243 0.189466 -0.510638 + vertex 4.04017 0.200147 -0.510638 + endloop + endfacet + facet normal 0.809939 -0.586514 0 + outer loop + vertex 4.03243 0.189466 0.489362 + vertex 4.04017 0.200147 -0.510638 + vertex 4.04017 0.200147 0.489362 + endloop + endfacet + facet normal 0.840788 -0.541365 0 + outer loop + vertex 4.04017 0.200147 0.489362 + vertex 4.04017 0.200147 -0.510638 + vertex 4.04719 0.211051 -0.510638 + endloop + endfacet + facet normal 0.840788 -0.541365 0 + outer loop + vertex 4.04017 0.200147 0.489362 + vertex 4.04719 0.211051 -0.510638 + vertex 4.04719 0.211051 0.489362 + endloop + endfacet + facet normal 0.867977 -0.496604 0 + outer loop + vertex 4.04719 0.211051 0.489362 + vertex 4.04719 0.211051 -0.510638 + vertex 4.05352 0.222122 -0.510638 + endloop + endfacet + facet normal 0.867977 -0.496604 0 + outer loop + vertex 4.04719 0.211051 0.489362 + vertex 4.05352 0.222122 -0.510638 + vertex 4.05352 0.222122 0.489362 + endloop + endfacet + facet normal 0.891751 -0.452527 0 + outer loop + vertex 4.05352 0.222122 0.489362 + vertex 4.05352 0.222122 -0.510638 + vertex 4.0592 0.233304 -0.510638 + endloop + endfacet + facet normal 0.891751 -0.452527 0 + outer loop + vertex 4.05352 0.222122 0.489362 + vertex 4.0592 0.233304 -0.510638 + vertex 4.0592 0.233304 0.489362 + endloop + endfacet + facet normal 0.912381 -0.409342 0 + outer loop + vertex 4.0592 0.233304 0.489362 + vertex 4.0592 0.233304 -0.510638 + vertex 4.06424 0.24454 -0.510638 + endloop + endfacet + facet normal 0.912381 -0.409342 0 + outer loop + vertex 4.0592 0.233304 0.489362 + vertex 4.06424 0.24454 -0.510638 + vertex 4.06424 0.24454 0.489362 + endloop + endfacet + facet normal 0.930151 -0.367177 0 + outer loop + vertex 4.06424 0.24454 0.489362 + vertex 4.06424 0.24454 -0.510638 + vertex 4.06867 0.255774 -0.510638 + endloop + endfacet + facet normal 0.930151 -0.367177 0 + outer loop + vertex 4.06424 0.24454 0.489362 + vertex 4.06867 0.255774 -0.510638 + vertex 4.06867 0.255774 0.489362 + endloop + endfacet + facet normal 0.945354 -0.326046 0 + outer loop + vertex 4.06867 0.255774 0.489362 + vertex 4.06867 0.255774 -0.510638 + vertex 4.07253 0.26695 -0.510638 + endloop + endfacet + facet normal 0.945354 -0.326046 0 + outer loop + vertex 4.06867 0.255774 0.489362 + vertex 4.07253 0.26695 -0.510638 + vertex 4.07253 0.26695 0.489362 + endloop + endfacet + facet normal 0.958228 -0.286004 0 + outer loop + vertex 4.07253 0.26695 0.489362 + vertex 4.07253 0.26695 -0.510638 + vertex 4.07583 0.27801 -0.510638 + endloop + endfacet + facet normal 0.958228 -0.286004 0 + outer loop + vertex 4.07253 0.26695 0.489362 + vertex 4.07583 0.27801 -0.510638 + vertex 4.07583 0.27801 0.489362 + endloop + endfacet + facet normal 0.969042 -0.246896 0 + outer loop + vertex 4.07583 0.27801 0.489362 + vertex 4.07583 0.27801 -0.510638 + vertex 4.0786 0.288898 -0.510638 + endloop + endfacet + facet normal 0.969042 -0.246896 0 + outer loop + vertex 4.07583 0.27801 0.489362 + vertex 4.0786 0.288898 -0.510638 + vertex 4.0786 0.288898 0.489362 + endloop + endfacet + facet normal 0.977988 -0.208661 0 + outer loop + vertex 4.0786 0.288898 0.489362 + vertex 4.0786 0.288898 -0.510638 + vertex 4.08088 0.299559 -0.510638 + endloop + endfacet + facet normal 0.977988 -0.208661 0 + outer loop + vertex 4.0786 0.288898 0.489362 + vertex 4.08088 0.299559 -0.510638 + vertex 4.08088 0.299559 0.489362 + endloop + endfacet + facet normal 0.985268 -0.171015 0 + outer loop + vertex 4.08088 0.299559 0.489362 + vertex 4.08088 0.299559 -0.510638 + vertex 4.08268 0.309935 -0.510638 + endloop + endfacet + facet normal 0.985268 -0.171015 0 + outer loop + vertex 4.08088 0.299559 0.489362 + vertex 4.08268 0.309935 -0.510638 + vertex 4.08268 0.309935 0.489362 + endloop + endfacet + facet normal 0.991017 -0.133734 0 + outer loop + vertex 4.08268 0.309935 0.489362 + vertex 4.08268 0.309935 -0.510638 + vertex 4.08403 0.31997 -0.510638 + endloop + endfacet + facet normal 0.991017 -0.133734 0 + outer loop + vertex 4.08268 0.309935 0.489362 + vertex 4.08403 0.31997 -0.510638 + vertex 4.08403 0.31997 0.489362 + endloop + endfacet + facet normal 0.995331 -0.0965185 0 + outer loop + vertex 4.08403 0.31997 0.489362 + vertex 4.08403 0.31997 -0.510638 + vertex 4.08497 0.329608 -0.510638 + endloop + endfacet + facet normal 0.995331 -0.0965185 0 + outer loop + vertex 4.08403 0.31997 0.489362 + vertex 4.08497 0.329608 -0.510638 + vertex 4.08497 0.329608 0.489362 + endloop + endfacet + facet normal 0.998268 -0.0588267 0 + outer loop + vertex 4.08497 0.329608 0.489362 + vertex 4.08497 0.329608 -0.510638 + vertex 4.08551 0.338792 -0.510638 + endloop + endfacet + facet normal 0.998268 -0.0588267 0 + outer loop + vertex 4.08497 0.329608 0.489362 + vertex 4.08551 0.338792 -0.510638 + vertex 4.08551 0.338792 0.489362 + endloop + endfacet + facet normal 0.999798 -0.0201163 0 + outer loop + vertex 4.08551 0.338792 0.489362 + vertex 4.08551 0.338792 -0.510638 + vertex 4.08568 0.347466 -0.510638 + endloop + endfacet + facet normal 0.999798 -0.0201163 0 + outer loop + vertex 4.08551 0.338792 0.489362 + vertex 4.08568 0.347466 -0.510638 + vertex 4.08568 0.347466 0.489362 + endloop + endfacet + facet normal 0.999773 0.0213063 0 + outer loop + vertex 4.08568 0.347466 0.489362 + vertex 4.08568 0.347466 -0.510638 + vertex 4.08539 0.361093 -0.510638 + endloop + endfacet + facet normal 0.999773 0.0213063 0 + outer loop + vertex 4.08568 0.347466 0.489362 + vertex 4.08539 0.361093 -0.510638 + vertex 4.08539 0.361093 0.489362 + endloop + endfacet + facet normal 0.997898 0.0648092 0 + outer loop + vertex 4.08539 0.361093 0.489362 + vertex 4.08539 0.361093 -0.510638 + vertex 4.08452 0.374558 -0.510638 + endloop + endfacet + facet normal 0.997898 0.0648092 0 + outer loop + vertex 4.08539 0.361093 0.489362 + vertex 4.08452 0.374558 -0.510638 + vertex 4.08452 0.374558 0.489362 + endloop + endfacet + facet normal 0.993998 0.109402 0 + outer loop + vertex 4.08452 0.374558 0.489362 + vertex 4.08452 0.374558 -0.510638 + vertex 4.08306 0.387841 -0.510638 + endloop + endfacet + facet normal 0.993998 0.109402 0 + outer loop + vertex 4.08452 0.374558 0.489362 + vertex 4.08306 0.387841 -0.510638 + vertex 4.08306 0.387841 0.489362 + endloop + endfacet + facet normal 0.987902 0.15508 0 + outer loop + vertex 4.08306 0.387841 0.489362 + vertex 4.08306 0.387841 -0.510638 + vertex 4.081 0.400921 -0.510638 + endloop + endfacet + facet normal 0.987902 0.15508 0 + outer loop + vertex 4.08306 0.387841 0.489362 + vertex 4.081 0.400921 -0.510638 + vertex 4.081 0.400921 0.489362 + endloop + endfacet + facet normal 0.979432 0.201774 0 + outer loop + vertex 4.081 0.400921 0.489362 + vertex 4.081 0.400921 -0.510638 + vertex 4.07835 0.413777 -0.510638 + endloop + endfacet + facet normal 0.979432 0.201774 0 + outer loop + vertex 4.081 0.400921 0.489362 + vertex 4.07835 0.413777 -0.510638 + vertex 4.07835 0.413777 0.489362 + endloop + endfacet + facet normal 0.968405 0.249382 0 + outer loop + vertex 4.07835 0.413777 0.489362 + vertex 4.07835 0.413777 -0.510638 + vertex 4.07511 0.426386 -0.510638 + endloop + endfacet + facet normal 0.968405 0.249382 0 + outer loop + vertex 4.07835 0.413777 0.489362 + vertex 4.07511 0.426386 -0.510638 + vertex 4.07511 0.426386 0.489362 + endloop + endfacet + facet normal 0.95464 0.297764 0 + outer loop + vertex 4.07511 0.426386 0.489362 + vertex 4.07511 0.426386 -0.510638 + vertex 4.07126 0.43873 -0.510638 + endloop + endfacet + facet normal 0.95464 0.297764 0 + outer loop + vertex 4.07511 0.426386 0.489362 + vertex 4.07126 0.43873 -0.510638 + vertex 4.07126 0.43873 0.489362 + endloop + endfacet + facet normal 0.937962 0.346737 0 + outer loop + vertex 4.07126 0.43873 0.489362 + vertex 4.07126 0.43873 -0.510638 + vertex 4.0668 0.450785 -0.510638 + endloop + endfacet + facet normal 0.937962 0.346737 0 + outer loop + vertex 4.07126 0.43873 0.489362 + vertex 4.0668 0.450785 -0.510638 + vertex 4.0668 0.450785 0.489362 + endloop + endfacet + facet normal 0.918218 0.396075 0 + outer loop + vertex 4.0668 0.450785 0.489362 + vertex 4.0668 0.450785 -0.510638 + vertex 4.06173 0.462531 -0.510638 + endloop + endfacet + facet normal 0.918218 0.396075 0 + outer loop + vertex 4.0668 0.450785 0.489362 + vertex 4.06173 0.462531 -0.510638 + vertex 4.06173 0.462531 0.489362 + endloop + endfacet + facet normal 0.895294 0.445476 0 + outer loop + vertex 4.06173 0.462531 0.489362 + vertex 4.06173 0.462531 -0.510638 + vertex 4.05605 0.473948 -0.510638 + endloop + endfacet + facet normal 0.895294 0.445476 0 + outer loop + vertex 4.06173 0.462531 0.489362 + vertex 4.05605 0.473948 -0.510638 + vertex 4.05605 0.473948 0.489362 + endloop + endfacet + facet normal 0.869072 0.494686 0 + outer loop + vertex 4.05605 0.473948 0.489362 + vertex 4.05605 0.473948 -0.510638 + vertex 4.04975 0.485013 -0.510638 + endloop + endfacet + facet normal 0.869072 0.494686 0 + outer loop + vertex 4.05605 0.473948 0.489362 + vertex 4.04975 0.485013 -0.510638 + vertex 4.04975 0.485013 0.489362 + endloop + endfacet + facet normal 0.839543 0.543293 0 + outer loop + vertex 4.04975 0.485013 0.489362 + vertex 4.04975 0.485013 -0.510638 + vertex 4.04283 0.495706 -0.510638 + endloop + endfacet + facet normal 0.839543 0.543293 0 + outer loop + vertex 4.04975 0.485013 0.489362 + vertex 4.04283 0.495706 -0.510638 + vertex 4.04283 0.495706 0.489362 + endloop + endfacet + facet normal 0.806694 0.590969 0 + outer loop + vertex 4.04283 0.495706 0.489362 + vertex 4.04283 0.495706 -0.510638 + vertex 4.03529 0.506006 -0.510638 + endloop + endfacet + facet normal 0.806694 0.590969 0 + outer loop + vertex 4.04283 0.495706 0.489362 + vertex 4.03529 0.506006 -0.510638 + vertex 4.03529 0.506006 0.489362 + endloop + endfacet + facet normal 0.770646 0.637263 0 + outer loop + vertex 4.03529 0.506006 0.489362 + vertex 4.03529 0.506006 -0.510638 + vertex 4.02711 0.515892 -0.510638 + endloop + endfacet + facet normal 0.770646 0.637263 0 + outer loop + vertex 4.03529 0.506006 0.489362 + vertex 4.02711 0.515892 -0.510638 + vertex 4.02711 0.515892 0.489362 + endloop + endfacet + facet normal 0.731544 0.681794 0 + outer loop + vertex 4.02711 0.515892 0.489362 + vertex 4.02711 0.515892 -0.510638 + vertex 4.01831 0.525341 -0.510638 + endloop + endfacet + facet normal 0.731544 0.681794 0 + outer loop + vertex 4.02711 0.515892 0.489362 + vertex 4.01831 0.525341 -0.510638 + vertex 4.01831 0.525341 0.489362 + endloop + endfacet + facet normal 0.689619 0.724173 0 + outer loop + vertex 4.01831 0.525341 0.489362 + vertex 4.01831 0.525341 -0.510638 + vertex 4.00886 0.534335 -0.510638 + endloop + endfacet + facet normal 0.689619 0.724173 0 + outer loop + vertex 4.01831 0.525341 0.489362 + vertex 4.00886 0.534335 -0.510638 + vertex 4.00886 0.534335 0.489362 + endloop + endfacet + facet normal 0.645156 0.76405 0 + outer loop + vertex 4.00886 0.534335 0.489362 + vertex 4.00886 0.534335 -0.510638 + vertex 3.99878 0.54285 -0.510638 + endloop + endfacet + facet normal 0.645156 0.76405 0 + outer loop + vertex 4.00886 0.534335 0.489362 + vertex 3.99878 0.54285 -0.510638 + vertex 3.99878 0.54285 0.489362 + endloop + endfacet + facet normal 0.598566 0.801073 0 + outer loop + vertex 3.99878 0.54285 0.489362 + vertex 3.99878 0.54285 -0.510638 + vertex 3.98805 0.550866 -0.510638 + endloop + endfacet + facet normal 0.598566 0.801073 0 + outer loop + vertex 3.99878 0.54285 0.489362 + vertex 3.98805 0.550866 -0.510638 + vertex 3.98805 0.550866 0.489362 + endloop + endfacet + facet normal 0.550224 0.835017 0 + outer loop + vertex 3.98805 0.550866 0.489362 + vertex 3.98805 0.550866 -0.510638 + vertex 3.97667 0.558363 -0.510638 + endloop + endfacet + facet normal 0.550224 0.835017 0 + outer loop + vertex 3.98805 0.550866 0.489362 + vertex 3.97667 0.558363 -0.510638 + vertex 3.97667 0.558363 0.489362 + endloop + endfacet + facet normal 0.50058 0.86569 0 + outer loop + vertex 3.97667 0.558363 0.489362 + vertex 3.97667 0.558363 -0.510638 + vertex 3.96465 0.565318 -0.510638 + endloop + endfacet + facet normal 0.50058 0.86569 0 + outer loop + vertex 3.97667 0.558363 0.489362 + vertex 3.96465 0.565318 -0.510638 + vertex 3.96465 0.565318 0.489362 + endloop + endfacet + facet normal 0.450095 0.892981 0 + outer loop + vertex 3.96465 0.565318 0.489362 + vertex 3.96465 0.565318 -0.510638 + vertex 3.95196 0.571711 -0.510638 + endloop + endfacet + facet normal 0.450095 0.892981 0 + outer loop + vertex 3.96465 0.565318 0.489362 + vertex 3.95196 0.571711 -0.510638 + vertex 3.95196 0.571711 0.489362 + endloop + endfacet + facet normal 0.399211 0.916859 0 + outer loop + vertex 3.95196 0.571711 0.489362 + vertex 3.95196 0.571711 -0.510638 + vertex 3.93862 0.577521 -0.510638 + endloop + endfacet + facet normal 0.399211 0.916859 0 + outer loop + vertex 3.95196 0.571711 0.489362 + vertex 3.93862 0.577521 -0.510638 + vertex 3.93862 0.577521 0.489362 + endloop + endfacet + facet normal 0.348364 0.937359 0 + outer loop + vertex 3.93862 0.577521 0.489362 + vertex 3.93862 0.577521 -0.510638 + vertex 3.92461 0.582727 -0.510638 + endloop + endfacet + facet normal 0.348364 0.937359 0 + outer loop + vertex 3.93862 0.577521 0.489362 + vertex 3.92461 0.582727 -0.510638 + vertex 3.92461 0.582727 0.489362 + endloop + endfacet + facet normal 0.297946 0.954583 0 + outer loop + vertex 3.92461 0.582727 0.489362 + vertex 3.92461 0.582727 -0.510638 + vertex 3.90994 0.587306 -0.510638 + endloop + endfacet + facet normal 0.297946 0.954583 0 + outer loop + vertex 3.92461 0.582727 0.489362 + vertex 3.90994 0.587306 -0.510638 + vertex 3.90994 0.587306 0.489362 + endloop + endfacet + facet normal 0.248304 0.968682 0 + outer loop + vertex 3.90994 0.587306 0.489362 + vertex 3.90994 0.587306 -0.510638 + vertex 3.89459 0.59124 -0.510638 + endloop + endfacet + facet normal 0.248304 0.968682 0 + outer loop + vertex 3.90994 0.587306 0.489362 + vertex 3.89459 0.59124 -0.510638 + vertex 3.89459 0.59124 0.489362 + endloop + endfacet + facet normal 0.199744 0.979848 0 + outer loop + vertex 3.89459 0.59124 0.489362 + vertex 3.89459 0.59124 -0.510638 + vertex 3.87858 0.594505 -0.510638 + endloop + endfacet + facet normal 0.199744 0.979848 0 + outer loop + vertex 3.89459 0.59124 0.489362 + vertex 3.87858 0.594505 -0.510638 + vertex 3.87858 0.594505 0.489362 + endloop + endfacet + facet normal 0.152505 0.988303 0 + outer loop + vertex 3.87858 0.594505 0.489362 + vertex 3.87858 0.594505 -0.510638 + vertex 3.86188 0.597081 -0.510638 + endloop + endfacet + facet normal 0.152505 0.988303 0 + outer loop + vertex 3.87858 0.594505 0.489362 + vertex 3.86188 0.597081 -0.510638 + vertex 3.86188 0.597081 0.489362 + endloop + endfacet + facet normal 0.106786 0.994282 0 + outer loop + vertex 3.86188 0.597081 0.489362 + vertex 3.86188 0.597081 -0.510638 + vertex 3.8445 0.598948 -0.510638 + endloop + endfacet + facet normal 0.106786 0.994282 0 + outer loop + vertex 3.86188 0.597081 0.489362 + vertex 3.8445 0.598948 -0.510638 + vertex 3.8445 0.598948 0.489362 + endloop + endfacet + facet normal 0.062726 0.998031 0 + outer loop + vertex 3.8445 0.598948 0.489362 + vertex 3.8445 0.598948 -0.510638 + vertex 3.82644 0.600083 -0.510638 + endloop + endfacet + facet normal 0.062726 0.998031 0 + outer loop + vertex 3.8445 0.598948 0.489362 + vertex 3.82644 0.600083 -0.510638 + vertex 3.82644 0.600083 0.489362 + endloop + endfacet + facet normal 0.0204254 0.999791 0 + outer loop + vertex 3.82644 0.600083 0.489362 + vertex 3.82644 0.600083 -0.510638 + vertex 3.80768 0.600466 -0.510638 + endloop + endfacet + facet normal 0.0204254 0.999791 0 + outer loop + vertex 3.82644 0.600083 0.489362 + vertex 3.80768 0.600466 -0.510638 + vertex 3.80768 0.600466 0.489362 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex 3.80768 0.600466 0.489362 + vertex 3.80768 0.600466 -0.510638 + vertex 3.65668 0.600466 -0.510638 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex 3.80768 0.600466 0.489362 + vertex 3.65668 0.600466 -0.510638 + vertex 3.65668 0.600466 0.489362 + endloop + endfacet + facet normal -1 0 -0 + outer loop + vertex 3.65668 0.600466 0.489362 + vertex 3.65668 0.600466 -0.510638 + vertex 3.65668 0.0944664 -0.510638 + endloop + endfacet + facet normal -1 -0 0 + outer loop + vertex 3.65668 0.600466 0.489362 + vertex 3.65668 0.0944664 -0.510638 + vertex 3.65668 0.0944664 0.489362 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 3.65668 0.0944664 0.489362 + vertex 3.65668 0.0944664 -0.510638 + vertex 3.81268 0.0944664 -0.510638 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 3.65668 0.0944664 0.489362 + vertex 3.81268 0.0944664 -0.510638 + vertex 3.81268 0.0944664 0.489362 + endloop + endfacet +endsolid text diff --git a/tutorials/mesh/cv2DMesh/OpenCFD/constant/turbulenceProperties b/tutorials/mesh/cv2DMesh/OpenCFD/constant/turbulenceProperties new file mode 100644 index 0000000000000000000000000000000000000000..c2c3b28a1b4e8f4a2cae55f58bd61f9b1a67b488 --- /dev/null +++ b/tutorials/mesh/cv2DMesh/OpenCFD/constant/turbulenceProperties @@ -0,0 +1,21 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: dev | +| \\ / A nd | Web: www.OpenFOAM.org | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + location "constant"; + object turbulenceProperties; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +simulationType laminar; + + +// ************************************************************************* // diff --git a/tutorials/mesh/cv2DMesh/OpenCFD/system/controlDict b/tutorials/mesh/cv2DMesh/OpenCFD/system/controlDict new file mode 100644 index 0000000000000000000000000000000000000000..a2364b630302f7a39c53db9122470780fd607654 --- /dev/null +++ b/tutorials/mesh/cv2DMesh/OpenCFD/system/controlDict @@ -0,0 +1,55 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: dev | +| \\ / A nd | Web: www.OpenFOAM.org | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + location "system"; + object controlDict; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +application rhoCentralFoam; + +startFrom startTime; + +startTime 0; + +stopAt endTime; + +endTime 10; + +deltaT 0.001; + +writeControl adjustableRunTime; + +writeInterval 1; + +purgeWrite 0; + +writeFormat ascii; + +writePrecision 12; + +writeCompression off; + +timeFormat general; + +timePrecision 6; + +runTimeModifiable true; + +adjustTimeStep yes; + +maxCo 0.5; + +maxDeltaT 1; + + +// ************************************************************************* // diff --git a/tutorials/mesh/cv2DMesh/OpenCFD/system/controlDict.mesher b/tutorials/mesh/cv2DMesh/OpenCFD/system/controlDict.mesher new file mode 100644 index 0000000000000000000000000000000000000000..c38028778507bd88fe2d873829afabf405e0f20e --- /dev/null +++ b/tutorials/mesh/cv2DMesh/OpenCFD/system/controlDict.mesher @@ -0,0 +1,55 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: dev | +| \\ / A nd | Web: www.OpenFOAM.org | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + location "system"; + object controlDict; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +application rhoCentralFoam; + +startFrom startTime; + +startTime 0; + +stopAt endTime; + +endTime 100; + +deltaT 1; + +writeControl adjustableRunTime; + +writeInterval 1; + +purgeWrite 0; + +writeFormat ascii; + +writePrecision 12; + +writeCompression off; + +timeFormat general; + +timePrecision 6; + +runTimeModifiable true; + +adjustTimeStep yes; + +maxCo 0.2; + +maxDeltaT 1; + + +// ************************************************************************* // diff --git a/tutorials/mesh/cv2DMesh/OpenCFD/system/controlDict.rhoCentralFoam b/tutorials/mesh/cv2DMesh/OpenCFD/system/controlDict.rhoCentralFoam new file mode 100644 index 0000000000000000000000000000000000000000..a2364b630302f7a39c53db9122470780fd607654 --- /dev/null +++ b/tutorials/mesh/cv2DMesh/OpenCFD/system/controlDict.rhoCentralFoam @@ -0,0 +1,55 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: dev | +| \\ / A nd | Web: www.OpenFOAM.org | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + location "system"; + object controlDict; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +application rhoCentralFoam; + +startFrom startTime; + +startTime 0; + +stopAt endTime; + +endTime 10; + +deltaT 0.001; + +writeControl adjustableRunTime; + +writeInterval 1; + +purgeWrite 0; + +writeFormat ascii; + +writePrecision 12; + +writeCompression off; + +timeFormat general; + +timePrecision 6; + +runTimeModifiable true; + +adjustTimeStep yes; + +maxCo 0.5; + +maxDeltaT 1; + + +// ************************************************************************* // diff --git a/tutorials/mesh/cv2DMesh/OpenCFD/system/cv2DMeshDict b/tutorials/mesh/cv2DMesh/OpenCFD/system/cv2DMeshDict new file mode 100644 index 0000000000000000000000000000000000000000..c90cb88c278c136fff9aa9a3cb063e60a3c26378 --- /dev/null +++ b/tutorials/mesh/cv2DMesh/OpenCFD/system/cv2DMeshDict @@ -0,0 +1,158 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: dev | +| \\ / A nd | Web: www.OpenFOAM.org | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + object cv2DMeshDict; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +geometry +{ + opencfd_text.stl + { + name letters; + type closedTriSurfaceMesh; + } + + opencfd_box.stl + { + name box; + type closedTriSurfaceMesh; + } +} + + +surfaceConformation +{ + // The z-coordinate of the plane is taken from here. + locationInMesh (0 0 0); + + pointPairDistanceCoeff 0.1; + + minEdgeLenCoeff 0.1; + + maxNotchLenCoeff 1.0; + + minNearPointDistCoeff 0.1; + + maxQuadAngle 120; + + // Insert near-boundary point mirror or point-pairs + insertSurfaceNearestPointPairs yes; + + // Mirror near-boundary points rather than insert point-pairs + mirrorPoints no; + + // Insert point-pairs vor dual-cell vertices very near the surface + insertSurfaceNearPointPairs yes; + + // Maximum number of iterations used in boundaryConform. + maxBoundaryConformingIter 5; + + geometryToConformTo + { + letters + { + featureMethod extendedFeatureEdgeMesh; + extendedFeatureEdgeMesh "opencfd_text.extendedFeatureEdgeMesh"; + } + + box + { + featureMethod extendedFeatureEdgeMesh; + extendedFeatureEdgeMesh "opencfd_box.extendedFeatureEdgeMesh"; + } + } + + additionalFeatures + {} + + // Choose if to randomise the initial grid created by insertGrid. + randomiseInitialGrid yes; + + // Perturbation fraction, 1 = cell-size. + randomPerturbation 0.1; +} + + +motionControl +{ + // This is a tolerance for determining whether to deal with surface + // protrusions or not. + minCellSize 0.02; + + // Assign a priority to all requests for cell sizes, the highest overrules. + defaultPriority 0; + + shapeControlFunctions + { + letters + { + type searchableSurfaceControl; + priority 1; + mode bothSides; + cellSizeFunction uniform; + + linearDistanceCoeffs + { + distanceCellSize $minCellSize; + distance 1; + } + uniformCoeffs + {} + + surfaceCellSizeFunction uniformValue; + uniformValueCoeffs + { + surfaceCellSize $minCellSize; + } + } + } + + relaxationModel adaptiveLinear; + + adaptiveLinearCoeffs + { + relaxationStart 0.5; + relaxationEnd 0.0; + } + + objOutput no; + + meshedSurfaceOutput yes; + + // Near-wall region where cells are aligned with the wall specified as a + // number of cell layers + nearWallAlignedDist 3; +} + + +shortEdgeFilter +{ + // Factor to multiply the average of a face's edge lengths by. + // If an edge of that face is smaller than that value then delete it. + shortEdgeFilterFactor 0.2; + + // Weighting for the lengths of edges that are attached to the boundaries. + // Used when calculating the length of an edge. Default 2.0. + edgeAttachedToBoundaryFactor 2.0; +} + + +extrusion +{ + extrude off; + + #include "extrude2DMeshDict" +} + + +// ************************************************************************* // diff --git a/tutorials/mesh/cv2DMesh/OpenCFD/system/decomposeParDict b/tutorials/mesh/cv2DMesh/OpenCFD/system/decomposeParDict new file mode 100644 index 0000000000000000000000000000000000000000..791022fa1f6732089cf56731b1771376b52eb5c4 --- /dev/null +++ b/tutorials/mesh/cv2DMesh/OpenCFD/system/decomposeParDict @@ -0,0 +1,45 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: dev | +| \\ / A nd | Web: www.OpenFOAM.org | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + location "system"; + object decomposeParDict; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +numberOfSubdomains 8; + +method hierarchical; + +simpleCoeffs +{ + n ( 2 2 1 ); + delta 0.001; +} + +hierarchicalCoeffs +{ + n ( 2 2 2 ); + delta 0.001; + order xyz; +} + +manualCoeffs +{ + dataFile ""; +} + +distributed no; + +roots ( ); + + +// ************************************************************************* // diff --git a/tutorials/mesh/cv2DMesh/OpenCFD/system/extrude2DMeshDict b/tutorials/mesh/cv2DMesh/OpenCFD/system/extrude2DMeshDict new file mode 100644 index 0000000000000000000000000000000000000000..b825f1608b358adf65d9bcdf3a1ed23ed5cb0b3b --- /dev/null +++ b/tutorials/mesh/cv2DMesh/OpenCFD/system/extrude2DMeshDict @@ -0,0 +1,42 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: dev | +| \\ / A nd | Web: www.OpenFOAM.org | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + object extrude2DMeshDict; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +extrudeModel linearDirection; + +patchInfo +{} + +patchType empty; + +nLayers 1; + +expansionRatio 1.0; + +linearDirectionCoeffs +{ + direction (0 0 1); + thickness 0.1; +} + +wedgeCoeffs +{ + axisPt (0 0 0); + axis (1 0 0); + angle 10; +} + + +// ************************************************************************* // diff --git a/tutorials/mesh/cv2DMesh/OpenCFD/system/fvSchemes b/tutorials/mesh/cv2DMesh/OpenCFD/system/fvSchemes new file mode 100644 index 0000000000000000000000000000000000000000..067f035d2675eb2f4cbb6b15d2e6ad341c0de416 --- /dev/null +++ b/tutorials/mesh/cv2DMesh/OpenCFD/system/fvSchemes @@ -0,0 +1,61 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: dev | +| \\ / A nd | Web: www.OpenFOAM.org | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + location "system"; + object fvSchemes; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +//fluxScheme Kurganov; +fluxScheme Tadmor; + +ddtSchemes +{ + default Euler; +} + +gradSchemes +{ + default Gauss linear; +} + +divSchemes +{ + default none; + div(tauMC) Gauss linear; +} + +laplacianSchemes +{ + default Gauss linear corrected; +} + +interpolationSchemes +{ + default linear; + reconstruct(rho) vanLeer; + reconstruct(U) vanLeerV; + reconstruct(T) vanLeer; +} + +snGradSchemes +{ + default corrected; +} + +fluxRequired +{ + default no; +} + + +// ************************************************************************* // diff --git a/tutorials/mesh/cv2DMesh/OpenCFD/system/fvSolution b/tutorials/mesh/cv2DMesh/OpenCFD/system/fvSolution new file mode 100644 index 0000000000000000000000000000000000000000..bdde37d65cc33bee0ce9ca353df523a26031616e --- /dev/null +++ b/tutorials/mesh/cv2DMesh/OpenCFD/system/fvSolution @@ -0,0 +1,42 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: dev | +| \\ / A nd | Web: www.OpenFOAM.org | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + location "system"; + object fvSolution; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +solvers +{ + "(rho|rhoU|rhoE)" + { + solver diagonal; + } + + U + { + solver smoothSolver; + smoother GaussSeidel; + nSweeps 2; + tolerance 1e-09; + relTol 0.01; + } + + h + { + $U; + tolerance 1e-10; + relTol 0; + } +} + +// ************************************************************************* // diff --git a/tutorials/mesh/cv2DMesh/OpenCFD/system/surfaceFeatureExtractDict b/tutorials/mesh/cv2DMesh/OpenCFD/system/surfaceFeatureExtractDict new file mode 100644 index 0000000000000000000000000000000000000000..d82c88dd2bb3dceefc333613badedda45c8dd8fc --- /dev/null +++ b/tutorials/mesh/cv2DMesh/OpenCFD/system/surfaceFeatureExtractDict @@ -0,0 +1,87 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: dev | +| \\ / A nd | Web: www.OpenFOAM.org | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + object surfaceFeatureExtractDict; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +opencfd_text.stl +{ + extractionMethod extractFromSurface; + + extractFromSurfaceCoeffs + { + // Mark edges whose adjacent surface normals are at an angle less + // than includedAngle as features + // - 0 : selects no edges + // - 180: selects all edges + includedAngle 120; + } + + subsetFeatures + { + // Use a plane to select feature edges + // (normal)(basePoint) + // Keep only edges that intersect the plane will be included + plane (0 0 1)(0 0 0); + + // Keep nonManifold edges (edges with >2 connected faces where + // the faces form more than two different normal planes) + nonManifoldEdges no; + + // Keep open edges (edges with 1 connected face) + openEdges no; + } + + // Write options + + // Write features to obj format for postprocessing + writeObj no; +} + + +opencfd_box.stl +{ + extractionMethod extractFromSurface; + + extractFromSurfaceCoeffs + { + // Mark edges whose adjacent surface normals are at an angle less + // than includedAngle as features + // - 0 : selects no edges + // - 180: selects all edges + includedAngle 120; + } + + subsetFeatures + { + // Use a plane to select feature edges + // (normal)(basePoint) + // Keep only edges that intersect the plane will be included + plane (0 0 1)(0 0 0); + + // Keep nonManifold edges (edges with >2 connected faces where + // the faces form more than two different normal planes) + nonManifoldEdges no; + + // Keep open edges (edges with 1 connected face) + openEdges no; + } + + // Write options + + // Write features to obj format for postprocessing + writeObj no; +} + + +// ************************************************************************* // diff --git a/tutorials/mesh/cv2DMesh/jaggedBoundary/Allclean b/tutorials/mesh/cv2DMesh/jaggedBoundary/Allclean new file mode 100755 index 0000000000000000000000000000000000000000..4f25de0e51ddfbf94201cce54bedbab23b2514ec --- /dev/null +++ b/tutorials/mesh/cv2DMesh/jaggedBoundary/Allclean @@ -0,0 +1,16 @@ +#!/bin/sh +cd ${0%/*} || exit 1 # run from this directory + +# Source tutorial run functions +. $WM_PROJECT_DIR/bin/tools/CleanFunctions + +rm -rf constant/extendedFeatureEdgeMesh > /dev/null 2>&1 +rm -rf constant/triSurface/jaggedBoundary.eMesh > /dev/null 2>&1 +rm -rf constant/polyMesh > /dev/null 2>&1 + +rm -rf MeshedSurface.obj > /dev/null 2>&1 + +cleanCase + + +# ----------------------------------------------------------------- end-of-file diff --git a/tutorials/mesh/cv2DMesh/jaggedBoundary/Allrun b/tutorials/mesh/cv2DMesh/jaggedBoundary/Allrun new file mode 100755 index 0000000000000000000000000000000000000000..cda5a63e282cfb2fa94f6fb4d3685be0c06a4db5 --- /dev/null +++ b/tutorials/mesh/cv2DMesh/jaggedBoundary/Allrun @@ -0,0 +1,13 @@ +#!/bin/sh +cd ${0%/*} || exit 1 # run from this directory + +# Source tutorial run functions +. $WM_PROJECT_DIR/bin/tools/RunFunctions + +runApplication surfaceFeatureExtract +runApplication cv2DMesh -overwrite +runApplication extrude2DMesh -overwrite MeshedSurface +runApplication checkMesh -allGeometry -allTopology -constant -noZero + + +# ----------------------------------------------------------------- end-of-file diff --git a/tutorials/mesh/cv2DMesh/jaggedBoundary/constant/triSurface/jaggedBoundary.stl b/tutorials/mesh/cv2DMesh/jaggedBoundary/constant/triSurface/jaggedBoundary.stl new file mode 100644 index 0000000000000000000000000000000000000000..ff4c993d3502f68da01a6c5cbd3713a580acf2b3 --- /dev/null +++ b/tutorials/mesh/cv2DMesh/jaggedBoundary/constant/triSurface/jaggedBoundary.stl @@ -0,0 +1,954 @@ +solid jagged + facet normal 0.468764725245 0.883323062286 -0 + outer loop + vertex 0.0385189987719 -0.0289657991379 -1.5 + vertex -0.0187957007438 0.00145015004091 1.5 + vertex 0.0385189987719 -0.0289657991379 1.5 + endloop + endfacet + facet normal 0.647754318236 0.761849291662 -0 + outer loop + vertex -0.0682383030653 0.0434882007539 -1.5 + vertex -0.0682383030653 0.0434882007539 1.5 + vertex -0.0187957007438 0.00145015004091 -1.5 + endloop + endfacet + facet normal 0.647754318236 0.761849291662 -0 + outer loop + vertex -0.0187957007438 0.00145015004091 -1.5 + vertex -0.0682383030653 0.0434882007539 1.5 + vertex -0.0187957007438 0.00145015004091 1.5 + endloop + endfacet + facet normal 0.796376571447 0.604801088334 -0 + outer loop + vertex -0.107496999204 0.0951823964715 -1.5 + vertex -0.107496999204 0.0951823964715 1.5 + vertex -0.0682383030653 0.0434882007539 -1.5 + endloop + endfacet + facet normal 0.796376571447 0.604801088334 -0 + outer loop + vertex -0.0682383030653 0.0434882007539 -1.5 + vertex -0.107496999204 0.0951823964715 1.5 + vertex -0.0682383030653 0.0434882007539 1.5 + endloop + endfacet + facet normal 0.907731420759 0.419551746233 -0 + outer loop + vertex -0.134736001492 0.154116004705 -1.5 + vertex -0.134736001492 0.154116004705 1.5 + vertex -0.107496999204 0.0951823964715 -1.5 + endloop + endfacet + facet normal 0.907731420759 0.419551746233 -0 + outer loop + vertex -0.107496999204 0.0951823964715 -1.5 + vertex -0.134736001492 0.154116004705 1.5 + vertex -0.107496999204 0.0951823964715 1.5 + endloop + endfacet + facet normal 0.976665530864 0.214766014121 -0 + outer loop + vertex -0.148680999875 0.217531993985 -1.5 + vertex -0.148680999875 0.217531993985 1.5 + vertex -0.134736001492 0.154116004705 -1.5 + endloop + endfacet + facet normal 0.976665530864 0.214766014121 -0 + outer loop + vertex -0.134736001492 0.154116004705 -1.5 + vertex -0.148680999875 0.217531993985 1.5 + vertex -0.134736001492 0.154116004705 1.5 + endloop + endfacet + facet normal 1 0 -0 + outer loop + vertex -0.148680999875 0.282467007637 -1.5 + vertex -0.148680999875 0.282467007637 1.5 + vertex -0.148680999875 0.217531993985 -1.5 + endloop + endfacet + facet normal 1 0 0 + outer loop + vertex -0.148680999875 0.217531993985 -1.5 + vertex -0.148680999875 0.282467007637 1.5 + vertex -0.148680999875 0.217531993985 1.5 + endloop + endfacet + facet normal 0.976666240056 -0.214762788992 0 + outer loop + vertex -0.134736001492 0.345883995295 -1.5 + vertex -0.134736001492 0.345883995295 1.5 + vertex -0.148680999875 0.282467007637 -1.5 + endloop + endfacet + facet normal 0.976666240056 -0.214762788992 0 + outer loop + vertex -0.148680999875 0.282467007637 -1.5 + vertex -0.134736001492 0.345883995295 1.5 + vertex -0.148680999875 0.282467007637 1.5 + endloop + endfacet + facet normal 0.90773249136 -0.4195494299 0 + outer loop + vertex -0.107496999204 0.404817998409 -1.5 + vertex -0.107496999204 0.404817998409 1.5 + vertex -0.134736001492 0.345883995295 -1.5 + endloop + endfacet + facet normal 0.90773249136 -0.4195494299 0 + outer loop + vertex -0.134736001492 0.345883995295 -1.5 + vertex -0.107496999204 0.404817998409 1.5 + vertex -0.134736001492 0.345883995295 1.5 + endloop + endfacet + facet normal 0.796375500831 -0.604802498073 0 + outer loop + vertex -0.0682383030653 0.456512004137 -1.5 + vertex -0.0682383030653 0.456512004137 1.5 + vertex -0.107496999204 0.404817998409 -1.5 + endloop + endfacet + facet normal -0.99415065992 0.108002154517 0 + outer loop + vertex 0.442546993494 0.185445994139 -1.5 + vertex 0.442546993494 0.185445994139 1.5 + vertex 0.449559986591 0.25 -1.5 + endloop + endfacet + facet normal -0.99415065992 0.108002154517 0 + outer loop + vertex 0.449559986591 0.25 -1.5 + vertex 0.442546993494 0.185445994139 1.5 + vertex 0.449559986591 0.25 1.5 + endloop + endfacet + facet normal -0.947745893024 0.319026209355 0 + outer loop + vertex 0.421833008528 0.12391000241 -1.5 + vertex 0.421833008528 0.12391000241 1.5 + vertex 0.442546993494 0.185445994139 -1.5 + endloop + endfacet + facet normal -0.947745893024 0.319026209355 0 + outer loop + vertex 0.442546993494 0.185445994139 -1.5 + vertex 0.421833008528 0.12391000241 1.5 + vertex 0.442546993494 0.185445994139 1.5 + endloop + endfacet + facet normal -0.857078113059 0.515186478971 0 + outer loop + vertex 0.388388007879 0.0682699978352 -1.5 + vertex 0.388388007879 0.0682699978352 1.5 + vertex 0.421833008528 0.12391000241 -1.5 + endloop + endfacet + facet normal -0.857078113059 0.515186478971 0 + outer loop + vertex 0.421833008528 0.12391000241 -1.5 + vertex 0.388388007879 0.0682699978352 1.5 + vertex 0.421833008528 0.12391000241 1.5 + endloop + endfacet + facet normal -0.726331758 0.687344293146 0 + outer loop + vertex 0.343775987625 0.02112749964 -1.5 + vertex 0.343775987625 0.02112749964 1.5 + vertex 0.388388007879 0.0682699978352 -1.5 + endloop + endfacet + facet normal -0.726331758 0.687344293146 0 + outer loop + vertex 0.388388007879 0.0682699978352 -1.5 + vertex 0.343775987625 0.02112749964 1.5 + vertex 0.388388007879 0.0682699978352 1.5 + endloop + endfacet + facet normal -0.561565427605 0.827432335916 0 + outer loop + vertex 0.290082991123 -0.0153131000698 -1.5 + vertex 0.290082991123 -0.0153131000698 1.5 + vertex 0.343775987625 0.02112749964 -1.5 + endloop + endfacet + facet normal -0.561565427605 0.827432335916 0 + outer loop + vertex 0.343775987625 0.02112749964 -1.5 + vertex 0.290082991123 -0.0153131000698 1.5 + vertex 0.343775987625 0.02112749964 1.5 + endloop + endfacet + facet normal -0.370449778906 0.928852497068 0 + outer loop + vertex 0.229818999767 -0.0393478982151 -1.5 + vertex 0.229818999767 -0.0393478982151 1.5 + vertex 0.290082991123 -0.0153131000698 -1.5 + endloop + endfacet + facet normal -0.370449778906 0.928852497068 0 + outer loop + vertex 0.290082991123 -0.0153131000698 -1.5 + vertex 0.229818999767 -0.0393478982151 1.5 + vertex 0.290082991123 -0.0153131000698 1.5 + endloop + endfacet + facet normal -0.161937308414 0.986801047904 0 + outer loop + vertex 0.165802001953 -0.0498532988131 -1.5 + vertex 0.165802001953 -0.0498532988131 1.5 + vertex 0.229818999767 -0.0393478982151 -1.5 + endloop + endfacet + facet normal -0.161937308414 0.986801047904 0 + outer loop + vertex 0.229818999767 -0.0393478982151 -1.5 + vertex 0.165802001953 -0.0498532988131 1.5 + vertex 0.229818999767 -0.0393478982151 1.5 + endloop + endfacet + facet normal 0.0541918998299 0.998530539339 -0 + outer loop + vertex 0.101025998592 -0.0463377982378 -1.5 + vertex 0.101025998592 -0.0463377982378 1.5 + vertex 0.165802001953 -0.0498532988131 -1.5 + endloop + endfacet + facet normal 0.0541918998299 0.998530539339 -0 + outer loop + vertex 0.165802001953 -0.0498532988131 -1.5 + vertex 0.101025998592 -0.0463377982378 1.5 + vertex 0.165802001953 -0.0498532988131 1.5 + endloop + endfacet + facet normal 0.267771842801 0.963482350748 -0 + outer loop + vertex 0.0385189987719 -0.0289657991379 -1.5 + vertex 0.0385189987719 -0.0289657991379 1.5 + vertex 0.101025998592 -0.0463377982378 -1.5 + endloop + endfacet + facet normal 0.267771842801 0.963482350748 -0 + outer loop + vertex 0.101025998592 -0.0463377982378 -1.5 + vertex 0.0385189987719 -0.0289657991379 1.5 + vertex 0.101025998592 -0.0463377982378 1.5 + endloop + endfacet + facet normal 0.468764725245 0.883323062286 -0 + outer loop + vertex -0.0187957007438 0.00145015004091 -1.5 + vertex -0.0187957007438 0.00145015004091 1.5 + vertex 0.0385189987719 -0.0289657991379 -1.5 + endloop + endfacet + facet normal -0.947745881345 -0.31902624405 0 + outer loop + vertex 0.442546993494 0.314554005861 -1.5 + vertex 0.442546993494 0.314554005861 1.5 + vertex 0.421833008528 0.376089990139 -1.5 + endloop + endfacet + facet normal -0.947745881345 -0.31902624405 0 + outer loop + vertex 0.421833008528 0.376089990139 -1.5 + vertex 0.442546993494 0.314554005861 1.5 + vertex 0.421833008528 0.376089990139 1.5 + endloop + endfacet + facet normal -0.99415065992 -0.108002154517 0 + outer loop + vertex 0.449559986591 0.25 -1.5 + vertex 0.449559986591 0.25 1.5 + vertex 0.442546993494 0.314554005861 -1.5 + endloop + endfacet + facet normal -0.99415065992 -0.108002154517 0 + outer loop + vertex 0.442546993494 0.314554005861 -1.5 + vertex 0.449559986591 0.25 1.5 + vertex 0.442546993494 0.314554005861 1.5 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex -0.300000011921 0 -1.39999997616 + vertex -0.300000011921 0 1.5 + vertex -0.699999988079 0 -1.39999997616 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex -0.699999988079 0 -1.39999997616 + vertex -0.300000011921 0 1.5 + vertex -0.699999988079 0 1.5 + endloop + endfacet + facet normal -1 0 0 + outer loop + vertex -0.300000011921 -0.40000000596 -1.39999997616 + vertex -0.300000011921 -0.40000000596 1.5 + vertex -0.300000011921 0 -1.39999997616 + endloop + endfacet + facet normal -1 0 0 + outer loop + vertex -0.300000011921 0 -1.39999997616 + vertex -0.300000011921 -0.40000000596 1.5 + vertex -0.300000011921 0 1.5 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -0.699999988079 -0.40000000596 -1.39999997616 + vertex -0.699999988079 -0.40000000596 1.5 + vertex -0.300000011921 -0.40000000596 -1.39999997616 + endloop + endfacet + facet normal 0 1 -0 + outer loop + vertex -0.300000011921 -0.40000000596 -1.39999997616 + vertex -0.699999988079 -0.40000000596 1.5 + vertex -0.300000011921 -0.40000000596 1.5 + endloop + endfacet + facet normal 1 0 -0 + outer loop + vertex -0.699999988079 0 -1.39999997616 + vertex -0.699999988079 0 1.5 + vertex -0.699999988079 -0.40000000596 -1.39999997616 + endloop + endfacet + facet normal 1 0 0 + outer loop + vertex -0.699999988079 -0.40000000596 -1.39999997616 + vertex -0.699999988079 0 1.5 + vertex -0.699999988079 -0.40000000596 1.5 + endloop + endfacet + facet normal 0.796375500831 -0.604802498073 0 + outer loop + vertex -0.107496999204 0.404817998409 -1.5 + vertex -0.0682383030653 0.456512004137 1.5 + vertex -0.107496999204 0.404817998409 1.5 + endloop + endfacet + facet normal 0.647754558747 -0.761849087171 0 + outer loop + vertex -0.018795799464 0.498549997807 -1.5 + vertex -0.018795799464 0.498549997807 1.5 + vertex -0.0682383030653 0.456512004137 -1.5 + endloop + endfacet + facet normal 0.647754558747 -0.761849087171 0 + outer loop + vertex -0.0682383030653 0.456512004137 -1.5 + vertex -0.018795799464 0.498549997807 1.5 + vertex -0.0682383030653 0.456512004137 1.5 + endloop + endfacet + facet normal 0.468765490288 -0.88332265629 0 + outer loop + vertex 0.0385188981891 0.528966009617 -1.5 + vertex 0.0385188981891 0.528966009617 1.5 + vertex -0.018795799464 0.498549997807 -1.5 + endloop + endfacet + facet normal 0.468765490288 -0.88332265629 0 + outer loop + vertex -0.018795799464 0.498549997807 -1.5 + vertex 0.0385188981891 0.528966009617 1.5 + vertex -0.018795799464 0.498549997807 1.5 + endloop + endfacet + facet normal 0.267771629378 -0.963482410063 0 + outer loop + vertex 0.101025998592 0.546338021755 -1.5 + vertex 0.101025998592 0.546338021755 1.5 + vertex 0.0385188981891 0.528966009617 -1.5 + endloop + endfacet + facet normal 0.267771629378 -0.963482410063 0 + outer loop + vertex 0.0385188981891 0.528966009617 -1.5 + vertex 0.101025998592 0.546338021755 1.5 + vertex 0.0385188981891 0.528966009617 1.5 + endloop + endfacet + facet normal 0.0541842846189 -0.9985309526 0 + outer loop + vertex 0.165802001953 0.549853026867 -1.5 + vertex 0.165802001953 0.549853026867 1.5 + vertex 0.101025998592 0.546338021755 -1.5 + endloop + endfacet + facet normal 0.0541842846189 -0.9985309526 0 + outer loop + vertex 0.101025998592 0.546338021755 -1.5 + vertex 0.165802001953 0.549853026867 1.5 + vertex 0.101025998592 0.546338021755 1.5 + endloop + endfacet + facet normal -0.161931604744 -0.986801983878 0 + outer loop + vertex 0.229818999767 0.539348006248 -1.5 + vertex 0.229818999767 0.539348006248 1.5 + vertex 0.165802001953 0.549853026867 -1.5 + endloop + endfacet + facet normal -0.161931604744 -0.986801983878 0 + outer loop + vertex 0.165802001953 0.549853026867 -1.5 + vertex 0.229818999767 0.539348006248 1.5 + vertex 0.165802001953 0.549853026867 1.5 + endloop + endfacet + facet normal -0.370452156748 -0.928851548721 0 + outer loop + vertex 0.290082991123 0.515313029289 -1.5 + vertex 0.290082991123 0.515313029289 1.5 + vertex 0.229818999767 0.539348006248 -1.5 + endloop + endfacet + facet normal -0.370452156748 -0.928851548721 0 + outer loop + vertex 0.229818999767 0.539348006248 -1.5 + vertex 0.290082991123 0.515313029289 1.5 + vertex 0.229818999767 0.539348006248 1.5 + endloop + endfacet + facet normal -0.561559256785 -0.827436523921 0 + outer loop + vertex 0.343775987625 0.47887301445 -1.5 + vertex 0.343775987625 0.47887301445 1.5 + vertex 0.290082991123 0.515313029289 -1.5 + endloop + endfacet + facet normal -0.561559256785 -0.827436523921 0 + outer loop + vertex 0.290082991123 0.515313029289 -1.5 + vertex 0.343775987625 0.47887301445 1.5 + vertex 0.290082991123 0.515313029289 1.5 + endloop + endfacet + facet normal -0.726335500024 -0.687340338846 0 + outer loop + vertex 0.388388007879 0.431730002165 -1.5 + vertex 0.388388007879 0.431730002165 1.5 + vertex 0.343775987625 0.47887301445 -1.5 + endloop + endfacet + facet normal -0.726335500024 -0.687340338846 0 + outer loop + vertex 0.343775987625 0.47887301445 -1.5 + vertex 0.388388007879 0.431730002165 1.5 + vertex 0.343775987625 0.47887301445 1.5 + endloop + endfacet + facet normal -0.857078143521 -0.515186428295 0 + outer loop + vertex 0.421833008528 0.376089990139 -1.5 + vertex 0.421833008528 0.376089990139 1.5 + vertex 0.388388007879 0.431730002165 -1.5 + endloop + endfacet + facet normal -0.857078143521 -0.515186428295 0 + outer loop + vertex 0.388388007879 0.431730002165 -1.5 + vertex 0.421833008528 0.376089990139 1.5 + vertex 0.388388007879 0.431730002165 1.5 + endloop + endfacet + facet normal 1 -0 0 + outer loop + vertex 1.29999995232 0 1.5 + vertex 1.29999995232 0.40000000596 -1.5 + vertex 1.29999995232 0.40000000596 1.5 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 0.899999976158 0 1.5 + vertex 0.899999976158 0 -1.5 + vertex 1.29999995232 0 -1.5 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 0.899999976158 0 1.5 + vertex 1.29999995232 0 -1.5 + vertex 1.29999995232 0 1.5 + endloop + endfacet + facet normal 0.196116149188 -0.980580672881 0 + outer loop + vertex 0.40000000596 -0.10000000149 1.5 + vertex 0.40000000596 -0.10000000149 -1.5 + vertex 0.899999976158 0 -1.5 + endloop + endfacet + facet normal 0.196116149188 -0.980580672881 0 + outer loop + vertex 0.40000000596 -0.10000000149 1.5 + vertex 0.899999976158 0 -1.5 + vertex 0.899999976158 0 1.5 + endloop + endfacet + facet normal 1 0 0 + outer loop + vertex 0.40000000596 -0.300000011921 1.5 + vertex 0.40000000596 -0.300000011921 -1.5 + vertex 0.40000000596 -0.10000000149 -1.5 + endloop + endfacet + facet normal 1 -0 0 + outer loop + vertex 0.40000000596 -0.300000011921 1.5 + vertex 0.40000000596 -0.10000000149 -1.5 + vertex 0.40000000596 -0.10000000149 1.5 + endloop + endfacet + facet normal 0.242535608029 0.970142504397 0 + outer loop + vertex 0.800000011921 -0.40000000596 1.5 + vertex 0.800000011921 -0.40000000596 -1.5 + vertex 0.40000000596 -0.300000011921 -1.5 + endloop + endfacet + facet normal 0.242535608029 0.970142504397 0 + outer loop + vertex 0.800000011921 -0.40000000596 1.5 + vertex 0.40000000596 -0.300000011921 -1.5 + vertex 0.40000000596 -0.300000011921 1.5 + endloop + endfacet + facet normal 0.242535591022 0.970142508649 0 + outer loop + vertex 1.20000004768 -0.5 1.5 + vertex 1.20000004768 -0.5 -1.5 + vertex 0.800000011921 -0.40000000596 -1.5 + endloop + endfacet + facet normal 0.242535591022 0.970142508649 0 + outer loop + vertex 1.20000004768 -0.5 1.5 + vertex 0.800000011921 -0.40000000596 -1.5 + vertex 0.800000011921 -0.40000000596 1.5 + endloop + endfacet + facet normal 0.980580666699 -0.196116180098 0 + outer loop + vertex 1.10000002384 -1 1.5 + vertex 1.10000002384 -1 -1.5 + vertex 1.20000004768 -0.5 -1.5 + endloop + endfacet + facet normal 0.980580666699 -0.196116180098 0 + outer loop + vertex 1.10000002384 -1 1.5 + vertex 1.20000004768 -0.5 -1.5 + vertex 1.20000004768 -0.5 1.5 + endloop + endfacet + facet normal 0.124034761887 -0.992277873301 0 + outer loop + vertex 0.300000011921 -1.10000002384 1.5 + vertex 0.300000011921 -1.10000002384 -1.5 + vertex 1.10000002384 -1 -1.5 + endloop + endfacet + facet normal 0.124034761887 -0.992277873301 0 + outer loop + vertex 0.300000011921 -1.10000002384 1.5 + vertex 1.10000002384 -1 -1.5 + vertex 1.10000002384 -1 1.5 + endloop + endfacet + facet normal -0.894427244312 0.447213488876 0 + outer loop + vertex 0.40000000596 -0.899999976158 1.5 + vertex 0.40000000596 -0.899999976158 -1.5 + vertex 0.300000011921 -1.10000002384 -1.5 + endloop + endfacet + facet normal 0.707106781187 0.707106781187 0 + outer loop + vertex -0.600000023842 0.699999988079 1.5 + vertex -0.600000023842 0.699999988079 -1.5 + vertex -0.800000011921 0.899999976158 -1.5 + endloop + endfacet + facet normal 0.707106781187 0.707106781187 0 + outer loop + vertex -0.600000023842 0.699999988079 1.5 + vertex -0.800000011921 0.899999976158 -1.5 + vertex -0.800000011921 0.899999976158 1.5 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -0.40000000596 0.699999988079 1.5 + vertex -0.40000000596 0.699999988079 -1.5 + vertex -0.600000023842 0.699999988079 -1.5 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -0.40000000596 0.699999988079 1.5 + vertex -0.600000023842 0.699999988079 -1.5 + vertex -0.600000023842 0.699999988079 1.5 + endloop + endfacet + facet normal -0.948683307475 0.316227737744 0 + outer loop + vertex -0.300000011921 1 1.5 + vertex -0.300000011921 1 -1.5 + vertex -0.40000000596 0.699999988079 -1.5 + endloop + endfacet + facet normal -0.948683307475 0.316227737744 0 + outer loop + vertex -0.300000011921 1 1.5 + vertex -0.40000000596 0.699999988079 -1.5 + vertex -0.40000000596 0.699999988079 1.5 + endloop + endfacet + facet normal -0.316227822563 0.948683279202 0 + outer loop + vertex 0 1.10000002384 1.5 + vertex 0 1.10000002384 -1.5 + vertex -0.300000011921 1 -1.5 + endloop + endfacet + facet normal -0.316227822563 0.948683279202 0 + outer loop + vertex 0 1.10000002384 1.5 + vertex -0.300000011921 1 -1.5 + vertex -0.300000011921 1 1.5 + endloop + endfacet + facet normal 0.447213675468 0.894427151016 0 + outer loop + vertex 0.20000000298 1 1.5 + vertex 0.20000000298 1 -1.5 + vertex 0 1.10000002384 -1.5 + endloop + endfacet + facet normal 0.447213675468 0.894427151016 0 + outer loop + vertex 0.20000000298 1 1.5 + vertex 0 1.10000002384 -1.5 + vertex 0 1.10000002384 1.5 + endloop + endfacet + facet normal 0.554700177151 0.832050307054 0 + outer loop + vertex 0.5 0.800000011921 1.5 + vertex 0.5 0.800000011921 -1.5 + vertex 0.20000000298 1 -1.5 + endloop + endfacet + facet normal 0.554700177151 0.832050307054 0 + outer loop + vertex 0.5 0.800000011921 1.5 + vertex 0.20000000298 1 -1.5 + vertex 0.20000000298 1 1.5 + endloop + endfacet + facet normal -0.707106781187 0.707106781187 0 + outer loop + vertex 0.699999988079 1 1.5 + vertex 0.699999988079 1 -1.5 + vertex 0.5 0.800000011921 -1.5 + endloop + endfacet + facet normal -0.707106781187 0.707106781187 0 + outer loop + vertex 0.699999988079 1 1.5 + vertex 0.5 0.800000011921 -1.5 + vertex 0.5 0.800000011921 1.5 + endloop + endfacet + facet normal 0.554700158076 0.832050319771 0 + outer loop + vertex 1 0.800000011921 1.5 + vertex 1 0.800000011921 -1.5 + vertex 0.699999988079 1 -1.5 + endloop + endfacet + facet normal 0.554700158076 0.832050319771 0 + outer loop + vertex 1 0.800000011921 1.5 + vertex 0.699999988079 1 -1.5 + vertex 0.699999988079 1 1.5 + endloop + endfacet + facet normal 0.800000050068 0.599999933243 0 + outer loop + vertex 1.29999995232 0.40000000596 1.5 + vertex 1.29999995232 0.40000000596 -1.5 + vertex 1 0.800000011921 -1.5 + endloop + endfacet + facet normal 0.800000050068 0.599999933243 0 + outer loop + vertex 1.29999995232 0.40000000596 1.5 + vertex 1 0.800000011921 -1.5 + vertex 1 0.800000011921 1.5 + endloop + endfacet + facet normal 1 0 0 + outer loop + vertex 1.29999995232 0 1.5 + vertex 1.29999995232 0 -1.5 + vertex 1.29999995232 0.40000000596 -1.5 + endloop + endfacet + facet normal -0.707106702161 -0.707106860212 -0 + outer loop + vertex -1.20000004768 0.10000000149 1.5 + vertex -1.20000004768 0.10000000149 -1.5 + vertex -1.10000002384 0 -1.5 + endloop + endfacet + facet normal -0.707106702161 -0.707106860212 0 + outer loop + vertex -1.20000004768 0.10000000149 1.5 + vertex -1.10000002384 0 -1.5 + vertex -1.10000002384 0 1.5 + endloop + endfacet + facet normal -0.894427370928 -0.447213235644 -0 + outer loop + vertex -1.29999995232 0.300000011921 1.5 + vertex -1.29999995232 0.300000011921 -1.5 + vertex -1.20000004768 0.10000000149 -1.5 + endloop + endfacet + facet normal -0.894427370928 -0.447213235644 0 + outer loop + vertex -1.29999995232 0.300000011921 1.5 + vertex -1.20000004768 0.10000000149 -1.5 + vertex -1.20000004768 0.10000000149 1.5 + endloop + endfacet + facet normal -0.894427350936 0.447213275628 0 + outer loop + vertex -1.20000004768 0.5 1.5 + vertex -1.20000004768 0.5 -1.5 + vertex -1.29999995232 0.300000011921 -1.5 + endloop + endfacet + facet normal -0.894427350936 0.447213275628 0 + outer loop + vertex -1.20000004768 0.5 1.5 + vertex -1.29999995232 0.300000011921 -1.5 + vertex -1.29999995232 0.300000011921 1.5 + endloop + endfacet + facet normal -0.894427350936 -0.447213275628 -0 + outer loop + vertex -1.29999995232 0.699999988079 1.5 + vertex -1.29999995232 0.699999988079 -1.5 + vertex -1.20000004768 0.5 -1.5 + endloop + endfacet + facet normal -0.894427350936 -0.447213275628 0 + outer loop + vertex -1.29999995232 0.699999988079 1.5 + vertex -1.20000004768 0.5 -1.5 + vertex -1.20000004768 0.5 1.5 + endloop + endfacet + facet normal -1 0 -0 + outer loop + vertex -1.29999995232 0.800000011921 1.5 + vertex -1.29999995232 0.800000011921 -1.5 + vertex -1.29999995232 0.699999988079 -1.5 + endloop + endfacet + facet normal -1 -0 0 + outer loop + vertex -1.29999995232 0.800000011921 1.5 + vertex -1.29999995232 0.699999988079 -1.5 + vertex -1.29999995232 0.699999988079 1.5 + endloop + endfacet + facet normal 0.447213808748 0.894427084376 0 + outer loop + vertex -1.10000002384 0.699999988079 1.5 + vertex -1.10000002384 0.699999988079 -1.5 + vertex -1.29999995232 0.800000011921 -1.5 + endloop + endfacet + facet normal 0.447213808748 0.894427084376 0 + outer loop + vertex -1.10000002384 0.699999988079 1.5 + vertex -1.29999995232 0.800000011921 -1.5 + vertex -1.29999995232 0.800000011921 1.5 + endloop + endfacet + facet normal -0.4472135955 0.894427191 0 + outer loop + vertex -0.899999976158 0.800000011921 1.5 + vertex -0.899999976158 0.800000011921 -1.5 + vertex -1.10000002384 0.699999988079 -1.5 + endloop + endfacet + facet normal -0.4472135955 0.894427191 0 + outer loop + vertex -0.899999976158 0.800000011921 1.5 + vertex -1.10000002384 0.699999988079 -1.5 + vertex -1.10000002384 0.699999988079 1.5 + endloop + endfacet + facet normal -0.707106781187 0.707106781187 0 + outer loop + vertex -0.800000011921 0.899999976158 1.5 + vertex -0.800000011921 0.899999976158 -1.5 + vertex -0.899999976158 0.800000011921 -1.5 + endloop + endfacet + facet normal -0.707106781187 0.707106781187 0 + outer loop + vertex -0.800000011921 0.899999976158 1.5 + vertex -0.899999976158 0.800000011921 -1.5 + vertex -0.899999976158 0.800000011921 1.5 + endloop + endfacet + facet normal -0.894427244312 0.447213488876 0 + outer loop + vertex 0.40000000596 -0.899999976158 1.5 + vertex 0.300000011921 -1.10000002384 -1.5 + vertex 0.300000011921 -1.10000002384 1.5 + endloop + endfacet + facet normal -0.316227744812 -0.948683305119 -0 + outer loop + vertex -0.20000000298 -0.699999988079 1.5 + vertex -0.20000000298 -0.699999988079 -1.5 + vertex 0.40000000596 -0.899999976158 -1.5 + endloop + endfacet + facet normal -0.316227744812 -0.948683305119 0 + outer loop + vertex -0.20000000298 -0.699999988079 1.5 + vertex 0.40000000596 -0.899999976158 -1.5 + vertex 0.40000000596 -0.899999976158 1.5 + endloop + endfacet + facet normal 0.707106754845 -0.707106807528 0 + outer loop + vertex -0.40000000596 -0.899999976158 1.5 + vertex -0.40000000596 -0.899999976158 -1.5 + vertex -0.20000000298 -0.699999988079 -1.5 + endloop + endfacet + facet normal 0.707106754845 -0.707106807528 0 + outer loop + vertex -0.40000000596 -0.899999976158 1.5 + vertex -0.20000000298 -0.699999988079 -1.5 + vertex -0.20000000298 -0.699999988079 1.5 + endloop + endfacet + facet normal -0.196116078939 -0.980580686931 -0 + outer loop + vertex -0.899999976158 -0.800000011921 1.5 + vertex -0.899999976158 -0.800000011921 -1.5 + vertex -0.40000000596 -0.899999976158 -1.5 + endloop + endfacet + facet normal -0.196116078939 -0.980580686931 0 + outer loop + vertex -0.899999976158 -0.800000011921 1.5 + vertex -0.40000000596 -0.899999976158 -1.5 + vertex -0.40000000596 -0.899999976158 1.5 + endloop + endfacet + facet normal -0.316227766017 -0.948683298051 -0 + outer loop + vertex -1.20000004768 -0.699999988079 1.5 + vertex -1.20000004768 -0.699999988079 -1.5 + vertex -0.899999976158 -0.800000011921 -1.5 + endloop + endfacet + facet normal -0.316227766017 -0.948683298051 0 + outer loop + vertex -1.20000004768 -0.699999988079 1.5 + vertex -0.899999976158 -0.800000011921 -1.5 + vertex -0.899999976158 -0.800000011921 1.5 + endloop + endfacet + facet normal -0.948683382869 -0.31622751156 -0 + outer loop + vertex -1.29999995232 -0.40000000596 1.5 + vertex -1.29999995232 -0.40000000596 -1.5 + vertex -1.20000004768 -0.699999988079 -1.5 + endloop + endfacet + facet normal -0.948683382869 -0.31622751156 0 + outer loop + vertex -1.29999995232 -0.40000000596 1.5 + vertex -1.20000004768 -0.699999988079 -1.5 + vertex -1.20000004768 -0.699999988079 1.5 + endloop + endfacet + facet normal -0.707106912895 0.707106649478 0 + outer loop + vertex -1.10000002384 -0.20000000298 1.5 + vertex -1.10000002384 -0.20000000298 -1.5 + vertex -1.29999995232 -0.40000000596 -1.5 + endloop + endfacet + facet normal -0.707106912895 0.707106649478 0 + outer loop + vertex -1.10000002384 -0.20000000298 1.5 + vertex -1.29999995232 -0.40000000596 -1.5 + vertex -1.29999995232 -0.40000000596 1.5 + endloop + endfacet + facet normal -0.447213515532 0.894427230984 0 + outer loop + vertex -0.899999976158 -0.10000000149 1.5 + vertex -0.899999976158 -0.10000000149 -1.5 + vertex -1.10000002384 -0.20000000298 -1.5 + endloop + endfacet + facet normal -0.447213515532 0.894427230984 0 + outer loop + vertex -0.899999976158 -0.10000000149 1.5 + vertex -1.10000002384 -0.20000000298 -1.5 + vertex -1.10000002384 -0.20000000298 1.5 + endloop + endfacet + facet normal -1 0 -0 + outer loop + vertex -0.899999976158 0.20000000298 1.5 + vertex -0.899999976158 0.20000000298 -1.5 + vertex -0.899999976158 -0.10000000149 -1.5 + endloop + endfacet + facet normal -1 -0 0 + outer loop + vertex -0.899999976158 0.20000000298 1.5 + vertex -0.899999976158 -0.10000000149 -1.5 + vertex -0.899999976158 -0.10000000149 1.5 + endloop + endfacet + facet normal 0.707106702161 -0.707106860212 0 + outer loop + vertex -1.10000002384 0 1.5 + vertex -1.10000002384 0 -1.5 + vertex -0.899999976158 0.20000000298 -1.5 + endloop + endfacet + facet normal 0.707106702161 -0.707106860212 0 + outer loop + vertex -1.10000002384 0 1.5 + vertex -0.899999976158 0.20000000298 -1.5 + vertex -0.899999976158 0.20000000298 1.5 + endloop + endfacet +endsolid jagged diff --git a/tutorials/mesh/cv2DMesh/jaggedBoundary/system/controlDict b/tutorials/mesh/cv2DMesh/jaggedBoundary/system/controlDict new file mode 100644 index 0000000000000000000000000000000000000000..97f40d27531af3a6c5c595a81aa9ef2e096d932b --- /dev/null +++ b/tutorials/mesh/cv2DMesh/jaggedBoundary/system/controlDict @@ -0,0 +1,47 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: dev | +| \\ / A nd | Web: www.OpenFOAM.org | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + location "system"; + object controlDict; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +startFrom startTime; + +startTime 0; + +stopAt endTime; + +endTime 100; + +deltaT 1; + +writeControl timeStep; + +writeInterval 1; + +purgeWrite 0; + +writeFormat ascii; + +writePrecision 12; + +writeCompression off; + +timeFormat general; + +timePrecision 6; + +runTimeModifiable true; + + +// ************************************************************************* // diff --git a/tutorials/mesh/cv2DMesh/jaggedBoundary/system/cv2DMeshDict b/tutorials/mesh/cv2DMesh/jaggedBoundary/system/cv2DMeshDict new file mode 100644 index 0000000000000000000000000000000000000000..76d790c4c22db911749d7bcd2441937e2ffde24c --- /dev/null +++ b/tutorials/mesh/cv2DMesh/jaggedBoundary/system/cv2DMeshDict @@ -0,0 +1,147 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: dev | +| \\ / A nd | Web: www.OpenFOAM.org | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + object cv2DMeshDict; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +geometry +{ + jaggedBoundary.stl + { + name jaggedBoundary; + type closedTriSurfaceMesh; + } +} + +surfaceConformation +{ + // The z-coordinate of the plane is taken from here. + locationInMesh (-0.6 0.3 0.0); + + pointPairDistanceCoeff 0.001; + + // If area of a dual cell is less than the square of this, do not refine. + minEdgeLenCoeff 0.001; + + // How much cells are allowed to stick out of the surfaces before + // points are inserted onto the boundary + maxNotchLenCoeff 1; + + minNearPointDistCoeff 0.001; + + maxQuadAngle 125; + + // Insert near-boundary point mirror or point-pairs + insertSurfaceNearestPointPairs yes; + + // Mirror near-boundary points rather than insert point-pairs + mirrorPoints no; + + // Insert point-pairs vor dual-cell vertices very near the surface + insertSurfaceNearPointPairs yes; + + // Maximum number of iterations used in boundaryConform. + maxBoundaryConformingIter 5; + + geometryToConformTo + { + jaggedBoundary + { + featureMethod extendedFeatureEdgeMesh; + extendedFeatureEdgeMesh "jaggedBoundary.extendedFeatureEdgeMesh"; + } + } + + additionalFeatures + { + } + + // Choose if to randomise the initial grid created by insertGrid. + randomiseInitialGrid yes; + + // Perturbation fraction, 1 = cell-size. + randomPerturbation 0.1; +} + + +motionControl +{ + // This is a tolerance for determining whether to deal with surface + // protrusions or not. + minCellSize 0.04; + + // Assign a priority to all requests for cell sizes, the highest overrules. + defaultPriority 0; + + shapeControlFunctions + { + jaggedBoundary + { + type searchableSurfaceControl; + priority 1; + mode inside; + + cellSizeFunction surfaceOffsetLinearDistance; + surfaceOffsetLinearDistanceCoeffs + { + distanceCellSize $minCellSize; + totalDistance 0.2; + surfaceOffset 0.05; + } + + surfaceCellSizeFunction uniformValue; + uniformValueCoeffs + { + surfaceCellSize 0.005; + } + } + } + + relaxationModel adaptiveLinear; + + adaptiveLinearCoeffs + { + relaxationStart 0.5; + relaxationEnd 0.0; + } + + objOutput no; + + meshedSurfaceOutput yes; + + // Near-wall region where cells are aligned with the wall specified as a + // number of cell layers + nearWallAlignedDist 3; +} + + +shortEdgeFilter +{ + // Factor to multiply the average of a face's edge lengths by. + // If an edge of that face is smaller than that value then delete it. + shortEdgeFilterFactor 0.2; + + // Weighting for the lengths of edges that are attached to the boundaries. + // Used when calculating the length of an edge. Default 2.0. + edgeAttachedToBoundaryFactor 2.0; +} + + +extrusion +{ + extrude off; + #include "extrude2DMeshDict"; +} + + +// ************************************************************************* // diff --git a/tutorials/mesh/cv2DMesh/jaggedBoundary/system/extrude2DMeshDict b/tutorials/mesh/cv2DMesh/jaggedBoundary/system/extrude2DMeshDict new file mode 100644 index 0000000000000000000000000000000000000000..b825f1608b358adf65d9bcdf3a1ed23ed5cb0b3b --- /dev/null +++ b/tutorials/mesh/cv2DMesh/jaggedBoundary/system/extrude2DMeshDict @@ -0,0 +1,42 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: dev | +| \\ / A nd | Web: www.OpenFOAM.org | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + object extrude2DMeshDict; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +extrudeModel linearDirection; + +patchInfo +{} + +patchType empty; + +nLayers 1; + +expansionRatio 1.0; + +linearDirectionCoeffs +{ + direction (0 0 1); + thickness 0.1; +} + +wedgeCoeffs +{ + axisPt (0 0 0); + axis (1 0 0); + angle 10; +} + + +// ************************************************************************* // diff --git a/tutorials/mesh/cv2DMesh/jaggedBoundary/system/fvSchemes b/tutorials/mesh/cv2DMesh/jaggedBoundary/system/fvSchemes new file mode 100644 index 0000000000000000000000000000000000000000..2e5c55b28ba64ca0cfc1a7c714148109cd736563 --- /dev/null +++ b/tutorials/mesh/cv2DMesh/jaggedBoundary/system/fvSchemes @@ -0,0 +1,54 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: dev | +| \\ / A nd | Web: www.OpenFOAM.org | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + location "system"; + object fvSchemes; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +ddtSchemes +{ + default none; +} + +gradSchemes +{ + default none; +} + +divSchemes +{ + default none; +} + +laplacianSchemes +{ + default none; +} + +interpolationSchemes +{ + default none; +} + +snGradSchemes +{ + default none; +} + +fluxRequired +{ + default no; +} + + +// ************************************************************************* // diff --git a/tutorials/mesh/cv2DMesh/jaggedBoundary/system/fvSolution b/tutorials/mesh/cv2DMesh/jaggedBoundary/system/fvSolution new file mode 100644 index 0000000000000000000000000000000000000000..8ce8c60878cf19b4d62a2c8cc71c3b465f3829ce --- /dev/null +++ b/tutorials/mesh/cv2DMesh/jaggedBoundary/system/fvSolution @@ -0,0 +1,22 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: dev | +| \\ / A nd | Web: www.OpenFOAM.org | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + location "system"; + object fvSolution; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +solvers +{} + + +// ************************************************************************* // diff --git a/tutorials/mesh/cv2DMesh/jaggedBoundary/system/surfaceFeatureExtractDict b/tutorials/mesh/cv2DMesh/jaggedBoundary/system/surfaceFeatureExtractDict new file mode 100644 index 0000000000000000000000000000000000000000..7ff6c35a0b093a2cd0a15ddbea69ee27a8f25fd6 --- /dev/null +++ b/tutorials/mesh/cv2DMesh/jaggedBoundary/system/surfaceFeatureExtractDict @@ -0,0 +1,52 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: dev | +| \\ / A nd | Web: www.OpenFOAM.org | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + object surfaceFeatureExtractDict; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +jaggedBoundary.stl +{ + extractionMethod extractFromSurface; + + extractFromSurfaceCoeffs + { + // Mark edges whose adjacent surface normals are at an angle less + // than includedAngle as features + // - 0 : selects no edges + // - 180: selects all edges + includedAngle 175; + } + + subsetFeatures + { + // Use a plane to select feature edges + // (normal)(basePoint) + // Keep only edges that intersect the plane will be included + plane (0 0 1)(-0.6 0.3 0.0); + + // Keep nonManifold edges (edges with >2 connected faces where + // the faces form more than two different normal planes) + nonManifoldEdges no; + + // Keep open edges (edges with 1 connected face) + openEdges no; + } + + // Write options + + // Write features to obj format for postprocessing + writeObj no; +} + + +// ************************************************************************* // diff --git a/tutorials/mesh/cv2DMesh/square/Allclean b/tutorials/mesh/cv2DMesh/square/Allclean new file mode 100755 index 0000000000000000000000000000000000000000..f30f73d875c750ccf27f825b52486c7c4ed4ae17 --- /dev/null +++ b/tutorials/mesh/cv2DMesh/square/Allclean @@ -0,0 +1,16 @@ +#!/bin/sh +cd ${0%/*} || exit 1 # run from this directory + +# Source tutorial run functions +. $WM_PROJECT_DIR/bin/tools/CleanFunctions + +rm -rf constant/extendedFeatureEdgeMesh > /dev/null 2>&1 +rm -rf constant/triSurface/unit_cube.eMesh > /dev/null 2>&1 +rm -rf constant/polyMesh > /dev/null 2>&1 + +rm -rf MeshedSurface*.obj > /dev/null 2>&1 + +cleanCase + + +# ----------------------------------------------------------------- end-of-file diff --git a/tutorials/mesh/cv2DMesh/square/Allrun b/tutorials/mesh/cv2DMesh/square/Allrun new file mode 100755 index 0000000000000000000000000000000000000000..469561f159d2c1fcda71722e6ddbe3b80e5cf274 --- /dev/null +++ b/tutorials/mesh/cv2DMesh/square/Allrun @@ -0,0 +1,13 @@ +#!/bin/sh +cd ${0%/*} || exit 1 # run from this directory + +# Source tutorial run functions +. $WM_PROJECT_DIR/bin/tools/RunFunctions + +runApplication surfaceFeatureExtract +runApplication cv2DMesh -overwrite +runApplication extrude2DMesh -overwrite polyMesh2D +runApplication checkMesh -allGeometry -allTopology -constant -noZero + + +# ----------------------------------------------------------------- end-of-file diff --git a/tutorials/mesh/cv2DMesh/square/constant/triSurface/unit_cube.stl b/tutorials/mesh/cv2DMesh/square/constant/triSurface/unit_cube.stl new file mode 100644 index 0000000000000000000000000000000000000000..4b213c284df4991591dac5e75a57e081817d7d39 --- /dev/null +++ b/tutorials/mesh/cv2DMesh/square/constant/triSurface/unit_cube.stl @@ -0,0 +1,88 @@ +solid inlet + facet normal 1 0 0 + outer loop + vertex 1 1 0.5 + vertex 1 0 0.5 + vertex 1 0 -0.5 + endloop + endfacet + facet normal 1 0 -0 + outer loop + vertex 1 1 -0.5 + vertex 1 1 0.5 + vertex 1 0 -0.5 + endloop + endfacet +endsolid inlet +solid cube.tri + facet normal -1 0 0 + outer loop + vertex 0 0 -0.5 + vertex 0 0 0.5 + vertex 0 1 0.5 + endloop + endfacet + facet normal -1 0 0 + outer loop + vertex 0 1 -0.5 + vertex 0 0 -0.5 + vertex 0 1 0.5 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex 1 1 0.5 + vertex 1 1 -0.5 + vertex 0 1 -0.5 + endloop + endfacet + facet normal -0 1 0 + outer loop + vertex 0 1 0.5 + vertex 1 1 0.5 + vertex 0 1 -0.5 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 0 0 -0.5 + vertex 1 0 -0.5 + vertex 1 0 0.5 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 0 0 0.5 + vertex 0 0 -0.5 + vertex 1 0 0.5 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 1 1 0.5 + vertex 0 1 0.5 + vertex 0 0 0.5 + endloop + endfacet + facet normal 0 -0 1 + outer loop + vertex 1 0 0.5 + vertex 1 1 0.5 + vertex 0 0 0.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 0 0 -0.5 + vertex 0 1 -0.5 + vertex 1 1 -0.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 1 0 -0.5 + vertex 0 0 -0.5 + vertex 1 1 -0.5 + endloop + endfacet +endsolid cube.tri diff --git a/tutorials/mesh/cv2DMesh/square/system/controlDict b/tutorials/mesh/cv2DMesh/square/system/controlDict new file mode 100644 index 0000000000000000000000000000000000000000..ccd8cd716ac1fb207115871ecfeeecabb71848fc --- /dev/null +++ b/tutorials/mesh/cv2DMesh/square/system/controlDict @@ -0,0 +1,52 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: dev | +| \\ / A nd | Web: www.OpenFOAM.org | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + location "system"; + object controlDict; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +startFrom startTime; + +startTime 0; + +stopAt endTime; + +endTime 100; + +deltaT 1; + +writeControl timeStep; + +writeInterval 1; + +purgeWrite 0; + +writeFormat ascii; + +writePrecision 12; + +writeCompression off; + +timeFormat general; + +timePrecision 6; + +runTimeModifiable true; + +DebugSwitches +{ + shortEdgeFilter2D 0; +} + + +// ************************************************************************* // diff --git a/tutorials/mesh/cv2DMesh/square/system/cv2DMeshDict b/tutorials/mesh/cv2DMesh/square/system/cv2DMeshDict new file mode 100644 index 0000000000000000000000000000000000000000..160a2e7518662153808e1da1d5417d43fb7f2c92 --- /dev/null +++ b/tutorials/mesh/cv2DMesh/square/system/cv2DMeshDict @@ -0,0 +1,165 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: dev | +| \\ / A nd | Web: www.OpenFOAM.org | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + object DMeshDict; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +geometry +{ + unit_cube.stl + { + name cube; + type triSurfaceMesh; + } + + refinementBox + { + type searchableBox; + min (0.25 0.25 -1000); + max (0.75 0.75 1000); + } +} + + +surfaceConformation +{ + // The z-coordinate of the plane is taken from here. + locationInMesh (0 0 0); + + pointPairDistanceCoeff 0.005; + + minEdgeLenCoeff 0.005; + + maxNotchLenCoeff 0.003; + + minNearPointDistCoeff 0.0025; + + maxQuadAngle 125; + + // Insert near-boundary point mirror or point-pairs + insertSurfaceNearestPointPairs yes; + + // Mirror near-boundary points rather than insert point-pairs + mirrorPoints no; + + // Insert point-pairs vor dual-cell vertices very near the surface + insertSurfaceNearPointPairs yes; + + // Maximum number of iterations used in boundaryConform. + maxBoundaryConformingIter 5; + + geometryToConformTo + { + cube + { + featureMethod extendedFeatureEdgeMesh; + extendedFeatureEdgeMesh "unit_cube.extendedFeatureEdgeMesh"; + } + } + + additionalFeatures + {} + + // Choose if to randomise the initial grid created by insertGrid. + randomiseInitialGrid yes; + + // Perturbation fraction, 1 = cell-size. + randomPerturbation 0.1; +} + + +motionControl +{ + minCellSize 0.04; + + // Assign a priority to all requests for cell sizes, the highest overrules. + defaultPriority 0; + + shapeControlFunctions + { + cube + { + type searchableSurfaceControl; + priority 1; + mode bothSides; + cellSizeFunction linearDistance; + linearDistanceCoeffs + { + distanceCellSize $minCellSize; + distance #calc"5*$minCellSize"; + } + surfaceCellSizeFunction uniformValue; + uniformValueCoeffs + { + surfaceCellSize #calc"0.05*$minCellSize"; + } + } + + refinementBox + { + type searchableSurfaceControl; + priority 1; + mode bothSides; + cellSizeFunction linearDistance; + linearDistanceCoeffs + { + distanceCellSize $minCellSize; + distance #calc"5*$minCellSize"; + } + surfaceCellSizeFunction uniformValue; + uniformValueCoeffs + { + surfaceCellSize #calc"0.05*$minCellSize"; + } + } + } + + relaxationModel adaptiveLinear; + + adaptiveLinearCoeffs + { + relaxationStart 0.5; + relaxationEnd 0.0; + } + + objOutput no; + + meshedSurfaceOutput yes; + + // Near-wall region where cells are aligned with the wall specified as a + // number of cell layers + nearWallAlignedDist 3; +} + + +shortEdgeFilter +{ + // Factor to multiply the average of a face's edge lengths by. + // If an edge of that face is smaller than that value then delete it. + shortEdgeFilterFactor 0.25; + + // Weighting for the lengths of edges that are attached to the boundaries. + // Used when calculating the length of an edge. Default 2.0. + edgeAttachedToBoundaryFactor 2.0; +} + + +extrusion +{ + extrude off; + + #include "extrude2DMeshDict"; +} + + +// ************************************************************************* // diff --git a/tutorials/mesh/cv2DMesh/square/system/extrude2DMeshDict b/tutorials/mesh/cv2DMesh/square/system/extrude2DMeshDict new file mode 100644 index 0000000000000000000000000000000000000000..b7116172e31faf4704909c60b88f4d0cd8217a3f --- /dev/null +++ b/tutorials/mesh/cv2DMesh/square/system/extrude2DMeshDict @@ -0,0 +1,42 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: dev | +| \\ / A nd | Web: www.OpenFOAM.org | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + object extrude2DMeshDict; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +extrudeModel wedge; + +patchInfo +{} + +patchType wedge; + +nLayers 1; + +expansionRatio 1.0; + +linearDirectionCoeffs +{ + direction (0 0 1); + thickness 0.1; +} + +wedgeCoeffs +{ + axisPt (0 0 0); + axis (1 0 0); + angle 10; +} + + +// ************************************************************************* // diff --git a/tutorials/mesh/cv2DMesh/square/system/fvSchemes b/tutorials/mesh/cv2DMesh/square/system/fvSchemes new file mode 100644 index 0000000000000000000000000000000000000000..2e5c55b28ba64ca0cfc1a7c714148109cd736563 --- /dev/null +++ b/tutorials/mesh/cv2DMesh/square/system/fvSchemes @@ -0,0 +1,54 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: dev | +| \\ / A nd | Web: www.OpenFOAM.org | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + location "system"; + object fvSchemes; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +ddtSchemes +{ + default none; +} + +gradSchemes +{ + default none; +} + +divSchemes +{ + default none; +} + +laplacianSchemes +{ + default none; +} + +interpolationSchemes +{ + default none; +} + +snGradSchemes +{ + default none; +} + +fluxRequired +{ + default no; +} + + +// ************************************************************************* // diff --git a/tutorials/mesh/cv2DMesh/square/system/fvSolution b/tutorials/mesh/cv2DMesh/square/system/fvSolution new file mode 100644 index 0000000000000000000000000000000000000000..8ce8c60878cf19b4d62a2c8cc71c3b465f3829ce --- /dev/null +++ b/tutorials/mesh/cv2DMesh/square/system/fvSolution @@ -0,0 +1,22 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: dev | +| \\ / A nd | Web: www.OpenFOAM.org | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + location "system"; + object fvSolution; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +solvers +{} + + +// ************************************************************************* // diff --git a/tutorials/mesh/cv2DMesh/square/system/surfaceFeatureExtractDict b/tutorials/mesh/cv2DMesh/square/system/surfaceFeatureExtractDict new file mode 100644 index 0000000000000000000000000000000000000000..6a2e6d3ffeb6709c39d112c2956869f000c526be --- /dev/null +++ b/tutorials/mesh/cv2DMesh/square/system/surfaceFeatureExtractDict @@ -0,0 +1,52 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: dev | +| \\ / A nd | Web: www.OpenFOAM.org | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + object surfaceFeatureExtractDict; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +unit_cube.stl +{ + extractionMethod extractFromSurface; + + extractFromSurfaceCoeffs + { + // Mark edges whose adjacent surface normals are at an angle less + // than includedAngle as features + // - 0 : selects no edges + // - 180: selects all edges + includedAngle 175; + } + + subsetFeatures + { + // Use a plane to select feature edges + // (normal)(basePoint) + // Keep only edges that intersect the plane will be included + plane (0 0 1)(0 0 0); + + // Keep nonManifold edges (edges with >2 connected faces where + // the faces form more than two different normal planes) + nonManifoldEdges no; + + // Keep open edges (edges with 1 connected face) + openEdges yes; + } + + // Write options + + // Write features to obj format for postprocessing + writeObj yes; +} + + +// ************************************************************************* // diff --git a/tutorials/mesh/cvMesh/blob/Allclean b/tutorials/mesh/cvMesh/blob/Allclean new file mode 100755 index 0000000000000000000000000000000000000000..3b8eb25810039817af3290c78cec672d91be429c --- /dev/null +++ b/tutorials/mesh/cvMesh/blob/Allclean @@ -0,0 +1,14 @@ +#!/bin/sh +cd ${0%/*} || exit 1 # run from this directory + +# Source tutorial run functions +. $WM_PROJECT_DIR/bin/tools/CleanFunctions + +cleanCase + +rm -rf constant/cellAlignments > /dev/null 2>&1 +rm -rf constant/targetCellSize > /dev/null 2>&1 +rm -rf constant/internalDelaunayVertices > /dev/null 2>&1 + + +# ----------------------------------------------------------------- end-of-file diff --git a/tutorials/mesh/cvMesh/blob/Allrun b/tutorials/mesh/cvMesh/blob/Allrun new file mode 100755 index 0000000000000000000000000000000000000000..ab12a6cbd5e5cd43785ffae0f8d8e1c4e2019ebf --- /dev/null +++ b/tutorials/mesh/cvMesh/blob/Allrun @@ -0,0 +1,11 @@ +#!/bin/sh +cd ${0%/*} || exit 1 # run from this directory + +# Source tutorial run functions +. $WM_PROJECT_DIR/bin/tools/RunFunctions + +runApplication cvMesh +runApplication collapseEdges -latestTime -collapseFaces +runApplication checkMesh -latestTime -allGeometry -allTopology + +# ----------------------------------------------------------------- end-of-file diff --git a/tutorials/mesh/cvMesh/blob/Allrun-parallel b/tutorials/mesh/cvMesh/blob/Allrun-parallel new file mode 100755 index 0000000000000000000000000000000000000000..253294de1f153f5933dac13f3c4559a366225cf1 --- /dev/null +++ b/tutorials/mesh/cvMesh/blob/Allrun-parallel @@ -0,0 +1,19 @@ +#!/bin/sh +cd ${0%/*} || exit 1 # run from this directory + +# Source tutorial run functions +. $WM_PROJECT_DIR/bin/tools/RunFunctions + +# Get the number of processors to run on from system/decomposeParDict +nProc=$(getNumberOfProcessors) + +runApplication blockMesh +runApplication decomposePar + +runParallel cvMesh $nProc +runParallel collapseEdges $nProc -latestTime -collapseFaces +runParallel checkMesh $nProc -latestTime -allTopology -allGeometry + +runApplication reconstructParMesh -latestTime + +# ----------------------------------------------------------------- end-of-file diff --git a/tutorials/mesh/cvMesh/blob/Alltest b/tutorials/mesh/cvMesh/blob/Alltest new file mode 100755 index 0000000000000000000000000000000000000000..fc9136aea51b1f0ea208ef462afc59dbbb9b3693 --- /dev/null +++ b/tutorials/mesh/cvMesh/blob/Alltest @@ -0,0 +1,18 @@ +#!/bin/sh +cd ${0%/*} || exit 1 # run from this directory + +# Source tutorial run functions +. $WM_PROJECT_DIR/bin/tools/RunFunctions + +runApplication cvMesh + +# Change collapseEdges to only do one iteration +cp system/collapseDict system/collapseDict.org + +sed -e s/"\(maximumIterations[ \t]*\)\([0-9]*\);"/"\1 1;"/g \ +system/collapseDict.org > system/collapseDict + +runApplication collapseEdges -latestTime -collapseFaces + + +# ----------------------------------------------------------------- end-of-file diff --git a/tutorials/mesh/cvMesh/blob/constant/polyMesh/blockMeshDict b/tutorials/mesh/cvMesh/blob/constant/polyMesh/blockMeshDict new file mode 100644 index 0000000000000000000000000000000000000000..a0d9e31895cd3db25759d74fdaefc8c16eb5a4bf --- /dev/null +++ b/tutorials/mesh/cvMesh/blob/constant/polyMesh/blockMeshDict @@ -0,0 +1,69 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: dev | +| \\ / A nd | Web: www.OpenFOAM.org | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + object blockMeshDict; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +convertToMeters 1.0; + +xmin -1.3; +xmax 0.65; +ymin -1.1; +ymax 0.8; +zmin -1.4; +zmax 0.55; + +vertices +( + ($xmin $ymin $zmin) + ($xmax $ymin $zmin) + ($xmax $ymax $zmin) + ($xmin $ymax $zmin) + ($xmin $ymin $zmax) + ($xmax $ymin $zmax) + ($xmax $ymax $zmax) + ($xmin $ymax $zmax) + +); + +blocks +( + hex (0 1 2 3 4 5 6 7) (11 11 9) simpleGrading (1 1 1) +); + +edges +( +); + +boundary +( + walls + { + type wall; + faces + ( + (3 7 6 2) + (0 4 7 3) + (2 6 5 1) + (1 5 4 0) + (0 3 2 1) + (4 5 6 7) + ); + } +); + +mergePatchPairs +( +); + +// ************************************************************************* // diff --git a/tutorials/mesh/cvMesh/blob/constant/polyMesh/boundary b/tutorials/mesh/cvMesh/blob/constant/polyMesh/boundary new file mode 100644 index 0000000000000000000000000000000000000000..69a2a888d4cbc8ceaaf582487e5027df213da58a --- /dev/null +++ b/tutorials/mesh/cvMesh/blob/constant/polyMesh/boundary @@ -0,0 +1,28 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: dev | +| \\ / A nd | Web: www.OpenFOAM.org | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class polyBoundaryMesh; + location "constant/polyMesh"; + object boundary; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +1 +( + walls + { + type wall; + nFaces 638; + startFace 2948; + } +) + +// ************************************************************************* // diff --git a/tutorials/mesh/cvMesh/blob/constant/triSurface/blob.stl b/tutorials/mesh/cvMesh/blob/constant/triSurface/blob.stl new file mode 100644 index 0000000000000000000000000000000000000000..2aa427a4f186e2b8b45a854f4a4b7776f93083ca --- /dev/null +++ b/tutorials/mesh/cvMesh/blob/constant/triSurface/blob.stl @@ -0,0 +1,21506 @@ +solid patch1 + facet normal 0.0423597 0.0421465 -0.998213 + outer loop + vertex -0.327179 -0.153076 -1.35078 + vertex -0.327179 -0.0673011 -1.34716 + vertex -0.241784 -0.0676809 -1.34355 + endloop + endfacet + facet normal 0.0421465 0.0423597 -0.998213 + outer loop + vertex -0.327179 -0.153076 -1.35078 + vertex -0.241784 -0.0676809 -1.34355 + vertex -0.241404 -0.153076 -1.34716 + endloop + endfacet + facet normal 0.127173 0.042432 -0.990972 + outer loop + vertex -0.241404 -0.153076 -1.34716 + vertex -0.241784 -0.0676809 -1.34355 + vertex -0.157272 -0.0686304 -1.33275 + endloop + endfacet + facet normal 0.126626 0.0429848 -0.991019 + outer loop + vertex -0.241404 -0.153076 -1.34716 + vertex -0.157272 -0.0686304 -1.33275 + vertex -0.156517 -0.153076 -1.33632 + endloop + endfacet + facet normal 0.212842 0.0431274 -0.976134 + outer loop + vertex -0.156517 -0.153076 -1.33632 + vertex -0.157272 -0.0686304 -1.33275 + vertex -0.0745271 -0.0699596 -1.31477 + endloop + endfacet + facet normal 0.212067 0.0439261 -0.976267 + outer loop + vertex -0.156517 -0.153076 -1.33632 + vertex -0.0745271 -0.0699596 -1.31477 + vertex -0.0734048 -0.153076 -1.31826 + endloop + endfacet + facet normal 0.299975 0.0441314 -0.952926 + outer loop + vertex -0.0734048 -0.153076 -1.31826 + vertex -0.0745271 -0.0699596 -1.31477 + vertex 0.00556793 -0.0714787 -1.28962 + endloop + endfacet + facet normal 0.299079 0.0450813 -0.953163 + outer loop + vertex -0.0734048 -0.153076 -1.31826 + vertex 0.00556793 -0.0714787 -1.28962 + vertex 0.00704463 -0.153076 -1.29302 + endloop + endfacet + facet normal 0.388908 0.0453335 -0.920161 + outer loop + vertex 0.00704463 -0.153076 -1.29302 + vertex 0.00556793 -0.0714787 -1.28962 + vertex 0.0821297 -0.0729978 -1.25734 + endloop + endfacet + facet normal 0.388007 0.0463252 -0.920491 + outer loop + vertex 0.00704463 -0.153076 -1.29302 + vertex 0.0821297 -0.0729978 -1.25734 + vertex 0.0839438 -0.153076 -1.2606 + endloop + endfacet + facet normal 0.479506 0.046596 -0.8763 + outer loop + vertex 0.0839438 -0.153076 -1.2606 + vertex 0.0821297 -0.0729978 -1.25734 + vertex 0.154275 -0.0743271 -1.21793 + endloop + endfacet + facet normal 0.478724 0.0475002 -0.87668 + outer loop + vertex 0.0839438 -0.153076 -1.2606 + vertex 0.154275 -0.0743271 -1.21793 + vertex 0.156405 -0.153076 -1.22104 + endloop + endfacet + facet normal 0.570947 0.0477454 -0.819597 + outer loop + vertex 0.156405 -0.153076 -1.22104 + vertex 0.154275 -0.0743271 -1.21793 + vertex 0.22112 -0.0752765 -1.17142 + endloop + endfacet + facet normal 0.570404 0.0484131 -0.819936 + outer loop + vertex 0.156405 -0.153076 -1.22104 + vertex 0.22112 -0.0752765 -1.17142 + vertex 0.223541 -0.153076 -1.17433 + endloop + endfacet + facet normal 0.661499 0.0485717 -0.748372 + outer loop + vertex 0.223541 -0.153076 -1.17433 + vertex 0.22112 -0.0752765 -1.17142 + vertex 0.281783 -0.0756563 -1.11783 + endloop + endfacet + facet normal 0.661295 0.0488431 -0.748534 + outer loop + vertex 0.223541 -0.153076 -1.17433 + vertex 0.281783 -0.0756563 -1.11783 + vertex 0.284465 -0.153076 -1.12051 + endloop + endfacet + facet normal 0.0429849 0.126626 -0.991019 + outer loop + vertex -0.327179 -0.0673011 -1.34716 + vertex -0.327179 0.0175861 -1.33632 + vertex -0.242733 0.0168307 -1.33275 + endloop + endfacet + facet normal 0.042432 0.127173 -0.990972 + outer loop + vertex -0.327179 -0.0673011 -1.34716 + vertex -0.242733 0.0168307 -1.33275 + vertex -0.241784 -0.0676809 -1.34355 + endloop + endfacet + facet normal 0.128457 0.127188 -0.983525 + outer loop + vertex -0.241784 -0.0676809 -1.34355 + vertex -0.242733 0.0168307 -1.33275 + vertex -0.159172 0.0149314 -1.32208 + endloop + endfacet + facet normal 0.127188 0.128457 -0.983525 + outer loop + vertex -0.241784 -0.0676809 -1.34355 + vertex -0.159172 0.0149314 -1.32208 + vertex -0.157272 -0.0686304 -1.33275 + endloop + endfacet + facet normal 0.214212 0.128491 -0.968299 + outer loop + vertex -0.157272 -0.0686304 -1.33275 + vertex -0.159172 0.0149314 -1.32208 + vertex -0.0773774 0.0122545 -1.30434 + endloop + endfacet + facet normal 0.212567 0.130164 -0.968438 + outer loop + vertex -0.157272 -0.0686304 -1.33275 + vertex -0.0773774 0.0122545 -1.30434 + vertex -0.0745271 -0.0699596 -1.31477 + endloop + endfacet + facet normal 0.300882 0.13022 -0.944729 + outer loop + vertex -0.0745271 -0.0699596 -1.31477 + vertex -0.0773774 0.0122545 -1.30434 + vertex 0.00176526 0.00916668 -1.27956 + endloop + endfacet + facet normal 0.299162 0.132011 -0.945027 + outer loop + vertex -0.0745271 -0.0699596 -1.31477 + vertex 0.00176526 0.00916668 -1.27956 + vertex 0.00556793 -0.0714787 -1.28962 + endloop + endfacet + facet normal 0.388847 0.132093 -0.911784 + outer loop + vertex 0.00556793 -0.0714787 -1.28962 + vertex 0.00176526 0.00916668 -1.27956 + vertex 0.0773727 0.00603451 -1.24777 + endloop + endfacet + facet normal 0.387305 0.133746 -0.912199 + outer loop + vertex 0.00556793 -0.0714787 -1.28962 + vertex 0.0773727 0.00603451 -1.24777 + vertex 0.0821297 -0.0729978 -1.25734 + endloop + endfacet + facet normal 0.47815 0.133865 -0.868017 + outer loop + vertex 0.0821297 -0.0729978 -1.25734 + vertex 0.0773727 0.00603451 -1.24777 + vertex 0.148579 0.00326891 -1.20897 + endloop + endfacet + facet normal 0.476878 0.135278 -0.868497 + outer loop + vertex 0.0821297 -0.0729978 -1.25734 + vertex 0.148579 0.00326891 -1.20897 + vertex 0.154275 -0.0743271 -1.21793 + endloop + endfacet + facet normal 0.567993 0.135423 -0.811816 + outer loop + vertex 0.154275 -0.0743271 -1.21793 + vertex 0.148579 0.00326891 -1.20897 + vertex 0.214517 0.0012808 -1.16317 + endloop + endfacet + facet normal 0.567105 0.136455 -0.812264 + outer loop + vertex 0.154275 -0.0743271 -1.21793 + vertex 0.214517 0.0012808 -1.16317 + vertex 0.22112 -0.0752765 -1.17142 + endloop + endfacet + facet normal 0.6567 0.136575 -0.741682 + outer loop + vertex 0.22112 -0.0752765 -1.17142 + vertex 0.214517 0.0012808 -1.16317 + vertex 0.274322 0.000481101 -1.11037 + endloop + endfacet + facet normal 0.656347 0.13701 -0.741914 + outer loop + vertex 0.22112 -0.0752765 -1.17142 + vertex 0.274322 0.000481101 -1.11037 + vertex 0.281783 -0.0756563 -1.11783 + endloop + endfacet + facet normal 0.0439248 0.212067 -0.976268 + outer loop + vertex -0.327179 0.0175861 -1.33632 + vertex -0.327179 0.100698 -1.31826 + vertex -0.244062 0.0995758 -1.31477 + endloop + endfacet + facet normal 0.0431274 0.21284 -0.976135 + outer loop + vertex -0.327179 0.0175861 -1.33632 + vertex -0.244062 0.0995758 -1.31477 + vertex -0.242733 0.0168307 -1.33275 + endloop + endfacet + facet normal 0.130166 0.212566 -0.968438 + outer loop + vertex -0.242733 0.0168307 -1.33275 + vertex -0.244062 0.0995758 -1.31477 + vertex -0.161848 0.0967255 -1.30434 + endloop + endfacet + facet normal 0.128491 0.214212 -0.968299 + outer loop + vertex -0.242733 0.0168307 -1.33275 + vertex -0.161848 0.0967255 -1.30434 + vertex -0.159172 0.0149314 -1.32208 + endloop + endfacet + facet normal 0.215666 0.213702 -0.952796 + outer loop + vertex -0.159172 0.0149314 -1.32208 + vertex -0.161848 0.0967255 -1.30434 + vertex -0.0814388 0.0926641 -1.28705 + endloop + endfacet + facet normal 0.213702 0.215666 -0.952796 + outer loop + vertex -0.159172 0.0149314 -1.32208 + vertex -0.0814388 0.0926641 -1.28705 + vertex -0.0773774 0.0122545 -1.30434 + endloop + endfacet + facet normal 0.301199 0.214972 -0.929014 + outer loop + vertex -0.0773774 0.0122545 -1.30434 + vertex -0.0814388 0.0926641 -1.28705 + vertex -0.00373595 0.0879084 -1.26296 + endloop + endfacet + facet normal 0.299389 0.216819 -0.929169 + outer loop + vertex -0.0773774 0.0122545 -1.30434 + vertex -0.00373595 0.0879084 -1.26296 + vertex 0.00176526 0.00916668 -1.27956 + endloop + endfacet + facet normal 0.387327 0.216027 -0.896276 + outer loop + vertex 0.00176526 0.00916668 -1.27956 + vertex -0.00373595 0.0879084 -1.26296 + vertex 0.0703579 0.0829753 -1.23213 + endloop + endfacet + facet normal 0.385964 0.21745 -0.896519 + outer loop + vertex 0.00176526 0.00916668 -1.27956 + vertex 0.0703579 0.0829753 -1.23213 + vertex 0.0773727 0.00603451 -1.24777 + endloop + endfacet + facet normal 0.474514 0.216707 -0.853155 + outer loop + vertex 0.0773727 0.00603451 -1.24777 + vertex 0.0703579 0.0829753 -1.23213 + vertex 0.140011 0.078559 -1.19451 + endloop + endfacet + facet normal 0.473474 0.217822 -0.853449 + outer loop + vertex 0.0773727 0.00603451 -1.24777 + vertex 0.140011 0.078559 -1.19451 + vertex 0.148579 0.00326891 -1.20897 + endloop + endfacet + facet normal 0.561937 0.217263 -0.798138 + outer loop + vertex 0.148579 0.00326891 -1.20897 + vertex 0.140011 0.078559 -1.19451 + vertex 0.204392 0.0753537 -1.15005 + endloop + endfacet + facet normal 0.561192 0.218085 -0.798437 + outer loop + vertex 0.148579 0.00326891 -1.20897 + vertex 0.204392 0.0753537 -1.15005 + vertex 0.214517 0.0012808 -1.16317 + endloop + endfacet + facet normal 0.647908 0.217805 -0.729915 + outer loop + vertex 0.214517 0.0012808 -1.16317 + vertex 0.204392 0.0753537 -1.15005 + vertex 0.262669 0.0740539 -1.09871 + endloop + endfacet + facet normal 0.647566 0.218198 -0.730102 + outer loop + vertex 0.214517 0.0012808 -1.16317 + vertex 0.262669 0.0740539 -1.09871 + vertex 0.274322 0.000481101 -1.11037 + endloop + endfacet + facet normal 0.04508 0.299079 -0.953163 + outer loop + vertex -0.327179 0.100698 -1.31826 + vertex -0.327179 0.181148 -1.29302 + vertex -0.245582 0.179671 -1.28962 + endloop + endfacet + facet normal 0.0441302 0.299974 -0.952926 + outer loop + vertex -0.327179 0.100698 -1.31826 + vertex -0.245582 0.179671 -1.28962 + vertex -0.244062 0.0995758 -1.31477 + endloop + endfacet + facet normal 0.132014 0.299161 -0.945026 + outer loop + vertex -0.244062 0.0995758 -1.31477 + vertex -0.245582 0.179671 -1.28962 + vertex -0.164936 0.175868 -1.27956 + endloop + endfacet + facet normal 0.130221 0.300883 -0.944728 + outer loop + vertex -0.244062 0.0995758 -1.31477 + vertex -0.164936 0.175868 -1.27956 + vertex -0.161848 0.0967255 -1.30434 + endloop + endfacet + facet normal 0.216817 0.29939 -0.929169 + outer loop + vertex -0.161848 0.0967255 -1.30434 + vertex -0.164936 0.175868 -1.27956 + vertex -0.0861944 0.170367 -1.26296 + endloop + endfacet + facet normal 0.214972 0.301199 -0.929014 + outer loop + vertex -0.161848 0.0967255 -1.30434 + vertex -0.0861944 0.170367 -1.26296 + vertex -0.0814388 0.0926641 -1.28705 + endloop + endfacet + facet normal 0.300575 0.299184 -0.905618 + outer loop + vertex -0.0814388 0.0926641 -1.28705 + vertex -0.0861944 0.170367 -1.26296 + vertex -0.0103082 0.163795 -1.23994 + endloop + endfacet + facet normal 0.299184 0.300575 -0.905618 + outer loop + vertex -0.0814388 0.0926641 -1.28705 + vertex -0.0103082 0.163795 -1.23994 + vertex -0.00373595 0.0879084 -1.26296 + endloop + endfacet + facet normal 0.384239 0.298268 -0.873726 + outer loop + vertex -0.00373595 0.0879084 -1.26296 + vertex -0.0103082 0.163795 -1.23994 + vertex 0.0617706 0.156779 -1.21064 + endloop + endfacet + facet normal 0.383498 0.299024 -0.873793 + outer loop + vertex -0.00373595 0.0879084 -1.26296 + vertex 0.0617706 0.156779 -1.21064 + vertex 0.0703579 0.0829753 -1.23213 + endloop + endfacet + facet normal 0.468718 0.296773 -0.832003 + outer loop + vertex 0.0703579 0.0829753 -1.23213 + vertex 0.0617706 0.156779 -1.21064 + vertex 0.129267 0.15039 -1.1749 + endloop + endfacet + facet normal 0.468247 0.297262 -0.832094 + outer loop + vertex 0.0703579 0.0829753 -1.23213 + vertex 0.129267 0.15039 -1.1749 + vertex 0.140011 0.078559 -1.19451 + endloop + endfacet + facet normal 0.553116 0.295446 -0.778957 + outer loop + vertex 0.140011 0.078559 -1.19451 + vertex 0.129267 0.15039 -1.1749 + vertex 0.191405 0.1457 -1.13255 + endloop + endfacet + facet normal 0.552697 0.295887 -0.779087 + outer loop + vertex 0.140011 0.078559 -1.19451 + vertex 0.191405 0.1457 -1.13255 + vertex 0.204392 0.0753537 -1.15005 + endloop + endfacet + facet normal 0.635595 0.29487 -0.713492 + outer loop + vertex 0.204392 0.0753537 -1.15005 + vertex 0.191405 0.1457 -1.13255 + vertex 0.247411 0.14378 -1.08345 + endloop + endfacet + facet normal 0.635288 0.295197 -0.71363 + outer loop + vertex 0.204392 0.0753537 -1.15005 + vertex 0.247411 0.14378 -1.08345 + vertex 0.262669 0.0740539 -1.09871 + endloop + endfacet + facet normal 0.0463252 0.388007 -0.920491 + outer loop + vertex -0.327179 0.181148 -1.29302 + vertex -0.327179 0.258047 -1.2606 + vertex -0.247101 0.256233 -1.25734 + endloop + endfacet + facet normal 0.0453323 0.388909 -0.92016 + outer loop + vertex -0.327179 0.181148 -1.29302 + vertex -0.247101 0.256233 -1.25734 + vertex -0.245582 0.179671 -1.28962 + endloop + endfacet + facet normal 0.133746 0.387306 -0.912199 + outer loop + vertex -0.245582 0.179671 -1.28962 + vertex -0.247101 0.256233 -1.25734 + vertex -0.168068 0.251476 -1.24777 + endloop + endfacet + facet normal 0.132096 0.388845 -0.911784 + outer loop + vertex -0.245582 0.179671 -1.28962 + vertex -0.168068 0.251476 -1.24777 + vertex -0.164936 0.175868 -1.27956 + endloop + endfacet + facet normal 0.21745 0.385963 -0.89652 + outer loop + vertex -0.164936 0.175868 -1.27956 + vertex -0.168068 0.251476 -1.24777 + vertex -0.0911275 0.244461 -1.23213 + endloop + endfacet + facet normal 0.216026 0.387327 -0.896276 + outer loop + vertex -0.164936 0.175868 -1.27956 + vertex -0.0911275 0.244461 -1.23213 + vertex -0.0861944 0.170367 -1.26296 + endloop + endfacet + facet normal 0.299025 0.383497 -0.873793 + outer loop + vertex -0.0861944 0.170367 -1.26296 + vertex -0.0911275 0.244461 -1.23213 + vertex -0.0173241 0.235873 -1.21064 + endloop + endfacet + facet normal 0.298269 0.384239 -0.873726 + outer loop + vertex -0.0861944 0.170367 -1.26296 + vertex -0.0173241 0.235873 -1.21064 + vertex -0.0103082 0.163795 -1.23994 + endloop + endfacet + facet normal 0.380045 0.379858 -0.84337 + outer loop + vertex -0.0103082 0.163795 -1.23994 + vertex -0.0173241 0.235873 -1.21064 + vertex 0.052296 0.226399 -1.18354 + endloop + endfacet + facet normal 0.379858 0.380045 -0.84337 + outer loop + vertex -0.0103082 0.163795 -1.23994 + vertex 0.052296 0.226399 -1.18354 + vertex 0.0617706 0.156779 -1.21064 + endloop + endfacet + facet normal 0.461367 0.375705 -0.803732 + outer loop + vertex 0.0617706 0.156779 -1.21064 + vertex 0.052296 0.226399 -1.18354 + vertex 0.117041 0.217609 -1.15048 + endloop + endfacet + facet normal 0.461236 0.375838 -0.803746 + outer loop + vertex 0.0617706 0.156779 -1.21064 + vertex 0.117041 0.217609 -1.15048 + vertex 0.129267 0.15039 -1.1749 + endloop + endfacet + facet normal 0.541997 0.372253 -0.753437 + outer loop + vertex 0.129267 0.15039 -1.1749 + vertex 0.117041 0.217609 -1.15048 + vertex 0.176217 0.211078 -1.11114 + endloop + endfacet + facet normal 0.54161 0.372642 -0.753522 + outer loop + vertex 0.129267 0.15039 -1.1749 + vertex 0.176217 0.211078 -1.11114 + vertex 0.191405 0.1457 -1.13255 + endloop + endfacet + facet normal 0.619783 0.370576 -0.691767 + outer loop + vertex 0.191405 0.1457 -1.13255 + vertex 0.176217 0.211078 -1.11114 + vertex 0.229132 0.208376 -1.06518 + endloop + endfacet + facet normal 0.619311 0.371044 -0.691939 + outer loop + vertex 0.191405 0.1457 -1.13255 + vertex 0.229132 0.208376 -1.06518 + vertex 0.247411 0.14378 -1.08345 + endloop + endfacet + facet normal 0.0475003 0.478724 -0.87668 + outer loop + vertex -0.327179 0.258047 -1.2606 + vertex -0.327179 0.330508 -1.22104 + vertex -0.24843 0.328378 -1.21793 + endloop + endfacet + facet normal 0.0465961 0.479506 -0.8763 + outer loop + vertex -0.327179 0.258047 -1.2606 + vertex -0.24843 0.328378 -1.21793 + vertex -0.247101 0.256233 -1.25734 + endloop + endfacet + facet normal 0.135278 0.476878 -0.868497 + outer loop + vertex -0.247101 0.256233 -1.25734 + vertex -0.24843 0.328378 -1.21793 + vertex -0.170834 0.322682 -1.20897 + endloop + endfacet + facet normal 0.133865 0.47815 -0.868017 + outer loop + vertex -0.247101 0.256233 -1.25734 + vertex -0.170834 0.322682 -1.20897 + vertex -0.168068 0.251476 -1.24777 + endloop + endfacet + facet normal 0.217822 0.473474 -0.85345 + outer loop + vertex -0.168068 0.251476 -1.24777 + vertex -0.170834 0.322682 -1.20897 + vertex -0.0955438 0.314114 -1.19451 + endloop + endfacet + facet normal 0.216707 0.474514 -0.853155 + outer loop + vertex -0.168068 0.251476 -1.24777 + vertex -0.0955438 0.314114 -1.19451 + vertex -0.0911275 0.244461 -1.23213 + endloop + endfacet + facet normal 0.297262 0.468247 -0.832094 + outer loop + vertex -0.0911275 0.244461 -1.23213 + vertex -0.0955438 0.314114 -1.19451 + vertex -0.0237126 0.30337 -1.1749 + endloop + endfacet + facet normal 0.296773 0.468718 -0.832003 + outer loop + vertex -0.0911275 0.244461 -1.23213 + vertex -0.0237126 0.30337 -1.1749 + vertex -0.0173241 0.235873 -1.21064 + endloop + endfacet + facet normal 0.375838 0.461236 -0.803746 + outer loop + vertex -0.0173241 0.235873 -1.21064 + vertex -0.0237126 0.30337 -1.1749 + vertex 0.0435067 0.291143 -1.15048 + endloop + endfacet + facet normal 0.375706 0.461367 -0.803732 + outer loop + vertex -0.0173241 0.235873 -1.21064 + vertex 0.0435067 0.291143 -1.15048 + vertex 0.052296 0.226399 -1.18354 + endloop + endfacet + facet normal 0.452545 0.45347 -0.767834 + outer loop + vertex 0.052296 0.226399 -1.18354 + vertex 0.0435067 0.291143 -1.15048 + vertex 0.105262 0.279365 -1.12104 + endloop + endfacet + facet normal 0.45347 0.452545 -0.767834 + outer loop + vertex 0.052296 0.226399 -1.18354 + vertex 0.105262 0.279365 -1.12104 + vertex 0.117041 0.217609 -1.15048 + endloop + endfacet + facet normal 0.527981 0.445418 -0.723076 + outer loop + vertex 0.117041 0.217609 -1.15048 + vertex 0.105262 0.279365 -1.12104 + vertex 0.160703 0.269966 -1.08635 + endloop + endfacet + facet normal 0.529581 0.44384 -0.722877 + outer loop + vertex 0.117041 0.217609 -1.15048 + vertex 0.160703 0.269966 -1.08635 + vertex 0.176217 0.211078 -1.11114 + endloop + endfacet + facet normal 0.601507 0.439351 -0.667204 + outer loop + vertex 0.176217 0.211078 -1.11114 + vertex 0.160703 0.269966 -1.08635 + vertex 0.209244 0.265861 -1.04529 + endloop + endfacet + facet normal 0.601856 0.439021 -0.667105 + outer loop + vertex 0.176217 0.211078 -1.11114 + vertex 0.209244 0.265861 -1.04529 + vertex 0.229132 0.208376 -1.06518 + endloop + endfacet + facet normal 0.0484131 0.570404 -0.819936 + outer loop + vertex -0.327179 0.330508 -1.22104 + vertex -0.327179 0.397644 -1.17433 + vertex -0.249379 0.395223 -1.17142 + endloop + endfacet + facet normal 0.0477455 0.570947 -0.819597 + outer loop + vertex -0.327179 0.330508 -1.22104 + vertex -0.249379 0.395223 -1.17142 + vertex -0.24843 0.328378 -1.21793 + endloop + endfacet + facet normal 0.136455 0.567104 -0.812264 + outer loop + vertex -0.24843 0.328378 -1.21793 + vertex -0.249379 0.395223 -1.17142 + vertex -0.172822 0.38862 -1.16317 + endloop + endfacet + facet normal 0.135423 0.567993 -0.811816 + outer loop + vertex -0.24843 0.328378 -1.21793 + vertex -0.172822 0.38862 -1.16317 + vertex -0.170834 0.322682 -1.20897 + endloop + endfacet + facet normal 0.218085 0.561192 -0.798437 + outer loop + vertex -0.170834 0.322682 -1.20897 + vertex -0.172822 0.38862 -1.16317 + vertex -0.098749 0.378495 -1.15005 + endloop + endfacet + facet normal 0.217264 0.561937 -0.798138 + outer loop + vertex -0.170834 0.322682 -1.20897 + vertex -0.098749 0.378495 -1.15005 + vertex -0.0955438 0.314114 -1.19451 + endloop + endfacet + facet normal 0.295887 0.552697 -0.779087 + outer loop + vertex -0.0955438 0.314114 -1.19451 + vertex -0.098749 0.378495 -1.15005 + vertex -0.0284026 0.365508 -1.13255 + endloop + endfacet + facet normal 0.295446 0.553116 -0.778957 + outer loop + vertex -0.0955438 0.314114 -1.19451 + vertex -0.0284026 0.365508 -1.13255 + vertex -0.0237126 0.30337 -1.1749 + endloop + endfacet + facet normal 0.372644 0.54161 -0.753522 + outer loop + vertex -0.0237126 0.30337 -1.1749 + vertex -0.0284026 0.365508 -1.13255 + vertex 0.0369751 0.350319 -1.11114 + endloop + endfacet + facet normal 0.372254 0.541997 -0.753436 + outer loop + vertex -0.0237126 0.30337 -1.1749 + vertex 0.0369751 0.350319 -1.11114 + vertex 0.0435067 0.291143 -1.15048 + endloop + endfacet + facet normal 0.443839 0.529581 -0.722877 + outer loop + vertex 0.0435067 0.291143 -1.15048 + vertex 0.0369751 0.350319 -1.11114 + vertex 0.0958631 0.334806 -1.08635 + endloop + endfacet + facet normal 0.445418 0.527981 -0.723076 + outer loop + vertex 0.0435067 0.291143 -1.15048 + vertex 0.0958631 0.334806 -1.08635 + vertex 0.105262 0.279365 -1.12104 + endloop + endfacet + facet normal 0.513857 0.515981 -0.685357 + outer loop + vertex 0.105262 0.279365 -1.12104 + vertex 0.0958631 0.334806 -1.08635 + vertex 0.14674 0.320843 -1.05871 + endloop + endfacet + facet normal 0.515982 0.513857 -0.685357 + outer loop + vertex 0.105262 0.279365 -1.12104 + vertex 0.14674 0.320843 -1.05871 + vertex 0.160703 0.269966 -1.08635 + endloop + endfacet + facet normal 0.581828 0.505665 -0.637007 + outer loop + vertex 0.160703 0.269966 -1.08635 + vertex 0.14674 0.320843 -1.05871 + vertex 0.189158 0.31425 -1.0252 + endloop + endfacet + facet normal 0.581622 0.505853 -0.637047 + outer loop + vertex 0.160703 0.269966 -1.08635 + vertex 0.189158 0.31425 -1.0252 + vertex 0.209244 0.265861 -1.04529 + endloop + endfacet + facet normal 0.0488431 0.661295 -0.748534 + outer loop + vertex -0.327179 0.397644 -1.17433 + vertex -0.327179 0.458568 -1.12051 + vertex -0.249759 0.455885 -1.11783 + endloop + endfacet + facet normal 0.0485717 0.661499 -0.748372 + outer loop + vertex -0.327179 0.397644 -1.17433 + vertex -0.249759 0.455885 -1.11783 + vertex -0.249379 0.395223 -1.17142 + endloop + endfacet + facet normal 0.13701 0.656347 -0.741914 + outer loop + vertex -0.249379 0.395223 -1.17142 + vertex -0.249759 0.455885 -1.11783 + vertex -0.173622 0.448425 -1.11037 + endloop + endfacet + facet normal 0.136576 0.6567 -0.741682 + outer loop + vertex -0.249379 0.395223 -1.17142 + vertex -0.173622 0.448425 -1.11037 + vertex -0.172822 0.38862 -1.16317 + endloop + endfacet + facet normal 0.218198 0.647566 -0.730102 + outer loop + vertex -0.172822 0.38862 -1.16317 + vertex -0.173622 0.448425 -1.11037 + vertex -0.100049 0.436772 -1.09871 + endloop + endfacet + facet normal 0.217806 0.647908 -0.729915 + outer loop + vertex -0.172822 0.38862 -1.16317 + vertex -0.100049 0.436772 -1.09871 + vertex -0.098749 0.378495 -1.15005 + endloop + endfacet + facet normal 0.295197 0.635288 -0.71363 + outer loop + vertex -0.098749 0.378495 -1.15005 + vertex -0.100049 0.436772 -1.09871 + vertex -0.0303229 0.421514 -1.08345 + endloop + endfacet + facet normal 0.29487 0.635594 -0.713493 + outer loop + vertex -0.098749 0.378495 -1.15005 + vertex -0.0303229 0.421514 -1.08345 + vertex -0.0284026 0.365508 -1.13255 + endloop + endfacet + facet normal 0.371045 0.619311 -0.691939 + outer loop + vertex -0.0284026 0.365508 -1.13255 + vertex -0.0303229 0.421514 -1.08345 + vertex 0.0342738 0.403235 -1.06518 + endloop + endfacet + facet normal 0.370577 0.619782 -0.691768 + outer loop + vertex -0.0284026 0.365508 -1.13255 + vertex 0.0342738 0.403235 -1.06518 + vertex 0.0369751 0.350319 -1.11114 + endloop + endfacet + facet normal 0.439021 0.601855 -0.667106 + outer loop + vertex 0.0369751 0.350319 -1.11114 + vertex 0.0342738 0.403235 -1.06518 + vertex 0.0917581 0.383347 -1.04529 + endloop + endfacet + facet normal 0.43935 0.601507 -0.667204 + outer loop + vertex 0.0369751 0.350319 -1.11114 + vertex 0.0917581 0.383347 -1.04529 + vertex 0.0958631 0.334806 -1.08635 + endloop + endfacet + facet normal 0.505853 0.581622 -0.637047 + outer loop + vertex 0.0958631 0.334806 -1.08635 + vertex 0.0917581 0.383347 -1.04529 + vertex 0.140147 0.363261 -1.0252 + endloop + endfacet + facet normal 0.505666 0.581828 -0.637007 + outer loop + vertex 0.0958631 0.334806 -1.08635 + vertex 0.140147 0.363261 -1.0252 + vertex 0.14674 0.320843 -1.05871 + endloop + endfacet + facet normal 0.568022 0.562734 -0.600568 + outer loop + vertex 0.14674 0.320843 -1.05871 + vertex 0.140147 0.363261 -1.0252 + vertex 0.173079 0.347181 -1.00912 + endloop + endfacet + facet normal 0.562734 0.568022 -0.600568 + outer loop + vertex 0.14674 0.320843 -1.05871 + vertex 0.173079 0.347181 -1.00912 + vertex 0.189158 0.31425 -1.0252 + endloop + endfacet + facet normal 0.0421465 -0.0423597 -0.998213 + outer loop + vertex -0.327179 -0.153076 -1.35078 + vertex -0.241404 -0.153076 -1.34716 + vertex -0.241784 -0.238471 -1.34355 + endloop + endfacet + facet normal 0.0423597 -0.0421465 -0.998213 + outer loop + vertex -0.327179 -0.153076 -1.35078 + vertex -0.241784 -0.238471 -1.34355 + vertex -0.327179 -0.238851 -1.34716 + endloop + endfacet + facet normal 0.042432 -0.127173 -0.990972 + outer loop + vertex -0.327179 -0.238851 -1.34716 + vertex -0.241784 -0.238471 -1.34355 + vertex -0.242733 -0.322982 -1.33275 + endloop + endfacet + facet normal 0.0429849 -0.126626 -0.991019 + outer loop + vertex -0.327179 -0.238851 -1.34716 + vertex -0.242733 -0.322982 -1.33275 + vertex -0.327179 -0.323738 -1.33632 + endloop + endfacet + facet normal 0.0431275 -0.212842 -0.976134 + outer loop + vertex -0.327179 -0.323738 -1.33632 + vertex -0.242733 -0.322982 -1.33275 + vertex -0.244063 -0.405728 -1.31477 + endloop + endfacet + facet normal 0.0439262 -0.212067 -0.976267 + outer loop + vertex -0.327179 -0.323738 -1.33632 + vertex -0.244063 -0.405728 -1.31477 + vertex -0.327179 -0.40685 -1.31826 + endloop + endfacet + facet normal 0.0441315 -0.299975 -0.952926 + outer loop + vertex -0.327179 -0.40685 -1.31826 + vertex -0.244063 -0.405728 -1.31477 + vertex -0.245582 -0.485823 -1.28962 + endloop + endfacet + facet normal 0.0450813 -0.299079 -0.953163 + outer loop + vertex -0.327179 -0.40685 -1.31826 + vertex -0.245582 -0.485823 -1.28962 + vertex -0.327179 -0.487299 -1.29302 + endloop + endfacet + facet normal 0.0453335 -0.388907 -0.920161 + outer loop + vertex -0.327179 -0.487299 -1.29302 + vertex -0.245582 -0.485823 -1.28962 + vertex -0.247101 -0.562384 -1.25734 + endloop + endfacet + facet normal 0.0463251 -0.388007 -0.920492 + outer loop + vertex -0.327179 -0.487299 -1.29302 + vertex -0.247101 -0.562384 -1.25734 + vertex -0.327179 -0.564198 -1.2606 + endloop + endfacet + facet normal 0.0465959 -0.479507 -0.8763 + outer loop + vertex -0.327179 -0.564198 -1.2606 + vertex -0.247101 -0.562384 -1.25734 + vertex -0.24843 -0.63453 -1.21793 + endloop + endfacet + facet normal 0.0475001 -0.478724 -0.876679 + outer loop + vertex -0.327179 -0.564198 -1.2606 + vertex -0.24843 -0.63453 -1.21793 + vertex -0.327179 -0.63666 -1.22104 + endloop + endfacet + facet normal 0.0477452 -0.570947 -0.819597 + outer loop + vertex -0.327179 -0.63666 -1.22104 + vertex -0.24843 -0.63453 -1.21793 + vertex -0.249379 -0.701375 -1.17142 + endloop + endfacet + facet normal 0.0484134 -0.570404 -0.819936 + outer loop + vertex -0.327179 -0.63666 -1.22104 + vertex -0.249379 -0.701375 -1.17142 + vertex -0.327179 -0.703796 -1.17433 + endloop + endfacet + facet normal 0.0485719 -0.661499 -0.748372 + outer loop + vertex -0.327179 -0.703796 -1.17433 + vertex -0.249379 -0.701375 -1.17142 + vertex -0.249759 -0.762037 -1.11783 + endloop + endfacet + facet normal 0.0488436 -0.661295 -0.748534 + outer loop + vertex -0.327179 -0.703796 -1.17433 + vertex -0.249759 -0.762037 -1.11783 + vertex -0.327179 -0.764719 -1.12051 + endloop + endfacet + facet normal 0.126626 -0.0429849 -0.991019 + outer loop + vertex -0.241404 -0.153076 -1.34716 + vertex -0.156517 -0.153076 -1.33632 + vertex -0.157272 -0.237521 -1.33275 + endloop + endfacet + facet normal 0.127173 -0.042432 -0.990972 + outer loop + vertex -0.241404 -0.153076 -1.34716 + vertex -0.157272 -0.237521 -1.33275 + vertex -0.241784 -0.238471 -1.34355 + endloop + endfacet + facet normal 0.127188 -0.128457 -0.983525 + outer loop + vertex -0.241784 -0.238471 -1.34355 + vertex -0.157272 -0.237521 -1.33275 + vertex -0.159172 -0.321083 -1.32208 + endloop + endfacet + facet normal 0.128457 -0.127188 -0.983525 + outer loop + vertex -0.241784 -0.238471 -1.34355 + vertex -0.159172 -0.321083 -1.32208 + vertex -0.242733 -0.322982 -1.33275 + endloop + endfacet + facet normal 0.128491 -0.214212 -0.968299 + outer loop + vertex -0.242733 -0.322982 -1.33275 + vertex -0.159172 -0.321083 -1.32208 + vertex -0.161848 -0.402877 -1.30434 + endloop + endfacet + facet normal 0.130164 -0.212567 -0.968438 + outer loop + vertex -0.242733 -0.322982 -1.33275 + vertex -0.161848 -0.402877 -1.30434 + vertex -0.244063 -0.405728 -1.31477 + endloop + endfacet + facet normal 0.13022 -0.300882 -0.944729 + outer loop + vertex -0.244063 -0.405728 -1.31477 + vertex -0.161848 -0.402877 -1.30434 + vertex -0.164936 -0.48202 -1.27956 + endloop + endfacet + facet normal 0.132011 -0.299162 -0.945027 + outer loop + vertex -0.244063 -0.405728 -1.31477 + vertex -0.164936 -0.48202 -1.27956 + vertex -0.245582 -0.485823 -1.28962 + endloop + endfacet + facet normal 0.132093 -0.388847 -0.911784 + outer loop + vertex -0.245582 -0.485823 -1.28962 + vertex -0.164936 -0.48202 -1.27956 + vertex -0.168068 -0.557627 -1.24777 + endloop + endfacet + facet normal 0.133746 -0.387304 -0.912199 + outer loop + vertex -0.245582 -0.485823 -1.28962 + vertex -0.168068 -0.557627 -1.24777 + vertex -0.247101 -0.562384 -1.25734 + endloop + endfacet + facet normal 0.133865 -0.47815 -0.868017 + outer loop + vertex -0.247101 -0.562384 -1.25734 + vertex -0.168068 -0.557627 -1.24777 + vertex -0.170834 -0.628833 -1.20897 + endloop + endfacet + facet normal 0.135277 -0.476878 -0.868497 + outer loop + vertex -0.247101 -0.562384 -1.25734 + vertex -0.170834 -0.628833 -1.20897 + vertex -0.24843 -0.63453 -1.21793 + endloop + endfacet + facet normal 0.135422 -0.567993 -0.811816 + outer loop + vertex -0.24843 -0.63453 -1.21793 + vertex -0.170834 -0.628833 -1.20897 + vertex -0.172822 -0.694772 -1.16317 + endloop + endfacet + facet normal 0.136454 -0.567105 -0.812264 + outer loop + vertex -0.24843 -0.63453 -1.21793 + vertex -0.172822 -0.694772 -1.16317 + vertex -0.249379 -0.701375 -1.17142 + endloop + endfacet + facet normal 0.136575 -0.6567 -0.741682 + outer loop + vertex -0.249379 -0.701375 -1.17142 + vertex -0.172822 -0.694772 -1.16317 + vertex -0.173622 -0.754577 -1.11037 + endloop + endfacet + facet normal 0.137009 -0.656347 -0.741914 + outer loop + vertex -0.249379 -0.701375 -1.17142 + vertex -0.173622 -0.754577 -1.11037 + vertex -0.249759 -0.762037 -1.11783 + endloop + endfacet + facet normal 0.212067 -0.0439248 -0.976268 + outer loop + vertex -0.156517 -0.153076 -1.33632 + vertex -0.0734048 -0.153076 -1.31826 + vertex -0.0745272 -0.236192 -1.31477 + endloop + endfacet + facet normal 0.21284 -0.0431274 -0.976135 + outer loop + vertex -0.156517 -0.153076 -1.33632 + vertex -0.0745272 -0.236192 -1.31477 + vertex -0.157272 -0.237521 -1.33275 + endloop + endfacet + facet normal 0.212566 -0.130166 -0.968438 + outer loop + vertex -0.157272 -0.237521 -1.33275 + vertex -0.0745272 -0.236192 -1.31477 + vertex -0.0773775 -0.318406 -1.30434 + endloop + endfacet + facet normal 0.214212 -0.128491 -0.968299 + outer loop + vertex -0.157272 -0.237521 -1.33275 + vertex -0.0773775 -0.318406 -1.30434 + vertex -0.159172 -0.321083 -1.32208 + endloop + endfacet + facet normal 0.213702 -0.215667 -0.952796 + outer loop + vertex -0.159172 -0.321083 -1.32208 + vertex -0.0773775 -0.318406 -1.30434 + vertex -0.0814389 -0.398816 -1.28705 + endloop + endfacet + facet normal 0.215666 -0.213702 -0.952796 + outer loop + vertex -0.159172 -0.321083 -1.32208 + vertex -0.0814389 -0.398816 -1.28705 + vertex -0.161848 -0.402877 -1.30434 + endloop + endfacet + facet normal 0.214972 -0.301199 -0.929014 + outer loop + vertex -0.161848 -0.402877 -1.30434 + vertex -0.0814389 -0.398816 -1.28705 + vertex -0.0861945 -0.476519 -1.26296 + endloop + endfacet + facet normal 0.216819 -0.299389 -0.929169 + outer loop + vertex -0.161848 -0.402877 -1.30434 + vertex -0.0861945 -0.476519 -1.26296 + vertex -0.164936 -0.48202 -1.27956 + endloop + endfacet + facet normal 0.216027 -0.387327 -0.896276 + outer loop + vertex -0.164936 -0.48202 -1.27956 + vertex -0.0861945 -0.476519 -1.26296 + vertex -0.0911277 -0.550613 -1.23213 + endloop + endfacet + facet normal 0.21745 -0.385964 -0.896519 + outer loop + vertex -0.164936 -0.48202 -1.27956 + vertex -0.0911277 -0.550613 -1.23213 + vertex -0.168068 -0.557627 -1.24777 + endloop + endfacet + facet normal 0.216707 -0.474514 -0.853155 + outer loop + vertex -0.168068 -0.557627 -1.24777 + vertex -0.0911277 -0.550613 -1.23213 + vertex -0.095544 -0.620266 -1.19451 + endloop + endfacet + facet normal 0.217822 -0.473473 -0.85345 + outer loop + vertex -0.168068 -0.557627 -1.24777 + vertex -0.095544 -0.620266 -1.19451 + vertex -0.170834 -0.628833 -1.20897 + endloop + endfacet + facet normal 0.217264 -0.561937 -0.798138 + outer loop + vertex -0.170834 -0.628833 -1.20897 + vertex -0.095544 -0.620266 -1.19451 + vertex -0.0987492 -0.684647 -1.15005 + endloop + endfacet + facet normal 0.218085 -0.561192 -0.798437 + outer loop + vertex -0.170834 -0.628833 -1.20897 + vertex -0.0987492 -0.684647 -1.15005 + vertex -0.172822 -0.694772 -1.16317 + endloop + endfacet + facet normal 0.217805 -0.647908 -0.729915 + outer loop + vertex -0.172822 -0.694772 -1.16317 + vertex -0.0987492 -0.684647 -1.15005 + vertex -0.100049 -0.742924 -1.09871 + endloop + endfacet + facet normal 0.218197 -0.647566 -0.730101 + outer loop + vertex -0.172822 -0.694772 -1.16317 + vertex -0.100049 -0.742924 -1.09871 + vertex -0.173622 -0.754577 -1.11037 + endloop + endfacet + facet normal 0.299079 -0.04508 -0.953163 + outer loop + vertex -0.0734048 -0.153076 -1.31826 + vertex 0.00704463 -0.153076 -1.29302 + vertex 0.00556791 -0.234673 -1.28962 + endloop + endfacet + facet normal 0.299974 -0.0441302 -0.952926 + outer loop + vertex -0.0734048 -0.153076 -1.31826 + vertex 0.00556791 -0.234673 -1.28962 + vertex -0.0745272 -0.236192 -1.31477 + endloop + endfacet + facet normal 0.299161 -0.132014 -0.945026 + outer loop + vertex -0.0745272 -0.236192 -1.31477 + vertex 0.00556791 -0.234673 -1.28962 + vertex 0.0017652 -0.315319 -1.27956 + endloop + endfacet + facet normal 0.300883 -0.130221 -0.944728 + outer loop + vertex -0.0745272 -0.236192 -1.31477 + vertex 0.0017652 -0.315319 -1.27956 + vertex -0.0773775 -0.318406 -1.30434 + endloop + endfacet + facet normal 0.29939 -0.216818 -0.929169 + outer loop + vertex -0.0773775 -0.318406 -1.30434 + vertex 0.0017652 -0.315319 -1.27956 + vertex -0.00373603 -0.39406 -1.26296 + endloop + endfacet + facet normal 0.301199 -0.214972 -0.929014 + outer loop + vertex -0.0773775 -0.318406 -1.30434 + vertex -0.00373603 -0.39406 -1.26296 + vertex -0.0814389 -0.398816 -1.28705 + endloop + endfacet + facet normal 0.299184 -0.300575 -0.905618 + outer loop + vertex -0.0814389 -0.398816 -1.28705 + vertex -0.00373603 -0.39406 -1.26296 + vertex -0.0103084 -0.469946 -1.23994 + endloop + endfacet + facet normal 0.300574 -0.299184 -0.905618 + outer loop + vertex -0.0814389 -0.398816 -1.28705 + vertex -0.0103084 -0.469946 -1.23994 + vertex -0.0861945 -0.476519 -1.26296 + endloop + endfacet + facet normal 0.298268 -0.384239 -0.873726 + outer loop + vertex -0.0861945 -0.476519 -1.26296 + vertex -0.0103084 -0.469946 -1.23994 + vertex -0.0173243 -0.542025 -1.21064 + endloop + endfacet + facet normal 0.299024 -0.383498 -0.873793 + outer loop + vertex -0.0861945 -0.476519 -1.26296 + vertex -0.0173243 -0.542025 -1.21064 + vertex -0.0911277 -0.550613 -1.23213 + endloop + endfacet + facet normal 0.296773 -0.468718 -0.832003 + outer loop + vertex -0.0911277 -0.550613 -1.23213 + vertex -0.0173243 -0.542025 -1.21064 + vertex -0.0237128 -0.609522 -1.1749 + endloop + endfacet + facet normal 0.297261 -0.468247 -0.832094 + outer loop + vertex -0.0911277 -0.550613 -1.23213 + vertex -0.0237128 -0.609522 -1.1749 + vertex -0.095544 -0.620266 -1.19451 + endloop + endfacet + facet normal 0.295445 -0.553116 -0.778958 + outer loop + vertex -0.095544 -0.620266 -1.19451 + vertex -0.0237128 -0.609522 -1.1749 + vertex -0.0284028 -0.67166 -1.13255 + endloop + endfacet + facet normal 0.295886 -0.552697 -0.779088 + outer loop + vertex -0.095544 -0.620266 -1.19451 + vertex -0.0284028 -0.67166 -1.13255 + vertex -0.0987492 -0.684647 -1.15005 + endloop + endfacet + facet normal 0.294869 -0.635595 -0.713492 + outer loop + vertex -0.0987492 -0.684647 -1.15005 + vertex -0.0284028 -0.67166 -1.13255 + vertex -0.0303231 -0.727665 -1.08345 + endloop + endfacet + facet normal 0.295197 -0.635288 -0.71363 + outer loop + vertex -0.0987492 -0.684647 -1.15005 + vertex -0.0303231 -0.727665 -1.08345 + vertex -0.100049 -0.742924 -1.09871 + endloop + endfacet + facet normal 0.388007 -0.0463253 -0.920491 + outer loop + vertex 0.00704463 -0.153076 -1.29302 + vertex 0.0839438 -0.153076 -1.2606 + vertex 0.0821297 -0.233154 -1.25734 + endloop + endfacet + facet normal 0.388909 -0.0453323 -0.92016 + outer loop + vertex 0.00704463 -0.153076 -1.29302 + vertex 0.0821297 -0.233154 -1.25734 + vertex 0.00556791 -0.234673 -1.28962 + endloop + endfacet + facet normal 0.387306 -0.133746 -0.912199 + outer loop + vertex 0.00556791 -0.234673 -1.28962 + vertex 0.0821297 -0.233154 -1.25734 + vertex 0.0773726 -0.312186 -1.24777 + endloop + endfacet + facet normal 0.388845 -0.132096 -0.911784 + outer loop + vertex 0.00556791 -0.234673 -1.28962 + vertex 0.0773726 -0.312186 -1.24777 + vertex 0.0017652 -0.315319 -1.27956 + endloop + endfacet + facet normal 0.385963 -0.21745 -0.89652 + outer loop + vertex 0.0017652 -0.315319 -1.27956 + vertex 0.0773726 -0.312186 -1.24777 + vertex 0.0703578 -0.389127 -1.23213 + endloop + endfacet + facet normal 0.387327 -0.216026 -0.896276 + outer loop + vertex 0.0017652 -0.315319 -1.27956 + vertex 0.0703578 -0.389127 -1.23213 + vertex -0.00373603 -0.39406 -1.26296 + endloop + endfacet + facet normal 0.383497 -0.299025 -0.873793 + outer loop + vertex -0.00373603 -0.39406 -1.26296 + vertex 0.0703578 -0.389127 -1.23213 + vertex 0.0617705 -0.462931 -1.21064 + endloop + endfacet + facet normal 0.384239 -0.298268 -0.873726 + outer loop + vertex -0.00373603 -0.39406 -1.26296 + vertex 0.0617705 -0.462931 -1.21064 + vertex -0.0103084 -0.469946 -1.23994 + endloop + endfacet + facet normal 0.379858 -0.380045 -0.84337 + outer loop + vertex -0.0103084 -0.469946 -1.23994 + vertex 0.0617705 -0.462931 -1.21064 + vertex 0.0522959 -0.532551 -1.18354 + endloop + endfacet + facet normal 0.380045 -0.379858 -0.84337 + outer loop + vertex -0.0103084 -0.469946 -1.23994 + vertex 0.0522959 -0.532551 -1.18354 + vertex -0.0173243 -0.542025 -1.21064 + endloop + endfacet + facet normal 0.375706 -0.461367 -0.803733 + outer loop + vertex -0.0173243 -0.542025 -1.21064 + vertex 0.0522959 -0.532551 -1.18354 + vertex 0.0435065 -0.597295 -1.15048 + endloop + endfacet + facet normal 0.375838 -0.461236 -0.803746 + outer loop + vertex -0.0173243 -0.542025 -1.21064 + vertex 0.0435065 -0.597295 -1.15048 + vertex -0.0237128 -0.609522 -1.1749 + endloop + endfacet + facet normal 0.372253 -0.541996 -0.753437 + outer loop + vertex -0.0237128 -0.609522 -1.1749 + vertex 0.0435065 -0.597295 -1.15048 + vertex 0.0369749 -0.656471 -1.11114 + endloop + endfacet + facet normal 0.372642 -0.54161 -0.753523 + outer loop + vertex -0.0237128 -0.609522 -1.1749 + vertex 0.0369749 -0.656471 -1.11114 + vertex -0.0284028 -0.67166 -1.13255 + endloop + endfacet + facet normal 0.370576 -0.619783 -0.691767 + outer loop + vertex -0.0284028 -0.67166 -1.13255 + vertex 0.0369749 -0.656471 -1.11114 + vertex 0.0342735 -0.709387 -1.06518 + endloop + endfacet + facet normal 0.371044 -0.619312 -0.691939 + outer loop + vertex -0.0284028 -0.67166 -1.13255 + vertex 0.0342735 -0.709387 -1.06518 + vertex -0.0303231 -0.727665 -1.08345 + endloop + endfacet + facet normal 0.478724 -0.0475003 -0.87668 + outer loop + vertex 0.0839438 -0.153076 -1.2606 + vertex 0.156405 -0.153076 -1.22104 + vertex 0.154275 -0.231825 -1.21793 + endloop + endfacet + facet normal 0.479506 -0.0465961 -0.8763 + outer loop + vertex 0.0839438 -0.153076 -1.2606 + vertex 0.154275 -0.231825 -1.21793 + vertex 0.0821297 -0.233154 -1.25734 + endloop + endfacet + facet normal 0.476878 -0.135278 -0.868497 + outer loop + vertex 0.0821297 -0.233154 -1.25734 + vertex 0.154275 -0.231825 -1.21793 + vertex 0.148579 -0.309421 -1.20897 + endloop + endfacet + facet normal 0.47815 -0.133865 -0.868017 + outer loop + vertex 0.0821297 -0.233154 -1.25734 + vertex 0.148579 -0.309421 -1.20897 + vertex 0.0773726 -0.312186 -1.24777 + endloop + endfacet + facet normal 0.473474 -0.217822 -0.853449 + outer loop + vertex 0.0773726 -0.312186 -1.24777 + vertex 0.148579 -0.309421 -1.20897 + vertex 0.140011 -0.384711 -1.19451 + endloop + endfacet + facet normal 0.474514 -0.216707 -0.853155 + outer loop + vertex 0.0773726 -0.312186 -1.24777 + vertex 0.140011 -0.384711 -1.19451 + vertex 0.0703578 -0.389127 -1.23213 + endloop + endfacet + facet normal 0.468247 -0.297262 -0.832094 + outer loop + vertex 0.0703578 -0.389127 -1.23213 + vertex 0.140011 -0.384711 -1.19451 + vertex 0.129267 -0.456542 -1.1749 + endloop + endfacet + facet normal 0.468718 -0.296773 -0.832003 + outer loop + vertex 0.0703578 -0.389127 -1.23213 + vertex 0.129267 -0.456542 -1.1749 + vertex 0.0617705 -0.462931 -1.21064 + endloop + endfacet + facet normal 0.461236 -0.375838 -0.803746 + outer loop + vertex 0.0617705 -0.462931 -1.21064 + vertex 0.129267 -0.456542 -1.1749 + vertex 0.11704 -0.523761 -1.15048 + endloop + endfacet + facet normal 0.461367 -0.375706 -0.803732 + outer loop + vertex 0.0617705 -0.462931 -1.21064 + vertex 0.11704 -0.523761 -1.15048 + vertex 0.0522959 -0.532551 -1.18354 + endloop + endfacet + facet normal 0.453469 -0.452544 -0.767834 + outer loop + vertex 0.0522959 -0.532551 -1.18354 + vertex 0.11704 -0.523761 -1.15048 + vertex 0.105262 -0.585517 -1.12104 + endloop + endfacet + facet normal 0.452545 -0.453469 -0.767834 + outer loop + vertex 0.0522959 -0.532551 -1.18354 + vertex 0.105262 -0.585517 -1.12104 + vertex 0.0435065 -0.597295 -1.15048 + endloop + endfacet + facet normal 0.445417 -0.527981 -0.723076 + outer loop + vertex 0.0435065 -0.597295 -1.15048 + vertex 0.105262 -0.585517 -1.12104 + vertex 0.0958629 -0.640958 -1.08635 + endloop + endfacet + facet normal 0.44384 -0.52958 -0.722877 + outer loop + vertex 0.0435065 -0.597295 -1.15048 + vertex 0.0958629 -0.640958 -1.08635 + vertex 0.0369749 -0.656471 -1.11114 + endloop + endfacet + facet normal 0.439351 -0.601507 -0.667203 + outer loop + vertex 0.0369749 -0.656471 -1.11114 + vertex 0.0958629 -0.640958 -1.08635 + vertex 0.0917579 -0.689499 -1.04529 + endloop + endfacet + facet normal 0.439022 -0.601856 -0.667105 + outer loop + vertex 0.0369749 -0.656471 -1.11114 + vertex 0.0917579 -0.689499 -1.04529 + vertex 0.0342735 -0.709387 -1.06518 + endloop + endfacet + facet normal 0.570404 -0.0484132 -0.819936 + outer loop + vertex 0.156405 -0.153076 -1.22104 + vertex 0.223541 -0.153076 -1.17433 + vertex 0.22112 -0.230875 -1.17142 + endloop + endfacet + facet normal 0.570947 -0.0477455 -0.819597 + outer loop + vertex 0.156405 -0.153076 -1.22104 + vertex 0.22112 -0.230875 -1.17142 + vertex 0.154275 -0.231825 -1.21793 + endloop + endfacet + facet normal 0.567105 -0.136455 -0.812264 + outer loop + vertex 0.154275 -0.231825 -1.21793 + vertex 0.22112 -0.230875 -1.17142 + vertex 0.214517 -0.307433 -1.16317 + endloop + endfacet + facet normal 0.567993 -0.135423 -0.811816 + outer loop + vertex 0.154275 -0.231825 -1.21793 + vertex 0.214517 -0.307433 -1.16317 + vertex 0.148579 -0.309421 -1.20897 + endloop + endfacet + facet normal 0.561192 -0.218085 -0.798437 + outer loop + vertex 0.148579 -0.309421 -1.20897 + vertex 0.214517 -0.307433 -1.16317 + vertex 0.204392 -0.381506 -1.15005 + endloop + endfacet + facet normal 0.561937 -0.217264 -0.798138 + outer loop + vertex 0.148579 -0.309421 -1.20897 + vertex 0.204392 -0.381506 -1.15005 + vertex 0.140011 -0.384711 -1.19451 + endloop + endfacet + facet normal 0.552697 -0.295887 -0.779087 + outer loop + vertex 0.140011 -0.384711 -1.19451 + vertex 0.204392 -0.381506 -1.15005 + vertex 0.191405 -0.451852 -1.13255 + endloop + endfacet + facet normal 0.553116 -0.295446 -0.778957 + outer loop + vertex 0.140011 -0.384711 -1.19451 + vertex 0.191405 -0.451852 -1.13255 + vertex 0.129267 -0.456542 -1.1749 + endloop + endfacet + facet normal 0.54161 -0.372644 -0.753522 + outer loop + vertex 0.129267 -0.456542 -1.1749 + vertex 0.191405 -0.451852 -1.13255 + vertex 0.176216 -0.51723 -1.11114 + endloop + endfacet + facet normal 0.541997 -0.372253 -0.753436 + outer loop + vertex 0.129267 -0.456542 -1.1749 + vertex 0.176216 -0.51723 -1.11114 + vertex 0.11704 -0.523761 -1.15048 + endloop + endfacet + facet normal 0.529582 -0.443839 -0.722877 + outer loop + vertex 0.11704 -0.523761 -1.15048 + vertex 0.176216 -0.51723 -1.11114 + vertex 0.160703 -0.576118 -1.08635 + endloop + endfacet + facet normal 0.527982 -0.445417 -0.723076 + outer loop + vertex 0.11704 -0.523761 -1.15048 + vertex 0.160703 -0.576118 -1.08635 + vertex 0.105262 -0.585517 -1.12104 + endloop + endfacet + facet normal 0.515982 -0.513857 -0.685357 + outer loop + vertex 0.105262 -0.585517 -1.12104 + vertex 0.160703 -0.576118 -1.08635 + vertex 0.14674 -0.626995 -1.05871 + endloop + endfacet + facet normal 0.513857 -0.515982 -0.685357 + outer loop + vertex 0.105262 -0.585517 -1.12104 + vertex 0.14674 -0.626995 -1.05871 + vertex 0.0958629 -0.640958 -1.08635 + endloop + endfacet + facet normal 0.505666 -0.581828 -0.637007 + outer loop + vertex 0.0958629 -0.640958 -1.08635 + vertex 0.14674 -0.626995 -1.05871 + vertex 0.140147 -0.669413 -1.0252 + endloop + endfacet + facet normal 0.505852 -0.581623 -0.637047 + outer loop + vertex 0.0958629 -0.640958 -1.08635 + vertex 0.140147 -0.669413 -1.0252 + vertex 0.0917579 -0.689499 -1.04529 + endloop + endfacet + facet normal 0.661295 -0.0488431 -0.748534 + outer loop + vertex 0.223541 -0.153076 -1.17433 + vertex 0.284465 -0.153076 -1.12051 + vertex 0.281783 -0.230496 -1.11783 + endloop + endfacet + facet normal 0.661499 -0.0485718 -0.748372 + outer loop + vertex 0.223541 -0.153076 -1.17433 + vertex 0.281783 -0.230496 -1.11783 + vertex 0.22112 -0.230875 -1.17142 + endloop + endfacet + facet normal 0.656347 -0.13701 -0.741914 + outer loop + vertex 0.22112 -0.230875 -1.17142 + vertex 0.281783 -0.230496 -1.11783 + vertex 0.274322 -0.306633 -1.11037 + endloop + endfacet + facet normal 0.656699 -0.136576 -0.741683 + outer loop + vertex 0.22112 -0.230875 -1.17142 + vertex 0.274322 -0.306633 -1.11037 + vertex 0.214517 -0.307433 -1.16317 + endloop + endfacet + facet normal 0.647566 -0.218198 -0.730102 + outer loop + vertex 0.214517 -0.307433 -1.16317 + vertex 0.274322 -0.306633 -1.11037 + vertex 0.262669 -0.380206 -1.09871 + endloop + endfacet + facet normal 0.647908 -0.217806 -0.729915 + outer loop + vertex 0.214517 -0.307433 -1.16317 + vertex 0.262669 -0.380206 -1.09871 + vertex 0.204392 -0.381506 -1.15005 + endloop + endfacet + facet normal 0.635288 -0.295197 -0.71363 + outer loop + vertex 0.204392 -0.381506 -1.15005 + vertex 0.262669 -0.380206 -1.09871 + vertex 0.247411 -0.449932 -1.08345 + endloop + endfacet + facet normal 0.635594 -0.29487 -0.713492 + outer loop + vertex 0.204392 -0.381506 -1.15005 + vertex 0.247411 -0.449932 -1.08345 + vertex 0.191405 -0.451852 -1.13255 + endloop + endfacet + facet normal 0.619311 -0.371045 -0.691939 + outer loop + vertex 0.191405 -0.451852 -1.13255 + vertex 0.247411 -0.449932 -1.08345 + vertex 0.229132 -0.514529 -1.06518 + endloop + endfacet + facet normal 0.619782 -0.370577 -0.691768 + outer loop + vertex 0.191405 -0.451852 -1.13255 + vertex 0.229132 -0.514529 -1.06518 + vertex 0.176216 -0.51723 -1.11114 + endloop + endfacet + facet normal 0.601855 -0.439022 -0.667106 + outer loop + vertex 0.176216 -0.51723 -1.11114 + vertex 0.229132 -0.514529 -1.06518 + vertex 0.209244 -0.572013 -1.04529 + endloop + endfacet + facet normal 0.601507 -0.43935 -0.667204 + outer loop + vertex 0.176216 -0.51723 -1.11114 + vertex 0.209244 -0.572013 -1.04529 + vertex 0.160703 -0.576118 -1.08635 + endloop + endfacet + facet normal 0.581622 -0.505853 -0.637047 + outer loop + vertex 0.160703 -0.576118 -1.08635 + vertex 0.209244 -0.572013 -1.04529 + vertex 0.189158 -0.620402 -1.0252 + endloop + endfacet + facet normal 0.581828 -0.505666 -0.637007 + outer loop + vertex 0.160703 -0.576118 -1.08635 + vertex 0.189158 -0.620402 -1.0252 + vertex 0.14674 -0.626995 -1.05871 + endloop + endfacet + facet normal 0.562734 -0.568022 -0.600568 + outer loop + vertex 0.14674 -0.626995 -1.05871 + vertex 0.189158 -0.620402 -1.0252 + vertex 0.173078 -0.653333 -1.00912 + endloop + endfacet + facet normal 0.568022 -0.562733 -0.600568 + outer loop + vertex 0.14674 -0.626995 -1.05871 + vertex 0.173078 -0.653333 -1.00912 + vertex 0.140147 -0.669413 -1.0252 + endloop + endfacet + facet normal -0.0423597 -0.0421465 -0.998213 + outer loop + vertex -0.327179 -0.153076 -1.35078 + vertex -0.327179 -0.238851 -1.34716 + vertex -0.412574 -0.238471 -1.34355 + endloop + endfacet + facet normal -0.0421465 -0.0423597 -0.998213 + outer loop + vertex -0.327179 -0.153076 -1.35078 + vertex -0.412574 -0.238471 -1.34355 + vertex -0.412953 -0.153076 -1.34716 + endloop + endfacet + facet normal -0.127173 -0.0424319 -0.990972 + outer loop + vertex -0.412953 -0.153076 -1.34716 + vertex -0.412574 -0.238471 -1.34355 + vertex -0.497085 -0.237521 -1.33275 + endloop + endfacet + facet normal -0.126626 -0.0429848 -0.991019 + outer loop + vertex -0.412953 -0.153076 -1.34716 + vertex -0.497085 -0.237521 -1.33275 + vertex -0.497841 -0.153076 -1.33632 + endloop + endfacet + facet normal -0.212842 -0.0431273 -0.976134 + outer loop + vertex -0.497841 -0.153076 -1.33632 + vertex -0.497085 -0.237521 -1.33275 + vertex -0.57983 -0.236192 -1.31477 + endloop + endfacet + facet normal -0.212067 -0.0439261 -0.976267 + outer loop + vertex -0.497841 -0.153076 -1.33632 + vertex -0.57983 -0.236192 -1.31477 + vertex -0.580953 -0.153076 -1.31826 + endloop + endfacet + facet normal -0.299974 -0.0441314 -0.952926 + outer loop + vertex -0.580953 -0.153076 -1.31826 + vertex -0.57983 -0.236192 -1.31477 + vertex -0.659926 -0.234673 -1.28962 + endloop + endfacet + facet normal -0.299079 -0.0450811 -0.953163 + outer loop + vertex -0.580953 -0.153076 -1.31826 + vertex -0.659926 -0.234673 -1.28962 + vertex -0.661402 -0.153076 -1.29302 + endloop + endfacet + facet normal -0.388908 -0.0453332 -0.920161 + outer loop + vertex -0.661402 -0.153076 -1.29302 + vertex -0.659926 -0.234673 -1.28962 + vertex -0.736487 -0.233154 -1.25734 + endloop + endfacet + facet normal -0.388007 -0.0463251 -0.920492 + outer loop + vertex -0.661402 -0.153076 -1.29302 + vertex -0.736487 -0.233154 -1.25734 + vertex -0.738301 -0.153076 -1.2606 + endloop + endfacet + facet normal -0.479506 -0.0465959 -0.876301 + outer loop + vertex -0.738301 -0.153076 -1.2606 + vertex -0.736487 -0.233154 -1.25734 + vertex -0.808633 -0.231825 -1.21793 + endloop + endfacet + facet normal -0.478724 -0.0474997 -0.87668 + outer loop + vertex -0.738301 -0.153076 -1.2606 + vertex -0.808633 -0.231825 -1.21793 + vertex -0.810763 -0.153076 -1.22104 + endloop + endfacet + facet normal -0.570947 -0.0477448 -0.819597 + outer loop + vertex -0.810763 -0.153076 -1.22104 + vertex -0.808633 -0.231825 -1.21793 + vertex -0.875478 -0.230875 -1.17142 + endloop + endfacet + facet normal -0.570404 -0.0484129 -0.819936 + outer loop + vertex -0.810763 -0.153076 -1.22104 + vertex -0.875478 -0.230875 -1.17142 + vertex -0.877899 -0.153076 -1.17433 + endloop + endfacet + facet normal -0.661499 -0.0485714 -0.748371 + outer loop + vertex -0.877899 -0.153076 -1.17433 + vertex -0.875478 -0.230875 -1.17142 + vertex -0.93614 -0.230495 -1.11783 + endloop + endfacet + facet normal -0.661295 -0.0488431 -0.748534 + outer loop + vertex -0.877899 -0.153076 -1.17433 + vertex -0.93614 -0.230495 -1.11783 + vertex -0.938822 -0.153076 -1.12051 + endloop + endfacet + facet normal -0.0429849 -0.126626 -0.991019 + outer loop + vertex -0.327179 -0.238851 -1.34716 + vertex -0.327179 -0.323738 -1.33632 + vertex -0.411624 -0.322982 -1.33275 + endloop + endfacet + facet normal -0.042432 -0.127173 -0.990972 + outer loop + vertex -0.327179 -0.238851 -1.34716 + vertex -0.411624 -0.322982 -1.33275 + vertex -0.412574 -0.238471 -1.34355 + endloop + endfacet + facet normal -0.128457 -0.127188 -0.983525 + outer loop + vertex -0.412574 -0.238471 -1.34355 + vertex -0.411624 -0.322982 -1.33275 + vertex -0.495186 -0.321083 -1.32208 + endloop + endfacet + facet normal -0.127188 -0.128457 -0.983525 + outer loop + vertex -0.412574 -0.238471 -1.34355 + vertex -0.495186 -0.321083 -1.32208 + vertex -0.497085 -0.237521 -1.33275 + endloop + endfacet + facet normal -0.214212 -0.128491 -0.968299 + outer loop + vertex -0.497085 -0.237521 -1.33275 + vertex -0.495186 -0.321083 -1.32208 + vertex -0.57698 -0.318406 -1.30434 + endloop + endfacet + facet normal -0.212567 -0.130165 -0.968438 + outer loop + vertex -0.497085 -0.237521 -1.33275 + vertex -0.57698 -0.318406 -1.30434 + vertex -0.57983 -0.236192 -1.31477 + endloop + endfacet + facet normal -0.300882 -0.13022 -0.944729 + outer loop + vertex -0.57983 -0.236192 -1.31477 + vertex -0.57698 -0.318406 -1.30434 + vertex -0.656123 -0.315318 -1.27956 + endloop + endfacet + facet normal -0.299161 -0.132012 -0.945027 + outer loop + vertex -0.57983 -0.236192 -1.31477 + vertex -0.656123 -0.315318 -1.27956 + vertex -0.659926 -0.234673 -1.28962 + endloop + endfacet + facet normal -0.388846 -0.132093 -0.911784 + outer loop + vertex -0.659926 -0.234673 -1.28962 + vertex -0.656123 -0.315318 -1.27956 + vertex -0.73173 -0.312186 -1.24777 + endloop + endfacet + facet normal -0.387305 -0.133745 -0.912199 + outer loop + vertex -0.659926 -0.234673 -1.28962 + vertex -0.73173 -0.312186 -1.24777 + vertex -0.736487 -0.233154 -1.25734 + endloop + endfacet + facet normal -0.47815 -0.133865 -0.868017 + outer loop + vertex -0.736487 -0.233154 -1.25734 + vertex -0.73173 -0.312186 -1.24777 + vertex -0.802936 -0.309421 -1.20897 + endloop + endfacet + facet normal -0.476878 -0.135278 -0.868497 + outer loop + vertex -0.736487 -0.233154 -1.25734 + vertex -0.802936 -0.309421 -1.20897 + vertex -0.808633 -0.231825 -1.21793 + endloop + endfacet + facet normal -0.567993 -0.135422 -0.811816 + outer loop + vertex -0.808633 -0.231825 -1.21793 + vertex -0.802936 -0.309421 -1.20897 + vertex -0.868875 -0.307433 -1.16317 + endloop + endfacet + facet normal -0.567105 -0.136454 -0.812264 + outer loop + vertex -0.808633 -0.231825 -1.21793 + vertex -0.868875 -0.307433 -1.16317 + vertex -0.875478 -0.230875 -1.17142 + endloop + endfacet + facet normal -0.656699 -0.136575 -0.741683 + outer loop + vertex -0.875478 -0.230875 -1.17142 + vertex -0.868875 -0.307433 -1.16317 + vertex -0.92868 -0.306633 -1.11037 + endloop + endfacet + facet normal -0.656348 -0.137009 -0.741914 + outer loop + vertex -0.875478 -0.230875 -1.17142 + vertex -0.92868 -0.306633 -1.11037 + vertex -0.93614 -0.230495 -1.11783 + endloop + endfacet + facet normal -0.0439248 -0.212067 -0.976268 + outer loop + vertex -0.327179 -0.323738 -1.33632 + vertex -0.327179 -0.40685 -1.31826 + vertex -0.410295 -0.405728 -1.31477 + endloop + endfacet + facet normal -0.0431275 -0.21284 -0.976135 + outer loop + vertex -0.327179 -0.323738 -1.33632 + vertex -0.410295 -0.405728 -1.31477 + vertex -0.411624 -0.322982 -1.33275 + endloop + endfacet + facet normal -0.130166 -0.212566 -0.968438 + outer loop + vertex -0.411624 -0.322982 -1.33275 + vertex -0.410295 -0.405728 -1.31477 + vertex -0.492509 -0.402877 -1.30434 + endloop + endfacet + facet normal -0.128491 -0.214212 -0.968299 + outer loop + vertex -0.411624 -0.322982 -1.33275 + vertex -0.492509 -0.402877 -1.30434 + vertex -0.495186 -0.321083 -1.32208 + endloop + endfacet + facet normal -0.215667 -0.213702 -0.952796 + outer loop + vertex -0.495186 -0.321083 -1.32208 + vertex -0.492509 -0.402877 -1.30434 + vertex -0.572919 -0.398816 -1.28705 + endloop + endfacet + facet normal -0.213702 -0.215666 -0.952796 + outer loop + vertex -0.495186 -0.321083 -1.32208 + vertex -0.572919 -0.398816 -1.28705 + vertex -0.57698 -0.318406 -1.30434 + endloop + endfacet + facet normal -0.301198 -0.214972 -0.929014 + outer loop + vertex -0.57698 -0.318406 -1.30434 + vertex -0.572919 -0.398816 -1.28705 + vertex -0.650622 -0.39406 -1.26296 + endloop + endfacet + facet normal -0.299389 -0.216818 -0.92917 + outer loop + vertex -0.57698 -0.318406 -1.30434 + vertex -0.650622 -0.39406 -1.26296 + vertex -0.656123 -0.315318 -1.27956 + endloop + endfacet + facet normal -0.387327 -0.216027 -0.896276 + outer loop + vertex -0.656123 -0.315318 -1.27956 + vertex -0.650622 -0.39406 -1.26296 + vertex -0.724715 -0.389127 -1.23213 + endloop + endfacet + facet normal -0.385964 -0.21745 -0.89652 + outer loop + vertex -0.656123 -0.315318 -1.27956 + vertex -0.724715 -0.389127 -1.23213 + vertex -0.73173 -0.312186 -1.24777 + endloop + endfacet + facet normal -0.474514 -0.216707 -0.853155 + outer loop + vertex -0.73173 -0.312186 -1.24777 + vertex -0.724715 -0.389127 -1.23213 + vertex -0.794369 -0.384711 -1.19451 + endloop + endfacet + facet normal -0.473474 -0.217822 -0.85345 + outer loop + vertex -0.73173 -0.312186 -1.24777 + vertex -0.794369 -0.384711 -1.19451 + vertex -0.802936 -0.309421 -1.20897 + endloop + endfacet + facet normal -0.561937 -0.217264 -0.798138 + outer loop + vertex -0.802936 -0.309421 -1.20897 + vertex -0.794369 -0.384711 -1.19451 + vertex -0.85875 -0.381506 -1.15005 + endloop + endfacet + facet normal -0.561192 -0.218085 -0.798437 + outer loop + vertex -0.802936 -0.309421 -1.20897 + vertex -0.85875 -0.381506 -1.15005 + vertex -0.868875 -0.307433 -1.16317 + endloop + endfacet + facet normal -0.647908 -0.217805 -0.729915 + outer loop + vertex -0.868875 -0.307433 -1.16317 + vertex -0.85875 -0.381506 -1.15005 + vertex -0.917027 -0.380206 -1.09871 + endloop + endfacet + facet normal -0.647566 -0.218198 -0.730102 + outer loop + vertex -0.868875 -0.307433 -1.16317 + vertex -0.917027 -0.380206 -1.09871 + vertex -0.92868 -0.306633 -1.11037 + endloop + endfacet + facet normal -0.04508 -0.299079 -0.953163 + outer loop + vertex -0.327179 -0.40685 -1.31826 + vertex -0.327179 -0.487299 -1.29302 + vertex -0.408776 -0.485823 -1.28962 + endloop + endfacet + facet normal -0.0441302 -0.299975 -0.952926 + outer loop + vertex -0.327179 -0.40685 -1.31826 + vertex -0.408776 -0.485823 -1.28962 + vertex -0.410295 -0.405728 -1.31477 + endloop + endfacet + facet normal -0.132014 -0.299162 -0.945026 + outer loop + vertex -0.410295 -0.405728 -1.31477 + vertex -0.408776 -0.485823 -1.28962 + vertex -0.489421 -0.48202 -1.27956 + endloop + endfacet + facet normal -0.130222 -0.300883 -0.944728 + outer loop + vertex -0.410295 -0.405728 -1.31477 + vertex -0.489421 -0.48202 -1.27956 + vertex -0.492509 -0.402877 -1.30434 + endloop + endfacet + facet normal -0.216817 -0.29939 -0.929169 + outer loop + vertex -0.492509 -0.402877 -1.30434 + vertex -0.489421 -0.48202 -1.27956 + vertex -0.568163 -0.476519 -1.26296 + endloop + endfacet + facet normal -0.214972 -0.301198 -0.929014 + outer loop + vertex -0.492509 -0.402877 -1.30434 + vertex -0.568163 -0.476519 -1.26296 + vertex -0.572919 -0.398816 -1.28705 + endloop + endfacet + facet normal -0.300575 -0.299184 -0.905618 + outer loop + vertex -0.572919 -0.398816 -1.28705 + vertex -0.568163 -0.476519 -1.26296 + vertex -0.644049 -0.469946 -1.23994 + endloop + endfacet + facet normal -0.299184 -0.300575 -0.905618 + outer loop + vertex -0.572919 -0.398816 -1.28705 + vertex -0.644049 -0.469946 -1.23994 + vertex -0.650622 -0.39406 -1.26296 + endloop + endfacet + facet normal -0.384239 -0.298268 -0.873726 + outer loop + vertex -0.650622 -0.39406 -1.26296 + vertex -0.644049 -0.469946 -1.23994 + vertex -0.716128 -0.46293 -1.21064 + endloop + endfacet + facet normal -0.383498 -0.299025 -0.873793 + outer loop + vertex -0.650622 -0.39406 -1.26296 + vertex -0.716128 -0.46293 -1.21064 + vertex -0.724715 -0.389127 -1.23213 + endloop + endfacet + facet normal -0.468718 -0.296773 -0.832003 + outer loop + vertex -0.724715 -0.389127 -1.23213 + vertex -0.716128 -0.46293 -1.21064 + vertex -0.783624 -0.456542 -1.1749 + endloop + endfacet + facet normal -0.468247 -0.297262 -0.832094 + outer loop + vertex -0.724715 -0.389127 -1.23213 + vertex -0.783624 -0.456542 -1.1749 + vertex -0.794369 -0.384711 -1.19451 + endloop + endfacet + facet normal -0.553116 -0.295446 -0.778957 + outer loop + vertex -0.794369 -0.384711 -1.19451 + vertex -0.783624 -0.456542 -1.1749 + vertex -0.845763 -0.451852 -1.13255 + endloop + endfacet + facet normal -0.552697 -0.295887 -0.779088 + outer loop + vertex -0.794369 -0.384711 -1.19451 + vertex -0.845763 -0.451852 -1.13255 + vertex -0.85875 -0.381506 -1.15005 + endloop + endfacet + facet normal -0.635594 -0.29487 -0.713493 + outer loop + vertex -0.85875 -0.381506 -1.15005 + vertex -0.845763 -0.451852 -1.13255 + vertex -0.901768 -0.449932 -1.08345 + endloop + endfacet + facet normal -0.635288 -0.295196 -0.71363 + outer loop + vertex -0.85875 -0.381506 -1.15005 + vertex -0.901768 -0.449932 -1.08345 + vertex -0.917027 -0.380206 -1.09871 + endloop + endfacet + facet normal -0.0463254 -0.388007 -0.920492 + outer loop + vertex -0.327179 -0.487299 -1.29302 + vertex -0.327179 -0.564198 -1.2606 + vertex -0.407257 -0.562384 -1.25734 + endloop + endfacet + facet normal -0.0453322 -0.388909 -0.92016 + outer loop + vertex -0.327179 -0.487299 -1.29302 + vertex -0.407257 -0.562384 -1.25734 + vertex -0.408776 -0.485823 -1.28962 + endloop + endfacet + facet normal -0.133745 -0.387306 -0.912199 + outer loop + vertex -0.408776 -0.485823 -1.28962 + vertex -0.407257 -0.562384 -1.25734 + vertex -0.486289 -0.557627 -1.24777 + endloop + endfacet + facet normal -0.132096 -0.388845 -0.911784 + outer loop + vertex -0.408776 -0.485823 -1.28962 + vertex -0.486289 -0.557627 -1.24777 + vertex -0.489421 -0.48202 -1.27956 + endloop + endfacet + facet normal -0.21745 -0.385963 -0.89652 + outer loop + vertex -0.489421 -0.48202 -1.27956 + vertex -0.486289 -0.557627 -1.24777 + vertex -0.56323 -0.550613 -1.23213 + endloop + endfacet + facet normal -0.216026 -0.387327 -0.896276 + outer loop + vertex -0.489421 -0.48202 -1.27956 + vertex -0.56323 -0.550613 -1.23213 + vertex -0.568163 -0.476519 -1.26296 + endloop + endfacet + facet normal -0.299025 -0.383497 -0.873793 + outer loop + vertex -0.568163 -0.476519 -1.26296 + vertex -0.56323 -0.550613 -1.23213 + vertex -0.637033 -0.542025 -1.21064 + endloop + endfacet + facet normal -0.298268 -0.384239 -0.873726 + outer loop + vertex -0.568163 -0.476519 -1.26296 + vertex -0.637033 -0.542025 -1.21064 + vertex -0.644049 -0.469946 -1.23994 + endloop + endfacet + facet normal -0.380045 -0.379858 -0.84337 + outer loop + vertex -0.644049 -0.469946 -1.23994 + vertex -0.637033 -0.542025 -1.21064 + vertex -0.706654 -0.532551 -1.18354 + endloop + endfacet + facet normal -0.379858 -0.380045 -0.84337 + outer loop + vertex -0.644049 -0.469946 -1.23994 + vertex -0.706654 -0.532551 -1.18354 + vertex -0.716128 -0.46293 -1.21064 + endloop + endfacet + facet normal -0.461367 -0.375705 -0.803733 + outer loop + vertex -0.716128 -0.46293 -1.21064 + vertex -0.706654 -0.532551 -1.18354 + vertex -0.771398 -0.523761 -1.15048 + endloop + endfacet + facet normal -0.461236 -0.375837 -0.803746 + outer loop + vertex -0.716128 -0.46293 -1.21064 + vertex -0.771398 -0.523761 -1.15048 + vertex -0.783624 -0.456542 -1.1749 + endloop + endfacet + facet normal -0.541996 -0.372253 -0.753437 + outer loop + vertex -0.783624 -0.456542 -1.1749 + vertex -0.771398 -0.523761 -1.15048 + vertex -0.830574 -0.51723 -1.11114 + endloop + endfacet + facet normal -0.54161 -0.372642 -0.753523 + outer loop + vertex -0.783624 -0.456542 -1.1749 + vertex -0.830574 -0.51723 -1.11114 + vertex -0.845763 -0.451852 -1.13255 + endloop + endfacet + facet normal -0.619784 -0.370576 -0.691767 + outer loop + vertex -0.845763 -0.451852 -1.13255 + vertex -0.830574 -0.51723 -1.11114 + vertex -0.883489 -0.514528 -1.06518 + endloop + endfacet + facet normal -0.619311 -0.371045 -0.691939 + outer loop + vertex -0.845763 -0.451852 -1.13255 + vertex -0.883489 -0.514528 -1.06518 + vertex -0.901768 -0.449932 -1.08345 + endloop + endfacet + facet normal -0.0475001 -0.478724 -0.876679 + outer loop + vertex -0.327179 -0.564198 -1.2606 + vertex -0.327179 -0.63666 -1.22104 + vertex -0.405928 -0.63453 -1.21793 + endloop + endfacet + facet normal -0.0465963 -0.479506 -0.876301 + outer loop + vertex -0.327179 -0.564198 -1.2606 + vertex -0.405928 -0.63453 -1.21793 + vertex -0.407257 -0.562384 -1.25734 + endloop + endfacet + facet normal -0.135278 -0.476878 -0.868497 + outer loop + vertex -0.407257 -0.562384 -1.25734 + vertex -0.405928 -0.63453 -1.21793 + vertex -0.483524 -0.628833 -1.20897 + endloop + endfacet + facet normal -0.133865 -0.47815 -0.868017 + outer loop + vertex -0.407257 -0.562384 -1.25734 + vertex -0.483524 -0.628833 -1.20897 + vertex -0.486289 -0.557627 -1.24777 + endloop + endfacet + facet normal -0.217822 -0.473474 -0.85345 + outer loop + vertex -0.486289 -0.557627 -1.24777 + vertex -0.483524 -0.628833 -1.20897 + vertex -0.558814 -0.620266 -1.19451 + endloop + endfacet + facet normal -0.216707 -0.474514 -0.853155 + outer loop + vertex -0.486289 -0.557627 -1.24777 + vertex -0.558814 -0.620266 -1.19451 + vertex -0.56323 -0.550613 -1.23213 + endloop + endfacet + facet normal -0.297262 -0.468247 -0.832094 + outer loop + vertex -0.56323 -0.550613 -1.23213 + vertex -0.558814 -0.620266 -1.19451 + vertex -0.630645 -0.609522 -1.1749 + endloop + endfacet + facet normal -0.296773 -0.468717 -0.832003 + outer loop + vertex -0.56323 -0.550613 -1.23213 + vertex -0.630645 -0.609522 -1.1749 + vertex -0.637033 -0.542025 -1.21064 + endloop + endfacet + facet normal -0.375838 -0.461236 -0.803746 + outer loop + vertex -0.637033 -0.542025 -1.21064 + vertex -0.630645 -0.609522 -1.1749 + vertex -0.697864 -0.597295 -1.15048 + endloop + endfacet + facet normal -0.375706 -0.461367 -0.803732 + outer loop + vertex -0.637033 -0.542025 -1.21064 + vertex -0.697864 -0.597295 -1.15048 + vertex -0.706654 -0.532551 -1.18354 + endloop + endfacet + facet normal -0.452545 -0.453469 -0.767834 + outer loop + vertex -0.706654 -0.532551 -1.18354 + vertex -0.697864 -0.597295 -1.15048 + vertex -0.75962 -0.585517 -1.12104 + endloop + endfacet + facet normal -0.453469 -0.452545 -0.767834 + outer loop + vertex -0.706654 -0.532551 -1.18354 + vertex -0.75962 -0.585517 -1.12104 + vertex -0.771398 -0.523761 -1.15048 + endloop + endfacet + facet normal -0.527981 -0.445418 -0.723076 + outer loop + vertex -0.771398 -0.523761 -1.15048 + vertex -0.75962 -0.585517 -1.12104 + vertex -0.81506 -0.576118 -1.08635 + endloop + endfacet + facet normal -0.52958 -0.443839 -0.722877 + outer loop + vertex -0.771398 -0.523761 -1.15048 + vertex -0.81506 -0.576118 -1.08635 + vertex -0.830574 -0.51723 -1.11114 + endloop + endfacet + facet normal -0.601507 -0.43935 -0.667203 + outer loop + vertex -0.830574 -0.51723 -1.11114 + vertex -0.81506 -0.576118 -1.08635 + vertex -0.863602 -0.572013 -1.04529 + endloop + endfacet + facet normal -0.601856 -0.439022 -0.667105 + outer loop + vertex -0.830574 -0.51723 -1.11114 + vertex -0.863602 -0.572013 -1.04529 + vertex -0.883489 -0.514528 -1.06518 + endloop + endfacet + facet normal -0.0484129 -0.570404 -0.819936 + outer loop + vertex -0.327179 -0.63666 -1.22104 + vertex -0.327179 -0.703796 -1.17433 + vertex -0.404978 -0.701375 -1.17142 + endloop + endfacet + facet normal -0.0477453 -0.570947 -0.819597 + outer loop + vertex -0.327179 -0.63666 -1.22104 + vertex -0.404978 -0.701375 -1.17142 + vertex -0.405928 -0.63453 -1.21793 + endloop + endfacet + facet normal -0.136455 -0.567104 -0.812264 + outer loop + vertex -0.405928 -0.63453 -1.21793 + vertex -0.404978 -0.701375 -1.17142 + vertex -0.481536 -0.694772 -1.16317 + endloop + endfacet + facet normal -0.135422 -0.567993 -0.811816 + outer loop + vertex -0.405928 -0.63453 -1.21793 + vertex -0.481536 -0.694772 -1.16317 + vertex -0.483524 -0.628833 -1.20897 + endloop + endfacet + facet normal -0.218086 -0.561192 -0.798437 + outer loop + vertex -0.483524 -0.628833 -1.20897 + vertex -0.481536 -0.694772 -1.16317 + vertex -0.555609 -0.684647 -1.15005 + endloop + endfacet + facet normal -0.217264 -0.561937 -0.798138 + outer loop + vertex -0.483524 -0.628833 -1.20897 + vertex -0.555609 -0.684647 -1.15005 + vertex -0.558814 -0.620266 -1.19451 + endloop + endfacet + facet normal -0.295887 -0.552697 -0.779087 + outer loop + vertex -0.558814 -0.620266 -1.19451 + vertex -0.555609 -0.684647 -1.15005 + vertex -0.625955 -0.67166 -1.13255 + endloop + endfacet + facet normal -0.295446 -0.553116 -0.778957 + outer loop + vertex -0.558814 -0.620266 -1.19451 + vertex -0.625955 -0.67166 -1.13255 + vertex -0.630645 -0.609522 -1.1749 + endloop + endfacet + facet normal -0.372643 -0.54161 -0.753522 + outer loop + vertex -0.630645 -0.609522 -1.1749 + vertex -0.625955 -0.67166 -1.13255 + vertex -0.691333 -0.656471 -1.11114 + endloop + endfacet + facet normal -0.372254 -0.541997 -0.753436 + outer loop + vertex -0.630645 -0.609522 -1.1749 + vertex -0.691333 -0.656471 -1.11114 + vertex -0.697864 -0.597295 -1.15048 + endloop + endfacet + facet normal -0.443838 -0.529582 -0.722877 + outer loop + vertex -0.697864 -0.597295 -1.15048 + vertex -0.691333 -0.656471 -1.11114 + vertex -0.750221 -0.640957 -1.08635 + endloop + endfacet + facet normal -0.445418 -0.527981 -0.723076 + outer loop + vertex -0.697864 -0.597295 -1.15048 + vertex -0.750221 -0.640957 -1.08635 + vertex -0.75962 -0.585517 -1.12104 + endloop + endfacet + facet normal -0.513856 -0.515982 -0.685358 + outer loop + vertex -0.75962 -0.585517 -1.12104 + vertex -0.750221 -0.640957 -1.08635 + vertex -0.801098 -0.626995 -1.05871 + endloop + endfacet + facet normal -0.515981 -0.513857 -0.685358 + outer loop + vertex -0.75962 -0.585517 -1.12104 + vertex -0.801098 -0.626995 -1.05871 + vertex -0.81506 -0.576118 -1.08635 + endloop + endfacet + facet normal -0.581828 -0.505665 -0.637007 + outer loop + vertex -0.81506 -0.576118 -1.08635 + vertex -0.801098 -0.626995 -1.05871 + vertex -0.843516 -0.620402 -1.0252 + endloop + endfacet + facet normal -0.581623 -0.505852 -0.637047 + outer loop + vertex -0.81506 -0.576118 -1.08635 + vertex -0.843516 -0.620402 -1.0252 + vertex -0.863602 -0.572013 -1.04529 + endloop + endfacet + facet normal -0.0488431 -0.661295 -0.748534 + outer loop + vertex -0.327179 -0.703796 -1.17433 + vertex -0.327179 -0.764719 -1.12051 + vertex -0.404599 -0.762037 -1.11783 + endloop + endfacet + facet normal -0.0485714 -0.661499 -0.748372 + outer loop + vertex -0.327179 -0.703796 -1.17433 + vertex -0.404599 -0.762037 -1.11783 + vertex -0.404978 -0.701375 -1.17142 + endloop + endfacet + facet normal -0.13701 -0.656347 -0.741914 + outer loop + vertex -0.404978 -0.701375 -1.17142 + vertex -0.404599 -0.762037 -1.11783 + vertex -0.480736 -0.754577 -1.11037 + endloop + endfacet + facet normal -0.136576 -0.656699 -0.741683 + outer loop + vertex -0.404978 -0.701375 -1.17142 + vertex -0.480736 -0.754577 -1.11037 + vertex -0.481536 -0.694772 -1.16317 + endloop + endfacet + facet normal -0.218198 -0.647565 -0.730102 + outer loop + vertex -0.481536 -0.694772 -1.16317 + vertex -0.480736 -0.754577 -1.11037 + vertex -0.554309 -0.742924 -1.09871 + endloop + endfacet + facet normal -0.217806 -0.647908 -0.729915 + outer loop + vertex -0.481536 -0.694772 -1.16317 + vertex -0.554309 -0.742924 -1.09871 + vertex -0.555609 -0.684647 -1.15005 + endloop + endfacet + facet normal -0.295197 -0.635288 -0.71363 + outer loop + vertex -0.555609 -0.684647 -1.15005 + vertex -0.554309 -0.742924 -1.09871 + vertex -0.624035 -0.727665 -1.08345 + endloop + endfacet + facet normal -0.29487 -0.635595 -0.713492 + outer loop + vertex -0.555609 -0.684647 -1.15005 + vertex -0.624035 -0.727665 -1.08345 + vertex -0.625955 -0.67166 -1.13255 + endloop + endfacet + facet normal -0.371044 -0.619312 -0.691939 + outer loop + vertex -0.625955 -0.67166 -1.13255 + vertex -0.624035 -0.727665 -1.08345 + vertex -0.688631 -0.709386 -1.06518 + endloop + endfacet + facet normal -0.370577 -0.619782 -0.691768 + outer loop + vertex -0.625955 -0.67166 -1.13255 + vertex -0.688631 -0.709386 -1.06518 + vertex -0.691333 -0.656471 -1.11114 + endloop + endfacet + facet normal -0.439021 -0.601855 -0.667106 + outer loop + vertex -0.691333 -0.656471 -1.11114 + vertex -0.688631 -0.709386 -1.06518 + vertex -0.746116 -0.689499 -1.04529 + endloop + endfacet + facet normal -0.43935 -0.601506 -0.667205 + outer loop + vertex -0.691333 -0.656471 -1.11114 + vertex -0.746116 -0.689499 -1.04529 + vertex -0.750221 -0.640957 -1.08635 + endloop + endfacet + facet normal -0.505853 -0.581622 -0.637047 + outer loop + vertex -0.750221 -0.640957 -1.08635 + vertex -0.746116 -0.689499 -1.04529 + vertex -0.794505 -0.669413 -1.0252 + endloop + endfacet + facet normal -0.505665 -0.581829 -0.637007 + outer loop + vertex -0.750221 -0.640957 -1.08635 + vertex -0.794505 -0.669413 -1.0252 + vertex -0.801098 -0.626995 -1.05871 + endloop + endfacet + facet normal -0.568023 -0.562734 -0.600567 + outer loop + vertex -0.801098 -0.626995 -1.05871 + vertex -0.794505 -0.669413 -1.0252 + vertex -0.827436 -0.653333 -1.00912 + endloop + endfacet + facet normal -0.562734 -0.568022 -0.600567 + outer loop + vertex -0.801098 -0.626995 -1.05871 + vertex -0.827436 -0.653333 -1.00912 + vertex -0.843516 -0.620402 -1.0252 + endloop + endfacet + facet normal -0.0421465 0.0423597 -0.998213 + outer loop + vertex -0.327179 -0.153076 -1.35078 + vertex -0.412953 -0.153076 -1.34716 + vertex -0.412574 -0.0676809 -1.34355 + endloop + endfacet + facet normal -0.0423597 0.0421465 -0.998213 + outer loop + vertex -0.327179 -0.153076 -1.35078 + vertex -0.412574 -0.0676809 -1.34355 + vertex -0.327179 -0.0673011 -1.34716 + endloop + endfacet + facet normal -0.042432 0.127173 -0.990972 + outer loop + vertex -0.327179 -0.0673011 -1.34716 + vertex -0.412574 -0.0676809 -1.34355 + vertex -0.411624 0.0168308 -1.33275 + endloop + endfacet + facet normal -0.0429848 0.126626 -0.991019 + outer loop + vertex -0.327179 -0.0673011 -1.34716 + vertex -0.411624 0.0168308 -1.33275 + vertex -0.327179 0.0175861 -1.33632 + endloop + endfacet + facet normal -0.0431274 0.212842 -0.976134 + outer loop + vertex -0.327179 0.0175861 -1.33632 + vertex -0.411624 0.0168308 -1.33275 + vertex -0.410295 0.0995758 -1.31477 + endloop + endfacet + facet normal -0.0439261 0.212067 -0.976267 + outer loop + vertex -0.327179 0.0175861 -1.33632 + vertex -0.410295 0.0995758 -1.31477 + vertex -0.327179 0.100698 -1.31826 + endloop + endfacet + facet normal -0.0441314 0.299974 -0.952926 + outer loop + vertex -0.327179 0.100698 -1.31826 + vertex -0.410295 0.0995758 -1.31477 + vertex -0.408776 0.179671 -1.28962 + endloop + endfacet + facet normal -0.0450813 0.299079 -0.953163 + outer loop + vertex -0.327179 0.100698 -1.31826 + vertex -0.408776 0.179671 -1.28962 + vertex -0.327179 0.181148 -1.29302 + endloop + endfacet + facet normal -0.0453334 0.388908 -0.920161 + outer loop + vertex -0.327179 0.181148 -1.29302 + vertex -0.408776 0.179671 -1.28962 + vertex -0.407257 0.256233 -1.25734 + endloop + endfacet + facet normal -0.0463251 0.388007 -0.920491 + outer loop + vertex -0.327179 0.181148 -1.29302 + vertex -0.407257 0.256233 -1.25734 + vertex -0.327179 0.258047 -1.2606 + endloop + endfacet + facet normal -0.0465959 0.479506 -0.8763 + outer loop + vertex -0.327179 0.258047 -1.2606 + vertex -0.407257 0.256233 -1.25734 + vertex -0.405928 0.328378 -1.21793 + endloop + endfacet + facet normal -0.0475001 0.478724 -0.87668 + outer loop + vertex -0.327179 0.258047 -1.2606 + vertex -0.405928 0.328378 -1.21793 + vertex -0.327179 0.330508 -1.22104 + endloop + endfacet + facet normal -0.0477452 0.570947 -0.819597 + outer loop + vertex -0.327179 0.330508 -1.22104 + vertex -0.405928 0.328378 -1.21793 + vertex -0.404978 0.395223 -1.17142 + endloop + endfacet + facet normal -0.0484131 0.570404 -0.819936 + outer loop + vertex -0.327179 0.330508 -1.22104 + vertex -0.404978 0.395223 -1.17142 + vertex -0.327179 0.397644 -1.17433 + endloop + endfacet + facet normal -0.0485717 0.661499 -0.748372 + outer loop + vertex -0.327179 0.397644 -1.17433 + vertex -0.404978 0.395223 -1.17142 + vertex -0.404598 0.455885 -1.11783 + endloop + endfacet + facet normal -0.0488428 0.661295 -0.748534 + outer loop + vertex -0.327179 0.397644 -1.17433 + vertex -0.404598 0.455885 -1.11783 + vertex -0.327179 0.458568 -1.12051 + endloop + endfacet + facet normal -0.126626 0.0429848 -0.991019 + outer loop + vertex -0.412953 -0.153076 -1.34716 + vertex -0.497841 -0.153076 -1.33632 + vertex -0.497085 -0.0686303 -1.33275 + endloop + endfacet + facet normal -0.127173 0.042432 -0.990972 + outer loop + vertex -0.412953 -0.153076 -1.34716 + vertex -0.497085 -0.0686303 -1.33275 + vertex -0.412574 -0.0676809 -1.34355 + endloop + endfacet + facet normal -0.127188 0.128457 -0.983525 + outer loop + vertex -0.412574 -0.0676809 -1.34355 + vertex -0.497085 -0.0686303 -1.33275 + vertex -0.495186 0.0149314 -1.32208 + endloop + endfacet + facet normal -0.128457 0.127188 -0.983525 + outer loop + vertex -0.412574 -0.0676809 -1.34355 + vertex -0.495186 0.0149314 -1.32208 + vertex -0.411624 0.0168308 -1.33275 + endloop + endfacet + facet normal -0.128491 0.214212 -0.968299 + outer loop + vertex -0.411624 0.0168308 -1.33275 + vertex -0.495186 0.0149314 -1.32208 + vertex -0.492509 0.0967255 -1.30434 + endloop + endfacet + facet normal -0.130164 0.212567 -0.968438 + outer loop + vertex -0.411624 0.0168308 -1.33275 + vertex -0.492509 0.0967255 -1.30434 + vertex -0.410295 0.0995758 -1.31477 + endloop + endfacet + facet normal -0.13022 0.300882 -0.944729 + outer loop + vertex -0.410295 0.0995758 -1.31477 + vertex -0.492509 0.0967255 -1.30434 + vertex -0.489421 0.175868 -1.27956 + endloop + endfacet + facet normal -0.132012 0.299162 -0.945027 + outer loop + vertex -0.410295 0.0995758 -1.31477 + vertex -0.489421 0.175868 -1.27956 + vertex -0.408776 0.179671 -1.28962 + endloop + endfacet + facet normal -0.132093 0.388846 -0.911784 + outer loop + vertex -0.408776 0.179671 -1.28962 + vertex -0.489421 0.175868 -1.27956 + vertex -0.486289 0.251476 -1.24777 + endloop + endfacet + facet normal -0.133745 0.387305 -0.912199 + outer loop + vertex -0.408776 0.179671 -1.28962 + vertex -0.486289 0.251476 -1.24777 + vertex -0.407257 0.256233 -1.25734 + endloop + endfacet + facet normal -0.133865 0.47815 -0.868017 + outer loop + vertex -0.407257 0.256233 -1.25734 + vertex -0.486289 0.251476 -1.24777 + vertex -0.483524 0.322682 -1.20897 + endloop + endfacet + facet normal -0.135278 0.476878 -0.868497 + outer loop + vertex -0.407257 0.256233 -1.25734 + vertex -0.483524 0.322682 -1.20897 + vertex -0.405928 0.328378 -1.21793 + endloop + endfacet + facet normal -0.135423 0.567993 -0.811816 + outer loop + vertex -0.405928 0.328378 -1.21793 + vertex -0.483524 0.322682 -1.20897 + vertex -0.481535 0.38862 -1.16317 + endloop + endfacet + facet normal -0.136455 0.567105 -0.812264 + outer loop + vertex -0.405928 0.328378 -1.21793 + vertex -0.481535 0.38862 -1.16317 + vertex -0.404978 0.395223 -1.17142 + endloop + endfacet + facet normal -0.136576 0.656699 -0.741683 + outer loop + vertex -0.404978 0.395223 -1.17142 + vertex -0.481535 0.38862 -1.16317 + vertex -0.480736 0.448425 -1.11037 + endloop + endfacet + facet normal -0.13701 0.656347 -0.741914 + outer loop + vertex -0.404978 0.395223 -1.17142 + vertex -0.480736 0.448425 -1.11037 + vertex -0.404598 0.455885 -1.11783 + endloop + endfacet + facet normal -0.212067 0.0439247 -0.976268 + outer loop + vertex -0.497841 -0.153076 -1.33632 + vertex -0.580953 -0.153076 -1.31826 + vertex -0.57983 -0.0699595 -1.31477 + endloop + endfacet + facet normal -0.21284 0.0431274 -0.976135 + outer loop + vertex -0.497841 -0.153076 -1.33632 + vertex -0.57983 -0.0699595 -1.31477 + vertex -0.497085 -0.0686303 -1.33275 + endloop + endfacet + facet normal -0.212566 0.130166 -0.968438 + outer loop + vertex -0.497085 -0.0686303 -1.33275 + vertex -0.57983 -0.0699595 -1.31477 + vertex -0.57698 0.0122546 -1.30434 + endloop + endfacet + facet normal -0.214211 0.128491 -0.968299 + outer loop + vertex -0.497085 -0.0686303 -1.33275 + vertex -0.57698 0.0122546 -1.30434 + vertex -0.495186 0.0149314 -1.32208 + endloop + endfacet + facet normal -0.213702 0.215666 -0.952796 + outer loop + vertex -0.495186 0.0149314 -1.32208 + vertex -0.57698 0.0122546 -1.30434 + vertex -0.572919 0.0926641 -1.28705 + endloop + endfacet + facet normal -0.215666 0.213702 -0.952796 + outer loop + vertex -0.495186 0.0149314 -1.32208 + vertex -0.572919 0.0926641 -1.28705 + vertex -0.492509 0.0967255 -1.30434 + endloop + endfacet + facet normal -0.214972 0.301199 -0.929014 + outer loop + vertex -0.492509 0.0967255 -1.30434 + vertex -0.572919 0.0926641 -1.28705 + vertex -0.568163 0.170367 -1.26296 + endloop + endfacet + facet normal -0.216819 0.299389 -0.929169 + outer loop + vertex -0.492509 0.0967255 -1.30434 + vertex -0.568163 0.170367 -1.26296 + vertex -0.489421 0.175868 -1.27956 + endloop + endfacet + facet normal -0.216027 0.387327 -0.896276 + outer loop + vertex -0.489421 0.175868 -1.27956 + vertex -0.568163 0.170367 -1.26296 + vertex -0.56323 0.244461 -1.23213 + endloop + endfacet + facet normal -0.21745 0.385964 -0.896519 + outer loop + vertex -0.489421 0.175868 -1.27956 + vertex -0.56323 0.244461 -1.23213 + vertex -0.486289 0.251476 -1.24777 + endloop + endfacet + facet normal -0.216707 0.474515 -0.853155 + outer loop + vertex -0.486289 0.251476 -1.24777 + vertex -0.56323 0.244461 -1.23213 + vertex -0.558814 0.314114 -1.19451 + endloop + endfacet + facet normal -0.217822 0.473474 -0.853449 + outer loop + vertex -0.486289 0.251476 -1.24777 + vertex -0.558814 0.314114 -1.19451 + vertex -0.483524 0.322682 -1.20897 + endloop + endfacet + facet normal -0.217264 0.561937 -0.798137 + outer loop + vertex -0.483524 0.322682 -1.20897 + vertex -0.558814 0.314114 -1.19451 + vertex -0.555608 0.378495 -1.15005 + endloop + endfacet + facet normal -0.218085 0.561192 -0.798437 + outer loop + vertex -0.483524 0.322682 -1.20897 + vertex -0.555608 0.378495 -1.15005 + vertex -0.481535 0.38862 -1.16317 + endloop + endfacet + facet normal -0.217805 0.647908 -0.729915 + outer loop + vertex -0.481535 0.38862 -1.16317 + vertex -0.555608 0.378495 -1.15005 + vertex -0.554309 0.436772 -1.09871 + endloop + endfacet + facet normal -0.218198 0.647565 -0.730102 + outer loop + vertex -0.481535 0.38862 -1.16317 + vertex -0.554309 0.436772 -1.09871 + vertex -0.480736 0.448425 -1.11037 + endloop + endfacet + facet normal -0.299079 0.0450799 -0.953163 + outer loop + vertex -0.580953 -0.153076 -1.31826 + vertex -0.661402 -0.153076 -1.29302 + vertex -0.659925 -0.0714786 -1.28962 + endloop + endfacet + facet normal -0.299975 0.0441301 -0.952926 + outer loop + vertex -0.580953 -0.153076 -1.31826 + vertex -0.659925 -0.0714786 -1.28962 + vertex -0.57983 -0.0699595 -1.31477 + endloop + endfacet + facet normal -0.299162 0.132014 -0.945026 + outer loop + vertex -0.57983 -0.0699595 -1.31477 + vertex -0.659925 -0.0714786 -1.28962 + vertex -0.656123 0.00916679 -1.27956 + endloop + endfacet + facet normal -0.300883 0.130221 -0.944728 + outer loop + vertex -0.57983 -0.0699595 -1.31477 + vertex -0.656123 0.00916679 -1.27956 + vertex -0.57698 0.0122546 -1.30434 + endloop + endfacet + facet normal -0.29939 0.216817 -0.929169 + outer loop + vertex -0.57698 0.0122546 -1.30434 + vertex -0.656123 0.00916679 -1.27956 + vertex -0.650622 0.0879085 -1.26296 + endloop + endfacet + facet normal -0.301199 0.214972 -0.929014 + outer loop + vertex -0.57698 0.0122546 -1.30434 + vertex -0.650622 0.0879085 -1.26296 + vertex -0.572919 0.0926641 -1.28705 + endloop + endfacet + facet normal -0.299184 0.300574 -0.905618 + outer loop + vertex -0.572919 0.0926641 -1.28705 + vertex -0.650622 0.0879085 -1.26296 + vertex -0.644049 0.163795 -1.23994 + endloop + endfacet + facet normal -0.300574 0.299184 -0.905618 + outer loop + vertex -0.572919 0.0926641 -1.28705 + vertex -0.644049 0.163795 -1.23994 + vertex -0.568163 0.170367 -1.26296 + endloop + endfacet + facet normal -0.298268 0.384239 -0.873726 + outer loop + vertex -0.568163 0.170367 -1.26296 + vertex -0.644049 0.163795 -1.23994 + vertex -0.637033 0.235874 -1.21064 + endloop + endfacet + facet normal -0.299025 0.383497 -0.873793 + outer loop + vertex -0.568163 0.170367 -1.26296 + vertex -0.637033 0.235874 -1.21064 + vertex -0.56323 0.244461 -1.23213 + endloop + endfacet + facet normal -0.296773 0.468718 -0.832003 + outer loop + vertex -0.56323 0.244461 -1.23213 + vertex -0.637033 0.235874 -1.21064 + vertex -0.630645 0.30337 -1.1749 + endloop + endfacet + facet normal -0.297262 0.468247 -0.832094 + outer loop + vertex -0.56323 0.244461 -1.23213 + vertex -0.630645 0.30337 -1.1749 + vertex -0.558814 0.314114 -1.19451 + endloop + endfacet + facet normal -0.295446 0.553116 -0.778957 + outer loop + vertex -0.558814 0.314114 -1.19451 + vertex -0.630645 0.30337 -1.1749 + vertex -0.625955 0.365508 -1.13255 + endloop + endfacet + facet normal -0.295887 0.552697 -0.779088 + outer loop + vertex -0.558814 0.314114 -1.19451 + vertex -0.625955 0.365508 -1.13255 + vertex -0.555608 0.378495 -1.15005 + endloop + endfacet + facet normal -0.294869 0.635595 -0.713493 + outer loop + vertex -0.555608 0.378495 -1.15005 + vertex -0.625955 0.365508 -1.13255 + vertex -0.624034 0.421514 -1.08345 + endloop + endfacet + facet normal -0.295197 0.635288 -0.713631 + outer loop + vertex -0.555608 0.378495 -1.15005 + vertex -0.624034 0.421514 -1.08345 + vertex -0.554309 0.436772 -1.09871 + endloop + endfacet + facet normal -0.388007 0.0463254 -0.920492 + outer loop + vertex -0.661402 -0.153076 -1.29302 + vertex -0.738301 -0.153076 -1.2606 + vertex -0.736487 -0.0729977 -1.25734 + endloop + endfacet + facet normal -0.388909 0.0453322 -0.92016 + outer loop + vertex -0.661402 -0.153076 -1.29302 + vertex -0.736487 -0.0729977 -1.25734 + vertex -0.659925 -0.0714786 -1.28962 + endloop + endfacet + facet normal -0.387306 0.133745 -0.912199 + outer loop + vertex -0.659925 -0.0714786 -1.28962 + vertex -0.736487 -0.0729977 -1.25734 + vertex -0.73173 0.00603466 -1.24777 + endloop + endfacet + facet normal -0.388845 0.132095 -0.911784 + outer loop + vertex -0.659925 -0.0714786 -1.28962 + vertex -0.73173 0.00603466 -1.24777 + vertex -0.656123 0.00916679 -1.27956 + endloop + endfacet + facet normal -0.385963 0.21745 -0.89652 + outer loop + vertex -0.656123 0.00916679 -1.27956 + vertex -0.73173 0.00603466 -1.24777 + vertex -0.724715 0.0829754 -1.23213 + endloop + endfacet + facet normal -0.387327 0.216026 -0.896276 + outer loop + vertex -0.656123 0.00916679 -1.27956 + vertex -0.724715 0.0829754 -1.23213 + vertex -0.650622 0.0879085 -1.26296 + endloop + endfacet + facet normal -0.383498 0.299024 -0.873793 + outer loop + vertex -0.650622 0.0879085 -1.26296 + vertex -0.724715 0.0829754 -1.23213 + vertex -0.716128 0.156779 -1.21064 + endloop + endfacet + facet normal -0.384239 0.298268 -0.873726 + outer loop + vertex -0.650622 0.0879085 -1.26296 + vertex -0.716128 0.156779 -1.21064 + vertex -0.644049 0.163795 -1.23994 + endloop + endfacet + facet normal -0.379858 0.380046 -0.84337 + outer loop + vertex -0.644049 0.163795 -1.23994 + vertex -0.716128 0.156779 -1.21064 + vertex -0.706653 0.226399 -1.18354 + endloop + endfacet + facet normal -0.380045 0.379858 -0.84337 + outer loop + vertex -0.644049 0.163795 -1.23994 + vertex -0.706653 0.226399 -1.18354 + vertex -0.637033 0.235874 -1.21064 + endloop + endfacet + facet normal -0.375705 0.461367 -0.803732 + outer loop + vertex -0.637033 0.235874 -1.21064 + vertex -0.706653 0.226399 -1.18354 + vertex -0.697864 0.291143 -1.15048 + endloop + endfacet + facet normal -0.375838 0.461236 -0.803746 + outer loop + vertex -0.637033 0.235874 -1.21064 + vertex -0.697864 0.291143 -1.15048 + vertex -0.630645 0.30337 -1.1749 + endloop + endfacet + facet normal -0.372253 0.541996 -0.753437 + outer loop + vertex -0.630645 0.30337 -1.1749 + vertex -0.697864 0.291143 -1.15048 + vertex -0.691333 0.35032 -1.11114 + endloop + endfacet + facet normal -0.372642 0.54161 -0.753523 + outer loop + vertex -0.630645 0.30337 -1.1749 + vertex -0.691333 0.35032 -1.11114 + vertex -0.625955 0.365508 -1.13255 + endloop + endfacet + facet normal -0.370576 0.619783 -0.691767 + outer loop + vertex -0.625955 0.365508 -1.13255 + vertex -0.691333 0.35032 -1.11114 + vertex -0.688631 0.403235 -1.06518 + endloop + endfacet + facet normal -0.371044 0.619312 -0.691939 + outer loop + vertex -0.625955 0.365508 -1.13255 + vertex -0.688631 0.403235 -1.06518 + vertex -0.624034 0.421514 -1.08345 + endloop + endfacet + facet normal -0.478724 0.0475005 -0.876679 + outer loop + vertex -0.738301 -0.153076 -1.2606 + vertex -0.810763 -0.153076 -1.22104 + vertex -0.808632 -0.0743269 -1.21793 + endloop + endfacet + facet normal -0.479507 0.0465963 -0.8763 + outer loop + vertex -0.738301 -0.153076 -1.2606 + vertex -0.808632 -0.0743269 -1.21793 + vertex -0.736487 -0.0729977 -1.25734 + endloop + endfacet + facet normal -0.476878 0.135278 -0.868497 + outer loop + vertex -0.736487 -0.0729977 -1.25734 + vertex -0.808632 -0.0743269 -1.21793 + vertex -0.802936 0.00326908 -1.20897 + endloop + endfacet + facet normal -0.47815 0.133865 -0.868016 + outer loop + vertex -0.736487 -0.0729977 -1.25734 + vertex -0.802936 0.00326908 -1.20897 + vertex -0.73173 0.00603466 -1.24777 + endloop + endfacet + facet normal -0.473474 0.217822 -0.853449 + outer loop + vertex -0.73173 0.00603466 -1.24777 + vertex -0.802936 0.00326908 -1.20897 + vertex -0.794369 0.0785591 -1.19451 + endloop + endfacet + facet normal -0.474514 0.216708 -0.853155 + outer loop + vertex -0.73173 0.00603466 -1.24777 + vertex -0.794369 0.0785591 -1.19451 + vertex -0.724715 0.0829754 -1.23213 + endloop + endfacet + facet normal -0.468247 0.297262 -0.832094 + outer loop + vertex -0.724715 0.0829754 -1.23213 + vertex -0.794369 0.0785591 -1.19451 + vertex -0.783624 0.15039 -1.1749 + endloop + endfacet + facet normal -0.468718 0.296773 -0.832003 + outer loop + vertex -0.724715 0.0829754 -1.23213 + vertex -0.783624 0.15039 -1.1749 + vertex -0.716128 0.156779 -1.21064 + endloop + endfacet + facet normal -0.461237 0.375838 -0.803746 + outer loop + vertex -0.716128 0.156779 -1.21064 + vertex -0.783624 0.15039 -1.1749 + vertex -0.771398 0.21761 -1.15048 + endloop + endfacet + facet normal -0.461367 0.375706 -0.803732 + outer loop + vertex -0.716128 0.156779 -1.21064 + vertex -0.771398 0.21761 -1.15048 + vertex -0.706653 0.226399 -1.18354 + endloop + endfacet + facet normal -0.453469 0.452545 -0.767833 + outer loop + vertex -0.706653 0.226399 -1.18354 + vertex -0.771398 0.21761 -1.15048 + vertex -0.75962 0.279365 -1.12104 + endloop + endfacet + facet normal -0.452545 0.45347 -0.767833 + outer loop + vertex -0.706653 0.226399 -1.18354 + vertex -0.75962 0.279365 -1.12104 + vertex -0.697864 0.291143 -1.15048 + endloop + endfacet + facet normal -0.445418 0.527981 -0.723076 + outer loop + vertex -0.697864 0.291143 -1.15048 + vertex -0.75962 0.279365 -1.12104 + vertex -0.750221 0.334806 -1.08635 + endloop + endfacet + facet normal -0.44384 0.52958 -0.722877 + outer loop + vertex -0.697864 0.291143 -1.15048 + vertex -0.750221 0.334806 -1.08635 + vertex -0.691333 0.35032 -1.11114 + endloop + endfacet + facet normal -0.439351 0.601507 -0.667203 + outer loop + vertex -0.691333 0.35032 -1.11114 + vertex -0.750221 0.334806 -1.08635 + vertex -0.746116 0.383347 -1.04529 + endloop + endfacet + facet normal -0.439022 0.601856 -0.667105 + outer loop + vertex -0.691333 0.35032 -1.11114 + vertex -0.746116 0.383347 -1.04529 + vertex -0.688631 0.403235 -1.06518 + endloop + endfacet + facet normal -0.570404 0.0484138 -0.819936 + outer loop + vertex -0.810763 -0.153076 -1.22104 + vertex -0.877899 -0.153076 -1.17433 + vertex -0.875478 -0.0752763 -1.17142 + endloop + endfacet + facet normal -0.570947 0.0477457 -0.819597 + outer loop + vertex -0.810763 -0.153076 -1.22104 + vertex -0.875478 -0.0752763 -1.17142 + vertex -0.808632 -0.0743269 -1.21793 + endloop + endfacet + facet normal -0.567105 0.136454 -0.812264 + outer loop + vertex -0.808632 -0.0743269 -1.21793 + vertex -0.875478 -0.0752763 -1.17142 + vertex -0.868875 0.001281 -1.16317 + endloop + endfacet + facet normal -0.567993 0.135422 -0.811816 + outer loop + vertex -0.808632 -0.0743269 -1.21793 + vertex -0.868875 0.001281 -1.16317 + vertex -0.802936 0.00326908 -1.20897 + endloop + endfacet + facet normal -0.561192 0.218085 -0.798438 + outer loop + vertex -0.802936 0.00326908 -1.20897 + vertex -0.868875 0.001281 -1.16317 + vertex -0.85875 0.0753539 -1.15005 + endloop + endfacet + facet normal -0.561936 0.217264 -0.798138 + outer loop + vertex -0.802936 0.00326908 -1.20897 + vertex -0.85875 0.0753539 -1.15005 + vertex -0.794369 0.0785591 -1.19451 + endloop + endfacet + facet normal -0.552696 0.295887 -0.779088 + outer loop + vertex -0.794369 0.0785591 -1.19451 + vertex -0.85875 0.0753539 -1.15005 + vertex -0.845763 0.1457 -1.13255 + endloop + endfacet + facet normal -0.553116 0.295446 -0.778957 + outer loop + vertex -0.794369 0.0785591 -1.19451 + vertex -0.845763 0.1457 -1.13255 + vertex -0.783624 0.15039 -1.1749 + endloop + endfacet + facet normal -0.54161 0.372644 -0.753522 + outer loop + vertex -0.783624 0.15039 -1.1749 + vertex -0.845763 0.1457 -1.13255 + vertex -0.830574 0.211078 -1.11114 + endloop + endfacet + facet normal -0.541998 0.372253 -0.753436 + outer loop + vertex -0.783624 0.15039 -1.1749 + vertex -0.830574 0.211078 -1.11114 + vertex -0.771398 0.21761 -1.15048 + endloop + endfacet + facet normal -0.529582 0.443839 -0.722876 + outer loop + vertex -0.771398 0.21761 -1.15048 + vertex -0.830574 0.211078 -1.11114 + vertex -0.81506 0.269966 -1.08635 + endloop + endfacet + facet normal -0.527981 0.445418 -0.723076 + outer loop + vertex -0.771398 0.21761 -1.15048 + vertex -0.81506 0.269966 -1.08635 + vertex -0.75962 0.279365 -1.12104 + endloop + endfacet + facet normal -0.515981 0.513857 -0.685357 + outer loop + vertex -0.75962 0.279365 -1.12104 + vertex -0.81506 0.269966 -1.08635 + vertex -0.801098 0.320843 -1.05871 + endloop + endfacet + facet normal -0.513857 0.515981 -0.685357 + outer loop + vertex -0.75962 0.279365 -1.12104 + vertex -0.801098 0.320843 -1.05871 + vertex -0.750221 0.334806 -1.08635 + endloop + endfacet + facet normal -0.505666 0.581829 -0.637007 + outer loop + vertex -0.750221 0.334806 -1.08635 + vertex -0.801098 0.320843 -1.05871 + vertex -0.794505 0.363261 -1.0252 + endloop + endfacet + facet normal -0.505853 0.581623 -0.637047 + outer loop + vertex -0.750221 0.334806 -1.08635 + vertex -0.794505 0.363261 -1.0252 + vertex -0.746116 0.383347 -1.04529 + endloop + endfacet + facet normal -0.661295 0.0488436 -0.748534 + outer loop + vertex -0.877899 -0.153076 -1.17433 + vertex -0.938822 -0.153076 -1.12051 + vertex -0.93614 -0.0756561 -1.11783 + endloop + endfacet + facet normal -0.661499 0.0485724 -0.748372 + outer loop + vertex -0.877899 -0.153076 -1.17433 + vertex -0.93614 -0.0756561 -1.11783 + vertex -0.875478 -0.0752763 -1.17142 + endloop + endfacet + facet normal -0.656347 0.13701 -0.741914 + outer loop + vertex -0.875478 -0.0752763 -1.17142 + vertex -0.93614 -0.0756561 -1.11783 + vertex -0.92868 0.00048133 -1.11037 + endloop + endfacet + facet normal -0.6567 0.136575 -0.741682 + outer loop + vertex -0.875478 -0.0752763 -1.17142 + vertex -0.92868 0.00048133 -1.11037 + vertex -0.868875 0.001281 -1.16317 + endloop + endfacet + facet normal -0.647566 0.218198 -0.730101 + outer loop + vertex -0.868875 0.001281 -1.16317 + vertex -0.92868 0.00048133 -1.11037 + vertex -0.917027 0.0740541 -1.09871 + endloop + endfacet + facet normal -0.647909 0.217805 -0.729914 + outer loop + vertex -0.868875 0.001281 -1.16317 + vertex -0.917027 0.0740541 -1.09871 + vertex -0.85875 0.0753539 -1.15005 + endloop + endfacet + facet normal -0.635288 0.295196 -0.71363 + outer loop + vertex -0.85875 0.0753539 -1.15005 + vertex -0.917027 0.0740541 -1.09871 + vertex -0.901768 0.14378 -1.08345 + endloop + endfacet + facet normal -0.635594 0.29487 -0.713493 + outer loop + vertex -0.85875 0.0753539 -1.15005 + vertex -0.901768 0.14378 -1.08345 + vertex -0.845763 0.1457 -1.13255 + endloop + endfacet + facet normal -0.619311 0.371045 -0.691939 + outer loop + vertex -0.845763 0.1457 -1.13255 + vertex -0.901768 0.14378 -1.08345 + vertex -0.883489 0.208377 -1.06518 + endloop + endfacet + facet normal -0.619782 0.370578 -0.691768 + outer loop + vertex -0.845763 0.1457 -1.13255 + vertex -0.883489 0.208377 -1.06518 + vertex -0.830574 0.211078 -1.11114 + endloop + endfacet + facet normal -0.601855 0.439021 -0.667106 + outer loop + vertex -0.830574 0.211078 -1.11114 + vertex -0.883489 0.208377 -1.06518 + vertex -0.863601 0.265861 -1.04529 + endloop + endfacet + facet normal -0.601507 0.43935 -0.667204 + outer loop + vertex -0.830574 0.211078 -1.11114 + vertex -0.863601 0.265861 -1.04529 + vertex -0.81506 0.269966 -1.08635 + endloop + endfacet + facet normal -0.581622 0.505853 -0.637047 + outer loop + vertex -0.81506 0.269966 -1.08635 + vertex -0.863601 0.265861 -1.04529 + vertex -0.843516 0.31425 -1.0252 + endloop + endfacet + facet normal -0.581828 0.505666 -0.637007 + outer loop + vertex -0.81506 0.269966 -1.08635 + vertex -0.843516 0.31425 -1.0252 + vertex -0.801098 0.320843 -1.05871 + endloop + endfacet + facet normal -0.562734 0.568022 -0.600567 + outer loop + vertex -0.801098 0.320843 -1.05871 + vertex -0.843516 0.31425 -1.0252 + vertex -0.827436 0.347181 -1.00912 + endloop + endfacet + facet normal -0.568022 0.562734 -0.600567 + outer loop + vertex -0.801098 0.320843 -1.05871 + vertex -0.827436 0.347181 -1.00912 + vertex -0.794505 0.363261 -1.0252 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -0.327179 -0.153076 0.491135 + vertex -0.212433 -0.153076 0.491135 + vertex -0.212921 -0.0388184 0.491135 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -0.327179 -0.153076 0.491135 + vertex -0.212921 -0.0388184 0.491135 + vertex -0.327179 -0.03833 0.491135 + endloop + endfacet + facet normal 2.47702e-05 0.00579568 0.999983 + outer loop + vertex -0.327179 -0.03833 0.491135 + vertex -0.212921 -0.0388184 0.491135 + vertex -0.214243 0.0748374 0.490477 + endloop + endfacet + facet normal 4.95093e-05 0.005771 0.999983 + outer loop + vertex -0.327179 -0.03833 0.491135 + vertex -0.214243 0.0748374 0.490477 + vertex -0.327179 0.0758114 0.490477 + endloop + endfacet + facet normal 0.0001513 0.0175732 0.999846 + outer loop + vertex -0.327179 0.0758114 0.490477 + vertex -0.214243 0.0748374 0.490477 + vertex -0.216257 0.187289 0.488501 + endloop + endfacet + facet normal 0.000229429 0.0174955 0.999847 + outer loop + vertex -0.327179 0.0758114 0.490477 + vertex -0.216257 0.187289 0.488501 + vertex -0.327179 0.188743 0.488501 + endloop + endfacet + facet normal 0.000468257 0.0357077 0.999362 + outer loop + vertex -0.327179 0.188743 0.488501 + vertex -0.216257 0.187289 0.488501 + vertex -0.218819 0.297934 0.484548 + endloop + endfacet + facet normal 0.000632262 0.0355451 0.999368 + outer loop + vertex -0.327179 0.188743 0.488501 + vertex -0.218819 0.297934 0.484548 + vertex -0.327179 0.299862 0.484548 + endloop + endfacet + facet normal 0.00108103 0.0607746 0.998151 + outer loop + vertex -0.327179 0.299862 0.484548 + vertex -0.218819 0.297934 0.484548 + vertex -0.221787 0.406171 0.477961 + endloop + endfacet + facet normal 0.00137169 0.0604876 0.998168 + outer loop + vertex -0.327179 0.299862 0.484548 + vertex -0.221787 0.406171 0.477961 + vertex -0.327179 0.408561 0.477961 + endloop + endfacet + facet normal 0.00336275 0.148288 0.988939 + outer loop + vertex -0.327179 0.408561 0.477961 + vertex -0.221787 0.406171 0.477961 + vertex -0.224856 0.506665 0.462903 + endloop + endfacet + facet normal 0.00406646 0.14757 0.989043 + outer loop + vertex -0.327179 0.408561 0.477961 + vertex -0.224856 0.506665 0.462903 + vertex -0.327179 0.509484 0.462903 + endloop + endfacet + facet normal 0.00878155 0.318691 0.947818 + outer loop + vertex -0.327179 0.509484 0.462903 + vertex -0.224856 0.506665 0.462903 + vertex -0.227722 0.59408 0.433537 + endloop + endfacet + facet normal 0.010184 0.31721 0.948301 + outer loop + vertex -0.327179 0.509484 0.462903 + vertex -0.227722 0.59408 0.433537 + vertex -0.327179 0.597273 0.433537 + endloop + endfacet + facet normal 0.0187264 0.583289 0.812049 + outer loop + vertex -0.327179 0.597273 0.433537 + vertex -0.227722 0.59408 0.433537 + vertex -0.230081 0.663083 0.384027 + endloop + endfacet + facet normal 0.0208773 0.581201 0.813492 + outer loop + vertex -0.327179 0.597273 0.433537 + vertex -0.230081 0.663083 0.384027 + vertex -0.327179 0.666571 0.384027 + endloop + endfacet + facet normal 0.005771 4.95043e-05 0.999983 + outer loop + vertex -0.212433 -0.153076 0.491135 + vertex -0.0982914 -0.153076 0.490477 + vertex -0.0992653 -0.0401406 0.490477 + endloop + endfacet + facet normal 0.00579568 2.47656e-05 0.999983 + outer loop + vertex -0.212433 -0.153076 0.491135 + vertex -0.0992653 -0.0401406 0.490477 + vertex -0.212921 -0.0388184 0.491135 + endloop + endfacet + facet normal 0.00586488 0.0059822 0.999965 + outer loop + vertex -0.212921 -0.0388184 0.491135 + vertex -0.0992653 -0.0401406 0.490477 + vertex -0.101917 0.0721853 0.48982 + endloop + endfacet + facet normal 0.00598221 0.00586488 0.999965 + outer loop + vertex -0.212921 -0.0388184 0.491135 + vertex -0.101917 0.0721853 0.48982 + vertex -0.214243 0.0748374 0.490477 + endloop + endfacet + facet normal 0.00626669 0.01795 0.999819 + outer loop + vertex -0.214243 0.0748374 0.490477 + vertex -0.101917 0.0721853 0.48982 + vertex -0.105977 0.183292 0.487851 + endloop + endfacet + facet normal 0.00653025 0.017687 0.999822 + outer loop + vertex -0.214243 0.0748374 0.490477 + vertex -0.105977 0.183292 0.487851 + vertex -0.216257 0.187289 0.488501 + endloop + endfacet + facet normal 0.00720401 0.0363589 0.999313 + outer loop + vertex -0.216257 0.187289 0.488501 + vertex -0.105977 0.183292 0.487851 + vertex -0.111175 0.292569 0.483912 + endloop + endfacet + facet normal 0.00769079 0.0358736 0.999327 + outer loop + vertex -0.216257 0.187289 0.488501 + vertex -0.111175 0.292569 0.483912 + vertex -0.218819 0.297934 0.484548 + endloop + endfacet + facet normal 0.00897686 0.0618294 0.998046 + outer loop + vertex -0.218819 0.297934 0.484548 + vertex -0.111175 0.292569 0.483912 + vertex -0.117241 0.399408 0.477348 + endloop + endfacet + facet normal 0.00979858 0.0610099 0.998089 + outer loop + vertex -0.218819 0.297934 0.484548 + vertex -0.117241 0.399408 0.477348 + vertex -0.221787 0.406171 0.477961 + endloop + endfacet + facet normal 0.0155474 0.150748 0.98845 + outer loop + vertex -0.221787 0.406171 0.477961 + vertex -0.117241 0.399408 0.477348 + vertex -0.123532 0.49856 0.462326 + endloop + endfacet + facet normal 0.0175281 0.148689 0.988729 + outer loop + vertex -0.221787 0.406171 0.477961 + vertex -0.123532 0.49856 0.462326 + vertex -0.224856 0.506665 0.462903 + endloop + endfacet + facet normal 0.0312768 0.323651 0.945659 + outer loop + vertex -0.224856 0.506665 0.462903 + vertex -0.123532 0.49856 0.462326 + vertex -0.129404 0.58478 0.433011 + endloop + endfacet + facet normal 0.03527 0.319286 0.947002 + outer loop + vertex -0.224856 0.506665 0.462903 + vertex -0.129404 0.58478 0.433011 + vertex -0.227722 0.59408 0.433537 + endloop + endfacet + facet normal 0.0600783 0.589543 0.805499 + outer loop + vertex -0.227722 0.59408 0.433537 + vertex -0.129404 0.58478 0.433011 + vertex -0.134213 0.652819 0.383572 + endloop + endfacet + facet normal 0.0662835 0.583181 0.809633 + outer loop + vertex -0.227722 0.59408 0.433537 + vertex -0.134213 0.652819 0.383572 + vertex -0.230081 0.663083 0.384027 + endloop + endfacet + facet normal 0.0174955 0.000229415 0.999847 + outer loop + vertex -0.0982914 -0.153076 0.490477 + vertex 0.0146407 -0.153076 0.488501 + vertex 0.0131862 -0.0421541 0.488501 + endloop + endfacet + facet normal 0.0175732 0.000151285 0.999846 + outer loop + vertex -0.0982914 -0.153076 0.490477 + vertex 0.0131862 -0.0421541 0.488501 + vertex -0.0992653 -0.0401406 0.490477 + endloop + endfacet + facet normal 0.017687 0.00653024 0.999822 + outer loop + vertex -0.0992653 -0.0401406 0.490477 + vertex 0.0131862 -0.0421541 0.488501 + vertex 0.00918925 0.0681253 0.487851 + endloop + endfacet + facet normal 0.01795 0.00626667 0.999819 + outer loop + vertex -0.0992653 -0.0401406 0.490477 + vertex 0.00918925 0.0681253 0.487851 + vertex -0.101917 0.0721853 0.48982 + endloop + endfacet + facet normal 0.0184092 0.0189147 0.999652 + outer loop + vertex -0.101917 0.0721853 0.48982 + vertex 0.00918925 0.0681253 0.487851 + vertex 0.00301646 0.177119 0.485902 + endloop + endfacet + facet normal 0.0189147 0.0184092 0.999652 + outer loop + vertex -0.101917 0.0721853 0.48982 + vertex 0.00301646 0.177119 0.485902 + vertex -0.105977 0.183292 0.487851 + endloop + endfacet + facet normal 0.0200061 0.0378594 0.999083 + outer loop + vertex -0.105977 0.183292 0.487851 + vertex 0.00301646 0.177119 0.485902 + vertex -0.0049655 0.284184 0.482005 + endloop + endfacet + facet normal 0.0208644 0.0370009 0.999097 + outer loop + vertex -0.105977 0.183292 0.487851 + vertex -0.0049655 0.284184 0.482005 + vertex -0.111175 0.292569 0.483912 + endloop + endfacet + facet normal 0.0229775 0.0640897 0.99768 + outer loop + vertex -0.111175 0.292569 0.483912 + vertex -0.0049655 0.284184 0.482005 + vertex -0.01439 0.388678 0.47551 + endloop + endfacet + facet normal 0.0243776 0.0626848 0.997736 + outer loop + vertex -0.111175 0.292569 0.483912 + vertex -0.01439 0.388678 0.47551 + vertex -0.117241 0.399408 0.477348 + endloop + endfacet + facet normal 0.033872 0.155491 0.987256 + outer loop + vertex -0.117241 0.399408 0.477348 + vertex -0.01439 0.388678 0.47551 + vertex -0.0242053 0.485525 0.460593 + endloop + endfacet + facet normal 0.0371759 0.152004 0.98768 + outer loop + vertex -0.117241 0.399408 0.477348 + vertex -0.0242053 0.485525 0.460593 + vertex -0.123532 0.49856 0.462326 + endloop + endfacet + facet normal 0.0600837 0.332749 0.941099 + outer loop + vertex -0.123532 0.49856 0.462326 + vertex -0.0242053 0.485525 0.460593 + vertex -0.0333596 0.56965 0.431433 + endloop + endfacet + facet normal 0.0667363 0.325253 0.943269 + outer loop + vertex -0.123532 0.49856 0.462326 + vertex -0.0333596 0.56965 0.431433 + vertex -0.129404 0.58478 0.433011 + endloop + endfacet + facet normal 0.107582 0.600266 0.792532 + outer loop + vertex -0.129404 0.58478 0.433011 + vertex -0.0333596 0.56965 0.431433 + vertex -0.0408013 0.635977 0.382207 + endloop + endfacet + facet normal 0.117909 0.58917 0.79936 + outer loop + vertex -0.129404 0.58478 0.433011 + vertex -0.0408013 0.635977 0.382207 + vertex -0.134213 0.652819 0.383572 + endloop + endfacet + facet normal 0.0355451 0.00063222 0.999368 + outer loop + vertex 0.0146407 -0.153076 0.488501 + vertex 0.125759 -0.153076 0.484548 + vertex 0.123831 -0.0447162 0.484548 + endloop + endfacet + facet normal 0.0357077 0.000468228 0.999362 + outer loop + vertex 0.0146407 -0.153076 0.488501 + vertex 0.123831 -0.0447162 0.484548 + vertex 0.0131862 -0.0421541 0.488501 + endloop + endfacet + facet normal 0.0358736 0.00769077 0.999327 + outer loop + vertex 0.0131862 -0.0421541 0.488501 + vertex 0.123831 -0.0447162 0.484548 + vertex 0.118467 0.0629272 0.483912 + endloop + endfacet + facet normal 0.0363589 0.00720398 0.999313 + outer loop + vertex 0.0131862 -0.0421541 0.488501 + vertex 0.118467 0.0629272 0.483912 + vertex 0.00918925 0.0681253 0.487851 + endloop + endfacet + facet normal 0.0370009 0.0208644 0.999097 + outer loop + vertex 0.00918925 0.0681253 0.487851 + vertex 0.118467 0.0629272 0.483912 + vertex 0.110082 0.169137 0.482005 + endloop + endfacet + facet normal 0.0378594 0.0200061 0.999083 + outer loop + vertex 0.00918925 0.0681253 0.487851 + vertex 0.110082 0.169137 0.482005 + vertex 0.00301646 0.177119 0.485902 + endloop + endfacet + facet normal 0.0393816 0.0407609 0.998393 + outer loop + vertex 0.00301646 0.177119 0.485902 + vertex 0.110082 0.169137 0.482005 + vertex 0.0990938 0.273196 0.47819 + endloop + endfacet + facet normal 0.0407609 0.0393816 0.998393 + outer loop + vertex 0.00301646 0.177119 0.485902 + vertex 0.0990938 0.273196 0.47819 + vertex -0.0049655 0.284184 0.482005 + endloop + endfacet + facet normal 0.043755 0.0683228 0.996703 + outer loop + vertex -0.0049655 0.284184 0.482005 + vertex 0.0990938 0.273196 0.47819 + vertex 0.0859205 0.374388 0.471832 + endloop + endfacet + facet normal 0.0459616 0.0661052 0.996754 + outer loop + vertex -0.0049655 0.284184 0.482005 + vertex 0.0859205 0.374388 0.471832 + vertex -0.01439 0.388678 0.47551 + endloop + endfacet + facet normal 0.0594071 0.163581 0.98474 + outer loop + vertex -0.01439 0.388678 0.47551 + vertex 0.0859205 0.374388 0.471832 + vertex 0.0721254 0.467913 0.457128 + endloop + endfacet + facet normal 0.0643797 0.15828 0.985293 + outer loop + vertex -0.01439 0.388678 0.47551 + vertex 0.0721254 0.467913 0.457128 + vertex -0.0242053 0.485525 0.460593 + endloop + endfacet + facet normal 0.0970594 0.347372 0.932691 + outer loop + vertex -0.0242053 0.485525 0.460593 + vertex 0.0721254 0.467913 0.457128 + vertex 0.0592722 0.548969 0.428277 + endloop + endfacet + facet normal 0.106898 0.335998 0.935777 + outer loop + vertex -0.0242053 0.485525 0.460593 + vertex 0.0592722 0.548969 0.428277 + vertex -0.0333596 0.56965 0.431433 + endloop + endfacet + facet normal 0.163787 0.616038 0.7705 + outer loop + vertex -0.0333596 0.56965 0.431433 + vertex 0.0592722 0.548969 0.428277 + vertex 0.0489247 0.612757 0.379476 + endloop + endfacet + facet normal 0.17882 0.599222 0.780356 + outer loop + vertex -0.0333596 0.56965 0.431433 + vertex 0.0489247 0.612757 0.379476 + vertex -0.0408013 0.635977 0.382207 + endloop + endfacet + facet normal 0.0604875 0.00137163 0.998168 + outer loop + vertex 0.125759 -0.153076 0.484548 + vertex 0.234458 -0.153076 0.477961 + vertex 0.232068 -0.0476842 0.477961 + endloop + endfacet + facet normal 0.0607746 0.00108096 0.998151 + outer loop + vertex 0.125759 -0.153076 0.484548 + vertex 0.232068 -0.0476842 0.477961 + vertex 0.123831 -0.0447162 0.484548 + endloop + endfacet + facet normal 0.0610099 0.00979855 0.998089 + outer loop + vertex 0.123831 -0.0447162 0.484548 + vertex 0.232068 -0.0476842 0.477961 + vertex 0.225305 0.056861 0.477348 + endloop + endfacet + facet normal 0.0618295 0.00897682 0.998046 + outer loop + vertex 0.123831 -0.0447162 0.484548 + vertex 0.225305 0.056861 0.477348 + vertex 0.118467 0.0629272 0.483912 + endloop + endfacet + facet normal 0.0626848 0.0243778 0.997736 + outer loop + vertex 0.118467 0.0629272 0.483912 + vertex 0.225305 0.056861 0.477348 + vertex 0.214576 0.159712 0.475509 + endloop + endfacet + facet normal 0.06409 0.0229775 0.99768 + outer loop + vertex 0.118467 0.0629272 0.483912 + vertex 0.214576 0.159712 0.475509 + vertex 0.110082 0.169137 0.482005 + endloop + endfacet + facet normal 0.0661054 0.0459613 0.996754 + outer loop + vertex 0.110082 0.169137 0.482005 + vertex 0.214576 0.159712 0.475509 + vertex 0.200286 0.260023 0.471832 + endloop + endfacet + facet normal 0.0683229 0.0437549 0.996703 + outer loop + vertex 0.110082 0.169137 0.482005 + vertex 0.200286 0.260023 0.471832 + vertex 0.0990938 0.273196 0.47819 + endloop + endfacet + facet normal 0.0723704 0.0759175 0.994484 + outer loop + vertex 0.0990938 0.273196 0.47819 + vertex 0.200286 0.260023 0.471832 + vertex 0.182843 0.356946 0.465702 + endloop + endfacet + facet normal 0.0759175 0.0723704 0.994484 + outer loop + vertex 0.0990938 0.273196 0.47819 + vertex 0.182843 0.356946 0.465702 + vertex 0.0859205 0.374388 0.471832 + endloop + endfacet + facet normal 0.0938263 0.177072 0.979715 + outer loop + vertex 0.0859205 0.374388 0.471832 + vertex 0.182843 0.356946 0.465702 + vertex 0.164461 0.446078 0.451353 + endloop + endfacet + facet normal 0.1013 0.169076 0.980383 + outer loop + vertex 0.0859205 0.374388 0.471832 + vertex 0.164461 0.446078 0.451353 + vertex 0.0721254 0.467913 0.457128 + endloop + endfacet + facet normal 0.144927 0.370172 0.917589 + outer loop + vertex 0.0721254 0.467913 0.457128 + vertex 0.164461 0.446078 0.451353 + vertex 0.147354 0.523016 0.423016 + endloop + endfacet + facet normal 0.159171 0.353361 0.921846 + outer loop + vertex 0.0721254 0.467913 0.457128 + vertex 0.147354 0.523016 0.423016 + vertex 0.0592722 0.548969 0.428277 + endloop + endfacet + facet normal 0.231775 0.637734 0.734558 + outer loop + vertex 0.0592722 0.548969 0.428277 + vertex 0.147354 0.523016 0.423016 + vertex 0.133737 0.583359 0.374925 + endloop + endfacet + facet normal 0.252783 0.613421 0.748208 + outer loop + vertex 0.0592722 0.548969 0.428277 + vertex 0.133737 0.583359 0.374925 + vertex 0.0489247 0.612757 0.379476 + endloop + endfacet + facet normal 0.14757 0.00406633 0.989043 + outer loop + vertex 0.234458 -0.153076 0.477961 + vertex 0.335381 -0.153076 0.462903 + vertex 0.332562 -0.0507537 0.462903 + endloop + endfacet + facet normal 0.148288 0.0033626 0.988939 + outer loop + vertex 0.234458 -0.153076 0.477961 + vertex 0.332562 -0.0507537 0.462903 + vertex 0.232068 -0.0476842 0.477961 + endloop + endfacet + facet normal 0.148689 0.017528 0.988729 + outer loop + vertex 0.232068 -0.0476842 0.477961 + vertex 0.332562 -0.0507537 0.462903 + vertex 0.324458 0.0505703 0.462326 + endloop + endfacet + facet normal 0.150748 0.0155473 0.98845 + outer loop + vertex 0.232068 -0.0476842 0.477961 + vertex 0.324458 0.0505703 0.462326 + vertex 0.225305 0.056861 0.477348 + endloop + endfacet + facet normal 0.152004 0.0371758 0.987681 + outer loop + vertex 0.225305 0.056861 0.477348 + vertex 0.324458 0.0505703 0.462326 + vertex 0.311423 0.149897 0.460593 + endloop + endfacet + facet normal 0.15549 0.0338721 0.987257 + outer loop + vertex 0.225305 0.056861 0.477348 + vertex 0.311423 0.149897 0.460593 + vertex 0.214576 0.159712 0.475509 + endloop + endfacet + facet normal 0.15828 0.0643795 0.985293 + outer loop + vertex 0.214576 0.159712 0.475509 + vertex 0.311423 0.149897 0.460593 + vertex 0.29381 0.246228 0.457128 + endloop + endfacet + facet normal 0.163581 0.0594066 0.98474 + outer loop + vertex 0.214576 0.159712 0.475509 + vertex 0.29381 0.246228 0.457128 + vertex 0.200286 0.260023 0.471832 + endloop + endfacet + facet normal 0.169076 0.1013 0.980383 + outer loop + vertex 0.200286 0.260023 0.471832 + vertex 0.29381 0.246228 0.457128 + vertex 0.271975 0.338564 0.451353 + endloop + endfacet + facet normal 0.177073 0.0938263 0.979715 + outer loop + vertex 0.200286 0.260023 0.471832 + vertex 0.271975 0.338564 0.451353 + vertex 0.182843 0.356946 0.465702 + endloop + endfacet + facet normal 0.197294 0.208973 0.957813 + outer loop + vertex 0.182843 0.356946 0.465702 + vertex 0.271975 0.338564 0.451353 + vertex 0.248628 0.422731 0.437799 + endloop + endfacet + facet normal 0.208973 0.197293 0.957813 + outer loop + vertex 0.182843 0.356946 0.465702 + vertex 0.248628 0.422731 0.437799 + vertex 0.164461 0.446078 0.451353 + endloop + endfacet + facet normal 0.253977 0.405924 0.877907 + outer loop + vertex 0.164461 0.446078 0.451353 + vertex 0.248628 0.422731 0.437799 + vertex 0.226481 0.494555 0.410996 + endloop + endfacet + facet normal 0.272522 0.3853 0.881632 + outer loop + vertex 0.164461 0.446078 0.451353 + vertex 0.226481 0.494555 0.410996 + vertex 0.147354 0.523016 0.423016 + endloop + endfacet + facet normal 0.338867 0.658151 0.672314 + outer loop + vertex 0.147354 0.523016 0.423016 + vertex 0.226481 0.494555 0.410996 + vertex 0.209403 0.550084 0.365244 + endloop + endfacet + facet normal 0.364544 0.62929 0.686369 + outer loop + vertex 0.147354 0.523016 0.423016 + vertex 0.209403 0.550084 0.365244 + vertex 0.133737 0.583359 0.374925 + endloop + endfacet + facet normal 0.31721 0.0101837 0.948301 + outer loop + vertex 0.335381 -0.153076 0.462903 + vertex 0.423171 -0.153076 0.433537 + vertex 0.419978 -0.0536202 0.433537 + endloop + endfacet + facet normal 0.318691 0.00878127 0.947818 + outer loop + vertex 0.335381 -0.153076 0.462903 + vertex 0.419978 -0.0536202 0.433537 + vertex 0.332562 -0.0507537 0.462903 + endloop + endfacet + facet normal 0.319286 0.0352698 0.947002 + outer loop + vertex 0.332562 -0.0507537 0.462903 + vertex 0.419978 -0.0536202 0.433537 + vertex 0.410677 0.0446986 0.433011 + endloop + endfacet + facet normal 0.323651 0.0312766 0.945659 + outer loop + vertex 0.332562 -0.0507537 0.462903 + vertex 0.410677 0.0446986 0.433011 + vertex 0.324458 0.0505703 0.462326 + endloop + endfacet + facet normal 0.325253 0.0667361 0.943269 + outer loop + vertex 0.324458 0.0505703 0.462326 + vertex 0.410677 0.0446986 0.433011 + vertex 0.395547 0.140743 0.431433 + endloop + endfacet + facet normal 0.332749 0.0600834 0.941099 + outer loop + vertex 0.324458 0.0505703 0.462326 + vertex 0.395547 0.140743 0.431433 + vertex 0.311423 0.149897 0.460593 + endloop + endfacet + facet normal 0.335998 0.106898 0.935777 + outer loop + vertex 0.311423 0.149897 0.460593 + vertex 0.395547 0.140743 0.431433 + vertex 0.374867 0.233374 0.428277 + endloop + endfacet + facet normal 0.347372 0.0970592 0.932691 + outer loop + vertex 0.311423 0.149897 0.460593 + vertex 0.374867 0.233374 0.428277 + vertex 0.29381 0.246228 0.457128 + endloop + endfacet + facet normal 0.353362 0.159171 0.921846 + outer loop + vertex 0.29381 0.246228 0.457128 + vertex 0.374867 0.233374 0.428277 + vertex 0.348914 0.321457 0.423016 + endloop + endfacet + facet normal 0.370172 0.144927 0.917589 + outer loop + vertex 0.29381 0.246228 0.457128 + vertex 0.348914 0.321457 0.423016 + vertex 0.271975 0.338564 0.451353 + endloop + endfacet + facet normal 0.3853 0.272522 0.881632 + outer loop + vertex 0.271975 0.338564 0.451353 + vertex 0.348914 0.321457 0.423016 + vertex 0.320453 0.400583 0.410996 + endloop + endfacet + facet normal 0.405925 0.253977 0.877907 + outer loop + vertex 0.271975 0.338564 0.451353 + vertex 0.320453 0.400583 0.410996 + vertex 0.248628 0.422731 0.437799 + endloop + endfacet + facet normal 0.431539 0.461335 0.775206 + outer loop + vertex 0.248628 0.422731 0.437799 + vertex 0.320453 0.400583 0.410996 + vertex 0.292246 0.466349 0.38756 + endloop + endfacet + facet normal 0.461336 0.431539 0.775206 + outer loop + vertex 0.248628 0.422731 0.437799 + vertex 0.292246 0.466349 0.38756 + vertex 0.226481 0.494555 0.410996 + endloop + endfacet + facet normal 0.487016 0.66907 0.561392 + outer loop + vertex 0.226481 0.494555 0.410996 + vertex 0.292246 0.466349 0.38756 + vertex 0.271692 0.515237 0.347126 + endloop + endfacet + facet normal 0.520668 0.632558 0.573389 + outer loop + vertex 0.226481 0.494555 0.410996 + vertex 0.271692 0.515237 0.347126 + vertex 0.209403 0.550084 0.365244 + endloop + endfacet + facet normal 0.581201 0.0208771 0.813492 + outer loop + vertex 0.423171 -0.153076 0.433537 + vertex 0.492468 -0.153076 0.384027 + vertex 0.48898 -0.0559793 0.384027 + endloop + endfacet + facet normal 0.583289 0.0187259 0.812049 + outer loop + vertex 0.423171 -0.153076 0.433537 + vertex 0.48898 -0.0559793 0.384027 + vertex 0.419978 -0.0536202 0.433537 + endloop + endfacet + facet normal 0.583182 0.0662831 0.809633 + outer loop + vertex 0.419978 -0.0536202 0.433537 + vertex 0.48898 -0.0559793 0.384027 + vertex 0.478716 0.0398893 0.383572 + endloop + endfacet + facet normal 0.589544 0.060078 0.805499 + outer loop + vertex 0.419978 -0.0536202 0.433537 + vertex 0.478716 0.0398893 0.383572 + vertex 0.410677 0.0446986 0.433011 + endloop + endfacet + facet normal 0.58917 0.117908 0.79936 + outer loop + vertex 0.410677 0.0446986 0.433011 + vertex 0.478716 0.0398893 0.383572 + vertex 0.461875 0.133301 0.382207 + endloop + endfacet + facet normal 0.600266 0.107582 0.792532 + outer loop + vertex 0.410677 0.0446986 0.433011 + vertex 0.461875 0.133301 0.382207 + vertex 0.395547 0.140743 0.431433 + endloop + endfacet + facet normal 0.599223 0.17882 0.780356 + outer loop + vertex 0.395547 0.140743 0.431433 + vertex 0.461875 0.133301 0.382207 + vertex 0.438655 0.223027 0.379476 + endloop + endfacet + facet normal 0.616038 0.163787 0.770501 + outer loop + vertex 0.395547 0.140743 0.431433 + vertex 0.438655 0.223027 0.379476 + vertex 0.374867 0.233374 0.428277 + endloop + endfacet + facet normal 0.61342 0.252783 0.748209 + outer loop + vertex 0.374867 0.233374 0.428277 + vertex 0.438655 0.223027 0.379476 + vertex 0.409257 0.307839 0.374925 + endloop + endfacet + facet normal 0.637734 0.231774 0.734559 + outer loop + vertex 0.374867 0.233374 0.428277 + vertex 0.409257 0.307839 0.374925 + vertex 0.348914 0.321457 0.423016 + endloop + endfacet + facet normal 0.62929 0.364543 0.686369 + outer loop + vertex 0.348914 0.321457 0.423016 + vertex 0.409257 0.307839 0.374925 + vertex 0.375982 0.383505 0.365244 + endloop + endfacet + facet normal 0.658151 0.338867 0.672314 + outer loop + vertex 0.348914 0.321457 0.423016 + vertex 0.375982 0.383505 0.365244 + vertex 0.320453 0.400583 0.410996 + endloop + endfacet + facet normal 0.632558 0.520668 0.573389 + outer loop + vertex 0.320453 0.400583 0.410996 + vertex 0.375982 0.383505 0.365244 + vertex 0.341135 0.445794 0.347126 + endloop + endfacet + facet normal 0.66907 0.487016 0.561392 + outer loop + vertex 0.320453 0.400583 0.410996 + vertex 0.341135 0.445794 0.347126 + vertex 0.292246 0.466349 0.38756 + endloop + endfacet + facet normal 0.623135 0.661619 0.417089 + outer loop + vertex 0.292246 0.466349 0.38756 + vertex 0.341135 0.445794 0.347126 + vertex 0.312305 0.486408 0.325773 + endloop + endfacet + facet normal 0.661619 0.623134 0.417089 + outer loop + vertex 0.292246 0.466349 0.38756 + vertex 0.312305 0.486408 0.325773 + vertex 0.271692 0.515237 0.347126 + endloop + endfacet + facet normal 0 -0 1 + outer loop + vertex -0.327179 -0.153076 0.491135 + vertex -0.327179 -0.03833 0.491135 + vertex -0.441437 -0.0388183 0.491135 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -0.327179 -0.153076 0.491135 + vertex -0.441437 -0.0388183 0.491135 + vertex -0.441925 -0.153076 0.491135 + endloop + endfacet + facet normal -0.00579568 2.47709e-05 0.999983 + outer loop + vertex -0.441925 -0.153076 0.491135 + vertex -0.441437 -0.0388183 0.491135 + vertex -0.555092 -0.0401404 0.490477 + endloop + endfacet + facet normal -0.005771 4.95104e-05 0.999983 + outer loop + vertex -0.441925 -0.153076 0.491135 + vertex -0.555092 -0.0401404 0.490477 + vertex -0.556066 -0.153076 0.490477 + endloop + endfacet + facet normal -0.0175732 0.000151303 0.999846 + outer loop + vertex -0.556066 -0.153076 0.490477 + vertex -0.555092 -0.0401404 0.490477 + vertex -0.667544 -0.0421538 0.488501 + endloop + endfacet + facet normal -0.0174955 0.000229429 0.999847 + outer loop + vertex -0.556066 -0.153076 0.490477 + vertex -0.667544 -0.0421538 0.488501 + vertex -0.668998 -0.153076 0.488501 + endloop + endfacet + facet normal -0.0357077 0.000468257 0.999362 + outer loop + vertex -0.668998 -0.153076 0.488501 + vertex -0.667544 -0.0421538 0.488501 + vertex -0.778189 -0.0447158 0.484548 + endloop + endfacet + facet normal -0.0355451 0.000632272 0.999368 + outer loop + vertex -0.668998 -0.153076 0.488501 + vertex -0.778189 -0.0447158 0.484548 + vertex -0.780117 -0.153076 0.484548 + endloop + endfacet + facet normal -0.0607746 0.00108105 0.998151 + outer loop + vertex -0.780117 -0.153076 0.484548 + vertex -0.778189 -0.0447158 0.484548 + vertex -0.886426 -0.0476838 0.477961 + endloop + endfacet + facet normal -0.0604876 0.00137167 0.998168 + outer loop + vertex -0.780117 -0.153076 0.484548 + vertex -0.886426 -0.0476838 0.477961 + vertex -0.888816 -0.153076 0.477961 + endloop + endfacet + facet normal -0.148288 0.00336271 0.988939 + outer loop + vertex -0.888816 -0.153076 0.477961 + vertex -0.886426 -0.0476838 0.477961 + vertex -0.98692 -0.0507532 0.462903 + endloop + endfacet + facet normal -0.14757 0.00406654 0.989043 + outer loop + vertex -0.888816 -0.153076 0.477961 + vertex -0.98692 -0.0507532 0.462903 + vertex -0.989739 -0.153076 0.462903 + endloop + endfacet + facet normal -0.318691 0.00878174 0.947818 + outer loop + vertex -0.989739 -0.153076 0.462903 + vertex -0.98692 -0.0507532 0.462903 + vertex -1.07434 -0.0536197 0.433537 + endloop + endfacet + facet normal -0.31721 0.0101843 0.948301 + outer loop + vertex -0.989739 -0.153076 0.462903 + vertex -1.07434 -0.0536197 0.433537 + vertex -1.07753 -0.153076 0.433537 + endloop + endfacet + facet normal -0.583289 0.0187271 0.812049 + outer loop + vertex -1.07753 -0.153076 0.433537 + vertex -1.07434 -0.0536197 0.433537 + vertex -1.14334 -0.0559787 0.384027 + endloop + endfacet + facet normal -0.581201 0.020878 0.813492 + outer loop + vertex -1.07753 -0.153076 0.433537 + vertex -1.14334 -0.0559787 0.384027 + vertex -1.14683 -0.153076 0.384027 + endloop + endfacet + facet normal -4.95047e-05 0.005771 0.999983 + outer loop + vertex -0.327179 -0.03833 0.491135 + vertex -0.327179 0.0758114 0.490477 + vertex -0.440114 0.0748374 0.490477 + endloop + endfacet + facet normal -2.47658e-05 0.00579568 0.999983 + outer loop + vertex -0.327179 -0.03833 0.491135 + vertex -0.440114 0.0748374 0.490477 + vertex -0.441437 -0.0388183 0.491135 + endloop + endfacet + facet normal -0.0059822 0.00586489 0.999965 + outer loop + vertex -0.441437 -0.0388183 0.491135 + vertex -0.440114 0.0748374 0.490477 + vertex -0.55244 0.0721855 0.48982 + endloop + endfacet + facet normal -0.00586488 0.00598221 0.999965 + outer loop + vertex -0.441437 -0.0388183 0.491135 + vertex -0.55244 0.0721855 0.48982 + vertex -0.555092 -0.0401404 0.490477 + endloop + endfacet + facet normal -0.01795 0.00626669 0.999819 + outer loop + vertex -0.555092 -0.0401404 0.490477 + vertex -0.55244 0.0721855 0.48982 + vertex -0.663547 0.0681255 0.487851 + endloop + endfacet + facet normal -0.017687 0.00653025 0.999822 + outer loop + vertex -0.555092 -0.0401404 0.490477 + vertex -0.663547 0.0681255 0.487851 + vertex -0.667544 -0.0421538 0.488501 + endloop + endfacet + facet normal -0.0363589 0.007204 0.999313 + outer loop + vertex -0.667544 -0.0421538 0.488501 + vertex -0.663547 0.0681255 0.487851 + vertex -0.772824 0.0629275 0.483912 + endloop + endfacet + facet normal -0.0358736 0.00769078 0.999327 + outer loop + vertex -0.667544 -0.0421538 0.488501 + vertex -0.772824 0.0629275 0.483912 + vertex -0.778189 -0.0447158 0.484548 + endloop + endfacet + facet normal -0.0618294 0.00897682 0.998046 + outer loop + vertex -0.778189 -0.0447158 0.484548 + vertex -0.772824 0.0629275 0.483912 + vertex -0.879663 0.0568614 0.477348 + endloop + endfacet + facet normal -0.0610099 0.00979856 0.998089 + outer loop + vertex -0.778189 -0.0447158 0.484548 + vertex -0.879663 0.0568614 0.477348 + vertex -0.886426 -0.0476838 0.477961 + endloop + endfacet + facet normal -0.150748 0.0155473 0.98845 + outer loop + vertex -0.886426 -0.0476838 0.477961 + vertex -0.879663 0.0568614 0.477348 + vertex -0.978815 0.0505708 0.462326 + endloop + endfacet + facet normal -0.148689 0.0175281 0.988729 + outer loop + vertex -0.886426 -0.0476838 0.477961 + vertex -0.978815 0.0505708 0.462326 + vertex -0.98692 -0.0507532 0.462903 + endloop + endfacet + facet normal -0.323651 0.0312767 0.945659 + outer loop + vertex -0.98692 -0.0507532 0.462903 + vertex -0.978815 0.0505708 0.462326 + vertex -1.06503 0.0446991 0.433011 + endloop + endfacet + facet normal -0.319286 0.03527 0.947002 + outer loop + vertex -0.98692 -0.0507532 0.462903 + vertex -1.06503 0.0446991 0.433011 + vertex -1.07434 -0.0536197 0.433537 + endloop + endfacet + facet normal -0.589544 0.0600784 0.805499 + outer loop + vertex -1.07434 -0.0536197 0.433537 + vertex -1.06503 0.0446991 0.433011 + vertex -1.13307 0.0398899 0.383572 + endloop + endfacet + facet normal -0.583182 0.0662835 0.809633 + outer loop + vertex -1.07434 -0.0536197 0.433537 + vertex -1.13307 0.0398899 0.383572 + vertex -1.14334 -0.0559787 0.384027 + endloop + endfacet + facet normal -0.000229415 0.0174955 0.999847 + outer loop + vertex -0.327179 0.0758114 0.490477 + vertex -0.327179 0.188743 0.488501 + vertex -0.438101 0.187289 0.488501 + endloop + endfacet + facet normal -0.000151286 0.0175732 0.999846 + outer loop + vertex -0.327179 0.0758114 0.490477 + vertex -0.438101 0.187289 0.488501 + vertex -0.440114 0.0748374 0.490477 + endloop + endfacet + facet normal -0.00653024 0.017687 0.999822 + outer loop + vertex -0.440114 0.0748374 0.490477 + vertex -0.438101 0.187289 0.488501 + vertex -0.54838 0.183292 0.487851 + endloop + endfacet + facet normal -0.00626667 0.01795 0.999819 + outer loop + vertex -0.440114 0.0748374 0.490477 + vertex -0.54838 0.183292 0.487851 + vertex -0.55244 0.0721855 0.48982 + endloop + endfacet + facet normal -0.0189147 0.0184092 0.999652 + outer loop + vertex -0.55244 0.0721855 0.48982 + vertex -0.54838 0.183292 0.487851 + vertex -0.657374 0.177119 0.485902 + endloop + endfacet + facet normal -0.0184092 0.0189147 0.999652 + outer loop + vertex -0.55244 0.0721855 0.48982 + vertex -0.657374 0.177119 0.485902 + vertex -0.663547 0.0681255 0.487851 + endloop + endfacet + facet normal -0.0378594 0.0200061 0.999083 + outer loop + vertex -0.663547 0.0681255 0.487851 + vertex -0.657374 0.177119 0.485902 + vertex -0.764439 0.169137 0.482005 + endloop + endfacet + facet normal -0.0370009 0.0208644 0.999097 + outer loop + vertex -0.663547 0.0681255 0.487851 + vertex -0.764439 0.169137 0.482005 + vertex -0.772824 0.0629275 0.483912 + endloop + endfacet + facet normal -0.0640897 0.0229775 0.99768 + outer loop + vertex -0.772824 0.0629275 0.483912 + vertex -0.764439 0.169137 0.482005 + vertex -0.868933 0.159713 0.47551 + endloop + endfacet + facet normal -0.0626848 0.0243776 0.997736 + outer loop + vertex -0.772824 0.0629275 0.483912 + vertex -0.868933 0.159713 0.47551 + vertex -0.879663 0.0568614 0.477348 + endloop + endfacet + facet normal -0.155491 0.033872 0.987256 + outer loop + vertex -0.879663 0.0568614 0.477348 + vertex -0.868933 0.159713 0.47551 + vertex -0.96578 0.149897 0.460593 + endloop + endfacet + facet normal -0.152004 0.037176 0.987681 + outer loop + vertex -0.879663 0.0568614 0.477348 + vertex -0.96578 0.149897 0.460593 + vertex -0.978815 0.0505708 0.462326 + endloop + endfacet + facet normal -0.332749 0.0600839 0.941099 + outer loop + vertex -0.978815 0.0505708 0.462326 + vertex -0.96578 0.149897 0.460593 + vertex -1.0499 0.140743 0.431433 + endloop + endfacet + facet normal -0.325254 0.0667366 0.943269 + outer loop + vertex -0.978815 0.0505708 0.462326 + vertex -1.0499 0.140743 0.431433 + vertex -1.06503 0.0446991 0.433011 + endloop + endfacet + facet normal -0.600265 0.107582 0.792532 + outer loop + vertex -1.06503 0.0446991 0.433011 + vertex -1.0499 0.140743 0.431433 + vertex -1.11623 0.133301 0.382207 + endloop + endfacet + facet normal -0.58917 0.117908 0.79936 + outer loop + vertex -1.06503 0.0446991 0.433011 + vertex -1.11623 0.133301 0.382207 + vertex -1.13307 0.0398899 0.383572 + endloop + endfacet + facet normal -0.000632223 0.0355451 0.999368 + outer loop + vertex -0.327179 0.188743 0.488501 + vertex -0.327179 0.299862 0.484548 + vertex -0.435539 0.297934 0.484548 + endloop + endfacet + facet normal -0.000468228 0.0357077 0.999362 + outer loop + vertex -0.327179 0.188743 0.488501 + vertex -0.435539 0.297934 0.484548 + vertex -0.438101 0.187289 0.488501 + endloop + endfacet + facet normal -0.00769078 0.0358736 0.999327 + outer loop + vertex -0.438101 0.187289 0.488501 + vertex -0.435539 0.297934 0.484548 + vertex -0.543182 0.292569 0.483912 + endloop + endfacet + facet normal -0.00720399 0.0363589 0.999313 + outer loop + vertex -0.438101 0.187289 0.488501 + vertex -0.543182 0.292569 0.483912 + vertex -0.54838 0.183292 0.487851 + endloop + endfacet + facet normal -0.0208644 0.0370009 0.999097 + outer loop + vertex -0.54838 0.183292 0.487851 + vertex -0.543182 0.292569 0.483912 + vertex -0.649392 0.284184 0.482005 + endloop + endfacet + facet normal -0.0200061 0.0378594 0.999083 + outer loop + vertex -0.54838 0.183292 0.487851 + vertex -0.649392 0.284184 0.482005 + vertex -0.657374 0.177119 0.485902 + endloop + endfacet + facet normal -0.0407609 0.0393816 0.998393 + outer loop + vertex -0.657374 0.177119 0.485902 + vertex -0.649392 0.284184 0.482005 + vertex -0.753451 0.273197 0.47819 + endloop + endfacet + facet normal -0.0393816 0.040761 0.998393 + outer loop + vertex -0.657374 0.177119 0.485902 + vertex -0.753451 0.273197 0.47819 + vertex -0.764439 0.169137 0.482005 + endloop + endfacet + facet normal -0.0683228 0.043755 0.996703 + outer loop + vertex -0.764439 0.169137 0.482005 + vertex -0.753451 0.273197 0.47819 + vertex -0.854643 0.260023 0.471832 + endloop + endfacet + facet normal -0.0661052 0.0459616 0.996754 + outer loop + vertex -0.764439 0.169137 0.482005 + vertex -0.854643 0.260023 0.471832 + vertex -0.868933 0.159713 0.47551 + endloop + endfacet + facet normal -0.163581 0.059407 0.98474 + outer loop + vertex -0.868933 0.159713 0.47551 + vertex -0.854643 0.260023 0.471832 + vertex -0.948168 0.246228 0.457128 + endloop + endfacet + facet normal -0.15828 0.0643797 0.985293 + outer loop + vertex -0.868933 0.159713 0.47551 + vertex -0.948168 0.246228 0.457128 + vertex -0.96578 0.149897 0.460593 + endloop + endfacet + facet normal -0.347372 0.0970594 0.932691 + outer loop + vertex -0.96578 0.149897 0.460593 + vertex -0.948168 0.246228 0.457128 + vertex -1.02922 0.233375 0.428277 + endloop + endfacet + facet normal -0.335998 0.106898 0.935777 + outer loop + vertex -0.96578 0.149897 0.460593 + vertex -1.02922 0.233375 0.428277 + vertex -1.0499 0.140743 0.431433 + endloop + endfacet + facet normal -0.616038 0.163786 0.770501 + outer loop + vertex -1.0499 0.140743 0.431433 + vertex -1.02922 0.233375 0.428277 + vertex -1.09301 0.223027 0.379476 + endloop + endfacet + facet normal -0.599222 0.17882 0.780357 + outer loop + vertex -1.0499 0.140743 0.431433 + vertex -1.09301 0.223027 0.379476 + vertex -1.11623 0.133301 0.382207 + endloop + endfacet + facet normal -0.00137164 0.0604876 0.998168 + outer loop + vertex -0.327179 0.299862 0.484548 + vertex -0.327179 0.408561 0.477961 + vertex -0.432571 0.406171 0.477961 + endloop + endfacet + facet normal -0.00108097 0.0607747 0.998151 + outer loop + vertex -0.327179 0.299862 0.484548 + vertex -0.432571 0.406171 0.477961 + vertex -0.435539 0.297934 0.484548 + endloop + endfacet + facet normal -0.00979853 0.0610099 0.998089 + outer loop + vertex -0.435539 0.297934 0.484548 + vertex -0.432571 0.406171 0.477961 + vertex -0.537116 0.399408 0.477348 + endloop + endfacet + facet normal -0.00897684 0.0618294 0.998046 + outer loop + vertex -0.435539 0.297934 0.484548 + vertex -0.537116 0.399408 0.477348 + vertex -0.543182 0.292569 0.483912 + endloop + endfacet + facet normal -0.0243778 0.0626848 0.997736 + outer loop + vertex -0.543182 0.292569 0.483912 + vertex -0.537116 0.399408 0.477348 + vertex -0.639967 0.388678 0.475509 + endloop + endfacet + facet normal -0.0229775 0.06409 0.99768 + outer loop + vertex -0.543182 0.292569 0.483912 + vertex -0.639967 0.388678 0.475509 + vertex -0.649392 0.284184 0.482005 + endloop + endfacet + facet normal -0.0459613 0.0661054 0.996754 + outer loop + vertex -0.649392 0.284184 0.482005 + vertex -0.639967 0.388678 0.475509 + vertex -0.740278 0.374389 0.471832 + endloop + endfacet + facet normal -0.0437549 0.0683228 0.996703 + outer loop + vertex -0.649392 0.284184 0.482005 + vertex -0.740278 0.374389 0.471832 + vertex -0.753451 0.273197 0.47819 + endloop + endfacet + facet normal -0.0759175 0.0723704 0.994484 + outer loop + vertex -0.753451 0.273197 0.47819 + vertex -0.740278 0.374389 0.471832 + vertex -0.837201 0.356946 0.465702 + endloop + endfacet + facet normal -0.0723703 0.0759175 0.994484 + outer loop + vertex -0.753451 0.273197 0.47819 + vertex -0.837201 0.356946 0.465702 + vertex -0.854643 0.260023 0.471832 + endloop + endfacet + facet normal -0.177072 0.0938264 0.979715 + outer loop + vertex -0.854643 0.260023 0.471832 + vertex -0.837201 0.356946 0.465702 + vertex -0.926333 0.338564 0.451353 + endloop + endfacet + facet normal -0.169076 0.101299 0.980383 + outer loop + vertex -0.854643 0.260023 0.471832 + vertex -0.926333 0.338564 0.451353 + vertex -0.948168 0.246228 0.457128 + endloop + endfacet + facet normal -0.370172 0.144926 0.917589 + outer loop + vertex -0.948168 0.246228 0.457128 + vertex -0.926333 0.338564 0.451353 + vertex -1.00327 0.321457 0.423016 + endloop + endfacet + facet normal -0.353361 0.159171 0.921846 + outer loop + vertex -0.948168 0.246228 0.457128 + vertex -1.00327 0.321457 0.423016 + vertex -1.02922 0.233375 0.428277 + endloop + endfacet + facet normal -0.637735 0.231775 0.734558 + outer loop + vertex -1.02922 0.233375 0.428277 + vertex -1.00327 0.321457 0.423016 + vertex -1.06361 0.307839 0.374925 + endloop + endfacet + facet normal -0.61342 0.252784 0.748208 + outer loop + vertex -1.02922 0.233375 0.428277 + vertex -1.06361 0.307839 0.374925 + vertex -1.09301 0.223027 0.379476 + endloop + endfacet + facet normal -0.00406628 0.14757 0.989043 + outer loop + vertex -0.327179 0.408561 0.477961 + vertex -0.327179 0.509484 0.462903 + vertex -0.429501 0.506665 0.462903 + endloop + endfacet + facet normal -0.00336262 0.148288 0.988939 + outer loop + vertex -0.327179 0.408561 0.477961 + vertex -0.429501 0.506665 0.462903 + vertex -0.432571 0.406171 0.477961 + endloop + endfacet + facet normal -0.017528 0.148689 0.988729 + outer loop + vertex -0.432571 0.406171 0.477961 + vertex -0.429501 0.506665 0.462903 + vertex -0.530825 0.498561 0.462326 + endloop + endfacet + facet normal -0.0155472 0.150748 0.98845 + outer loop + vertex -0.432571 0.406171 0.477961 + vertex -0.530825 0.498561 0.462326 + vertex -0.537116 0.399408 0.477348 + endloop + endfacet + facet normal -0.0371758 0.152004 0.98768 + outer loop + vertex -0.537116 0.399408 0.477348 + vertex -0.530825 0.498561 0.462326 + vertex -0.630152 0.485525 0.460593 + endloop + endfacet + facet normal -0.0338722 0.15549 0.987256 + outer loop + vertex -0.537116 0.399408 0.477348 + vertex -0.630152 0.485525 0.460593 + vertex -0.639967 0.388678 0.475509 + endloop + endfacet + facet normal -0.0643795 0.15828 0.985293 + outer loop + vertex -0.639967 0.388678 0.475509 + vertex -0.630152 0.485525 0.460593 + vertex -0.726483 0.467913 0.457128 + endloop + endfacet + facet normal -0.0594067 0.163581 0.98474 + outer loop + vertex -0.639967 0.388678 0.475509 + vertex -0.726483 0.467913 0.457128 + vertex -0.740278 0.374389 0.471832 + endloop + endfacet + facet normal -0.1013 0.169076 0.980383 + outer loop + vertex -0.740278 0.374389 0.471832 + vertex -0.726483 0.467913 0.457128 + vertex -0.818819 0.446078 0.451353 + endloop + endfacet + facet normal -0.0938263 0.177073 0.979715 + outer loop + vertex -0.740278 0.374389 0.471832 + vertex -0.818819 0.446078 0.451353 + vertex -0.837201 0.356946 0.465702 + endloop + endfacet + facet normal -0.208973 0.197294 0.957813 + outer loop + vertex -0.837201 0.356946 0.465702 + vertex -0.818819 0.446078 0.451353 + vertex -0.902986 0.422731 0.437799 + endloop + endfacet + facet normal -0.197293 0.208974 0.957813 + outer loop + vertex -0.837201 0.356946 0.465702 + vertex -0.902986 0.422731 0.437799 + vertex -0.926333 0.338564 0.451353 + endloop + endfacet + facet normal -0.405924 0.253977 0.877907 + outer loop + vertex -0.926333 0.338564 0.451353 + vertex -0.902986 0.422731 0.437799 + vertex -0.97481 0.400584 0.410996 + endloop + endfacet + facet normal -0.385299 0.272523 0.881632 + outer loop + vertex -0.926333 0.338564 0.451353 + vertex -0.97481 0.400584 0.410996 + vertex -1.00327 0.321457 0.423016 + endloop + endfacet + facet normal -0.658151 0.338868 0.672314 + outer loop + vertex -1.00327 0.321457 0.423016 + vertex -0.97481 0.400584 0.410996 + vertex -1.03034 0.383506 0.365244 + endloop + endfacet + facet normal -0.629291 0.364543 0.686368 + outer loop + vertex -1.00327 0.321457 0.423016 + vertex -1.03034 0.383506 0.365244 + vertex -1.06361 0.307839 0.374925 + endloop + endfacet + facet normal -0.0101838 0.31721 0.948301 + outer loop + vertex -0.327179 0.509484 0.462903 + vertex -0.327179 0.597273 0.433537 + vertex -0.426635 0.59408 0.433537 + endloop + endfacet + facet normal -0.00878118 0.318691 0.947818 + outer loop + vertex -0.327179 0.509484 0.462903 + vertex -0.426635 0.59408 0.433537 + vertex -0.429501 0.506665 0.462903 + endloop + endfacet + facet normal -0.0352697 0.319286 0.947002 + outer loop + vertex -0.429501 0.506665 0.462903 + vertex -0.426635 0.59408 0.433537 + vertex -0.524954 0.58478 0.433011 + endloop + endfacet + facet normal -0.0312766 0.323651 0.945659 + outer loop + vertex -0.429501 0.506665 0.462903 + vertex -0.524954 0.58478 0.433011 + vertex -0.530825 0.498561 0.462326 + endloop + endfacet + facet normal -0.0667361 0.325253 0.943269 + outer loop + vertex -0.530825 0.498561 0.462326 + vertex -0.524954 0.58478 0.433011 + vertex -0.620998 0.56965 0.431433 + endloop + endfacet + facet normal -0.0600834 0.332749 0.941099 + outer loop + vertex -0.530825 0.498561 0.462326 + vertex -0.620998 0.56965 0.431433 + vertex -0.630152 0.485525 0.460593 + endloop + endfacet + facet normal -0.106898 0.335998 0.935777 + outer loop + vertex -0.630152 0.485525 0.460593 + vertex -0.620998 0.56965 0.431433 + vertex -0.713629 0.54897 0.428277 + endloop + endfacet + facet normal -0.0970592 0.347373 0.932691 + outer loop + vertex -0.630152 0.485525 0.460593 + vertex -0.713629 0.54897 0.428277 + vertex -0.726483 0.467913 0.457128 + endloop + endfacet + facet normal -0.159171 0.353362 0.921846 + outer loop + vertex -0.726483 0.467913 0.457128 + vertex -0.713629 0.54897 0.428277 + vertex -0.801712 0.523017 0.423016 + endloop + endfacet + facet normal -0.144927 0.370172 0.917589 + outer loop + vertex -0.726483 0.467913 0.457128 + vertex -0.801712 0.523017 0.423016 + vertex -0.818819 0.446078 0.451353 + endloop + endfacet + facet normal -0.272522 0.3853 0.881633 + outer loop + vertex -0.818819 0.446078 0.451353 + vertex -0.801712 0.523017 0.423016 + vertex -0.880839 0.494555 0.410996 + endloop + endfacet + facet normal -0.253977 0.405924 0.877907 + outer loop + vertex -0.818819 0.446078 0.451353 + vertex -0.880839 0.494555 0.410996 + vertex -0.902986 0.422731 0.437799 + endloop + endfacet + facet normal -0.461335 0.431538 0.775206 + outer loop + vertex -0.902986 0.422731 0.437799 + vertex -0.880839 0.494555 0.410996 + vertex -0.946604 0.466349 0.38756 + endloop + endfacet + facet normal -0.431539 0.461335 0.775206 + outer loop + vertex -0.902986 0.422731 0.437799 + vertex -0.946604 0.466349 0.38756 + vertex -0.97481 0.400584 0.410996 + endloop + endfacet + facet normal -0.66907 0.487016 0.561392 + outer loop + vertex -0.97481 0.400584 0.410996 + vertex -0.946604 0.466349 0.38756 + vertex -0.995492 0.445794 0.347126 + endloop + endfacet + facet normal -0.632558 0.520668 0.573389 + outer loop + vertex -0.97481 0.400584 0.410996 + vertex -0.995492 0.445794 0.347126 + vertex -1.03034 0.383506 0.365244 + endloop + endfacet + facet normal -0.020877 0.581201 0.813492 + outer loop + vertex -0.327179 0.597273 0.433537 + vertex -0.327179 0.666571 0.384027 + vertex -0.424276 0.663083 0.384027 + endloop + endfacet + facet normal -0.018726 0.583289 0.812049 + outer loop + vertex -0.327179 0.597273 0.433537 + vertex -0.424276 0.663083 0.384027 + vertex -0.426635 0.59408 0.433537 + endloop + endfacet + facet normal -0.0662831 0.583182 0.809633 + outer loop + vertex -0.426635 0.59408 0.433537 + vertex -0.424276 0.663083 0.384027 + vertex -0.520144 0.652819 0.383572 + endloop + endfacet + facet normal -0.0600776 0.589544 0.805499 + outer loop + vertex -0.426635 0.59408 0.433537 + vertex -0.520144 0.652819 0.383572 + vertex -0.524954 0.58478 0.433011 + endloop + endfacet + facet normal -0.117908 0.589171 0.79936 + outer loop + vertex -0.524954 0.58478 0.433011 + vertex -0.520144 0.652819 0.383572 + vertex -0.613556 0.635977 0.382207 + endloop + endfacet + facet normal -0.107582 0.600266 0.792532 + outer loop + vertex -0.524954 0.58478 0.433011 + vertex -0.613556 0.635977 0.382207 + vertex -0.620998 0.56965 0.431433 + endloop + endfacet + facet normal -0.17882 0.599223 0.780356 + outer loop + vertex -0.620998 0.56965 0.431433 + vertex -0.613556 0.635977 0.382207 + vertex -0.703282 0.612758 0.379476 + endloop + endfacet + facet normal -0.163787 0.616038 0.7705 + outer loop + vertex -0.620998 0.56965 0.431433 + vertex -0.703282 0.612758 0.379476 + vertex -0.713629 0.54897 0.428277 + endloop + endfacet + facet normal -0.252783 0.61342 0.748209 + outer loop + vertex -0.713629 0.54897 0.428277 + vertex -0.703282 0.612758 0.379476 + vertex -0.788094 0.583359 0.374925 + endloop + endfacet + facet normal -0.231774 0.637735 0.734558 + outer loop + vertex -0.713629 0.54897 0.428277 + vertex -0.788094 0.583359 0.374925 + vertex -0.801712 0.523017 0.423016 + endloop + endfacet + facet normal -0.364543 0.629291 0.686368 + outer loop + vertex -0.801712 0.523017 0.423016 + vertex -0.788094 0.583359 0.374925 + vertex -0.86376 0.550085 0.365244 + endloop + endfacet + facet normal -0.338867 0.658152 0.672314 + outer loop + vertex -0.801712 0.523017 0.423016 + vertex -0.86376 0.550085 0.365244 + vertex -0.880839 0.494555 0.410996 + endloop + endfacet + facet normal -0.520668 0.632559 0.573389 + outer loop + vertex -0.880839 0.494555 0.410996 + vertex -0.86376 0.550085 0.365244 + vertex -0.926049 0.515237 0.347126 + endloop + endfacet + facet normal -0.487016 0.669071 0.561391 + outer loop + vertex -0.880839 0.494555 0.410996 + vertex -0.926049 0.515237 0.347126 + vertex -0.946604 0.466349 0.38756 + endloop + endfacet + facet normal -0.661618 0.623136 0.417089 + outer loop + vertex -0.946604 0.466349 0.38756 + vertex -0.926049 0.515237 0.347126 + vertex -0.966663 0.486408 0.325773 + endloop + endfacet + facet normal -0.623134 0.661619 0.417089 + outer loop + vertex -0.946604 0.466349 0.38756 + vertex -0.966663 0.486408 0.325773 + vertex -0.995492 0.445794 0.347126 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -0.327179 -0.153076 0.491135 + vertex -0.441925 -0.153076 0.491135 + vertex -0.441437 -0.267334 0.491135 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -0.327179 -0.153076 0.491135 + vertex -0.441437 -0.267334 0.491135 + vertex -0.327179 -0.267822 0.491135 + endloop + endfacet + facet normal -2.47694e-05 -0.00579569 0.999983 + outer loop + vertex -0.327179 -0.267822 0.491135 + vertex -0.441437 -0.267334 0.491135 + vertex -0.440115 -0.38099 0.490477 + endloop + endfacet + facet normal -4.95089e-05 -0.005771 0.999983 + outer loop + vertex -0.327179 -0.267822 0.491135 + vertex -0.440115 -0.38099 0.490477 + vertex -0.327179 -0.381964 0.490477 + endloop + endfacet + facet normal -0.000151299 -0.0175732 0.999846 + outer loop + vertex -0.327179 -0.381964 0.490477 + vertex -0.440115 -0.38099 0.490477 + vertex -0.438101 -0.493441 0.488501 + endloop + endfacet + facet normal -0.000229438 -0.0174955 0.999847 + outer loop + vertex -0.327179 -0.381964 0.490477 + vertex -0.438101 -0.493441 0.488501 + vertex -0.327179 -0.494896 0.488501 + endloop + endfacet + facet normal -0.000468276 -0.0357077 0.999362 + outer loop + vertex -0.327179 -0.494896 0.488501 + vertex -0.438101 -0.493441 0.488501 + vertex -0.435539 -0.604086 0.484548 + endloop + endfacet + facet normal -0.000632252 -0.0355451 0.999368 + outer loop + vertex -0.327179 -0.494896 0.488501 + vertex -0.435539 -0.604086 0.484548 + vertex -0.327179 -0.606014 0.484548 + endloop + endfacet + facet normal -0.00108102 -0.0607747 0.998151 + outer loop + vertex -0.327179 -0.606014 0.484548 + vertex -0.435539 -0.604086 0.484548 + vertex -0.432571 -0.712323 0.477961 + endloop + endfacet + facet normal -0.0013717 -0.0604875 0.998168 + outer loop + vertex -0.327179 -0.606014 0.484548 + vertex -0.432571 -0.712323 0.477961 + vertex -0.327179 -0.714713 0.477961 + endloop + endfacet + facet normal -0.00336279 -0.148288 0.988939 + outer loop + vertex -0.327179 -0.714713 0.477961 + vertex -0.432571 -0.712323 0.477961 + vertex -0.429502 -0.812817 0.462903 + endloop + endfacet + facet normal -0.00406646 -0.14757 0.989043 + outer loop + vertex -0.327179 -0.714713 0.477961 + vertex -0.429502 -0.812817 0.462903 + vertex -0.327179 -0.815636 0.462903 + endloop + endfacet + facet normal -0.00878156 -0.318691 0.947818 + outer loop + vertex -0.327179 -0.815636 0.462903 + vertex -0.429502 -0.812817 0.462903 + vertex -0.426635 -0.900232 0.433537 + endloop + endfacet + facet normal -0.010184 -0.31721 0.948301 + outer loop + vertex -0.327179 -0.815636 0.462903 + vertex -0.426635 -0.900232 0.433537 + vertex -0.327179 -0.903425 0.433537 + endloop + endfacet + facet normal -0.0187264 -0.583289 0.812049 + outer loop + vertex -0.327179 -0.903425 0.433537 + vertex -0.426635 -0.900232 0.433537 + vertex -0.424276 -0.969235 0.384027 + endloop + endfacet + facet normal -0.0208777 -0.581201 0.813492 + outer loop + vertex -0.327179 -0.903425 0.433537 + vertex -0.424276 -0.969235 0.384027 + vertex -0.327179 -0.972723 0.384027 + endloop + endfacet + facet normal -0.005771 -4.95074e-05 0.999983 + outer loop + vertex -0.441925 -0.153076 0.491135 + vertex -0.556066 -0.153076 0.490477 + vertex -0.555092 -0.266012 0.490477 + endloop + endfacet + facet normal -0.00579569 -2.47664e-05 0.999983 + outer loop + vertex -0.441925 -0.153076 0.491135 + vertex -0.555092 -0.266012 0.490477 + vertex -0.441437 -0.267334 0.491135 + endloop + endfacet + facet normal -0.00586489 -0.0059822 0.999965 + outer loop + vertex -0.441437 -0.267334 0.491135 + vertex -0.555092 -0.266012 0.490477 + vertex -0.552441 -0.378338 0.48982 + endloop + endfacet + facet normal -0.00598221 -0.00586488 0.999965 + outer loop + vertex -0.441437 -0.267334 0.491135 + vertex -0.552441 -0.378338 0.48982 + vertex -0.440115 -0.38099 0.490477 + endloop + endfacet + facet normal -0.00626669 -0.01795 0.999819 + outer loop + vertex -0.440115 -0.38099 0.490477 + vertex -0.552441 -0.378338 0.48982 + vertex -0.548381 -0.489444 0.487851 + endloop + endfacet + facet normal -0.00653024 -0.017687 0.999822 + outer loop + vertex -0.440115 -0.38099 0.490477 + vertex -0.548381 -0.489444 0.487851 + vertex -0.438101 -0.493441 0.488501 + endloop + endfacet + facet normal -0.007204 -0.0363589 0.999313 + outer loop + vertex -0.438101 -0.493441 0.488501 + vertex -0.548381 -0.489444 0.487851 + vertex -0.543183 -0.598721 0.483912 + endloop + endfacet + facet normal -0.00769081 -0.0358736 0.999327 + outer loop + vertex -0.438101 -0.493441 0.488501 + vertex -0.543183 -0.598721 0.483912 + vertex -0.435539 -0.604086 0.484548 + endloop + endfacet + facet normal -0.00897689 -0.0618295 0.998046 + outer loop + vertex -0.435539 -0.604086 0.484548 + vertex -0.543183 -0.598721 0.483912 + vertex -0.537117 -0.70556 0.477348 + endloop + endfacet + facet normal -0.0097986 -0.0610099 0.998089 + outer loop + vertex -0.435539 -0.604086 0.484548 + vertex -0.537117 -0.70556 0.477348 + vertex -0.432571 -0.712323 0.477961 + endloop + endfacet + facet normal -0.0155474 -0.150748 0.98845 + outer loop + vertex -0.432571 -0.712323 0.477961 + vertex -0.537117 -0.70556 0.477348 + vertex -0.530826 -0.804713 0.462326 + endloop + endfacet + facet normal -0.0175282 -0.148689 0.988729 + outer loop + vertex -0.432571 -0.712323 0.477961 + vertex -0.530826 -0.804713 0.462326 + vertex -0.429502 -0.812817 0.462903 + endloop + endfacet + facet normal -0.0312769 -0.323651 0.945659 + outer loop + vertex -0.429502 -0.812817 0.462903 + vertex -0.530826 -0.804713 0.462326 + vertex -0.524954 -0.890932 0.433011 + endloop + endfacet + facet normal -0.03527 -0.319286 0.947002 + outer loop + vertex -0.429502 -0.812817 0.462903 + vertex -0.524954 -0.890932 0.433011 + vertex -0.426635 -0.900232 0.433537 + endloop + endfacet + facet normal -0.0600783 -0.589544 0.805499 + outer loop + vertex -0.426635 -0.900232 0.433537 + vertex -0.524954 -0.890932 0.433011 + vertex -0.520145 -0.958971 0.383572 + endloop + endfacet + facet normal -0.0662835 -0.583182 0.809633 + outer loop + vertex -0.426635 -0.900232 0.433537 + vertex -0.520145 -0.958971 0.383572 + vertex -0.424276 -0.969235 0.384027 + endloop + endfacet + facet normal -0.0174955 -0.00022941 0.999847 + outer loop + vertex -0.556066 -0.153076 0.490477 + vertex -0.668998 -0.153076 0.488501 + vertex -0.667544 -0.263998 0.488501 + endloop + endfacet + facet normal -0.0175732 -0.000151294 0.999846 + outer loop + vertex -0.556066 -0.153076 0.490477 + vertex -0.667544 -0.263998 0.488501 + vertex -0.555092 -0.266012 0.490477 + endloop + endfacet + facet normal -0.017687 -0.00653024 0.999822 + outer loop + vertex -0.555092 -0.266012 0.490477 + vertex -0.667544 -0.263998 0.488501 + vertex -0.663547 -0.374277 0.487851 + endloop + endfacet + facet normal -0.01795 -0.00626667 0.999819 + outer loop + vertex -0.555092 -0.266012 0.490477 + vertex -0.663547 -0.374277 0.487851 + vertex -0.552441 -0.378338 0.48982 + endloop + endfacet + facet normal -0.0184092 -0.0189147 0.999652 + outer loop + vertex -0.552441 -0.378338 0.48982 + vertex -0.663547 -0.374277 0.487851 + vertex -0.657374 -0.483271 0.485902 + endloop + endfacet + facet normal -0.0189147 -0.0184092 0.999652 + outer loop + vertex -0.552441 -0.378338 0.48982 + vertex -0.657374 -0.483271 0.485902 + vertex -0.548381 -0.489444 0.487851 + endloop + endfacet + facet normal -0.0200061 -0.0378594 0.999083 + outer loop + vertex -0.548381 -0.489444 0.487851 + vertex -0.657374 -0.483271 0.485902 + vertex -0.649392 -0.590336 0.482005 + endloop + endfacet + facet normal -0.0208644 -0.0370009 0.999097 + outer loop + vertex -0.548381 -0.489444 0.487851 + vertex -0.649392 -0.590336 0.482005 + vertex -0.543183 -0.598721 0.483912 + endloop + endfacet + facet normal -0.0229775 -0.0640898 0.99768 + outer loop + vertex -0.543183 -0.598721 0.483912 + vertex -0.649392 -0.590336 0.482005 + vertex -0.639968 -0.69483 0.47551 + endloop + endfacet + facet normal -0.0243776 -0.0626848 0.997736 + outer loop + vertex -0.543183 -0.598721 0.483912 + vertex -0.639968 -0.69483 0.47551 + vertex -0.537117 -0.70556 0.477348 + endloop + endfacet + facet normal -0.033872 -0.155491 0.987256 + outer loop + vertex -0.537117 -0.70556 0.477348 + vertex -0.639968 -0.69483 0.47551 + vertex -0.630152 -0.791677 0.460593 + endloop + endfacet + facet normal -0.0371759 -0.152004 0.987681 + outer loop + vertex -0.537117 -0.70556 0.477348 + vertex -0.630152 -0.791677 0.460593 + vertex -0.530826 -0.804713 0.462326 + endloop + endfacet + facet normal -0.0600836 -0.332749 0.941099 + outer loop + vertex -0.530826 -0.804713 0.462326 + vertex -0.630152 -0.791677 0.460593 + vertex -0.620998 -0.875802 0.431433 + endloop + endfacet + facet normal -0.0667362 -0.325253 0.943269 + outer loop + vertex -0.530826 -0.804713 0.462326 + vertex -0.620998 -0.875802 0.431433 + vertex -0.524954 -0.890932 0.433011 + endloop + endfacet + facet normal -0.107582 -0.600267 0.792532 + outer loop + vertex -0.524954 -0.890932 0.433011 + vertex -0.620998 -0.875802 0.431433 + vertex -0.613557 -0.942129 0.382207 + endloop + endfacet + facet normal -0.117909 -0.58917 0.79936 + outer loop + vertex -0.524954 -0.890932 0.433011 + vertex -0.613557 -0.942129 0.382207 + vertex -0.520145 -0.958971 0.383572 + endloop + endfacet + facet normal -0.0355451 -0.000632252 0.999368 + outer loop + vertex -0.668998 -0.153076 0.488501 + vertex -0.780117 -0.153076 0.484548 + vertex -0.778189 -0.261436 0.484548 + endloop + endfacet + facet normal -0.0357077 -0.000468219 0.999362 + outer loop + vertex -0.668998 -0.153076 0.488501 + vertex -0.778189 -0.261436 0.484548 + vertex -0.667544 -0.263998 0.488501 + endloop + endfacet + facet normal -0.0358737 -0.00769073 0.999327 + outer loop + vertex -0.667544 -0.263998 0.488501 + vertex -0.778189 -0.261436 0.484548 + vertex -0.772824 -0.369079 0.483912 + endloop + endfacet + facet normal -0.0363589 -0.00720398 0.999313 + outer loop + vertex -0.667544 -0.263998 0.488501 + vertex -0.772824 -0.369079 0.483912 + vertex -0.663547 -0.374277 0.487851 + endloop + endfacet + facet normal -0.0370009 -0.0208644 0.999097 + outer loop + vertex -0.663547 -0.374277 0.487851 + vertex -0.772824 -0.369079 0.483912 + vertex -0.764439 -0.475289 0.482005 + endloop + endfacet + facet normal -0.0378594 -0.0200061 0.999083 + outer loop + vertex -0.663547 -0.374277 0.487851 + vertex -0.764439 -0.475289 0.482005 + vertex -0.657374 -0.483271 0.485902 + endloop + endfacet + facet normal -0.0393816 -0.0407609 0.998393 + outer loop + vertex -0.657374 -0.483271 0.485902 + vertex -0.764439 -0.475289 0.482005 + vertex -0.753452 -0.579348 0.47819 + endloop + endfacet + facet normal -0.0407609 -0.0393816 0.998393 + outer loop + vertex -0.657374 -0.483271 0.485902 + vertex -0.753452 -0.579348 0.47819 + vertex -0.649392 -0.590336 0.482005 + endloop + endfacet + facet normal -0.0437549 -0.0683228 0.996703 + outer loop + vertex -0.649392 -0.590336 0.482005 + vertex -0.753452 -0.579348 0.47819 + vertex -0.740278 -0.680541 0.471832 + endloop + endfacet + facet normal -0.0459616 -0.0661052 0.996754 + outer loop + vertex -0.649392 -0.590336 0.482005 + vertex -0.740278 -0.680541 0.471832 + vertex -0.639968 -0.69483 0.47551 + endloop + endfacet + facet normal -0.059407 -0.163581 0.98474 + outer loop + vertex -0.639968 -0.69483 0.47551 + vertex -0.740278 -0.680541 0.471832 + vertex -0.726483 -0.774065 0.457128 + endloop + endfacet + facet normal -0.0643796 -0.15828 0.985293 + outer loop + vertex -0.639968 -0.69483 0.47551 + vertex -0.726483 -0.774065 0.457128 + vertex -0.630152 -0.791677 0.460593 + endloop + endfacet + facet normal -0.0970594 -0.347373 0.932691 + outer loop + vertex -0.630152 -0.791677 0.460593 + vertex -0.726483 -0.774065 0.457128 + vertex -0.71363 -0.855122 0.428277 + endloop + endfacet + facet normal -0.106899 -0.335998 0.935777 + outer loop + vertex -0.630152 -0.791677 0.460593 + vertex -0.71363 -0.855122 0.428277 + vertex -0.620998 -0.875802 0.431433 + endloop + endfacet + facet normal -0.163788 -0.616038 0.7705 + outer loop + vertex -0.620998 -0.875802 0.431433 + vertex -0.71363 -0.855122 0.428277 + vertex -0.703282 -0.918909 0.379476 + endloop + endfacet + facet normal -0.178821 -0.599223 0.780356 + outer loop + vertex -0.620998 -0.875802 0.431433 + vertex -0.703282 -0.918909 0.379476 + vertex -0.613557 -0.942129 0.382207 + endloop + endfacet + facet normal -0.0604876 -0.00137164 0.998168 + outer loop + vertex -0.780117 -0.153076 0.484548 + vertex -0.888816 -0.153076 0.477961 + vertex -0.886426 -0.258468 0.477961 + endloop + endfacet + facet normal -0.0607746 -0.00108102 0.998151 + outer loop + vertex -0.780117 -0.153076 0.484548 + vertex -0.886426 -0.258468 0.477961 + vertex -0.778189 -0.261436 0.484548 + endloop + endfacet + facet normal -0.0610099 -0.00979853 0.998089 + outer loop + vertex -0.778189 -0.261436 0.484548 + vertex -0.886426 -0.258468 0.477961 + vertex -0.879663 -0.363013 0.477348 + endloop + endfacet + facet normal -0.0618295 -0.00897675 0.998046 + outer loop + vertex -0.778189 -0.261436 0.484548 + vertex -0.879663 -0.363013 0.477348 + vertex -0.772824 -0.369079 0.483912 + endloop + endfacet + facet normal -0.0626848 -0.0243778 0.997736 + outer loop + vertex -0.772824 -0.369079 0.483912 + vertex -0.879663 -0.363013 0.477348 + vertex -0.868933 -0.465865 0.475509 + endloop + endfacet + facet normal -0.06409 -0.0229775 0.99768 + outer loop + vertex -0.772824 -0.369079 0.483912 + vertex -0.868933 -0.465865 0.475509 + vertex -0.764439 -0.475289 0.482005 + endloop + endfacet + facet normal -0.0661054 -0.0459613 0.996754 + outer loop + vertex -0.764439 -0.475289 0.482005 + vertex -0.868933 -0.465865 0.475509 + vertex -0.854644 -0.566175 0.471832 + endloop + endfacet + facet normal -0.0683229 -0.0437549 0.996703 + outer loop + vertex -0.764439 -0.475289 0.482005 + vertex -0.854644 -0.566175 0.471832 + vertex -0.753452 -0.579348 0.47819 + endloop + endfacet + facet normal -0.0723704 -0.0759175 0.994484 + outer loop + vertex -0.753452 -0.579348 0.47819 + vertex -0.854644 -0.566175 0.471832 + vertex -0.837201 -0.663098 0.465702 + endloop + endfacet + facet normal -0.0759175 -0.0723704 0.994484 + outer loop + vertex -0.753452 -0.579348 0.47819 + vertex -0.837201 -0.663098 0.465702 + vertex -0.740278 -0.680541 0.471832 + endloop + endfacet + facet normal -0.0938263 -0.177072 0.979715 + outer loop + vertex -0.740278 -0.680541 0.471832 + vertex -0.837201 -0.663098 0.465702 + vertex -0.818819 -0.75223 0.451353 + endloop + endfacet + facet normal -0.1013 -0.169076 0.980383 + outer loop + vertex -0.740278 -0.680541 0.471832 + vertex -0.818819 -0.75223 0.451353 + vertex -0.726483 -0.774065 0.457128 + endloop + endfacet + facet normal -0.144927 -0.370172 0.917589 + outer loop + vertex -0.726483 -0.774065 0.457128 + vertex -0.818819 -0.75223 0.451353 + vertex -0.801712 -0.829169 0.423016 + endloop + endfacet + facet normal -0.159171 -0.353362 0.921846 + outer loop + vertex -0.726483 -0.774065 0.457128 + vertex -0.801712 -0.829169 0.423016 + vertex -0.71363 -0.855122 0.428277 + endloop + endfacet + facet normal -0.231774 -0.637734 0.734558 + outer loop + vertex -0.71363 -0.855122 0.428277 + vertex -0.801712 -0.829169 0.423016 + vertex -0.788094 -0.889511 0.374925 + endloop + endfacet + facet normal -0.252783 -0.613421 0.748208 + outer loop + vertex -0.71363 -0.855122 0.428277 + vertex -0.788094 -0.889511 0.374925 + vertex -0.703282 -0.918909 0.379476 + endloop + endfacet + facet normal -0.14757 -0.00406645 0.989043 + outer loop + vertex -0.888816 -0.153076 0.477961 + vertex -0.989739 -0.153076 0.462903 + vertex -0.98692 -0.255399 0.462903 + endloop + endfacet + facet normal -0.148288 -0.00336262 0.988939 + outer loop + vertex -0.888816 -0.153076 0.477961 + vertex -0.98692 -0.255399 0.462903 + vertex -0.886426 -0.258468 0.477961 + endloop + endfacet + facet normal -0.148689 -0.017528 0.988729 + outer loop + vertex -0.886426 -0.258468 0.477961 + vertex -0.98692 -0.255399 0.462903 + vertex -0.978816 -0.356723 0.462326 + endloop + endfacet + facet normal -0.150748 -0.0155472 0.98845 + outer loop + vertex -0.886426 -0.258468 0.477961 + vertex -0.978816 -0.356723 0.462326 + vertex -0.879663 -0.363013 0.477348 + endloop + endfacet + facet normal -0.152004 -0.0371759 0.987681 + outer loop + vertex -0.879663 -0.363013 0.477348 + vertex -0.978816 -0.356723 0.462326 + vertex -0.96578 -0.456049 0.460593 + endloop + endfacet + facet normal -0.155491 -0.0338721 0.987256 + outer loop + vertex -0.879663 -0.363013 0.477348 + vertex -0.96578 -0.456049 0.460593 + vertex -0.868933 -0.465865 0.475509 + endloop + endfacet + facet normal -0.15828 -0.0643794 0.985293 + outer loop + vertex -0.868933 -0.465865 0.475509 + vertex -0.96578 -0.456049 0.460593 + vertex -0.948168 -0.55238 0.457128 + endloop + endfacet + facet normal -0.163581 -0.0594065 0.98474 + outer loop + vertex -0.868933 -0.465865 0.475509 + vertex -0.948168 -0.55238 0.457128 + vertex -0.854644 -0.566175 0.471832 + endloop + endfacet + facet normal -0.169076 -0.1013 0.980383 + outer loop + vertex -0.854644 -0.566175 0.471832 + vertex -0.948168 -0.55238 0.457128 + vertex -0.926333 -0.644716 0.451353 + endloop + endfacet + facet normal -0.177073 -0.0938263 0.979715 + outer loop + vertex -0.854644 -0.566175 0.471832 + vertex -0.926333 -0.644716 0.451353 + vertex -0.837201 -0.663098 0.465702 + endloop + endfacet + facet normal -0.197294 -0.208973 0.957813 + outer loop + vertex -0.837201 -0.663098 0.465702 + vertex -0.926333 -0.644716 0.451353 + vertex -0.902986 -0.728883 0.437799 + endloop + endfacet + facet normal -0.208973 -0.197293 0.957813 + outer loop + vertex -0.837201 -0.663098 0.465702 + vertex -0.902986 -0.728883 0.437799 + vertex -0.818819 -0.75223 0.451353 + endloop + endfacet + facet normal -0.253977 -0.405925 0.877907 + outer loop + vertex -0.818819 -0.75223 0.451353 + vertex -0.902986 -0.728883 0.437799 + vertex -0.880839 -0.800707 0.410996 + endloop + endfacet + facet normal -0.272523 -0.3853 0.881632 + outer loop + vertex -0.818819 -0.75223 0.451353 + vertex -0.880839 -0.800707 0.410996 + vertex -0.801712 -0.829169 0.423016 + endloop + endfacet + facet normal -0.338868 -0.658151 0.672314 + outer loop + vertex -0.801712 -0.829169 0.423016 + vertex -0.880839 -0.800707 0.410996 + vertex -0.863761 -0.856237 0.365244 + endloop + endfacet + facet normal -0.364543 -0.62929 0.686368 + outer loop + vertex -0.801712 -0.829169 0.423016 + vertex -0.863761 -0.856237 0.365244 + vertex -0.788094 -0.889511 0.374925 + endloop + endfacet + facet normal -0.31721 -0.010184 0.948301 + outer loop + vertex -0.989739 -0.153076 0.462903 + vertex -1.07753 -0.153076 0.433537 + vertex -1.07434 -0.252532 0.433537 + endloop + endfacet + facet normal -0.318691 -0.00878155 0.947818 + outer loop + vertex -0.989739 -0.153076 0.462903 + vertex -1.07434 -0.252532 0.433537 + vertex -0.98692 -0.255399 0.462903 + endloop + endfacet + facet normal -0.319285 -0.0352696 0.947002 + outer loop + vertex -0.98692 -0.255399 0.462903 + vertex -1.07434 -0.252532 0.433537 + vertex -1.06503 -0.350851 0.433011 + endloop + endfacet + facet normal -0.323651 -0.0312765 0.945659 + outer loop + vertex -0.98692 -0.255399 0.462903 + vertex -1.06503 -0.350851 0.433011 + vertex -0.978816 -0.356723 0.462326 + endloop + endfacet + facet normal -0.325253 -0.0667365 0.943269 + outer loop + vertex -0.978816 -0.356723 0.462326 + vertex -1.06503 -0.350851 0.433011 + vertex -1.04991 -0.446895 0.431433 + endloop + endfacet + facet normal -0.332749 -0.0600835 0.941099 + outer loop + vertex -0.978816 -0.356723 0.462326 + vertex -1.04991 -0.446895 0.431433 + vertex -0.96578 -0.456049 0.460593 + endloop + endfacet + facet normal -0.335998 -0.106898 0.935777 + outer loop + vertex -0.96578 -0.456049 0.460593 + vertex -1.04991 -0.446895 0.431433 + vertex -1.02922 -0.539527 0.428277 + endloop + endfacet + facet normal -0.347373 -0.097059 0.932691 + outer loop + vertex -0.96578 -0.456049 0.460593 + vertex -1.02922 -0.539527 0.428277 + vertex -0.948168 -0.55238 0.457128 + endloop + endfacet + facet normal -0.353362 -0.15917 0.921846 + outer loop + vertex -0.948168 -0.55238 0.457128 + vertex -1.02922 -0.539527 0.428277 + vertex -1.00327 -0.627609 0.423016 + endloop + endfacet + facet normal -0.370172 -0.144927 0.917589 + outer loop + vertex -0.948168 -0.55238 0.457128 + vertex -1.00327 -0.627609 0.423016 + vertex -0.926333 -0.644716 0.451353 + endloop + endfacet + facet normal -0.3853 -0.272522 0.881632 + outer loop + vertex -0.926333 -0.644716 0.451353 + vertex -1.00327 -0.627609 0.423016 + vertex -0.97481 -0.706736 0.410996 + endloop + endfacet + facet normal -0.405924 -0.253977 0.877907 + outer loop + vertex -0.926333 -0.644716 0.451353 + vertex -0.97481 -0.706736 0.410996 + vertex -0.902986 -0.728883 0.437799 + endloop + endfacet + facet normal -0.431539 -0.461336 0.775205 + outer loop + vertex -0.902986 -0.728883 0.437799 + vertex -0.97481 -0.706736 0.410996 + vertex -0.946604 -0.772501 0.38756 + endloop + endfacet + facet normal -0.461336 -0.431539 0.775205 + outer loop + vertex -0.902986 -0.728883 0.437799 + vertex -0.946604 -0.772501 0.38756 + vertex -0.880839 -0.800707 0.410996 + endloop + endfacet + facet normal -0.487016 -0.66907 0.561392 + outer loop + vertex -0.880839 -0.800707 0.410996 + vertex -0.946604 -0.772501 0.38756 + vertex -0.926049 -0.821389 0.347126 + endloop + endfacet + facet normal -0.520668 -0.632558 0.573389 + outer loop + vertex -0.880839 -0.800707 0.410996 + vertex -0.926049 -0.821389 0.347126 + vertex -0.863761 -0.856237 0.365244 + endloop + endfacet + facet normal -0.581201 -0.0208773 0.813492 + outer loop + vertex -1.07753 -0.153076 0.433537 + vertex -1.14683 -0.153076 0.384027 + vertex -1.14334 -0.250173 0.384027 + endloop + endfacet + facet normal -0.583289 -0.0187264 0.812049 + outer loop + vertex -1.07753 -0.153076 0.433537 + vertex -1.14334 -0.250173 0.384027 + vertex -1.07434 -0.252532 0.433537 + endloop + endfacet + facet normal -0.583182 -0.0662835 0.809633 + outer loop + vertex -1.07434 -0.252532 0.433537 + vertex -1.14334 -0.250173 0.384027 + vertex -1.13307 -0.346042 0.383572 + endloop + endfacet + facet normal -0.589545 -0.0600777 0.805499 + outer loop + vertex -1.07434 -0.252532 0.433537 + vertex -1.13307 -0.346042 0.383572 + vertex -1.06503 -0.350851 0.433011 + endloop + endfacet + facet normal -0.589171 -0.117908 0.799359 + outer loop + vertex -1.06503 -0.350851 0.433011 + vertex -1.13307 -0.346042 0.383572 + vertex -1.11623 -0.439453 0.382207 + endloop + endfacet + facet normal -0.600266 -0.107582 0.792532 + outer loop + vertex -1.06503 -0.350851 0.433011 + vertex -1.11623 -0.439453 0.382207 + vertex -1.04991 -0.446895 0.431433 + endloop + endfacet + facet normal -0.599223 -0.17882 0.780356 + outer loop + vertex -1.04991 -0.446895 0.431433 + vertex -1.11623 -0.439453 0.382207 + vertex -1.09301 -0.529179 0.379476 + endloop + endfacet + facet normal -0.616038 -0.163787 0.7705 + outer loop + vertex -1.04991 -0.446895 0.431433 + vertex -1.09301 -0.529179 0.379476 + vertex -1.02922 -0.539527 0.428277 + endloop + endfacet + facet normal -0.613421 -0.252782 0.748209 + outer loop + vertex -1.02922 -0.539527 0.428277 + vertex -1.09301 -0.529179 0.379476 + vertex -1.06361 -0.613991 0.374925 + endloop + endfacet + facet normal -0.637734 -0.231773 0.734559 + outer loop + vertex -1.02922 -0.539527 0.428277 + vertex -1.06361 -0.613991 0.374925 + vertex -1.00327 -0.627609 0.423016 + endloop + endfacet + facet normal -0.62929 -0.364543 0.686369 + outer loop + vertex -1.00327 -0.627609 0.423016 + vertex -1.06361 -0.613991 0.374925 + vertex -1.03034 -0.689657 0.365244 + endloop + endfacet + facet normal -0.658151 -0.338867 0.672314 + outer loop + vertex -1.00327 -0.627609 0.423016 + vertex -1.03034 -0.689657 0.365244 + vertex -0.97481 -0.706736 0.410996 + endloop + endfacet + facet normal -0.632558 -0.520668 0.573389 + outer loop + vertex -0.97481 -0.706736 0.410996 + vertex -1.03034 -0.689657 0.365244 + vertex -0.995492 -0.751946 0.347126 + endloop + endfacet + facet normal -0.66907 -0.487016 0.561391 + outer loop + vertex -0.97481 -0.706736 0.410996 + vertex -0.995492 -0.751946 0.347126 + vertex -0.946604 -0.772501 0.38756 + endloop + endfacet + facet normal -0.623135 -0.661619 0.417089 + outer loop + vertex -0.946604 -0.772501 0.38756 + vertex -0.995492 -0.751946 0.347126 + vertex -0.966663 -0.79256 0.325773 + endloop + endfacet + facet normal -0.66162 -0.623134 0.417089 + outer loop + vertex -0.946604 -0.772501 0.38756 + vertex -0.966663 -0.79256 0.325773 + vertex -0.926049 -0.821389 0.347126 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -0.327179 -0.153076 0.491135 + vertex -0.327179 -0.267822 0.491135 + vertex -0.212921 -0.267334 0.491135 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -0.327179 -0.153076 0.491135 + vertex -0.212921 -0.267334 0.491135 + vertex -0.212433 -0.153076 0.491135 + endloop + endfacet + facet normal 0.00579568 -2.47709e-05 0.999983 + outer loop + vertex -0.212433 -0.153076 0.491135 + vertex -0.212921 -0.267334 0.491135 + vertex -0.0992654 -0.266012 0.490477 + endloop + endfacet + facet normal 0.005771 -4.95097e-05 0.999983 + outer loop + vertex -0.212433 -0.153076 0.491135 + vertex -0.0992654 -0.266012 0.490477 + vertex -0.0982914 -0.153076 0.490477 + endloop + endfacet + facet normal 0.0175732 -0.000151301 0.999846 + outer loop + vertex -0.0982914 -0.153076 0.490477 + vertex -0.0992654 -0.266012 0.490477 + vertex 0.0131861 -0.263998 0.488501 + endloop + endfacet + facet normal 0.0174955 -0.00022943 0.999847 + outer loop + vertex -0.0982914 -0.153076 0.490477 + vertex 0.0131861 -0.263998 0.488501 + vertex 0.0146407 -0.153076 0.488501 + endloop + endfacet + facet normal 0.0357077 -0.00046826 0.999362 + outer loop + vertex 0.0146407 -0.153076 0.488501 + vertex 0.0131861 -0.263998 0.488501 + vertex 0.123831 -0.261436 0.484548 + endloop + endfacet + facet normal 0.0355451 -0.000632257 0.999368 + outer loop + vertex 0.0146407 -0.153076 0.488501 + vertex 0.123831 -0.261436 0.484548 + vertex 0.125759 -0.153076 0.484548 + endloop + endfacet + facet normal 0.0607746 -0.00108103 0.998151 + outer loop + vertex 0.125759 -0.153076 0.484548 + vertex 0.123831 -0.261436 0.484548 + vertex 0.232068 -0.258468 0.477961 + endloop + endfacet + facet normal 0.0604875 -0.0013717 0.998168 + outer loop + vertex 0.125759 -0.153076 0.484548 + vertex 0.232068 -0.258468 0.477961 + vertex 0.234458 -0.153076 0.477961 + endloop + endfacet + facet normal 0.148288 -0.00336277 0.988939 + outer loop + vertex 0.234458 -0.153076 0.477961 + vertex 0.232068 -0.258468 0.477961 + vertex 0.332562 -0.255399 0.462903 + endloop + endfacet + facet normal 0.14757 -0.0040665 0.989043 + outer loop + vertex 0.234458 -0.153076 0.477961 + vertex 0.332562 -0.255399 0.462903 + vertex 0.335381 -0.153076 0.462903 + endloop + endfacet + facet normal 0.318691 -0.00878164 0.947818 + outer loop + vertex 0.335381 -0.153076 0.462903 + vertex 0.332562 -0.255399 0.462903 + vertex 0.419978 -0.252533 0.433537 + endloop + endfacet + facet normal 0.31721 -0.0101841 0.948301 + outer loop + vertex 0.335381 -0.153076 0.462903 + vertex 0.419978 -0.252533 0.433537 + vertex 0.423171 -0.153076 0.433537 + endloop + endfacet + facet normal 0.583289 -0.0187266 0.812049 + outer loop + vertex 0.423171 -0.153076 0.433537 + vertex 0.419978 -0.252533 0.433537 + vertex 0.48898 -0.250174 0.384027 + endloop + endfacet + facet normal 0.581201 -0.0208779 0.813492 + outer loop + vertex 0.423171 -0.153076 0.433537 + vertex 0.48898 -0.250174 0.384027 + vertex 0.492468 -0.153076 0.384027 + endloop + endfacet + facet normal 4.95028e-05 -0.005771 0.999983 + outer loop + vertex -0.327179 -0.267822 0.491135 + vertex -0.327179 -0.381964 0.490477 + vertex -0.214243 -0.38099 0.490477 + endloop + endfacet + facet normal 2.47649e-05 -0.00579568 0.999983 + outer loop + vertex -0.327179 -0.267822 0.491135 + vertex -0.214243 -0.38099 0.490477 + vertex -0.212921 -0.267334 0.491135 + endloop + endfacet + facet normal 0.0059822 -0.00586489 0.999965 + outer loop + vertex -0.212921 -0.267334 0.491135 + vertex -0.214243 -0.38099 0.490477 + vertex -0.101917 -0.378338 0.48982 + endloop + endfacet + facet normal 0.00586488 -0.00598221 0.999965 + outer loop + vertex -0.212921 -0.267334 0.491135 + vertex -0.101917 -0.378338 0.48982 + vertex -0.0992654 -0.266012 0.490477 + endloop + endfacet + facet normal 0.01795 -0.00626669 0.999819 + outer loop + vertex -0.0992654 -0.266012 0.490477 + vertex -0.101917 -0.378338 0.48982 + vertex 0.00918905 -0.374278 0.487851 + endloop + endfacet + facet normal 0.017687 -0.00653025 0.999822 + outer loop + vertex -0.0992654 -0.266012 0.490477 + vertex 0.00918905 -0.374278 0.487851 + vertex 0.0131861 -0.263998 0.488501 + endloop + endfacet + facet normal 0.0363589 -0.00720401 0.999313 + outer loop + vertex 0.0131861 -0.263998 0.488501 + vertex 0.00918905 -0.374278 0.487851 + vertex 0.118466 -0.36908 0.483912 + endloop + endfacet + facet normal 0.0358736 -0.0076908 0.999327 + outer loop + vertex 0.0131861 -0.263998 0.488501 + vertex 0.118466 -0.36908 0.483912 + vertex 0.123831 -0.261436 0.484548 + endloop + endfacet + facet normal 0.0618295 -0.00897687 0.998046 + outer loop + vertex 0.123831 -0.261436 0.484548 + vertex 0.118466 -0.36908 0.483912 + vertex 0.225305 -0.363014 0.477348 + endloop + endfacet + facet normal 0.0610099 -0.0097986 0.998089 + outer loop + vertex 0.123831 -0.261436 0.484548 + vertex 0.225305 -0.363014 0.477348 + vertex 0.232068 -0.258468 0.477961 + endloop + endfacet + facet normal 0.150748 -0.0155474 0.98845 + outer loop + vertex 0.232068 -0.258468 0.477961 + vertex 0.225305 -0.363014 0.477348 + vertex 0.324458 -0.356723 0.462326 + endloop + endfacet + facet normal 0.148689 -0.0175282 0.988729 + outer loop + vertex 0.232068 -0.258468 0.477961 + vertex 0.324458 -0.356723 0.462326 + vertex 0.332562 -0.255399 0.462903 + endloop + endfacet + facet normal 0.323651 -0.0312769 0.945659 + outer loop + vertex 0.332562 -0.255399 0.462903 + vertex 0.324458 -0.356723 0.462326 + vertex 0.410677 -0.350851 0.433011 + endloop + endfacet + facet normal 0.319286 -0.03527 0.947002 + outer loop + vertex 0.332562 -0.255399 0.462903 + vertex 0.410677 -0.350851 0.433011 + vertex 0.419978 -0.252533 0.433537 + endloop + endfacet + facet normal 0.589544 -0.0600783 0.805499 + outer loop + vertex 0.419978 -0.252533 0.433537 + vertex 0.410677 -0.350851 0.433011 + vertex 0.478716 -0.346042 0.383572 + endloop + endfacet + facet normal 0.583182 -0.0662833 0.809633 + outer loop + vertex 0.419978 -0.252533 0.433537 + vertex 0.478716 -0.346042 0.383572 + vertex 0.48898 -0.250174 0.384027 + endloop + endfacet + facet normal 0.00022942 -0.0174955 0.999847 + outer loop + vertex -0.327179 -0.381964 0.490477 + vertex -0.327179 -0.494896 0.488501 + vertex -0.216257 -0.493441 0.488501 + endloop + endfacet + facet normal 0.00015128 -0.0175732 0.999846 + outer loop + vertex -0.327179 -0.381964 0.490477 + vertex -0.216257 -0.493441 0.488501 + vertex -0.214243 -0.38099 0.490477 + endloop + endfacet + facet normal 0.00653023 -0.017687 0.999822 + outer loop + vertex -0.214243 -0.38099 0.490477 + vertex -0.216257 -0.493441 0.488501 + vertex -0.105978 -0.489444 0.487851 + endloop + endfacet + facet normal 0.00626667 -0.01795 0.999819 + outer loop + vertex -0.214243 -0.38099 0.490477 + vertex -0.105978 -0.489444 0.487851 + vertex -0.101917 -0.378338 0.48982 + endloop + endfacet + facet normal 0.0189147 -0.0184092 0.999652 + outer loop + vertex -0.101917 -0.378338 0.48982 + vertex -0.105978 -0.489444 0.487851 + vertex 0.00301617 -0.483271 0.485902 + endloop + endfacet + facet normal 0.0184092 -0.0189147 0.999652 + outer loop + vertex -0.101917 -0.378338 0.48982 + vertex 0.00301617 -0.483271 0.485902 + vertex 0.00918905 -0.374278 0.487851 + endloop + endfacet + facet normal 0.0378594 -0.0200061 0.999083 + outer loop + vertex 0.00918905 -0.374278 0.487851 + vertex 0.00301617 -0.483271 0.485902 + vertex 0.110081 -0.475289 0.482005 + endloop + endfacet + facet normal 0.0370009 -0.0208644 0.999097 + outer loop + vertex 0.00918905 -0.374278 0.487851 + vertex 0.110081 -0.475289 0.482005 + vertex 0.118466 -0.36908 0.483912 + endloop + endfacet + facet normal 0.0640897 -0.0229775 0.99768 + outer loop + vertex 0.118466 -0.36908 0.483912 + vertex 0.110081 -0.475289 0.482005 + vertex 0.214575 -0.465865 0.47551 + endloop + endfacet + facet normal 0.0626848 -0.0243775 0.997736 + outer loop + vertex 0.118466 -0.36908 0.483912 + vertex 0.214575 -0.465865 0.47551 + vertex 0.225305 -0.363014 0.477348 + endloop + endfacet + facet normal 0.155491 -0.033872 0.987256 + outer loop + vertex 0.225305 -0.363014 0.477348 + vertex 0.214575 -0.465865 0.47551 + vertex 0.311422 -0.45605 0.460593 + endloop + endfacet + facet normal 0.152004 -0.0371759 0.987681 + outer loop + vertex 0.225305 -0.363014 0.477348 + vertex 0.311422 -0.45605 0.460593 + vertex 0.324458 -0.356723 0.462326 + endloop + endfacet + facet normal 0.332749 -0.0600837 0.941099 + outer loop + vertex 0.324458 -0.356723 0.462326 + vertex 0.311422 -0.45605 0.460593 + vertex 0.395547 -0.446895 0.431433 + endloop + endfacet + facet normal 0.325253 -0.0667365 0.943269 + outer loop + vertex 0.324458 -0.356723 0.462326 + vertex 0.395547 -0.446895 0.431433 + vertex 0.410677 -0.350851 0.433011 + endloop + endfacet + facet normal 0.600266 -0.107582 0.792532 + outer loop + vertex 0.410677 -0.350851 0.433011 + vertex 0.395547 -0.446895 0.431433 + vertex 0.461874 -0.439454 0.382207 + endloop + endfacet + facet normal 0.58917 -0.117909 0.79936 + outer loop + vertex 0.410677 -0.350851 0.433011 + vertex 0.461874 -0.439454 0.382207 + vertex 0.478716 -0.346042 0.383572 + endloop + endfacet + facet normal 0.000632233 -0.0355451 0.999368 + outer loop + vertex -0.327179 -0.494896 0.488501 + vertex -0.327179 -0.606014 0.484548 + vertex -0.218819 -0.604086 0.484548 + endloop + endfacet + facet normal 0.000468238 -0.0357077 0.999362 + outer loop + vertex -0.327179 -0.494896 0.488501 + vertex -0.218819 -0.604086 0.484548 + vertex -0.216257 -0.493441 0.488501 + endloop + endfacet + facet normal 0.00769073 -0.0358737 0.999327 + outer loop + vertex -0.216257 -0.493441 0.488501 + vertex -0.218819 -0.604086 0.484548 + vertex -0.111176 -0.598722 0.483912 + endloop + endfacet + facet normal 0.00720397 -0.0363589 0.999313 + outer loop + vertex -0.216257 -0.493441 0.488501 + vertex -0.111176 -0.598722 0.483912 + vertex -0.105978 -0.489444 0.487851 + endloop + endfacet + facet normal 0.0208644 -0.0370009 0.999097 + outer loop + vertex -0.105978 -0.489444 0.487851 + vertex -0.111176 -0.598722 0.483912 + vertex -0.00496588 -0.590337 0.482005 + endloop + endfacet + facet normal 0.0200061 -0.0378594 0.999083 + outer loop + vertex -0.105978 -0.489444 0.487851 + vertex -0.00496588 -0.590337 0.482005 + vertex 0.00301617 -0.483271 0.485902 + endloop + endfacet + facet normal 0.0407609 -0.0393816 0.998393 + outer loop + vertex 0.00301617 -0.483271 0.485902 + vertex -0.00496588 -0.590337 0.482005 + vertex 0.0990935 -0.579349 0.47819 + endloop + endfacet + facet normal 0.0393816 -0.0407609 0.998393 + outer loop + vertex 0.00301617 -0.483271 0.485902 + vertex 0.0990935 -0.579349 0.47819 + vertex 0.110081 -0.475289 0.482005 + endloop + endfacet + facet normal 0.0683229 -0.043755 0.996703 + outer loop + vertex 0.110081 -0.475289 0.482005 + vertex 0.0990935 -0.579349 0.47819 + vertex 0.200286 -0.566175 0.471832 + endloop + endfacet + facet normal 0.0661051 -0.0459617 0.996754 + outer loop + vertex 0.110081 -0.475289 0.482005 + vertex 0.200286 -0.566175 0.471832 + vertex 0.214575 -0.465865 0.47551 + endloop + endfacet + facet normal 0.163581 -0.0594071 0.98474 + outer loop + vertex 0.214575 -0.465865 0.47551 + vertex 0.200286 -0.566175 0.471832 + vertex 0.29381 -0.55238 0.457128 + endloop + endfacet + facet normal 0.15828 -0.0643797 0.985293 + outer loop + vertex 0.214575 -0.465865 0.47551 + vertex 0.29381 -0.55238 0.457128 + vertex 0.311422 -0.45605 0.460593 + endloop + endfacet + facet normal 0.347372 -0.0970595 0.932691 + outer loop + vertex 0.311422 -0.45605 0.460593 + vertex 0.29381 -0.55238 0.457128 + vertex 0.374867 -0.539527 0.428277 + endloop + endfacet + facet normal 0.335998 -0.106899 0.935777 + outer loop + vertex 0.311422 -0.45605 0.460593 + vertex 0.374867 -0.539527 0.428277 + vertex 0.395547 -0.446895 0.431433 + endloop + endfacet + facet normal 0.616038 -0.163787 0.770501 + outer loop + vertex 0.395547 -0.446895 0.431433 + vertex 0.374867 -0.539527 0.428277 + vertex 0.438655 -0.52918 0.379476 + endloop + endfacet + facet normal 0.599223 -0.17882 0.780356 + outer loop + vertex 0.395547 -0.446895 0.431433 + vertex 0.438655 -0.52918 0.379476 + vertex 0.461874 -0.439454 0.382207 + endloop + endfacet + facet normal 0.00137164 -0.0604875 0.998168 + outer loop + vertex -0.327179 -0.606014 0.484548 + vertex -0.327179 -0.714713 0.477961 + vertex -0.221787 -0.712323 0.477961 + endloop + endfacet + facet normal 0.00108098 -0.0607746 0.998151 + outer loop + vertex -0.327179 -0.606014 0.484548 + vertex -0.221787 -0.712323 0.477961 + vertex -0.218819 -0.604086 0.484548 + endloop + endfacet + facet normal 0.00979853 -0.0610099 0.998089 + outer loop + vertex -0.218819 -0.604086 0.484548 + vertex -0.221787 -0.712323 0.477961 + vertex -0.117242 -0.70556 0.477348 + endloop + endfacet + facet normal 0.00897675 -0.0618295 0.998046 + outer loop + vertex -0.218819 -0.604086 0.484548 + vertex -0.117242 -0.70556 0.477348 + vertex -0.111176 -0.598722 0.483912 + endloop + endfacet + facet normal 0.0243778 -0.0626848 0.997736 + outer loop + vertex -0.111176 -0.598722 0.483912 + vertex -0.117242 -0.70556 0.477348 + vertex -0.0143905 -0.694831 0.475509 + endloop + endfacet + facet normal 0.0229775 -0.06409 0.99768 + outer loop + vertex -0.111176 -0.598722 0.483912 + vertex -0.0143905 -0.694831 0.475509 + vertex -0.00496588 -0.590337 0.482005 + endloop + endfacet + facet normal 0.0459613 -0.0661055 0.996754 + outer loop + vertex -0.00496588 -0.590337 0.482005 + vertex -0.0143905 -0.694831 0.475509 + vertex 0.08592 -0.680541 0.471832 + endloop + endfacet + facet normal 0.0437549 -0.0683229 0.996703 + outer loop + vertex -0.00496588 -0.590337 0.482005 + vertex 0.08592 -0.680541 0.471832 + vertex 0.0990935 -0.579349 0.47819 + endloop + endfacet + facet normal 0.0759175 -0.0723704 0.994484 + outer loop + vertex 0.0990935 -0.579349 0.47819 + vertex 0.08592 -0.680541 0.471832 + vertex 0.182843 -0.663098 0.465702 + endloop + endfacet + facet normal 0.0723704 -0.0759175 0.994484 + outer loop + vertex 0.0990935 -0.579349 0.47819 + vertex 0.182843 -0.663098 0.465702 + vertex 0.200286 -0.566175 0.471832 + endloop + endfacet + facet normal 0.177072 -0.0938264 0.979715 + outer loop + vertex 0.200286 -0.566175 0.471832 + vertex 0.182843 -0.663098 0.465702 + vertex 0.271975 -0.644716 0.451353 + endloop + endfacet + facet normal 0.169076 -0.1013 0.980383 + outer loop + vertex 0.200286 -0.566175 0.471832 + vertex 0.271975 -0.644716 0.451353 + vertex 0.29381 -0.55238 0.457128 + endloop + endfacet + facet normal 0.370172 -0.144927 0.917589 + outer loop + vertex 0.29381 -0.55238 0.457128 + vertex 0.271975 -0.644716 0.451353 + vertex 0.348914 -0.627609 0.423016 + endloop + endfacet + facet normal 0.353361 -0.159171 0.921846 + outer loop + vertex 0.29381 -0.55238 0.457128 + vertex 0.348914 -0.627609 0.423016 + vertex 0.374867 -0.539527 0.428277 + endloop + endfacet + facet normal 0.637734 -0.231775 0.734558 + outer loop + vertex 0.374867 -0.539527 0.428277 + vertex 0.348914 -0.627609 0.423016 + vertex 0.409256 -0.613992 0.374925 + endloop + endfacet + facet normal 0.61342 -0.252784 0.748209 + outer loop + vertex 0.374867 -0.539527 0.428277 + vertex 0.409256 -0.613992 0.374925 + vertex 0.438655 -0.52918 0.379476 + endloop + endfacet + facet normal 0.00406637 -0.14757 0.989043 + outer loop + vertex -0.327179 -0.714713 0.477961 + vertex -0.327179 -0.815636 0.462903 + vertex -0.224856 -0.812817 0.462903 + endloop + endfacet + facet normal 0.00336262 -0.148288 0.988939 + outer loop + vertex -0.327179 -0.714713 0.477961 + vertex -0.224856 -0.812817 0.462903 + vertex -0.221787 -0.712323 0.477961 + endloop + endfacet + facet normal 0.0175279 -0.148689 0.988729 + outer loop + vertex -0.221787 -0.712323 0.477961 + vertex -0.224856 -0.812817 0.462903 + vertex -0.123532 -0.804713 0.462326 + endloop + endfacet + facet normal 0.0155472 -0.150748 0.98845 + outer loop + vertex -0.221787 -0.712323 0.477961 + vertex -0.123532 -0.804713 0.462326 + vertex -0.117242 -0.70556 0.477348 + endloop + endfacet + facet normal 0.0371758 -0.152004 0.987681 + outer loop + vertex -0.117242 -0.70556 0.477348 + vertex -0.123532 -0.804713 0.462326 + vertex -0.0242058 -0.791678 0.460593 + endloop + endfacet + facet normal 0.0338721 -0.155491 0.987256 + outer loop + vertex -0.117242 -0.70556 0.477348 + vertex -0.0242058 -0.791678 0.460593 + vertex -0.0143905 -0.694831 0.475509 + endloop + endfacet + facet normal 0.0643794 -0.15828 0.985293 + outer loop + vertex -0.0143905 -0.694831 0.475509 + vertex -0.0242058 -0.791678 0.460593 + vertex 0.0721248 -0.774065 0.457128 + endloop + endfacet + facet normal 0.0594066 -0.163581 0.98474 + outer loop + vertex -0.0143905 -0.694831 0.475509 + vertex 0.0721248 -0.774065 0.457128 + vertex 0.08592 -0.680541 0.471832 + endloop + endfacet + facet normal 0.1013 -0.169076 0.980383 + outer loop + vertex 0.08592 -0.680541 0.471832 + vertex 0.0721248 -0.774065 0.457128 + vertex 0.164461 -0.75223 0.451353 + endloop + endfacet + facet normal 0.0938263 -0.177073 0.979715 + outer loop + vertex 0.08592 -0.680541 0.471832 + vertex 0.164461 -0.75223 0.451353 + vertex 0.182843 -0.663098 0.465702 + endloop + endfacet + facet normal 0.208973 -0.197294 0.957813 + outer loop + vertex 0.182843 -0.663098 0.465702 + vertex 0.164461 -0.75223 0.451353 + vertex 0.248628 -0.728883 0.437799 + endloop + endfacet + facet normal 0.197293 -0.208974 0.957813 + outer loop + vertex 0.182843 -0.663098 0.465702 + vertex 0.248628 -0.728883 0.437799 + vertex 0.271975 -0.644716 0.451353 + endloop + endfacet + facet normal 0.405924 -0.253977 0.877907 + outer loop + vertex 0.271975 -0.644716 0.451353 + vertex 0.248628 -0.728883 0.437799 + vertex 0.320452 -0.706736 0.410996 + endloop + endfacet + facet normal 0.3853 -0.272523 0.881632 + outer loop + vertex 0.271975 -0.644716 0.451353 + vertex 0.320452 -0.706736 0.410996 + vertex 0.348914 -0.627609 0.423016 + endloop + endfacet + facet normal 0.658151 -0.338868 0.672314 + outer loop + vertex 0.348914 -0.627609 0.423016 + vertex 0.320452 -0.706736 0.410996 + vertex 0.375982 -0.689658 0.365244 + endloop + endfacet + facet normal 0.62929 -0.364544 0.686369 + outer loop + vertex 0.348914 -0.627609 0.423016 + vertex 0.375982 -0.689658 0.365244 + vertex 0.409256 -0.613992 0.374925 + endloop + endfacet + facet normal 0.0101836 -0.31721 0.948301 + outer loop + vertex -0.327179 -0.815636 0.462903 + vertex -0.327179 -0.903425 0.433537 + vertex -0.227723 -0.900233 0.433537 + endloop + endfacet + facet normal 0.00878137 -0.318691 0.947818 + outer loop + vertex -0.327179 -0.815636 0.462903 + vertex -0.227723 -0.900233 0.433537 + vertex -0.224856 -0.812817 0.462903 + endloop + endfacet + facet normal 0.0352696 -0.319286 0.947002 + outer loop + vertex -0.224856 -0.812817 0.462903 + vertex -0.227723 -0.900233 0.433537 + vertex -0.129404 -0.890932 0.433011 + endloop + endfacet + facet normal 0.0312763 -0.323651 0.945659 + outer loop + vertex -0.224856 -0.812817 0.462903 + vertex -0.129404 -0.890932 0.433011 + vertex -0.123532 -0.804713 0.462326 + endloop + endfacet + facet normal 0.0667361 -0.325254 0.943269 + outer loop + vertex -0.123532 -0.804713 0.462326 + vertex -0.129404 -0.890932 0.433011 + vertex -0.0333602 -0.875802 0.431433 + endloop + endfacet + facet normal 0.0600835 -0.332749 0.941099 + outer loop + vertex -0.123532 -0.804713 0.462326 + vertex -0.0333602 -0.875802 0.431433 + vertex -0.0242058 -0.791678 0.460593 + endloop + endfacet + facet normal 0.106898 -0.335998 0.935777 + outer loop + vertex -0.0242058 -0.791678 0.460593 + vertex -0.0333602 -0.875802 0.431433 + vertex 0.0592716 -0.855122 0.428277 + endloop + endfacet + facet normal 0.0970591 -0.347373 0.932691 + outer loop + vertex -0.0242058 -0.791678 0.460593 + vertex 0.0592716 -0.855122 0.428277 + vertex 0.0721248 -0.774065 0.457128 + endloop + endfacet + facet normal 0.159171 -0.353362 0.921846 + outer loop + vertex 0.0721248 -0.774065 0.457128 + vertex 0.0592716 -0.855122 0.428277 + vertex 0.147354 -0.829169 0.423016 + endloop + endfacet + facet normal 0.144927 -0.370173 0.917588 + outer loop + vertex 0.0721248 -0.774065 0.457128 + vertex 0.147354 -0.829169 0.423016 + vertex 0.164461 -0.75223 0.451353 + endloop + endfacet + facet normal 0.272522 -0.3853 0.881632 + outer loop + vertex 0.164461 -0.75223 0.451353 + vertex 0.147354 -0.829169 0.423016 + vertex 0.226481 -0.800707 0.410996 + endloop + endfacet + facet normal 0.253977 -0.405925 0.877907 + outer loop + vertex 0.164461 -0.75223 0.451353 + vertex 0.226481 -0.800707 0.410996 + vertex 0.248628 -0.728883 0.437799 + endloop + endfacet + facet normal 0.461335 -0.431539 0.775206 + outer loop + vertex 0.248628 -0.728883 0.437799 + vertex 0.226481 -0.800707 0.410996 + vertex 0.292246 -0.772501 0.38756 + endloop + endfacet + facet normal 0.431539 -0.461336 0.775206 + outer loop + vertex 0.248628 -0.728883 0.437799 + vertex 0.292246 -0.772501 0.38756 + vertex 0.320452 -0.706736 0.410996 + endloop + endfacet + facet normal 0.66907 -0.487016 0.561392 + outer loop + vertex 0.320452 -0.706736 0.410996 + vertex 0.292246 -0.772501 0.38756 + vertex 0.341134 -0.751946 0.347126 + endloop + endfacet + facet normal 0.632558 -0.520668 0.573389 + outer loop + vertex 0.320452 -0.706736 0.410996 + vertex 0.341134 -0.751946 0.347126 + vertex 0.375982 -0.689658 0.365244 + endloop + endfacet + facet normal 0.020877 -0.581201 0.813492 + outer loop + vertex -0.327179 -0.903425 0.433537 + vertex -0.327179 -0.972723 0.384027 + vertex -0.230082 -0.969235 0.384027 + endloop + endfacet + facet normal 0.0187257 -0.583289 0.812049 + outer loop + vertex -0.327179 -0.903425 0.433537 + vertex -0.230082 -0.969235 0.384027 + vertex -0.227723 -0.900233 0.433537 + endloop + endfacet + facet normal 0.0662835 -0.583182 0.809633 + outer loop + vertex -0.227723 -0.900233 0.433537 + vertex -0.230082 -0.969235 0.384027 + vertex -0.134214 -0.958971 0.383572 + endloop + endfacet + facet normal 0.0600777 -0.589544 0.805499 + outer loop + vertex -0.227723 -0.900233 0.433537 + vertex -0.134214 -0.958971 0.383572 + vertex -0.129404 -0.890932 0.433011 + endloop + endfacet + facet normal 0.117908 -0.589171 0.799359 + outer loop + vertex -0.129404 -0.890932 0.433011 + vertex -0.134214 -0.958971 0.383572 + vertex -0.0408019 -0.942129 0.382207 + endloop + endfacet + facet normal 0.107582 -0.600267 0.792532 + outer loop + vertex -0.129404 -0.890932 0.433011 + vertex -0.0408019 -0.942129 0.382207 + vertex -0.0333602 -0.875802 0.431433 + endloop + endfacet + facet normal 0.178819 -0.599223 0.780356 + outer loop + vertex -0.0333602 -0.875802 0.431433 + vertex -0.0408019 -0.942129 0.382207 + vertex 0.0489241 -0.91891 0.379476 + endloop + endfacet + facet normal 0.163787 -0.616038 0.7705 + outer loop + vertex -0.0333602 -0.875802 0.431433 + vertex 0.0489241 -0.91891 0.379476 + vertex 0.0592716 -0.855122 0.428277 + endloop + endfacet + facet normal 0.252783 -0.61342 0.748209 + outer loop + vertex 0.0592716 -0.855122 0.428277 + vertex 0.0489241 -0.91891 0.379476 + vertex 0.133736 -0.889511 0.374925 + endloop + endfacet + facet normal 0.231774 -0.637734 0.734558 + outer loop + vertex 0.0592716 -0.855122 0.428277 + vertex 0.133736 -0.889511 0.374925 + vertex 0.147354 -0.829169 0.423016 + endloop + endfacet + facet normal 0.364543 -0.629291 0.686368 + outer loop + vertex 0.147354 -0.829169 0.423016 + vertex 0.133736 -0.889511 0.374925 + vertex 0.209402 -0.856237 0.365244 + endloop + endfacet + facet normal 0.338867 -0.658152 0.672314 + outer loop + vertex 0.147354 -0.829169 0.423016 + vertex 0.209402 -0.856237 0.365244 + vertex 0.226481 -0.800707 0.410996 + endloop + endfacet + facet normal 0.520667 -0.632559 0.573389 + outer loop + vertex 0.226481 -0.800707 0.410996 + vertex 0.209402 -0.856237 0.365244 + vertex 0.271691 -0.821389 0.347126 + endloop + endfacet + facet normal 0.487015 -0.669071 0.561391 + outer loop + vertex 0.226481 -0.800707 0.410996 + vertex 0.271691 -0.821389 0.347126 + vertex 0.292246 -0.772501 0.38756 + endloop + endfacet + facet normal 0.661618 -0.623135 0.41709 + outer loop + vertex 0.292246 -0.772501 0.38756 + vertex 0.271691 -0.821389 0.347126 + vertex 0.312305 -0.79256 0.325773 + endloop + endfacet + facet normal 0.623134 -0.661619 0.41709 + outer loop + vertex 0.292246 -0.772501 0.38756 + vertex 0.312305 -0.79256 0.325773 + vertex 0.341134 -0.751946 0.347126 + endloop + endfacet + facet normal 0.986795 0.0427593 -0.156226 + outer loop + vertex 0.552765 -0.153076 -0.457381 + vertex 0.536469 -0.153076 -0.560317 + vertex 0.532766 -0.0650228 -0.559605 + endloop + endfacet + facet normal 0.986749 0.042245 -0.15666 + outer loop + vertex 0.552765 -0.153076 -0.457381 + vertex 0.532766 -0.0650228 -0.559605 + vertex 0.549001 -0.0633138 -0.456883 + endloop + endfacet + facet normal 0.979297 0.1279 -0.156907 + outer loop + vertex 0.549001 -0.0633138 -0.456883 + vertex 0.532766 -0.0650228 -0.559605 + vertex 0.52167 0.0221176 -0.557825 + endloop + endfacet + facet normal 0.979289 0.126599 -0.158006 + outer loop + vertex 0.549001 -0.0633138 -0.456883 + vertex 0.52167 0.0221176 -0.557825 + vertex 0.537719 0.0255165 -0.455637 + endloop + endfacet + facet normal 0.964023 0.213401 -0.158495 + outer loop + vertex 0.537719 0.0255165 -0.455637 + vertex 0.52167 0.0221176 -0.557825 + vertex 0.503194 0.107432 -0.555333 + endloop + endfacet + facet normal 0.96417 0.211557 -0.160061 + outer loop + vertex 0.537719 0.0255165 -0.455637 + vertex 0.503194 0.107432 -0.555333 + vertex 0.518926 0.112483 -0.453892 + endloop + endfacet + facet normal 0.940346 0.299841 -0.160762 + outer loop + vertex 0.518926 0.112483 -0.453892 + vertex 0.503194 0.107432 -0.555333 + vertex 0.477351 0.190008 -0.552484 + endloop + endfacet + facet normal 0.940708 0.297714 -0.162587 + outer loop + vertex 0.518926 0.112483 -0.453892 + vertex 0.477351 0.190008 -0.552484 + vertex 0.492633 0.196653 -0.451898 + endloop + endfacet + facet normal 0.907257 0.387522 -0.163438 + outer loop + vertex 0.492633 0.196653 -0.451898 + vertex 0.477351 0.190008 -0.552484 + vertex 0.444153 0.268931 -0.549636 + endloop + endfacet + facet normal 0.907829 0.385384 -0.165303 + outer loop + vertex 0.492633 0.196653 -0.451898 + vertex 0.444153 0.268931 -0.549636 + vertex 0.458847 0.277094 -0.449905 + endloop + endfacet + facet normal 0.863428 0.476308 -0.166203 + outer loop + vertex 0.458847 0.277094 -0.449905 + vertex 0.444153 0.268931 -0.549636 + vertex 0.403613 0.34329 -0.547144 + endloop + endfacet + facet normal 0.86413 0.474447 -0.167869 + outer loop + vertex 0.458847 0.277094 -0.449905 + vertex 0.403613 0.34329 -0.547144 + vertex 0.417579 0.352876 -0.44816 + endloop + endfacet + facet normal 0.807358 0.565441 -0.168671 + outer loop + vertex 0.417579 0.352876 -0.44816 + vertex 0.403613 0.34329 -0.547144 + vertex 0.355744 0.41217 -0.545364 + endloop + endfacet + facet normal 0.808013 0.564141 -0.169881 + outer loop + vertex 0.417579 0.352876 -0.44816 + vertex 0.355744 0.41217 -0.545364 + vertex 0.368836 0.423065 -0.446914 + endloop + endfacet + facet normal 0.737627 0.653354 -0.170394 + outer loop + vertex 0.368836 0.423065 -0.446914 + vertex 0.355744 0.41217 -0.545364 + vertex 0.300558 0.47466 -0.544652 + endloop + endfacet + facet normal 0.737952 0.65286 -0.170881 + outer loop + vertex 0.368836 0.423065 -0.446914 + vertex 0.300558 0.47466 -0.544652 + vertex 0.312627 0.48673 -0.446415 + endloop + endfacet + facet normal 0.978082 0.0434599 -0.203632 + outer loop + vertex 0.536469 -0.153076 -0.560317 + vertex 0.516116 -0.153076 -0.658075 + vertex 0.51249 -0.0669691 -0.657112 + endloop + endfacet + facet normal 0.977991 0.0427772 -0.204216 + outer loop + vertex 0.536469 -0.153076 -0.560317 + vertex 0.51249 -0.0669691 -0.657112 + vertex 0.532766 -0.0650228 -0.559605 + endloop + endfacet + facet normal 0.970313 0.129361 -0.204348 + outer loop + vertex 0.532766 -0.0650228 -0.559605 + vertex 0.51249 -0.0669691 -0.657112 + vertex 0.50164 0.0182356 -0.654694 + endloop + endfacet + facet normal 0.970234 0.127744 -0.205738 + outer loop + vertex 0.532766 -0.0650228 -0.559605 + vertex 0.50164 0.0182356 -0.654694 + vertex 0.52167 0.0221176 -0.557825 + endloop + endfacet + facet normal 0.954641 0.214989 -0.206011 + outer loop + vertex 0.52167 0.0221176 -0.557825 + vertex 0.50164 0.0182356 -0.654694 + vertex 0.483593 0.101636 -0.65129 + endloop + endfacet + facet normal 0.95472 0.212829 -0.20788 + outer loop + vertex 0.52167 0.0221176 -0.557825 + vertex 0.483593 0.101636 -0.65129 + vertex 0.503194 0.107432 -0.555333 + endloop + endfacet + facet normal 0.930618 0.300948 -0.20828 + outer loop + vertex 0.503194 0.107432 -0.555333 + vertex 0.483593 0.101636 -0.65129 + vertex 0.458375 0.182328 -0.647371 + endloop + endfacet + facet normal 0.930913 0.298599 -0.210335 + outer loop + vertex 0.503194 0.107432 -0.555333 + vertex 0.458375 0.182328 -0.647371 + vertex 0.477351 0.190008 -0.552484 + endloop + endfacet + facet normal 0.897399 0.387587 -0.210834 + outer loop + vertex 0.477351 0.190008 -0.552484 + vertex 0.458375 0.182328 -0.647371 + vertex 0.426014 0.259412 -0.643408 + endloop + endfacet + facet normal 0.89789 0.385364 -0.212808 + outer loop + vertex 0.477351 0.190008 -0.552484 + vertex 0.426014 0.259412 -0.643408 + vertex 0.444153 0.268931 -0.549636 + endloop + endfacet + facet normal 0.853771 0.474922 -0.213365 + outer loop + vertex 0.444153 0.268931 -0.549636 + vertex 0.426014 0.259412 -0.643408 + vertex 0.386508 0.332001 -0.639916 + endloop + endfacet + facet normal 0.854393 0.473021 -0.215091 + outer loop + vertex 0.444153 0.268931 -0.549636 + vertex 0.386508 0.332001 -0.639916 + vertex 0.403613 0.34329 -0.547144 + endloop + endfacet + facet normal 0.798387 0.562217 -0.215617 + outer loop + vertex 0.403613 0.34329 -0.547144 + vertex 0.386508 0.332001 -0.639916 + vertex 0.339856 0.399212 -0.637409 + endloop + endfacet + facet normal 0.798991 0.560872 -0.216877 + outer loop + vertex 0.403613 0.34329 -0.547144 + vertex 0.339856 0.399212 -0.637409 + vertex 0.355744 0.41217 -0.545364 + endloop + endfacet + facet normal 0.730016 0.647986 -0.217235 + outer loop + vertex 0.355744 0.41217 -0.545364 + vertex 0.339856 0.399212 -0.637409 + vertex 0.286057 0.460159 -0.636401 + endloop + endfacet + facet normal 0.730333 0.647452 -0.217759 + outer loop + vertex 0.355744 0.41217 -0.545364 + vertex 0.286057 0.460159 -0.636401 + vertex 0.300558 0.47466 -0.544652 + endloop + endfacet + facet normal 0.964686 0.0443395 -0.259643 + outer loop + vertex 0.516116 -0.153076 -0.658075 + vertex 0.491272 -0.153076 -0.750381 + vertex 0.487742 -0.0690104 -0.74914 + endloop + endfacet + facet normal 0.964533 0.0435236 -0.260348 + outer loop + vertex 0.516116 -0.153076 -0.658075 + vertex 0.487742 -0.0690104 -0.74914 + vertex 0.51249 -0.0669691 -0.657112 + endloop + endfacet + facet normal 0.95664 0.130971 -0.260165 + outer loop + vertex 0.51249 -0.0669691 -0.657112 + vertex 0.487742 -0.0690104 -0.74914 + vertex 0.477214 0.0141425 -0.745993 + endloop + endfacet + facet normal 0.956462 0.129225 -0.261688 + outer loop + vertex 0.51249 -0.0669691 -0.657112 + vertex 0.477214 0.0141425 -0.745993 + vertex 0.50164 0.0182356 -0.654694 + endloop + endfacet + facet normal 0.940667 0.216405 -0.261371 + outer loop + vertex 0.50164 0.0182356 -0.654694 + vertex 0.477214 0.0141425 -0.745993 + vertex 0.459748 0.0954698 -0.741516 + endloop + endfacet + facet normal 0.940631 0.214292 -0.263233 + outer loop + vertex 0.50164 0.0182356 -0.654694 + vertex 0.459748 0.0954698 -0.741516 + vertex 0.483593 0.101636 -0.65129 + endloop + endfacet + facet normal 0.916564 0.301388 -0.262824 + outer loop + vertex 0.483593 0.101636 -0.65129 + vertex 0.459748 0.0954698 -0.741516 + vertex 0.435406 0.174058 -0.736286 + endloop + endfacet + facet normal 0.916709 0.299338 -0.264653 + outer loop + vertex 0.483593 0.101636 -0.65129 + vertex 0.435406 0.174058 -0.736286 + vertex 0.458375 0.182328 -0.647371 + endloop + endfacet + facet normal 0.883649 0.386465 -0.264216 + outer loop + vertex 0.458375 0.182328 -0.647371 + vertex 0.435406 0.174058 -0.736286 + vertex 0.404249 0.248996 -0.730878 + endloop + endfacet + facet normal 0.88393 0.384757 -0.265762 + outer loop + vertex 0.458375 0.182328 -0.647371 + vertex 0.404249 0.248996 -0.730878 + vertex 0.426014 0.259412 -0.643408 + endloop + endfacet + facet normal 0.840708 0.471991 -0.265396 + outer loop + vertex 0.426014 0.259412 -0.643408 + vertex 0.404249 0.248996 -0.730878 + vertex 0.366226 0.31944 -0.726046 + endloop + endfacet + facet normal 0.841086 0.470584 -0.266691 + outer loop + vertex 0.426014 0.259412 -0.643408 + vertex 0.366226 0.31944 -0.726046 + vertex 0.386508 0.332001 -0.639916 + endloop + endfacet + facet normal 0.786469 0.557194 -0.266462 + outer loop + vertex 0.386508 0.332001 -0.639916 + vertex 0.366226 0.31944 -0.726046 + vertex 0.321285 0.384548 -0.722544 + endloop + endfacet + facet normal 0.786871 0.556156 -0.267439 + outer loop + vertex 0.386508 0.332001 -0.639916 + vertex 0.321285 0.384548 -0.722544 + vertex 0.339856 0.399212 -0.637409 + endloop + endfacet + facet normal 0.719871 0.64055 -0.267361 + outer loop + vertex 0.339856 0.399212 -0.637409 + vertex 0.321285 0.384548 -0.722544 + vertex 0.269375 0.443478 -0.721126 + endloop + endfacet + facet normal 0.720117 0.640084 -0.267814 + outer loop + vertex 0.339856 0.399212 -0.637409 + vertex 0.269375 0.443478 -0.721126 + vertex 0.286057 0.460159 -0.636401 + endloop + endfacet + facet normal 0.944684 0.0453633 -0.324828 + outer loop + vertex 0.491272 -0.153076 -0.750381 + vertex 0.461502 -0.153076 -0.836959 + vertex 0.458089 -0.0710042 -0.835423 + endloop + endfacet + facet normal 0.944459 0.044464 -0.325608 + outer loop + vertex 0.491272 -0.153076 -0.750381 + vertex 0.458089 -0.0710042 -0.835423 + vertex 0.487742 -0.0690104 -0.74914 + endloop + endfacet + facet normal 0.936416 0.13258 -0.32488 + outer loop + vertex 0.487742 -0.0690104 -0.74914 + vertex 0.458089 -0.0710042 -0.835423 + vertex 0.447976 0.0101106 -0.831472 + endloop + endfacet + facet normal 0.936134 0.130881 -0.326378 + outer loop + vertex 0.487742 -0.0690104 -0.74914 + vertex 0.447976 0.0101106 -0.831472 + vertex 0.477214 0.0141425 -0.745993 + endloop + endfacet + facet normal 0.92037 0.217376 -0.325065 + outer loop + vertex 0.477214 0.0141425 -0.745993 + vertex 0.447976 0.0101106 -0.831472 + vertex 0.431286 0.0893112 -0.825763 + endloop + endfacet + facet normal 0.920225 0.215608 -0.326648 + outer loop + vertex 0.477214 0.0141425 -0.745993 + vertex 0.431286 0.0893112 -0.825763 + vertex 0.459748 0.0954698 -0.741516 + endloop + endfacet + facet normal 0.896631 0.300814 -0.324906 + outer loop + vertex 0.459748 0.0954698 -0.741516 + vertex 0.431286 0.0893112 -0.825763 + vertex 0.408146 0.16564 -0.818953 + endloop + endfacet + facet normal 0.896637 0.299431 -0.326163 + outer loop + vertex 0.459748 0.0954698 -0.741516 + vertex 0.408146 0.16564 -0.818953 + vertex 0.435406 0.174058 -0.736286 + endloop + endfacet + facet normal 0.864617 0.383838 -0.3242 + outer loop + vertex 0.435406 0.174058 -0.736286 + vertex 0.408146 0.16564 -0.818953 + vertex 0.37868 0.238141 -0.8117 + endloop + endfacet + facet normal 0.864701 0.382973 -0.324998 + outer loop + vertex 0.435406 0.174058 -0.736286 + vertex 0.37868 0.238141 -0.8117 + vertex 0.404249 0.248996 -0.730878 + endloop + endfacet + facet normal 0.823009 0.467174 -0.323116 + outer loop + vertex 0.404249 0.248996 -0.730878 + vertex 0.37868 0.238141 -0.8117 + vertex 0.342731 0.306032 -0.805104 + endloop + endfacet + facet normal 0.823142 0.466511 -0.323736 + outer loop + vertex 0.404249 0.248996 -0.730878 + vertex 0.342731 0.306032 -0.805104 + vertex 0.366226 0.31944 -0.726046 + endloop + endfacet + facet normal 0.770523 0.549954 -0.322249 + outer loop + vertex 0.366226 0.31944 -0.726046 + vertex 0.342731 0.306032 -0.805104 + vertex 0.300145 0.368534 -0.800266 + endloop + endfacet + facet normal 0.770715 0.549351 -0.322819 + outer loop + vertex 0.366226 0.31944 -0.726046 + vertex 0.300145 0.368534 -0.800266 + vertex 0.321285 0.384548 -0.722544 + endloop + endfacet + facet normal 0.706286 0.630455 -0.322005 + outer loop + vertex 0.321285 0.384548 -0.722544 + vertex 0.300145 0.368534 -0.800266 + vertex 0.250764 0.424866 -0.798286 + endloop + endfacet + facet normal 0.706464 0.630065 -0.322378 + outer loop + vertex 0.321285 0.384548 -0.722544 + vertex 0.250764 0.424866 -0.798286 + vertex 0.269375 0.443478 -0.721126 + endloop + endfacet + facet normal 0.915674 0.0464682 -0.399228 + outer loop + vertex 0.461502 -0.153076 -0.836959 + vertex 0.426371 -0.153076 -0.917536 + vertex 0.423099 -0.0728081 -0.915698 + endloop + endfacet + facet normal 0.915375 0.0455517 -0.400016 + outer loop + vertex 0.461502 -0.153076 -0.836959 + vertex 0.423099 -0.0728081 -0.915698 + vertex 0.458089 -0.0710042 -0.835423 + endloop + endfacet + facet normal 0.907322 0.134047 -0.398495 + outer loop + vertex 0.458089 -0.0710042 -0.835423 + vertex 0.423099 -0.0728081 -0.915698 + vertex 0.413511 0.00641203 -0.910881 + endloop + endfacet + facet normal 0.906962 0.132558 -0.39981 + outer loop + vertex 0.458089 -0.0710042 -0.835423 + vertex 0.413511 0.00641203 -0.910881 + vertex 0.447976 0.0101106 -0.831472 + endloop + endfacet + facet normal 0.891565 0.217775 -0.397097 + outer loop + vertex 0.447976 0.0101106 -0.831472 + vertex 0.413511 0.00641203 -0.910881 + vertex 0.397834 0.0835363 -0.903784 + endloop + endfacet + facet normal 0.891367 0.216537 -0.398217 + outer loop + vertex 0.447976 0.0101106 -0.831472 + vertex 0.397834 0.0835363 -0.903784 + vertex 0.431286 0.0893112 -0.825763 + endloop + endfacet + facet normal 0.868747 0.29923 -0.394639 + outer loop + vertex 0.431286 0.0893112 -0.825763 + vertex 0.397834 0.0835363 -0.903784 + vertex 0.376296 0.157517 -0.895101 + endloop + endfacet + facet normal 0.868701 0.298618 -0.395204 + outer loop + vertex 0.431286 0.0893112 -0.825763 + vertex 0.376296 0.157517 -0.895101 + vertex 0.408146 0.16564 -0.818953 + endloop + endfacet + facet normal 0.83823 0.379976 -0.391138 + outer loop + vertex 0.408146 0.16564 -0.818953 + vertex 0.376296 0.157517 -0.895101 + vertex 0.349125 0.227306 -0.885532 + endloop + endfacet + facet normal 0.838232 0.379826 -0.39128 + outer loop + vertex 0.408146 0.16564 -0.818953 + vertex 0.349125 0.227306 -0.885532 + vertex 0.37868 0.238141 -0.8117 + endloop + endfacet + facet normal 0.798606 0.460693 -0.387286 + outer loop + vertex 0.37868 0.238141 -0.8117 + vertex 0.349125 0.227306 -0.885532 + vertex 0.315988 0.292208 -0.876659 + endloop + endfacet + facet normal 0.798627 0.460515 -0.387454 + outer loop + vertex 0.37868 0.238141 -0.8117 + vertex 0.315988 0.292208 -0.876659 + vertex 0.342731 0.306032 -0.805104 + endloop + endfacet + facet normal 0.748594 0.54038 -0.384184 + outer loop + vertex 0.342731 0.306032 -0.805104 + vertex 0.315988 0.292208 -0.876659 + vertex 0.276548 0.35153 -0.870068 + endloop + endfacet + facet normal 0.748704 0.539916 -0.384621 + outer loop + vertex 0.342731 0.306032 -0.805104 + vertex 0.276548 0.35153 -0.870068 + vertex 0.300145 0.368534 -0.800266 + endloop + endfacet + facet normal 0.687654 0.616955 -0.382751 + outer loop + vertex 0.300145 0.368534 -0.800266 + vertex 0.276548 0.35153 -0.870068 + vertex 0.230473 0.404576 -0.867343 + endloop + endfacet + facet normal 0.687848 0.616443 -0.383228 + outer loop + vertex 0.300145 0.368534 -0.800266 + vertex 0.230473 0.404576 -0.867343 + vertex 0.250764 0.424866 -0.798286 + endloop + endfacet + facet normal 0.874919 0.0475438 -0.48193 + outer loop + vertex 0.426371 -0.153076 -0.917536 + vertex 0.385445 -0.153076 -0.991836 + vertex 0.38234 -0.0742797 -0.9897 + endloop + endfacet + facet normal 0.874574 0.0467026 -0.482638 + outer loop + vertex 0.426371 -0.153076 -0.917536 + vertex 0.38234 -0.0742797 -0.9897 + vertex 0.423099 -0.0728081 -0.915698 + endloop + endfacet + facet normal 0.866719 0.135378 -0.480074 + outer loop + vertex 0.423099 -0.0728081 -0.915698 + vertex 0.38234 -0.0742797 -0.9897 + vertex 0.373376 0.00336324 -0.983989 + endloop + endfacet + facet normal 0.8663 0.134109 -0.481184 + outer loop + vertex 0.423099 -0.0728081 -0.915698 + vertex 0.373376 0.00336324 -0.983989 + vertex 0.413511 0.00641203 -0.910881 + endloop + endfacet + facet normal 0.851656 0.217935 -0.47664 + outer loop + vertex 0.413511 0.00641203 -0.910881 + vertex 0.373376 0.00336324 -0.983989 + vertex 0.358904 0.0786992 -0.9754 + endloop + endfacet + facet normal 0.851423 0.217013 -0.477476 + outer loop + vertex 0.413511 0.00641203 -0.910881 + vertex 0.358904 0.0786992 -0.9754 + vertex 0.397834 0.0835363 -0.903784 + endloop + endfacet + facet normal 0.830275 0.297354 -0.471407 + outer loop + vertex 0.397834 0.0835363 -0.903784 + vertex 0.358904 0.0786992 -0.9754 + vertex 0.339276 0.150575 -0.964632 + endloop + endfacet + facet normal 0.830223 0.297057 -0.471685 + outer loop + vertex 0.397834 0.0835363 -0.903784 + vertex 0.339276 0.150575 -0.964632 + vertex 0.376296 0.157517 -0.895101 + endloop + endfacet + facet normal 0.801874 0.375867 -0.46446 + outer loop + vertex 0.376296 0.157517 -0.895101 + vertex 0.339276 0.150575 -0.964632 + vertex 0.314844 0.217836 -0.952382 + endloop + endfacet + facet normal 0.801874 0.375875 -0.464452 + outer loop + vertex 0.376296 0.157517 -0.895101 + vertex 0.314844 0.217836 -0.952382 + vertex 0.349125 0.227306 -0.885532 + endloop + endfacet + facet normal 0.765917 0.452391 -0.456851 + outer loop + vertex 0.349125 0.227306 -0.885532 + vertex 0.314844 0.217836 -0.952382 + vertex 0.285382 0.279631 -0.940583 + endloop + endfacet + facet normal 0.765903 0.453375 -0.455899 + outer loop + vertex 0.349125 0.227306 -0.885532 + vertex 0.285382 0.279631 -0.940583 + vertex 0.315988 0.292208 -0.876659 + endloop + endfacet + facet normal 0.72117 0.527498 -0.449066 + outer loop + vertex 0.315988 0.292208 -0.876659 + vertex 0.285382 0.279631 -0.940583 + vertex 0.250666 0.335108 -0.931169 + endloop + endfacet + facet normal 0.720954 0.529048 -0.447586 + outer loop + vertex 0.315988 0.292208 -0.876659 + vertex 0.250666 0.335108 -0.931169 + vertex 0.276548 0.35153 -0.870068 + endloop + endfacet + facet normal 0.665529 0.600462 -0.443302 + outer loop + vertex 0.276548 0.35153 -0.870068 + vertex 0.250666 0.335108 -0.931169 + vertex 0.209579 0.383682 -0.927058 + endloop + endfacet + facet normal 0.665441 0.600758 -0.443032 + outer loop + vertex 0.276548 0.35153 -0.870068 + vertex 0.209579 0.383682 -0.927058 + vertex 0.230473 0.404576 -0.867343 + endloop + endfacet + facet normal 0.819786 0.048414 -0.57062 + outer loop + vertex 0.385445 -0.153076 -0.991836 + vertex 0.338288 -0.153076 -1.05958 + vertex 0.335378 -0.0752766 -1.05716 + endloop + endfacet + facet normal 0.819466 0.0477769 -0.571133 + outer loop + vertex 0.385445 -0.153076 -0.991836 + vertex 0.335378 -0.0752766 -1.05716 + vertex 0.38234 -0.0742797 -0.9897 + endloop + endfacet + facet normal 0.812111 0.136457 -0.567323 + outer loop + vertex 0.38234 -0.0742797 -0.9897 + vertex 0.335378 -0.0752766 -1.05716 + vertex 0.327127 0.00128075 -1.05056 + endloop + endfacet + facet normal 0.811702 0.135503 -0.568137 + outer loop + vertex 0.38234 -0.0742797 -0.9897 + vertex 0.327127 0.00128075 -1.05056 + vertex 0.373376 0.00336324 -0.983989 + endloop + endfacet + facet normal 0.798289 0.218088 -0.561402 + outer loop + vertex 0.373376 0.00336324 -0.983989 + vertex 0.327127 0.00128075 -1.05056 + vertex 0.314011 0.0753537 -1.04044 + endloop + endfacet + facet normal 0.798032 0.21737 -0.562046 + outer loop + vertex 0.373376 0.00336324 -0.983989 + vertex 0.314011 0.0753537 -1.04044 + vertex 0.358904 0.0786992 -0.9754 + endloop + endfacet + facet normal 0.778939 0.295889 -0.552906 + outer loop + vertex 0.358904 0.0786992 -0.9754 + vertex 0.314011 0.0753537 -1.04044 + vertex 0.296508 0.1457 -1.02745 + endloop + endfacet + facet normal 0.778845 0.295565 -0.55321 + outer loop + vertex 0.358904 0.0786992 -0.9754 + vertex 0.296508 0.1457 -1.02745 + vertex 0.339276 0.150575 -0.964632 + endloop + endfacet + facet normal 0.753358 0.372643 -0.541838 + outer loop + vertex 0.339276 0.150575 -0.964632 + vertex 0.296508 0.1457 -1.02745 + vertex 0.275094 0.211078 -1.01226 + endloop + endfacet + facet normal 0.753299 0.372365 -0.542111 + outer loop + vertex 0.339276 0.150575 -0.964632 + vertex 0.275094 0.211078 -1.01226 + vertex 0.314844 0.217836 -0.952382 + endloop + endfacet + facet normal 0.722684 0.443829 -0.529853 + outer loop + vertex 0.314844 0.217836 -0.952382 + vertex 0.275094 0.211078 -1.01226 + vertex 0.250302 0.269966 -0.996746 + endloop + endfacet + facet normal 0.722881 0.445493 -0.528185 + outer loop + vertex 0.314844 0.217836 -0.952382 + vertex 0.250302 0.269966 -0.996746 + vertex 0.285382 0.279631 -0.940583 + endloop + endfacet + facet normal 0.685106 0.513821 -0.51635 + outer loop + vertex 0.285382 0.279631 -0.940583 + vertex 0.250302 0.269966 -0.996746 + vertex 0.222668 0.320843 -0.982784 + endloop + endfacet + facet normal 0.685089 0.515975 -0.51422 + outer loop + vertex 0.285382 0.279631 -0.940583 + vertex 0.222668 0.320843 -0.982784 + vertex 0.250666 0.335108 -0.931169 + endloop + endfacet + facet normal 0.63674 0.581694 -0.506157 + outer loop + vertex 0.250666 0.335108 -0.931169 + vertex 0.222668 0.320843 -0.982784 + vertex 0.189158 0.363261 -0.976191 + endloop + endfacet + facet normal 0.636782 0.581482 -0.506346 + outer loop + vertex 0.250666 0.335108 -0.931169 + vertex 0.189158 0.363261 -0.976191 + vertex 0.209579 0.383682 -0.927058 + endloop + endfacet + facet normal 0.748534 0.048843 -0.661295 + outer loop + vertex 0.338288 -0.153076 -1.05958 + vertex 0.284465 -0.153076 -1.12051 + vertex 0.281783 -0.0756563 -1.11783 + endloop + endfacet + facet normal 0.748372 0.0485716 -0.661499 + outer loop + vertex 0.338288 -0.153076 -1.05958 + vertex 0.281783 -0.0756563 -1.11783 + vertex 0.335378 -0.0752766 -1.05716 + endloop + endfacet + facet normal 0.741914 0.13701 -0.656347 + outer loop + vertex 0.335378 -0.0752766 -1.05716 + vertex 0.281783 -0.0756563 -1.11783 + vertex 0.274322 0.000481101 -1.11037 + endloop + endfacet + facet normal 0.741682 0.136575 -0.6567 + outer loop + vertex 0.335378 -0.0752766 -1.05716 + vertex 0.274322 0.000481101 -1.11037 + vertex 0.327127 0.00128075 -1.05056 + endloop + endfacet + facet normal 0.730102 0.218198 -0.647566 + outer loop + vertex 0.327127 0.00128075 -1.05056 + vertex 0.274322 0.000481101 -1.11037 + vertex 0.262669 0.0740539 -1.09871 + endloop + endfacet + facet normal 0.729915 0.217805 -0.647908 + outer loop + vertex 0.327127 0.00128075 -1.05056 + vertex 0.262669 0.0740539 -1.09871 + vertex 0.314011 0.0753537 -1.04044 + endloop + endfacet + facet normal 0.71363 0.295197 -0.635288 + outer loop + vertex 0.314011 0.0753537 -1.04044 + vertex 0.262669 0.0740539 -1.09871 + vertex 0.247411 0.14378 -1.08345 + endloop + endfacet + facet normal 0.713493 0.29487 -0.635594 + outer loop + vertex 0.314011 0.0753537 -1.04044 + vertex 0.247411 0.14378 -1.08345 + vertex 0.296508 0.1457 -1.02745 + endloop + endfacet + facet normal 0.691939 0.371044 -0.619311 + outer loop + vertex 0.296508 0.1457 -1.02745 + vertex 0.247411 0.14378 -1.08345 + vertex 0.229132 0.208376 -1.06518 + endloop + endfacet + facet normal 0.691768 0.370577 -0.619782 + outer loop + vertex 0.296508 0.1457 -1.02745 + vertex 0.229132 0.208376 -1.06518 + vertex 0.275094 0.211078 -1.01226 + endloop + endfacet + facet normal 0.667106 0.439021 -0.601855 + outer loop + vertex 0.275094 0.211078 -1.01226 + vertex 0.229132 0.208376 -1.06518 + vertex 0.209244 0.265861 -1.04529 + endloop + endfacet + facet normal 0.667205 0.43935 -0.601506 + outer loop + vertex 0.275094 0.211078 -1.01226 + vertex 0.209244 0.265861 -1.04529 + vertex 0.250302 0.269966 -0.996746 + endloop + endfacet + facet normal 0.637047 0.505853 -0.581622 + outer loop + vertex 0.250302 0.269966 -0.996746 + vertex 0.209244 0.265861 -1.04529 + vertex 0.189158 0.31425 -1.0252 + endloop + endfacet + facet normal 0.637008 0.505665 -0.581828 + outer loop + vertex 0.250302 0.269966 -0.996746 + vertex 0.189158 0.31425 -1.0252 + vertex 0.222668 0.320843 -0.982784 + endloop + endfacet + facet normal 0.600568 0.568022 -0.562734 + outer loop + vertex 0.222668 0.320843 -0.982784 + vertex 0.189158 0.31425 -1.0252 + vertex 0.173079 0.347181 -1.00912 + endloop + endfacet + facet normal 0.600568 0.562734 -0.568021 + outer loop + vertex 0.222668 0.320843 -0.982784 + vertex 0.173079 0.347181 -1.00912 + vertex 0.189158 0.363261 -0.976191 + endloop + endfacet + facet normal 0.992246 0.0422546 -0.116889 + outer loop + vertex 0.552765 -0.153076 -0.457381 + vertex 0.549001 -0.0633138 -0.456883 + vertex 0.561629 -0.0619847 -0.34921 + endloop + endfacet + facet normal 0.992289 0.0419425 -0.116629 + outer loop + vertex 0.552765 -0.153076 -0.457381 + vertex 0.561629 -0.0619847 -0.34921 + vertex 0.56544 -0.153076 -0.349542 + endloop + endfacet + facet normal 0.995935 0.0419603 -0.079708 + outer loop + vertex 0.56544 -0.153076 -0.349542 + vertex 0.561629 -0.0619847 -0.34921 + vertex 0.570497 -0.0609672 -0.237864 + endloop + endfacet + facet normal 0.995958 0.0417472 -0.0795333 + outer loop + vertex 0.56544 -0.153076 -0.349542 + vertex 0.570497 -0.0609672 -0.237864 + vertex 0.574342 -0.153076 -0.238072 + endloop + endfacet + facet normal 0.998167 0.0417589 -0.0437983 + outer loop + vertex 0.574342 -0.153076 -0.238072 + vertex 0.570497 -0.0609672 -0.237864 + vertex 0.575456 -0.0601934 -0.124123 + endloop + endfacet + facet normal 0.998183 0.0415597 -0.043636 + outer loop + vertex 0.574342 -0.153076 -0.238072 + vertex 0.575456 -0.0601934 -0.124123 + vertex 0.579318 -0.153076 -0.124242 + endloop + endfacet + facet normal 0.999104 0.0415525 -0.00802094 + outer loop + vertex 0.579318 -0.153076 -0.124242 + vertex 0.575456 -0.0601934 -0.124123 + vertex 0.576353 -0.0595952 -0.00926336 + endloop + endfacet + facet normal 0.999116 0.0412978 -0.00781355 + outer loop + vertex 0.579318 -0.153076 -0.124242 + vertex 0.576353 -0.0595952 -0.00926336 + vertex 0.580216 -0.153076 -0.0093227 + endloop + endfacet + facet normal 0.998737 0.0412589 0.0286887 + outer loop + vertex 0.580216 -0.153076 -0.0093227 + vertex 0.576353 -0.0595952 -0.00926336 + vertex 0.573038 -0.0591045 0.105437 + endloop + endfacet + facet normal 0.998743 0.0408892 0.0289919 + outer loop + vertex 0.580216 -0.153076 -0.0093227 + vertex 0.573038 -0.0591045 0.105437 + vertex 0.576886 -0.153076 0.105413 + endloop + endfacet + facet normal 0.992678 0.0406194 0.113756 + outer loop + vertex 0.576886 -0.153076 0.105413 + vertex 0.573038 -0.0591045 0.105437 + vertex 0.560627 -0.0584916 0.213522 + endloop + endfacet + facet normal 0.99263 0.039812 0.114456 + outer loop + vertex 0.576886 -0.153076 0.105413 + vertex 0.560627 -0.0584916 0.213522 + vertex 0.564421 -0.153076 0.213516 + endloop + endfacet + facet normal 0.962906 0.0386101 0.267062 + outer loop + vertex 0.564421 -0.153076 0.213516 + vertex 0.560627 -0.0584916 0.213522 + vertex 0.534235 -0.0575264 0.308537 + endloop + endfacet + facet normal 0.962569 0.0370842 0.268489 + outer loop + vertex 0.564421 -0.153076 0.213516 + vertex 0.534235 -0.0575264 0.308537 + vertex 0.537917 -0.153076 0.308537 + endloop + endfacet + facet normal 0.857519 0.033037 0.513391 + outer loop + vertex 0.537917 -0.153076 0.308537 + vertex 0.534235 -0.0575264 0.308537 + vertex 0.48898 -0.0559793 0.384027 + endloop + endfacet + facet normal 0.856314 0.0307594 0.515539 + outer loop + vertex 0.537917 -0.153076 0.308537 + vertex 0.48898 -0.0559793 0.384027 + vertex 0.492468 -0.153076 0.384027 + endloop + endfacet + facet normal 0.984922 0.12675 -0.117744 + outer loop + vertex 0.549001 -0.0633138 -0.456883 + vertex 0.537719 0.0255165 -0.455637 + vertex 0.550201 0.02816 -0.348379 + endloop + endfacet + facet normal 0.985101 0.125964 -0.117084 + outer loop + vertex 0.549001 -0.0633138 -0.456883 + vertex 0.550201 0.02816 -0.348379 + vertex 0.561629 -0.0619847 -0.34921 + endloop + endfacet + facet normal 0.988756 0.126089 -0.0803902 + outer loop + vertex 0.561629 -0.0619847 -0.34921 + vertex 0.550201 0.02816 -0.348379 + vertex 0.55897 0.0301767 -0.237353 + endloop + endfacet + facet normal 0.988869 0.125508 -0.0799087 + outer loop + vertex 0.561629 -0.0619847 -0.34921 + vertex 0.55897 0.0301767 -0.237353 + vertex 0.570497 -0.0609672 -0.237864 + endloop + endfacet + facet normal 0.991081 0.12559 -0.0445669 + outer loop + vertex 0.570497 -0.0609672 -0.237864 + vertex 0.55897 0.0301767 -0.237353 + vertex 0.563882 0.031695 -0.123858 + endloop + endfacet + facet normal 0.991181 0.124973 -0.0440598 + outer loop + vertex 0.570497 -0.0609672 -0.237864 + vertex 0.563882 0.031695 -0.123858 + vertex 0.575456 -0.0601934 -0.124123 + endloop + endfacet + facet normal 0.992116 0.12499 -0.00909636 + outer loop + vertex 0.575456 -0.0601934 -0.124123 + vertex 0.563882 0.031695 -0.123858 + vertex 0.564788 0.0328432 -0.00919506 + endloop + endfacet + facet normal 0.992229 0.12414 -0.00839736 + outer loop + vertex 0.575456 -0.0601934 -0.124123 + vertex 0.564788 0.0328432 -0.00919506 + vertex 0.576353 -0.0595952 -0.00926336 + endloop + endfacet + facet normal 0.991903 0.124072 0.0271125 + outer loop + vertex 0.576353 -0.0595952 -0.00926336 + vertex 0.564788 0.0328432 -0.00919506 + vertex 0.561544 0.0337499 0.105336 + endloop + endfacet + facet normal 0.992029 0.122824 0.028146 + outer loop + vertex 0.576353 -0.0595952 -0.00926336 + vertex 0.561544 0.0337499 0.105336 + vertex 0.573038 -0.0591045 0.105437 + endloop + endfacet + facet normal 0.986356 0.122211 0.110304 + outer loop + vertex 0.573038 -0.0591045 0.105437 + vertex 0.561544 0.0337499 0.105336 + vertex 0.54933 0.0349018 0.213278 + endloop + endfacet + facet normal 0.986417 0.119604 0.11259 + outer loop + vertex 0.573038 -0.0591045 0.105437 + vertex 0.54933 0.0349018 0.213278 + vertex 0.560627 -0.0584916 0.213522 + endloop + endfacet + facet normal 0.958457 0.116607 0.260313 + outer loop + vertex 0.560627 -0.0584916 0.213522 + vertex 0.54933 0.0349018 0.213278 + vertex 0.523327 0.036786 0.308176 + endloop + endfacet + facet normal 0.957776 0.11179 0.264894 + outer loop + vertex 0.560627 -0.0584916 0.213522 + vertex 0.523327 0.036786 0.308176 + vertex 0.534235 -0.0575264 0.308537 + endloop + endfacet + facet normal 0.858035 0.101168 0.503528 + outer loop + vertex 0.534235 -0.0575264 0.308537 + vertex 0.523327 0.036786 0.308176 + vertex 0.478716 0.0398893 0.383572 + endloop + endfacet + facet normal 0.854744 0.0939381 0.510479 + outer loop + vertex 0.534235 -0.0575264 0.308537 + vertex 0.478716 0.0398893 0.383572 + vertex 0.48898 -0.0559793 0.384027 + endloop + endfacet + facet normal 0.969991 0.211993 -0.119066 + outer loop + vertex 0.537719 0.0255165 -0.455637 + vertex 0.518926 0.112483 -0.453892 + vertex 0.531162 0.116411 -0.347216 + endloop + endfacet + facet normal 0.970346 0.210893 -0.118122 + outer loop + vertex 0.537719 0.0255165 -0.455637 + vertex 0.531162 0.116411 -0.347216 + vertex 0.550201 0.02816 -0.348379 + endloop + endfacet + facet normal 0.974038 0.211207 -0.0815011 + outer loop + vertex 0.550201 0.02816 -0.348379 + vertex 0.531162 0.116411 -0.347216 + vertex 0.539767 0.11939 -0.23665 + endloop + endfacet + facet normal 0.974284 0.210349 -0.0807775 + outer loop + vertex 0.550201 0.02816 -0.348379 + vertex 0.539767 0.11939 -0.23665 + vertex 0.55897 0.0301767 -0.237353 + endloop + endfacet + facet normal 0.976505 0.210552 -0.0458906 + outer loop + vertex 0.55897 0.0301767 -0.237353 + vertex 0.539767 0.11939 -0.23665 + vertex 0.544608 0.121594 -0.123539 + endloop + endfacet + facet normal 0.976754 0.20957 -0.0450704 + outer loop + vertex 0.55897 0.0301767 -0.237353 + vertex 0.544608 0.121594 -0.123539 + vertex 0.563882 0.031695 -0.123858 + endloop + endfacet + facet normal 0.977714 0.209655 -0.0109858 + outer loop + vertex 0.563882 0.031695 -0.123858 + vertex 0.544608 0.121594 -0.123539 + vertex 0.545549 0.123196 -0.00922753 + endloop + endfacet + facet normal 0.978025 0.208255 -0.00981876 + outer loop + vertex 0.563882 0.031695 -0.123858 + vertex 0.545549 0.123196 -0.00922753 + vertex 0.564788 0.0328432 -0.00919506 + endloop + endfacet + facet normal 0.97778 0.208215 0.0243506 + outer loop + vertex 0.564788 0.0328432 -0.00919506 + vertex 0.545549 0.123196 -0.00922753 + vertex 0.542456 0.124369 0.104939 + endloop + endfacet + facet normal 0.978171 0.206162 0.0260737 + outer loop + vertex 0.564788 0.0328432 -0.00919506 + vertex 0.542456 0.124369 0.104939 + vertex 0.561544 0.0337499 0.105336 + endloop + endfacet + facet normal 0.973116 0.205439 0.104119 + outer loop + vertex 0.561544 0.0337499 0.105336 + vertex 0.542456 0.124369 0.104939 + vertex 0.530619 0.125913 0.212524 + endloop + endfacet + facet normal 0.973604 0.201067 0.108019 + outer loop + vertex 0.561544 0.0337499 0.105336 + vertex 0.530619 0.125913 0.212524 + vertex 0.54933 0.0349018 0.213278 + endloop + endfacet + facet normal 0.948502 0.197066 0.248009 + outer loop + vertex 0.54933 0.0349018 0.213278 + vertex 0.530619 0.125913 0.212524 + vertex 0.505328 0.128624 0.307092 + endloop + endfacet + facet normal 0.948048 0.188828 0.256027 + outer loop + vertex 0.54933 0.0349018 0.213278 + vertex 0.505328 0.128624 0.307092 + vertex 0.523327 0.036786 0.308176 + endloop + endfacet + facet normal 0.857086 0.173704 0.485006 + outer loop + vertex 0.523327 0.036786 0.308176 + vertex 0.505328 0.128624 0.307092 + vertex 0.461875 0.133301 0.382207 + endloop + endfacet + facet normal 0.852302 0.160939 0.497675 + outer loop + vertex 0.523327 0.036786 0.308176 + vertex 0.461875 0.133301 0.382207 + vertex 0.478716 0.0398893 0.383572 + endloop + endfacet + facet normal 0.946715 0.298598 -0.120702 + outer loop + vertex 0.518926 0.112483 -0.453892 + vertex 0.492633 0.196653 -0.451898 + vertex 0.504519 0.201821 -0.345887 + endloop + endfacet + facet normal 0.947247 0.297353 -0.1196 + outer loop + vertex 0.518926 0.112483 -0.453892 + vertex 0.504519 0.201821 -0.345887 + vertex 0.531162 0.116411 -0.347216 + endloop + endfacet + facet normal 0.950974 0.297945 -0.0829253 + outer loop + vertex 0.531162 0.116411 -0.347216 + vertex 0.504519 0.201821 -0.345887 + vertex 0.512894 0.205708 -0.235868 + endloop + endfacet + facet normal 0.951368 0.29693 -0.0820466 + outer loop + vertex 0.531162 0.116411 -0.347216 + vertex 0.512894 0.205708 -0.235868 + vertex 0.539767 0.11939 -0.23665 + endloop + endfacet + facet normal 0.953592 0.29731 -0.0476354 + outer loop + vertex 0.539767 0.11939 -0.23665 + vertex 0.512894 0.205708 -0.235868 + vertex 0.517646 0.20851 -0.123256 + endloop + endfacet + facet normal 0.954022 0.296093 -0.0465952 + outer loop + vertex 0.539767 0.11939 -0.23665 + vertex 0.517646 0.20851 -0.123256 + vertex 0.544608 0.121594 -0.123539 + endloop + endfacet + facet normal 0.955003 0.29629 -0.0134867 + outer loop + vertex 0.544608 0.121594 -0.123539 + vertex 0.517646 0.20851 -0.123256 + vertex 0.51866 0.210421 -0.00947047 + endloop + endfacet + facet normal 0.955565 0.294536 -0.011993 + outer loop + vertex 0.544608 0.121594 -0.123539 + vertex 0.51866 0.210421 -0.00947047 + vertex 0.545549 0.123196 -0.00922753 + endloop + endfacet + facet normal 0.955403 0.294577 0.0207241 + outer loop + vertex 0.545549 0.123196 -0.00922753 + vertex 0.51866 0.210421 -0.00947047 + vertex 0.515822 0.211637 0.104073 + endloop + endfacet + facet normal 0.956134 0.292032 0.0229027 + outer loop + vertex 0.545549 0.123196 -0.00922753 + vertex 0.515822 0.211637 0.104073 + vertex 0.542456 0.124369 0.104939 + endloop + endfacet + facet normal 0.951819 0.291434 0.0954252 + outer loop + vertex 0.542456 0.124369 0.104939 + vertex 0.515822 0.211637 0.104073 + vertex 0.504578 0.213349 0.210997 + endloop + endfacet + facet normal 0.953039 0.285594 0.10076 + outer loop + vertex 0.542456 0.124369 0.104939 + vertex 0.504578 0.213349 0.210997 + vertex 0.530619 0.125913 0.212524 + endloop + endfacet + facet normal 0.931625 0.281472 0.229887 + outer loop + vertex 0.530619 0.125913 0.212524 + vertex 0.504578 0.213349 0.210997 + vertex 0.480374 0.216749 0.304924 + endloop + endfacet + facet normal 0.932106 0.269887 0.241537 + outer loop + vertex 0.530619 0.125913 0.212524 + vertex 0.480374 0.216749 0.304924 + vertex 0.505328 0.128624 0.307092 + endloop + endfacet + facet normal 0.853222 0.25283 0.456168 + outer loop + vertex 0.505328 0.128624 0.307092 + vertex 0.480374 0.216749 0.304924 + vertex 0.438655 0.223027 0.379476 + endloop + endfacet + facet normal 0.847828 0.233888 0.475903 + outer loop + vertex 0.505328 0.128624 0.307092 + vertex 0.438655 0.223027 0.379476 + vertex 0.461875 0.133301 0.382207 + endloop + endfacet + facet normal 0.913954 0.386895 -0.122471 + outer loop + vertex 0.492633 0.196653 -0.451898 + vertex 0.458847 0.277094 -0.449905 + vertex 0.470276 0.283444 -0.344558 + endloop + endfacet + facet normal 0.914619 0.385678 -0.121348 + outer loop + vertex 0.492633 0.196653 -0.451898 + vertex 0.470276 0.283444 -0.344558 + vertex 0.504519 0.201821 -0.345887 + endloop + endfacet + facet normal 0.918351 0.386643 -0.0844946 + outer loop + vertex 0.504519 0.201821 -0.345887 + vertex 0.470276 0.283444 -0.344558 + vertex 0.478357 0.288166 -0.235117 + endloop + endfacet + facet normal 0.918863 0.385623 -0.0835785 + outer loop + vertex 0.504519 0.201821 -0.345887 + vertex 0.478357 0.288166 -0.235117 + vertex 0.512894 0.205708 -0.235868 + endloop + endfacet + facet normal 0.921067 0.386237 -0.0495639 + outer loop + vertex 0.512894 0.205708 -0.235868 + vertex 0.478357 0.288166 -0.235117 + vertex 0.483009 0.291447 -0.123102 + endloop + endfacet + facet normal 0.921644 0.384997 -0.0484687 + outer loop + vertex 0.512894 0.205708 -0.235868 + vertex 0.483009 0.291447 -0.123102 + vertex 0.517646 0.20851 -0.123256 + endloop + endfacet + facet normal 0.922629 0.385348 -0.0162111 + outer loop + vertex 0.517646 0.20851 -0.123256 + vertex 0.483009 0.291447 -0.123102 + vertex 0.484149 0.293475 -0.0100336 + endloop + endfacet + facet normal 0.923385 0.383594 -0.0146712 + outer loop + vertex 0.517646 0.20851 -0.123256 + vertex 0.484149 0.293475 -0.0100336 + vertex 0.51866 0.210421 -0.00947047 + endloop + endfacet + facet normal 0.923278 0.383764 0.0168493 + outer loop + vertex 0.51866 0.210421 -0.00947047 + vertex 0.484149 0.293475 -0.0100336 + vertex 0.481695 0.294435 0.102567 + endloop + endfacet + facet normal 0.924255 0.381303 0.0190167 + outer loop + vertex 0.51866 0.210421 -0.00947047 + vertex 0.481695 0.294435 0.102567 + vertex 0.515822 0.211637 0.104073 + endloop + endfacet + facet normal 0.920675 0.381023 0.0847284 + outer loop + vertex 0.515822 0.211637 0.104073 + vertex 0.481695 0.294435 0.102567 + vertex 0.471296 0.296021 0.208436 + endloop + endfacet + facet normal 0.922813 0.374336 0.0910472 + outer loop + vertex 0.515822 0.211637 0.104073 + vertex 0.471296 0.296021 0.208436 + vertex 0.504578 0.213349 0.210997 + endloop + endfacet + facet normal 0.905583 0.370951 0.205706 + outer loop + vertex 0.504578 0.213349 0.210997 + vertex 0.471296 0.296021 0.208436 + vertex 0.4486 0.299924 0.30131 + endloop + endfacet + facet normal 0.907812 0.356398 0.221038 + outer loop + vertex 0.504578 0.213349 0.210997 + vertex 0.4486 0.299924 0.30131 + vertex 0.480374 0.216749 0.304924 + endloop + endfacet + facet normal 0.843993 0.340423 0.414473 + outer loop + vertex 0.480374 0.216749 0.304924 + vertex 0.4486 0.299924 0.30131 + vertex 0.409257 0.307839 0.374925 + endloop + endfacet + facet normal 0.839358 0.314731 0.443196 + outer loop + vertex 0.480374 0.216749 0.304924 + vertex 0.409257 0.307839 0.374925 + vertex 0.438655 0.223027 0.379476 + endloop + endfacet + facet normal 0.870222 0.476759 -0.124156 + outer loop + vertex 0.458847 0.277094 -0.449905 + vertex 0.417579 0.352876 -0.44816 + vertex 0.428441 0.360332 -0.343395 + endloop + endfacet + facet normal 0.870923 0.475737 -0.123158 + outer loop + vertex 0.458847 0.277094 -0.449905 + vertex 0.428441 0.360332 -0.343395 + vertex 0.470276 0.283444 -0.344558 + endloop + endfacet + facet normal 0.874594 0.477172 -0.0859816 + outer loop + vertex 0.470276 0.283444 -0.344558 + vertex 0.428441 0.360332 -0.343395 + vertex 0.436158 0.365813 -0.234478 + endloop + endfacet + facet normal 0.875139 0.476317 -0.0851728 + outer loop + vertex 0.470276 0.283444 -0.344558 + vertex 0.436158 0.365813 -0.234478 + vertex 0.478357 0.288166 -0.235117 + endloop + endfacet + facet normal 0.877289 0.477208 -0.0513492 + outer loop + vertex 0.478357 0.288166 -0.235117 + vertex 0.436158 0.365813 -0.234478 + vertex 0.440689 0.369475 -0.123039 + endloop + endfacet + facet normal 0.877897 0.476189 -0.0504062 + outer loop + vertex 0.478357 0.288166 -0.235117 + vertex 0.440689 0.369475 -0.123039 + vertex 0.483009 0.291447 -0.123102 + endloop + endfacet + facet normal 0.878872 0.476692 -0.0186724 + outer loop + vertex 0.483009 0.291447 -0.123102 + vertex 0.440689 0.369475 -0.123039 + vertex 0.441992 0.371472 -0.0107065 + endloop + endfacet + facet normal 0.879655 0.475294 -0.0173907 + outer loop + vertex 0.483009 0.291447 -0.123102 + vertex 0.441992 0.371472 -0.0107065 + vertex 0.484149 0.293475 -0.0100336 + endloop + endfacet + facet normal 0.879598 0.475529 0.0134131 + outer loop + vertex 0.484149 0.293475 -0.0100336 + vertex 0.441992 0.371472 -0.0107065 + vertex 0.440027 0.37196 0.100889 + endloop + endfacet + facet normal 0.880594 0.47363 0.0151526 + outer loop + vertex 0.484149 0.293475 -0.0100336 + vertex 0.440027 0.37196 0.100889 + vertex 0.481695 0.294435 0.102567 + endloop + endfacet + facet normal 0.877855 0.4734 0.0725466 + outer loop + vertex 0.481695 0.294435 0.102567 + vertex 0.440027 0.37196 0.100889 + vertex 0.431036 0.372679 0.204991 + endloop + endfacet + facet normal 0.881048 0.466288 0.0795588 + outer loop + vertex 0.481695 0.294435 0.102567 + vertex 0.431036 0.372679 0.204991 + vertex 0.471296 0.296021 0.208436 + endloop + endfacet + facet normal 0.868032 0.463838 0.177128 + outer loop + vertex 0.471296 0.296021 0.208436 + vertex 0.431036 0.372679 0.204991 + vertex 0.411266 0.375365 0.294843 + endloop + endfacet + facet normal 0.872439 0.448417 0.194351 + outer loop + vertex 0.471296 0.296021 0.208436 + vertex 0.411266 0.375365 0.294843 + vertex 0.4486 0.299924 0.30131 + endloop + endfacet + facet normal 0.822864 0.438232 0.36173 + outer loop + vertex 0.4486 0.299924 0.30131 + vertex 0.411266 0.375365 0.294843 + vertex 0.375982 0.383505 0.365244 + endloop + endfacet + facet normal 0.821391 0.411709 0.39473 + outer loop + vertex 0.4486 0.299924 0.30131 + vertex 0.375982 0.383505 0.365244 + vertex 0.409257 0.307839 0.374925 + endloop + endfacet + facet normal 0.813829 0.567392 -0.125491 + outer loop + vertex 0.417579 0.352876 -0.44816 + vertex 0.368836 0.423065 -0.446914 + vertex 0.379018 0.431539 -0.342564 + endloop + endfacet + facet normal 0.814413 0.566713 -0.124771 + outer loop + vertex 0.417579 0.352876 -0.44816 + vertex 0.379018 0.431539 -0.342564 + vertex 0.428441 0.360332 -0.343395 + endloop + endfacet + facet normal 0.817914 0.568703 -0.0871434 + outer loop + vertex 0.428441 0.360332 -0.343395 + vertex 0.379018 0.431539 -0.342564 + vertex 0.386298 0.437701 -0.234031 + endloop + endfacet + facet normal 0.818362 0.568145 -0.0865753 + outer loop + vertex 0.428441 0.360332 -0.343395 + vertex 0.386298 0.437701 -0.234031 + vertex 0.436158 0.365813 -0.234478 + endloop + endfacet + facet normal 0.820405 0.56935 -0.0526919 + outer loop + vertex 0.436158 0.365813 -0.234478 + vertex 0.386298 0.437701 -0.234031 + vertex 0.390679 0.441661 -0.12303 + endloop + endfacet + facet normal 0.820886 0.568714 -0.0520625 + outer loop + vertex 0.436158 0.365813 -0.234478 + vertex 0.390679 0.441661 -0.12303 + vertex 0.440689 0.369475 -0.123039 + endloop + endfacet + facet normal 0.82183 0.569365 -0.0204612 + outer loop + vertex 0.440689 0.369475 -0.123039 + vertex 0.390679 0.441661 -0.12303 + vertex 0.392168 0.443527 -0.0112786 + endloop + endfacet + facet normal 0.822426 0.568532 -0.0196505 + outer loop + vertex 0.440689 0.369475 -0.123039 + vertex 0.392168 0.443527 -0.0112786 + vertex 0.441992 0.371472 -0.0107065 + endloop + endfacet + facet normal 0.822422 0.568772 0.0109737 + outer loop + vertex 0.441992 0.371472 -0.0107065 + vertex 0.392168 0.443527 -0.0112786 + vertex 0.39077 0.44341 0.0995073 + endloop + endfacet + facet normal 0.823151 0.567695 0.0120154 + outer loop + vertex 0.441992 0.371472 -0.0107065 + vertex 0.39077 0.44341 0.0995073 + vertex 0.440027 0.37196 0.100889 + endloop + endfacet + facet normal 0.821185 0.567303 0.0618333 + outer loop + vertex 0.440027 0.37196 0.100889 + vertex 0.39077 0.44341 0.0995073 + vertex 0.384065 0.442075 0.20081 + endloop + endfacet + facet normal 0.824371 0.562033 0.0673161 + outer loop + vertex 0.440027 0.37196 0.100889 + vertex 0.384065 0.442075 0.20081 + vertex 0.431036 0.372679 0.204991 + endloop + endfacet + facet normal 0.814069 0.560227 0.153093 + outer loop + vertex 0.431036 0.372679 0.204991 + vertex 0.384065 0.442075 0.20081 + vertex 0.36963 0.440286 0.284113 + endloop + endfacet + facet normal 0.817941 0.551584 0.163483 + outer loop + vertex 0.431036 0.372679 0.204991 + vertex 0.36963 0.440286 0.284113 + vertex 0.411266 0.375365 0.294843 + endloop + endfacet + facet normal 0.778321 0.54939 0.303951 + outer loop + vertex 0.411266 0.375365 0.294843 + vertex 0.36963 0.440286 0.284113 + vertex 0.341135 0.445794 0.347126 + endloop + endfacet + facet normal 0.779957 0.532151 0.329367 + outer loop + vertex 0.411266 0.375365 0.294843 + vertex 0.341135 0.445794 0.347126 + vertex 0.375982 0.383505 0.365244 + endloop + endfacet + facet normal 0.743161 0.657109 -0.126173 + outer loop + vertex 0.368836 0.423065 -0.446914 + vertex 0.312627 0.48673 -0.446415 + vertex 0.322015 0.496117 -0.342232 + endloop + endfacet + facet normal 0.743423 0.656867 -0.125886 + outer loop + vertex 0.368836 0.423065 -0.446914 + vertex 0.322015 0.496117 -0.342232 + vertex 0.379018 0.431539 -0.342564 + endloop + endfacet + facet normal 0.746594 0.65947 -0.0877315 + outer loop + vertex 0.379018 0.431539 -0.342564 + vertex 0.322015 0.496117 -0.342232 + vertex 0.328777 0.50288 -0.233855 + endloop + endfacet + facet normal 0.746789 0.659278 -0.0875156 + outer loop + vertex 0.379018 0.431539 -0.342564 + vertex 0.328777 0.50288 -0.233855 + vertex 0.386298 0.437701 -0.234031 + endloop + endfacet + facet normal 0.748644 0.660823 -0.053339 + outer loop + vertex 0.386298 0.437701 -0.234031 + vertex 0.328777 0.50288 -0.233855 + vertex 0.332971 0.507073 -0.123039 + endloop + endfacet + facet normal 0.748835 0.660624 -0.053123 + outer loop + vertex 0.386298 0.437701 -0.234031 + vertex 0.332971 0.507073 -0.123039 + vertex 0.390679 0.441661 -0.12303 + endloop + endfacet + facet normal 0.749722 0.661411 -0.0212866 + outer loop + vertex 0.390679 0.441661 -0.12303 + vertex 0.332971 0.507073 -0.123039 + vertex 0.334653 0.508755 -0.0115394 + endloop + endfacet + facet normal 0.749937 0.661175 -0.0210369 + outer loop + vertex 0.390679 0.441661 -0.12303 + vertex 0.334653 0.508755 -0.0115394 + vertex 0.392168 0.443527 -0.0112786 + endloop + endfacet + facet normal 0.750005 0.661359 0.00987957 + outer loop + vertex 0.392168 0.443527 -0.0112786 + vertex 0.334653 0.508755 -0.0115394 + vertex 0.33388 0.507982 0.0988907 + endloop + endfacet + facet normal 0.750238 0.66109 0.0101606 + outer loop + vertex 0.392168 0.443527 -0.0112786 + vertex 0.33388 0.507982 0.0988907 + vertex 0.39077 0.44341 0.0995073 + endloop + endfacet + facet normal 0.748855 0.660314 0.0565848 + outer loop + vertex 0.39077 0.44341 0.0995073 + vertex 0.33388 0.507982 0.0988907 + vertex 0.329879 0.503981 0.198536 + endloop + endfacet + facet normal 0.750119 0.658725 0.0583346 + outer loop + vertex 0.39077 0.44341 0.0995073 + vertex 0.329879 0.503981 0.198536 + vertex 0.384065 0.442075 0.20081 + endloop + endfacet + facet normal 0.742338 0.65496 0.141286 + outer loop + vertex 0.384065 0.442075 0.20081 + vertex 0.329879 0.503981 0.198536 + vertex 0.321876 0.495978 0.277683 + endloop + endfacet + facet normal 0.743143 0.653715 0.142811 + outer loop + vertex 0.384065 0.442075 0.20081 + vertex 0.321876 0.495978 0.277683 + vertex 0.36963 0.440286 0.284113 + endloop + endfacet + facet normal 0.715155 0.644468 0.270584 + outer loop + vertex 0.36963 0.440286 0.284113 + vertex 0.321876 0.495978 0.277683 + vertex 0.312305 0.486408 0.325773 + endloop + endfacet + facet normal 0.714298 0.647132 0.266455 + outer loop + vertex 0.36963 0.440286 0.284113 + vertex 0.312305 0.486408 0.325773 + vertex 0.341135 0.445794 0.347126 + endloop + endfacet + facet normal 0.992289 -0.0419431 -0.116629 + outer loop + vertex 0.552765 -0.153076 -0.457381 + vertex 0.56544 -0.153076 -0.349542 + vertex 0.561629 -0.244168 -0.34921 + endloop + endfacet + facet normal 0.992246 -0.0422553 -0.116889 + outer loop + vertex 0.552765 -0.153076 -0.457381 + vertex 0.561629 -0.244168 -0.34921 + vertex 0.549001 -0.242839 -0.456883 + endloop + endfacet + facet normal 0.985101 -0.125965 -0.117084 + outer loop + vertex 0.549001 -0.242839 -0.456883 + vertex 0.561629 -0.244168 -0.34921 + vertex 0.550201 -0.334312 -0.348379 + endloop + endfacet + facet normal 0.984922 -0.12675 -0.117745 + outer loop + vertex 0.549001 -0.242839 -0.456883 + vertex 0.550201 -0.334312 -0.348379 + vertex 0.537718 -0.331669 -0.455637 + endloop + endfacet + facet normal 0.970346 -0.210894 -0.118122 + outer loop + vertex 0.537718 -0.331669 -0.455637 + vertex 0.550201 -0.334312 -0.348379 + vertex 0.531162 -0.422563 -0.347216 + endloop + endfacet + facet normal 0.969991 -0.211993 -0.119065 + outer loop + vertex 0.537718 -0.331669 -0.455637 + vertex 0.531162 -0.422563 -0.347216 + vertex 0.518926 -0.418635 -0.453892 + endloop + endfacet + facet normal 0.947247 -0.297353 -0.1196 + outer loop + vertex 0.518926 -0.418635 -0.453892 + vertex 0.531162 -0.422563 -0.347216 + vertex 0.504518 -0.507974 -0.345887 + endloop + endfacet + facet normal 0.946715 -0.298599 -0.120702 + outer loop + vertex 0.518926 -0.418635 -0.453892 + vertex 0.504518 -0.507974 -0.345887 + vertex 0.492633 -0.502805 -0.451898 + endloop + endfacet + facet normal 0.914618 -0.385678 -0.121349 + outer loop + vertex 0.492633 -0.502805 -0.451898 + vertex 0.504518 -0.507974 -0.345887 + vertex 0.470276 -0.589596 -0.344558 + endloop + endfacet + facet normal 0.913954 -0.386896 -0.122471 + outer loop + vertex 0.492633 -0.502805 -0.451898 + vertex 0.470276 -0.589596 -0.344558 + vertex 0.458847 -0.583247 -0.449905 + endloop + endfacet + facet normal 0.870922 -0.475738 -0.123158 + outer loop + vertex 0.458847 -0.583247 -0.449905 + vertex 0.470276 -0.589596 -0.344558 + vertex 0.42844 -0.666484 -0.343395 + endloop + endfacet + facet normal 0.870221 -0.47676 -0.124156 + outer loop + vertex 0.458847 -0.583247 -0.449905 + vertex 0.42844 -0.666484 -0.343395 + vertex 0.417578 -0.659028 -0.44816 + endloop + endfacet + facet normal 0.814412 -0.566714 -0.124772 + outer loop + vertex 0.417578 -0.659028 -0.44816 + vertex 0.42844 -0.666484 -0.343395 + vertex 0.379018 -0.737691 -0.342564 + endloop + endfacet + facet normal 0.813829 -0.567392 -0.12549 + outer loop + vertex 0.417578 -0.659028 -0.44816 + vertex 0.379018 -0.737691 -0.342564 + vertex 0.368835 -0.729217 -0.446914 + endloop + endfacet + facet normal 0.743423 -0.656867 -0.125886 + outer loop + vertex 0.368835 -0.729217 -0.446914 + vertex 0.379018 -0.737691 -0.342564 + vertex 0.322015 -0.80227 -0.342232 + endloop + endfacet + facet normal 0.743161 -0.657109 -0.126172 + outer loop + vertex 0.368835 -0.729217 -0.446914 + vertex 0.322015 -0.80227 -0.342232 + vertex 0.312627 -0.792882 -0.446415 + endloop + endfacet + facet normal 0.995958 -0.0417479 -0.0795333 + outer loop + vertex 0.56544 -0.153076 -0.349542 + vertex 0.574342 -0.153076 -0.238072 + vertex 0.570497 -0.245185 -0.237864 + endloop + endfacet + facet normal 0.995935 -0.041961 -0.079708 + outer loop + vertex 0.56544 -0.153076 -0.349542 + vertex 0.570497 -0.245185 -0.237864 + vertex 0.561629 -0.244168 -0.34921 + endloop + endfacet + facet normal 0.988869 -0.12551 -0.0799087 + outer loop + vertex 0.561629 -0.244168 -0.34921 + vertex 0.570497 -0.245185 -0.237864 + vertex 0.55897 -0.336329 -0.237353 + endloop + endfacet + facet normal 0.988756 -0.12609 -0.0803897 + outer loop + vertex 0.561629 -0.244168 -0.34921 + vertex 0.55897 -0.336329 -0.237353 + vertex 0.550201 -0.334312 -0.348379 + endloop + endfacet + facet normal 0.974283 -0.210349 -0.080777 + outer loop + vertex 0.550201 -0.334312 -0.348379 + vertex 0.55897 -0.336329 -0.237353 + vertex 0.539767 -0.425543 -0.23665 + endloop + endfacet + facet normal 0.974038 -0.211207 -0.0815006 + outer loop + vertex 0.550201 -0.334312 -0.348379 + vertex 0.539767 -0.425543 -0.23665 + vertex 0.531162 -0.422563 -0.347216 + endloop + endfacet + facet normal 0.951368 -0.29693 -0.0820462 + outer loop + vertex 0.531162 -0.422563 -0.347216 + vertex 0.539767 -0.425543 -0.23665 + vertex 0.512894 -0.511861 -0.235868 + endloop + endfacet + facet normal 0.950974 -0.297945 -0.0829249 + outer loop + vertex 0.531162 -0.422563 -0.347216 + vertex 0.512894 -0.511861 -0.235868 + vertex 0.504518 -0.507974 -0.345887 + endloop + endfacet + facet normal 0.918863 -0.385623 -0.0835781 + outer loop + vertex 0.504518 -0.507974 -0.345887 + vertex 0.512894 -0.511861 -0.235868 + vertex 0.478357 -0.594318 -0.235117 + endloop + endfacet + facet normal 0.91835 -0.386644 -0.0844947 + outer loop + vertex 0.504518 -0.507974 -0.345887 + vertex 0.478357 -0.594318 -0.235117 + vertex 0.470276 -0.589596 -0.344558 + endloop + endfacet + facet normal 0.875138 -0.476318 -0.0851731 + outer loop + vertex 0.470276 -0.589596 -0.344558 + vertex 0.478357 -0.594318 -0.235117 + vertex 0.436158 -0.671965 -0.234478 + endloop + endfacet + facet normal 0.874593 -0.477173 -0.0859817 + outer loop + vertex 0.470276 -0.589596 -0.344558 + vertex 0.436158 -0.671965 -0.234478 + vertex 0.42844 -0.666484 -0.343395 + endloop + endfacet + facet normal 0.818362 -0.568145 -0.0865756 + outer loop + vertex 0.42844 -0.666484 -0.343395 + vertex 0.436158 -0.671965 -0.234478 + vertex 0.386297 -0.743853 -0.234031 + endloop + endfacet + facet normal 0.817913 -0.568704 -0.0871441 + outer loop + vertex 0.42844 -0.666484 -0.343395 + vertex 0.386297 -0.743853 -0.234031 + vertex 0.379018 -0.737691 -0.342564 + endloop + endfacet + facet normal 0.746788 -0.659278 -0.0875164 + outer loop + vertex 0.379018 -0.737691 -0.342564 + vertex 0.386297 -0.743853 -0.234031 + vertex 0.328777 -0.809032 -0.233855 + endloop + endfacet + facet normal 0.746594 -0.65947 -0.0877318 + outer loop + vertex 0.379018 -0.737691 -0.342564 + vertex 0.328777 -0.809032 -0.233855 + vertex 0.322015 -0.80227 -0.342232 + endloop + endfacet + facet normal 0.998183 -0.041561 -0.043636 + outer loop + vertex 0.574342 -0.153076 -0.238072 + vertex 0.579318 -0.153076 -0.124242 + vertex 0.575456 -0.245959 -0.124123 + endloop + endfacet + facet normal 0.998167 -0.0417595 -0.0437977 + outer loop + vertex 0.574342 -0.153076 -0.238072 + vertex 0.575456 -0.245959 -0.124123 + vertex 0.570497 -0.245185 -0.237864 + endloop + endfacet + facet normal 0.991181 -0.124974 -0.0440594 + outer loop + vertex 0.570497 -0.245185 -0.237864 + vertex 0.575456 -0.245959 -0.124123 + vertex 0.563882 -0.337847 -0.123858 + endloop + endfacet + facet normal 0.991081 -0.125591 -0.0445669 + outer loop + vertex 0.570497 -0.245185 -0.237864 + vertex 0.563882 -0.337847 -0.123858 + vertex 0.55897 -0.336329 -0.237353 + endloop + endfacet + facet normal 0.976754 -0.209571 -0.0450704 + outer loop + vertex 0.55897 -0.336329 -0.237353 + vertex 0.563882 -0.337847 -0.123858 + vertex 0.544608 -0.427747 -0.123539 + endloop + endfacet + facet normal 0.976505 -0.210553 -0.0458906 + outer loop + vertex 0.55897 -0.336329 -0.237353 + vertex 0.544608 -0.427747 -0.123539 + vertex 0.539767 -0.425543 -0.23665 + endloop + endfacet + facet normal 0.954022 -0.296094 -0.0465952 + outer loop + vertex 0.539767 -0.425543 -0.23665 + vertex 0.544608 -0.427747 -0.123539 + vertex 0.517646 -0.514662 -0.123256 + endloop + endfacet + facet normal 0.953592 -0.29731 -0.0476354 + outer loop + vertex 0.539767 -0.425543 -0.23665 + vertex 0.517646 -0.514662 -0.123256 + vertex 0.512894 -0.511861 -0.235868 + endloop + endfacet + facet normal 0.921644 -0.384997 -0.0484687 + outer loop + vertex 0.512894 -0.511861 -0.235868 + vertex 0.517646 -0.514662 -0.123256 + vertex 0.483009 -0.5976 -0.123102 + endloop + endfacet + facet normal 0.921067 -0.386237 -0.0495637 + outer loop + vertex 0.512894 -0.511861 -0.235868 + vertex 0.483009 -0.5976 -0.123102 + vertex 0.478357 -0.594318 -0.235117 + endloop + endfacet + facet normal 0.877897 -0.47619 -0.050406 + outer loop + vertex 0.478357 -0.594318 -0.235117 + vertex 0.483009 -0.5976 -0.123102 + vertex 0.440689 -0.675627 -0.123039 + endloop + endfacet + facet normal 0.877289 -0.477208 -0.051349 + outer loop + vertex 0.478357 -0.594318 -0.235117 + vertex 0.440689 -0.675627 -0.123039 + vertex 0.436158 -0.671965 -0.234478 + endloop + endfacet + facet normal 0.820886 -0.568715 -0.0520624 + outer loop + vertex 0.436158 -0.671965 -0.234478 + vertex 0.440689 -0.675627 -0.123039 + vertex 0.390678 -0.747813 -0.12303 + endloop + endfacet + facet normal 0.820404 -0.569351 -0.0526919 + outer loop + vertex 0.436158 -0.671965 -0.234478 + vertex 0.390678 -0.747813 -0.12303 + vertex 0.386297 -0.743853 -0.234031 + endloop + endfacet + facet normal 0.748835 -0.660624 -0.0531231 + outer loop + vertex 0.386297 -0.743853 -0.234031 + vertex 0.390678 -0.747813 -0.12303 + vertex 0.33297 -0.813226 -0.123039 + endloop + endfacet + facet normal 0.748644 -0.660823 -0.0533397 + outer loop + vertex 0.386297 -0.743853 -0.234031 + vertex 0.33297 -0.813226 -0.123039 + vertex 0.328777 -0.809032 -0.233855 + endloop + endfacet + facet normal 0.999116 -0.0412984 -0.00781356 + outer loop + vertex 0.579318 -0.153076 -0.124242 + vertex 0.580216 -0.153076 -0.0093227 + vertex 0.576353 -0.246557 -0.00926336 + endloop + endfacet + facet normal 0.999104 -0.0415538 -0.00802149 + outer loop + vertex 0.579318 -0.153076 -0.124242 + vertex 0.576353 -0.246557 -0.00926336 + vertex 0.575456 -0.245959 -0.124123 + endloop + endfacet + facet normal 0.992229 -0.124141 -0.00839794 + outer loop + vertex 0.575456 -0.245959 -0.124123 + vertex 0.576353 -0.246557 -0.00926336 + vertex 0.564788 -0.338996 -0.00919506 + endloop + endfacet + facet normal 0.992116 -0.124991 -0.00909648 + outer loop + vertex 0.575456 -0.245959 -0.124123 + vertex 0.564788 -0.338996 -0.00919506 + vertex 0.563882 -0.337847 -0.123858 + endloop + endfacet + facet normal 0.978025 -0.208256 -0.00981895 + outer loop + vertex 0.563882 -0.337847 -0.123858 + vertex 0.564788 -0.338996 -0.00919506 + vertex 0.545549 -0.429349 -0.00922752 + endloop + endfacet + facet normal 0.977714 -0.209655 -0.0109859 + outer loop + vertex 0.563882 -0.337847 -0.123858 + vertex 0.545549 -0.429349 -0.00922752 + vertex 0.544608 -0.427747 -0.123539 + endloop + endfacet + facet normal 0.955565 -0.294536 -0.0119932 + outer loop + vertex 0.544608 -0.427747 -0.123539 + vertex 0.545549 -0.429349 -0.00922752 + vertex 0.51866 -0.516573 -0.00947047 + endloop + endfacet + facet normal 0.955003 -0.29629 -0.0134873 + outer loop + vertex 0.544608 -0.427747 -0.123539 + vertex 0.51866 -0.516573 -0.00947047 + vertex 0.517646 -0.514662 -0.123256 + endloop + endfacet + facet normal 0.923385 -0.383595 -0.0146719 + outer loop + vertex 0.517646 -0.514662 -0.123256 + vertex 0.51866 -0.516573 -0.00947047 + vertex 0.484149 -0.599627 -0.0100336 + endloop + endfacet + facet normal 0.922629 -0.385349 -0.0162111 + outer loop + vertex 0.517646 -0.514662 -0.123256 + vertex 0.484149 -0.599627 -0.0100336 + vertex 0.483009 -0.5976 -0.123102 + endloop + endfacet + facet normal 0.879655 -0.475294 -0.0173907 + outer loop + vertex 0.483009 -0.5976 -0.123102 + vertex 0.484149 -0.599627 -0.0100336 + vertex 0.441992 -0.677624 -0.0107065 + endloop + endfacet + facet normal 0.878871 -0.476693 -0.0186725 + outer loop + vertex 0.483009 -0.5976 -0.123102 + vertex 0.441992 -0.677624 -0.0107065 + vertex 0.440689 -0.675627 -0.123039 + endloop + endfacet + facet normal 0.822426 -0.568533 -0.0196506 + outer loop + vertex 0.440689 -0.675627 -0.123039 + vertex 0.441992 -0.677624 -0.0107065 + vertex 0.392167 -0.74968 -0.0112786 + endloop + endfacet + facet normal 0.82183 -0.569365 -0.020461 + outer loop + vertex 0.440689 -0.675627 -0.123039 + vertex 0.392167 -0.74968 -0.0112786 + vertex 0.390678 -0.747813 -0.12303 + endloop + endfacet + facet normal 0.749937 -0.661175 -0.0210367 + outer loop + vertex 0.390678 -0.747813 -0.12303 + vertex 0.392167 -0.74968 -0.0112786 + vertex 0.334652 -0.814908 -0.0115394 + endloop + endfacet + facet normal 0.749722 -0.661411 -0.0212866 + outer loop + vertex 0.390678 -0.747813 -0.12303 + vertex 0.334652 -0.814908 -0.0115394 + vertex 0.33297 -0.813226 -0.123039 + endloop + endfacet + facet normal 0.998743 -0.0408905 0.0289919 + outer loop + vertex 0.580216 -0.153076 -0.0093227 + vertex 0.576886 -0.153076 0.105413 + vertex 0.573038 -0.247048 0.105437 + endloop + endfacet + facet normal 0.998736 -0.0412596 0.0286892 + outer loop + vertex 0.580216 -0.153076 -0.0093227 + vertex 0.573038 -0.247048 0.105437 + vertex 0.576353 -0.246557 -0.00926336 + endloop + endfacet + facet normal 0.992029 -0.122824 0.0281464 + outer loop + vertex 0.576353 -0.246557 -0.00926336 + vertex 0.573038 -0.247048 0.105437 + vertex 0.561544 -0.339903 0.105336 + endloop + endfacet + facet normal 0.991903 -0.124074 0.0271125 + outer loop + vertex 0.576353 -0.246557 -0.00926336 + vertex 0.561544 -0.339903 0.105336 + vertex 0.564788 -0.338996 -0.00919506 + endloop + endfacet + facet normal 0.97817 -0.206162 0.0260736 + outer loop + vertex 0.564788 -0.338996 -0.00919506 + vertex 0.561544 -0.339903 0.105336 + vertex 0.542455 -0.430522 0.104939 + endloop + endfacet + facet normal 0.97778 -0.208216 0.0243505 + outer loop + vertex 0.564788 -0.338996 -0.00919506 + vertex 0.542455 -0.430522 0.104939 + vertex 0.545549 -0.429349 -0.00922752 + endloop + endfacet + facet normal 0.956134 -0.292032 0.0229026 + outer loop + vertex 0.545549 -0.429349 -0.00922752 + vertex 0.542455 -0.430522 0.104939 + vertex 0.515822 -0.51779 0.104073 + endloop + endfacet + facet normal 0.955403 -0.294577 0.0207239 + outer loop + vertex 0.545549 -0.429349 -0.00922752 + vertex 0.515822 -0.51779 0.104073 + vertex 0.51866 -0.516573 -0.00947047 + endloop + endfacet + facet normal 0.924254 -0.381304 0.0190163 + outer loop + vertex 0.51866 -0.516573 -0.00947047 + vertex 0.515822 -0.51779 0.104073 + vertex 0.481695 -0.600587 0.102567 + endloop + endfacet + facet normal 0.923277 -0.383765 0.0168493 + outer loop + vertex 0.51866 -0.516573 -0.00947047 + vertex 0.481695 -0.600587 0.102567 + vertex 0.484149 -0.599627 -0.0100336 + endloop + endfacet + facet normal 0.880593 -0.473631 0.0151526 + outer loop + vertex 0.484149 -0.599627 -0.0100336 + vertex 0.481695 -0.600587 0.102567 + vertex 0.440026 -0.678113 0.100889 + endloop + endfacet + facet normal 0.879598 -0.475529 0.0134132 + outer loop + vertex 0.484149 -0.599627 -0.0100336 + vertex 0.440026 -0.678113 0.100889 + vertex 0.441992 -0.677624 -0.0107065 + endloop + endfacet + facet normal 0.823151 -0.567696 0.0120155 + outer loop + vertex 0.441992 -0.677624 -0.0107065 + vertex 0.440026 -0.678113 0.100889 + vertex 0.39077 -0.749563 0.0995073 + endloop + endfacet + facet normal 0.822422 -0.568773 0.0109734 + outer loop + vertex 0.441992 -0.677624 -0.0107065 + vertex 0.39077 -0.749563 0.0995073 + vertex 0.392167 -0.74968 -0.0112786 + endloop + endfacet + facet normal 0.750237 -0.66109 0.0101603 + outer loop + vertex 0.392167 -0.74968 -0.0112786 + vertex 0.39077 -0.749563 0.0995073 + vertex 0.333879 -0.814135 0.0988907 + endloop + endfacet + facet normal 0.750005 -0.661359 0.00988013 + outer loop + vertex 0.392167 -0.74968 -0.0112786 + vertex 0.333879 -0.814135 0.0988907 + vertex 0.334652 -0.814908 -0.0115394 + endloop + endfacet + facet normal 0.99263 -0.0398133 0.114456 + outer loop + vertex 0.576886 -0.153076 0.105413 + vertex 0.564421 -0.153076 0.213516 + vertex 0.560627 -0.247661 0.213522 + endloop + endfacet + facet normal 0.992678 -0.0406207 0.113756 + outer loop + vertex 0.576886 -0.153076 0.105413 + vertex 0.560627 -0.247661 0.213522 + vertex 0.573038 -0.247048 0.105437 + endloop + endfacet + facet normal 0.986417 -0.119604 0.11259 + outer loop + vertex 0.573038 -0.247048 0.105437 + vertex 0.560627 -0.247661 0.213522 + vertex 0.54933 -0.341055 0.213278 + endloop + endfacet + facet normal 0.986356 -0.122211 0.110304 + outer loop + vertex 0.573038 -0.247048 0.105437 + vertex 0.54933 -0.341055 0.213278 + vertex 0.561544 -0.339903 0.105336 + endloop + endfacet + facet normal 0.973604 -0.201067 0.108019 + outer loop + vertex 0.561544 -0.339903 0.105336 + vertex 0.54933 -0.341055 0.213278 + vertex 0.530619 -0.432065 0.212524 + endloop + endfacet + facet normal 0.973116 -0.20544 0.104119 + outer loop + vertex 0.561544 -0.339903 0.105336 + vertex 0.530619 -0.432065 0.212524 + vertex 0.542455 -0.430522 0.104939 + endloop + endfacet + facet normal 0.953039 -0.285595 0.10076 + outer loop + vertex 0.542455 -0.430522 0.104939 + vertex 0.530619 -0.432065 0.212524 + vertex 0.504578 -0.519502 0.210997 + endloop + endfacet + facet normal 0.951819 -0.291434 0.0954256 + outer loop + vertex 0.542455 -0.430522 0.104939 + vertex 0.504578 -0.519502 0.210997 + vertex 0.515822 -0.51779 0.104073 + endloop + endfacet + facet normal 0.922812 -0.374337 0.0910475 + outer loop + vertex 0.515822 -0.51779 0.104073 + vertex 0.504578 -0.519502 0.210997 + vertex 0.471295 -0.602173 0.208436 + endloop + endfacet + facet normal 0.920674 -0.381024 0.0847285 + outer loop + vertex 0.515822 -0.51779 0.104073 + vertex 0.471295 -0.602173 0.208436 + vertex 0.481695 -0.600587 0.102567 + endloop + endfacet + facet normal 0.881047 -0.466289 0.0795589 + outer loop + vertex 0.481695 -0.600587 0.102567 + vertex 0.471295 -0.602173 0.208436 + vertex 0.431036 -0.678831 0.204991 + endloop + endfacet + facet normal 0.877854 -0.473401 0.072547 + outer loop + vertex 0.481695 -0.600587 0.102567 + vertex 0.431036 -0.678831 0.204991 + vertex 0.440026 -0.678113 0.100889 + endloop + endfacet + facet normal 0.824371 -0.562032 0.0673166 + outer loop + vertex 0.440026 -0.678113 0.100889 + vertex 0.431036 -0.678831 0.204991 + vertex 0.384065 -0.748227 0.20081 + endloop + endfacet + facet normal 0.821184 -0.567303 0.0618332 + outer loop + vertex 0.440026 -0.678113 0.100889 + vertex 0.384065 -0.748227 0.20081 + vertex 0.39077 -0.749563 0.0995073 + endloop + endfacet + facet normal 0.750119 -0.658725 0.0583344 + outer loop + vertex 0.39077 -0.749563 0.0995073 + vertex 0.384065 -0.748227 0.20081 + vertex 0.329878 -0.810133 0.198536 + endloop + endfacet + facet normal 0.748854 -0.660315 0.0565842 + outer loop + vertex 0.39077 -0.749563 0.0995073 + vertex 0.329878 -0.810133 0.198536 + vertex 0.333879 -0.814135 0.0988907 + endloop + endfacet + facet normal 0.962569 -0.0370854 0.268489 + outer loop + vertex 0.564421 -0.153076 0.213516 + vertex 0.537917 -0.153076 0.308537 + vertex 0.534235 -0.248626 0.308537 + endloop + endfacet + facet normal 0.962906 -0.0386113 0.267062 + outer loop + vertex 0.564421 -0.153076 0.213516 + vertex 0.534235 -0.248626 0.308537 + vertex 0.560627 -0.247661 0.213522 + endloop + endfacet + facet normal 0.957776 -0.11179 0.264894 + outer loop + vertex 0.560627 -0.247661 0.213522 + vertex 0.534235 -0.248626 0.308537 + vertex 0.523327 -0.342939 0.308176 + endloop + endfacet + facet normal 0.958457 -0.116608 0.260313 + outer loop + vertex 0.560627 -0.247661 0.213522 + vertex 0.523327 -0.342939 0.308176 + vertex 0.54933 -0.341055 0.213278 + endloop + endfacet + facet normal 0.948048 -0.188829 0.256026 + outer loop + vertex 0.54933 -0.341055 0.213278 + vertex 0.523327 -0.342939 0.308176 + vertex 0.505328 -0.434776 0.307092 + endloop + endfacet + facet normal 0.948502 -0.197067 0.248009 + outer loop + vertex 0.54933 -0.341055 0.213278 + vertex 0.505328 -0.434776 0.307092 + vertex 0.530619 -0.432065 0.212524 + endloop + endfacet + facet normal 0.932105 -0.269888 0.241537 + outer loop + vertex 0.530619 -0.432065 0.212524 + vertex 0.505328 -0.434776 0.307092 + vertex 0.480374 -0.522902 0.304924 + endloop + endfacet + facet normal 0.931625 -0.281472 0.229887 + outer loop + vertex 0.530619 -0.432065 0.212524 + vertex 0.480374 -0.522902 0.304924 + vertex 0.504578 -0.519502 0.210997 + endloop + endfacet + facet normal 0.907812 -0.356399 0.221038 + outer loop + vertex 0.504578 -0.519502 0.210997 + vertex 0.480374 -0.522902 0.304924 + vertex 0.4486 -0.606077 0.30131 + endloop + endfacet + facet normal 0.905582 -0.370952 0.205706 + outer loop + vertex 0.504578 -0.519502 0.210997 + vertex 0.4486 -0.606077 0.30131 + vertex 0.471295 -0.602173 0.208436 + endloop + endfacet + facet normal 0.872439 -0.448417 0.19435 + outer loop + vertex 0.471295 -0.602173 0.208436 + vertex 0.4486 -0.606077 0.30131 + vertex 0.411265 -0.681518 0.294843 + endloop + endfacet + facet normal 0.868032 -0.463839 0.177127 + outer loop + vertex 0.471295 -0.602173 0.208436 + vertex 0.411265 -0.681518 0.294843 + vertex 0.431036 -0.678831 0.204991 + endloop + endfacet + facet normal 0.817941 -0.551585 0.163482 + outer loop + vertex 0.431036 -0.678831 0.204991 + vertex 0.411265 -0.681518 0.294843 + vertex 0.36963 -0.746439 0.284113 + endloop + endfacet + facet normal 0.814069 -0.560227 0.153093 + outer loop + vertex 0.431036 -0.678831 0.204991 + vertex 0.36963 -0.746439 0.284113 + vertex 0.384065 -0.748227 0.20081 + endloop + endfacet + facet normal 0.743143 -0.653716 0.14281 + outer loop + vertex 0.384065 -0.748227 0.20081 + vertex 0.36963 -0.746439 0.284113 + vertex 0.321875 -0.802131 0.277683 + endloop + endfacet + facet normal 0.742337 -0.654961 0.141286 + outer loop + vertex 0.384065 -0.748227 0.20081 + vertex 0.321875 -0.802131 0.277683 + vertex 0.329878 -0.810133 0.198536 + endloop + endfacet + facet normal 0.856314 -0.0307604 0.515539 + outer loop + vertex 0.537917 -0.153076 0.308537 + vertex 0.492468 -0.153076 0.384027 + vertex 0.48898 -0.250174 0.384027 + endloop + endfacet + facet normal 0.857519 -0.0330381 0.513391 + outer loop + vertex 0.537917 -0.153076 0.308537 + vertex 0.48898 -0.250174 0.384027 + vertex 0.534235 -0.248626 0.308537 + endloop + endfacet + facet normal 0.854744 -0.0939384 0.510479 + outer loop + vertex 0.534235 -0.248626 0.308537 + vertex 0.48898 -0.250174 0.384027 + vertex 0.478716 -0.346042 0.383572 + endloop + endfacet + facet normal 0.858035 -0.101169 0.503528 + outer loop + vertex 0.534235 -0.248626 0.308537 + vertex 0.478716 -0.346042 0.383572 + vertex 0.523327 -0.342939 0.308176 + endloop + endfacet + facet normal 0.852302 -0.160941 0.497675 + outer loop + vertex 0.523327 -0.342939 0.308176 + vertex 0.478716 -0.346042 0.383572 + vertex 0.461874 -0.439454 0.382207 + endloop + endfacet + facet normal 0.857086 -0.173704 0.485006 + outer loop + vertex 0.523327 -0.342939 0.308176 + vertex 0.461874 -0.439454 0.382207 + vertex 0.505328 -0.434776 0.307092 + endloop + endfacet + facet normal 0.847828 -0.233889 0.475903 + outer loop + vertex 0.505328 -0.434776 0.307092 + vertex 0.461874 -0.439454 0.382207 + vertex 0.438655 -0.52918 0.379476 + endloop + endfacet + facet normal 0.853222 -0.252831 0.456167 + outer loop + vertex 0.505328 -0.434776 0.307092 + vertex 0.438655 -0.52918 0.379476 + vertex 0.480374 -0.522902 0.304924 + endloop + endfacet + facet normal 0.839358 -0.314732 0.443196 + outer loop + vertex 0.480374 -0.522902 0.304924 + vertex 0.438655 -0.52918 0.379476 + vertex 0.409256 -0.613992 0.374925 + endloop + endfacet + facet normal 0.843993 -0.340424 0.414474 + outer loop + vertex 0.480374 -0.522902 0.304924 + vertex 0.409256 -0.613992 0.374925 + vertex 0.4486 -0.606077 0.30131 + endloop + endfacet + facet normal 0.821391 -0.411709 0.39473 + outer loop + vertex 0.4486 -0.606077 0.30131 + vertex 0.409256 -0.613992 0.374925 + vertex 0.375982 -0.689658 0.365244 + endloop + endfacet + facet normal 0.822864 -0.438232 0.36173 + outer loop + vertex 0.4486 -0.606077 0.30131 + vertex 0.375982 -0.689658 0.365244 + vertex 0.411265 -0.681518 0.294843 + endloop + endfacet + facet normal 0.779957 -0.532151 0.329367 + outer loop + vertex 0.411265 -0.681518 0.294843 + vertex 0.375982 -0.689658 0.365244 + vertex 0.341134 -0.751946 0.347126 + endloop + endfacet + facet normal 0.778321 -0.54939 0.303951 + outer loop + vertex 0.411265 -0.681518 0.294843 + vertex 0.341134 -0.751946 0.347126 + vertex 0.36963 -0.746439 0.284113 + endloop + endfacet + facet normal 0.714298 -0.647132 0.266455 + outer loop + vertex 0.36963 -0.746439 0.284113 + vertex 0.341134 -0.751946 0.347126 + vertex 0.312305 -0.79256 0.325773 + endloop + endfacet + facet normal 0.715154 -0.644469 0.270582 + outer loop + vertex 0.36963 -0.746439 0.284113 + vertex 0.312305 -0.79256 0.325773 + vertex 0.321875 -0.802131 0.277683 + endloop + endfacet + facet normal 0.986749 -0.0422457 -0.15666 + outer loop + vertex 0.552765 -0.153076 -0.457381 + vertex 0.549001 -0.242839 -0.456883 + vertex 0.532766 -0.24113 -0.559605 + endloop + endfacet + facet normal 0.986795 -0.0427607 -0.156226 + outer loop + vertex 0.552765 -0.153076 -0.457381 + vertex 0.532766 -0.24113 -0.559605 + vertex 0.536469 -0.153076 -0.560317 + endloop + endfacet + facet normal 0.977991 -0.0427785 -0.204216 + outer loop + vertex 0.536469 -0.153076 -0.560317 + vertex 0.532766 -0.24113 -0.559605 + vertex 0.51249 -0.239183 -0.657112 + endloop + endfacet + facet normal 0.978082 -0.0434605 -0.203632 + outer loop + vertex 0.536469 -0.153076 -0.560317 + vertex 0.51249 -0.239183 -0.657112 + vertex 0.516116 -0.153076 -0.658075 + endloop + endfacet + facet normal 0.964533 -0.0435243 -0.260348 + outer loop + vertex 0.516116 -0.153076 -0.658075 + vertex 0.51249 -0.239183 -0.657112 + vertex 0.487742 -0.237142 -0.74914 + endloop + endfacet + facet normal 0.964686 -0.0443398 -0.259643 + outer loop + vertex 0.516116 -0.153076 -0.658075 + vertex 0.487742 -0.237142 -0.74914 + vertex 0.491272 -0.153076 -0.750381 + endloop + endfacet + facet normal 0.944459 -0.0444644 -0.325609 + outer loop + vertex 0.491272 -0.153076 -0.750381 + vertex 0.487742 -0.237142 -0.74914 + vertex 0.458089 -0.235148 -0.835423 + endloop + endfacet + facet normal 0.944684 -0.045364 -0.324828 + outer loop + vertex 0.491272 -0.153076 -0.750381 + vertex 0.458089 -0.235148 -0.835423 + vertex 0.461502 -0.153076 -0.836959 + endloop + endfacet + facet normal 0.915375 -0.0455524 -0.400016 + outer loop + vertex 0.461502 -0.153076 -0.836959 + vertex 0.458089 -0.235148 -0.835423 + vertex 0.423099 -0.233344 -0.915698 + endloop + endfacet + facet normal 0.915674 -0.0464689 -0.399228 + outer loop + vertex 0.461502 -0.153076 -0.836959 + vertex 0.423099 -0.233344 -0.915698 + vertex 0.426371 -0.153076 -0.917536 + endloop + endfacet + facet normal 0.874574 -0.0467032 -0.482638 + outer loop + vertex 0.426371 -0.153076 -0.917536 + vertex 0.423099 -0.233344 -0.915698 + vertex 0.38234 -0.231872 -0.9897 + endloop + endfacet + facet normal 0.874919 -0.0475448 -0.48193 + outer loop + vertex 0.426371 -0.153076 -0.917536 + vertex 0.38234 -0.231872 -0.9897 + vertex 0.385445 -0.153076 -0.991836 + endloop + endfacet + facet normal 0.819466 -0.047778 -0.571132 + outer loop + vertex 0.385445 -0.153076 -0.991836 + vertex 0.38234 -0.231872 -0.9897 + vertex 0.335378 -0.230876 -1.05716 + endloop + endfacet + facet normal 0.819786 -0.0484143 -0.57062 + outer loop + vertex 0.385445 -0.153076 -0.991836 + vertex 0.335378 -0.230876 -1.05716 + vertex 0.338288 -0.153076 -1.05958 + endloop + endfacet + facet normal 0.748372 -0.0485719 -0.661498 + outer loop + vertex 0.338288 -0.153076 -1.05958 + vertex 0.335378 -0.230876 -1.05716 + vertex 0.281783 -0.230496 -1.11783 + endloop + endfacet + facet normal 0.748534 -0.048843 -0.661295 + outer loop + vertex 0.338288 -0.153076 -1.05958 + vertex 0.281783 -0.230496 -1.11783 + vertex 0.284465 -0.153076 -1.12051 + endloop + endfacet + facet normal 0.979289 -0.1266 -0.158006 + outer loop + vertex 0.549001 -0.242839 -0.456883 + vertex 0.537718 -0.331669 -0.455637 + vertex 0.52167 -0.32827 -0.557825 + endloop + endfacet + facet normal 0.979297 -0.1279 -0.156907 + outer loop + vertex 0.549001 -0.242839 -0.456883 + vertex 0.52167 -0.32827 -0.557825 + vertex 0.532766 -0.24113 -0.559605 + endloop + endfacet + facet normal 0.970234 -0.127744 -0.205738 + outer loop + vertex 0.532766 -0.24113 -0.559605 + vertex 0.52167 -0.32827 -0.557825 + vertex 0.50164 -0.324388 -0.654694 + endloop + endfacet + facet normal 0.970313 -0.129362 -0.204348 + outer loop + vertex 0.532766 -0.24113 -0.559605 + vertex 0.50164 -0.324388 -0.654694 + vertex 0.51249 -0.239183 -0.657112 + endloop + endfacet + facet normal 0.956462 -0.129225 -0.261688 + outer loop + vertex 0.51249 -0.239183 -0.657112 + vertex 0.50164 -0.324388 -0.654694 + vertex 0.477214 -0.320295 -0.745993 + endloop + endfacet + facet normal 0.95664 -0.130972 -0.260165 + outer loop + vertex 0.51249 -0.239183 -0.657112 + vertex 0.477214 -0.320295 -0.745993 + vertex 0.487742 -0.237142 -0.74914 + endloop + endfacet + facet normal 0.936134 -0.130881 -0.326378 + outer loop + vertex 0.487742 -0.237142 -0.74914 + vertex 0.477214 -0.320295 -0.745993 + vertex 0.447976 -0.316263 -0.831472 + endloop + endfacet + facet normal 0.936416 -0.13258 -0.324881 + outer loop + vertex 0.487742 -0.237142 -0.74914 + vertex 0.447976 -0.316263 -0.831472 + vertex 0.458089 -0.235148 -0.835423 + endloop + endfacet + facet normal 0.906962 -0.132558 -0.399811 + outer loop + vertex 0.458089 -0.235148 -0.835423 + vertex 0.447976 -0.316263 -0.831472 + vertex 0.413511 -0.312564 -0.910881 + endloop + endfacet + facet normal 0.907322 -0.134048 -0.398495 + outer loop + vertex 0.458089 -0.235148 -0.835423 + vertex 0.413511 -0.312564 -0.910881 + vertex 0.423099 -0.233344 -0.915698 + endloop + endfacet + facet normal 0.866301 -0.13411 -0.481183 + outer loop + vertex 0.423099 -0.233344 -0.915698 + vertex 0.413511 -0.312564 -0.910881 + vertex 0.373376 -0.309515 -0.983989 + endloop + endfacet + facet normal 0.866719 -0.135377 -0.480075 + outer loop + vertex 0.423099 -0.233344 -0.915698 + vertex 0.373376 -0.309515 -0.983989 + vertex 0.38234 -0.231872 -0.9897 + endloop + endfacet + facet normal 0.811702 -0.135502 -0.568137 + outer loop + vertex 0.38234 -0.231872 -0.9897 + vertex 0.373376 -0.309515 -0.983989 + vertex 0.327127 -0.307433 -1.05056 + endloop + endfacet + facet normal 0.812111 -0.136457 -0.567323 + outer loop + vertex 0.38234 -0.231872 -0.9897 + vertex 0.327127 -0.307433 -1.05056 + vertex 0.335378 -0.230876 -1.05716 + endloop + endfacet + facet normal 0.741682 -0.136575 -0.6567 + outer loop + vertex 0.335378 -0.230876 -1.05716 + vertex 0.327127 -0.307433 -1.05056 + vertex 0.274322 -0.306633 -1.11037 + endloop + endfacet + facet normal 0.741914 -0.13701 -0.656347 + outer loop + vertex 0.335378 -0.230876 -1.05716 + vertex 0.274322 -0.306633 -1.11037 + vertex 0.281783 -0.230496 -1.11783 + endloop + endfacet + facet normal 0.96417 -0.211557 -0.160061 + outer loop + vertex 0.537718 -0.331669 -0.455637 + vertex 0.518926 -0.418635 -0.453892 + vertex 0.503194 -0.413584 -0.555333 + endloop + endfacet + facet normal 0.964022 -0.213401 -0.158495 + outer loop + vertex 0.537718 -0.331669 -0.455637 + vertex 0.503194 -0.413584 -0.555333 + vertex 0.52167 -0.32827 -0.557825 + endloop + endfacet + facet normal 0.95472 -0.212829 -0.20788 + outer loop + vertex 0.52167 -0.32827 -0.557825 + vertex 0.503194 -0.413584 -0.555333 + vertex 0.483593 -0.407788 -0.65129 + endloop + endfacet + facet normal 0.954641 -0.214989 -0.206011 + outer loop + vertex 0.52167 -0.32827 -0.557825 + vertex 0.483593 -0.407788 -0.65129 + vertex 0.50164 -0.324388 -0.654694 + endloop + endfacet + facet normal 0.940631 -0.214292 -0.263233 + outer loop + vertex 0.50164 -0.324388 -0.654694 + vertex 0.483593 -0.407788 -0.65129 + vertex 0.459748 -0.401622 -0.741516 + endloop + endfacet + facet normal 0.940667 -0.216405 -0.261371 + outer loop + vertex 0.50164 -0.324388 -0.654694 + vertex 0.459748 -0.401622 -0.741516 + vertex 0.477214 -0.320295 -0.745993 + endloop + endfacet + facet normal 0.920225 -0.215608 -0.326648 + outer loop + vertex 0.477214 -0.320295 -0.745993 + vertex 0.459748 -0.401622 -0.741516 + vertex 0.431286 -0.395463 -0.825763 + endloop + endfacet + facet normal 0.92037 -0.217376 -0.325065 + outer loop + vertex 0.477214 -0.320295 -0.745993 + vertex 0.431286 -0.395463 -0.825763 + vertex 0.447976 -0.316263 -0.831472 + endloop + endfacet + facet normal 0.891367 -0.216538 -0.398216 + outer loop + vertex 0.447976 -0.316263 -0.831472 + vertex 0.431286 -0.395463 -0.825763 + vertex 0.397833 -0.389688 -0.903784 + endloop + endfacet + facet normal 0.891565 -0.217775 -0.397098 + outer loop + vertex 0.447976 -0.316263 -0.831472 + vertex 0.397833 -0.389688 -0.903784 + vertex 0.413511 -0.312564 -0.910881 + endloop + endfacet + facet normal 0.851423 -0.217012 -0.477477 + outer loop + vertex 0.413511 -0.312564 -0.910881 + vertex 0.397833 -0.389688 -0.903784 + vertex 0.358904 -0.384851 -0.9754 + endloop + endfacet + facet normal 0.851656 -0.217936 -0.47664 + outer loop + vertex 0.413511 -0.312564 -0.910881 + vertex 0.358904 -0.384851 -0.9754 + vertex 0.373376 -0.309515 -0.983989 + endloop + endfacet + facet normal 0.798032 -0.217372 -0.562045 + outer loop + vertex 0.373376 -0.309515 -0.983989 + vertex 0.358904 -0.384851 -0.9754 + vertex 0.314011 -0.381506 -1.04044 + endloop + endfacet + facet normal 0.798289 -0.218088 -0.561402 + outer loop + vertex 0.373376 -0.309515 -0.983989 + vertex 0.314011 -0.381506 -1.04044 + vertex 0.327127 -0.307433 -1.05056 + endloop + endfacet + facet normal 0.729915 -0.217806 -0.647908 + outer loop + vertex 0.327127 -0.307433 -1.05056 + vertex 0.314011 -0.381506 -1.04044 + vertex 0.262669 -0.380206 -1.09871 + endloop + endfacet + facet normal 0.730102 -0.218198 -0.647566 + outer loop + vertex 0.327127 -0.307433 -1.05056 + vertex 0.262669 -0.380206 -1.09871 + vertex 0.274322 -0.306633 -1.11037 + endloop + endfacet + facet normal 0.940708 -0.297715 -0.162587 + outer loop + vertex 0.518926 -0.418635 -0.453892 + vertex 0.492633 -0.502805 -0.451898 + vertex 0.477351 -0.49616 -0.552484 + endloop + endfacet + facet normal 0.940346 -0.299842 -0.160762 + outer loop + vertex 0.518926 -0.418635 -0.453892 + vertex 0.477351 -0.49616 -0.552484 + vertex 0.503194 -0.413584 -0.555333 + endloop + endfacet + facet normal 0.930912 -0.298599 -0.210335 + outer loop + vertex 0.503194 -0.413584 -0.555333 + vertex 0.477351 -0.49616 -0.552484 + vertex 0.458375 -0.488481 -0.647371 + endloop + endfacet + facet normal 0.930618 -0.300948 -0.20828 + outer loop + vertex 0.503194 -0.413584 -0.555333 + vertex 0.458375 -0.488481 -0.647371 + vertex 0.483593 -0.407788 -0.65129 + endloop + endfacet + facet normal 0.916709 -0.299339 -0.264652 + outer loop + vertex 0.483593 -0.407788 -0.65129 + vertex 0.458375 -0.488481 -0.647371 + vertex 0.435406 -0.480211 -0.736286 + endloop + endfacet + facet normal 0.916564 -0.301388 -0.262824 + outer loop + vertex 0.483593 -0.407788 -0.65129 + vertex 0.435406 -0.480211 -0.736286 + vertex 0.459748 -0.401622 -0.741516 + endloop + endfacet + facet normal 0.896637 -0.299431 -0.326163 + outer loop + vertex 0.459748 -0.401622 -0.741516 + vertex 0.435406 -0.480211 -0.736286 + vertex 0.408146 -0.471793 -0.818954 + endloop + endfacet + facet normal 0.896631 -0.300814 -0.324906 + outer loop + vertex 0.459748 -0.401622 -0.741516 + vertex 0.408146 -0.471793 -0.818954 + vertex 0.431286 -0.395463 -0.825763 + endloop + endfacet + facet normal 0.8687 -0.298618 -0.395205 + outer loop + vertex 0.431286 -0.395463 -0.825763 + vertex 0.408146 -0.471793 -0.818954 + vertex 0.376296 -0.463669 -0.895101 + endloop + endfacet + facet normal 0.868747 -0.299231 -0.394639 + outer loop + vertex 0.431286 -0.395463 -0.825763 + vertex 0.376296 -0.463669 -0.895101 + vertex 0.397833 -0.389688 -0.903784 + endloop + endfacet + facet normal 0.830223 -0.297058 -0.471684 + outer loop + vertex 0.397833 -0.389688 -0.903784 + vertex 0.376296 -0.463669 -0.895101 + vertex 0.339276 -0.456727 -0.964632 + endloop + endfacet + facet normal 0.830274 -0.297353 -0.471408 + outer loop + vertex 0.397833 -0.389688 -0.903784 + vertex 0.339276 -0.456727 -0.964632 + vertex 0.358904 -0.384851 -0.9754 + endloop + endfacet + facet normal 0.778845 -0.295564 -0.55321 + outer loop + vertex 0.358904 -0.384851 -0.9754 + vertex 0.339276 -0.456727 -0.964632 + vertex 0.296508 -0.451852 -1.02745 + endloop + endfacet + facet normal 0.778939 -0.295889 -0.552905 + outer loop + vertex 0.358904 -0.384851 -0.9754 + vertex 0.296508 -0.451852 -1.02745 + vertex 0.314011 -0.381506 -1.04044 + endloop + endfacet + facet normal 0.713493 -0.29487 -0.635594 + outer loop + vertex 0.314011 -0.381506 -1.04044 + vertex 0.296508 -0.451852 -1.02745 + vertex 0.247411 -0.449932 -1.08345 + endloop + endfacet + facet normal 0.71363 -0.295197 -0.635288 + outer loop + vertex 0.314011 -0.381506 -1.04044 + vertex 0.247411 -0.449932 -1.08345 + vertex 0.262669 -0.380206 -1.09871 + endloop + endfacet + facet normal 0.907829 -0.385385 -0.165303 + outer loop + vertex 0.492633 -0.502805 -0.451898 + vertex 0.458847 -0.583247 -0.449905 + vertex 0.444153 -0.575083 -0.549636 + endloop + endfacet + facet normal 0.907256 -0.387523 -0.163438 + outer loop + vertex 0.492633 -0.502805 -0.451898 + vertex 0.444153 -0.575083 -0.549636 + vertex 0.477351 -0.49616 -0.552484 + endloop + endfacet + facet normal 0.89789 -0.385365 -0.212809 + outer loop + vertex 0.477351 -0.49616 -0.552484 + vertex 0.444153 -0.575083 -0.549636 + vertex 0.426013 -0.565564 -0.643408 + endloop + endfacet + facet normal 0.897399 -0.387588 -0.210834 + outer loop + vertex 0.477351 -0.49616 -0.552484 + vertex 0.426013 -0.565564 -0.643408 + vertex 0.458375 -0.488481 -0.647371 + endloop + endfacet + facet normal 0.88393 -0.384757 -0.265762 + outer loop + vertex 0.458375 -0.488481 -0.647371 + vertex 0.426013 -0.565564 -0.643408 + vertex 0.404249 -0.555148 -0.730878 + endloop + endfacet + facet normal 0.883648 -0.386466 -0.264216 + outer loop + vertex 0.458375 -0.488481 -0.647371 + vertex 0.404249 -0.555148 -0.730878 + vertex 0.435406 -0.480211 -0.736286 + endloop + endfacet + facet normal 0.864701 -0.382974 -0.324997 + outer loop + vertex 0.435406 -0.480211 -0.736286 + vertex 0.404249 -0.555148 -0.730878 + vertex 0.378679 -0.544293 -0.8117 + endloop + endfacet + facet normal 0.864617 -0.383839 -0.324199 + outer loop + vertex 0.435406 -0.480211 -0.736286 + vertex 0.378679 -0.544293 -0.8117 + vertex 0.408146 -0.471793 -0.818954 + endloop + endfacet + facet normal 0.838231 -0.379826 -0.39128 + outer loop + vertex 0.408146 -0.471793 -0.818954 + vertex 0.378679 -0.544293 -0.8117 + vertex 0.349125 -0.533458 -0.885532 + endloop + endfacet + facet normal 0.838229 -0.379977 -0.391139 + outer loop + vertex 0.408146 -0.471793 -0.818954 + vertex 0.349125 -0.533458 -0.885532 + vertex 0.376296 -0.463669 -0.895101 + endloop + endfacet + facet normal 0.801874 -0.375876 -0.464452 + outer loop + vertex 0.376296 -0.463669 -0.895101 + vertex 0.349125 -0.533458 -0.885532 + vertex 0.314844 -0.523988 -0.952382 + endloop + endfacet + facet normal 0.801873 -0.375868 -0.464459 + outer loop + vertex 0.376296 -0.463669 -0.895101 + vertex 0.314844 -0.523988 -0.952382 + vertex 0.339276 -0.456727 -0.964632 + endloop + endfacet + facet normal 0.753299 -0.372366 -0.54211 + outer loop + vertex 0.339276 -0.456727 -0.964632 + vertex 0.314844 -0.523988 -0.952382 + vertex 0.275093 -0.51723 -1.01226 + endloop + endfacet + facet normal 0.753358 -0.372642 -0.541839 + outer loop + vertex 0.339276 -0.456727 -0.964632 + vertex 0.275093 -0.51723 -1.01226 + vertex 0.296508 -0.451852 -1.02745 + endloop + endfacet + facet normal 0.691767 -0.370576 -0.619783 + outer loop + vertex 0.296508 -0.451852 -1.02745 + vertex 0.275093 -0.51723 -1.01226 + vertex 0.229132 -0.514529 -1.06518 + endloop + endfacet + facet normal 0.691939 -0.371045 -0.619311 + outer loop + vertex 0.296508 -0.451852 -1.02745 + vertex 0.229132 -0.514529 -1.06518 + vertex 0.247411 -0.449932 -1.08345 + endloop + endfacet + facet normal 0.864129 -0.474448 -0.167868 + outer loop + vertex 0.458847 -0.583247 -0.449905 + vertex 0.417578 -0.659028 -0.44816 + vertex 0.403613 -0.649442 -0.547144 + endloop + endfacet + facet normal 0.863427 -0.476309 -0.166203 + outer loop + vertex 0.458847 -0.583247 -0.449905 + vertex 0.403613 -0.649442 -0.547144 + vertex 0.444153 -0.575083 -0.549636 + endloop + endfacet + facet normal 0.854393 -0.473021 -0.215091 + outer loop + vertex 0.444153 -0.575083 -0.549636 + vertex 0.403613 -0.649442 -0.547144 + vertex 0.386507 -0.638154 -0.639916 + endloop + endfacet + facet normal 0.85377 -0.474922 -0.213365 + outer loop + vertex 0.444153 -0.575083 -0.549636 + vertex 0.386507 -0.638154 -0.639916 + vertex 0.426013 -0.565564 -0.643408 + endloop + endfacet + facet normal 0.841086 -0.470585 -0.266691 + outer loop + vertex 0.426013 -0.565564 -0.643408 + vertex 0.386507 -0.638154 -0.639916 + vertex 0.366225 -0.625592 -0.726046 + endloop + endfacet + facet normal 0.840708 -0.471991 -0.265396 + outer loop + vertex 0.426013 -0.565564 -0.643408 + vertex 0.366225 -0.625592 -0.726046 + vertex 0.404249 -0.555148 -0.730878 + endloop + endfacet + facet normal 0.823142 -0.466511 -0.323736 + outer loop + vertex 0.404249 -0.555148 -0.730878 + vertex 0.366225 -0.625592 -0.726046 + vertex 0.342731 -0.612185 -0.805104 + endloop + endfacet + facet normal 0.823009 -0.467175 -0.323116 + outer loop + vertex 0.404249 -0.555148 -0.730878 + vertex 0.342731 -0.612185 -0.805104 + vertex 0.378679 -0.544293 -0.8117 + endloop + endfacet + facet normal 0.798627 -0.460515 -0.387454 + outer loop + vertex 0.378679 -0.544293 -0.8117 + vertex 0.342731 -0.612185 -0.805104 + vertex 0.315987 -0.59836 -0.876659 + endloop + endfacet + facet normal 0.798606 -0.460693 -0.387286 + outer loop + vertex 0.378679 -0.544293 -0.8117 + vertex 0.315987 -0.59836 -0.876659 + vertex 0.349125 -0.533458 -0.885532 + endloop + endfacet + facet normal 0.765903 -0.453375 -0.455899 + outer loop + vertex 0.349125 -0.533458 -0.885532 + vertex 0.315987 -0.59836 -0.876659 + vertex 0.285382 -0.585784 -0.940583 + endloop + endfacet + facet normal 0.765917 -0.452391 -0.456851 + outer loop + vertex 0.349125 -0.533458 -0.885532 + vertex 0.285382 -0.585784 -0.940583 + vertex 0.314844 -0.523988 -0.952382 + endloop + endfacet + facet normal 0.722881 -0.445493 -0.528185 + outer loop + vertex 0.314844 -0.523988 -0.952382 + vertex 0.285382 -0.585784 -0.940583 + vertex 0.250302 -0.576118 -0.996746 + endloop + endfacet + facet normal 0.722684 -0.44383 -0.529852 + outer loop + vertex 0.314844 -0.523988 -0.952382 + vertex 0.250302 -0.576118 -0.996746 + vertex 0.275093 -0.51723 -1.01226 + endloop + endfacet + facet normal 0.667204 -0.439351 -0.601507 + outer loop + vertex 0.275093 -0.51723 -1.01226 + vertex 0.250302 -0.576118 -0.996746 + vertex 0.209244 -0.572013 -1.04529 + endloop + endfacet + facet normal 0.667105 -0.439022 -0.601856 + outer loop + vertex 0.275093 -0.51723 -1.01226 + vertex 0.209244 -0.572013 -1.04529 + vertex 0.229132 -0.514529 -1.06518 + endloop + endfacet + facet normal 0.808013 -0.564141 -0.169881 + outer loop + vertex 0.417578 -0.659028 -0.44816 + vertex 0.368835 -0.729217 -0.446914 + vertex 0.355743 -0.718323 -0.545364 + endloop + endfacet + facet normal 0.807358 -0.565441 -0.168671 + outer loop + vertex 0.417578 -0.659028 -0.44816 + vertex 0.355743 -0.718323 -0.545364 + vertex 0.403613 -0.649442 -0.547144 + endloop + endfacet + facet normal 0.798991 -0.560873 -0.216876 + outer loop + vertex 0.403613 -0.649442 -0.547144 + vertex 0.355743 -0.718323 -0.545364 + vertex 0.339855 -0.705364 -0.637409 + endloop + endfacet + facet normal 0.798387 -0.562216 -0.215617 + outer loop + vertex 0.403613 -0.649442 -0.547144 + vertex 0.339855 -0.705364 -0.637409 + vertex 0.386507 -0.638154 -0.639916 + endloop + endfacet + facet normal 0.786871 -0.556156 -0.26744 + outer loop + vertex 0.386507 -0.638154 -0.639916 + vertex 0.339855 -0.705364 -0.637409 + vertex 0.321285 -0.6907 -0.722544 + endloop + endfacet + facet normal 0.786468 -0.557194 -0.266462 + outer loop + vertex 0.386507 -0.638154 -0.639916 + vertex 0.321285 -0.6907 -0.722544 + vertex 0.366225 -0.625592 -0.726046 + endloop + endfacet + facet normal 0.770715 -0.549351 -0.322819 + outer loop + vertex 0.366225 -0.625592 -0.726046 + vertex 0.321285 -0.6907 -0.722544 + vertex 0.300144 -0.674686 -0.800266 + endloop + endfacet + facet normal 0.770523 -0.549954 -0.32225 + outer loop + vertex 0.366225 -0.625592 -0.726046 + vertex 0.300144 -0.674686 -0.800266 + vertex 0.342731 -0.612185 -0.805104 + endloop + endfacet + facet normal 0.748704 -0.539916 -0.384621 + outer loop + vertex 0.342731 -0.612185 -0.805104 + vertex 0.300144 -0.674686 -0.800266 + vertex 0.276548 -0.657682 -0.870068 + endloop + endfacet + facet normal 0.748594 -0.54038 -0.384184 + outer loop + vertex 0.342731 -0.612185 -0.805104 + vertex 0.276548 -0.657682 -0.870068 + vertex 0.315987 -0.59836 -0.876659 + endloop + endfacet + facet normal 0.720954 -0.529048 -0.447586 + outer loop + vertex 0.315987 -0.59836 -0.876659 + vertex 0.276548 -0.657682 -0.870068 + vertex 0.250666 -0.64126 -0.931169 + endloop + endfacet + facet normal 0.72117 -0.527498 -0.449066 + outer loop + vertex 0.315987 -0.59836 -0.876659 + vertex 0.250666 -0.64126 -0.931169 + vertex 0.285382 -0.585784 -0.940583 + endloop + endfacet + facet normal 0.685089 -0.515976 -0.51422 + outer loop + vertex 0.285382 -0.585784 -0.940583 + vertex 0.250666 -0.64126 -0.931169 + vertex 0.222668 -0.626995 -0.982784 + endloop + endfacet + facet normal 0.685106 -0.513821 -0.51635 + outer loop + vertex 0.285382 -0.585784 -0.940583 + vertex 0.222668 -0.626995 -0.982784 + vertex 0.250302 -0.576118 -0.996746 + endloop + endfacet + facet normal 0.637007 -0.505666 -0.581828 + outer loop + vertex 0.250302 -0.576118 -0.996746 + vertex 0.222668 -0.626995 -0.982784 + vertex 0.189158 -0.620402 -1.0252 + endloop + endfacet + facet normal 0.637047 -0.505853 -0.581622 + outer loop + vertex 0.250302 -0.576118 -0.996746 + vertex 0.189158 -0.620402 -1.0252 + vertex 0.209244 -0.572013 -1.04529 + endloop + endfacet + facet normal 0.737952 -0.652861 -0.170881 + outer loop + vertex 0.368835 -0.729217 -0.446914 + vertex 0.312627 -0.792882 -0.446415 + vertex 0.300557 -0.780813 -0.544652 + endloop + endfacet + facet normal 0.737627 -0.653354 -0.170394 + outer loop + vertex 0.368835 -0.729217 -0.446914 + vertex 0.300557 -0.780813 -0.544652 + vertex 0.355743 -0.718323 -0.545364 + endloop + endfacet + facet normal 0.730333 -0.647452 -0.21776 + outer loop + vertex 0.355743 -0.718323 -0.545364 + vertex 0.300557 -0.780813 -0.544652 + vertex 0.286056 -0.766311 -0.636401 + endloop + endfacet + facet normal 0.730015 -0.647987 -0.217235 + outer loop + vertex 0.355743 -0.718323 -0.545364 + vertex 0.286056 -0.766311 -0.636401 + vertex 0.339855 -0.705364 -0.637409 + endloop + endfacet + facet normal 0.720116 -0.640085 -0.267814 + outer loop + vertex 0.339855 -0.705364 -0.637409 + vertex 0.286056 -0.766311 -0.636401 + vertex 0.269375 -0.74963 -0.721126 + endloop + endfacet + facet normal 0.719871 -0.64055 -0.267362 + outer loop + vertex 0.339855 -0.705364 -0.637409 + vertex 0.269375 -0.74963 -0.721126 + vertex 0.321285 -0.6907 -0.722544 + endloop + endfacet + facet normal 0.706464 -0.630064 -0.322378 + outer loop + vertex 0.321285 -0.6907 -0.722544 + vertex 0.269375 -0.74963 -0.721126 + vertex 0.250763 -0.731018 -0.798286 + endloop + endfacet + facet normal 0.706286 -0.630455 -0.322004 + outer loop + vertex 0.321285 -0.6907 -0.722544 + vertex 0.250763 -0.731018 -0.798286 + vertex 0.300144 -0.674686 -0.800266 + endloop + endfacet + facet normal 0.687847 -0.616443 -0.383228 + outer loop + vertex 0.300144 -0.674686 -0.800266 + vertex 0.250763 -0.731018 -0.798286 + vertex 0.230473 -0.710728 -0.867343 + endloop + endfacet + facet normal 0.687653 -0.616956 -0.382751 + outer loop + vertex 0.300144 -0.674686 -0.800266 + vertex 0.230473 -0.710728 -0.867343 + vertex 0.276548 -0.657682 -0.870068 + endloop + endfacet + facet normal 0.665441 -0.600759 -0.443032 + outer loop + vertex 0.276548 -0.657682 -0.870068 + vertex 0.230473 -0.710728 -0.867343 + vertex 0.209579 -0.689834 -0.927058 + endloop + endfacet + facet normal 0.665528 -0.600463 -0.443302 + outer loop + vertex 0.276548 -0.657682 -0.870068 + vertex 0.209579 -0.689834 -0.927058 + vertex 0.250666 -0.64126 -0.931169 + endloop + endfacet + facet normal 0.636782 -0.581483 -0.506346 + outer loop + vertex 0.250666 -0.64126 -0.931169 + vertex 0.209579 -0.689834 -0.927058 + vertex 0.189158 -0.669413 -0.976191 + endloop + endfacet + facet normal 0.63674 -0.581694 -0.506157 + outer loop + vertex 0.250666 -0.64126 -0.931169 + vertex 0.189158 -0.669413 -0.976191 + vertex 0.222668 -0.626995 -0.982784 + endloop + endfacet + facet normal 0.600568 -0.562735 -0.568021 + outer loop + vertex 0.222668 -0.626995 -0.982784 + vertex 0.189158 -0.669413 -0.976191 + vertex 0.173078 -0.653333 -1.00912 + endloop + endfacet + facet normal 0.600568 -0.568022 -0.562734 + outer loop + vertex 0.222668 -0.626995 -0.982784 + vertex 0.173078 -0.653333 -1.00912 + vertex 0.189158 -0.620402 -1.0252 + endloop + endfacet + facet normal 0.0427593 -0.986795 -0.156226 + outer loop + vertex -0.327179 -1.03302 -0.457381 + vertex -0.327179 -1.01672 -0.560317 + vertex -0.239126 -1.01302 -0.559605 + endloop + endfacet + facet normal 0.042245 -0.986749 -0.15666 + outer loop + vertex -0.327179 -1.03302 -0.457381 + vertex -0.239126 -1.01302 -0.559605 + vertex -0.237417 -1.02926 -0.456883 + endloop + endfacet + facet normal 0.1279 -0.979297 -0.156907 + outer loop + vertex -0.237417 -1.02926 -0.456883 + vertex -0.239126 -1.01302 -0.559605 + vertex -0.151985 -1.00192 -0.557825 + endloop + endfacet + facet normal 0.126599 -0.979289 -0.158006 + outer loop + vertex -0.237417 -1.02926 -0.456883 + vertex -0.151985 -1.00192 -0.557825 + vertex -0.148586 -1.01797 -0.455637 + endloop + endfacet + facet normal 0.2134 -0.964023 -0.158496 + outer loop + vertex -0.148586 -1.01797 -0.455637 + vertex -0.151985 -1.00192 -0.557825 + vertex -0.0666708 -0.983449 -0.555333 + endloop + endfacet + facet normal 0.211557 -0.96417 -0.160061 + outer loop + vertex -0.148586 -1.01797 -0.455637 + vertex -0.0666708 -0.983449 -0.555333 + vertex -0.0616202 -0.999181 -0.453892 + endloop + endfacet + facet normal 0.299841 -0.940346 -0.160762 + outer loop + vertex -0.0616202 -0.999181 -0.453892 + vertex -0.0666708 -0.983449 -0.555333 + vertex 0.0159046 -0.957606 -0.552484 + endloop + endfacet + facet normal 0.297714 -0.940708 -0.162587 + outer loop + vertex -0.0616202 -0.999181 -0.453892 + vertex 0.0159046 -0.957606 -0.552484 + vertex 0.0225498 -0.972888 -0.451898 + endloop + endfacet + facet normal 0.387523 -0.907256 -0.163438 + outer loop + vertex 0.0225498 -0.972888 -0.451898 + vertex 0.0159046 -0.957606 -0.552484 + vertex 0.0948282 -0.924408 -0.549636 + endloop + endfacet + facet normal 0.385385 -0.907829 -0.165303 + outer loop + vertex 0.0225498 -0.972888 -0.451898 + vertex 0.0948282 -0.924408 -0.549636 + vertex 0.102992 -0.939102 -0.449905 + endloop + endfacet + facet normal 0.476308 -0.863428 -0.166203 + outer loop + vertex 0.102992 -0.939102 -0.449905 + vertex 0.0948282 -0.924408 -0.549636 + vertex 0.169187 -0.883868 -0.547144 + endloop + endfacet + facet normal 0.474448 -0.864129 -0.167868 + outer loop + vertex 0.102992 -0.939102 -0.449905 + vertex 0.169187 -0.883868 -0.547144 + vertex 0.178773 -0.897833 -0.44816 + endloop + endfacet + facet normal 0.565441 -0.807358 -0.168671 + outer loop + vertex 0.178773 -0.897833 -0.44816 + vertex 0.169187 -0.883868 -0.547144 + vertex 0.238068 -0.835998 -0.545364 + endloop + endfacet + facet normal 0.564141 -0.808013 -0.169881 + outer loop + vertex 0.178773 -0.897833 -0.44816 + vertex 0.238068 -0.835998 -0.545364 + vertex 0.248962 -0.849091 -0.446914 + endloop + endfacet + facet normal 0.653354 -0.737628 -0.170393 + outer loop + vertex 0.248962 -0.849091 -0.446914 + vertex 0.238068 -0.835998 -0.545364 + vertex 0.300557 -0.780813 -0.544652 + endloop + endfacet + facet normal 0.65286 -0.737952 -0.170881 + outer loop + vertex 0.248962 -0.849091 -0.446914 + vertex 0.300557 -0.780813 -0.544652 + vertex 0.312627 -0.792882 -0.446415 + endloop + endfacet + facet normal 0.0434612 -0.978083 -0.203631 + outer loop + vertex -0.327179 -1.01672 -0.560317 + vertex -0.327179 -0.996371 -0.658075 + vertex -0.241072 -0.992745 -0.657112 + endloop + endfacet + facet normal 0.0427772 -0.977991 -0.204216 + outer loop + vertex -0.327179 -1.01672 -0.560317 + vertex -0.241072 -0.992745 -0.657112 + vertex -0.239126 -1.01302 -0.559605 + endloop + endfacet + facet normal 0.12936 -0.970313 -0.204348 + outer loop + vertex -0.239126 -1.01302 -0.559605 + vertex -0.241072 -0.992745 -0.657112 + vertex -0.155867 -0.981895 -0.654694 + endloop + endfacet + facet normal 0.127744 -0.970234 -0.205738 + outer loop + vertex -0.239126 -1.01302 -0.559605 + vertex -0.155867 -0.981895 -0.654694 + vertex -0.151985 -1.00192 -0.557825 + endloop + endfacet + facet normal 0.214988 -0.954641 -0.20601 + outer loop + vertex -0.151985 -1.00192 -0.557825 + vertex -0.155867 -0.981895 -0.654694 + vertex -0.0724673 -0.963848 -0.65129 + endloop + endfacet + facet normal 0.212828 -0.95472 -0.20788 + outer loop + vertex -0.151985 -1.00192 -0.557825 + vertex -0.0724673 -0.963848 -0.65129 + vertex -0.0666708 -0.983449 -0.555333 + endloop + endfacet + facet normal 0.300948 -0.930618 -0.20828 + outer loop + vertex -0.0666708 -0.983449 -0.555333 + vertex -0.0724673 -0.963848 -0.65129 + vertex 0.0082256 -0.93863 -0.647371 + endloop + endfacet + facet normal 0.298599 -0.930913 -0.210335 + outer loop + vertex -0.0666708 -0.983449 -0.555333 + vertex 0.0082256 -0.93863 -0.647371 + vertex 0.0159046 -0.957606 -0.552484 + endloop + endfacet + facet normal 0.387589 -0.897398 -0.210834 + outer loop + vertex 0.0159046 -0.957606 -0.552484 + vertex 0.0082256 -0.93863 -0.647371 + vertex 0.0853091 -0.906268 -0.643408 + endloop + endfacet + facet normal 0.385365 -0.89789 -0.212809 + outer loop + vertex 0.0159046 -0.957606 -0.552484 + vertex 0.0853091 -0.906268 -0.643408 + vertex 0.0948282 -0.924408 -0.549636 + endloop + endfacet + facet normal 0.474921 -0.853771 -0.213366 + outer loop + vertex 0.0948282 -0.924408 -0.549636 + vertex 0.0853091 -0.906268 -0.643408 + vertex 0.157899 -0.866762 -0.639916 + endloop + endfacet + facet normal 0.47302 -0.854393 -0.215091 + outer loop + vertex 0.0948282 -0.924408 -0.549636 + vertex 0.157899 -0.866762 -0.639916 + vertex 0.169187 -0.883868 -0.547144 + endloop + endfacet + facet normal 0.562216 -0.798387 -0.215617 + outer loop + vertex 0.169187 -0.883868 -0.547144 + vertex 0.157899 -0.866762 -0.639916 + vertex 0.225109 -0.82011 -0.637409 + endloop + endfacet + facet normal 0.560872 -0.798991 -0.216876 + outer loop + vertex 0.169187 -0.883868 -0.547144 + vertex 0.225109 -0.82011 -0.637409 + vertex 0.238068 -0.835998 -0.545364 + endloop + endfacet + facet normal 0.647987 -0.730015 -0.217235 + outer loop + vertex 0.238068 -0.835998 -0.545364 + vertex 0.225109 -0.82011 -0.637409 + vertex 0.286056 -0.766311 -0.636401 + endloop + endfacet + facet normal 0.647452 -0.730333 -0.21776 + outer loop + vertex 0.238068 -0.835998 -0.545364 + vertex 0.286056 -0.766311 -0.636401 + vertex 0.300557 -0.780813 -0.544652 + endloop + endfacet + facet normal 0.0443395 -0.964686 -0.259644 + outer loop + vertex -0.327179 -0.996371 -0.658075 + vertex -0.327179 -0.971527 -0.750381 + vertex -0.243113 -0.967997 -0.74914 + endloop + endfacet + facet normal 0.043525 -0.964533 -0.260348 + outer loop + vertex -0.327179 -0.996371 -0.658075 + vertex -0.243113 -0.967997 -0.74914 + vertex -0.241072 -0.992745 -0.657112 + endloop + endfacet + facet normal 0.130971 -0.95664 -0.260166 + outer loop + vertex -0.241072 -0.992745 -0.657112 + vertex -0.243113 -0.967997 -0.74914 + vertex -0.15996 -0.957469 -0.745993 + endloop + endfacet + facet normal 0.129224 -0.956462 -0.261689 + outer loop + vertex -0.241072 -0.992745 -0.657112 + vertex -0.15996 -0.957469 -0.745993 + vertex -0.155867 -0.981895 -0.654694 + endloop + endfacet + facet normal 0.216405 -0.940667 -0.261371 + outer loop + vertex -0.155867 -0.981895 -0.654694 + vertex -0.15996 -0.957469 -0.745993 + vertex -0.0786331 -0.940003 -0.741516 + endloop + endfacet + facet normal 0.214292 -0.940631 -0.263234 + outer loop + vertex -0.155867 -0.981895 -0.654694 + vertex -0.0786331 -0.940003 -0.741516 + vertex -0.0724673 -0.963848 -0.65129 + endloop + endfacet + facet normal 0.301387 -0.916564 -0.262826 + outer loop + vertex -0.0724673 -0.963848 -0.65129 + vertex -0.0786331 -0.940003 -0.741516 + vertex -4.44334e-05 -0.915661 -0.736286 + endloop + endfacet + facet normal 0.299338 -0.916709 -0.264653 + outer loop + vertex -0.0724673 -0.963848 -0.65129 + vertex -4.44334e-05 -0.915661 -0.736286 + vertex 0.0082256 -0.93863 -0.647371 + endloop + endfacet + facet normal 0.386465 -0.883648 -0.264217 + outer loop + vertex 0.0082256 -0.93863 -0.647371 + vertex -4.44334e-05 -0.915661 -0.736286 + vertex 0.0748929 -0.884504 -0.730878 + endloop + endfacet + facet normal 0.384758 -0.88393 -0.265762 + outer loop + vertex 0.0082256 -0.93863 -0.647371 + vertex 0.0748929 -0.884504 -0.730878 + vertex 0.0853091 -0.906268 -0.643408 + endloop + endfacet + facet normal 0.471991 -0.840708 -0.265395 + outer loop + vertex 0.0853091 -0.906268 -0.643408 + vertex 0.0748929 -0.884504 -0.730878 + vertex 0.145337 -0.846481 -0.726046 + endloop + endfacet + facet normal 0.470584 -0.841087 -0.266691 + outer loop + vertex 0.0853091 -0.906268 -0.643408 + vertex 0.145337 -0.846481 -0.726046 + vertex 0.157899 -0.866762 -0.639916 + endloop + endfacet + facet normal 0.557194 -0.786469 -0.266462 + outer loop + vertex 0.157899 -0.866762 -0.639916 + vertex 0.145337 -0.846481 -0.726046 + vertex 0.210445 -0.80154 -0.722544 + endloop + endfacet + facet normal 0.556156 -0.786871 -0.26744 + outer loop + vertex 0.157899 -0.866762 -0.639916 + vertex 0.210445 -0.80154 -0.722544 + vertex 0.225109 -0.82011 -0.637409 + endloop + endfacet + facet normal 0.64055 -0.719871 -0.267361 + outer loop + vertex 0.225109 -0.82011 -0.637409 + vertex 0.210445 -0.80154 -0.722544 + vertex 0.269375 -0.74963 -0.721126 + endloop + endfacet + facet normal 0.640085 -0.720116 -0.267814 + outer loop + vertex 0.225109 -0.82011 -0.637409 + vertex 0.269375 -0.74963 -0.721126 + vertex 0.286056 -0.766311 -0.636401 + endloop + endfacet + facet normal 0.0453633 -0.944684 -0.324829 + outer loop + vertex -0.327179 -0.971527 -0.750381 + vertex -0.327179 -0.941757 -0.836959 + vertex -0.245107 -0.938344 -0.835423 + endloop + endfacet + facet normal 0.044464 -0.944458 -0.325609 + outer loop + vertex -0.327179 -0.971527 -0.750381 + vertex -0.245107 -0.938344 -0.835423 + vertex -0.243113 -0.967997 -0.74914 + endloop + endfacet + facet normal 0.13258 -0.936416 -0.324881 + outer loop + vertex -0.243113 -0.967997 -0.74914 + vertex -0.245107 -0.938344 -0.835423 + vertex -0.163992 -0.92823 -0.831472 + endloop + endfacet + facet normal 0.130881 -0.936134 -0.326378 + outer loop + vertex -0.243113 -0.967997 -0.74914 + vertex -0.163992 -0.92823 -0.831472 + vertex -0.15996 -0.957469 -0.745993 + endloop + endfacet + facet normal 0.217375 -0.92037 -0.325066 + outer loop + vertex -0.15996 -0.957469 -0.745993 + vertex -0.163992 -0.92823 -0.831472 + vertex -0.0847917 -0.911541 -0.825763 + endloop + endfacet + facet normal 0.215608 -0.920225 -0.326647 + outer loop + vertex -0.15996 -0.957469 -0.745993 + vertex -0.0847917 -0.911541 -0.825763 + vertex -0.0786331 -0.940003 -0.741516 + endloop + endfacet + facet normal 0.300813 -0.896631 -0.324905 + outer loop + vertex -0.0786331 -0.940003 -0.741516 + vertex -0.0847917 -0.911541 -0.825763 + vertex -0.0084626 -0.888401 -0.818953 + endloop + endfacet + facet normal 0.29943 -0.896638 -0.326163 + outer loop + vertex -0.0786331 -0.940003 -0.741516 + vertex -0.0084626 -0.888401 -0.818953 + vertex -4.44334e-05 -0.915661 -0.736286 + endloop + endfacet + facet normal 0.383839 -0.864617 -0.324199 + outer loop + vertex -4.44334e-05 -0.915661 -0.736286 + vertex -0.0084626 -0.888401 -0.818953 + vertex 0.064038 -0.858934 -0.8117 + endloop + endfacet + facet normal 0.382974 -0.864701 -0.324998 + outer loop + vertex -4.44334e-05 -0.915661 -0.736286 + vertex 0.064038 -0.858934 -0.8117 + vertex 0.0748929 -0.884504 -0.730878 + endloop + endfacet + facet normal 0.467173 -0.82301 -0.323116 + outer loop + vertex 0.0748929 -0.884504 -0.730878 + vertex 0.064038 -0.858934 -0.8117 + vertex 0.13193 -0.822986 -0.805104 + endloop + endfacet + facet normal 0.466511 -0.823142 -0.323736 + outer loop + vertex 0.0748929 -0.884504 -0.730878 + vertex 0.13193 -0.822986 -0.805104 + vertex 0.145337 -0.846481 -0.726046 + endloop + endfacet + facet normal 0.549954 -0.770523 -0.322249 + outer loop + vertex 0.145337 -0.846481 -0.726046 + vertex 0.13193 -0.822986 -0.805104 + vertex 0.194431 -0.780399 -0.800266 + endloop + endfacet + facet normal 0.549351 -0.770715 -0.322819 + outer loop + vertex 0.145337 -0.846481 -0.726046 + vertex 0.194431 -0.780399 -0.800266 + vertex 0.210445 -0.80154 -0.722544 + endloop + endfacet + facet normal 0.630455 -0.706286 -0.322005 + outer loop + vertex 0.210445 -0.80154 -0.722544 + vertex 0.194431 -0.780399 -0.800266 + vertex 0.250763 -0.731018 -0.798286 + endloop + endfacet + facet normal 0.630064 -0.706464 -0.322378 + outer loop + vertex 0.210445 -0.80154 -0.722544 + vertex 0.250763 -0.731018 -0.798286 + vertex 0.269375 -0.74963 -0.721126 + endloop + endfacet + facet normal 0.0464682 -0.915674 -0.399228 + outer loop + vertex -0.327179 -0.941757 -0.836959 + vertex -0.327179 -0.906626 -0.917536 + vertex -0.246911 -0.903354 -0.915698 + endloop + endfacet + facet normal 0.0455517 -0.915375 -0.400016 + outer loop + vertex -0.327179 -0.941757 -0.836959 + vertex -0.246911 -0.903354 -0.915698 + vertex -0.245107 -0.938344 -0.835423 + endloop + endfacet + facet normal 0.134047 -0.907322 -0.398495 + outer loop + vertex -0.245107 -0.938344 -0.835423 + vertex -0.246911 -0.903354 -0.915698 + vertex -0.167691 -0.893765 -0.910881 + endloop + endfacet + facet normal 0.132557 -0.906962 -0.39981 + outer loop + vertex -0.245107 -0.938344 -0.835423 + vertex -0.167691 -0.893765 -0.910881 + vertex -0.163992 -0.92823 -0.831472 + endloop + endfacet + facet normal 0.217775 -0.891565 -0.397097 + outer loop + vertex -0.163992 -0.92823 -0.831472 + vertex -0.167691 -0.893765 -0.910881 + vertex -0.0905666 -0.878088 -0.903784 + endloop + endfacet + facet normal 0.216536 -0.891367 -0.398217 + outer loop + vertex -0.163992 -0.92823 -0.831472 + vertex -0.0905666 -0.878088 -0.903784 + vertex -0.0847917 -0.911541 -0.825763 + endloop + endfacet + facet normal 0.29923 -0.868747 -0.394639 + outer loop + vertex -0.0847917 -0.911541 -0.825763 + vertex -0.0905666 -0.878088 -0.903784 + vertex -0.016586 -0.856551 -0.895101 + endloop + endfacet + facet normal 0.298617 -0.868701 -0.395205 + outer loop + vertex -0.0847917 -0.911541 -0.825763 + vertex -0.016586 -0.856551 -0.895101 + vertex -0.0084626 -0.888401 -0.818953 + endloop + endfacet + facet normal 0.379977 -0.838229 -0.391139 + outer loop + vertex -0.0084626 -0.888401 -0.818953 + vertex -0.016586 -0.856551 -0.895101 + vertex 0.0532029 -0.82938 -0.885532 + endloop + endfacet + facet normal 0.379827 -0.838231 -0.39128 + outer loop + vertex -0.0084626 -0.888401 -0.818953 + vertex 0.0532029 -0.82938 -0.885532 + vertex 0.064038 -0.858934 -0.8117 + endloop + endfacet + facet normal 0.460693 -0.798606 -0.387286 + outer loop + vertex 0.064038 -0.858934 -0.8117 + vertex 0.0532029 -0.82938 -0.885532 + vertex 0.118105 -0.796242 -0.876659 + endloop + endfacet + facet normal 0.460514 -0.798627 -0.387455 + outer loop + vertex 0.064038 -0.858934 -0.8117 + vertex 0.118105 -0.796242 -0.876659 + vertex 0.13193 -0.822986 -0.805104 + endloop + endfacet + facet normal 0.540379 -0.748594 -0.384184 + outer loop + vertex 0.13193 -0.822986 -0.805104 + vertex 0.118105 -0.796242 -0.876659 + vertex 0.177427 -0.756803 -0.870068 + endloop + endfacet + facet normal 0.539916 -0.748704 -0.384621 + outer loop + vertex 0.13193 -0.822986 -0.805104 + vertex 0.177427 -0.756803 -0.870068 + vertex 0.194431 -0.780399 -0.800266 + endloop + endfacet + facet normal 0.616956 -0.687653 -0.382751 + outer loop + vertex 0.194431 -0.780399 -0.800266 + vertex 0.177427 -0.756803 -0.870068 + vertex 0.230473 -0.710728 -0.867343 + endloop + endfacet + facet normal 0.616443 -0.687847 -0.383229 + outer loop + vertex 0.194431 -0.780399 -0.800266 + vertex 0.230473 -0.710728 -0.867343 + vertex 0.250763 -0.731018 -0.798286 + endloop + endfacet + facet normal 0.0475431 -0.874919 -0.48193 + outer loop + vertex -0.327179 -0.906626 -0.917536 + vertex -0.327179 -0.865699 -0.991836 + vertex -0.248383 -0.862594 -0.9897 + endloop + endfacet + facet normal 0.0467026 -0.874574 -0.482638 + outer loop + vertex -0.327179 -0.906626 -0.917536 + vertex -0.248383 -0.862594 -0.9897 + vertex -0.246911 -0.903354 -0.915698 + endloop + endfacet + facet normal 0.135377 -0.866719 -0.480074 + outer loop + vertex -0.246911 -0.903354 -0.915698 + vertex -0.248383 -0.862594 -0.9897 + vertex -0.17074 -0.85363 -0.983989 + endloop + endfacet + facet normal 0.134109 -0.8663 -0.481184 + outer loop + vertex -0.246911 -0.903354 -0.915698 + vertex -0.17074 -0.85363 -0.983989 + vertex -0.167691 -0.893765 -0.910881 + endloop + endfacet + facet normal 0.217935 -0.851656 -0.47664 + outer loop + vertex -0.167691 -0.893765 -0.910881 + vertex -0.17074 -0.85363 -0.983989 + vertex -0.0954038 -0.839159 -0.9754 + endloop + endfacet + facet normal 0.217012 -0.851423 -0.477477 + outer loop + vertex -0.167691 -0.893765 -0.910881 + vertex -0.0954038 -0.839159 -0.9754 + vertex -0.0905666 -0.878088 -0.903784 + endloop + endfacet + facet normal 0.297355 -0.830274 -0.471407 + outer loop + vertex -0.0905666 -0.878088 -0.903784 + vertex -0.0954038 -0.839159 -0.9754 + vertex -0.0235283 -0.819531 -0.964632 + endloop + endfacet + facet normal 0.297057 -0.830223 -0.471685 + outer loop + vertex -0.0905666 -0.878088 -0.903784 + vertex -0.0235283 -0.819531 -0.964632 + vertex -0.016586 -0.856551 -0.895101 + endloop + endfacet + facet normal 0.375866 -0.801874 -0.46446 + outer loop + vertex -0.016586 -0.856551 -0.895101 + vertex -0.0235283 -0.819531 -0.964632 + vertex 0.0437332 -0.795099 -0.952382 + endloop + endfacet + facet normal 0.375876 -0.801875 -0.464451 + outer loop + vertex -0.016586 -0.856551 -0.895101 + vertex 0.0437332 -0.795099 -0.952382 + vertex 0.0532029 -0.82938 -0.885532 + endloop + endfacet + facet normal 0.452391 -0.765918 -0.456851 + outer loop + vertex 0.0532029 -0.82938 -0.885532 + vertex 0.0437332 -0.795099 -0.952382 + vertex 0.105528 -0.765637 -0.940583 + endloop + endfacet + facet normal 0.453375 -0.765903 -0.455899 + outer loop + vertex 0.0532029 -0.82938 -0.885532 + vertex 0.105528 -0.765637 -0.940583 + vertex 0.118105 -0.796242 -0.876659 + endloop + endfacet + facet normal 0.527498 -0.72117 -0.449065 + outer loop + vertex 0.118105 -0.796242 -0.876659 + vertex 0.105528 -0.765637 -0.940583 + vertex 0.161005 -0.730921 -0.931169 + endloop + endfacet + facet normal 0.529048 -0.720954 -0.447586 + outer loop + vertex 0.118105 -0.796242 -0.876659 + vertex 0.161005 -0.730921 -0.931169 + vertex 0.177427 -0.756803 -0.870068 + endloop + endfacet + facet normal 0.600463 -0.665528 -0.443302 + outer loop + vertex 0.177427 -0.756803 -0.870068 + vertex 0.161005 -0.730921 -0.931169 + vertex 0.209579 -0.689834 -0.927058 + endloop + endfacet + facet normal 0.600759 -0.665441 -0.443032 + outer loop + vertex 0.177427 -0.756803 -0.870068 + vertex 0.209579 -0.689834 -0.927058 + vertex 0.230473 -0.710728 -0.867343 + endloop + endfacet + facet normal 0.0484137 -0.819786 -0.570619 + outer loop + vertex -0.327179 -0.865699 -0.991836 + vertex -0.327179 -0.818542 -1.05958 + vertex -0.249379 -0.815633 -1.05716 + endloop + endfacet + facet normal 0.0477763 -0.819466 -0.571133 + outer loop + vertex -0.327179 -0.865699 -0.991836 + vertex -0.249379 -0.815633 -1.05716 + vertex -0.248383 -0.862594 -0.9897 + endloop + endfacet + facet normal 0.136457 -0.812111 -0.567323 + outer loop + vertex -0.248383 -0.862594 -0.9897 + vertex -0.249379 -0.815633 -1.05716 + vertex -0.172822 -0.807382 -1.05056 + endloop + endfacet + facet normal 0.135503 -0.811702 -0.568137 + outer loop + vertex -0.248383 -0.862594 -0.9897 + vertex -0.172822 -0.807382 -1.05056 + vertex -0.17074 -0.85363 -0.983989 + endloop + endfacet + facet normal 0.218088 -0.798289 -0.561402 + outer loop + vertex -0.17074 -0.85363 -0.983989 + vertex -0.172822 -0.807382 -1.05056 + vertex -0.0987492 -0.794266 -1.04044 + endloop + endfacet + facet normal 0.21737 -0.798031 -0.562047 + outer loop + vertex -0.17074 -0.85363 -0.983989 + vertex -0.0987492 -0.794266 -1.04044 + vertex -0.0954038 -0.839159 -0.9754 + endloop + endfacet + facet normal 0.295888 -0.778938 -0.552906 + outer loop + vertex -0.0954038 -0.839159 -0.9754 + vertex -0.0987492 -0.794266 -1.04044 + vertex -0.0284028 -0.776763 -1.02745 + endloop + endfacet + facet normal 0.295566 -0.778846 -0.553209 + outer loop + vertex -0.0954038 -0.839159 -0.9754 + vertex -0.0284028 -0.776763 -1.02745 + vertex -0.0235283 -0.819531 -0.964632 + endloop + endfacet + facet normal 0.372643 -0.753359 -0.541838 + outer loop + vertex -0.0235283 -0.819531 -0.964632 + vertex -0.0284028 -0.776763 -1.02745 + vertex 0.0369749 -0.755348 -1.01226 + endloop + endfacet + facet normal 0.372364 -0.753299 -0.542112 + outer loop + vertex -0.0235283 -0.819531 -0.964632 + vertex 0.0369749 -0.755348 -1.01226 + vertex 0.0437332 -0.795099 -0.952382 + endloop + endfacet + facet normal 0.443829 -0.722683 -0.529853 + outer loop + vertex 0.0437332 -0.795099 -0.952382 + vertex 0.0369749 -0.755348 -1.01226 + vertex 0.0958629 -0.730557 -0.996746 + endloop + endfacet + facet normal 0.445493 -0.72288 -0.528186 + outer loop + vertex 0.0437332 -0.795099 -0.952382 + vertex 0.0958629 -0.730557 -0.996746 + vertex 0.105528 -0.765637 -0.940583 + endloop + endfacet + facet normal 0.51382 -0.685107 -0.516351 + outer loop + vertex 0.105528 -0.765637 -0.940583 + vertex 0.0958629 -0.730557 -0.996746 + vertex 0.14674 -0.702923 -0.982784 + endloop + endfacet + facet normal 0.515975 -0.685089 -0.51422 + outer loop + vertex 0.105528 -0.765637 -0.940583 + vertex 0.14674 -0.702923 -0.982784 + vertex 0.161005 -0.730921 -0.931169 + endloop + endfacet + facet normal 0.581695 -0.63674 -0.506156 + outer loop + vertex 0.161005 -0.730921 -0.931169 + vertex 0.14674 -0.702923 -0.982784 + vertex 0.189158 -0.669413 -0.976191 + endloop + endfacet + facet normal 0.581483 -0.636782 -0.506346 + outer loop + vertex 0.161005 -0.730921 -0.931169 + vertex 0.189158 -0.669413 -0.976191 + vertex 0.209579 -0.689834 -0.927058 + endloop + endfacet + facet normal 0.0488436 -0.748534 -0.661295 + outer loop + vertex -0.327179 -0.818542 -1.05958 + vertex -0.327179 -0.764719 -1.12051 + vertex -0.249759 -0.762037 -1.11783 + endloop + endfacet + facet normal 0.0485713 -0.748371 -0.661499 + outer loop + vertex -0.327179 -0.818542 -1.05958 + vertex -0.249759 -0.762037 -1.11783 + vertex -0.249379 -0.815633 -1.05716 + endloop + endfacet + facet normal 0.137009 -0.741914 -0.656347 + outer loop + vertex -0.249379 -0.815633 -1.05716 + vertex -0.249759 -0.762037 -1.11783 + vertex -0.173622 -0.754577 -1.11037 + endloop + endfacet + facet normal 0.136575 -0.741682 -0.6567 + outer loop + vertex -0.249379 -0.815633 -1.05716 + vertex -0.173622 -0.754577 -1.11037 + vertex -0.172822 -0.807382 -1.05056 + endloop + endfacet + facet normal 0.218197 -0.730102 -0.647566 + outer loop + vertex -0.172822 -0.807382 -1.05056 + vertex -0.173622 -0.754577 -1.11037 + vertex -0.100049 -0.742924 -1.09871 + endloop + endfacet + facet normal 0.217805 -0.729915 -0.647908 + outer loop + vertex -0.172822 -0.807382 -1.05056 + vertex -0.100049 -0.742924 -1.09871 + vertex -0.0987492 -0.794266 -1.04044 + endloop + endfacet + facet normal 0.295197 -0.71363 -0.635288 + outer loop + vertex -0.0987492 -0.794266 -1.04044 + vertex -0.100049 -0.742924 -1.09871 + vertex -0.0303231 -0.727665 -1.08345 + endloop + endfacet + facet normal 0.294869 -0.713492 -0.635595 + outer loop + vertex -0.0987492 -0.794266 -1.04044 + vertex -0.0303231 -0.727665 -1.08345 + vertex -0.0284028 -0.776763 -1.02745 + endloop + endfacet + facet normal 0.371043 -0.691939 -0.619312 + outer loop + vertex -0.0284028 -0.776763 -1.02745 + vertex -0.0303231 -0.727665 -1.08345 + vertex 0.0342735 -0.709387 -1.06518 + endloop + endfacet + facet normal 0.370577 -0.691768 -0.619782 + outer loop + vertex -0.0284028 -0.776763 -1.02745 + vertex 0.0342735 -0.709387 -1.06518 + vertex 0.0369749 -0.755348 -1.01226 + endloop + endfacet + facet normal 0.439022 -0.667106 -0.601855 + outer loop + vertex 0.0369749 -0.755348 -1.01226 + vertex 0.0342735 -0.709387 -1.06518 + vertex 0.0917579 -0.689499 -1.04529 + endloop + endfacet + facet normal 0.43935 -0.667204 -0.601506 + outer loop + vertex 0.0369749 -0.755348 -1.01226 + vertex 0.0917579 -0.689499 -1.04529 + vertex 0.0958629 -0.730557 -0.996746 + endloop + endfacet + facet normal 0.505852 -0.637047 -0.581622 + outer loop + vertex 0.0958629 -0.730557 -0.996746 + vertex 0.0917579 -0.689499 -1.04529 + vertex 0.140147 -0.669413 -1.0252 + endloop + endfacet + facet normal 0.505664 -0.637008 -0.581829 + outer loop + vertex 0.0958629 -0.730557 -0.996746 + vertex 0.140147 -0.669413 -1.0252 + vertex 0.14674 -0.702923 -0.982784 + endloop + endfacet + facet normal 0.568022 -0.600567 -0.562734 + outer loop + vertex 0.14674 -0.702923 -0.982784 + vertex 0.140147 -0.669413 -1.0252 + vertex 0.173078 -0.653333 -1.00912 + endloop + endfacet + facet normal 0.562735 -0.600567 -0.568021 + outer loop + vertex 0.14674 -0.702923 -0.982784 + vertex 0.173078 -0.653333 -1.00912 + vertex 0.189158 -0.669413 -0.976191 + endloop + endfacet + facet normal 0.0422546 -0.992246 -0.116889 + outer loop + vertex -0.327179 -1.03302 -0.457381 + vertex -0.237417 -1.02926 -0.456883 + vertex -0.236088 -1.04188 -0.34921 + endloop + endfacet + facet normal 0.0419438 -0.992289 -0.11663 + outer loop + vertex -0.327179 -1.03302 -0.457381 + vertex -0.236088 -1.04188 -0.34921 + vertex -0.327179 -1.04569 -0.349542 + endloop + endfacet + facet normal 0.0419616 -0.995935 -0.0797085 + outer loop + vertex -0.327179 -1.04569 -0.349542 + vertex -0.236088 -1.04188 -0.34921 + vertex -0.23507 -1.05075 -0.237864 + endloop + endfacet + facet normal 0.0417479 -0.995958 -0.0795333 + outer loop + vertex -0.327179 -1.04569 -0.349542 + vertex -0.23507 -1.05075 -0.237864 + vertex -0.327179 -1.0546 -0.238072 + endloop + endfacet + facet normal 0.0417595 -0.998167 -0.0437988 + outer loop + vertex -0.327179 -1.0546 -0.238072 + vertex -0.23507 -1.05075 -0.237864 + vertex -0.234296 -1.05571 -0.124123 + endloop + endfacet + facet normal 0.0415584 -0.998183 -0.043635 + outer loop + vertex -0.327179 -1.0546 -0.238072 + vertex -0.234296 -1.05571 -0.124123 + vertex -0.327179 -1.05957 -0.124242 + endloop + endfacet + facet normal 0.0415512 -0.999104 -0.00802042 + outer loop + vertex -0.327179 -1.05957 -0.124242 + vertex -0.234296 -1.05571 -0.124123 + vertex -0.233698 -1.05661 -0.00926336 + endloop + endfacet + facet normal 0.0412984 -0.999116 -0.00781459 + outer loop + vertex -0.327179 -1.05957 -0.124242 + vertex -0.233698 -1.05661 -0.00926336 + vertex -0.327179 -1.06047 -0.0093227 + endloop + endfacet + facet normal 0.0412595 -0.998736 0.0286893 + outer loop + vertex -0.327179 -1.06047 -0.0093227 + vertex -0.233698 -1.05661 -0.00926336 + vertex -0.233207 -1.05329 0.105437 + endloop + endfacet + facet normal 0.0408904 -0.998743 0.0289919 + outer loop + vertex -0.327179 -1.06047 -0.0093227 + vertex -0.233207 -1.05329 0.105437 + vertex -0.327179 -1.05714 0.105413 + endloop + endfacet + facet normal 0.0406207 -0.992678 0.113757 + outer loop + vertex -0.327179 -1.05714 0.105413 + vertex -0.233207 -1.05329 0.105437 + vertex -0.232594 -1.04088 0.213522 + endloop + endfacet + facet normal 0.0398126 -0.99263 0.114457 + outer loop + vertex -0.327179 -1.05714 0.105413 + vertex -0.232594 -1.04088 0.213522 + vertex -0.327179 -1.04468 0.213516 + endloop + endfacet + facet normal 0.0386106 -0.962906 0.267061 + outer loop + vertex -0.327179 -1.04468 0.213516 + vertex -0.232594 -1.04088 0.213522 + vertex -0.231629 -1.01449 0.308537 + endloop + endfacet + facet normal 0.0370842 -0.962569 0.268489 + outer loop + vertex -0.327179 -1.04468 0.213516 + vertex -0.231629 -1.01449 0.308537 + vertex -0.327179 -1.01817 0.308537 + endloop + endfacet + facet normal 0.033037 -0.857519 0.51339 + outer loop + vertex -0.327179 -1.01817 0.308537 + vertex -0.231629 -1.01449 0.308537 + vertex -0.230082 -0.969235 0.384027 + endloop + endfacet + facet normal 0.0307591 -0.856314 0.515538 + outer loop + vertex -0.327179 -1.01817 0.308537 + vertex -0.230082 -0.969235 0.384027 + vertex -0.327179 -0.972723 0.384027 + endloop + endfacet + facet normal 0.126749 -0.984922 -0.117745 + outer loop + vertex -0.237417 -1.02926 -0.456883 + vertex -0.148586 -1.01797 -0.455637 + vertex -0.145943 -1.03046 -0.348379 + endloop + endfacet + facet normal 0.125963 -0.985101 -0.117084 + outer loop + vertex -0.237417 -1.02926 -0.456883 + vertex -0.145943 -1.03046 -0.348379 + vertex -0.236088 -1.04188 -0.34921 + endloop + endfacet + facet normal 0.126088 -0.988756 -0.0803902 + outer loop + vertex -0.236088 -1.04188 -0.34921 + vertex -0.145943 -1.03046 -0.348379 + vertex -0.143926 -1.03923 -0.237353 + endloop + endfacet + facet normal 0.125508 -0.988869 -0.0799092 + outer loop + vertex -0.236088 -1.04188 -0.34921 + vertex -0.143926 -1.03923 -0.237353 + vertex -0.23507 -1.05075 -0.237864 + endloop + endfacet + facet normal 0.125589 -0.991081 -0.0445664 + outer loop + vertex -0.23507 -1.05075 -0.237864 + vertex -0.143926 -1.03923 -0.237353 + vertex -0.142408 -1.04414 -0.123858 + endloop + endfacet + facet normal 0.124974 -0.991181 -0.0440603 + outer loop + vertex -0.23507 -1.05075 -0.237864 + vertex -0.142408 -1.04414 -0.123858 + vertex -0.234296 -1.05571 -0.124123 + endloop + endfacet + facet normal 0.124991 -0.992116 -0.00909585 + outer loop + vertex -0.234296 -1.05571 -0.124123 + vertex -0.142408 -1.04414 -0.123858 + vertex -0.14126 -1.04504 -0.00919506 + endloop + endfacet + facet normal 0.12414 -0.992229 -0.00839684 + outer loop + vertex -0.234296 -1.05571 -0.124123 + vertex -0.14126 -1.04504 -0.00919506 + vertex -0.233698 -1.05661 -0.00926336 + endloop + endfacet + facet normal 0.124073 -0.991903 0.027113 + outer loop + vertex -0.233698 -1.05661 -0.00926336 + vertex -0.14126 -1.04504 -0.00919506 + vertex -0.140353 -1.0418 0.105336 + endloop + endfacet + facet normal 0.122824 -0.992029 0.0281465 + outer loop + vertex -0.233698 -1.05661 -0.00926336 + vertex -0.140353 -1.0418 0.105336 + vertex -0.233207 -1.05329 0.105437 + endloop + endfacet + facet normal 0.122211 -0.986356 0.110303 + outer loop + vertex -0.233207 -1.05329 0.105437 + vertex -0.140353 -1.0418 0.105336 + vertex -0.139201 -1.02959 0.213278 + endloop + endfacet + facet normal 0.119603 -0.986417 0.11259 + outer loop + vertex -0.233207 -1.05329 0.105437 + vertex -0.139201 -1.02959 0.213278 + vertex -0.232594 -1.04088 0.213522 + endloop + endfacet + facet normal 0.116607 -0.958457 0.260313 + outer loop + vertex -0.232594 -1.04088 0.213522 + vertex -0.139201 -1.02959 0.213278 + vertex -0.137317 -1.00358 0.308176 + endloop + endfacet + facet normal 0.11179 -0.957776 0.264893 + outer loop + vertex -0.232594 -1.04088 0.213522 + vertex -0.137317 -1.00358 0.308176 + vertex -0.231629 -1.01449 0.308537 + endloop + endfacet + facet normal 0.101168 -0.858036 0.503527 + outer loop + vertex -0.231629 -1.01449 0.308537 + vertex -0.137317 -1.00358 0.308176 + vertex -0.134214 -0.958971 0.383572 + endloop + endfacet + facet normal 0.0939387 -0.854744 0.510478 + outer loop + vertex -0.231629 -1.01449 0.308537 + vertex -0.134214 -0.958971 0.383572 + vertex -0.230082 -0.969235 0.384027 + endloop + endfacet + facet normal 0.211992 -0.969991 -0.119066 + outer loop + vertex -0.148586 -1.01797 -0.455637 + vertex -0.0616202 -0.999181 -0.453892 + vertex -0.0576919 -1.01142 -0.347216 + endloop + endfacet + facet normal 0.210893 -0.970346 -0.118123 + outer loop + vertex -0.148586 -1.01797 -0.455637 + vertex -0.0576919 -1.01142 -0.347216 + vertex -0.145943 -1.03046 -0.348379 + endloop + endfacet + facet normal 0.211207 -0.974038 -0.0815005 + outer loop + vertex -0.145943 -1.03046 -0.348379 + vertex -0.0576919 -1.01142 -0.347216 + vertex -0.0547126 -1.02002 -0.23665 + endloop + endfacet + facet normal 0.210349 -0.974283 -0.0807775 + outer loop + vertex -0.145943 -1.03046 -0.348379 + vertex -0.0547126 -1.02002 -0.23665 + vertex -0.143926 -1.03923 -0.237353 + endloop + endfacet + facet normal 0.210553 -0.976505 -0.0458901 + outer loop + vertex -0.143926 -1.03923 -0.237353 + vertex -0.0547126 -1.02002 -0.23665 + vertex -0.0525087 -1.02486 -0.123539 + endloop + endfacet + facet normal 0.209571 -0.976754 -0.0450699 + outer loop + vertex -0.143926 -1.03923 -0.237353 + vertex -0.0525087 -1.02486 -0.123539 + vertex -0.142408 -1.04414 -0.123858 + endloop + endfacet + facet normal 0.209655 -0.977714 -0.0109858 + outer loop + vertex -0.142408 -1.04414 -0.123858 + vertex -0.0525087 -1.02486 -0.123539 + vertex -0.0509067 -1.0258 -0.00922753 + endloop + endfacet + facet normal 0.208255 -0.978025 -0.00981825 + outer loop + vertex -0.142408 -1.04414 -0.123858 + vertex -0.0509067 -1.0258 -0.00922753 + vertex -0.14126 -1.04504 -0.00919506 + endloop + endfacet + facet normal 0.208215 -0.97778 0.0243501 + outer loop + vertex -0.14126 -1.04504 -0.00919506 + vertex -0.0509067 -1.0258 -0.00922753 + vertex -0.0497334 -1.02271 0.104939 + endloop + endfacet + facet normal 0.20616 -0.978171 0.0260742 + outer loop + vertex -0.14126 -1.04504 -0.00919506 + vertex -0.0497334 -1.02271 0.104939 + vertex -0.140353 -1.0418 0.105336 + endloop + endfacet + facet normal 0.205438 -0.973116 0.104119 + outer loop + vertex -0.140353 -1.0418 0.105336 + vertex -0.0497334 -1.02271 0.104939 + vertex -0.0481903 -1.01087 0.212524 + endloop + endfacet + facet normal 0.201066 -0.973604 0.108019 + outer loop + vertex -0.140353 -1.0418 0.105336 + vertex -0.0481903 -1.01087 0.212524 + vertex -0.139201 -1.02959 0.213278 + endloop + endfacet + facet normal 0.197066 -0.948502 0.248009 + outer loop + vertex -0.139201 -1.02959 0.213278 + vertex -0.0481903 -1.01087 0.212524 + vertex -0.0454792 -0.985583 0.307092 + endloop + endfacet + facet normal 0.188827 -0.948048 0.256027 + outer loop + vertex -0.139201 -1.02959 0.213278 + vertex -0.0454792 -0.985583 0.307092 + vertex -0.137317 -1.00358 0.308176 + endloop + endfacet + facet normal 0.173703 -0.857086 0.485005 + outer loop + vertex -0.137317 -1.00358 0.308176 + vertex -0.0454792 -0.985583 0.307092 + vertex -0.0408019 -0.942129 0.382207 + endloop + endfacet + facet normal 0.160939 -0.852302 0.497675 + outer loop + vertex -0.137317 -1.00358 0.308176 + vertex -0.0408019 -0.942129 0.382207 + vertex -0.134214 -0.958971 0.383572 + endloop + endfacet + facet normal 0.298598 -0.946716 -0.120701 + outer loop + vertex -0.0616202 -0.999181 -0.453892 + vertex 0.0225498 -0.972888 -0.451898 + vertex 0.0277183 -0.984773 -0.345887 + endloop + endfacet + facet normal 0.297354 -0.947247 -0.1196 + outer loop + vertex -0.0616202 -0.999181 -0.453892 + vertex 0.0277183 -0.984773 -0.345887 + vertex -0.0576919 -1.01142 -0.347216 + endloop + endfacet + facet normal 0.297946 -0.950974 -0.0829249 + outer loop + vertex -0.0576919 -1.01142 -0.347216 + vertex 0.0277183 -0.984773 -0.345887 + vertex 0.0316055 -0.993149 -0.235868 + endloop + endfacet + facet normal 0.296931 -0.951368 -0.0820461 + outer loop + vertex -0.0576919 -1.01142 -0.347216 + vertex 0.0316055 -0.993149 -0.235868 + vertex -0.0547126 -1.02002 -0.23665 + endloop + endfacet + facet normal 0.297311 -0.953592 -0.0476359 + outer loop + vertex -0.0547126 -1.02002 -0.23665 + vertex 0.0316055 -0.993149 -0.235868 + vertex 0.0344069 -0.997901 -0.123256 + endloop + endfacet + facet normal 0.296093 -0.954022 -0.0465947 + outer loop + vertex -0.0547126 -1.02002 -0.23665 + vertex 0.0344069 -0.997901 -0.123256 + vertex -0.0525087 -1.02486 -0.123539 + endloop + endfacet + facet normal 0.29629 -0.955003 -0.0134867 + outer loop + vertex -0.0525087 -1.02486 -0.123539 + vertex 0.0344069 -0.997901 -0.123256 + vertex 0.036318 -0.998915 -0.00947047 + endloop + endfacet + facet normal 0.294536 -0.955565 -0.011993 + outer loop + vertex -0.0525087 -1.02486 -0.123539 + vertex 0.036318 -0.998915 -0.00947047 + vertex -0.0509067 -1.0258 -0.00922753 + endloop + endfacet + facet normal 0.294577 -0.955403 0.0207241 + outer loop + vertex -0.0509067 -1.0258 -0.00922753 + vertex 0.036318 -0.998915 -0.00947047 + vertex 0.0375341 -0.996077 0.104073 + endloop + endfacet + facet normal 0.292032 -0.956134 0.0229022 + outer loop + vertex -0.0509067 -1.0258 -0.00922753 + vertex 0.0375341 -0.996077 0.104073 + vertex -0.0497334 -1.02271 0.104939 + endloop + endfacet + facet normal 0.291435 -0.951819 0.0954246 + outer loop + vertex -0.0497334 -1.02271 0.104939 + vertex 0.0375341 -0.996077 0.104073 + vertex 0.0392465 -0.984833 0.210997 + endloop + endfacet + facet normal 0.285594 -0.953039 0.10076 + outer loop + vertex -0.0497334 -1.02271 0.104939 + vertex 0.0392465 -0.984833 0.210997 + vertex -0.0481903 -1.01087 0.212524 + endloop + endfacet + facet normal 0.281472 -0.931625 0.229887 + outer loop + vertex -0.0481903 -1.01087 0.212524 + vertex 0.0392465 -0.984833 0.210997 + vertex 0.0426461 -0.960629 0.304924 + endloop + endfacet + facet normal 0.269887 -0.932106 0.241537 + outer loop + vertex -0.0481903 -1.01087 0.212524 + vertex 0.0426461 -0.960629 0.304924 + vertex -0.0454792 -0.985583 0.307092 + endloop + endfacet + facet normal 0.25283 -0.853223 0.456167 + outer loop + vertex -0.0454792 -0.985583 0.307092 + vertex 0.0426461 -0.960629 0.304924 + vertex 0.0489241 -0.91891 0.379476 + endloop + endfacet + facet normal 0.233888 -0.847829 0.475902 + outer loop + vertex -0.0454792 -0.985583 0.307092 + vertex 0.0489241 -0.91891 0.379476 + vertex -0.0408019 -0.942129 0.382207 + endloop + endfacet + facet normal 0.386896 -0.913954 -0.122471 + outer loop + vertex 0.0225498 -0.972888 -0.451898 + vertex 0.102992 -0.939102 -0.449905 + vertex 0.109341 -0.950531 -0.344558 + endloop + endfacet + facet normal 0.385678 -0.914619 -0.121347 + outer loop + vertex 0.0225498 -0.972888 -0.451898 + vertex 0.109341 -0.950531 -0.344558 + vertex 0.0277183 -0.984773 -0.345887 + endloop + endfacet + facet normal 0.386643 -0.918351 -0.0844947 + outer loop + vertex 0.0277183 -0.984773 -0.345887 + vertex 0.109341 -0.950531 -0.344558 + vertex 0.114063 -0.958612 -0.235117 + endloop + endfacet + facet normal 0.385623 -0.918863 -0.0835781 + outer loop + vertex 0.0277183 -0.984773 -0.345887 + vertex 0.114063 -0.958612 -0.235117 + vertex 0.0316055 -0.993149 -0.235868 + endloop + endfacet + facet normal 0.386236 -0.921067 -0.0495636 + outer loop + vertex 0.0316055 -0.993149 -0.235868 + vertex 0.114063 -0.958612 -0.235117 + vertex 0.117344 -0.963264 -0.123102 + endloop + endfacet + facet normal 0.384997 -0.921644 -0.0484691 + outer loop + vertex 0.0316055 -0.993149 -0.235868 + vertex 0.117344 -0.963264 -0.123102 + vertex 0.0344069 -0.997901 -0.123256 + endloop + endfacet + facet normal 0.385349 -0.922629 -0.0162111 + outer loop + vertex 0.0344069 -0.997901 -0.123256 + vertex 0.117344 -0.963264 -0.123102 + vertex 0.119372 -0.964404 -0.0100336 + endloop + endfacet + facet normal 0.383595 -0.923385 -0.0146712 + outer loop + vertex 0.0344069 -0.997901 -0.123256 + vertex 0.119372 -0.964404 -0.0100336 + vertex 0.036318 -0.998915 -0.00947047 + endloop + endfacet + facet normal 0.383764 -0.923278 0.0168492 + outer loop + vertex 0.036318 -0.998915 -0.00947047 + vertex 0.119372 -0.964404 -0.0100336 + vertex 0.120332 -0.96195 0.102567 + endloop + endfacet + facet normal 0.381303 -0.924254 0.0190166 + outer loop + vertex 0.036318 -0.998915 -0.00947047 + vertex 0.120332 -0.96195 0.102567 + vertex 0.0375341 -0.996077 0.104073 + endloop + endfacet + facet normal 0.381023 -0.920675 0.0847282 + outer loop + vertex 0.0375341 -0.996077 0.104073 + vertex 0.120332 -0.96195 0.102567 + vertex 0.121918 -0.95155 0.208436 + endloop + endfacet + facet normal 0.374336 -0.922812 0.0910466 + outer loop + vertex 0.0375341 -0.996077 0.104073 + vertex 0.121918 -0.95155 0.208436 + vertex 0.0392465 -0.984833 0.210997 + endloop + endfacet + facet normal 0.370952 -0.905583 0.205706 + outer loop + vertex 0.0392465 -0.984833 0.210997 + vertex 0.121918 -0.95155 0.208436 + vertex 0.125822 -0.928855 0.30131 + endloop + endfacet + facet normal 0.356398 -0.907812 0.221038 + outer loop + vertex 0.0392465 -0.984833 0.210997 + vertex 0.125822 -0.928855 0.30131 + vertex 0.0426461 -0.960629 0.304924 + endloop + endfacet + facet normal 0.340423 -0.843993 0.414473 + outer loop + vertex 0.0426461 -0.960629 0.304924 + vertex 0.125822 -0.928855 0.30131 + vertex 0.133736 -0.889511 0.374925 + endloop + endfacet + facet normal 0.314732 -0.839358 0.443195 + outer loop + vertex 0.0426461 -0.960629 0.304924 + vertex 0.133736 -0.889511 0.374925 + vertex 0.0489241 -0.91891 0.379476 + endloop + endfacet + facet normal 0.476759 -0.870222 -0.124156 + outer loop + vertex 0.102992 -0.939102 -0.449905 + vertex 0.178773 -0.897833 -0.44816 + vertex 0.186229 -0.908696 -0.343395 + endloop + endfacet + facet normal 0.475738 -0.870923 -0.123158 + outer loop + vertex 0.102992 -0.939102 -0.449905 + vertex 0.186229 -0.908696 -0.343395 + vertex 0.109341 -0.950531 -0.344558 + endloop + endfacet + facet normal 0.477172 -0.874593 -0.0859823 + outer loop + vertex 0.109341 -0.950531 -0.344558 + vertex 0.186229 -0.908696 -0.343395 + vertex 0.19171 -0.916413 -0.234478 + endloop + endfacet + facet normal 0.476317 -0.875139 -0.0851729 + outer loop + vertex 0.109341 -0.950531 -0.344558 + vertex 0.19171 -0.916413 -0.234478 + vertex 0.114063 -0.958612 -0.235117 + endloop + endfacet + facet normal 0.477207 -0.877289 -0.0513491 + outer loop + vertex 0.114063 -0.958612 -0.235117 + vertex 0.19171 -0.916413 -0.234478 + vertex 0.195372 -0.920944 -0.123039 + endloop + endfacet + facet normal 0.476189 -0.877897 -0.050406 + outer loop + vertex 0.114063 -0.958612 -0.235117 + vertex 0.195372 -0.920944 -0.123039 + vertex 0.117344 -0.963264 -0.123102 + endloop + endfacet + facet normal 0.476692 -0.878872 -0.0186722 + outer loop + vertex 0.117344 -0.963264 -0.123102 + vertex 0.195372 -0.920944 -0.123039 + vertex 0.197369 -0.922247 -0.0107065 + endloop + endfacet + facet normal 0.475293 -0.879655 -0.0173907 + outer loop + vertex 0.117344 -0.963264 -0.123102 + vertex 0.197369 -0.922247 -0.0107065 + vertex 0.119372 -0.964404 -0.0100336 + endloop + endfacet + facet normal 0.475528 -0.879598 0.0134135 + outer loop + vertex 0.119372 -0.964404 -0.0100336 + vertex 0.197369 -0.922247 -0.0107065 + vertex 0.197857 -0.920281 0.100889 + endloop + endfacet + facet normal 0.47363 -0.880594 0.0151525 + outer loop + vertex 0.119372 -0.964404 -0.0100336 + vertex 0.197857 -0.920281 0.100889 + vertex 0.120332 -0.96195 0.102567 + endloop + endfacet + facet normal 0.4734 -0.877855 0.0725464 + outer loop + vertex 0.120332 -0.96195 0.102567 + vertex 0.197857 -0.920281 0.100889 + vertex 0.198576 -0.911291 0.204991 + endloop + endfacet + facet normal 0.466288 -0.881048 0.0795586 + outer loop + vertex 0.120332 -0.96195 0.102567 + vertex 0.198576 -0.911291 0.204991 + vertex 0.121918 -0.95155 0.208436 + endloop + endfacet + facet normal 0.463838 -0.868032 0.177128 + outer loop + vertex 0.121918 -0.95155 0.208436 + vertex 0.198576 -0.911291 0.204991 + vertex 0.201262 -0.891521 0.294843 + endloop + endfacet + facet normal 0.448417 -0.872439 0.19435 + outer loop + vertex 0.121918 -0.95155 0.208436 + vertex 0.201262 -0.891521 0.294843 + vertex 0.125822 -0.928855 0.30131 + endloop + endfacet + facet normal 0.438232 -0.822864 0.36173 + outer loop + vertex 0.125822 -0.928855 0.30131 + vertex 0.201262 -0.891521 0.294843 + vertex 0.209402 -0.856237 0.365244 + endloop + endfacet + facet normal 0.411709 -0.821391 0.39473 + outer loop + vertex 0.125822 -0.928855 0.30131 + vertex 0.209402 -0.856237 0.365244 + vertex 0.133736 -0.889511 0.374925 + endloop + endfacet + facet normal 0.567392 -0.81383 -0.12549 + outer loop + vertex 0.178773 -0.897833 -0.44816 + vertex 0.248962 -0.849091 -0.446914 + vertex 0.257436 -0.859273 -0.342564 + endloop + endfacet + facet normal 0.566713 -0.814413 -0.124772 + outer loop + vertex 0.178773 -0.897833 -0.44816 + vertex 0.257436 -0.859273 -0.342564 + vertex 0.186229 -0.908696 -0.343395 + endloop + endfacet + facet normal 0.568704 -0.817913 -0.087144 + outer loop + vertex 0.186229 -0.908696 -0.343395 + vertex 0.257436 -0.859273 -0.342564 + vertex 0.263598 -0.866552 -0.234031 + endloop + endfacet + facet normal 0.568145 -0.818362 -0.0865761 + outer loop + vertex 0.186229 -0.908696 -0.343395 + vertex 0.263598 -0.866552 -0.234031 + vertex 0.19171 -0.916413 -0.234478 + endloop + endfacet + facet normal 0.569351 -0.820404 -0.0526919 + outer loop + vertex 0.19171 -0.916413 -0.234478 + vertex 0.263598 -0.866552 -0.234031 + vertex 0.267558 -0.870934 -0.12303 + endloop + endfacet + facet normal 0.568715 -0.820886 -0.0520624 + outer loop + vertex 0.19171 -0.916413 -0.234478 + vertex 0.267558 -0.870934 -0.12303 + vertex 0.195372 -0.920944 -0.123039 + endloop + endfacet + facet normal 0.569365 -0.82183 -0.0204614 + outer loop + vertex 0.195372 -0.920944 -0.123039 + vertex 0.267558 -0.870934 -0.12303 + vertex 0.269424 -0.872423 -0.0112786 + endloop + endfacet + facet normal 0.568532 -0.822426 -0.0196503 + outer loop + vertex 0.195372 -0.920944 -0.123039 + vertex 0.269424 -0.872423 -0.0112786 + vertex 0.197369 -0.922247 -0.0107065 + endloop + endfacet + facet normal 0.568772 -0.822422 0.0109735 + outer loop + vertex 0.197369 -0.922247 -0.0107065 + vertex 0.269424 -0.872423 -0.0112786 + vertex 0.269308 -0.871025 0.0995073 + endloop + endfacet + facet normal 0.567695 -0.823152 0.0120158 + outer loop + vertex 0.197369 -0.922247 -0.0107065 + vertex 0.269308 -0.871025 0.0995073 + vertex 0.197857 -0.920281 0.100889 + endloop + endfacet + facet normal 0.567302 -0.821185 0.0618331 + outer loop + vertex 0.197857 -0.920281 0.100889 + vertex 0.269308 -0.871025 0.0995073 + vertex 0.267972 -0.86432 0.20081 + endloop + endfacet + facet normal 0.562032 -0.824372 0.067316 + outer loop + vertex 0.197857 -0.920281 0.100889 + vertex 0.267972 -0.86432 0.20081 + vertex 0.198576 -0.911291 0.204991 + endloop + endfacet + facet normal 0.560226 -0.81407 0.153093 + outer loop + vertex 0.198576 -0.911291 0.204991 + vertex 0.267972 -0.86432 0.20081 + vertex 0.266183 -0.849885 0.284113 + endloop + endfacet + facet normal 0.551584 -0.817942 0.163483 + outer loop + vertex 0.198576 -0.911291 0.204991 + vertex 0.266183 -0.849885 0.284113 + vertex 0.201262 -0.891521 0.294843 + endloop + endfacet + facet normal 0.549389 -0.778322 0.303951 + outer loop + vertex 0.201262 -0.891521 0.294843 + vertex 0.266183 -0.849885 0.284113 + vertex 0.271691 -0.821389 0.347126 + endloop + endfacet + facet normal 0.532151 -0.779957 0.329367 + outer loop + vertex 0.201262 -0.891521 0.294843 + vertex 0.271691 -0.821389 0.347126 + vertex 0.209402 -0.856237 0.365244 + endloop + endfacet + facet normal 0.657109 -0.743161 -0.126172 + outer loop + vertex 0.248962 -0.849091 -0.446914 + vertex 0.312627 -0.792882 -0.446415 + vertex 0.322015 -0.80227 -0.342232 + endloop + endfacet + facet normal 0.656867 -0.743424 -0.125886 + outer loop + vertex 0.248962 -0.849091 -0.446914 + vertex 0.322015 -0.80227 -0.342232 + vertex 0.257436 -0.859273 -0.342564 + endloop + endfacet + facet normal 0.659469 -0.746594 -0.0877318 + outer loop + vertex 0.257436 -0.859273 -0.342564 + vertex 0.322015 -0.80227 -0.342232 + vertex 0.328777 -0.809032 -0.233855 + endloop + endfacet + facet normal 0.659278 -0.746789 -0.0875162 + outer loop + vertex 0.257436 -0.859273 -0.342564 + vertex 0.328777 -0.809032 -0.233855 + vertex 0.263598 -0.866552 -0.234031 + endloop + endfacet + facet normal 0.660823 -0.748644 -0.0533397 + outer loop + vertex 0.263598 -0.866552 -0.234031 + vertex 0.328777 -0.809032 -0.233855 + vertex 0.33297 -0.813226 -0.123039 + endloop + endfacet + facet normal 0.660623 -0.748836 -0.053123 + outer loop + vertex 0.263598 -0.866552 -0.234031 + vertex 0.33297 -0.813226 -0.123039 + vertex 0.267558 -0.870934 -0.12303 + endloop + endfacet + facet normal 0.66141 -0.749722 -0.0212866 + outer loop + vertex 0.267558 -0.870934 -0.12303 + vertex 0.33297 -0.813226 -0.123039 + vertex 0.334652 -0.814908 -0.0115394 + endloop + endfacet + facet normal 0.661175 -0.749937 -0.0210371 + outer loop + vertex 0.267558 -0.870934 -0.12303 + vertex 0.334652 -0.814908 -0.0115394 + vertex 0.269424 -0.872423 -0.0112786 + endloop + endfacet + facet normal 0.661358 -0.750005 0.00988015 + outer loop + vertex 0.269424 -0.872423 -0.0112786 + vertex 0.334652 -0.814908 -0.0115394 + vertex 0.333879 -0.814135 0.0988907 + endloop + endfacet + facet normal 0.66109 -0.750238 0.0101604 + outer loop + vertex 0.269424 -0.872423 -0.0112786 + vertex 0.333879 -0.814135 0.0988907 + vertex 0.269308 -0.871025 0.0995073 + endloop + endfacet + facet normal 0.660314 -0.748855 0.0565841 + outer loop + vertex 0.269308 -0.871025 0.0995073 + vertex 0.333879 -0.814135 0.0988907 + vertex 0.329878 -0.810133 0.198536 + endloop + endfacet + facet normal 0.658724 -0.75012 0.0583344 + outer loop + vertex 0.269308 -0.871025 0.0995073 + vertex 0.329878 -0.810133 0.198536 + vertex 0.267972 -0.86432 0.20081 + endloop + endfacet + facet normal 0.65496 -0.742338 0.141286 + outer loop + vertex 0.267972 -0.86432 0.20081 + vertex 0.329878 -0.810133 0.198536 + vertex 0.321875 -0.802131 0.277683 + endloop + endfacet + facet normal 0.653715 -0.743143 0.142811 + outer loop + vertex 0.267972 -0.86432 0.20081 + vertex 0.321875 -0.802131 0.277683 + vertex 0.266183 -0.849885 0.284113 + endloop + endfacet + facet normal 0.644468 -0.715155 0.270582 + outer loop + vertex 0.266183 -0.849885 0.284113 + vertex 0.321875 -0.802131 0.277683 + vertex 0.312305 -0.79256 0.325773 + endloop + endfacet + facet normal 0.647131 -0.714299 0.266456 + outer loop + vertex 0.266183 -0.849885 0.284113 + vertex 0.312305 -0.79256 0.325773 + vertex 0.271691 -0.821389 0.347126 + endloop + endfacet + facet normal -0.0419438 -0.992289 -0.11663 + outer loop + vertex -0.327179 -1.03302 -0.457381 + vertex -0.327179 -1.04569 -0.349542 + vertex -0.418271 -1.04188 -0.34921 + endloop + endfacet + facet normal -0.0422546 -0.992246 -0.116889 + outer loop + vertex -0.327179 -1.03302 -0.457381 + vertex -0.418271 -1.04188 -0.34921 + vertex -0.416941 -1.02926 -0.456883 + endloop + endfacet + facet normal -0.125965 -0.985101 -0.117084 + outer loop + vertex -0.416941 -1.02926 -0.456883 + vertex -0.418271 -1.04188 -0.34921 + vertex -0.508415 -1.03046 -0.348379 + endloop + endfacet + facet normal -0.126752 -0.984921 -0.117745 + outer loop + vertex -0.416941 -1.02926 -0.456883 + vertex -0.508415 -1.03046 -0.348379 + vertex -0.505772 -1.01797 -0.455637 + endloop + endfacet + facet normal -0.210893 -0.970346 -0.118123 + outer loop + vertex -0.505772 -1.01797 -0.455637 + vertex -0.508415 -1.03046 -0.348379 + vertex -0.596666 -1.01142 -0.347216 + endloop + endfacet + facet normal -0.211992 -0.969991 -0.119066 + outer loop + vertex -0.505772 -1.01797 -0.455637 + vertex -0.596666 -1.01142 -0.347216 + vertex -0.592738 -0.999181 -0.453892 + endloop + endfacet + facet normal -0.297354 -0.947247 -0.119601 + outer loop + vertex -0.592738 -0.999181 -0.453892 + vertex -0.596666 -1.01142 -0.347216 + vertex -0.682077 -0.984773 -0.345887 + endloop + endfacet + facet normal -0.298599 -0.946715 -0.120702 + outer loop + vertex -0.592738 -0.999181 -0.453892 + vertex -0.682077 -0.984773 -0.345887 + vertex -0.676908 -0.972887 -0.451898 + endloop + endfacet + facet normal -0.385678 -0.914619 -0.121348 + outer loop + vertex -0.676908 -0.972887 -0.451898 + vertex -0.682077 -0.984773 -0.345887 + vertex -0.763699 -0.950531 -0.344558 + endloop + endfacet + facet normal -0.386896 -0.913954 -0.122472 + outer loop + vertex -0.676908 -0.972887 -0.451898 + vertex -0.763699 -0.950531 -0.344558 + vertex -0.75735 -0.939102 -0.449905 + endloop + endfacet + facet normal -0.475738 -0.870922 -0.123158 + outer loop + vertex -0.75735 -0.939102 -0.449905 + vertex -0.763699 -0.950531 -0.344558 + vertex -0.840587 -0.908695 -0.343395 + endloop + endfacet + facet normal -0.476759 -0.870222 -0.124156 + outer loop + vertex -0.75735 -0.939102 -0.449905 + vertex -0.840587 -0.908695 -0.343395 + vertex -0.833131 -0.897833 -0.44816 + endloop + endfacet + facet normal -0.566714 -0.814413 -0.124771 + outer loop + vertex -0.833131 -0.897833 -0.44816 + vertex -0.840587 -0.908695 -0.343395 + vertex -0.911794 -0.859273 -0.342564 + endloop + endfacet + facet normal -0.567392 -0.813829 -0.12549 + outer loop + vertex -0.833131 -0.897833 -0.44816 + vertex -0.911794 -0.859273 -0.342564 + vertex -0.90332 -0.84909 -0.446914 + endloop + endfacet + facet normal -0.656867 -0.743424 -0.125886 + outer loop + vertex -0.90332 -0.84909 -0.446914 + vertex -0.911794 -0.859273 -0.342564 + vertex -0.976373 -0.802269 -0.342232 + endloop + endfacet + facet normal -0.657109 -0.743161 -0.126173 + outer loop + vertex -0.90332 -0.84909 -0.446914 + vertex -0.976373 -0.802269 -0.342232 + vertex -0.966985 -0.792882 -0.446415 + endloop + endfacet + facet normal -0.0417492 -0.995958 -0.0795333 + outer loop + vertex -0.327179 -1.04569 -0.349542 + vertex -0.327179 -1.0546 -0.238072 + vertex -0.419288 -1.05075 -0.237864 + endloop + endfacet + facet normal -0.0419616 -0.995935 -0.0797075 + outer loop + vertex -0.327179 -1.04569 -0.349542 + vertex -0.419288 -1.05075 -0.237864 + vertex -0.418271 -1.04188 -0.34921 + endloop + endfacet + facet normal -0.125509 -0.988869 -0.0799082 + outer loop + vertex -0.418271 -1.04188 -0.34921 + vertex -0.419288 -1.05075 -0.237864 + vertex -0.510432 -1.03923 -0.237353 + endloop + endfacet + facet normal -0.126091 -0.988756 -0.0803903 + outer loop + vertex -0.418271 -1.04188 -0.34921 + vertex -0.510432 -1.03923 -0.237353 + vertex -0.508415 -1.03046 -0.348379 + endloop + endfacet + facet normal -0.210349 -0.974283 -0.0807777 + outer loop + vertex -0.508415 -1.03046 -0.348379 + vertex -0.510432 -1.03923 -0.237353 + vertex -0.599646 -1.02002 -0.23665 + endloop + endfacet + facet normal -0.211207 -0.974038 -0.0815007 + outer loop + vertex -0.508415 -1.03046 -0.348379 + vertex -0.599646 -1.02002 -0.23665 + vertex -0.596666 -1.01142 -0.347216 + endloop + endfacet + facet normal -0.296931 -0.951368 -0.0820463 + outer loop + vertex -0.596666 -1.01142 -0.347216 + vertex -0.599646 -1.02002 -0.23665 + vertex -0.685964 -0.993149 -0.235868 + endloop + endfacet + facet normal -0.297946 -0.950974 -0.0829249 + outer loop + vertex -0.596666 -1.01142 -0.347216 + vertex -0.685964 -0.993149 -0.235868 + vertex -0.682077 -0.984773 -0.345887 + endloop + endfacet + facet normal -0.385623 -0.918863 -0.0835781 + outer loop + vertex -0.682077 -0.984773 -0.345887 + vertex -0.685964 -0.993149 -0.235868 + vertex -0.768421 -0.958612 -0.235117 + endloop + endfacet + facet normal -0.386643 -0.918351 -0.0844943 + outer loop + vertex -0.682077 -0.984773 -0.345887 + vertex -0.768421 -0.958612 -0.235117 + vertex -0.763699 -0.950531 -0.344558 + endloop + endfacet + facet normal -0.476318 -0.875138 -0.0851726 + outer loop + vertex -0.763699 -0.950531 -0.344558 + vertex -0.768421 -0.958612 -0.235117 + vertex -0.846068 -0.916412 -0.234478 + endloop + endfacet + facet normal -0.477173 -0.874593 -0.0859817 + outer loop + vertex -0.763699 -0.950531 -0.344558 + vertex -0.846068 -0.916412 -0.234478 + vertex -0.840587 -0.908695 -0.343395 + endloop + endfacet + facet normal -0.568145 -0.818362 -0.0865755 + outer loop + vertex -0.840587 -0.908695 -0.343395 + vertex -0.846068 -0.916412 -0.234478 + vertex -0.917956 -0.866552 -0.234031 + endloop + endfacet + facet normal -0.568704 -0.817913 -0.0871437 + outer loop + vertex -0.840587 -0.908695 -0.343395 + vertex -0.917956 -0.866552 -0.234031 + vertex -0.911794 -0.859273 -0.342564 + endloop + endfacet + facet normal -0.659278 -0.746789 -0.087516 + outer loop + vertex -0.911794 -0.859273 -0.342564 + vertex -0.917956 -0.866552 -0.234031 + vertex -0.983135 -0.809032 -0.233855 + endloop + endfacet + facet normal -0.659469 -0.746594 -0.0877318 + outer loop + vertex -0.911794 -0.859273 -0.342564 + vertex -0.983135 -0.809032 -0.233855 + vertex -0.976373 -0.802269 -0.342232 + endloop + endfacet + facet normal -0.041561 -0.998183 -0.043635 + outer loop + vertex -0.327179 -1.0546 -0.238072 + vertex -0.327179 -1.05957 -0.124242 + vertex -0.420062 -1.05571 -0.124123 + endloop + endfacet + facet normal -0.0417608 -0.998167 -0.0437977 + outer loop + vertex -0.327179 -1.0546 -0.238072 + vertex -0.420062 -1.05571 -0.124123 + vertex -0.419288 -1.05075 -0.237864 + endloop + endfacet + facet normal -0.124974 -0.991181 -0.0440594 + outer loop + vertex -0.419288 -1.05075 -0.237864 + vertex -0.420062 -1.05571 -0.124123 + vertex -0.51195 -1.04414 -0.123858 + endloop + endfacet + facet normal -0.12559 -0.991081 -0.0445664 + outer loop + vertex -0.419288 -1.05075 -0.237864 + vertex -0.51195 -1.04414 -0.123858 + vertex -0.510432 -1.03923 -0.237353 + endloop + endfacet + facet normal -0.209571 -0.976754 -0.0450699 + outer loop + vertex -0.510432 -1.03923 -0.237353 + vertex -0.51195 -1.04414 -0.123858 + vertex -0.60185 -1.02486 -0.123539 + endloop + endfacet + facet normal -0.210553 -0.976505 -0.0458901 + outer loop + vertex -0.510432 -1.03923 -0.237353 + vertex -0.60185 -1.02486 -0.123539 + vertex -0.599646 -1.02002 -0.23665 + endloop + endfacet + facet normal -0.296094 -0.954022 -0.0465947 + outer loop + vertex -0.599646 -1.02002 -0.23665 + vertex -0.60185 -1.02486 -0.123539 + vertex -0.688765 -0.997901 -0.123256 + endloop + endfacet + facet normal -0.297311 -0.953592 -0.0476349 + outer loop + vertex -0.599646 -1.02002 -0.23665 + vertex -0.688765 -0.997901 -0.123256 + vertex -0.685964 -0.993149 -0.235868 + endloop + endfacet + facet normal -0.384997 -0.921644 -0.0484682 + outer loop + vertex -0.685964 -0.993149 -0.235868 + vertex -0.688765 -0.997901 -0.123256 + vertex -0.771703 -0.963264 -0.123102 + endloop + endfacet + facet normal -0.386237 -0.921067 -0.0495639 + outer loop + vertex -0.685964 -0.993149 -0.235868 + vertex -0.771703 -0.963264 -0.123102 + vertex -0.768421 -0.958612 -0.235117 + endloop + endfacet + facet normal -0.476189 -0.877897 -0.0504062 + outer loop + vertex -0.768421 -0.958612 -0.235117 + vertex -0.771703 -0.963264 -0.123102 + vertex -0.84973 -0.920943 -0.123039 + endloop + endfacet + facet normal -0.477208 -0.877289 -0.0513495 + outer loop + vertex -0.768421 -0.958612 -0.235117 + vertex -0.84973 -0.920943 -0.123039 + vertex -0.846068 -0.916412 -0.234478 + endloop + endfacet + facet normal -0.568715 -0.820885 -0.0520628 + outer loop + vertex -0.846068 -0.916412 -0.234478 + vertex -0.84973 -0.920943 -0.123039 + vertex -0.921916 -0.870933 -0.12303 + endloop + endfacet + facet normal -0.569351 -0.820404 -0.0526922 + outer loop + vertex -0.846068 -0.916412 -0.234478 + vertex -0.921916 -0.870933 -0.12303 + vertex -0.917956 -0.866552 -0.234031 + endloop + endfacet + facet normal -0.660624 -0.748835 -0.0531232 + outer loop + vertex -0.917956 -0.866552 -0.234031 + vertex -0.921916 -0.870933 -0.12303 + vertex -0.987329 -0.813225 -0.123039 + endloop + endfacet + facet normal -0.660823 -0.748644 -0.0533389 + outer loop + vertex -0.917956 -0.866552 -0.234031 + vertex -0.987329 -0.813225 -0.123039 + vertex -0.983135 -0.809032 -0.233855 + endloop + endfacet + facet normal -0.0412997 -0.999116 -0.00781459 + outer loop + vertex -0.327179 -1.05957 -0.124242 + vertex -0.327179 -1.06047 -0.0093227 + vertex -0.42066 -1.05661 -0.00926336 + endloop + endfacet + facet normal -0.0415538 -0.999104 -0.0080215 + outer loop + vertex -0.327179 -1.05957 -0.124242 + vertex -0.42066 -1.05661 -0.00926336 + vertex -0.420062 -1.05571 -0.124123 + endloop + endfacet + facet normal -0.12414 -0.992229 -0.00839797 + outer loop + vertex -0.420062 -1.05571 -0.124123 + vertex -0.42066 -1.05661 -0.00926336 + vertex -0.513099 -1.04504 -0.00919506 + endloop + endfacet + facet normal -0.124991 -0.992116 -0.00909693 + outer loop + vertex -0.420062 -1.05571 -0.124123 + vertex -0.513099 -1.04504 -0.00919506 + vertex -0.51195 -1.04414 -0.123858 + endloop + endfacet + facet normal -0.208256 -0.978025 -0.00981936 + outer loop + vertex -0.51195 -1.04414 -0.123858 + vertex -0.513099 -1.04504 -0.00919506 + vertex -0.603452 -1.0258 -0.00922752 + endloop + endfacet + facet normal -0.209655 -0.977714 -0.0109858 + outer loop + vertex -0.51195 -1.04414 -0.123858 + vertex -0.603452 -1.0258 -0.00922752 + vertex -0.60185 -1.02486 -0.123539 + endloop + endfacet + facet normal -0.294536 -0.955565 -0.011993 + outer loop + vertex -0.60185 -1.02486 -0.123539 + vertex -0.603452 -1.0258 -0.00922752 + vertex -0.690676 -0.998915 -0.00947047 + endloop + endfacet + facet normal -0.296291 -0.955003 -0.0134877 + outer loop + vertex -0.60185 -1.02486 -0.123539 + vertex -0.690676 -0.998915 -0.00947047 + vertex -0.688765 -0.997901 -0.123256 + endloop + endfacet + facet normal -0.383595 -0.923385 -0.0146722 + outer loop + vertex -0.688765 -0.997901 -0.123256 + vertex -0.690676 -0.998915 -0.00947047 + vertex -0.77373 -0.964404 -0.0100336 + endloop + endfacet + facet normal -0.385348 -0.922629 -0.0162116 + outer loop + vertex -0.688765 -0.997901 -0.123256 + vertex -0.77373 -0.964404 -0.0100336 + vertex -0.771703 -0.963264 -0.123102 + endloop + endfacet + facet normal -0.475295 -0.879655 -0.0173912 + outer loop + vertex -0.771703 -0.963264 -0.123102 + vertex -0.77373 -0.964404 -0.0100336 + vertex -0.851727 -0.922247 -0.0107065 + endloop + endfacet + facet normal -0.476693 -0.878872 -0.0186722 + outer loop + vertex -0.771703 -0.963264 -0.123102 + vertex -0.851727 -0.922247 -0.0107065 + vertex -0.84973 -0.920943 -0.123039 + endloop + endfacet + facet normal -0.568532 -0.822426 -0.0196503 + outer loop + vertex -0.84973 -0.920943 -0.123039 + vertex -0.851727 -0.922247 -0.0107065 + vertex -0.923783 -0.872422 -0.0112786 + endloop + endfacet + facet normal -0.569366 -0.82183 -0.0204614 + outer loop + vertex -0.84973 -0.920943 -0.123039 + vertex -0.923783 -0.872422 -0.0112786 + vertex -0.921916 -0.870933 -0.12303 + endloop + endfacet + facet normal -0.661176 -0.749936 -0.0210372 + outer loop + vertex -0.921916 -0.870933 -0.12303 + vertex -0.923783 -0.872422 -0.0112786 + vertex -0.989011 -0.814907 -0.0115394 + endloop + endfacet + facet normal -0.661411 -0.749722 -0.0212866 + outer loop + vertex -0.921916 -0.870933 -0.12303 + vertex -0.989011 -0.814907 -0.0115394 + vertex -0.987329 -0.813225 -0.123039 + endloop + endfacet + facet normal -0.0408905 -0.998743 0.0289919 + outer loop + vertex -0.327179 -1.06047 -0.0093227 + vertex -0.327179 -1.05714 0.105413 + vertex -0.421151 -1.05329 0.105437 + endloop + endfacet + facet normal -0.0412608 -0.998736 0.0286882 + outer loop + vertex -0.327179 -1.06047 -0.0093227 + vertex -0.421151 -1.05329 0.105437 + vertex -0.42066 -1.05661 -0.00926336 + endloop + endfacet + facet normal -0.122824 -0.992029 0.0281454 + outer loop + vertex -0.42066 -1.05661 -0.00926336 + vertex -0.421151 -1.05329 0.105437 + vertex -0.514005 -1.0418 0.105336 + endloop + endfacet + facet normal -0.124073 -0.991903 0.027112 + outer loop + vertex -0.42066 -1.05661 -0.00926336 + vertex -0.514005 -1.0418 0.105336 + vertex -0.513099 -1.04504 -0.00919506 + endloop + endfacet + facet normal -0.206163 -0.97817 0.0260731 + outer loop + vertex -0.513099 -1.04504 -0.00919506 + vertex -0.514005 -1.0418 0.105336 + vertex -0.604625 -1.02271 0.104939 + endloop + endfacet + facet normal -0.208216 -0.97778 0.02435 + outer loop + vertex -0.513099 -1.04504 -0.00919506 + vertex -0.604625 -1.02271 0.104939 + vertex -0.603452 -1.0258 -0.00922752 + endloop + endfacet + facet normal -0.292032 -0.956134 0.0229021 + outer loop + vertex -0.603452 -1.0258 -0.00922752 + vertex -0.604625 -1.02271 0.104939 + vertex -0.691893 -0.996077 0.104073 + endloop + endfacet + facet normal -0.294577 -0.955403 0.0207239 + outer loop + vertex -0.603452 -1.0258 -0.00922752 + vertex -0.691893 -0.996077 0.104073 + vertex -0.690676 -0.998915 -0.00947047 + endloop + endfacet + facet normal -0.381303 -0.924254 0.0190164 + outer loop + vertex -0.690676 -0.998915 -0.00947047 + vertex -0.691893 -0.996077 0.104073 + vertex -0.77469 -0.961949 0.102567 + endloop + endfacet + facet normal -0.383764 -0.923278 0.0168491 + outer loop + vertex -0.690676 -0.998915 -0.00947047 + vertex -0.77469 -0.961949 0.102567 + vertex -0.77373 -0.964404 -0.0100336 + endloop + endfacet + facet normal -0.473631 -0.880593 0.0151523 + outer loop + vertex -0.77373 -0.964404 -0.0100336 + vertex -0.77469 -0.961949 0.102567 + vertex -0.852216 -0.920281 0.100889 + endloop + endfacet + facet normal -0.47553 -0.879598 0.0134128 + outer loop + vertex -0.77373 -0.964404 -0.0100336 + vertex -0.852216 -0.920281 0.100889 + vertex -0.851727 -0.922247 -0.0107065 + endloop + endfacet + facet normal -0.567695 -0.823151 0.012015 + outer loop + vertex -0.851727 -0.922247 -0.0107065 + vertex -0.852216 -0.920281 0.100889 + vertex -0.923666 -0.871025 0.0995073 + endloop + endfacet + facet normal -0.568772 -0.822422 0.0109732 + outer loop + vertex -0.851727 -0.922247 -0.0107065 + vertex -0.923666 -0.871025 0.0995073 + vertex -0.923783 -0.872422 -0.0112786 + endloop + endfacet + facet normal -0.66109 -0.750238 0.0101601 + outer loop + vertex -0.923783 -0.872422 -0.0112786 + vertex -0.923666 -0.871025 0.0995073 + vertex -0.988238 -0.814134 0.0988907 + endloop + endfacet + facet normal -0.661359 -0.750004 0.00987881 + outer loop + vertex -0.923783 -0.872422 -0.0112786 + vertex -0.988238 -0.814134 0.0988907 + vertex -0.989011 -0.814907 -0.0115394 + endloop + endfacet + facet normal -0.0398127 -0.99263 0.114457 + outer loop + vertex -0.327179 -1.05714 0.105413 + vertex -0.327179 -1.04468 0.213516 + vertex -0.421764 -1.04088 0.213522 + endloop + endfacet + facet normal -0.0406207 -0.992678 0.113757 + outer loop + vertex -0.327179 -1.05714 0.105413 + vertex -0.421764 -1.04088 0.213522 + vertex -0.421151 -1.05329 0.105437 + endloop + endfacet + facet normal -0.119603 -0.986417 0.11259 + outer loop + vertex -0.421151 -1.05329 0.105437 + vertex -0.421764 -1.04088 0.213522 + vertex -0.515157 -1.02959 0.213278 + endloop + endfacet + facet normal -0.122211 -0.986356 0.110303 + outer loop + vertex -0.421151 -1.05329 0.105437 + vertex -0.515157 -1.02959 0.213278 + vertex -0.514005 -1.0418 0.105336 + endloop + endfacet + facet normal -0.201067 -0.973604 0.108019 + outer loop + vertex -0.514005 -1.0418 0.105336 + vertex -0.515157 -1.02959 0.213278 + vertex -0.606168 -1.01087 0.212524 + endloop + endfacet + facet normal -0.20544 -0.973116 0.104118 + outer loop + vertex -0.514005 -1.0418 0.105336 + vertex -0.606168 -1.01087 0.212524 + vertex -0.604625 -1.02271 0.104939 + endloop + endfacet + facet normal -0.285595 -0.953039 0.100759 + outer loop + vertex -0.604625 -1.02271 0.104939 + vertex -0.606168 -1.01087 0.212524 + vertex -0.693605 -0.984833 0.210997 + endloop + endfacet + facet normal -0.291435 -0.951819 0.0954245 + outer loop + vertex -0.604625 -1.02271 0.104939 + vertex -0.693605 -0.984833 0.210997 + vertex -0.691893 -0.996077 0.104073 + endloop + endfacet + facet normal -0.374337 -0.922812 0.0910465 + outer loop + vertex -0.691893 -0.996077 0.104073 + vertex -0.693605 -0.984833 0.210997 + vertex -0.776276 -0.95155 0.208436 + endloop + endfacet + facet normal -0.381023 -0.920675 0.0847281 + outer loop + vertex -0.691893 -0.996077 0.104073 + vertex -0.776276 -0.95155 0.208436 + vertex -0.77469 -0.961949 0.102567 + endloop + endfacet + facet normal -0.46629 -0.881047 0.0795584 + outer loop + vertex -0.77469 -0.961949 0.102567 + vertex -0.776276 -0.95155 0.208436 + vertex -0.852934 -0.911291 0.204991 + endloop + endfacet + facet normal -0.473401 -0.877854 0.0725467 + outer loop + vertex -0.77469 -0.961949 0.102567 + vertex -0.852934 -0.911291 0.204991 + vertex -0.852216 -0.920281 0.100889 + endloop + endfacet + facet normal -0.562032 -0.824371 0.0673164 + outer loop + vertex -0.852216 -0.920281 0.100889 + vertex -0.852934 -0.911291 0.204991 + vertex -0.92233 -0.86432 0.20081 + endloop + endfacet + facet normal -0.567303 -0.821185 0.0618331 + outer loop + vertex -0.852216 -0.920281 0.100889 + vertex -0.92233 -0.86432 0.20081 + vertex -0.923666 -0.871025 0.0995073 + endloop + endfacet + facet normal -0.658726 -0.750118 0.0583344 + outer loop + vertex -0.923666 -0.871025 0.0995073 + vertex -0.92233 -0.86432 0.20081 + vertex -0.984236 -0.810133 0.198536 + endloop + endfacet + facet normal -0.660314 -0.748855 0.0565854 + outer loop + vertex -0.923666 -0.871025 0.0995073 + vertex -0.984236 -0.810133 0.198536 + vertex -0.988238 -0.814134 0.0988907 + endloop + endfacet + facet normal -0.0370842 -0.962569 0.268489 + outer loop + vertex -0.327179 -1.04468 0.213516 + vertex -0.327179 -1.01817 0.308537 + vertex -0.422729 -1.01449 0.308537 + endloop + endfacet + facet normal -0.0386107 -0.962906 0.267061 + outer loop + vertex -0.327179 -1.04468 0.213516 + vertex -0.422729 -1.01449 0.308537 + vertex -0.421764 -1.04088 0.213522 + endloop + endfacet + facet normal -0.11179 -0.957776 0.264893 + outer loop + vertex -0.421764 -1.04088 0.213522 + vertex -0.422729 -1.01449 0.308537 + vertex -0.517042 -1.00358 0.308176 + endloop + endfacet + facet normal -0.116607 -0.958457 0.260313 + outer loop + vertex -0.421764 -1.04088 0.213522 + vertex -0.517042 -1.00358 0.308176 + vertex -0.515157 -1.02959 0.213278 + endloop + endfacet + facet normal -0.188829 -0.948047 0.256026 + outer loop + vertex -0.515157 -1.02959 0.213278 + vertex -0.517042 -1.00358 0.308176 + vertex -0.608879 -0.985583 0.307092 + endloop + endfacet + facet normal -0.197067 -0.948502 0.24801 + outer loop + vertex -0.515157 -1.02959 0.213278 + vertex -0.608879 -0.985583 0.307092 + vertex -0.606168 -1.01087 0.212524 + endloop + endfacet + facet normal -0.269888 -0.932105 0.241537 + outer loop + vertex -0.606168 -1.01087 0.212524 + vertex -0.608879 -0.985583 0.307092 + vertex -0.697004 -0.960629 0.304924 + endloop + endfacet + facet normal -0.281473 -0.931625 0.229887 + outer loop + vertex -0.606168 -1.01087 0.212524 + vertex -0.697004 -0.960629 0.304924 + vertex -0.693605 -0.984833 0.210997 + endloop + endfacet + facet normal -0.356398 -0.907812 0.221039 + outer loop + vertex -0.693605 -0.984833 0.210997 + vertex -0.697004 -0.960629 0.304924 + vertex -0.78018 -0.928855 0.30131 + endloop + endfacet + facet normal -0.370952 -0.905583 0.205706 + outer loop + vertex -0.693605 -0.984833 0.210997 + vertex -0.78018 -0.928855 0.30131 + vertex -0.776276 -0.95155 0.208436 + endloop + endfacet + facet normal -0.448417 -0.872439 0.194351 + outer loop + vertex -0.776276 -0.95155 0.208436 + vertex -0.78018 -0.928855 0.30131 + vertex -0.855621 -0.89152 0.294843 + endloop + endfacet + facet normal -0.463839 -0.868032 0.177127 + outer loop + vertex -0.776276 -0.95155 0.208436 + vertex -0.855621 -0.89152 0.294843 + vertex -0.852934 -0.911291 0.204991 + endloop + endfacet + facet normal -0.551584 -0.817942 0.163482 + outer loop + vertex -0.852934 -0.911291 0.204991 + vertex -0.855621 -0.89152 0.294843 + vertex -0.920542 -0.849885 0.284113 + endloop + endfacet + facet normal -0.560226 -0.814069 0.153093 + outer loop + vertex -0.852934 -0.911291 0.204991 + vertex -0.920542 -0.849885 0.284113 + vertex -0.92233 -0.86432 0.20081 + endloop + endfacet + facet normal -0.653716 -0.743143 0.14281 + outer loop + vertex -0.92233 -0.86432 0.20081 + vertex -0.920542 -0.849885 0.284113 + vertex -0.976234 -0.80213 0.277683 + endloop + endfacet + facet normal -0.654961 -0.742337 0.141285 + outer loop + vertex -0.92233 -0.86432 0.20081 + vertex -0.976234 -0.80213 0.277683 + vertex -0.984236 -0.810133 0.198536 + endloop + endfacet + facet normal -0.0307602 -0.856314 0.515538 + outer loop + vertex -0.327179 -1.01817 0.308537 + vertex -0.327179 -0.972723 0.384027 + vertex -0.424276 -0.969235 0.384027 + endloop + endfacet + facet normal -0.033037 -0.857519 0.513391 + outer loop + vertex -0.327179 -1.01817 0.308537 + vertex -0.424276 -0.969235 0.384027 + vertex -0.422729 -1.01449 0.308537 + endloop + endfacet + facet normal -0.0939386 -0.854744 0.510479 + outer loop + vertex -0.422729 -1.01449 0.308537 + vertex -0.424276 -0.969235 0.384027 + vertex -0.520145 -0.958971 0.383572 + endloop + endfacet + facet normal -0.101168 -0.858035 0.503528 + outer loop + vertex -0.422729 -1.01449 0.308537 + vertex -0.520145 -0.958971 0.383572 + vertex -0.517042 -1.00358 0.308176 + endloop + endfacet + facet normal -0.16094 -0.852301 0.497676 + outer loop + vertex -0.517042 -1.00358 0.308176 + vertex -0.520145 -0.958971 0.383572 + vertex -0.613557 -0.942129 0.382207 + endloop + endfacet + facet normal -0.173705 -0.857086 0.485006 + outer loop + vertex -0.517042 -1.00358 0.308176 + vertex -0.613557 -0.942129 0.382207 + vertex -0.608879 -0.985583 0.307092 + endloop + endfacet + facet normal -0.23389 -0.847828 0.475902 + outer loop + vertex -0.608879 -0.985583 0.307092 + vertex -0.613557 -0.942129 0.382207 + vertex -0.703282 -0.918909 0.379476 + endloop + endfacet + facet normal -0.252831 -0.853222 0.456167 + outer loop + vertex -0.608879 -0.985583 0.307092 + vertex -0.703282 -0.918909 0.379476 + vertex -0.697004 -0.960629 0.304924 + endloop + endfacet + facet normal -0.314731 -0.839358 0.443196 + outer loop + vertex -0.697004 -0.960629 0.304924 + vertex -0.703282 -0.918909 0.379476 + vertex -0.788094 -0.889511 0.374925 + endloop + endfacet + facet normal -0.340423 -0.843993 0.414473 + outer loop + vertex -0.697004 -0.960629 0.304924 + vertex -0.788094 -0.889511 0.374925 + vertex -0.78018 -0.928855 0.30131 + endloop + endfacet + facet normal -0.411709 -0.821391 0.39473 + outer loop + vertex -0.78018 -0.928855 0.30131 + vertex -0.788094 -0.889511 0.374925 + vertex -0.863761 -0.856237 0.365244 + endloop + endfacet + facet normal -0.438232 -0.822864 0.361729 + outer loop + vertex -0.78018 -0.928855 0.30131 + vertex -0.863761 -0.856237 0.365244 + vertex -0.855621 -0.89152 0.294843 + endloop + endfacet + facet normal -0.532152 -0.779957 0.329366 + outer loop + vertex -0.855621 -0.89152 0.294843 + vertex -0.863761 -0.856237 0.365244 + vertex -0.926049 -0.821389 0.347126 + endloop + endfacet + facet normal -0.54939 -0.778321 0.303952 + outer loop + vertex -0.855621 -0.89152 0.294843 + vertex -0.926049 -0.821389 0.347126 + vertex -0.920542 -0.849885 0.284113 + endloop + endfacet + facet normal -0.647133 -0.714297 0.266455 + outer loop + vertex -0.920542 -0.849885 0.284113 + vertex -0.926049 -0.821389 0.347126 + vertex -0.966663 -0.79256 0.325773 + endloop + endfacet + facet normal -0.644469 -0.715154 0.270584 + outer loop + vertex -0.920542 -0.849885 0.284113 + vertex -0.966663 -0.79256 0.325773 + vertex -0.976234 -0.80213 0.277683 + endloop + endfacet + facet normal -0.042245 -0.986749 -0.15666 + outer loop + vertex -0.327179 -1.03302 -0.457381 + vertex -0.416941 -1.02926 -0.456883 + vertex -0.415232 -1.01302 -0.559605 + endloop + endfacet + facet normal -0.0427593 -0.986795 -0.156226 + outer loop + vertex -0.327179 -1.03302 -0.457381 + vertex -0.415232 -1.01302 -0.559605 + vertex -0.327179 -1.01672 -0.560317 + endloop + endfacet + facet normal -0.0427772 -0.977991 -0.204217 + outer loop + vertex -0.327179 -1.01672 -0.560317 + vertex -0.415232 -1.01302 -0.559605 + vertex -0.413286 -0.992745 -0.657112 + endloop + endfacet + facet normal -0.0434619 -0.978083 -0.203631 + outer loop + vertex -0.327179 -1.01672 -0.560317 + vertex -0.413286 -0.992745 -0.657112 + vertex -0.327179 -0.996371 -0.658075 + endloop + endfacet + facet normal -0.0435256 -0.964533 -0.260348 + outer loop + vertex -0.327179 -0.996371 -0.658075 + vertex -0.413286 -0.992745 -0.657112 + vertex -0.411245 -0.967997 -0.74914 + endloop + endfacet + facet normal -0.0443402 -0.964686 -0.259644 + outer loop + vertex -0.327179 -0.996371 -0.658075 + vertex -0.411245 -0.967997 -0.74914 + vertex -0.327179 -0.971527 -0.750381 + endloop + endfacet + facet normal -0.0444647 -0.944459 -0.325608 + outer loop + vertex -0.327179 -0.971527 -0.750381 + vertex -0.411245 -0.967997 -0.74914 + vertex -0.409251 -0.938344 -0.835423 + endloop + endfacet + facet normal -0.0453633 -0.944684 -0.324829 + outer loop + vertex -0.327179 -0.971527 -0.750381 + vertex -0.409251 -0.938344 -0.835423 + vertex -0.327179 -0.941757 -0.836959 + endloop + endfacet + facet normal -0.0455517 -0.915375 -0.400017 + outer loop + vertex -0.327179 -0.941757 -0.836959 + vertex -0.409251 -0.938344 -0.835423 + vertex -0.407447 -0.903354 -0.915698 + endloop + endfacet + facet normal -0.0464689 -0.915674 -0.399228 + outer loop + vertex -0.327179 -0.941757 -0.836959 + vertex -0.407447 -0.903354 -0.915698 + vertex -0.327179 -0.906626 -0.917536 + endloop + endfacet + facet normal -0.0467032 -0.874574 -0.482638 + outer loop + vertex -0.327179 -0.906626 -0.917536 + vertex -0.407447 -0.903354 -0.915698 + vertex -0.405975 -0.862594 -0.9897 + endloop + endfacet + facet normal -0.0475442 -0.874919 -0.48193 + outer loop + vertex -0.327179 -0.906626 -0.917536 + vertex -0.405975 -0.862594 -0.9897 + vertex -0.327179 -0.865699 -0.991836 + endloop + endfacet + facet normal -0.0477773 -0.819466 -0.571133 + outer loop + vertex -0.327179 -0.865699 -0.991836 + vertex -0.405975 -0.862594 -0.9897 + vertex -0.404978 -0.815633 -1.05716 + endloop + endfacet + facet normal -0.0484143 -0.819786 -0.570619 + outer loop + vertex -0.327179 -0.865699 -0.991836 + vertex -0.404978 -0.815633 -1.05716 + vertex -0.327179 -0.818542 -1.05958 + endloop + endfacet + facet normal -0.0485719 -0.748372 -0.661498 + outer loop + vertex -0.327179 -0.818542 -1.05958 + vertex -0.404978 -0.815633 -1.05716 + vertex -0.404599 -0.762037 -1.11783 + endloop + endfacet + facet normal -0.048843 -0.748534 -0.661295 + outer loop + vertex -0.327179 -0.818542 -1.05958 + vertex -0.404599 -0.762037 -1.11783 + vertex -0.327179 -0.764719 -1.12051 + endloop + endfacet + facet normal -0.126601 -0.979289 -0.158005 + outer loop + vertex -0.416941 -1.02926 -0.456883 + vertex -0.505772 -1.01797 -0.455637 + vertex -0.502373 -1.00192 -0.557825 + endloop + endfacet + facet normal -0.127901 -0.979296 -0.156907 + outer loop + vertex -0.416941 -1.02926 -0.456883 + vertex -0.502373 -1.00192 -0.557825 + vertex -0.415232 -1.01302 -0.559605 + endloop + endfacet + facet normal -0.127745 -0.970234 -0.205738 + outer loop + vertex -0.415232 -1.01302 -0.559605 + vertex -0.502373 -1.00192 -0.557825 + vertex -0.498491 -0.981895 -0.654694 + endloop + endfacet + facet normal -0.129361 -0.970313 -0.204349 + outer loop + vertex -0.415232 -1.01302 -0.559605 + vertex -0.498491 -0.981895 -0.654694 + vertex -0.413286 -0.992745 -0.657112 + endloop + endfacet + facet normal -0.129225 -0.956462 -0.261689 + outer loop + vertex -0.413286 -0.992745 -0.657112 + vertex -0.498491 -0.981895 -0.654694 + vertex -0.494398 -0.957469 -0.745993 + endloop + endfacet + facet normal -0.130972 -0.95664 -0.260166 + outer loop + vertex -0.413286 -0.992745 -0.657112 + vertex -0.494398 -0.957469 -0.745993 + vertex -0.411245 -0.967997 -0.74914 + endloop + endfacet + facet normal -0.130881 -0.936134 -0.326378 + outer loop + vertex -0.411245 -0.967997 -0.74914 + vertex -0.494398 -0.957469 -0.745993 + vertex -0.490366 -0.92823 -0.831472 + endloop + endfacet + facet normal -0.132581 -0.936416 -0.324881 + outer loop + vertex -0.411245 -0.967997 -0.74914 + vertex -0.490366 -0.92823 -0.831472 + vertex -0.409251 -0.938344 -0.835423 + endloop + endfacet + facet normal -0.132558 -0.906962 -0.399811 + outer loop + vertex -0.409251 -0.938344 -0.835423 + vertex -0.490366 -0.92823 -0.831472 + vertex -0.486667 -0.893765 -0.910881 + endloop + endfacet + facet normal -0.134048 -0.907322 -0.398495 + outer loop + vertex -0.409251 -0.938344 -0.835423 + vertex -0.486667 -0.893765 -0.910881 + vertex -0.407447 -0.903354 -0.915698 + endloop + endfacet + facet normal -0.13411 -0.866301 -0.481183 + outer loop + vertex -0.407447 -0.903354 -0.915698 + vertex -0.486667 -0.893765 -0.910881 + vertex -0.483618 -0.85363 -0.983989 + endloop + endfacet + facet normal -0.135376 -0.866719 -0.480075 + outer loop + vertex -0.407447 -0.903354 -0.915698 + vertex -0.483618 -0.85363 -0.983989 + vertex -0.405975 -0.862594 -0.9897 + endloop + endfacet + facet normal -0.135502 -0.811701 -0.568137 + outer loop + vertex -0.405975 -0.862594 -0.9897 + vertex -0.483618 -0.85363 -0.983989 + vertex -0.481536 -0.807382 -1.05056 + endloop + endfacet + facet normal -0.136457 -0.812111 -0.567323 + outer loop + vertex -0.405975 -0.862594 -0.9897 + vertex -0.481536 -0.807382 -1.05056 + vertex -0.404978 -0.815633 -1.05716 + endloop + endfacet + facet normal -0.136575 -0.741683 -0.656699 + outer loop + vertex -0.404978 -0.815633 -1.05716 + vertex -0.481536 -0.807382 -1.05056 + vertex -0.480736 -0.754577 -1.11037 + endloop + endfacet + facet normal -0.13701 -0.741915 -0.656347 + outer loop + vertex -0.404978 -0.815633 -1.05716 + vertex -0.480736 -0.754577 -1.11037 + vertex -0.404599 -0.762037 -1.11783 + endloop + endfacet + facet normal -0.211557 -0.96417 -0.16006 + outer loop + vertex -0.505772 -1.01797 -0.455637 + vertex -0.592738 -0.999181 -0.453892 + vertex -0.587687 -0.983449 -0.555333 + endloop + endfacet + facet normal -0.2134 -0.964023 -0.158495 + outer loop + vertex -0.505772 -1.01797 -0.455637 + vertex -0.587687 -0.983449 -0.555333 + vertex -0.502373 -1.00192 -0.557825 + endloop + endfacet + facet normal -0.212828 -0.95472 -0.207881 + outer loop + vertex -0.502373 -1.00192 -0.557825 + vertex -0.587687 -0.983449 -0.555333 + vertex -0.581891 -0.963848 -0.65129 + endloop + endfacet + facet normal -0.214989 -0.954641 -0.20601 + outer loop + vertex -0.502373 -1.00192 -0.557825 + vertex -0.581891 -0.963848 -0.65129 + vertex -0.498491 -0.981895 -0.654694 + endloop + endfacet + facet normal -0.214293 -0.940631 -0.263233 + outer loop + vertex -0.498491 -0.981895 -0.654694 + vertex -0.581891 -0.963848 -0.65129 + vertex -0.575725 -0.940003 -0.741516 + endloop + endfacet + facet normal -0.216405 -0.940667 -0.261372 + outer loop + vertex -0.498491 -0.981895 -0.654694 + vertex -0.575725 -0.940003 -0.741516 + vertex -0.494398 -0.957469 -0.745993 + endloop + endfacet + facet normal -0.215608 -0.920225 -0.326648 + outer loop + vertex -0.494398 -0.957469 -0.745993 + vertex -0.575725 -0.940003 -0.741516 + vertex -0.569566 -0.911541 -0.825763 + endloop + endfacet + facet normal -0.217376 -0.92037 -0.325065 + outer loop + vertex -0.494398 -0.957469 -0.745993 + vertex -0.569566 -0.911541 -0.825763 + vertex -0.490366 -0.92823 -0.831472 + endloop + endfacet + facet normal -0.216538 -0.891367 -0.398217 + outer loop + vertex -0.490366 -0.92823 -0.831472 + vertex -0.569566 -0.911541 -0.825763 + vertex -0.563791 -0.878088 -0.903784 + endloop + endfacet + facet normal -0.217775 -0.891565 -0.397098 + outer loop + vertex -0.490366 -0.92823 -0.831472 + vertex -0.563791 -0.878088 -0.903784 + vertex -0.486667 -0.893765 -0.910881 + endloop + endfacet + facet normal -0.217013 -0.851423 -0.477477 + outer loop + vertex -0.486667 -0.893765 -0.910881 + vertex -0.563791 -0.878088 -0.903784 + vertex -0.558954 -0.839159 -0.9754 + endloop + endfacet + facet normal -0.217937 -0.851657 -0.476639 + outer loop + vertex -0.486667 -0.893765 -0.910881 + vertex -0.558954 -0.839159 -0.9754 + vertex -0.483618 -0.85363 -0.983989 + endloop + endfacet + facet normal -0.217372 -0.798032 -0.562045 + outer loop + vertex -0.483618 -0.85363 -0.983989 + vertex -0.558954 -0.839159 -0.9754 + vertex -0.555609 -0.794266 -1.04044 + endloop + endfacet + facet normal -0.218088 -0.798288 -0.561403 + outer loop + vertex -0.483618 -0.85363 -0.983989 + vertex -0.555609 -0.794266 -1.04044 + vertex -0.481536 -0.807382 -1.05056 + endloop + endfacet + facet normal -0.217805 -0.729915 -0.647908 + outer loop + vertex -0.481536 -0.807382 -1.05056 + vertex -0.555609 -0.794266 -1.04044 + vertex -0.554309 -0.742924 -1.09871 + endloop + endfacet + facet normal -0.218198 -0.730102 -0.647565 + outer loop + vertex -0.481536 -0.807382 -1.05056 + vertex -0.554309 -0.742924 -1.09871 + vertex -0.480736 -0.754577 -1.11037 + endloop + endfacet + facet normal -0.297715 -0.940708 -0.162586 + outer loop + vertex -0.592738 -0.999181 -0.453892 + vertex -0.676908 -0.972887 -0.451898 + vertex -0.670263 -0.957606 -0.552484 + endloop + endfacet + facet normal -0.299842 -0.940346 -0.160761 + outer loop + vertex -0.592738 -0.999181 -0.453892 + vertex -0.670263 -0.957606 -0.552484 + vertex -0.587687 -0.983449 -0.555333 + endloop + endfacet + facet normal -0.298599 -0.930912 -0.210335 + outer loop + vertex -0.587687 -0.983449 -0.555333 + vertex -0.670263 -0.957606 -0.552484 + vertex -0.662584 -0.93863 -0.647371 + endloop + endfacet + facet normal -0.300948 -0.930618 -0.20828 + outer loop + vertex -0.587687 -0.983449 -0.555333 + vertex -0.662584 -0.93863 -0.647371 + vertex -0.581891 -0.963848 -0.65129 + endloop + endfacet + facet normal -0.299339 -0.916709 -0.264653 + outer loop + vertex -0.581891 -0.963848 -0.65129 + vertex -0.662584 -0.93863 -0.647371 + vertex -0.654314 -0.915661 -0.736286 + endloop + endfacet + facet normal -0.301388 -0.916564 -0.262825 + outer loop + vertex -0.581891 -0.963848 -0.65129 + vertex -0.654314 -0.915661 -0.736286 + vertex -0.575725 -0.940003 -0.741516 + endloop + endfacet + facet normal -0.299431 -0.896637 -0.326163 + outer loop + vertex -0.575725 -0.940003 -0.741516 + vertex -0.654314 -0.915661 -0.736286 + vertex -0.645895 -0.8884 -0.818954 + endloop + endfacet + facet normal -0.300814 -0.896631 -0.324906 + outer loop + vertex -0.575725 -0.940003 -0.741516 + vertex -0.645895 -0.8884 -0.818954 + vertex -0.569566 -0.911541 -0.825763 + endloop + endfacet + facet normal -0.298618 -0.868701 -0.395205 + outer loop + vertex -0.569566 -0.911541 -0.825763 + vertex -0.645895 -0.8884 -0.818954 + vertex -0.637772 -0.85655 -0.895101 + endloop + endfacet + facet normal -0.29923 -0.868747 -0.394639 + outer loop + vertex -0.569566 -0.911541 -0.825763 + vertex -0.637772 -0.85655 -0.895101 + vertex -0.563791 -0.878088 -0.903784 + endloop + endfacet + facet normal -0.297057 -0.830223 -0.471685 + outer loop + vertex -0.563791 -0.878088 -0.903784 + vertex -0.637772 -0.85655 -0.895101 + vertex -0.63083 -0.819531 -0.964632 + endloop + endfacet + facet normal -0.297354 -0.830275 -0.471407 + outer loop + vertex -0.563791 -0.878088 -0.903784 + vertex -0.63083 -0.819531 -0.964632 + vertex -0.558954 -0.839159 -0.9754 + endloop + endfacet + facet normal -0.295565 -0.778845 -0.55321 + outer loop + vertex -0.558954 -0.839159 -0.9754 + vertex -0.63083 -0.819531 -0.964632 + vertex -0.625955 -0.776762 -1.02745 + endloop + endfacet + facet normal -0.295889 -0.778939 -0.552905 + outer loop + vertex -0.558954 -0.839159 -0.9754 + vertex -0.625955 -0.776762 -1.02745 + vertex -0.555609 -0.794266 -1.04044 + endloop + endfacet + facet normal -0.29487 -0.713492 -0.635595 + outer loop + vertex -0.555609 -0.794266 -1.04044 + vertex -0.625955 -0.776762 -1.02745 + vertex -0.624035 -0.727665 -1.08345 + endloop + endfacet + facet normal -0.295197 -0.71363 -0.635288 + outer loop + vertex -0.555609 -0.794266 -1.04044 + vertex -0.624035 -0.727665 -1.08345 + vertex -0.554309 -0.742924 -1.09871 + endloop + endfacet + facet normal -0.385385 -0.907829 -0.165303 + outer loop + vertex -0.676908 -0.972887 -0.451898 + vertex -0.75735 -0.939102 -0.449905 + vertex -0.749186 -0.924408 -0.549636 + endloop + endfacet + facet normal -0.387524 -0.907256 -0.163437 + outer loop + vertex -0.676908 -0.972887 -0.451898 + vertex -0.749186 -0.924408 -0.549636 + vertex -0.670263 -0.957606 -0.552484 + endloop + endfacet + facet normal -0.385365 -0.89789 -0.212808 + outer loop + vertex -0.670263 -0.957606 -0.552484 + vertex -0.749186 -0.924408 -0.549636 + vertex -0.739667 -0.906268 -0.643408 + endloop + endfacet + facet normal -0.387588 -0.897399 -0.210834 + outer loop + vertex -0.670263 -0.957606 -0.552484 + vertex -0.739667 -0.906268 -0.643408 + vertex -0.662584 -0.93863 -0.647371 + endloop + endfacet + facet normal -0.384758 -0.88393 -0.265762 + outer loop + vertex -0.662584 -0.93863 -0.647371 + vertex -0.739667 -0.906268 -0.643408 + vertex -0.729251 -0.884504 -0.730878 + endloop + endfacet + facet normal -0.386466 -0.883648 -0.264216 + outer loop + vertex -0.662584 -0.93863 -0.647371 + vertex -0.729251 -0.884504 -0.730878 + vertex -0.654314 -0.915661 -0.736286 + endloop + endfacet + facet normal -0.382974 -0.864701 -0.324998 + outer loop + vertex -0.654314 -0.915661 -0.736286 + vertex -0.729251 -0.884504 -0.730878 + vertex -0.718396 -0.858934 -0.8117 + endloop + endfacet + facet normal -0.38384 -0.864617 -0.324199 + outer loop + vertex -0.654314 -0.915661 -0.736286 + vertex -0.718396 -0.858934 -0.8117 + vertex -0.645895 -0.8884 -0.818954 + endloop + endfacet + facet normal -0.379827 -0.838231 -0.39128 + outer loop + vertex -0.645895 -0.8884 -0.818954 + vertex -0.718396 -0.858934 -0.8117 + vertex -0.707561 -0.82938 -0.885532 + endloop + endfacet + facet normal -0.379976 -0.838229 -0.391139 + outer loop + vertex -0.645895 -0.8884 -0.818954 + vertex -0.707561 -0.82938 -0.885532 + vertex -0.637772 -0.85655 -0.895101 + endloop + endfacet + facet normal -0.375875 -0.801874 -0.464452 + outer loop + vertex -0.637772 -0.85655 -0.895101 + vertex -0.707561 -0.82938 -0.885532 + vertex -0.698091 -0.795099 -0.952382 + endloop + endfacet + facet normal -0.375867 -0.801874 -0.46446 + outer loop + vertex -0.637772 -0.85655 -0.895101 + vertex -0.698091 -0.795099 -0.952382 + vertex -0.63083 -0.819531 -0.964632 + endloop + endfacet + facet normal -0.372365 -0.7533 -0.54211 + outer loop + vertex -0.63083 -0.819531 -0.964632 + vertex -0.698091 -0.795099 -0.952382 + vertex -0.691333 -0.755348 -1.01226 + endloop + endfacet + facet normal -0.372642 -0.753359 -0.541839 + outer loop + vertex -0.63083 -0.819531 -0.964632 + vertex -0.691333 -0.755348 -1.01226 + vertex -0.625955 -0.776762 -1.02745 + endloop + endfacet + facet normal -0.370576 -0.691767 -0.619783 + outer loop + vertex -0.625955 -0.776762 -1.02745 + vertex -0.691333 -0.755348 -1.01226 + vertex -0.688631 -0.709386 -1.06518 + endloop + endfacet + facet normal -0.371044 -0.691939 -0.619312 + outer loop + vertex -0.625955 -0.776762 -1.02745 + vertex -0.688631 -0.709386 -1.06518 + vertex -0.624035 -0.727665 -1.08345 + endloop + endfacet + facet normal -0.474447 -0.864129 -0.167869 + outer loop + vertex -0.75735 -0.939102 -0.449905 + vertex -0.833131 -0.897833 -0.44816 + vertex -0.823545 -0.883868 -0.547144 + endloop + endfacet + facet normal -0.476308 -0.863427 -0.166203 + outer loop + vertex -0.75735 -0.939102 -0.449905 + vertex -0.823545 -0.883868 -0.547144 + vertex -0.749186 -0.924408 -0.549636 + endloop + endfacet + facet normal -0.473021 -0.854393 -0.215091 + outer loop + vertex -0.749186 -0.924408 -0.549636 + vertex -0.823545 -0.883868 -0.547144 + vertex -0.812257 -0.866762 -0.639916 + endloop + endfacet + facet normal -0.474922 -0.853771 -0.213365 + outer loop + vertex -0.749186 -0.924408 -0.549636 + vertex -0.812257 -0.866762 -0.639916 + vertex -0.739667 -0.906268 -0.643408 + endloop + endfacet + facet normal -0.470585 -0.841086 -0.266692 + outer loop + vertex -0.739667 -0.906268 -0.643408 + vertex -0.812257 -0.866762 -0.639916 + vertex -0.799695 -0.84648 -0.726046 + endloop + endfacet + facet normal -0.471992 -0.840708 -0.265396 + outer loop + vertex -0.739667 -0.906268 -0.643408 + vertex -0.799695 -0.84648 -0.726046 + vertex -0.729251 -0.884504 -0.730878 + endloop + endfacet + facet normal -0.466512 -0.823142 -0.323736 + outer loop + vertex -0.729251 -0.884504 -0.730878 + vertex -0.799695 -0.84648 -0.726046 + vertex -0.786288 -0.822986 -0.805104 + endloop + endfacet + facet normal -0.467174 -0.823009 -0.323117 + outer loop + vertex -0.729251 -0.884504 -0.730878 + vertex -0.786288 -0.822986 -0.805104 + vertex -0.718396 -0.858934 -0.8117 + endloop + endfacet + facet normal -0.460515 -0.798627 -0.387454 + outer loop + vertex -0.718396 -0.858934 -0.8117 + vertex -0.786288 -0.822986 -0.805104 + vertex -0.772463 -0.796242 -0.876659 + endloop + endfacet + facet normal -0.460693 -0.798606 -0.387286 + outer loop + vertex -0.718396 -0.858934 -0.8117 + vertex -0.772463 -0.796242 -0.876659 + vertex -0.707561 -0.82938 -0.885532 + endloop + endfacet + facet normal -0.453375 -0.765903 -0.455899 + outer loop + vertex -0.707561 -0.82938 -0.885532 + vertex -0.772463 -0.796242 -0.876659 + vertex -0.759887 -0.765637 -0.940583 + endloop + endfacet + facet normal -0.452391 -0.765917 -0.456851 + outer loop + vertex -0.707561 -0.82938 -0.885532 + vertex -0.759887 -0.765637 -0.940583 + vertex -0.698091 -0.795099 -0.952382 + endloop + endfacet + facet normal -0.445493 -0.722881 -0.528185 + outer loop + vertex -0.698091 -0.795099 -0.952382 + vertex -0.759887 -0.765637 -0.940583 + vertex -0.750221 -0.730557 -0.996746 + endloop + endfacet + facet normal -0.44383 -0.722684 -0.529852 + outer loop + vertex -0.698091 -0.795099 -0.952382 + vertex -0.750221 -0.730557 -0.996746 + vertex -0.691333 -0.755348 -1.01226 + endloop + endfacet + facet normal -0.439351 -0.667204 -0.601507 + outer loop + vertex -0.691333 -0.755348 -1.01226 + vertex -0.750221 -0.730557 -0.996746 + vertex -0.746116 -0.689499 -1.04529 + endloop + endfacet + facet normal -0.439021 -0.667105 -0.601856 + outer loop + vertex -0.691333 -0.755348 -1.01226 + vertex -0.746116 -0.689499 -1.04529 + vertex -0.688631 -0.709386 -1.06518 + endloop + endfacet + facet normal -0.564141 -0.808013 -0.169881 + outer loop + vertex -0.833131 -0.897833 -0.44816 + vertex -0.90332 -0.84909 -0.446914 + vertex -0.892426 -0.835998 -0.545364 + endloop + endfacet + facet normal -0.565441 -0.807358 -0.168672 + outer loop + vertex -0.833131 -0.897833 -0.44816 + vertex -0.892426 -0.835998 -0.545364 + vertex -0.823545 -0.883868 -0.547144 + endloop + endfacet + facet normal -0.560872 -0.798991 -0.216878 + outer loop + vertex -0.823545 -0.883868 -0.547144 + vertex -0.892426 -0.835998 -0.545364 + vertex -0.879467 -0.82011 -0.637409 + endloop + endfacet + facet normal -0.562217 -0.798387 -0.215617 + outer loop + vertex -0.823545 -0.883868 -0.547144 + vertex -0.879467 -0.82011 -0.637409 + vertex -0.812257 -0.866762 -0.639916 + endloop + endfacet + facet normal -0.556157 -0.786871 -0.267439 + outer loop + vertex -0.812257 -0.866762 -0.639916 + vertex -0.879467 -0.82011 -0.637409 + vertex -0.864803 -0.801539 -0.722544 + endloop + endfacet + facet normal -0.557194 -0.786468 -0.266462 + outer loop + vertex -0.812257 -0.866762 -0.639916 + vertex -0.864803 -0.801539 -0.722544 + vertex -0.799695 -0.84648 -0.726046 + endloop + endfacet + facet normal -0.549352 -0.770715 -0.322818 + outer loop + vertex -0.799695 -0.84648 -0.726046 + vertex -0.864803 -0.801539 -0.722544 + vertex -0.848789 -0.780399 -0.800266 + endloop + endfacet + facet normal -0.549954 -0.770523 -0.322249 + outer loop + vertex -0.799695 -0.84648 -0.726046 + vertex -0.848789 -0.780399 -0.800266 + vertex -0.786288 -0.822986 -0.805104 + endloop + endfacet + facet normal -0.539915 -0.748704 -0.384621 + outer loop + vertex -0.786288 -0.822986 -0.805104 + vertex -0.848789 -0.780399 -0.800266 + vertex -0.831785 -0.756803 -0.870068 + endloop + endfacet + facet normal -0.540379 -0.748594 -0.384184 + outer loop + vertex -0.786288 -0.822986 -0.805104 + vertex -0.831785 -0.756803 -0.870068 + vertex -0.772463 -0.796242 -0.876659 + endloop + endfacet + facet normal -0.529048 -0.720954 -0.447587 + outer loop + vertex -0.772463 -0.796242 -0.876659 + vertex -0.831785 -0.756803 -0.870068 + vertex -0.815363 -0.730921 -0.931169 + endloop + endfacet + facet normal -0.527498 -0.72117 -0.449066 + outer loop + vertex -0.772463 -0.796242 -0.876659 + vertex -0.815363 -0.730921 -0.931169 + vertex -0.759887 -0.765637 -0.940583 + endloop + endfacet + facet normal -0.515976 -0.685089 -0.51422 + outer loop + vertex -0.759887 -0.765637 -0.940583 + vertex -0.815363 -0.730921 -0.931169 + vertex -0.801098 -0.702923 -0.982784 + endloop + endfacet + facet normal -0.513822 -0.685106 -0.51635 + outer loop + vertex -0.759887 -0.765637 -0.940583 + vertex -0.801098 -0.702923 -0.982784 + vertex -0.750221 -0.730557 -0.996746 + endloop + endfacet + facet normal -0.505666 -0.637007 -0.581829 + outer loop + vertex -0.750221 -0.730557 -0.996746 + vertex -0.801098 -0.702923 -0.982784 + vertex -0.794505 -0.669413 -1.0252 + endloop + endfacet + facet normal -0.505853 -0.637047 -0.581622 + outer loop + vertex -0.750221 -0.730557 -0.996746 + vertex -0.794505 -0.669413 -1.0252 + vertex -0.746116 -0.689499 -1.04529 + endloop + endfacet + facet normal -0.652861 -0.737952 -0.170882 + outer loop + vertex -0.90332 -0.84909 -0.446914 + vertex -0.966985 -0.792882 -0.446415 + vertex -0.954915 -0.780812 -0.544652 + endloop + endfacet + facet normal -0.653355 -0.737626 -0.170394 + outer loop + vertex -0.90332 -0.84909 -0.446914 + vertex -0.954915 -0.780812 -0.544652 + vertex -0.892426 -0.835998 -0.545364 + endloop + endfacet + facet normal -0.647453 -0.730332 -0.217759 + outer loop + vertex -0.892426 -0.835998 -0.545364 + vertex -0.954915 -0.780812 -0.544652 + vertex -0.940414 -0.766311 -0.636401 + endloop + endfacet + facet normal -0.647986 -0.730015 -0.217236 + outer loop + vertex -0.892426 -0.835998 -0.545364 + vertex -0.940414 -0.766311 -0.636401 + vertex -0.879467 -0.82011 -0.637409 + endloop + endfacet + facet normal -0.640085 -0.720116 -0.267814 + outer loop + vertex -0.879467 -0.82011 -0.637409 + vertex -0.940414 -0.766311 -0.636401 + vertex -0.923733 -0.749629 -0.721126 + endloop + endfacet + facet normal -0.64055 -0.719871 -0.267361 + outer loop + vertex -0.879467 -0.82011 -0.637409 + vertex -0.923733 -0.749629 -0.721126 + vertex -0.864803 -0.801539 -0.722544 + endloop + endfacet + facet normal -0.630064 -0.706464 -0.322378 + outer loop + vertex -0.864803 -0.801539 -0.722544 + vertex -0.923733 -0.749629 -0.721126 + vertex -0.905121 -0.731018 -0.798286 + endloop + endfacet + facet normal -0.630456 -0.706286 -0.322003 + outer loop + vertex -0.864803 -0.801539 -0.722544 + vertex -0.905121 -0.731018 -0.798286 + vertex -0.848789 -0.780399 -0.800266 + endloop + endfacet + facet normal -0.616444 -0.687847 -0.383229 + outer loop + vertex -0.848789 -0.780399 -0.800266 + vertex -0.905121 -0.731018 -0.798286 + vertex -0.884831 -0.710728 -0.867343 + endloop + endfacet + facet normal -0.616957 -0.687652 -0.382751 + outer loop + vertex -0.848789 -0.780399 -0.800266 + vertex -0.884831 -0.710728 -0.867343 + vertex -0.831785 -0.756803 -0.870068 + endloop + endfacet + facet normal -0.60076 -0.66544 -0.443032 + outer loop + vertex -0.831785 -0.756803 -0.870068 + vertex -0.884831 -0.710728 -0.867343 + vertex -0.863937 -0.689834 -0.927058 + endloop + endfacet + facet normal -0.600463 -0.665528 -0.443303 + outer loop + vertex -0.831785 -0.756803 -0.870068 + vertex -0.863937 -0.689834 -0.927058 + vertex -0.815363 -0.730921 -0.931169 + endloop + endfacet + facet normal -0.581483 -0.636782 -0.506346 + outer loop + vertex -0.815363 -0.730921 -0.931169 + vertex -0.863937 -0.689834 -0.927058 + vertex -0.843516 -0.669413 -0.976191 + endloop + endfacet + facet normal -0.581694 -0.636739 -0.506157 + outer loop + vertex -0.815363 -0.730921 -0.931169 + vertex -0.843516 -0.669413 -0.976191 + vertex -0.801098 -0.702923 -0.982784 + endloop + endfacet + facet normal -0.562735 -0.600567 -0.568022 + outer loop + vertex -0.801098 -0.702923 -0.982784 + vertex -0.843516 -0.669413 -0.976191 + vertex -0.827436 -0.653333 -1.00912 + endloop + endfacet + facet normal -0.568022 -0.600567 -0.562734 + outer loop + vertex -0.801098 -0.702923 -0.982784 + vertex -0.827436 -0.653333 -1.00912 + vertex -0.794505 -0.669413 -1.0252 + endloop + endfacet + facet normal -0.986795 -0.0427593 -0.156227 + outer loop + vertex -1.20712 -0.153076 -0.457381 + vertex -1.19083 -0.153076 -0.560317 + vertex -1.18712 -0.241129 -0.559605 + endloop + endfacet + facet normal -0.986749 -0.042245 -0.156661 + outer loop + vertex -1.20712 -0.153076 -0.457381 + vertex -1.18712 -0.241129 -0.559605 + vertex -1.20336 -0.242838 -0.456883 + endloop + endfacet + facet normal -0.979296 -0.1279 -0.156908 + outer loop + vertex -1.20336 -0.242838 -0.456883 + vertex -1.18712 -0.241129 -0.559605 + vertex -1.17603 -0.32827 -0.557825 + endloop + endfacet + facet normal -0.979289 -0.1266 -0.158006 + outer loop + vertex -1.20336 -0.242838 -0.456883 + vertex -1.17603 -0.32827 -0.557825 + vertex -1.19208 -0.331668 -0.455637 + endloop + endfacet + facet normal -0.964023 -0.2134 -0.158496 + outer loop + vertex -1.19208 -0.331668 -0.455637 + vertex -1.17603 -0.32827 -0.557825 + vertex -1.15755 -0.413584 -0.555333 + endloop + endfacet + facet normal -0.96417 -0.211557 -0.160061 + outer loop + vertex -1.19208 -0.331668 -0.455637 + vertex -1.15755 -0.413584 -0.555333 + vertex -1.17328 -0.418635 -0.453892 + endloop + endfacet + facet normal -0.940347 -0.29984 -0.160762 + outer loop + vertex -1.17328 -0.418635 -0.453892 + vertex -1.15755 -0.413584 -0.555333 + vertex -1.13171 -0.496159 -0.552484 + endloop + endfacet + facet normal -0.940709 -0.297713 -0.162587 + outer loop + vertex -1.17328 -0.418635 -0.453892 + vertex -1.13171 -0.496159 -0.552484 + vertex -1.14699 -0.502805 -0.451898 + endloop + endfacet + facet normal -0.907256 -0.387523 -0.163438 + outer loop + vertex -1.14699 -0.502805 -0.451898 + vertex -1.13171 -0.496159 -0.552484 + vertex -1.09851 -0.575083 -0.549636 + endloop + endfacet + facet normal -0.907829 -0.385386 -0.165303 + outer loop + vertex -1.14699 -0.502805 -0.451898 + vertex -1.09851 -0.575083 -0.549636 + vertex -1.1132 -0.583246 -0.449905 + endloop + endfacet + facet normal -0.863428 -0.476307 -0.166203 + outer loop + vertex -1.1132 -0.583246 -0.449905 + vertex -1.09851 -0.575083 -0.549636 + vertex -1.05797 -0.649442 -0.547144 + endloop + endfacet + facet normal -0.864129 -0.474448 -0.167868 + outer loop + vertex -1.1132 -0.583246 -0.449905 + vertex -1.05797 -0.649442 -0.547144 + vertex -1.07194 -0.659028 -0.44816 + endloop + endfacet + facet normal -0.807358 -0.565441 -0.168671 + outer loop + vertex -1.07194 -0.659028 -0.44816 + vertex -1.05797 -0.649442 -0.547144 + vertex -1.0101 -0.718322 -0.545364 + endloop + endfacet + facet normal -0.808014 -0.56414 -0.169882 + outer loop + vertex -1.07194 -0.659028 -0.44816 + vertex -1.0101 -0.718322 -0.545364 + vertex -1.02319 -0.729217 -0.446914 + endloop + endfacet + facet normal -0.737627 -0.653355 -0.170394 + outer loop + vertex -1.02319 -0.729217 -0.446914 + vertex -1.0101 -0.718322 -0.545364 + vertex -0.954915 -0.780812 -0.544652 + endloop + endfacet + facet normal -0.737952 -0.652861 -0.170882 + outer loop + vertex -1.02319 -0.729217 -0.446914 + vertex -0.954915 -0.780812 -0.544652 + vertex -0.966985 -0.792882 -0.446415 + endloop + endfacet + facet normal -0.978082 -0.0434605 -0.203632 + outer loop + vertex -1.19083 -0.153076 -0.560317 + vertex -1.17047 -0.153076 -0.658075 + vertex -1.16685 -0.239183 -0.657112 + endloop + endfacet + facet normal -0.977991 -0.0427772 -0.204217 + outer loop + vertex -1.19083 -0.153076 -0.560317 + vertex -1.16685 -0.239183 -0.657112 + vertex -1.18712 -0.241129 -0.559605 + endloop + endfacet + facet normal -0.970313 -0.12936 -0.204349 + outer loop + vertex -1.18712 -0.241129 -0.559605 + vertex -1.16685 -0.239183 -0.657112 + vertex -1.156 -0.324387 -0.654694 + endloop + endfacet + facet normal -0.970234 -0.127744 -0.205738 + outer loop + vertex -1.18712 -0.241129 -0.559605 + vertex -1.156 -0.324387 -0.654694 + vertex -1.17603 -0.32827 -0.557825 + endloop + endfacet + facet normal -0.954641 -0.214987 -0.206011 + outer loop + vertex -1.17603 -0.32827 -0.557825 + vertex -1.156 -0.324387 -0.654694 + vertex -1.13795 -0.407788 -0.65129 + endloop + endfacet + facet normal -0.95472 -0.212828 -0.20788 + outer loop + vertex -1.17603 -0.32827 -0.557825 + vertex -1.13795 -0.407788 -0.65129 + vertex -1.15755 -0.413584 -0.555333 + endloop + endfacet + facet normal -0.930618 -0.300947 -0.20828 + outer loop + vertex -1.15755 -0.413584 -0.555333 + vertex -1.13795 -0.407788 -0.65129 + vertex -1.11273 -0.48848 -0.647371 + endloop + endfacet + facet normal -0.930913 -0.298597 -0.210335 + outer loop + vertex -1.15755 -0.413584 -0.555333 + vertex -1.11273 -0.48848 -0.647371 + vertex -1.13171 -0.496159 -0.552484 + endloop + endfacet + facet normal -0.897398 -0.387589 -0.210834 + outer loop + vertex -1.13171 -0.496159 -0.552484 + vertex -1.11273 -0.48848 -0.647371 + vertex -1.08037 -0.565564 -0.643408 + endloop + endfacet + facet normal -0.89789 -0.385365 -0.212809 + outer loop + vertex -1.13171 -0.496159 -0.552484 + vertex -1.08037 -0.565564 -0.643408 + vertex -1.09851 -0.575083 -0.549636 + endloop + endfacet + facet normal -0.853771 -0.474922 -0.213366 + outer loop + vertex -1.09851 -0.575083 -0.549636 + vertex -1.08037 -0.565564 -0.643408 + vertex -1.04087 -0.638153 -0.639916 + endloop + endfacet + facet normal -0.854393 -0.47302 -0.215091 + outer loop + vertex -1.09851 -0.575083 -0.549636 + vertex -1.04087 -0.638153 -0.639916 + vertex -1.05797 -0.649442 -0.547144 + endloop + endfacet + facet normal -0.798387 -0.562217 -0.215618 + outer loop + vertex -1.05797 -0.649442 -0.547144 + vertex -1.04087 -0.638153 -0.639916 + vertex -0.994213 -0.705364 -0.637409 + endloop + endfacet + facet normal -0.798991 -0.560873 -0.216877 + outer loop + vertex -1.05797 -0.649442 -0.547144 + vertex -0.994213 -0.705364 -0.637409 + vertex -1.0101 -0.718322 -0.545364 + endloop + endfacet + facet normal -0.730016 -0.647986 -0.217235 + outer loop + vertex -1.0101 -0.718322 -0.545364 + vertex -0.994213 -0.705364 -0.637409 + vertex -0.940414 -0.766311 -0.636401 + endloop + endfacet + facet normal -0.730333 -0.647453 -0.217759 + outer loop + vertex -1.0101 -0.718322 -0.545364 + vertex -0.940414 -0.766311 -0.636401 + vertex -0.954915 -0.780812 -0.544652 + endloop + endfacet + facet normal -0.964686 -0.0443388 -0.259643 + outer loop + vertex -1.17047 -0.153076 -0.658075 + vertex -1.14563 -0.153076 -0.750381 + vertex -1.1421 -0.237142 -0.74914 + endloop + endfacet + facet normal -0.964534 -0.0435243 -0.260347 + outer loop + vertex -1.17047 -0.153076 -0.658075 + vertex -1.1421 -0.237142 -0.74914 + vertex -1.16685 -0.239183 -0.657112 + endloop + endfacet + facet normal -0.956641 -0.13097 -0.260164 + outer loop + vertex -1.16685 -0.239183 -0.657112 + vertex -1.1421 -0.237142 -0.74914 + vertex -1.13157 -0.320294 -0.745993 + endloop + endfacet + facet normal -0.956463 -0.129224 -0.261687 + outer loop + vertex -1.16685 -0.239183 -0.657112 + vertex -1.13157 -0.320294 -0.745993 + vertex -1.156 -0.324387 -0.654694 + endloop + endfacet + facet normal -0.940667 -0.216405 -0.26137 + outer loop + vertex -1.156 -0.324387 -0.654694 + vertex -1.13157 -0.320294 -0.745993 + vertex -1.11411 -0.401622 -0.741516 + endloop + endfacet + facet normal -0.940632 -0.214291 -0.263233 + outer loop + vertex -1.156 -0.324387 -0.654694 + vertex -1.11411 -0.401622 -0.741516 + vertex -1.13795 -0.407788 -0.65129 + endloop + endfacet + facet normal -0.916564 -0.301387 -0.262825 + outer loop + vertex -1.13795 -0.407788 -0.65129 + vertex -1.11411 -0.401622 -0.741516 + vertex -1.08976 -0.48021 -0.736286 + endloop + endfacet + facet normal -0.916709 -0.299337 -0.264654 + outer loop + vertex -1.13795 -0.407788 -0.65129 + vertex -1.08976 -0.48021 -0.736286 + vertex -1.11273 -0.48848 -0.647371 + endloop + endfacet + facet normal -0.883648 -0.386465 -0.264217 + outer loop + vertex -1.11273 -0.48848 -0.647371 + vertex -1.08976 -0.48021 -0.736286 + vertex -1.05861 -0.555148 -0.730878 + endloop + endfacet + facet normal -0.88393 -0.384758 -0.265762 + outer loop + vertex -1.11273 -0.48848 -0.647371 + vertex -1.05861 -0.555148 -0.730878 + vertex -1.08037 -0.565564 -0.643408 + endloop + endfacet + facet normal -0.840708 -0.471991 -0.265395 + outer loop + vertex -1.08037 -0.565564 -0.643408 + vertex -1.05861 -0.555148 -0.730878 + vertex -1.02058 -0.625592 -0.726046 + endloop + endfacet + facet normal -0.841086 -0.470584 -0.266691 + outer loop + vertex -1.08037 -0.565564 -0.643408 + vertex -1.02058 -0.625592 -0.726046 + vertex -1.04087 -0.638153 -0.639916 + endloop + endfacet + facet normal -0.786469 -0.557194 -0.266462 + outer loop + vertex -1.04087 -0.638153 -0.639916 + vertex -1.02058 -0.625592 -0.726046 + vertex -0.975642 -0.690699 -0.722544 + endloop + endfacet + facet normal -0.786871 -0.556157 -0.267439 + outer loop + vertex -1.04087 -0.638153 -0.639916 + vertex -0.975642 -0.690699 -0.722544 + vertex -0.994213 -0.705364 -0.637409 + endloop + endfacet + facet normal -0.719871 -0.64055 -0.267361 + outer loop + vertex -0.994213 -0.705364 -0.637409 + vertex -0.975642 -0.690699 -0.722544 + vertex -0.923733 -0.749629 -0.721126 + endloop + endfacet + facet normal -0.720117 -0.640084 -0.267814 + outer loop + vertex -0.994213 -0.705364 -0.637409 + vertex -0.923733 -0.749629 -0.721126 + vertex -0.940414 -0.766311 -0.636401 + endloop + endfacet + facet normal -0.944684 -0.0453626 -0.324829 + outer loop + vertex -1.14563 -0.153076 -0.750381 + vertex -1.11586 -0.153076 -0.836959 + vertex -1.11245 -0.235148 -0.835423 + endloop + endfacet + facet normal -0.944459 -0.0444634 -0.325609 + outer loop + vertex -1.14563 -0.153076 -0.750381 + vertex -1.11245 -0.235148 -0.835423 + vertex -1.1421 -0.237142 -0.74914 + endloop + endfacet + facet normal -0.936416 -0.132579 -0.324881 + outer loop + vertex -1.1421 -0.237142 -0.74914 + vertex -1.11245 -0.235148 -0.835423 + vertex -1.10233 -0.316262 -0.831472 + endloop + endfacet + facet normal -0.936134 -0.13088 -0.326378 + outer loop + vertex -1.1421 -0.237142 -0.74914 + vertex -1.10233 -0.316262 -0.831472 + vertex -1.13157 -0.320294 -0.745993 + endloop + endfacet + facet normal -0.92037 -0.217375 -0.325066 + outer loop + vertex -1.13157 -0.320294 -0.745993 + vertex -1.10233 -0.316262 -0.831472 + vertex -1.08564 -0.395463 -0.825763 + endloop + endfacet + facet normal -0.920225 -0.215608 -0.326648 + outer loop + vertex -1.13157 -0.320294 -0.745993 + vertex -1.08564 -0.395463 -0.825763 + vertex -1.11411 -0.401622 -0.741516 + endloop + endfacet + facet normal -0.896631 -0.300814 -0.324905 + outer loop + vertex -1.11411 -0.401622 -0.741516 + vertex -1.08564 -0.395463 -0.825763 + vertex -1.0625 -0.471792 -0.818953 + endloop + endfacet + facet normal -0.896637 -0.29943 -0.326164 + outer loop + vertex -1.11411 -0.401622 -0.741516 + vertex -1.0625 -0.471792 -0.818953 + vertex -1.08976 -0.48021 -0.736286 + endloop + endfacet + facet normal -0.864617 -0.383839 -0.3242 + outer loop + vertex -1.08976 -0.48021 -0.736286 + vertex -1.0625 -0.471792 -0.818953 + vertex -1.03304 -0.544293 -0.8117 + endloop + endfacet + facet normal -0.864701 -0.382974 -0.324998 + outer loop + vertex -1.08976 -0.48021 -0.736286 + vertex -1.03304 -0.544293 -0.8117 + vertex -1.05861 -0.555148 -0.730878 + endloop + endfacet + facet normal -0.82301 -0.467173 -0.323117 + outer loop + vertex -1.05861 -0.555148 -0.730878 + vertex -1.03304 -0.544293 -0.8117 + vertex -0.997089 -0.612184 -0.805104 + endloop + endfacet + facet normal -0.823142 -0.466511 -0.323736 + outer loop + vertex -1.05861 -0.555148 -0.730878 + vertex -0.997089 -0.612184 -0.805104 + vertex -1.02058 -0.625592 -0.726046 + endloop + endfacet + facet normal -0.770523 -0.549955 -0.322249 + outer loop + vertex -1.02058 -0.625592 -0.726046 + vertex -0.997089 -0.612184 -0.805104 + vertex -0.954502 -0.674686 -0.800266 + endloop + endfacet + facet normal -0.770715 -0.549351 -0.322819 + outer loop + vertex -1.02058 -0.625592 -0.726046 + vertex -0.954502 -0.674686 -0.800266 + vertex -0.975642 -0.690699 -0.722544 + endloop + endfacet + facet normal -0.706286 -0.630455 -0.322004 + outer loop + vertex -0.975642 -0.690699 -0.722544 + vertex -0.954502 -0.674686 -0.800266 + vertex -0.905121 -0.731018 -0.798286 + endloop + endfacet + facet normal -0.706464 -0.630064 -0.322378 + outer loop + vertex -0.975642 -0.690699 -0.722544 + vertex -0.905121 -0.731018 -0.798286 + vertex -0.923733 -0.749629 -0.721126 + endloop + endfacet + facet normal -0.915674 -0.0464689 -0.399226 + outer loop + vertex -1.11586 -0.153076 -0.836959 + vertex -1.08073 -0.153076 -0.917536 + vertex -1.07746 -0.233344 -0.915698 + endloop + endfacet + facet normal -0.915375 -0.045551 -0.400016 + outer loop + vertex -1.11586 -0.153076 -0.836959 + vertex -1.07746 -0.233344 -0.915698 + vertex -1.11245 -0.235148 -0.835423 + endloop + endfacet + facet normal -0.907322 -0.134046 -0.398495 + outer loop + vertex -1.11245 -0.235148 -0.835423 + vertex -1.07746 -0.233344 -0.915698 + vertex -1.06787 -0.312564 -0.910881 + endloop + endfacet + facet normal -0.906962 -0.132557 -0.39981 + outer loop + vertex -1.11245 -0.235148 -0.835423 + vertex -1.06787 -0.312564 -0.910881 + vertex -1.10233 -0.316262 -0.831472 + endloop + endfacet + facet normal -0.891565 -0.217775 -0.397097 + outer loop + vertex -1.10233 -0.316262 -0.831472 + vertex -1.06787 -0.312564 -0.910881 + vertex -1.05219 -0.389688 -0.903784 + endloop + endfacet + facet normal -0.891367 -0.216536 -0.398217 + outer loop + vertex -1.10233 -0.316262 -0.831472 + vertex -1.05219 -0.389688 -0.903784 + vertex -1.08564 -0.395463 -0.825763 + endloop + endfacet + facet normal -0.868747 -0.29923 -0.394639 + outer loop + vertex -1.08564 -0.395463 -0.825763 + vertex -1.05219 -0.389688 -0.903784 + vertex -1.03065 -0.463669 -0.895101 + endloop + endfacet + facet normal -0.868701 -0.298619 -0.395204 + outer loop + vertex -1.08564 -0.395463 -0.825763 + vertex -1.03065 -0.463669 -0.895101 + vertex -1.0625 -0.471792 -0.818953 + endloop + endfacet + facet normal -0.83823 -0.379977 -0.391138 + outer loop + vertex -1.0625 -0.471792 -0.818953 + vertex -1.03065 -0.463669 -0.895101 + vertex -1.00348 -0.533458 -0.885532 + endloop + endfacet + facet normal -0.838232 -0.379826 -0.39128 + outer loop + vertex -1.0625 -0.471792 -0.818953 + vertex -1.00348 -0.533458 -0.885532 + vertex -1.03304 -0.544293 -0.8117 + endloop + endfacet + facet normal -0.798607 -0.460692 -0.387286 + outer loop + vertex -1.03304 -0.544293 -0.8117 + vertex -1.00348 -0.533458 -0.885532 + vertex -0.970345 -0.59836 -0.876659 + endloop + endfacet + facet normal -0.798628 -0.460514 -0.387455 + outer loop + vertex -1.03304 -0.544293 -0.8117 + vertex -0.970345 -0.59836 -0.876659 + vertex -0.997089 -0.612184 -0.805104 + endloop + endfacet + facet normal -0.748593 -0.54038 -0.384184 + outer loop + vertex -0.997089 -0.612184 -0.805104 + vertex -0.970345 -0.59836 -0.876659 + vertex -0.930906 -0.657682 -0.870068 + endloop + endfacet + facet normal -0.748704 -0.539916 -0.384621 + outer loop + vertex -0.997089 -0.612184 -0.805104 + vertex -0.930906 -0.657682 -0.870068 + vertex -0.954502 -0.674686 -0.800266 + endloop + endfacet + facet normal -0.687653 -0.616956 -0.382751 + outer loop + vertex -0.954502 -0.674686 -0.800266 + vertex -0.930906 -0.657682 -0.870068 + vertex -0.884831 -0.710728 -0.867343 + endloop + endfacet + facet normal -0.687847 -0.616443 -0.383229 + outer loop + vertex -0.954502 -0.674686 -0.800266 + vertex -0.884831 -0.710728 -0.867343 + vertex -0.905121 -0.731018 -0.798286 + endloop + endfacet + facet normal -0.874919 -0.0475438 -0.481931 + outer loop + vertex -1.08073 -0.153076 -0.917536 + vertex -1.0398 -0.153076 -0.991836 + vertex -1.0367 -0.231872 -0.9897 + endloop + endfacet + facet normal -0.874574 -0.0467032 -0.482638 + outer loop + vertex -1.08073 -0.153076 -0.917536 + vertex -1.0367 -0.231872 -0.9897 + vertex -1.07746 -0.233344 -0.915698 + endloop + endfacet + facet normal -0.866719 -0.135376 -0.480075 + outer loop + vertex -1.07746 -0.233344 -0.915698 + vertex -1.0367 -0.231872 -0.9897 + vertex -1.02773 -0.309515 -0.983989 + endloop + endfacet + facet normal -0.866301 -0.134108 -0.481184 + outer loop + vertex -1.07746 -0.233344 -0.915698 + vertex -1.02773 -0.309515 -0.983989 + vertex -1.06787 -0.312564 -0.910881 + endloop + endfacet + facet normal -0.851656 -0.217935 -0.476641 + outer loop + vertex -1.06787 -0.312564 -0.910881 + vertex -1.02773 -0.309515 -0.983989 + vertex -1.01326 -0.384851 -0.9754 + endloop + endfacet + facet normal -0.851423 -0.217013 -0.477477 + outer loop + vertex -1.06787 -0.312564 -0.910881 + vertex -1.01326 -0.384851 -0.9754 + vertex -1.05219 -0.389688 -0.903784 + endloop + endfacet + facet normal -0.830274 -0.297355 -0.471407 + outer loop + vertex -1.05219 -0.389688 -0.903784 + vertex -1.01326 -0.384851 -0.9754 + vertex -0.993634 -0.456726 -0.964632 + endloop + endfacet + facet normal -0.830223 -0.297057 -0.471685 + outer loop + vertex -1.05219 -0.389688 -0.903784 + vertex -0.993634 -0.456726 -0.964632 + vertex -1.03065 -0.463669 -0.895101 + endloop + endfacet + facet normal -0.801873 -0.375867 -0.46446 + outer loop + vertex -1.03065 -0.463669 -0.895101 + vertex -0.993634 -0.456726 -0.964632 + vertex -0.969202 -0.523988 -0.952382 + endloop + endfacet + facet normal -0.801874 -0.375875 -0.464452 + outer loop + vertex -1.03065 -0.463669 -0.895101 + vertex -0.969202 -0.523988 -0.952382 + vertex -1.00348 -0.533458 -0.885532 + endloop + endfacet + facet normal -0.765917 -0.452391 -0.456852 + outer loop + vertex -1.00348 -0.533458 -0.885532 + vertex -0.969202 -0.523988 -0.952382 + vertex -0.93974 -0.585783 -0.940583 + endloop + endfacet + facet normal -0.765903 -0.453374 -0.4559 + outer loop + vertex -1.00348 -0.533458 -0.885532 + vertex -0.93974 -0.585783 -0.940583 + vertex -0.970345 -0.59836 -0.876659 + endloop + endfacet + facet normal -0.72117 -0.527497 -0.449066 + outer loop + vertex -0.970345 -0.59836 -0.876659 + vertex -0.93974 -0.585783 -0.940583 + vertex -0.905024 -0.64126 -0.931169 + endloop + endfacet + facet normal -0.720954 -0.529048 -0.447586 + outer loop + vertex -0.970345 -0.59836 -0.876659 + vertex -0.905024 -0.64126 -0.931169 + vertex -0.930906 -0.657682 -0.870068 + endloop + endfacet + facet normal -0.665528 -0.600463 -0.443302 + outer loop + vertex -0.930906 -0.657682 -0.870068 + vertex -0.905024 -0.64126 -0.931169 + vertex -0.863937 -0.689834 -0.927058 + endloop + endfacet + facet normal -0.665441 -0.600759 -0.443032 + outer loop + vertex -0.930906 -0.657682 -0.870068 + vertex -0.863937 -0.689834 -0.927058 + vertex -0.884831 -0.710728 -0.867343 + endloop + endfacet + facet normal -0.819786 -0.0484137 -0.570619 + outer loop + vertex -1.0398 -0.153076 -0.991836 + vertex -0.992645 -0.153076 -1.05958 + vertex -0.989736 -0.230875 -1.05716 + endloop + endfacet + facet normal -0.819466 -0.0477769 -0.571132 + outer loop + vertex -1.0398 -0.153076 -0.991836 + vertex -0.989736 -0.230875 -1.05716 + vertex -1.0367 -0.231872 -0.9897 + endloop + endfacet + facet normal -0.812111 -0.136456 -0.567323 + outer loop + vertex -1.0367 -0.231872 -0.9897 + vertex -0.989736 -0.230875 -1.05716 + vertex -0.981485 -0.307433 -1.05056 + endloop + endfacet + facet normal -0.811702 -0.135501 -0.568137 + outer loop + vertex -1.0367 -0.231872 -0.9897 + vertex -0.981485 -0.307433 -1.05056 + vertex -1.02773 -0.309515 -0.983989 + endloop + endfacet + facet normal -0.798289 -0.218088 -0.561402 + outer loop + vertex -1.02773 -0.309515 -0.983989 + vertex -0.981485 -0.307433 -1.05056 + vertex -0.968369 -0.381505 -1.04044 + endloop + endfacet + facet normal -0.798031 -0.21737 -0.562047 + outer loop + vertex -1.02773 -0.309515 -0.983989 + vertex -0.968369 -0.381505 -1.04044 + vertex -1.01326 -0.384851 -0.9754 + endloop + endfacet + facet normal -0.778938 -0.295888 -0.552906 + outer loop + vertex -1.01326 -0.384851 -0.9754 + vertex -0.968369 -0.381505 -1.04044 + vertex -0.950866 -0.451852 -1.02745 + endloop + endfacet + facet normal -0.778845 -0.295566 -0.55321 + outer loop + vertex -1.01326 -0.384851 -0.9754 + vertex -0.950866 -0.451852 -1.02745 + vertex -0.993634 -0.456726 -0.964632 + endloop + endfacet + facet normal -0.753358 -0.372642 -0.541838 + outer loop + vertex -0.993634 -0.456726 -0.964632 + vertex -0.950866 -0.451852 -1.02745 + vertex -0.929451 -0.51723 -1.01226 + endloop + endfacet + facet normal -0.753299 -0.372365 -0.542111 + outer loop + vertex -0.993634 -0.456726 -0.964632 + vertex -0.929451 -0.51723 -1.01226 + vertex -0.969202 -0.523988 -0.952382 + endloop + endfacet + facet normal -0.722684 -0.443829 -0.529853 + outer loop + vertex -0.969202 -0.523988 -0.952382 + vertex -0.929451 -0.51723 -1.01226 + vertex -0.90466 -0.576118 -0.996746 + endloop + endfacet + facet normal -0.722881 -0.445493 -0.528185 + outer loop + vertex -0.969202 -0.523988 -0.952382 + vertex -0.90466 -0.576118 -0.996746 + vertex -0.93974 -0.585783 -0.940583 + endloop + endfacet + facet normal -0.685107 -0.513821 -0.51635 + outer loop + vertex -0.93974 -0.585783 -0.940583 + vertex -0.90466 -0.576118 -0.996746 + vertex -0.877026 -0.626995 -0.982784 + endloop + endfacet + facet normal -0.685089 -0.515975 -0.514221 + outer loop + vertex -0.93974 -0.585783 -0.940583 + vertex -0.877026 -0.626995 -0.982784 + vertex -0.905024 -0.64126 -0.931169 + endloop + endfacet + facet normal -0.63674 -0.581694 -0.506157 + outer loop + vertex -0.905024 -0.64126 -0.931169 + vertex -0.877026 -0.626995 -0.982784 + vertex -0.843516 -0.669413 -0.976191 + endloop + endfacet + facet normal -0.636782 -0.581483 -0.506346 + outer loop + vertex -0.905024 -0.64126 -0.931169 + vertex -0.843516 -0.669413 -0.976191 + vertex -0.863937 -0.689834 -0.927058 + endloop + endfacet + facet normal -0.748534 -0.048843 -0.661295 + outer loop + vertex -0.992645 -0.153076 -1.05958 + vertex -0.938822 -0.153076 -1.12051 + vertex -0.93614 -0.230495 -1.11783 + endloop + endfacet + facet normal -0.748372 -0.0485713 -0.661499 + outer loop + vertex -0.992645 -0.153076 -1.05958 + vertex -0.93614 -0.230495 -1.11783 + vertex -0.989736 -0.230875 -1.05716 + endloop + endfacet + facet normal -0.741914 -0.137009 -0.656347 + outer loop + vertex -0.989736 -0.230875 -1.05716 + vertex -0.93614 -0.230495 -1.11783 + vertex -0.92868 -0.306633 -1.11037 + endloop + endfacet + facet normal -0.741683 -0.136575 -0.656699 + outer loop + vertex -0.989736 -0.230875 -1.05716 + vertex -0.92868 -0.306633 -1.11037 + vertex -0.981485 -0.307433 -1.05056 + endloop + endfacet + facet normal -0.730102 -0.218198 -0.647565 + outer loop + vertex -0.981485 -0.307433 -1.05056 + vertex -0.92868 -0.306633 -1.11037 + vertex -0.917027 -0.380206 -1.09871 + endloop + endfacet + facet normal -0.729915 -0.217805 -0.647908 + outer loop + vertex -0.981485 -0.307433 -1.05056 + vertex -0.917027 -0.380206 -1.09871 + vertex -0.968369 -0.381505 -1.04044 + endloop + endfacet + facet normal -0.71363 -0.295196 -0.635288 + outer loop + vertex -0.968369 -0.381505 -1.04044 + vertex -0.917027 -0.380206 -1.09871 + vertex -0.901768 -0.449932 -1.08345 + endloop + endfacet + facet normal -0.713493 -0.294869 -0.635594 + outer loop + vertex -0.968369 -0.381505 -1.04044 + vertex -0.901768 -0.449932 -1.08345 + vertex -0.950866 -0.451852 -1.02745 + endloop + endfacet + facet normal -0.691939 -0.371045 -0.619311 + outer loop + vertex -0.950866 -0.451852 -1.02745 + vertex -0.901768 -0.449932 -1.08345 + vertex -0.883489 -0.514528 -1.06518 + endloop + endfacet + facet normal -0.691768 -0.370577 -0.619782 + outer loop + vertex -0.950866 -0.451852 -1.02745 + vertex -0.883489 -0.514528 -1.06518 + vertex -0.929451 -0.51723 -1.01226 + endloop + endfacet + facet normal -0.667106 -0.439022 -0.601855 + outer loop + vertex -0.929451 -0.51723 -1.01226 + vertex -0.883489 -0.514528 -1.06518 + vertex -0.863602 -0.572013 -1.04529 + endloop + endfacet + facet normal -0.667204 -0.43935 -0.601507 + outer loop + vertex -0.929451 -0.51723 -1.01226 + vertex -0.863602 -0.572013 -1.04529 + vertex -0.90466 -0.576118 -0.996746 + endloop + endfacet + facet normal -0.637047 -0.505851 -0.581623 + outer loop + vertex -0.90466 -0.576118 -0.996746 + vertex -0.863602 -0.572013 -1.04529 + vertex -0.843516 -0.620402 -1.0252 + endloop + endfacet + facet normal -0.637008 -0.505665 -0.581828 + outer loop + vertex -0.90466 -0.576118 -0.996746 + vertex -0.843516 -0.620402 -1.0252 + vertex -0.877026 -0.626995 -0.982784 + endloop + endfacet + facet normal -0.600568 -0.568022 -0.562733 + outer loop + vertex -0.877026 -0.626995 -0.982784 + vertex -0.843516 -0.620402 -1.0252 + vertex -0.827436 -0.653333 -1.00912 + endloop + endfacet + facet normal -0.600568 -0.562734 -0.568022 + outer loop + vertex -0.877026 -0.626995 -0.982784 + vertex -0.827436 -0.653333 -1.00912 + vertex -0.843516 -0.669413 -0.976191 + endloop + endfacet + facet normal -0.992246 -0.0422546 -0.11689 + outer loop + vertex -1.20712 -0.153076 -0.457381 + vertex -1.20336 -0.242838 -0.456883 + vertex -1.21599 -0.244167 -0.34921 + endloop + endfacet + facet normal -0.99229 -0.0419412 -0.116629 + outer loop + vertex -1.20712 -0.153076 -0.457381 + vertex -1.21599 -0.244167 -0.34921 + vertex -1.2198 -0.153076 -0.349542 + endloop + endfacet + facet normal -0.995935 -0.041959 -0.0797075 + outer loop + vertex -1.2198 -0.153076 -0.349542 + vertex -1.21599 -0.244167 -0.34921 + vertex -1.22485 -0.245185 -0.237864 + endloop + endfacet + facet normal -0.995958 -0.0417466 -0.0795333 + outer loop + vertex -1.2198 -0.153076 -0.349542 + vertex -1.22485 -0.245185 -0.237864 + vertex -1.2287 -0.153076 -0.238072 + endloop + endfacet + facet normal -0.998167 -0.0417582 -0.0437977 + outer loop + vertex -1.2287 -0.153076 -0.238072 + vertex -1.22485 -0.245185 -0.237864 + vertex -1.22981 -0.245959 -0.124123 + endloop + endfacet + facet normal -0.998183 -0.0415597 -0.043636 + outer loop + vertex -1.2287 -0.153076 -0.238072 + vertex -1.22981 -0.245959 -0.124123 + vertex -1.23368 -0.153076 -0.124242 + endloop + endfacet + facet normal -0.999104 -0.0415525 -0.00802043 + outer loop + vertex -1.23368 -0.153076 -0.124242 + vertex -1.22981 -0.245959 -0.124123 + vertex -1.23071 -0.246557 -0.00926336 + endloop + endfacet + facet normal -0.999116 -0.0412984 -0.00781355 + outer loop + vertex -1.23368 -0.153076 -0.124242 + vertex -1.23071 -0.246557 -0.00926336 + vertex -1.23457 -0.153076 -0.0093227 + endloop + endfacet + facet normal -0.998737 -0.0412596 0.0286882 + outer loop + vertex -1.23457 -0.153076 -0.0093227 + vertex -1.23071 -0.246557 -0.00926336 + vertex -1.2274 -0.247048 0.105437 + endloop + endfacet + facet normal -0.998743 -0.0408892 0.0289919 + outer loop + vertex -1.23457 -0.153076 -0.0093227 + vertex -1.2274 -0.247048 0.105437 + vertex -1.23124 -0.153076 0.105413 + endloop + endfacet + facet normal -0.992678 -0.0406194 0.113756 + outer loop + vertex -1.23124 -0.153076 0.105413 + vertex -1.2274 -0.247048 0.105437 + vertex -1.21498 -0.247661 0.213522 + endloop + endfacet + facet normal -0.99263 -0.0398127 0.114455 + outer loop + vertex -1.23124 -0.153076 0.105413 + vertex -1.21498 -0.247661 0.213522 + vertex -1.21878 -0.153076 0.213516 + endloop + endfacet + facet normal -0.962905 -0.0386107 0.267062 + outer loop + vertex -1.21878 -0.153076 0.213516 + vertex -1.21498 -0.247661 0.213522 + vertex -1.18859 -0.248626 0.308537 + endloop + endfacet + facet normal -0.962569 -0.0370854 0.268489 + outer loop + vertex -1.21878 -0.153076 0.213516 + vertex -1.18859 -0.248626 0.308537 + vertex -1.19227 -0.153076 0.308537 + endloop + endfacet + facet normal -0.857519 -0.0330381 0.51339 + outer loop + vertex -1.19227 -0.153076 0.308537 + vertex -1.18859 -0.248626 0.308537 + vertex -1.14334 -0.250173 0.384027 + endloop + endfacet + facet normal -0.856314 -0.0307597 0.515539 + outer loop + vertex -1.19227 -0.153076 0.308537 + vertex -1.14334 -0.250173 0.384027 + vertex -1.14683 -0.153076 0.384027 + endloop + endfacet + facet normal -0.984922 -0.12675 -0.117745 + outer loop + vertex -1.20336 -0.242838 -0.456883 + vertex -1.19208 -0.331668 -0.455637 + vertex -1.20456 -0.334312 -0.348379 + endloop + endfacet + facet normal -0.985101 -0.125966 -0.117085 + outer loop + vertex -1.20336 -0.242838 -0.456883 + vertex -1.20456 -0.334312 -0.348379 + vertex -1.21599 -0.244167 -0.34921 + endloop + endfacet + facet normal -0.988756 -0.126091 -0.0803903 + outer loop + vertex -1.21599 -0.244167 -0.34921 + vertex -1.20456 -0.334312 -0.348379 + vertex -1.21333 -0.336329 -0.237353 + endloop + endfacet + facet normal -0.988869 -0.125509 -0.0799082 + outer loop + vertex -1.21599 -0.244167 -0.34921 + vertex -1.21333 -0.336329 -0.237353 + vertex -1.22485 -0.245185 -0.237864 + endloop + endfacet + facet normal -0.991081 -0.12559 -0.0445664 + outer loop + vertex -1.22485 -0.245185 -0.237864 + vertex -1.21333 -0.336329 -0.237353 + vertex -1.21824 -0.337847 -0.123858 + endloop + endfacet + facet normal -0.991181 -0.124974 -0.0440594 + outer loop + vertex -1.22485 -0.245185 -0.237864 + vertex -1.21824 -0.337847 -0.123858 + vertex -1.22981 -0.245959 -0.124123 + endloop + endfacet + facet normal -0.992116 -0.124991 -0.00909693 + outer loop + vertex -1.22981 -0.245959 -0.124123 + vertex -1.21824 -0.337847 -0.123858 + vertex -1.21915 -0.338995 -0.00919506 + endloop + endfacet + facet normal -0.992229 -0.124139 -0.00839687 + outer loop + vertex -1.22981 -0.245959 -0.124123 + vertex -1.21915 -0.338995 -0.00919506 + vertex -1.23071 -0.246557 -0.00926336 + endloop + endfacet + facet normal -0.991903 -0.124072 0.027112 + outer loop + vertex -1.23071 -0.246557 -0.00926336 + vertex -1.21915 -0.338995 -0.00919506 + vertex -1.2159 -0.339902 0.105336 + endloop + endfacet + facet normal -0.992029 -0.122823 0.0281455 + outer loop + vertex -1.23071 -0.246557 -0.00926336 + vertex -1.2159 -0.339902 0.105336 + vertex -1.2274 -0.247048 0.105437 + endloop + endfacet + facet normal -0.986356 -0.12221 0.110303 + outer loop + vertex -1.2274 -0.247048 0.105437 + vertex -1.2159 -0.339902 0.105336 + vertex -1.20369 -0.341054 0.213278 + endloop + endfacet + facet normal -0.986417 -0.119603 0.112589 + outer loop + vertex -1.2274 -0.247048 0.105437 + vertex -1.20369 -0.341054 0.213278 + vertex -1.21498 -0.247661 0.213522 + endloop + endfacet + facet normal -0.958457 -0.116607 0.260313 + outer loop + vertex -1.21498 -0.247661 0.213522 + vertex -1.20369 -0.341054 0.213278 + vertex -1.17769 -0.342938 0.308176 + endloop + endfacet + facet normal -0.957776 -0.111788 0.264894 + outer loop + vertex -1.21498 -0.247661 0.213522 + vertex -1.17769 -0.342938 0.308176 + vertex -1.18859 -0.248626 0.308537 + endloop + endfacet + facet normal -0.858035 -0.101167 0.503528 + outer loop + vertex -1.18859 -0.248626 0.308537 + vertex -1.17769 -0.342938 0.308176 + vertex -1.13307 -0.346042 0.383572 + endloop + endfacet + facet normal -0.854744 -0.0939387 0.510478 + outer loop + vertex -1.18859 -0.248626 0.308537 + vertex -1.13307 -0.346042 0.383572 + vertex -1.14334 -0.250173 0.384027 + endloop + endfacet + facet normal -0.969991 -0.211992 -0.119066 + outer loop + vertex -1.19208 -0.331668 -0.455637 + vertex -1.17328 -0.418635 -0.453892 + vertex -1.18552 -0.422563 -0.347216 + endloop + endfacet + facet normal -0.970346 -0.210893 -0.118123 + outer loop + vertex -1.19208 -0.331668 -0.455637 + vertex -1.18552 -0.422563 -0.347216 + vertex -1.20456 -0.334312 -0.348379 + endloop + endfacet + facet normal -0.974038 -0.211207 -0.0815017 + outer loop + vertex -1.20456 -0.334312 -0.348379 + vertex -1.18552 -0.422563 -0.347216 + vertex -1.19413 -0.425542 -0.23665 + endloop + endfacet + facet normal -0.974284 -0.210348 -0.0807776 + outer loop + vertex -1.20456 -0.334312 -0.348379 + vertex -1.19413 -0.425542 -0.23665 + vertex -1.21333 -0.336329 -0.237353 + endloop + endfacet + facet normal -0.976505 -0.210551 -0.04589 + outer loop + vertex -1.21333 -0.336329 -0.237353 + vertex -1.19413 -0.425542 -0.23665 + vertex -1.19897 -0.427746 -0.123539 + endloop + endfacet + facet normal -0.976755 -0.209569 -0.0450699 + outer loop + vertex -1.21333 -0.336329 -0.237353 + vertex -1.19897 -0.427746 -0.123539 + vertex -1.21824 -0.337847 -0.123858 + endloop + endfacet + facet normal -0.977714 -0.209654 -0.0109859 + outer loop + vertex -1.21824 -0.337847 -0.123858 + vertex -1.19897 -0.427746 -0.123539 + vertex -1.19991 -0.429348 -0.00922753 + endloop + endfacet + facet normal -0.978025 -0.208255 -0.00981935 + outer loop + vertex -1.21824 -0.337847 -0.123858 + vertex -1.19991 -0.429348 -0.00922753 + vertex -1.21915 -0.338995 -0.00919506 + endloop + endfacet + facet normal -0.97778 -0.208215 0.0243501 + outer loop + vertex -1.21915 -0.338995 -0.00919506 + vertex -1.19991 -0.429348 -0.00922753 + vertex -1.19681 -0.430522 0.104939 + endloop + endfacet + facet normal -0.978171 -0.206162 0.0260732 + outer loop + vertex -1.21915 -0.338995 -0.00919506 + vertex -1.19681 -0.430522 0.104939 + vertex -1.2159 -0.339902 0.105336 + endloop + endfacet + facet normal -0.973116 -0.205439 0.104119 + outer loop + vertex -1.2159 -0.339902 0.105336 + vertex -1.19681 -0.430522 0.104939 + vertex -1.18498 -0.432065 0.212524 + endloop + endfacet + facet normal -0.973604 -0.201067 0.108019 + outer loop + vertex -1.2159 -0.339902 0.105336 + vertex -1.18498 -0.432065 0.212524 + vertex -1.20369 -0.341054 0.213278 + endloop + endfacet + facet normal -0.948502 -0.197067 0.248009 + outer loop + vertex -1.20369 -0.341054 0.213278 + vertex -1.18498 -0.432065 0.212524 + vertex -1.15969 -0.434776 0.307092 + endloop + endfacet + facet normal -0.948048 -0.188828 0.256026 + outer loop + vertex -1.20369 -0.341054 0.213278 + vertex -1.15969 -0.434776 0.307092 + vertex -1.17769 -0.342938 0.308176 + endloop + endfacet + facet normal -0.857086 -0.173704 0.485006 + outer loop + vertex -1.17769 -0.342938 0.308176 + vertex -1.15969 -0.434776 0.307092 + vertex -1.11623 -0.439453 0.382207 + endloop + endfacet + facet normal -0.852301 -0.160939 0.497676 + outer loop + vertex -1.17769 -0.342938 0.308176 + vertex -1.11623 -0.439453 0.382207 + vertex -1.13307 -0.346042 0.383572 + endloop + endfacet + facet normal -0.946716 -0.298597 -0.120701 + outer loop + vertex -1.17328 -0.418635 -0.453892 + vertex -1.14699 -0.502805 -0.451898 + vertex -1.15888 -0.507973 -0.345887 + endloop + endfacet + facet normal -0.947247 -0.297353 -0.119601 + outer loop + vertex -1.17328 -0.418635 -0.453892 + vertex -1.15888 -0.507973 -0.345887 + vertex -1.18552 -0.422563 -0.347216 + endloop + endfacet + facet normal -0.950974 -0.297945 -0.0829254 + outer loop + vertex -1.18552 -0.422563 -0.347216 + vertex -1.15888 -0.507973 -0.345887 + vertex -1.16725 -0.51186 -0.235868 + endloop + endfacet + facet normal -0.951368 -0.29693 -0.0820472 + outer loop + vertex -1.18552 -0.422563 -0.347216 + vertex -1.16725 -0.51186 -0.235868 + vertex -1.19413 -0.425542 -0.23665 + endloop + endfacet + facet normal -0.953592 -0.29731 -0.0476353 + outer loop + vertex -1.19413 -0.425542 -0.23665 + vertex -1.16725 -0.51186 -0.235868 + vertex -1.172 -0.514662 -0.123256 + endloop + endfacet + facet normal -0.954022 -0.296093 -0.0465946 + outer loop + vertex -1.19413 -0.425542 -0.23665 + vertex -1.172 -0.514662 -0.123256 + vertex -1.19897 -0.427746 -0.123539 + endloop + endfacet + facet normal -0.955003 -0.29629 -0.0134868 + outer loop + vertex -1.19897 -0.427746 -0.123539 + vertex -1.172 -0.514662 -0.123256 + vertex -1.17302 -0.516573 -0.00947047 + endloop + endfacet + facet normal -0.955565 -0.294536 -0.0119931 + outer loop + vertex -1.19897 -0.427746 -0.123539 + vertex -1.17302 -0.516573 -0.00947047 + vertex -1.19991 -0.429348 -0.00922753 + endloop + endfacet + facet normal -0.955403 -0.294577 0.0207232 + outer loop + vertex -1.19991 -0.429348 -0.00922753 + vertex -1.17302 -0.516573 -0.00947047 + vertex -1.17018 -0.517789 0.104073 + endloop + endfacet + facet normal -0.956135 -0.292031 0.0229022 + outer loop + vertex -1.19991 -0.429348 -0.00922753 + vertex -1.17018 -0.517789 0.104073 + vertex -1.19681 -0.430522 0.104939 + endloop + endfacet + facet normal -0.951819 -0.291434 0.0954258 + outer loop + vertex -1.19681 -0.430522 0.104939 + vertex -1.17018 -0.517789 0.104073 + vertex -1.15894 -0.519501 0.210997 + endloop + endfacet + facet normal -0.953039 -0.285594 0.10076 + outer loop + vertex -1.19681 -0.430522 0.104939 + vertex -1.15894 -0.519501 0.210997 + vertex -1.18498 -0.432065 0.212524 + endloop + endfacet + facet normal -0.931625 -0.281472 0.229886 + outer loop + vertex -1.18498 -0.432065 0.212524 + vertex -1.15894 -0.519501 0.210997 + vertex -1.13473 -0.522901 0.304924 + endloop + endfacet + facet normal -0.932106 -0.269887 0.241536 + outer loop + vertex -1.18498 -0.432065 0.212524 + vertex -1.13473 -0.522901 0.304924 + vertex -1.15969 -0.434776 0.307092 + endloop + endfacet + facet normal -0.853222 -0.25283 0.456168 + outer loop + vertex -1.15969 -0.434776 0.307092 + vertex -1.13473 -0.522901 0.304924 + vertex -1.09301 -0.529179 0.379476 + endloop + endfacet + facet normal -0.847828 -0.233889 0.475903 + outer loop + vertex -1.15969 -0.434776 0.307092 + vertex -1.09301 -0.529179 0.379476 + vertex -1.11623 -0.439453 0.382207 + endloop + endfacet + facet normal -0.913954 -0.386897 -0.122471 + outer loop + vertex -1.14699 -0.502805 -0.451898 + vertex -1.1132 -0.583246 -0.449905 + vertex -1.12463 -0.589596 -0.344558 + endloop + endfacet + facet normal -0.914619 -0.385678 -0.121348 + outer loop + vertex -1.14699 -0.502805 -0.451898 + vertex -1.12463 -0.589596 -0.344558 + vertex -1.15888 -0.507973 -0.345887 + endloop + endfacet + facet normal -0.91835 -0.386643 -0.0844948 + outer loop + vertex -1.15888 -0.507973 -0.345887 + vertex -1.12463 -0.589596 -0.344558 + vertex -1.13272 -0.594318 -0.235117 + endloop + endfacet + facet normal -0.918863 -0.385623 -0.0835786 + outer loop + vertex -1.15888 -0.507973 -0.345887 + vertex -1.13272 -0.594318 -0.235117 + vertex -1.16725 -0.51186 -0.235868 + endloop + endfacet + facet normal -0.921067 -0.386237 -0.0495646 + outer loop + vertex -1.16725 -0.51186 -0.235868 + vertex -1.13272 -0.594318 -0.235117 + vertex -1.13737 -0.597599 -0.123102 + endloop + endfacet + facet normal -0.921645 -0.384996 -0.0484685 + outer loop + vertex -1.16725 -0.51186 -0.235868 + vertex -1.13737 -0.597599 -0.123102 + vertex -1.172 -0.514662 -0.123256 + endloop + endfacet + facet normal -0.922629 -0.385347 -0.0162109 + outer loop + vertex -1.172 -0.514662 -0.123256 + vertex -1.13737 -0.597599 -0.123102 + vertex -1.13851 -0.599627 -0.0100336 + endloop + endfacet + facet normal -0.923385 -0.383594 -0.0146714 + outer loop + vertex -1.172 -0.514662 -0.123256 + vertex -1.13851 -0.599627 -0.0100336 + vertex -1.17302 -0.516573 -0.00947047 + endloop + endfacet + facet normal -0.923278 -0.383763 0.0168491 + outer loop + vertex -1.17302 -0.516573 -0.00947047 + vertex -1.13851 -0.599627 -0.0100336 + vertex -1.13605 -0.600587 0.102567 + endloop + endfacet + facet normal -0.924254 -0.381303 0.0190158 + outer loop + vertex -1.17302 -0.516573 -0.00947047 + vertex -1.13605 -0.600587 0.102567 + vertex -1.17018 -0.517789 0.104073 + endloop + endfacet + facet normal -0.920675 -0.381023 0.0847291 + outer loop + vertex -1.17018 -0.517789 0.104073 + vertex -1.13605 -0.600587 0.102567 + vertex -1.12565 -0.602173 0.208436 + endloop + endfacet + facet normal -0.922812 -0.374336 0.0910477 + outer loop + vertex -1.17018 -0.517789 0.104073 + vertex -1.12565 -0.602173 0.208436 + vertex -1.15894 -0.519501 0.210997 + endloop + endfacet + facet normal -0.905583 -0.370951 0.205705 + outer loop + vertex -1.15894 -0.519501 0.210997 + vertex -1.12565 -0.602173 0.208436 + vertex -1.10296 -0.606077 0.30131 + endloop + endfacet + facet normal -0.907812 -0.356399 0.221038 + outer loop + vertex -1.15894 -0.519501 0.210997 + vertex -1.10296 -0.606077 0.30131 + vertex -1.13473 -0.522901 0.304924 + endloop + endfacet + facet normal -0.843993 -0.340423 0.414472 + outer loop + vertex -1.13473 -0.522901 0.304924 + vertex -1.10296 -0.606077 0.30131 + vertex -1.06361 -0.613991 0.374925 + endloop + endfacet + facet normal -0.839358 -0.314729 0.443197 + outer loop + vertex -1.13473 -0.522901 0.304924 + vertex -1.06361 -0.613991 0.374925 + vertex -1.09301 -0.529179 0.379476 + endloop + endfacet + facet normal -0.870222 -0.476759 -0.124156 + outer loop + vertex -1.1132 -0.583246 -0.449905 + vertex -1.07194 -0.659028 -0.44816 + vertex -1.0828 -0.666484 -0.343395 + endloop + endfacet + facet normal -0.870923 -0.475737 -0.123158 + outer loop + vertex -1.1132 -0.583246 -0.449905 + vertex -1.0828 -0.666484 -0.343395 + vertex -1.12463 -0.589596 -0.344558 + endloop + endfacet + facet normal -0.874594 -0.477172 -0.0859817 + outer loop + vertex -1.12463 -0.589596 -0.344558 + vertex -1.0828 -0.666484 -0.343395 + vertex -1.09052 -0.671965 -0.234478 + endloop + endfacet + facet normal -0.875139 -0.476317 -0.0851731 + outer loop + vertex -1.12463 -0.589596 -0.344558 + vertex -1.09052 -0.671965 -0.234478 + vertex -1.13272 -0.594318 -0.235117 + endloop + endfacet + facet normal -0.877289 -0.477207 -0.0513495 + outer loop + vertex -1.13272 -0.594318 -0.235117 + vertex -1.09052 -0.671965 -0.234478 + vertex -1.09505 -0.675627 -0.123039 + endloop + endfacet + facet normal -0.877897 -0.47619 -0.0504069 + outer loop + vertex -1.13272 -0.594318 -0.235117 + vertex -1.09505 -0.675627 -0.123039 + vertex -1.13737 -0.597599 -0.123102 + endloop + endfacet + facet normal -0.878872 -0.476693 -0.0186736 + outer loop + vertex -1.13737 -0.597599 -0.123102 + vertex -1.09505 -0.675627 -0.123039 + vertex -1.09635 -0.677624 -0.0107065 + endloop + endfacet + facet normal -0.879656 -0.475293 -0.0173905 + outer loop + vertex -1.13737 -0.597599 -0.123102 + vertex -1.09635 -0.677624 -0.0107065 + vertex -1.13851 -0.599627 -0.0100336 + endloop + endfacet + facet normal -0.879599 -0.475527 0.013414 + outer loop + vertex -1.13851 -0.599627 -0.0100336 + vertex -1.09635 -0.677624 -0.0107065 + vertex -1.09438 -0.678112 0.100889 + endloop + endfacet + facet normal -0.880594 -0.47363 0.0151524 + outer loop + vertex -1.13851 -0.599627 -0.0100336 + vertex -1.09438 -0.678112 0.100889 + vertex -1.13605 -0.600587 0.102567 + endloop + endfacet + facet normal -0.877855 -0.4734 0.0725468 + outer loop + vertex -1.13605 -0.600587 0.102567 + vertex -1.09438 -0.678112 0.100889 + vertex -1.08539 -0.678831 0.204991 + endloop + endfacet + facet normal -0.881048 -0.466288 0.0795595 + outer loop + vertex -1.13605 -0.600587 0.102567 + vertex -1.08539 -0.678831 0.204991 + vertex -1.12565 -0.602173 0.208436 + endloop + endfacet + facet normal -0.868033 -0.463837 0.177128 + outer loop + vertex -1.12565 -0.602173 0.208436 + vertex -1.08539 -0.678831 0.204991 + vertex -1.06562 -0.681517 0.294843 + endloop + endfacet + facet normal -0.872439 -0.448417 0.19435 + outer loop + vertex -1.12565 -0.602173 0.208436 + vertex -1.06562 -0.681517 0.294843 + vertex -1.10296 -0.606077 0.30131 + endloop + endfacet + facet normal -0.822864 -0.438232 0.361729 + outer loop + vertex -1.10296 -0.606077 0.30131 + vertex -1.06562 -0.681517 0.294843 + vertex -1.03034 -0.689657 0.365244 + endloop + endfacet + facet normal -0.821392 -0.411709 0.394729 + outer loop + vertex -1.10296 -0.606077 0.30131 + vertex -1.03034 -0.689657 0.365244 + vertex -1.06361 -0.613991 0.374925 + endloop + endfacet + facet normal -0.81383 -0.567391 -0.125489 + outer loop + vertex -1.07194 -0.659028 -0.44816 + vertex -1.02319 -0.729217 -0.446914 + vertex -1.03338 -0.737691 -0.342564 + endloop + endfacet + facet normal -0.814412 -0.566714 -0.124772 + outer loop + vertex -1.07194 -0.659028 -0.44816 + vertex -1.03338 -0.737691 -0.342564 + vertex -1.0828 -0.666484 -0.343395 + endloop + endfacet + facet normal -0.817913 -0.568704 -0.0871452 + outer loop + vertex -1.0828 -0.666484 -0.343395 + vertex -1.03338 -0.737691 -0.342564 + vertex -1.04066 -0.743853 -0.234031 + endloop + endfacet + facet normal -0.818363 -0.568144 -0.0865755 + outer loop + vertex -1.0828 -0.666484 -0.343395 + vertex -1.04066 -0.743853 -0.234031 + vertex -1.09052 -0.671965 -0.234478 + endloop + endfacet + facet normal -0.820405 -0.56935 -0.0526916 + outer loop + vertex -1.09052 -0.671965 -0.234478 + vertex -1.04066 -0.743853 -0.234031 + vertex -1.04504 -0.747813 -0.12303 + endloop + endfacet + facet normal -0.820886 -0.568714 -0.0520628 + outer loop + vertex -1.09052 -0.671965 -0.234478 + vertex -1.04504 -0.747813 -0.12303 + vertex -1.09505 -0.675627 -0.123039 + endloop + endfacet + facet normal -0.82183 -0.569365 -0.0204612 + outer loop + vertex -1.09505 -0.675627 -0.123039 + vertex -1.04504 -0.747813 -0.12303 + vertex -1.04653 -0.749679 -0.0112786 + endloop + endfacet + facet normal -0.822426 -0.568533 -0.0196516 + outer loop + vertex -1.09505 -0.675627 -0.123039 + vertex -1.04653 -0.749679 -0.0112786 + vertex -1.09635 -0.677624 -0.0107065 + endloop + endfacet + facet normal -0.822421 -0.568773 0.0109732 + outer loop + vertex -1.09635 -0.677624 -0.0107065 + vertex -1.04653 -0.749679 -0.0112786 + vertex -1.04513 -0.749562 0.0995073 + endloop + endfacet + facet normal -0.823151 -0.567695 0.0120162 + outer loop + vertex -1.09635 -0.677624 -0.0107065 + vertex -1.04513 -0.749562 0.0995073 + vertex -1.09438 -0.678112 0.100889 + endloop + endfacet + facet normal -0.821185 -0.567302 0.0618327 + outer loop + vertex -1.09438 -0.678112 0.100889 + vertex -1.04513 -0.749562 0.0995073 + vertex -1.03842 -0.748227 0.20081 + endloop + endfacet + facet normal -0.824372 -0.562031 0.0673164 + outer loop + vertex -1.09438 -0.678112 0.100889 + vertex -1.03842 -0.748227 0.20081 + vertex -1.08539 -0.678831 0.204991 + endloop + endfacet + facet normal -0.81407 -0.560225 0.153094 + outer loop + vertex -1.08539 -0.678831 0.204991 + vertex -1.03842 -0.748227 0.20081 + vertex -1.02399 -0.746438 0.284113 + endloop + endfacet + facet normal -0.817942 -0.551584 0.163483 + outer loop + vertex -1.08539 -0.678831 0.204991 + vertex -1.02399 -0.746438 0.284113 + vertex -1.06562 -0.681517 0.294843 + endloop + endfacet + facet normal -0.778322 -0.54939 0.303951 + outer loop + vertex -1.06562 -0.681517 0.294843 + vertex -1.02399 -0.746438 0.284113 + vertex -0.995492 -0.751946 0.347126 + endloop + endfacet + facet normal -0.779957 -0.532151 0.329366 + outer loop + vertex -1.06562 -0.681517 0.294843 + vertex -0.995492 -0.751946 0.347126 + vertex -1.03034 -0.689657 0.365244 + endloop + endfacet + facet normal -0.743161 -0.657109 -0.126173 + outer loop + vertex -1.02319 -0.729217 -0.446914 + vertex -0.966985 -0.792882 -0.446415 + vertex -0.976373 -0.802269 -0.342232 + endloop + endfacet + facet normal -0.743424 -0.656866 -0.125885 + outer loop + vertex -1.02319 -0.729217 -0.446914 + vertex -0.976373 -0.802269 -0.342232 + vertex -1.03338 -0.737691 -0.342564 + endloop + endfacet + facet normal -0.746595 -0.659469 -0.0877319 + outer loop + vertex -1.03338 -0.737691 -0.342564 + vertex -0.976373 -0.802269 -0.342232 + vertex -0.983135 -0.809032 -0.233855 + endloop + endfacet + facet normal -0.746789 -0.659278 -0.0875172 + outer loop + vertex -1.03338 -0.737691 -0.342564 + vertex -0.983135 -0.809032 -0.233855 + vertex -1.04066 -0.743853 -0.234031 + endloop + endfacet + facet normal -0.748644 -0.660823 -0.053339 + outer loop + vertex -1.04066 -0.743853 -0.234031 + vertex -0.983135 -0.809032 -0.233855 + vertex -0.987329 -0.813225 -0.123039 + endloop + endfacet + facet normal -0.748835 -0.660624 -0.0531228 + outer loop + vertex -1.04066 -0.743853 -0.234031 + vertex -0.987329 -0.813225 -0.123039 + vertex -1.04504 -0.747813 -0.12303 + endloop + endfacet + facet normal -0.749722 -0.661411 -0.0212866 + outer loop + vertex -1.04504 -0.747813 -0.12303 + vertex -0.987329 -0.813225 -0.123039 + vertex -0.989011 -0.814907 -0.0115394 + endloop + endfacet + facet normal -0.749936 -0.661175 -0.0210369 + outer loop + vertex -1.04504 -0.747813 -0.12303 + vertex -0.989011 -0.814907 -0.0115394 + vertex -1.04653 -0.749679 -0.0112786 + endloop + endfacet + facet normal -0.750005 -0.661359 0.00987881 + outer loop + vertex -1.04653 -0.749679 -0.0112786 + vertex -0.989011 -0.814907 -0.0115394 + vertex -0.988238 -0.814134 0.0988907 + endloop + endfacet + facet normal -0.750238 -0.661089 0.0101601 + outer loop + vertex -1.04653 -0.749679 -0.0112786 + vertex -0.988238 -0.814134 0.0988907 + vertex -1.04513 -0.749562 0.0995073 + endloop + endfacet + facet normal -0.748855 -0.660314 0.0565854 + outer loop + vertex -1.04513 -0.749562 0.0995073 + vertex -0.988238 -0.814134 0.0988907 + vertex -0.984236 -0.810133 0.198536 + endloop + endfacet + facet normal -0.750119 -0.658726 0.058334 + outer loop + vertex -1.04513 -0.749562 0.0995073 + vertex -0.984236 -0.810133 0.198536 + vertex -1.03842 -0.748227 0.20081 + endloop + endfacet + facet normal -0.742337 -0.654961 0.141285 + outer loop + vertex -1.03842 -0.748227 0.20081 + vertex -0.984236 -0.810133 0.198536 + vertex -0.976234 -0.80213 0.277683 + endloop + endfacet + facet normal -0.743143 -0.653715 0.142812 + outer loop + vertex -1.03842 -0.748227 0.20081 + vertex -0.976234 -0.80213 0.277683 + vertex -1.02399 -0.746438 0.284113 + endloop + endfacet + facet normal -0.715155 -0.644467 0.270584 + outer loop + vertex -1.02399 -0.746438 0.284113 + vertex -0.976234 -0.80213 0.277683 + vertex -0.966663 -0.79256 0.325773 + endloop + endfacet + facet normal -0.714298 -0.647132 0.266455 + outer loop + vertex -1.02399 -0.746438 0.284113 + vertex -0.966663 -0.79256 0.325773 + vertex -0.995492 -0.751946 0.347126 + endloop + endfacet + facet normal -0.992289 0.0419425 -0.116629 + outer loop + vertex -1.20712 -0.153076 -0.457381 + vertex -1.2198 -0.153076 -0.349542 + vertex -1.21599 -0.0619842 -0.34921 + endloop + endfacet + facet normal -0.992246 0.0422546 -0.116889 + outer loop + vertex -1.20712 -0.153076 -0.457381 + vertex -1.21599 -0.0619842 -0.34921 + vertex -1.20336 -0.0633134 -0.456883 + endloop + endfacet + facet normal -0.985101 0.125964 -0.117084 + outer loop + vertex -1.20336 -0.0633134 -0.456883 + vertex -1.21599 -0.0619842 -0.34921 + vertex -1.20456 0.0281605 -0.348379 + endloop + endfacet + facet normal -0.984922 0.12675 -0.117745 + outer loop + vertex -1.20336 -0.0633134 -0.456883 + vertex -1.20456 0.0281605 -0.348379 + vertex -1.19208 0.0255169 -0.455637 + endloop + endfacet + facet normal -0.970346 0.210894 -0.118123 + outer loop + vertex -1.19208 0.0255169 -0.455637 + vertex -1.20456 0.0281605 -0.348379 + vertex -1.18552 0.116411 -0.347216 + endloop + endfacet + facet normal -0.969991 0.211994 -0.119066 + outer loop + vertex -1.19208 0.0255169 -0.455637 + vertex -1.18552 0.116411 -0.347216 + vertex -1.17328 0.112483 -0.453892 + endloop + endfacet + facet normal -0.947247 0.297354 -0.1196 + outer loop + vertex -1.17328 0.112483 -0.453892 + vertex -1.18552 0.116411 -0.347216 + vertex -1.15888 0.201822 -0.345887 + endloop + endfacet + facet normal -0.946716 0.298598 -0.120701 + outer loop + vertex -1.17328 0.112483 -0.453892 + vertex -1.15888 0.201822 -0.345887 + vertex -1.14699 0.196653 -0.451898 + endloop + endfacet + facet normal -0.914619 0.385678 -0.121348 + outer loop + vertex -1.14699 0.196653 -0.451898 + vertex -1.15888 0.201822 -0.345887 + vertex -1.12463 0.283444 -0.344558 + endloop + endfacet + facet normal -0.913954 0.386896 -0.122471 + outer loop + vertex -1.14699 0.196653 -0.451898 + vertex -1.12463 0.283444 -0.344558 + vertex -1.1132 0.277095 -0.449905 + endloop + endfacet + facet normal -0.870922 0.475738 -0.123158 + outer loop + vertex -1.1132 0.277095 -0.449905 + vertex -1.12463 0.283444 -0.344558 + vertex -1.0828 0.360332 -0.343395 + endloop + endfacet + facet normal -0.870222 0.476759 -0.124156 + outer loop + vertex -1.1132 0.277095 -0.449905 + vertex -1.0828 0.360332 -0.343395 + vertex -1.07194 0.352876 -0.44816 + endloop + endfacet + facet normal -0.814413 0.566714 -0.124771 + outer loop + vertex -1.07194 0.352876 -0.44816 + vertex -1.0828 0.360332 -0.343395 + vertex -1.03338 0.431539 -0.342564 + endloop + endfacet + facet normal -0.813829 0.567392 -0.12549 + outer loop + vertex -1.07194 0.352876 -0.44816 + vertex -1.03338 0.431539 -0.342564 + vertex -1.02319 0.423066 -0.446914 + endloop + endfacet + facet normal -0.743424 0.656867 -0.125885 + outer loop + vertex -1.02319 0.423066 -0.446914 + vertex -1.03338 0.431539 -0.342564 + vertex -0.976372 0.496118 -0.342232 + endloop + endfacet + facet normal -0.743161 0.657109 -0.126172 + outer loop + vertex -1.02319 0.423066 -0.446914 + vertex -0.976372 0.496118 -0.342232 + vertex -0.966985 0.48673 -0.446415 + endloop + endfacet + facet normal -0.995958 0.0417466 -0.0795333 + outer loop + vertex -1.2198 -0.153076 -0.349542 + vertex -1.2287 -0.153076 -0.238072 + vertex -1.22485 -0.0609667 -0.237864 + endloop + endfacet + facet normal -0.995935 0.0419603 -0.0797085 + outer loop + vertex -1.2198 -0.153076 -0.349542 + vertex -1.22485 -0.0609667 -0.237864 + vertex -1.21599 -0.0619842 -0.34921 + endloop + endfacet + facet normal -0.988869 0.125509 -0.0799092 + outer loop + vertex -1.21599 -0.0619842 -0.34921 + vertex -1.22485 -0.0609667 -0.237864 + vertex -1.21333 0.0301772 -0.237353 + endloop + endfacet + facet normal -0.988756 0.126089 -0.0803902 + outer loop + vertex -1.21599 -0.0619842 -0.34921 + vertex -1.21333 0.0301772 -0.237353 + vertex -1.20456 0.0281605 -0.348379 + endloop + endfacet + facet normal -0.974283 0.210349 -0.0807775 + outer loop + vertex -1.20456 0.0281605 -0.348379 + vertex -1.21333 0.0301772 -0.237353 + vertex -1.19413 0.119391 -0.23665 + endloop + endfacet + facet normal -0.974037 0.211208 -0.0815016 + outer loop + vertex -1.20456 0.0281605 -0.348379 + vertex -1.19413 0.119391 -0.23665 + vertex -1.18552 0.116411 -0.347216 + endloop + endfacet + facet normal -0.951367 0.296931 -0.0820471 + outer loop + vertex -1.18552 0.116411 -0.347216 + vertex -1.19413 0.119391 -0.23665 + vertex -1.16725 0.205709 -0.235868 + endloop + endfacet + facet normal -0.950974 0.297946 -0.0829254 + outer loop + vertex -1.18552 0.116411 -0.347216 + vertex -1.16725 0.205709 -0.235868 + vertex -1.15888 0.201822 -0.345887 + endloop + endfacet + facet normal -0.918863 0.385623 -0.0835786 + outer loop + vertex -1.15888 0.201822 -0.345887 + vertex -1.16725 0.205709 -0.235868 + vertex -1.13271 0.288166 -0.235117 + endloop + endfacet + facet normal -0.918351 0.386643 -0.0844948 + outer loop + vertex -1.15888 0.201822 -0.345887 + vertex -1.13271 0.288166 -0.235117 + vertex -1.12463 0.283444 -0.344558 + endloop + endfacet + facet normal -0.875138 0.476318 -0.0851731 + outer loop + vertex -1.12463 0.283444 -0.344558 + vertex -1.13271 0.288166 -0.235117 + vertex -1.09052 0.365813 -0.234478 + endloop + endfacet + facet normal -0.874593 0.477173 -0.0859819 + outer loop + vertex -1.12463 0.283444 -0.344558 + vertex -1.09052 0.365813 -0.234478 + vertex -1.0828 0.360332 -0.343395 + endloop + endfacet + facet normal -0.818362 0.568145 -0.0865756 + outer loop + vertex -1.0828 0.360332 -0.343395 + vertex -1.09052 0.365813 -0.234478 + vertex -1.04065 0.437701 -0.234031 + endloop + endfacet + facet normal -0.817913 0.568704 -0.0871444 + outer loop + vertex -1.0828 0.360332 -0.343395 + vertex -1.04065 0.437701 -0.234031 + vertex -1.03338 0.431539 -0.342564 + endloop + endfacet + facet normal -0.746789 0.659278 -0.0875166 + outer loop + vertex -1.03338 0.431539 -0.342564 + vertex -1.04065 0.437701 -0.234031 + vertex -0.983135 0.50288 -0.233855 + endloop + endfacet + facet normal -0.746594 0.659469 -0.0877321 + outer loop + vertex -1.03338 0.431539 -0.342564 + vertex -0.983135 0.50288 -0.233855 + vertex -0.976372 0.496118 -0.342232 + endloop + endfacet + facet normal -0.998183 0.0415597 -0.043636 + outer loop + vertex -1.2287 -0.153076 -0.238072 + vertex -1.23368 -0.153076 -0.124242 + vertex -1.22981 -0.0601929 -0.124123 + endloop + endfacet + facet normal -0.998167 0.0417582 -0.0437977 + outer loop + vertex -1.2287 -0.153076 -0.238072 + vertex -1.22981 -0.0601929 -0.124123 + vertex -1.22485 -0.0609667 -0.237864 + endloop + endfacet + facet normal -0.991181 0.124974 -0.0440593 + outer loop + vertex -1.22485 -0.0609667 -0.237864 + vertex -1.22981 -0.0601929 -0.124123 + vertex -1.21824 0.0316955 -0.123858 + endloop + endfacet + facet normal -0.991081 0.12559 -0.0445664 + outer loop + vertex -1.22485 -0.0609667 -0.237864 + vertex -1.21824 0.0316955 -0.123858 + vertex -1.21333 0.0301772 -0.237353 + endloop + endfacet + facet normal -0.976754 0.209571 -0.0450699 + outer loop + vertex -1.21333 0.0301772 -0.237353 + vertex -1.21824 0.0316955 -0.123858 + vertex -1.19897 0.121595 -0.123539 + endloop + endfacet + facet normal -0.976505 0.210553 -0.0458901 + outer loop + vertex -1.21333 0.0301772 -0.237353 + vertex -1.19897 0.121595 -0.123539 + vertex -1.19413 0.119391 -0.23665 + endloop + endfacet + facet normal -0.954022 0.296094 -0.0465947 + outer loop + vertex -1.19413 0.119391 -0.23665 + vertex -1.19897 0.121595 -0.123539 + vertex -1.172 0.20851 -0.123256 + endloop + endfacet + facet normal -0.953591 0.297312 -0.0476354 + outer loop + vertex -1.19413 0.119391 -0.23665 + vertex -1.172 0.20851 -0.123256 + vertex -1.16725 0.205709 -0.235868 + endloop + endfacet + facet normal -0.921644 0.384998 -0.0484687 + outer loop + vertex -1.16725 0.205709 -0.235868 + vertex -1.172 0.20851 -0.123256 + vertex -1.13737 0.291448 -0.123102 + endloop + endfacet + facet normal -0.921067 0.386237 -0.0495637 + outer loop + vertex -1.16725 0.205709 -0.235868 + vertex -1.13737 0.291448 -0.123102 + vertex -1.13271 0.288166 -0.235117 + endloop + endfacet + facet normal -0.877897 0.47619 -0.050406 + outer loop + vertex -1.13271 0.288166 -0.235117 + vertex -1.13737 0.291448 -0.123102 + vertex -1.09505 0.369475 -0.123039 + endloop + endfacet + facet normal -0.877289 0.477209 -0.0513492 + outer loop + vertex -1.13271 0.288166 -0.235117 + vertex -1.09505 0.369475 -0.123039 + vertex -1.09052 0.365813 -0.234478 + endloop + endfacet + facet normal -0.820886 0.568715 -0.0520625 + outer loop + vertex -1.09052 0.365813 -0.234478 + vertex -1.09505 0.369475 -0.123039 + vertex -1.04504 0.441661 -0.12303 + endloop + endfacet + facet normal -0.820404 0.569351 -0.0526916 + outer loop + vertex -1.09052 0.365813 -0.234478 + vertex -1.04504 0.441661 -0.12303 + vertex -1.04065 0.437701 -0.234031 + endloop + endfacet + facet normal -0.748835 0.660624 -0.0531228 + outer loop + vertex -1.04065 0.437701 -0.234031 + vertex -1.04504 0.441661 -0.12303 + vertex -0.987328 0.507074 -0.123039 + endloop + endfacet + facet normal -0.748644 0.660823 -0.0533393 + outer loop + vertex -1.04065 0.437701 -0.234031 + vertex -0.987328 0.507074 -0.123039 + vertex -0.983135 0.50288 -0.233855 + endloop + endfacet + facet normal -0.999116 0.0412984 -0.00781355 + outer loop + vertex -1.23368 -0.153076 -0.124242 + vertex -1.23457 -0.153076 -0.0093227 + vertex -1.23071 -0.0595947 -0.00926336 + endloop + endfacet + facet normal -0.999104 0.0415525 -0.00802043 + outer loop + vertex -1.23368 -0.153076 -0.124242 + vertex -1.23071 -0.0595947 -0.00926336 + vertex -1.22981 -0.0601929 -0.124123 + endloop + endfacet + facet normal -0.992229 0.12414 -0.00839687 + outer loop + vertex -1.22981 -0.0601929 -0.124123 + vertex -1.23071 -0.0595947 -0.00926336 + vertex -1.21915 0.0328437 -0.00919506 + endloop + endfacet + facet normal -0.992116 0.124991 -0.00909587 + outer loop + vertex -1.22981 -0.0601929 -0.124123 + vertex -1.21915 0.0328437 -0.00919506 + vertex -1.21824 0.0316955 -0.123858 + endloop + endfacet + facet normal -0.978025 0.208255 -0.00981828 + outer loop + vertex -1.21824 0.0316955 -0.123858 + vertex -1.21915 0.0328437 -0.00919506 + vertex -1.19991 0.123197 -0.00922752 + endloop + endfacet + facet normal -0.977714 0.209655 -0.0109858 + outer loop + vertex -1.21824 0.0316955 -0.123858 + vertex -1.19991 0.123197 -0.00922752 + vertex -1.19897 0.121595 -0.123539 + endloop + endfacet + facet normal -0.955565 0.294537 -0.011993 + outer loop + vertex -1.19897 0.121595 -0.123539 + vertex -1.19991 0.123197 -0.00922752 + vertex -1.17302 0.210421 -0.00947047 + endloop + endfacet + facet normal -0.955003 0.296291 -0.0134868 + outer loop + vertex -1.19897 0.121595 -0.123539 + vertex -1.17302 0.210421 -0.00947047 + vertex -1.172 0.20851 -0.123256 + endloop + endfacet + facet normal -0.923385 0.383595 -0.0146713 + outer loop + vertex -1.172 0.20851 -0.123256 + vertex -1.17302 0.210421 -0.00947047 + vertex -1.13851 0.293475 -0.0100336 + endloop + endfacet + facet normal -0.922629 0.385349 -0.0162111 + outer loop + vertex -1.172 0.20851 -0.123256 + vertex -1.13851 0.293475 -0.0100336 + vertex -1.13737 0.291448 -0.123102 + endloop + endfacet + facet normal -0.879655 0.475294 -0.0173907 + outer loop + vertex -1.13737 0.291448 -0.123102 + vertex -1.13851 0.293475 -0.0100336 + vertex -1.09635 0.371472 -0.0107065 + endloop + endfacet + facet normal -0.878871 0.476693 -0.0186728 + outer loop + vertex -1.13737 0.291448 -0.123102 + vertex -1.09635 0.371472 -0.0107065 + vertex -1.09505 0.369475 -0.123039 + endloop + endfacet + facet normal -0.822426 0.568532 -0.0196509 + outer loop + vertex -1.09505 0.369475 -0.123039 + vertex -1.09635 0.371472 -0.0107065 + vertex -1.04653 0.443528 -0.0112786 + endloop + endfacet + facet normal -0.82183 0.569365 -0.0204615 + outer loop + vertex -1.09505 0.369475 -0.123039 + vertex -1.04653 0.443528 -0.0112786 + vertex -1.04504 0.441661 -0.12303 + endloop + endfacet + facet normal -0.749936 0.661176 -0.0210372 + outer loop + vertex -1.04504 0.441661 -0.12303 + vertex -1.04653 0.443528 -0.0112786 + vertex -0.98901 0.508756 -0.0115394 + endloop + endfacet + facet normal -0.749722 0.66141 -0.0212858 + outer loop + vertex -1.04504 0.441661 -0.12303 + vertex -0.98901 0.508756 -0.0115394 + vertex -0.987328 0.507074 -0.123039 + endloop + endfacet + facet normal -0.998743 0.0408892 0.0289919 + outer loop + vertex -1.23457 -0.153076 -0.0093227 + vertex -1.23124 -0.153076 0.105413 + vertex -1.2274 -0.059104 0.105437 + endloop + endfacet + facet normal -0.998737 0.0412595 0.0286882 + outer loop + vertex -1.23457 -0.153076 -0.0093227 + vertex -1.2274 -0.059104 0.105437 + vertex -1.23071 -0.0595947 -0.00926336 + endloop + endfacet + facet normal -0.992029 0.122824 0.0281454 + outer loop + vertex -1.23071 -0.0595947 -0.00926336 + vertex -1.2274 -0.059104 0.105437 + vertex -1.2159 0.0337504 0.105336 + endloop + endfacet + facet normal -0.991903 0.124073 0.027112 + outer loop + vertex -1.23071 -0.0595947 -0.00926336 + vertex -1.2159 0.0337504 0.105336 + vertex -1.21915 0.0328437 -0.00919506 + endloop + endfacet + facet normal -0.97817 0.206163 0.0260732 + outer loop + vertex -1.21915 0.0328437 -0.00919506 + vertex -1.2159 0.0337504 0.105336 + vertex -1.19681 0.12437 0.104939 + endloop + endfacet + facet normal -0.97778 0.208215 0.0243511 + outer loop + vertex -1.21915 0.0328437 -0.00919506 + vertex -1.19681 0.12437 0.104939 + vertex -1.19991 0.123197 -0.00922752 + endloop + endfacet + facet normal -0.956134 0.292032 0.0229032 + outer loop + vertex -1.19991 0.123197 -0.00922752 + vertex -1.19681 0.12437 0.104939 + vertex -1.17018 0.211637 0.104073 + endloop + endfacet + facet normal -0.955403 0.294578 0.0207241 + outer loop + vertex -1.19991 0.123197 -0.00922752 + vertex -1.17018 0.211637 0.104073 + vertex -1.17302 0.210421 -0.00947047 + endloop + endfacet + facet normal -0.924254 0.381303 0.0190167 + outer loop + vertex -1.17302 0.210421 -0.00947047 + vertex -1.17018 0.211637 0.104073 + vertex -1.13605 0.294435 0.102567 + endloop + endfacet + facet normal -0.923277 0.383764 0.0168492 + outer loop + vertex -1.17302 0.210421 -0.00947047 + vertex -1.13605 0.294435 0.102567 + vertex -1.13851 0.293475 -0.0100336 + endloop + endfacet + facet normal -0.880593 0.473631 0.0151525 + outer loop + vertex -1.13851 0.293475 -0.0100336 + vertex -1.13605 0.294435 0.102567 + vertex -1.09438 0.371961 0.100889 + endloop + endfacet + facet normal -0.879598 0.475529 0.0134138 + outer loop + vertex -1.13851 0.293475 -0.0100336 + vertex -1.09438 0.371961 0.100889 + vertex -1.09635 0.371472 -0.0107065 + endloop + endfacet + facet normal -0.823151 0.567695 0.0120161 + outer loop + vertex -1.09635 0.371472 -0.0107065 + vertex -1.09438 0.371961 0.100889 + vertex -1.04513 0.443411 0.0995073 + endloop + endfacet + facet normal -0.822422 0.568772 0.0109735 + outer loop + vertex -1.09635 0.371472 -0.0107065 + vertex -1.04513 0.443411 0.0995073 + vertex -1.04653 0.443528 -0.0112786 + endloop + endfacet + facet normal -0.750238 0.66109 0.0101604 + outer loop + vertex -1.04653 0.443528 -0.0112786 + vertex -1.04513 0.443411 0.0995073 + vertex -0.988237 0.507983 0.0988907 + endloop + endfacet + facet normal -0.750004 0.66136 0.00987881 + outer loop + vertex -1.04653 0.443528 -0.0112786 + vertex -0.988237 0.507983 0.0988907 + vertex -0.98901 0.508756 -0.0115394 + endloop + endfacet + facet normal -0.99263 0.0398127 0.114455 + outer loop + vertex -1.23124 -0.153076 0.105413 + vertex -1.21878 -0.153076 0.213516 + vertex -1.21498 -0.058491 0.213522 + endloop + endfacet + facet normal -0.992678 0.0406194 0.113756 + outer loop + vertex -1.23124 -0.153076 0.105413 + vertex -1.21498 -0.058491 0.213522 + vertex -1.2274 -0.059104 0.105437 + endloop + endfacet + facet normal -0.986417 0.119606 0.112589 + outer loop + vertex -1.2274 -0.059104 0.105437 + vertex -1.21498 -0.058491 0.213522 + vertex -1.20369 0.0349024 0.213278 + endloop + endfacet + facet normal -0.986356 0.122211 0.110304 + outer loop + vertex -1.2274 -0.059104 0.105437 + vertex -1.20369 0.0349024 0.213278 + vertex -1.2159 0.0337504 0.105336 + endloop + endfacet + facet normal -0.973604 0.201066 0.10802 + outer loop + vertex -1.2159 0.0337504 0.105336 + vertex -1.20369 0.0349024 0.213278 + vertex -1.18498 0.125913 0.212524 + endloop + endfacet + facet normal -0.973116 0.20544 0.104118 + outer loop + vertex -1.2159 0.0337504 0.105336 + vertex -1.18498 0.125913 0.212524 + vertex -1.19681 0.12437 0.104939 + endloop + endfacet + facet normal -0.953039 0.285595 0.100759 + outer loop + vertex -1.19681 0.12437 0.104939 + vertex -1.18498 0.125913 0.212524 + vertex -1.15894 0.21335 0.210997 + endloop + endfacet + facet normal -0.951819 0.291435 0.0954246 + outer loop + vertex -1.19681 0.12437 0.104939 + vertex -1.15894 0.21335 0.210997 + vertex -1.17018 0.211637 0.104073 + endloop + endfacet + facet normal -0.922812 0.374336 0.0910466 + outer loop + vertex -1.17018 0.211637 0.104073 + vertex -1.15894 0.21335 0.210997 + vertex -1.12565 0.296021 0.208436 + endloop + endfacet + facet normal -0.920675 0.381023 0.0847281 + outer loop + vertex -1.17018 0.211637 0.104073 + vertex -1.12565 0.296021 0.208436 + vertex -1.13605 0.294435 0.102567 + endloop + endfacet + facet normal -0.881047 0.46629 0.0795583 + outer loop + vertex -1.13605 0.294435 0.102567 + vertex -1.12565 0.296021 0.208436 + vertex -1.08539 0.372679 0.204991 + endloop + endfacet + facet normal -0.877854 0.473401 0.0725467 + outer loop + vertex -1.13605 0.294435 0.102567 + vertex -1.08539 0.372679 0.204991 + vertex -1.09438 0.371961 0.100889 + endloop + endfacet + facet normal -0.824372 0.562032 0.0673164 + outer loop + vertex -1.09438 0.371961 0.100889 + vertex -1.08539 0.372679 0.204991 + vertex -1.03842 0.442075 0.20081 + endloop + endfacet + facet normal -0.821185 0.567302 0.0618331 + outer loop + vertex -1.09438 0.371961 0.100889 + vertex -1.03842 0.442075 0.20081 + vertex -1.04513 0.443411 0.0995073 + endloop + endfacet + facet normal -0.750119 0.658725 0.0583344 + outer loop + vertex -1.04513 0.443411 0.0995073 + vertex -1.03842 0.442075 0.20081 + vertex -0.984236 0.503981 0.198536 + endloop + endfacet + facet normal -0.748855 0.660314 0.0565845 + outer loop + vertex -1.04513 0.443411 0.0995073 + vertex -0.984236 0.503981 0.198536 + vertex -0.988237 0.507983 0.0988907 + endloop + endfacet + facet normal -0.962569 0.0370854 0.268489 + outer loop + vertex -1.21878 -0.153076 0.213516 + vertex -1.19227 -0.153076 0.308537 + vertex -1.18859 -0.0575259 0.308537 + endloop + endfacet + facet normal -0.962905 0.0386107 0.267062 + outer loop + vertex -1.21878 -0.153076 0.213516 + vertex -1.18859 -0.0575259 0.308537 + vertex -1.21498 -0.058491 0.213522 + endloop + endfacet + facet normal -0.957775 0.111791 0.264894 + outer loop + vertex -1.21498 -0.058491 0.213522 + vertex -1.18859 -0.0575259 0.308537 + vertex -1.17769 0.0367866 0.308176 + endloop + endfacet + facet normal -0.958457 0.116609 0.260313 + outer loop + vertex -1.21498 -0.058491 0.213522 + vertex -1.17769 0.0367866 0.308176 + vertex -1.20369 0.0349024 0.213278 + endloop + endfacet + facet normal -0.948048 0.188828 0.256027 + outer loop + vertex -1.20369 0.0349024 0.213278 + vertex -1.17769 0.0367866 0.308176 + vertex -1.15969 0.128624 0.307092 + endloop + endfacet + facet normal -0.948502 0.197066 0.24801 + outer loop + vertex -1.20369 0.0349024 0.213278 + vertex -1.15969 0.128624 0.307092 + vertex -1.18498 0.125913 0.212524 + endloop + endfacet + facet normal -0.932105 0.269887 0.241537 + outer loop + vertex -1.18498 0.125913 0.212524 + vertex -1.15969 0.128624 0.307092 + vertex -1.13473 0.216749 0.304924 + endloop + endfacet + facet normal -0.931625 0.281473 0.229886 + outer loop + vertex -1.18498 0.125913 0.212524 + vertex -1.13473 0.216749 0.304924 + vertex -1.15894 0.21335 0.210997 + endloop + endfacet + facet normal -0.907812 0.356399 0.221038 + outer loop + vertex -1.15894 0.21335 0.210997 + vertex -1.13473 0.216749 0.304924 + vertex -1.10296 0.299925 0.30131 + endloop + endfacet + facet normal -0.905583 0.370952 0.205706 + outer loop + vertex -1.15894 0.21335 0.210997 + vertex -1.10296 0.299925 0.30131 + vertex -1.12565 0.296021 0.208436 + endloop + endfacet + facet normal -0.872439 0.448418 0.19435 + outer loop + vertex -1.12565 0.296021 0.208436 + vertex -1.10296 0.299925 0.30131 + vertex -1.06562 0.375366 0.294843 + endloop + endfacet + facet normal -0.868032 0.46384 0.177127 + outer loop + vertex -1.12565 0.296021 0.208436 + vertex -1.06562 0.375366 0.294843 + vertex -1.08539 0.372679 0.204991 + endloop + endfacet + facet normal -0.817942 0.551584 0.163482 + outer loop + vertex -1.08539 0.372679 0.204991 + vertex -1.06562 0.375366 0.294843 + vertex -1.02399 0.440286 0.284113 + endloop + endfacet + facet normal -0.81407 0.560226 0.153093 + outer loop + vertex -1.08539 0.372679 0.204991 + vertex -1.02399 0.440286 0.284113 + vertex -1.03842 0.442075 0.20081 + endloop + endfacet + facet normal -0.743143 0.653715 0.142811 + outer loop + vertex -1.03842 0.442075 0.20081 + vertex -1.02399 0.440286 0.284113 + vertex -0.976233 0.495979 0.277683 + endloop + endfacet + facet normal -0.742338 0.654961 0.141286 + outer loop + vertex -1.03842 0.442075 0.20081 + vertex -0.976233 0.495979 0.277683 + vertex -0.984236 0.503981 0.198536 + endloop + endfacet + facet normal -0.856314 0.0307607 0.515539 + outer loop + vertex -1.19227 -0.153076 0.308537 + vertex -1.14683 -0.153076 0.384027 + vertex -1.14334 -0.0559787 0.384027 + endloop + endfacet + facet normal -0.857519 0.0330381 0.513391 + outer loop + vertex -1.19227 -0.153076 0.308537 + vertex -1.14334 -0.0559787 0.384027 + vertex -1.18859 -0.0575259 0.308537 + endloop + endfacet + facet normal -0.854744 0.0939387 0.510479 + outer loop + vertex -1.18859 -0.0575259 0.308537 + vertex -1.14334 -0.0559787 0.384027 + vertex -1.13307 0.0398899 0.383572 + endloop + endfacet + facet normal -0.858036 0.101169 0.503527 + outer loop + vertex -1.18859 -0.0575259 0.308537 + vertex -1.13307 0.0398899 0.383572 + vertex -1.17769 0.0367866 0.308176 + endloop + endfacet + facet normal -0.852302 0.160939 0.497675 + outer loop + vertex -1.17769 0.0367866 0.308176 + vertex -1.13307 0.0398899 0.383572 + vertex -1.11623 0.133301 0.382207 + endloop + endfacet + facet normal -0.857086 0.173704 0.485005 + outer loop + vertex -1.17769 0.0367866 0.308176 + vertex -1.11623 0.133301 0.382207 + vertex -1.15969 0.128624 0.307092 + endloop + endfacet + facet normal -0.847828 0.233889 0.475902 + outer loop + vertex -1.15969 0.128624 0.307092 + vertex -1.11623 0.133301 0.382207 + vertex -1.09301 0.223027 0.379476 + endloop + endfacet + facet normal -0.853222 0.252831 0.456167 + outer loop + vertex -1.15969 0.128624 0.307092 + vertex -1.09301 0.223027 0.379476 + vertex -1.13473 0.216749 0.304924 + endloop + endfacet + facet normal -0.839358 0.314733 0.443196 + outer loop + vertex -1.13473 0.216749 0.304924 + vertex -1.09301 0.223027 0.379476 + vertex -1.06361 0.307839 0.374925 + endloop + endfacet + facet normal -0.843992 0.340423 0.414474 + outer loop + vertex -1.13473 0.216749 0.304924 + vertex -1.06361 0.307839 0.374925 + vertex -1.10296 0.299925 0.30131 + endloop + endfacet + facet normal -0.821391 0.411709 0.394731 + outer loop + vertex -1.10296 0.299925 0.30131 + vertex -1.06361 0.307839 0.374925 + vertex -1.03034 0.383506 0.365244 + endloop + endfacet + facet normal -0.822863 0.438233 0.361729 + outer loop + vertex -1.10296 0.299925 0.30131 + vertex -1.03034 0.383506 0.365244 + vertex -1.06562 0.375366 0.294843 + endloop + endfacet + facet normal -0.779957 0.532151 0.329367 + outer loop + vertex -1.06562 0.375366 0.294843 + vertex -1.03034 0.383506 0.365244 + vertex -0.995492 0.445794 0.347126 + endloop + endfacet + facet normal -0.778322 0.54939 0.303951 + outer loop + vertex -1.06562 0.375366 0.294843 + vertex -0.995492 0.445794 0.347126 + vertex -1.02399 0.440286 0.284113 + endloop + endfacet + facet normal -0.714298 0.647132 0.266455 + outer loop + vertex -1.02399 0.440286 0.284113 + vertex -0.995492 0.445794 0.347126 + vertex -0.966663 0.486408 0.325773 + endloop + endfacet + facet normal -0.715154 0.644468 0.270584 + outer loop + vertex -1.02399 0.440286 0.284113 + vertex -0.966663 0.486408 0.325773 + vertex -0.976233 0.495979 0.277683 + endloop + endfacet + facet normal -0.986749 0.042245 -0.15666 + outer loop + vertex -1.20712 -0.153076 -0.457381 + vertex -1.20336 -0.0633134 -0.456883 + vertex -1.18712 -0.0650224 -0.559605 + endloop + endfacet + facet normal -0.986795 0.042758 -0.156227 + outer loop + vertex -1.20712 -0.153076 -0.457381 + vertex -1.18712 -0.0650224 -0.559605 + vertex -1.19083 -0.153076 -0.560317 + endloop + endfacet + facet normal -0.97799 0.0427758 -0.204218 + outer loop + vertex -1.19083 -0.153076 -0.560317 + vertex -1.18712 -0.0650224 -0.559605 + vertex -1.16685 -0.0669687 -0.657112 + endloop + endfacet + facet normal -0.978082 0.0434605 -0.203632 + outer loop + vertex -1.19083 -0.153076 -0.560317 + vertex -1.16685 -0.0669687 -0.657112 + vertex -1.17047 -0.153076 -0.658075 + endloop + endfacet + facet normal -0.964533 0.0435243 -0.260348 + outer loop + vertex -1.17047 -0.153076 -0.658075 + vertex -1.16685 -0.0669687 -0.657112 + vertex -1.1421 -0.06901 -0.74914 + endloop + endfacet + facet normal -0.964686 0.0443402 -0.259643 + outer loop + vertex -1.17047 -0.153076 -0.658075 + vertex -1.1421 -0.06901 -0.74914 + vertex -1.14563 -0.153076 -0.750381 + endloop + endfacet + facet normal -0.944458 0.0444647 -0.325609 + outer loop + vertex -1.14563 -0.153076 -0.750381 + vertex -1.1421 -0.06901 -0.74914 + vertex -1.11245 -0.0710038 -0.835423 + endloop + endfacet + facet normal -0.944684 0.045364 -0.324829 + outer loop + vertex -1.14563 -0.153076 -0.750381 + vertex -1.11245 -0.0710038 -0.835423 + vertex -1.11586 -0.153076 -0.836959 + endloop + endfacet + facet normal -0.915375 0.0455524 -0.400016 + outer loop + vertex -1.11586 -0.153076 -0.836959 + vertex -1.11245 -0.0710038 -0.835423 + vertex -1.07746 -0.0728077 -0.915698 + endloop + endfacet + facet normal -0.915674 0.0464702 -0.399226 + outer loop + vertex -1.11586 -0.153076 -0.836959 + vertex -1.07746 -0.0728077 -0.915698 + vertex -1.08073 -0.153076 -0.917536 + endloop + endfacet + facet normal -0.874574 0.0467045 -0.482637 + outer loop + vertex -1.08073 -0.153076 -0.917536 + vertex -1.07746 -0.0728077 -0.915698 + vertex -1.0367 -0.0742794 -0.9897 + endloop + endfacet + facet normal -0.874919 0.0475442 -0.481931 + outer loop + vertex -1.08073 -0.153076 -0.917536 + vertex -1.0367 -0.0742794 -0.9897 + vertex -1.0398 -0.153076 -0.991836 + endloop + endfacet + facet normal -0.819466 0.0477773 -0.571133 + outer loop + vertex -1.0398 -0.153076 -0.991836 + vertex -1.0367 -0.0742794 -0.9897 + vertex -0.989736 -0.0752763 -1.05716 + endloop + endfacet + facet normal -0.819786 0.0484149 -0.570619 + outer loop + vertex -1.0398 -0.153076 -0.991836 + vertex -0.989736 -0.0752763 -1.05716 + vertex -0.992645 -0.153076 -1.05958 + endloop + endfacet + facet normal -0.748372 0.0485724 -0.661498 + outer loop + vertex -0.992645 -0.153076 -1.05958 + vertex -0.989736 -0.0752763 -1.05716 + vertex -0.93614 -0.0756561 -1.11783 + endloop + endfacet + facet normal -0.748534 0.0488436 -0.661295 + outer loop + vertex -0.992645 -0.153076 -1.05958 + vertex -0.93614 -0.0756561 -1.11783 + vertex -0.938822 -0.153076 -1.12051 + endloop + endfacet + facet normal -0.979289 0.1266 -0.158006 + outer loop + vertex -1.20336 -0.0633134 -0.456883 + vertex -1.19208 0.0255169 -0.455637 + vertex -1.17603 0.022118 -0.557825 + endloop + endfacet + facet normal -0.979296 0.127901 -0.156907 + outer loop + vertex -1.20336 -0.0633134 -0.456883 + vertex -1.17603 0.022118 -0.557825 + vertex -1.18712 -0.0650224 -0.559605 + endloop + endfacet + facet normal -0.970233 0.127745 -0.20574 + outer loop + vertex -1.18712 -0.0650224 -0.559605 + vertex -1.17603 0.022118 -0.557825 + vertex -1.156 0.018236 -0.654694 + endloop + endfacet + facet normal -0.970313 0.129362 -0.20435 + outer loop + vertex -1.18712 -0.0650224 -0.559605 + vertex -1.156 0.018236 -0.654694 + vertex -1.16685 -0.0669687 -0.657112 + endloop + endfacet + facet normal -0.956463 0.129225 -0.261687 + outer loop + vertex -1.16685 -0.0669687 -0.657112 + vertex -1.156 0.018236 -0.654694 + vertex -1.13157 0.0141429 -0.745993 + endloop + endfacet + facet normal -0.95664 0.13097 -0.260166 + outer loop + vertex -1.16685 -0.0669687 -0.657112 + vertex -1.13157 0.0141429 -0.745993 + vertex -1.1421 -0.06901 -0.74914 + endloop + endfacet + facet normal -0.936134 0.13088 -0.326378 + outer loop + vertex -1.1421 -0.06901 -0.74914 + vertex -1.13157 0.0141429 -0.745993 + vertex -1.10233 0.010111 -0.831472 + endloop + endfacet + facet normal -0.936416 0.132579 -0.324881 + outer loop + vertex -1.1421 -0.06901 -0.74914 + vertex -1.10233 0.010111 -0.831472 + vertex -1.11245 -0.0710038 -0.835423 + endloop + endfacet + facet normal -0.906962 0.132557 -0.399812 + outer loop + vertex -1.11245 -0.0710038 -0.835423 + vertex -1.10233 0.010111 -0.831472 + vertex -1.06787 0.00641235 -0.910881 + endloop + endfacet + facet normal -0.907322 0.134048 -0.398495 + outer loop + vertex -1.11245 -0.0710038 -0.835423 + vertex -1.06787 0.00641235 -0.910881 + vertex -1.07746 -0.0728077 -0.915698 + endloop + endfacet + facet normal -0.866301 0.13411 -0.481183 + outer loop + vertex -1.07746 -0.0728077 -0.915698 + vertex -1.06787 0.00641235 -0.910881 + vertex -1.02773 0.00336352 -0.983989 + endloop + endfacet + facet normal -0.866719 0.135377 -0.480074 + outer loop + vertex -1.07746 -0.0728077 -0.915698 + vertex -1.02773 0.00336352 -0.983989 + vertex -1.0367 -0.0742794 -0.9897 + endloop + endfacet + facet normal -0.811701 0.135502 -0.568137 + outer loop + vertex -1.0367 -0.0742794 -0.9897 + vertex -1.02773 0.00336352 -0.983989 + vertex -0.981485 0.00128101 -1.05056 + endloop + endfacet + facet normal -0.812111 0.136457 -0.567323 + outer loop + vertex -1.0367 -0.0742794 -0.9897 + vertex -0.981485 0.00128101 -1.05056 + vertex -0.989736 -0.0752763 -1.05716 + endloop + endfacet + facet normal -0.741683 0.136575 -0.656699 + outer loop + vertex -0.989736 -0.0752763 -1.05716 + vertex -0.981485 0.00128101 -1.05056 + vertex -0.92868 0.00048133 -1.11037 + endloop + endfacet + facet normal -0.741915 0.13701 -0.656347 + outer loop + vertex -0.989736 -0.0752763 -1.05716 + vertex -0.92868 0.00048133 -1.11037 + vertex -0.93614 -0.0756561 -1.11783 + endloop + endfacet + facet normal -0.96417 0.211558 -0.160061 + outer loop + vertex -1.19208 0.0255169 -0.455637 + vertex -1.17328 0.112483 -0.453892 + vertex -1.15755 0.107432 -0.555333 + endloop + endfacet + facet normal -0.964022 0.213401 -0.158496 + outer loop + vertex -1.19208 0.0255169 -0.455637 + vertex -1.15755 0.107432 -0.555333 + vertex -1.17603 0.022118 -0.557825 + endloop + endfacet + facet normal -0.95472 0.212829 -0.20788 + outer loop + vertex -1.17603 0.022118 -0.557825 + vertex -1.15755 0.107432 -0.555333 + vertex -1.13795 0.101636 -0.65129 + endloop + endfacet + facet normal -0.954641 0.214987 -0.206012 + outer loop + vertex -1.17603 0.022118 -0.557825 + vertex -1.13795 0.101636 -0.65129 + vertex -1.156 0.018236 -0.654694 + endloop + endfacet + facet normal -0.940632 0.214291 -0.263233 + outer loop + vertex -1.156 0.018236 -0.654694 + vertex -1.13795 0.101636 -0.65129 + vertex -1.11411 0.0954701 -0.741516 + endloop + endfacet + facet normal -0.940667 0.216405 -0.26137 + outer loop + vertex -1.156 0.018236 -0.654694 + vertex -1.11411 0.0954701 -0.741516 + vertex -1.13157 0.0141429 -0.745993 + endloop + endfacet + facet normal -0.920225 0.215608 -0.326648 + outer loop + vertex -1.13157 0.0141429 -0.745993 + vertex -1.11411 0.0954701 -0.741516 + vertex -1.08564 0.0893115 -0.825763 + endloop + endfacet + facet normal -0.92037 0.217375 -0.325066 + outer loop + vertex -1.13157 0.0141429 -0.745993 + vertex -1.08564 0.0893115 -0.825763 + vertex -1.10233 0.010111 -0.831472 + endloop + endfacet + facet normal -0.891367 0.216536 -0.398218 + outer loop + vertex -1.10233 0.010111 -0.831472 + vertex -1.08564 0.0893115 -0.825763 + vertex -1.05219 0.0835366 -0.903784 + endloop + endfacet + facet normal -0.891565 0.217774 -0.397098 + outer loop + vertex -1.10233 0.010111 -0.831472 + vertex -1.05219 0.0835366 -0.903784 + vertex -1.06787 0.00641235 -0.910881 + endloop + endfacet + facet normal -0.851423 0.217012 -0.477477 + outer loop + vertex -1.06787 0.00641235 -0.910881 + vertex -1.05219 0.0835366 -0.903784 + vertex -1.01326 0.0786994 -0.9754 + endloop + endfacet + facet normal -0.851657 0.217937 -0.476639 + outer loop + vertex -1.06787 0.00641235 -0.910881 + vertex -1.01326 0.0786994 -0.9754 + vertex -1.02773 0.00336352 -0.983989 + endloop + endfacet + facet normal -0.798032 0.217372 -0.562045 + outer loop + vertex -1.02773 0.00336352 -0.983989 + vertex -1.01326 0.0786994 -0.9754 + vertex -0.968369 0.075354 -1.04044 + endloop + endfacet + facet normal -0.798289 0.218088 -0.561403 + outer loop + vertex -1.02773 0.00336352 -0.983989 + vertex -0.968369 0.075354 -1.04044 + vertex -0.981485 0.00128101 -1.05056 + endloop + endfacet + facet normal -0.729915 0.217805 -0.647908 + outer loop + vertex -0.981485 0.00128101 -1.05056 + vertex -0.968369 0.075354 -1.04044 + vertex -0.917027 0.0740541 -1.09871 + endloop + endfacet + facet normal -0.730102 0.218198 -0.647565 + outer loop + vertex -0.981485 0.00128101 -1.05056 + vertex -0.917027 0.0740541 -1.09871 + vertex -0.92868 0.00048133 -1.11037 + endloop + endfacet + facet normal -0.940708 0.297714 -0.162587 + outer loop + vertex -1.17328 0.112483 -0.453892 + vertex -1.14699 0.196653 -0.451898 + vertex -1.13171 0.190008 -0.552484 + endloop + endfacet + facet normal -0.940346 0.299841 -0.160762 + outer loop + vertex -1.17328 0.112483 -0.453892 + vertex -1.13171 0.190008 -0.552484 + vertex -1.15755 0.107432 -0.555333 + endloop + endfacet + facet normal -0.930912 0.298599 -0.210336 + outer loop + vertex -1.15755 0.107432 -0.555333 + vertex -1.13171 0.190008 -0.552484 + vertex -1.11273 0.182329 -0.647371 + endloop + endfacet + facet normal -0.930618 0.300949 -0.20828 + outer loop + vertex -1.15755 0.107432 -0.555333 + vertex -1.11273 0.182329 -0.647371 + vertex -1.13795 0.101636 -0.65129 + endloop + endfacet + facet normal -0.916709 0.29934 -0.264651 + outer loop + vertex -1.13795 0.101636 -0.65129 + vertex -1.11273 0.182329 -0.647371 + vertex -1.08976 0.174059 -0.736286 + endloop + endfacet + facet normal -0.916564 0.301387 -0.262824 + outer loop + vertex -1.13795 0.101636 -0.65129 + vertex -1.08976 0.174059 -0.736286 + vertex -1.11411 0.0954701 -0.741516 + endloop + endfacet + facet normal -0.896637 0.29943 -0.326164 + outer loop + vertex -1.11411 0.0954701 -0.741516 + vertex -1.08976 0.174059 -0.736286 + vertex -1.0625 0.165641 -0.818954 + endloop + endfacet + facet normal -0.896631 0.300814 -0.324905 + outer loop + vertex -1.11411 0.0954701 -0.741516 + vertex -1.0625 0.165641 -0.818954 + vertex -1.08564 0.0893115 -0.825763 + endloop + endfacet + facet normal -0.8687 0.298618 -0.395205 + outer loop + vertex -1.08564 0.0893115 -0.825763 + vertex -1.0625 0.165641 -0.818954 + vertex -1.03065 0.157517 -0.895101 + endloop + endfacet + facet normal -0.868747 0.299231 -0.39464 + outer loop + vertex -1.08564 0.0893115 -0.825763 + vertex -1.03065 0.157517 -0.895101 + vertex -1.05219 0.0835366 -0.903784 + endloop + endfacet + facet normal -0.830223 0.297057 -0.471685 + outer loop + vertex -1.05219 0.0835366 -0.903784 + vertex -1.03065 0.157517 -0.895101 + vertex -0.993634 0.150575 -0.964632 + endloop + endfacet + facet normal -0.830274 0.297354 -0.471408 + outer loop + vertex -1.05219 0.0835366 -0.903784 + vertex -0.993634 0.150575 -0.964632 + vertex -1.01326 0.0786994 -0.9754 + endloop + endfacet + facet normal -0.778845 0.295565 -0.55321 + outer loop + vertex -1.01326 0.0786994 -0.9754 + vertex -0.993634 0.150575 -0.964632 + vertex -0.950865 0.1457 -1.02745 + endloop + endfacet + facet normal -0.778939 0.295889 -0.552905 + outer loop + vertex -1.01326 0.0786994 -0.9754 + vertex -0.950865 0.1457 -1.02745 + vertex -0.968369 0.075354 -1.04044 + endloop + endfacet + facet normal -0.713493 0.29487 -0.635594 + outer loop + vertex -0.968369 0.075354 -1.04044 + vertex -0.950865 0.1457 -1.02745 + vertex -0.901768 0.14378 -1.08345 + endloop + endfacet + facet normal -0.71363 0.295196 -0.635288 + outer loop + vertex -0.968369 0.075354 -1.04044 + vertex -0.901768 0.14378 -1.08345 + vertex -0.917027 0.0740541 -1.09871 + endloop + endfacet + facet normal -0.907829 0.385385 -0.165303 + outer loop + vertex -1.14699 0.196653 -0.451898 + vertex -1.1132 0.277095 -0.449905 + vertex -1.09851 0.268931 -0.549636 + endloop + endfacet + facet normal -0.907256 0.387523 -0.163438 + outer loop + vertex -1.14699 0.196653 -0.451898 + vertex -1.09851 0.268931 -0.549636 + vertex -1.13171 0.190008 -0.552484 + endloop + endfacet + facet normal -0.89789 0.385365 -0.212809 + outer loop + vertex -1.13171 0.190008 -0.552484 + vertex -1.09851 0.268931 -0.549636 + vertex -1.08037 0.259412 -0.643408 + endloop + endfacet + facet normal -0.897399 0.387587 -0.210836 + outer loop + vertex -1.13171 0.190008 -0.552484 + vertex -1.08037 0.259412 -0.643408 + vertex -1.11273 0.182329 -0.647371 + endloop + endfacet + facet normal -0.88393 0.384757 -0.265762 + outer loop + vertex -1.11273 0.182329 -0.647371 + vertex -1.08037 0.259412 -0.643408 + vertex -1.05861 0.248996 -0.730878 + endloop + endfacet + facet normal -0.883648 0.386467 -0.264214 + outer loop + vertex -1.11273 0.182329 -0.647371 + vertex -1.05861 0.248996 -0.730878 + vertex -1.08976 0.174059 -0.736286 + endloop + endfacet + facet normal -0.8647 0.382975 -0.324998 + outer loop + vertex -1.08976 0.174059 -0.736286 + vertex -1.05861 0.248996 -0.730878 + vertex -1.03304 0.238141 -0.8117 + endloop + endfacet + facet normal -0.864616 0.38384 -0.3242 + outer loop + vertex -1.08976 0.174059 -0.736286 + vertex -1.03304 0.238141 -0.8117 + vertex -1.0625 0.165641 -0.818954 + endloop + endfacet + facet normal -0.838231 0.379827 -0.391281 + outer loop + vertex -1.0625 0.165641 -0.818954 + vertex -1.03304 0.238141 -0.8117 + vertex -1.00348 0.227306 -0.885532 + endloop + endfacet + facet normal -0.838228 0.379978 -0.391139 + outer loop + vertex -1.0625 0.165641 -0.818954 + vertex -1.00348 0.227306 -0.885532 + vertex -1.03065 0.157517 -0.895101 + endloop + endfacet + facet normal -0.801874 0.375877 -0.464451 + outer loop + vertex -1.03065 0.157517 -0.895101 + vertex -1.00348 0.227306 -0.885532 + vertex -0.969201 0.217836 -0.952382 + endloop + endfacet + facet normal -0.801873 0.375867 -0.46446 + outer loop + vertex -1.03065 0.157517 -0.895101 + vertex -0.969201 0.217836 -0.952382 + vertex -0.993634 0.150575 -0.964632 + endloop + endfacet + facet normal -0.7533 0.372365 -0.54211 + outer loop + vertex -0.993634 0.150575 -0.964632 + vertex -0.969201 0.217836 -0.952382 + vertex -0.929451 0.211078 -1.01226 + endloop + endfacet + facet normal -0.753359 0.372642 -0.541838 + outer loop + vertex -0.993634 0.150575 -0.964632 + vertex -0.929451 0.211078 -1.01226 + vertex -0.950865 0.1457 -1.02745 + endloop + endfacet + facet normal -0.691767 0.370576 -0.619783 + outer loop + vertex -0.950865 0.1457 -1.02745 + vertex -0.929451 0.211078 -1.01226 + vertex -0.883489 0.208377 -1.06518 + endloop + endfacet + facet normal -0.691939 0.371045 -0.619311 + outer loop + vertex -0.950865 0.1457 -1.02745 + vertex -0.883489 0.208377 -1.06518 + vertex -0.901768 0.14378 -1.08345 + endloop + endfacet + facet normal -0.864129 0.474448 -0.167869 + outer loop + vertex -1.1132 0.277095 -0.449905 + vertex -1.07194 0.352876 -0.44816 + vertex -1.05797 0.34329 -0.547144 + endloop + endfacet + facet normal -0.863427 0.476309 -0.166203 + outer loop + vertex -1.1132 0.277095 -0.449905 + vertex -1.05797 0.34329 -0.547144 + vertex -1.09851 0.268931 -0.549636 + endloop + endfacet + facet normal -0.854393 0.473021 -0.21509 + outer loop + vertex -1.09851 0.268931 -0.549636 + vertex -1.05797 0.34329 -0.547144 + vertex -1.04086 0.332002 -0.639916 + endloop + endfacet + facet normal -0.853771 0.474922 -0.213366 + outer loop + vertex -1.09851 0.268931 -0.549636 + vertex -1.04086 0.332002 -0.639916 + vertex -1.08037 0.259412 -0.643408 + endloop + endfacet + facet normal -0.841086 0.470584 -0.266691 + outer loop + vertex -1.08037 0.259412 -0.643408 + vertex -1.04086 0.332002 -0.639916 + vertex -1.02058 0.31944 -0.726046 + endloop + endfacet + facet normal -0.840708 0.471991 -0.265395 + outer loop + vertex -1.08037 0.259412 -0.643408 + vertex -1.02058 0.31944 -0.726046 + vertex -1.05861 0.248996 -0.730878 + endloop + endfacet + facet normal -0.823141 0.466511 -0.323737 + outer loop + vertex -1.05861 0.248996 -0.730878 + vertex -1.02058 0.31944 -0.726046 + vertex -0.997089 0.306033 -0.805104 + endloop + endfacet + facet normal -0.823009 0.467175 -0.323117 + outer loop + vertex -1.05861 0.248996 -0.730878 + vertex -0.997089 0.306033 -0.805104 + vertex -1.03304 0.238141 -0.8117 + endloop + endfacet + facet normal -0.798627 0.460515 -0.387454 + outer loop + vertex -1.03304 0.238141 -0.8117 + vertex -0.997089 0.306033 -0.805104 + vertex -0.970345 0.292209 -0.876659 + endloop + endfacet + facet normal -0.798606 0.460692 -0.387287 + outer loop + vertex -1.03304 0.238141 -0.8117 + vertex -0.970345 0.292209 -0.876659 + vertex -1.00348 0.227306 -0.885532 + endloop + endfacet + facet normal -0.765903 0.453375 -0.455899 + outer loop + vertex -1.00348 0.227306 -0.885532 + vertex -0.970345 0.292209 -0.876659 + vertex -0.93974 0.279632 -0.940583 + endloop + endfacet + facet normal -0.765918 0.452391 -0.456851 + outer loop + vertex -1.00348 0.227306 -0.885532 + vertex -0.93974 0.279632 -0.940583 + vertex -0.969201 0.217836 -0.952382 + endloop + endfacet + facet normal -0.722881 0.445493 -0.528185 + outer loop + vertex -0.969201 0.217836 -0.952382 + vertex -0.93974 0.279632 -0.940583 + vertex -0.90466 0.269966 -0.996746 + endloop + endfacet + facet normal -0.722684 0.44383 -0.529852 + outer loop + vertex -0.969201 0.217836 -0.952382 + vertex -0.90466 0.269966 -0.996746 + vertex -0.929451 0.211078 -1.01226 + endloop + endfacet + facet normal -0.667204 0.439351 -0.601506 + outer loop + vertex -0.929451 0.211078 -1.01226 + vertex -0.90466 0.269966 -0.996746 + vertex -0.863601 0.265861 -1.04529 + endloop + endfacet + facet normal -0.667105 0.439021 -0.601856 + outer loop + vertex -0.929451 0.211078 -1.01226 + vertex -0.863601 0.265861 -1.04529 + vertex -0.883489 0.208377 -1.06518 + endloop + endfacet + facet normal -0.808013 0.564141 -0.169881 + outer loop + vertex -1.07194 0.352876 -0.44816 + vertex -1.02319 0.423066 -0.446914 + vertex -1.0101 0.412171 -0.545364 + endloop + endfacet + facet normal -0.807358 0.565441 -0.168671 + outer loop + vertex -1.07194 0.352876 -0.44816 + vertex -1.0101 0.412171 -0.545364 + vertex -1.05797 0.34329 -0.547144 + endloop + endfacet + facet normal -0.798991 0.560872 -0.216877 + outer loop + vertex -1.05797 0.34329 -0.547144 + vertex -1.0101 0.412171 -0.545364 + vertex -0.994213 0.399212 -0.637409 + endloop + endfacet + facet normal -0.798387 0.562217 -0.215617 + outer loop + vertex -1.05797 0.34329 -0.547144 + vertex -0.994213 0.399212 -0.637409 + vertex -1.04086 0.332002 -0.639916 + endloop + endfacet + facet normal -0.786871 0.556157 -0.26744 + outer loop + vertex -1.04086 0.332002 -0.639916 + vertex -0.994213 0.399212 -0.637409 + vertex -0.975642 0.384548 -0.722544 + endloop + endfacet + facet normal -0.786468 0.557195 -0.266462 + outer loop + vertex -1.04086 0.332002 -0.639916 + vertex -0.975642 0.384548 -0.722544 + vertex -1.02058 0.31944 -0.726046 + endloop + endfacet + facet normal -0.770714 0.549352 -0.322819 + outer loop + vertex -1.02058 0.31944 -0.726046 + vertex -0.975642 0.384548 -0.722544 + vertex -0.954502 0.368535 -0.800266 + endloop + endfacet + facet normal -0.770523 0.549954 -0.32225 + outer loop + vertex -1.02058 0.31944 -0.726046 + vertex -0.954502 0.368535 -0.800266 + vertex -0.997089 0.306033 -0.805104 + endloop + endfacet + facet normal -0.748704 0.539915 -0.384621 + outer loop + vertex -0.997089 0.306033 -0.805104 + vertex -0.954502 0.368535 -0.800266 + vertex -0.930906 0.35153 -0.870068 + endloop + endfacet + facet normal -0.748594 0.540379 -0.384184 + outer loop + vertex -0.997089 0.306033 -0.805104 + vertex -0.930906 0.35153 -0.870068 + vertex -0.970345 0.292209 -0.876659 + endloop + endfacet + facet normal -0.720954 0.529048 -0.447587 + outer loop + vertex -0.970345 0.292209 -0.876659 + vertex -0.930906 0.35153 -0.870068 + vertex -0.905023 0.335108 -0.931169 + endloop + endfacet + facet normal -0.72117 0.527498 -0.449066 + outer loop + vertex -0.970345 0.292209 -0.876659 + vertex -0.905023 0.335108 -0.931169 + vertex -0.93974 0.279632 -0.940583 + endloop + endfacet + facet normal -0.685089 0.515975 -0.51422 + outer loop + vertex -0.93974 0.279632 -0.940583 + vertex -0.905023 0.335108 -0.931169 + vertex -0.877026 0.320843 -0.982784 + endloop + endfacet + facet normal -0.685106 0.513821 -0.51635 + outer loop + vertex -0.93974 0.279632 -0.940583 + vertex -0.877026 0.320843 -0.982784 + vertex -0.90466 0.269966 -0.996746 + endloop + endfacet + facet normal -0.637007 0.505666 -0.581829 + outer loop + vertex -0.90466 0.269966 -0.996746 + vertex -0.877026 0.320843 -0.982784 + vertex -0.843516 0.31425 -1.0252 + endloop + endfacet + facet normal -0.637047 0.505853 -0.581622 + outer loop + vertex -0.90466 0.269966 -0.996746 + vertex -0.843516 0.31425 -1.0252 + vertex -0.863601 0.265861 -1.04529 + endloop + endfacet + facet normal -0.737952 0.65286 -0.170881 + outer loop + vertex -1.02319 0.423066 -0.446914 + vertex -0.966985 0.48673 -0.446415 + vertex -0.954915 0.474661 -0.544652 + endloop + endfacet + facet normal -0.737627 0.653355 -0.170393 + outer loop + vertex -1.02319 0.423066 -0.446914 + vertex -0.954915 0.474661 -0.544652 + vertex -1.0101 0.412171 -0.545364 + endloop + endfacet + facet normal -0.730333 0.647453 -0.217759 + outer loop + vertex -1.0101 0.412171 -0.545364 + vertex -0.954915 0.474661 -0.544652 + vertex -0.940414 0.460159 -0.636401 + endloop + endfacet + facet normal -0.730015 0.647986 -0.217235 + outer loop + vertex -1.0101 0.412171 -0.545364 + vertex -0.940414 0.460159 -0.636401 + vertex -0.994213 0.399212 -0.637409 + endloop + endfacet + facet normal -0.720116 0.640084 -0.267815 + outer loop + vertex -0.994213 0.399212 -0.637409 + vertex -0.940414 0.460159 -0.636401 + vertex -0.923732 0.443478 -0.721126 + endloop + endfacet + facet normal -0.719871 0.64055 -0.267362 + outer loop + vertex -0.994213 0.399212 -0.637409 + vertex -0.923732 0.443478 -0.721126 + vertex -0.975642 0.384548 -0.722544 + endloop + endfacet + facet normal -0.706464 0.630064 -0.322379 + outer loop + vertex -0.975642 0.384548 -0.722544 + vertex -0.923732 0.443478 -0.721126 + vertex -0.905121 0.424866 -0.798286 + endloop + endfacet + facet normal -0.706285 0.630455 -0.322004 + outer loop + vertex -0.975642 0.384548 -0.722544 + vertex -0.905121 0.424866 -0.798286 + vertex -0.954502 0.368535 -0.800266 + endloop + endfacet + facet normal -0.687847 0.616444 -0.383228 + outer loop + vertex -0.954502 0.368535 -0.800266 + vertex -0.905121 0.424866 -0.798286 + vertex -0.88483 0.404576 -0.867343 + endloop + endfacet + facet normal -0.687653 0.616956 -0.382751 + outer loop + vertex -0.954502 0.368535 -0.800266 + vertex -0.88483 0.404576 -0.867343 + vertex -0.930906 0.35153 -0.870068 + endloop + endfacet + facet normal -0.66544 0.600759 -0.443032 + outer loop + vertex -0.930906 0.35153 -0.870068 + vertex -0.88483 0.404576 -0.867343 + vertex -0.863937 0.383682 -0.927058 + endloop + endfacet + facet normal -0.665528 0.600463 -0.443302 + outer loop + vertex -0.930906 0.35153 -0.870068 + vertex -0.863937 0.383682 -0.927058 + vertex -0.905023 0.335108 -0.931169 + endloop + endfacet + facet normal -0.636782 0.581483 -0.506347 + outer loop + vertex -0.905023 0.335108 -0.931169 + vertex -0.863937 0.383682 -0.927058 + vertex -0.843516 0.363261 -0.976191 + endloop + endfacet + facet normal -0.636739 0.581695 -0.506156 + outer loop + vertex -0.905023 0.335108 -0.931169 + vertex -0.843516 0.363261 -0.976191 + vertex -0.877026 0.320843 -0.982784 + endloop + endfacet + facet normal -0.600567 0.562735 -0.568021 + outer loop + vertex -0.877026 0.320843 -0.982784 + vertex -0.843516 0.363261 -0.976191 + vertex -0.827436 0.347181 -1.00912 + endloop + endfacet + facet normal -0.600567 0.568022 -0.562734 + outer loop + vertex -0.877026 0.320843 -0.982784 + vertex -0.827436 0.347181 -1.00912 + vertex -0.843516 0.31425 -1.0252 + endloop + endfacet + facet normal 0.0419438 0.992289 -0.11663 + outer loop + vertex -0.327179 0.726868 -0.457381 + vertex -0.327179 0.739543 -0.349542 + vertex -0.236087 0.735731 -0.34921 + endloop + endfacet + facet normal 0.0422553 0.992246 -0.116889 + outer loop + vertex -0.327179 0.726868 -0.457381 + vertex -0.236087 0.735731 -0.34921 + vertex -0.237416 0.723104 -0.456883 + endloop + endfacet + facet normal 0.125964 0.985101 -0.117084 + outer loop + vertex -0.237416 0.723104 -0.456883 + vertex -0.236087 0.735731 -0.34921 + vertex -0.145942 0.724303 -0.348379 + endloop + endfacet + facet normal 0.126749 0.984922 -0.117744 + outer loop + vertex -0.237416 0.723104 -0.456883 + vertex -0.145942 0.724303 -0.348379 + vertex -0.148586 0.711821 -0.455637 + endloop + endfacet + facet normal 0.210894 0.970346 -0.118122 + outer loop + vertex -0.148586 0.711821 -0.455637 + vertex -0.145942 0.724303 -0.348379 + vertex -0.0576914 0.705265 -0.347216 + endloop + endfacet + facet normal 0.211994 0.969991 -0.119065 + outer loop + vertex -0.148586 0.711821 -0.455637 + vertex -0.0576914 0.705265 -0.347216 + vertex -0.0616197 0.693029 -0.453892 + endloop + endfacet + facet normal 0.297353 0.947247 -0.119599 + outer loop + vertex -0.0616197 0.693029 -0.453892 + vertex -0.0576914 0.705265 -0.347216 + vertex 0.0277188 0.678621 -0.345887 + endloop + endfacet + facet normal 0.2986 0.946715 -0.120702 + outer loop + vertex -0.0616197 0.693029 -0.453892 + vertex 0.0277188 0.678621 -0.345887 + vertex 0.0225503 0.666735 -0.451898 + endloop + endfacet + facet normal 0.385679 0.914618 -0.121349 + outer loop + vertex 0.0225503 0.666735 -0.451898 + vertex 0.0277188 0.678621 -0.345887 + vertex 0.109341 0.644379 -0.344558 + endloop + endfacet + facet normal 0.386896 0.913954 -0.122471 + outer loop + vertex 0.0225503 0.666735 -0.451898 + vertex 0.109341 0.644379 -0.344558 + vertex 0.102992 0.63295 -0.449905 + endloop + endfacet + facet normal 0.475738 0.870923 -0.123157 + outer loop + vertex 0.102992 0.63295 -0.449905 + vertex 0.109341 0.644379 -0.344558 + vertex 0.18623 0.602543 -0.343395 + endloop + endfacet + facet normal 0.476759 0.870222 -0.124156 + outer loop + vertex 0.102992 0.63295 -0.449905 + vertex 0.18623 0.602543 -0.343395 + vertex 0.178774 0.591681 -0.44816 + endloop + endfacet + facet normal 0.566714 0.814413 -0.124771 + outer loop + vertex 0.178774 0.591681 -0.44816 + vertex 0.18623 0.602543 -0.343395 + vertex 0.257436 0.553121 -0.342564 + endloop + endfacet + facet normal 0.567393 0.813829 -0.12549 + outer loop + vertex 0.178774 0.591681 -0.44816 + vertex 0.257436 0.553121 -0.342564 + vertex 0.248963 0.542938 -0.446914 + endloop + endfacet + facet normal 0.656867 0.743424 -0.125886 + outer loop + vertex 0.248963 0.542938 -0.446914 + vertex 0.257436 0.553121 -0.342564 + vertex 0.322015 0.496117 -0.342232 + endloop + endfacet + facet normal 0.657109 0.743161 -0.126173 + outer loop + vertex 0.248963 0.542938 -0.446914 + vertex 0.322015 0.496117 -0.342232 + vertex 0.312627 0.48673 -0.446415 + endloop + endfacet + facet normal 0.0417479 0.995958 -0.0795322 + outer loop + vertex -0.327179 0.739543 -0.349542 + vertex -0.327179 0.748444 -0.238072 + vertex -0.23507 0.7446 -0.237864 + endloop + endfacet + facet normal 0.0419616 0.995935 -0.0797075 + outer loop + vertex -0.327179 0.739543 -0.349542 + vertex -0.23507 0.7446 -0.237864 + vertex -0.236087 0.735731 -0.34921 + endloop + endfacet + facet normal 0.125508 0.988869 -0.0799082 + outer loop + vertex -0.236087 0.735731 -0.34921 + vertex -0.23507 0.7446 -0.237864 + vertex -0.143926 0.733073 -0.237353 + endloop + endfacet + facet normal 0.126089 0.988756 -0.0803897 + outer loop + vertex -0.236087 0.735731 -0.34921 + vertex -0.143926 0.733073 -0.237353 + vertex -0.145942 0.724303 -0.348379 + endloop + endfacet + facet normal 0.21035 0.974283 -0.080777 + outer loop + vertex -0.145942 0.724303 -0.348379 + vertex -0.143926 0.733073 -0.237353 + vertex -0.054712 0.71387 -0.23665 + endloop + endfacet + facet normal 0.211208 0.974037 -0.0815006 + outer loop + vertex -0.145942 0.724303 -0.348379 + vertex -0.054712 0.71387 -0.23665 + vertex -0.0576914 0.705265 -0.347216 + endloop + endfacet + facet normal 0.29693 0.951368 -0.0820462 + outer loop + vertex -0.0576914 0.705265 -0.347216 + vertex -0.054712 0.71387 -0.23665 + vertex 0.031606 0.686997 -0.235868 + endloop + endfacet + facet normal 0.297945 0.950974 -0.0829244 + outer loop + vertex -0.0576914 0.705265 -0.347216 + vertex 0.031606 0.686997 -0.235868 + vertex 0.0277188 0.678621 -0.345887 + endloop + endfacet + facet normal 0.385623 0.918863 -0.0835777 + outer loop + vertex 0.0277188 0.678621 -0.345887 + vertex 0.031606 0.686997 -0.235868 + vertex 0.114063 0.65246 -0.235117 + endloop + endfacet + facet normal 0.386644 0.91835 -0.0844948 + outer loop + vertex 0.0277188 0.678621 -0.345887 + vertex 0.114063 0.65246 -0.235117 + vertex 0.109341 0.644379 -0.344558 + endloop + endfacet + facet normal 0.476317 0.875138 -0.0851731 + outer loop + vertex 0.109341 0.644379 -0.344558 + vertex 0.114063 0.65246 -0.235117 + vertex 0.191711 0.610261 -0.234478 + endloop + endfacet + facet normal 0.477173 0.874593 -0.0859819 + outer loop + vertex 0.109341 0.644379 -0.344558 + vertex 0.191711 0.610261 -0.234478 + vertex 0.18623 0.602543 -0.343395 + endloop + endfacet + facet normal 0.568146 0.818361 -0.0865757 + outer loop + vertex 0.18623 0.602543 -0.343395 + vertex 0.191711 0.610261 -0.234478 + vertex 0.263598 0.5604 -0.234031 + endloop + endfacet + facet normal 0.568704 0.817913 -0.0871435 + outer loop + vertex 0.18623 0.602543 -0.343395 + vertex 0.263598 0.5604 -0.234031 + vertex 0.257436 0.553121 -0.342564 + endloop + endfacet + facet normal 0.659278 0.746789 -0.0875158 + outer loop + vertex 0.257436 0.553121 -0.342564 + vertex 0.263598 0.5604 -0.234031 + vertex 0.328777 0.50288 -0.233855 + endloop + endfacet + facet normal 0.65947 0.746594 -0.0877314 + outer loop + vertex 0.257436 0.553121 -0.342564 + vertex 0.328777 0.50288 -0.233855 + vertex 0.322015 0.496117 -0.342232 + endloop + endfacet + facet normal 0.0415603 0.998183 -0.043636 + outer loop + vertex -0.327179 0.748444 -0.238072 + vertex -0.327179 0.75342 -0.124242 + vertex -0.234296 0.749558 -0.124123 + endloop + endfacet + facet normal 0.0417595 0.998167 -0.0437983 + outer loop + vertex -0.327179 0.748444 -0.238072 + vertex -0.234296 0.749558 -0.124123 + vertex -0.23507 0.7446 -0.237864 + endloop + endfacet + facet normal 0.124974 0.991181 -0.0440599 + outer loop + vertex -0.23507 0.7446 -0.237864 + vertex -0.234296 0.749558 -0.124123 + vertex -0.142407 0.737984 -0.123858 + endloop + endfacet + facet normal 0.12559 0.991081 -0.0445664 + outer loop + vertex -0.23507 0.7446 -0.237864 + vertex -0.142407 0.737984 -0.123858 + vertex -0.143926 0.733073 -0.237353 + endloop + endfacet + facet normal 0.209571 0.976754 -0.0450699 + outer loop + vertex -0.143926 0.733073 -0.237353 + vertex -0.142407 0.737984 -0.123858 + vertex -0.0525081 0.71871 -0.123539 + endloop + endfacet + facet normal 0.210553 0.976505 -0.0458901 + outer loop + vertex -0.143926 0.733073 -0.237353 + vertex -0.0525081 0.71871 -0.123539 + vertex -0.054712 0.71387 -0.23665 + endloop + endfacet + facet normal 0.296093 0.954022 -0.0465947 + outer loop + vertex -0.054712 0.71387 -0.23665 + vertex -0.0525081 0.71871 -0.123539 + vertex 0.0344075 0.691749 -0.123256 + endloop + endfacet + facet normal 0.29731 0.953592 -0.0476355 + outer loop + vertex -0.054712 0.71387 -0.23665 + vertex 0.0344075 0.691749 -0.123256 + vertex 0.031606 0.686997 -0.235868 + endloop + endfacet + facet normal 0.384998 0.921644 -0.0484687 + outer loop + vertex 0.031606 0.686997 -0.235868 + vertex 0.0344075 0.691749 -0.123256 + vertex 0.117345 0.657112 -0.123102 + endloop + endfacet + facet normal 0.386237 0.921067 -0.0495637 + outer loop + vertex 0.031606 0.686997 -0.235868 + vertex 0.117345 0.657112 -0.123102 + vertex 0.114063 0.65246 -0.235117 + endloop + endfacet + facet normal 0.47619 0.877897 -0.050406 + outer loop + vertex 0.114063 0.65246 -0.235117 + vertex 0.117345 0.657112 -0.123102 + vertex 0.195372 0.614792 -0.123039 + endloop + endfacet + facet normal 0.477208 0.877289 -0.0513487 + outer loop + vertex 0.114063 0.65246 -0.235117 + vertex 0.195372 0.614792 -0.123039 + vertex 0.191711 0.610261 -0.234478 + endloop + endfacet + facet normal 0.568715 0.820885 -0.0520621 + outer loop + vertex 0.191711 0.610261 -0.234478 + vertex 0.195372 0.614792 -0.123039 + vertex 0.267558 0.564781 -0.12303 + endloop + endfacet + facet normal 0.569352 0.820404 -0.0526916 + outer loop + vertex 0.191711 0.610261 -0.234478 + vertex 0.267558 0.564781 -0.12303 + vertex 0.263598 0.5604 -0.234031 + endloop + endfacet + facet normal 0.660624 0.748835 -0.0531228 + outer loop + vertex 0.263598 0.5604 -0.234031 + vertex 0.267558 0.564781 -0.12303 + vertex 0.332971 0.507073 -0.123039 + endloop + endfacet + facet normal 0.660823 0.748644 -0.0533389 + outer loop + vertex 0.263598 0.5604 -0.234031 + vertex 0.332971 0.507073 -0.123039 + vertex 0.328777 0.50288 -0.233855 + endloop + endfacet + facet normal 0.0412984 0.999116 -0.00781407 + outer loop + vertex -0.327179 0.75342 -0.124242 + vertex -0.327179 0.754319 -0.0093227 + vertex -0.233697 0.750456 -0.00926336 + endloop + endfacet + facet normal 0.0415531 0.999104 -0.00802148 + outer loop + vertex -0.327179 0.75342 -0.124242 + vertex -0.233697 0.750456 -0.00926336 + vertex -0.234296 0.749558 -0.124123 + endloop + endfacet + facet normal 0.124141 0.992229 -0.00839792 + outer loop + vertex -0.234296 0.749558 -0.124123 + vertex -0.233697 0.750456 -0.00926336 + vertex -0.141259 0.738891 -0.00919506 + endloop + endfacet + facet normal 0.124991 0.992116 -0.00909641 + outer loop + vertex -0.234296 0.749558 -0.124123 + vertex -0.141259 0.738891 -0.00919506 + vertex -0.142407 0.737984 -0.123858 + endloop + endfacet + facet normal 0.208256 0.978025 -0.00981885 + outer loop + vertex -0.142407 0.737984 -0.123858 + vertex -0.141259 0.738891 -0.00919506 + vertex -0.0509061 0.719651 -0.00922752 + endloop + endfacet + facet normal 0.209656 0.977714 -0.0109858 + outer loop + vertex -0.142407 0.737984 -0.123858 + vertex -0.0509061 0.719651 -0.00922752 + vertex -0.0525081 0.71871 -0.123539 + endloop + endfacet + facet normal 0.294536 0.955565 -0.011993 + outer loop + vertex -0.0525081 0.71871 -0.123539 + vertex -0.0509061 0.719651 -0.00922752 + vertex 0.0363185 0.692763 -0.00947047 + endloop + endfacet + facet normal 0.29629 0.955003 -0.0134868 + outer loop + vertex -0.0525081 0.71871 -0.123539 + vertex 0.0363185 0.692763 -0.00947047 + vertex 0.0344075 0.691749 -0.123256 + endloop + endfacet + facet normal 0.383595 0.923385 -0.0146713 + outer loop + vertex 0.0344075 0.691749 -0.123256 + vertex 0.0363185 0.692763 -0.00947047 + vertex 0.119372 0.658252 -0.0100336 + endloop + endfacet + facet normal 0.385349 0.922629 -0.0162112 + outer loop + vertex 0.0344075 0.691749 -0.123256 + vertex 0.119372 0.658252 -0.0100336 + vertex 0.117345 0.657112 -0.123102 + endloop + endfacet + facet normal 0.475295 0.879655 -0.0173909 + outer loop + vertex 0.117345 0.657112 -0.123102 + vertex 0.119372 0.658252 -0.0100336 + vertex 0.19737 0.616095 -0.0107065 + endloop + endfacet + facet normal 0.476693 0.878872 -0.0186723 + outer loop + vertex 0.117345 0.657112 -0.123102 + vertex 0.19737 0.616095 -0.0107065 + vertex 0.195372 0.614792 -0.123039 + endloop + endfacet + facet normal 0.568533 0.822426 -0.0196503 + outer loop + vertex 0.195372 0.614792 -0.123039 + vertex 0.19737 0.616095 -0.0107065 + vertex 0.269425 0.56627 -0.0112786 + endloop + endfacet + facet normal 0.569366 0.82183 -0.0204614 + outer loop + vertex 0.195372 0.614792 -0.123039 + vertex 0.269425 0.56627 -0.0112786 + vertex 0.267558 0.564781 -0.12303 + endloop + endfacet + facet normal 0.661175 0.749936 -0.0210371 + outer loop + vertex 0.267558 0.564781 -0.12303 + vertex 0.269425 0.56627 -0.0112786 + vertex 0.334653 0.508755 -0.0115394 + endloop + endfacet + facet normal 0.661411 0.749722 -0.0212866 + outer loop + vertex 0.267558 0.564781 -0.12303 + vertex 0.334653 0.508755 -0.0115394 + vertex 0.332971 0.507073 -0.123039 + endloop + endfacet + facet normal 0.0408905 0.998743 0.0289919 + outer loop + vertex -0.327179 0.754319 -0.0093227 + vertex -0.327179 0.750989 0.105413 + vertex -0.233207 0.747141 0.105437 + endloop + endfacet + facet normal 0.0412595 0.998736 0.0286893 + outer loop + vertex -0.327179 0.754319 -0.0093227 + vertex -0.233207 0.747141 0.105437 + vertex -0.233697 0.750456 -0.00926336 + endloop + endfacet + facet normal 0.122825 0.992029 0.0281465 + outer loop + vertex -0.233697 0.750456 -0.00926336 + vertex -0.233207 0.747141 0.105437 + vertex -0.140352 0.735647 0.105336 + endloop + endfacet + facet normal 0.124074 0.991903 0.027113 + outer loop + vertex -0.233697 0.750456 -0.00926336 + vertex -0.140352 0.735647 0.105336 + vertex -0.141259 0.738891 -0.00919506 + endloop + endfacet + facet normal 0.206162 0.97817 0.0260742 + outer loop + vertex -0.141259 0.738891 -0.00919506 + vertex -0.140352 0.735647 0.105336 + vertex -0.0497327 0.716558 0.104939 + endloop + endfacet + facet normal 0.208216 0.97778 0.0243505 + outer loop + vertex -0.141259 0.738891 -0.00919506 + vertex -0.0497327 0.716558 0.104939 + vertex -0.0509061 0.719651 -0.00922752 + endloop + endfacet + facet normal 0.292032 0.956134 0.0229026 + outer loop + vertex -0.0509061 0.719651 -0.00922752 + vertex -0.0497327 0.716558 0.104939 + vertex 0.0375347 0.689925 0.104073 + endloop + endfacet + facet normal 0.294577 0.955403 0.020724 + outer loop + vertex -0.0509061 0.719651 -0.00922752 + vertex 0.0375347 0.689925 0.104073 + vertex 0.0363185 0.692763 -0.00947047 + endloop + endfacet + facet normal 0.381304 0.924254 0.0190165 + outer loop + vertex 0.0363185 0.692763 -0.00947047 + vertex 0.0375347 0.689925 0.104073 + vertex 0.120333 0.655797 0.102567 + endloop + endfacet + facet normal 0.383764 0.923278 0.0168496 + outer loop + vertex 0.0363185 0.692763 -0.00947047 + vertex 0.120333 0.655797 0.102567 + vertex 0.119372 0.658252 -0.0100336 + endloop + endfacet + facet normal 0.47363 0.880593 0.0151529 + outer loop + vertex 0.119372 0.658252 -0.0100336 + vertex 0.120333 0.655797 0.102567 + vertex 0.197858 0.614129 0.100889 + endloop + endfacet + facet normal 0.475529 0.879598 0.0134131 + outer loop + vertex 0.119372 0.658252 -0.0100336 + vertex 0.197858 0.614129 0.100889 + vertex 0.19737 0.616095 -0.0107065 + endloop + endfacet + facet normal 0.567696 0.823151 0.0120153 + outer loop + vertex 0.19737 0.616095 -0.0107065 + vertex 0.197858 0.614129 0.100889 + vertex 0.269308 0.564873 0.0995073 + endloop + endfacet + facet normal 0.568773 0.822422 0.0109736 + outer loop + vertex 0.19737 0.616095 -0.0107065 + vertex 0.269308 0.564873 0.0995073 + vertex 0.269425 0.56627 -0.0112786 + endloop + endfacet + facet normal 0.66109 0.750238 0.0101605 + outer loop + vertex 0.269425 0.56627 -0.0112786 + vertex 0.269308 0.564873 0.0995073 + vertex 0.33388 0.507982 0.0988907 + endloop + endfacet + facet normal 0.661359 0.750004 0.00987957 + outer loop + vertex 0.269425 0.56627 -0.0112786 + vertex 0.33388 0.507982 0.0988907 + vertex 0.334653 0.508755 -0.0115394 + endloop + endfacet + facet normal 0.0398126 0.99263 0.114456 + outer loop + vertex -0.327179 0.750989 0.105413 + vertex -0.327179 0.738524 0.213516 + vertex -0.232594 0.734729 0.213522 + endloop + endfacet + facet normal 0.0406207 0.992678 0.113756 + outer loop + vertex -0.327179 0.750989 0.105413 + vertex -0.232594 0.734729 0.213522 + vertex -0.233207 0.747141 0.105437 + endloop + endfacet + facet normal 0.119605 0.986417 0.11259 + outer loop + vertex -0.233207 0.747141 0.105437 + vertex -0.232594 0.734729 0.213522 + vertex -0.1392 0.723433 0.213278 + endloop + endfacet + facet normal 0.122212 0.986356 0.110304 + outer loop + vertex -0.233207 0.747141 0.105437 + vertex -0.1392 0.723433 0.213278 + vertex -0.140352 0.735647 0.105336 + endloop + endfacet + facet normal 0.201067 0.973604 0.108019 + outer loop + vertex -0.140352 0.735647 0.105336 + vertex -0.1392 0.723433 0.213278 + vertex -0.0481896 0.704721 0.212524 + endloop + endfacet + facet normal 0.20544 0.973116 0.104119 + outer loop + vertex -0.140352 0.735647 0.105336 + vertex -0.0481896 0.704721 0.212524 + vertex -0.0497327 0.716558 0.104939 + endloop + endfacet + facet normal 0.285595 0.953039 0.10076 + outer loop + vertex -0.0497327 0.716558 0.104939 + vertex -0.0481896 0.704721 0.212524 + vertex 0.0392471 0.678681 0.210997 + endloop + endfacet + facet normal 0.291434 0.951819 0.0954256 + outer loop + vertex -0.0497327 0.716558 0.104939 + vertex 0.0392471 0.678681 0.210997 + vertex 0.0375347 0.689925 0.104073 + endloop + endfacet + facet normal 0.374337 0.922812 0.0910476 + outer loop + vertex 0.0375347 0.689925 0.104073 + vertex 0.0392471 0.678681 0.210997 + vertex 0.121918 0.645398 0.208436 + endloop + endfacet + facet normal 0.381024 0.920675 0.0847285 + outer loop + vertex 0.0375347 0.689925 0.104073 + vertex 0.121918 0.645398 0.208436 + vertex 0.120333 0.655797 0.102567 + endloop + endfacet + facet normal 0.466289 0.881048 0.0795589 + outer loop + vertex 0.120333 0.655797 0.102567 + vertex 0.121918 0.645398 0.208436 + vertex 0.198576 0.605139 0.204991 + endloop + endfacet + facet normal 0.473401 0.877855 0.0725468 + outer loop + vertex 0.120333 0.655797 0.102567 + vertex 0.198576 0.605139 0.204991 + vertex 0.197858 0.614129 0.100889 + endloop + endfacet + facet normal 0.562033 0.824371 0.0673163 + outer loop + vertex 0.197858 0.614129 0.100889 + vertex 0.198576 0.605139 0.204991 + vertex 0.267973 0.558167 0.20081 + endloop + endfacet + facet normal 0.567303 0.821184 0.0618332 + outer loop + vertex 0.197858 0.614129 0.100889 + vertex 0.267973 0.558167 0.20081 + vertex 0.269308 0.564873 0.0995073 + endloop + endfacet + facet normal 0.658725 0.750119 0.0583344 + outer loop + vertex 0.269308 0.564873 0.0995073 + vertex 0.267973 0.558167 0.20081 + vertex 0.329879 0.503981 0.198536 + endloop + endfacet + facet normal 0.660315 0.748854 0.0565848 + outer loop + vertex 0.269308 0.564873 0.0995073 + vertex 0.329879 0.503981 0.198536 + vertex 0.33388 0.507982 0.0988907 + endloop + endfacet + facet normal 0.0370854 0.962569 0.268489 + outer loop + vertex -0.327179 0.738524 0.213516 + vertex -0.327179 0.712019 0.308537 + vertex -0.231629 0.708338 0.308537 + endloop + endfacet + facet normal 0.0386106 0.962905 0.267062 + outer loop + vertex -0.327179 0.738524 0.213516 + vertex -0.231629 0.708338 0.308537 + vertex -0.232594 0.734729 0.213522 + endloop + endfacet + facet normal 0.11179 0.957776 0.264894 + outer loop + vertex -0.232594 0.734729 0.213522 + vertex -0.231629 0.708338 0.308537 + vertex -0.137316 0.69743 0.308176 + endloop + endfacet + facet normal 0.116608 0.958457 0.260313 + outer loop + vertex -0.232594 0.734729 0.213522 + vertex -0.137316 0.69743 0.308176 + vertex -0.1392 0.723433 0.213278 + endloop + endfacet + facet normal 0.188829 0.948048 0.256026 + outer loop + vertex -0.1392 0.723433 0.213278 + vertex -0.137316 0.69743 0.308176 + vertex -0.0454785 0.679431 0.307092 + endloop + endfacet + facet normal 0.197067 0.948502 0.248009 + outer loop + vertex -0.1392 0.723433 0.213278 + vertex -0.0454785 0.679431 0.307092 + vertex -0.0481896 0.704721 0.212524 + endloop + endfacet + facet normal 0.269888 0.932105 0.241537 + outer loop + vertex -0.0481896 0.704721 0.212524 + vertex -0.0454785 0.679431 0.307092 + vertex 0.0426467 0.654476 0.304924 + endloop + endfacet + facet normal 0.281472 0.931625 0.229887 + outer loop + vertex -0.0481896 0.704721 0.212524 + vertex 0.0426467 0.654476 0.304924 + vertex 0.0392471 0.678681 0.210997 + endloop + endfacet + facet normal 0.356399 0.907812 0.221038 + outer loop + vertex 0.0392471 0.678681 0.210997 + vertex 0.0426467 0.654476 0.304924 + vertex 0.125822 0.622702 0.30131 + endloop + endfacet + facet normal 0.370952 0.905583 0.205707 + outer loop + vertex 0.0392471 0.678681 0.210997 + vertex 0.125822 0.622702 0.30131 + vertex 0.121918 0.645398 0.208436 + endloop + endfacet + facet normal 0.448417 0.872439 0.194351 + outer loop + vertex 0.121918 0.645398 0.208436 + vertex 0.125822 0.622702 0.30131 + vertex 0.201263 0.585368 0.294843 + endloop + endfacet + facet normal 0.463838 0.868032 0.177129 + outer loop + vertex 0.121918 0.645398 0.208436 + vertex 0.201263 0.585368 0.294843 + vertex 0.198576 0.605139 0.204991 + endloop + endfacet + facet normal 0.551585 0.817941 0.163483 + outer loop + vertex 0.198576 0.605139 0.204991 + vertex 0.201263 0.585368 0.294843 + vertex 0.266184 0.543733 0.284113 + endloop + endfacet + facet normal 0.560227 0.814069 0.153093 + outer loop + vertex 0.198576 0.605139 0.204991 + vertex 0.266184 0.543733 0.284113 + vertex 0.267973 0.558167 0.20081 + endloop + endfacet + facet normal 0.653715 0.743143 0.142811 + outer loop + vertex 0.267973 0.558167 0.20081 + vertex 0.266184 0.543733 0.284113 + vertex 0.321876 0.495978 0.277683 + endloop + endfacet + facet normal 0.654961 0.742337 0.141286 + outer loop + vertex 0.267973 0.558167 0.20081 + vertex 0.321876 0.495978 0.277683 + vertex 0.329879 0.503981 0.198536 + endloop + endfacet + facet normal 0.0307596 0.856313 0.51554 + outer loop + vertex -0.327179 0.712019 0.308537 + vertex -0.327179 0.666571 0.384027 + vertex -0.230081 0.663083 0.384027 + endloop + endfacet + facet normal 0.0330381 0.857519 0.513391 + outer loop + vertex -0.327179 0.712019 0.308537 + vertex -0.230081 0.663083 0.384027 + vertex -0.231629 0.708338 0.308537 + endloop + endfacet + facet normal 0.0939386 0.854744 0.510479 + outer loop + vertex -0.231629 0.708338 0.308537 + vertex -0.230081 0.663083 0.384027 + vertex -0.134213 0.652819 0.383572 + endloop + endfacet + facet normal 0.101169 0.858035 0.503528 + outer loop + vertex -0.231629 0.708338 0.308537 + vertex -0.134213 0.652819 0.383572 + vertex -0.137316 0.69743 0.308176 + endloop + endfacet + facet normal 0.16094 0.852301 0.497675 + outer loop + vertex -0.137316 0.69743 0.308176 + vertex -0.134213 0.652819 0.383572 + vertex -0.0408013 0.635977 0.382207 + endloop + endfacet + facet normal 0.173704 0.857086 0.485006 + outer loop + vertex -0.137316 0.69743 0.308176 + vertex -0.0408013 0.635977 0.382207 + vertex -0.0454785 0.679431 0.307092 + endloop + endfacet + facet normal 0.233889 0.847828 0.475903 + outer loop + vertex -0.0454785 0.679431 0.307092 + vertex -0.0408013 0.635977 0.382207 + vertex 0.0489247 0.612757 0.379476 + endloop + endfacet + facet normal 0.252831 0.853222 0.456168 + outer loop + vertex -0.0454785 0.679431 0.307092 + vertex 0.0489247 0.612757 0.379476 + vertex 0.0426467 0.654476 0.304924 + endloop + endfacet + facet normal 0.314731 0.839357 0.443197 + outer loop + vertex 0.0426467 0.654476 0.304924 + vertex 0.0489247 0.612757 0.379476 + vertex 0.133737 0.583359 0.374925 + endloop + endfacet + facet normal 0.340424 0.843993 0.414473 + outer loop + vertex 0.0426467 0.654476 0.304924 + vertex 0.133737 0.583359 0.374925 + vertex 0.125822 0.622702 0.30131 + endloop + endfacet + facet normal 0.41171 0.821391 0.39473 + outer loop + vertex 0.125822 0.622702 0.30131 + vertex 0.133737 0.583359 0.374925 + vertex 0.209403 0.550084 0.365244 + endloop + endfacet + facet normal 0.438232 0.822863 0.361729 + outer loop + vertex 0.125822 0.622702 0.30131 + vertex 0.209403 0.550084 0.365244 + vertex 0.201263 0.585368 0.294843 + endloop + endfacet + facet normal 0.532151 0.779957 0.329367 + outer loop + vertex 0.201263 0.585368 0.294843 + vertex 0.209403 0.550084 0.365244 + vertex 0.271692 0.515237 0.347126 + endloop + endfacet + facet normal 0.54939 0.778321 0.303951 + outer loop + vertex 0.201263 0.585368 0.294843 + vertex 0.271692 0.515237 0.347126 + vertex 0.266184 0.543733 0.284113 + endloop + endfacet + facet normal 0.647132 0.714298 0.266455 + outer loop + vertex 0.266184 0.543733 0.284113 + vertex 0.271692 0.515237 0.347126 + vertex 0.312305 0.486408 0.325773 + endloop + endfacet + facet normal 0.644468 0.715154 0.270584 + outer loop + vertex 0.266184 0.543733 0.284113 + vertex 0.312305 0.486408 0.325773 + vertex 0.321876 0.495978 0.277683 + endloop + endfacet + facet normal 0.0422456 0.986749 -0.15666 + outer loop + vertex -0.327179 0.726868 -0.457381 + vertex -0.237416 0.723104 -0.456883 + vertex -0.239125 0.706869 -0.559605 + endloop + endfacet + facet normal 0.04276 0.986795 -0.156226 + outer loop + vertex -0.327179 0.726868 -0.457381 + vertex -0.239125 0.706869 -0.559605 + vertex -0.327179 0.710571 -0.560317 + endloop + endfacet + facet normal 0.0427778 0.977991 -0.204216 + outer loop + vertex -0.327179 0.710571 -0.560317 + vertex -0.239125 0.706869 -0.559605 + vertex -0.241072 0.686593 -0.657112 + endloop + endfacet + facet normal 0.0434605 0.978083 -0.203631 + outer loop + vertex -0.327179 0.710571 -0.560317 + vertex -0.241072 0.686593 -0.657112 + vertex -0.327179 0.690219 -0.658075 + endloop + endfacet + facet normal 0.0435243 0.964533 -0.260348 + outer loop + vertex -0.327179 0.690219 -0.658075 + vertex -0.241072 0.686593 -0.657112 + vertex -0.243113 0.661845 -0.74914 + endloop + endfacet + facet normal 0.0443402 0.964686 -0.259643 + outer loop + vertex -0.327179 0.690219 -0.658075 + vertex -0.243113 0.661845 -0.74914 + vertex -0.327179 0.665375 -0.750381 + endloop + endfacet + facet normal 0.0444647 0.944459 -0.325608 + outer loop + vertex -0.327179 0.665375 -0.750381 + vertex -0.243113 0.661845 -0.74914 + vertex -0.245107 0.632192 -0.835423 + endloop + endfacet + facet normal 0.045364 0.944684 -0.324829 + outer loop + vertex -0.327179 0.665375 -0.750381 + vertex -0.245107 0.632192 -0.835423 + vertex -0.327179 0.635605 -0.836959 + endloop + endfacet + facet normal 0.0455524 0.915375 -0.400016 + outer loop + vertex -0.327179 0.635605 -0.836959 + vertex -0.245107 0.632192 -0.835423 + vertex -0.246911 0.597202 -0.915698 + endloop + endfacet + facet normal 0.0464689 0.915674 -0.399228 + outer loop + vertex -0.327179 0.635605 -0.836959 + vertex -0.246911 0.597202 -0.915698 + vertex -0.327179 0.600474 -0.917536 + endloop + endfacet + facet normal 0.0467032 0.874574 -0.482638 + outer loop + vertex -0.327179 0.600474 -0.917536 + vertex -0.246911 0.597202 -0.915698 + vertex -0.248382 0.556442 -0.9897 + endloop + endfacet + facet normal 0.0475442 0.874919 -0.48193 + outer loop + vertex -0.327179 0.600474 -0.917536 + vertex -0.248382 0.556442 -0.9897 + vertex -0.327179 0.559548 -0.991836 + endloop + endfacet + facet normal 0.0477773 0.819466 -0.571133 + outer loop + vertex -0.327179 0.559548 -0.991836 + vertex -0.248382 0.556442 -0.9897 + vertex -0.249379 0.509481 -1.05716 + endloop + endfacet + facet normal 0.0484143 0.819786 -0.570619 + outer loop + vertex -0.327179 0.559548 -0.991836 + vertex -0.249379 0.509481 -1.05716 + vertex -0.327179 0.51239 -1.05958 + endloop + endfacet + facet normal 0.0485719 0.748372 -0.661498 + outer loop + vertex -0.327179 0.51239 -1.05958 + vertex -0.249379 0.509481 -1.05716 + vertex -0.249759 0.455885 -1.11783 + endloop + endfacet + facet normal 0.048843 0.748534 -0.661295 + outer loop + vertex -0.327179 0.51239 -1.05958 + vertex -0.249759 0.455885 -1.11783 + vertex -0.327179 0.458568 -1.12051 + endloop + endfacet + facet normal 0.126599 0.979289 -0.158006 + outer loop + vertex -0.237416 0.723104 -0.456883 + vertex -0.148586 0.711821 -0.455637 + vertex -0.151985 0.695773 -0.557825 + endloop + endfacet + facet normal 0.1279 0.979297 -0.156907 + outer loop + vertex -0.237416 0.723104 -0.456883 + vertex -0.151985 0.695773 -0.557825 + vertex -0.239125 0.706869 -0.559605 + endloop + endfacet + facet normal 0.127744 0.970234 -0.205738 + outer loop + vertex -0.239125 0.706869 -0.559605 + vertex -0.151985 0.695773 -0.557825 + vertex -0.155867 0.675743 -0.654694 + endloop + endfacet + facet normal 0.129361 0.970313 -0.204348 + outer loop + vertex -0.239125 0.706869 -0.559605 + vertex -0.155867 0.675743 -0.654694 + vertex -0.241072 0.686593 -0.657112 + endloop + endfacet + facet normal 0.129225 0.956462 -0.261689 + outer loop + vertex -0.241072 0.686593 -0.657112 + vertex -0.155867 0.675743 -0.654694 + vertex -0.15996 0.651317 -0.745993 + endloop + endfacet + facet normal 0.130972 0.95664 -0.260166 + outer loop + vertex -0.241072 0.686593 -0.657112 + vertex -0.15996 0.651317 -0.745993 + vertex -0.243113 0.661845 -0.74914 + endloop + endfacet + facet normal 0.130881 0.936134 -0.326378 + outer loop + vertex -0.243113 0.661845 -0.74914 + vertex -0.15996 0.651317 -0.745993 + vertex -0.163992 0.622078 -0.831472 + endloop + endfacet + facet normal 0.132581 0.936416 -0.324881 + outer loop + vertex -0.243113 0.661845 -0.74914 + vertex -0.163992 0.622078 -0.831472 + vertex -0.245107 0.632192 -0.835423 + endloop + endfacet + facet normal 0.132558 0.906962 -0.39981 + outer loop + vertex -0.245107 0.632192 -0.835423 + vertex -0.163992 0.622078 -0.831472 + vertex -0.167691 0.587614 -0.910881 + endloop + endfacet + facet normal 0.134048 0.907322 -0.398495 + outer loop + vertex -0.245107 0.632192 -0.835423 + vertex -0.167691 0.587614 -0.910881 + vertex -0.246911 0.597202 -0.915698 + endloop + endfacet + facet normal 0.13411 0.866301 -0.481184 + outer loop + vertex -0.246911 0.597202 -0.915698 + vertex -0.167691 0.587614 -0.910881 + vertex -0.170739 0.547478 -0.983989 + endloop + endfacet + facet normal 0.135377 0.866719 -0.480075 + outer loop + vertex -0.246911 0.597202 -0.915698 + vertex -0.170739 0.547478 -0.983989 + vertex -0.248382 0.556442 -0.9897 + endloop + endfacet + facet normal 0.135503 0.811702 -0.568137 + outer loop + vertex -0.248382 0.556442 -0.9897 + vertex -0.170739 0.547478 -0.983989 + vertex -0.172822 0.50123 -1.05056 + endloop + endfacet + facet normal 0.136458 0.812111 -0.567323 + outer loop + vertex -0.248382 0.556442 -0.9897 + vertex -0.172822 0.50123 -1.05056 + vertex -0.249379 0.509481 -1.05716 + endloop + endfacet + facet normal 0.136576 0.741683 -0.656699 + outer loop + vertex -0.249379 0.509481 -1.05716 + vertex -0.172822 0.50123 -1.05056 + vertex -0.173622 0.448425 -1.11037 + endloop + endfacet + facet normal 0.13701 0.741915 -0.656347 + outer loop + vertex -0.249379 0.509481 -1.05716 + vertex -0.173622 0.448425 -1.11037 + vertex -0.249759 0.455885 -1.11783 + endloop + endfacet + facet normal 0.211558 0.96417 -0.160061 + outer loop + vertex -0.148586 0.711821 -0.455637 + vertex -0.0616197 0.693029 -0.453892 + vertex -0.0666704 0.677297 -0.555333 + endloop + endfacet + facet normal 0.213401 0.964022 -0.158496 + outer loop + vertex -0.148586 0.711821 -0.455637 + vertex -0.0666704 0.677297 -0.555333 + vertex -0.151985 0.695773 -0.557825 + endloop + endfacet + facet normal 0.212829 0.95472 -0.20788 + outer loop + vertex -0.151985 0.695773 -0.557825 + vertex -0.0666704 0.677297 -0.555333 + vertex -0.0724669 0.657696 -0.65129 + endloop + endfacet + facet normal 0.214989 0.954641 -0.20601 + outer loop + vertex -0.151985 0.695773 -0.557825 + vertex -0.0724669 0.657696 -0.65129 + vertex -0.155867 0.675743 -0.654694 + endloop + endfacet + facet normal 0.214293 0.940631 -0.263233 + outer loop + vertex -0.155867 0.675743 -0.654694 + vertex -0.0724669 0.657696 -0.65129 + vertex -0.0786327 0.633851 -0.741516 + endloop + endfacet + facet normal 0.216405 0.940667 -0.261371 + outer loop + vertex -0.155867 0.675743 -0.654694 + vertex -0.0786327 0.633851 -0.741516 + vertex -0.15996 0.651317 -0.745993 + endloop + endfacet + facet normal 0.215608 0.920225 -0.326648 + outer loop + vertex -0.15996 0.651317 -0.745993 + vertex -0.0786327 0.633851 -0.741516 + vertex -0.0847914 0.605389 -0.825763 + endloop + endfacet + facet normal 0.217376 0.92037 -0.325065 + outer loop + vertex -0.15996 0.651317 -0.745993 + vertex -0.0847914 0.605389 -0.825763 + vertex -0.163992 0.622078 -0.831472 + endloop + endfacet + facet normal 0.216538 0.891367 -0.398217 + outer loop + vertex -0.163992 0.622078 -0.831472 + vertex -0.0847914 0.605389 -0.825763 + vertex -0.0905663 0.571936 -0.903784 + endloop + endfacet + facet normal 0.217776 0.891565 -0.397097 + outer loop + vertex -0.163992 0.622078 -0.831472 + vertex -0.0905663 0.571936 -0.903784 + vertex -0.167691 0.587614 -0.910881 + endloop + endfacet + facet normal 0.217013 0.851423 -0.477477 + outer loop + vertex -0.167691 0.587614 -0.910881 + vertex -0.0905663 0.571936 -0.903784 + vertex -0.0954035 0.533007 -0.9754 + endloop + endfacet + facet normal 0.217936 0.851656 -0.47664 + outer loop + vertex -0.167691 0.587614 -0.910881 + vertex -0.0954035 0.533007 -0.9754 + vertex -0.170739 0.547478 -0.983989 + endloop + endfacet + facet normal 0.217371 0.798032 -0.562045 + outer loop + vertex -0.170739 0.547478 -0.983989 + vertex -0.0954035 0.533007 -0.9754 + vertex -0.098749 0.488114 -1.04044 + endloop + endfacet + facet normal 0.218088 0.798289 -0.561402 + outer loop + vertex -0.170739 0.547478 -0.983989 + vertex -0.098749 0.488114 -1.04044 + vertex -0.172822 0.50123 -1.05056 + endloop + endfacet + facet normal 0.217805 0.729915 -0.647908 + outer loop + vertex -0.172822 0.50123 -1.05056 + vertex -0.098749 0.488114 -1.04044 + vertex -0.100049 0.436772 -1.09871 + endloop + endfacet + facet normal 0.218198 0.730102 -0.647565 + outer loop + vertex -0.172822 0.50123 -1.05056 + vertex -0.100049 0.436772 -1.09871 + vertex -0.173622 0.448425 -1.11037 + endloop + endfacet + facet normal 0.297715 0.940708 -0.162586 + outer loop + vertex -0.0616197 0.693029 -0.453892 + vertex 0.0225503 0.666735 -0.451898 + vertex 0.0159051 0.651454 -0.552484 + endloop + endfacet + facet normal 0.299842 0.940346 -0.160762 + outer loop + vertex -0.0616197 0.693029 -0.453892 + vertex 0.0159051 0.651454 -0.552484 + vertex -0.0666704 0.677297 -0.555333 + endloop + endfacet + facet normal 0.298599 0.930912 -0.210334 + outer loop + vertex -0.0666704 0.677297 -0.555333 + vertex 0.0159051 0.651454 -0.552484 + vertex 0.00822601 0.632478 -0.647371 + endloop + endfacet + facet normal 0.300948 0.930618 -0.20828 + outer loop + vertex -0.0666704 0.677297 -0.555333 + vertex 0.00822601 0.632478 -0.647371 + vertex -0.0724669 0.657696 -0.65129 + endloop + endfacet + facet normal 0.299339 0.916709 -0.264653 + outer loop + vertex -0.0724669 0.657696 -0.65129 + vertex 0.00822601 0.632478 -0.647371 + vertex -4.40478e-05 0.609509 -0.736286 + endloop + endfacet + facet normal 0.301388 0.916563 -0.262824 + outer loop + vertex -0.0724669 0.657696 -0.65129 + vertex -4.40478e-05 0.609509 -0.736286 + vertex -0.0786327 0.633851 -0.741516 + endloop + endfacet + facet normal 0.299432 0.896637 -0.326162 + outer loop + vertex -0.0786327 0.633851 -0.741516 + vertex -4.40478e-05 0.609509 -0.736286 + vertex -0.00846225 0.582249 -0.818954 + endloop + endfacet + facet normal 0.300814 0.896631 -0.324906 + outer loop + vertex -0.0786327 0.633851 -0.741516 + vertex -0.00846225 0.582249 -0.818954 + vertex -0.0847914 0.605389 -0.825763 + endloop + endfacet + facet normal 0.298618 0.868701 -0.395205 + outer loop + vertex -0.0847914 0.605389 -0.825763 + vertex -0.00846225 0.582249 -0.818954 + vertex -0.0165857 0.550399 -0.895101 + endloop + endfacet + facet normal 0.299231 0.868747 -0.394639 + outer loop + vertex -0.0847914 0.605389 -0.825763 + vertex -0.0165857 0.550399 -0.895101 + vertex -0.0905663 0.571936 -0.903784 + endloop + endfacet + facet normal 0.297057 0.830223 -0.471685 + outer loop + vertex -0.0905663 0.571936 -0.903784 + vertex -0.0165857 0.550399 -0.895101 + vertex -0.023528 0.513379 -0.964632 + endloop + endfacet + facet normal 0.297354 0.830275 -0.471407 + outer loop + vertex -0.0905663 0.571936 -0.903784 + vertex -0.023528 0.513379 -0.964632 + vertex -0.0954035 0.533007 -0.9754 + endloop + endfacet + facet normal 0.295565 0.778846 -0.55321 + outer loop + vertex -0.0954035 0.533007 -0.9754 + vertex -0.023528 0.513379 -0.964632 + vertex -0.0284025 0.470611 -1.02745 + endloop + endfacet + facet normal 0.295889 0.778939 -0.552905 + outer loop + vertex -0.0954035 0.533007 -0.9754 + vertex -0.0284025 0.470611 -1.02745 + vertex -0.098749 0.488114 -1.04044 + endloop + endfacet + facet normal 0.29487 0.713493 -0.635594 + outer loop + vertex -0.098749 0.488114 -1.04044 + vertex -0.0284025 0.470611 -1.02745 + vertex -0.0303229 0.421514 -1.08345 + endloop + endfacet + facet normal 0.295197 0.713631 -0.635288 + outer loop + vertex -0.098749 0.488114 -1.04044 + vertex -0.0303229 0.421514 -1.08345 + vertex -0.100049 0.436772 -1.09871 + endloop + endfacet + facet normal 0.385385 0.907829 -0.165302 + outer loop + vertex 0.0225503 0.666735 -0.451898 + vertex 0.102992 0.63295 -0.449905 + vertex 0.0948286 0.618256 -0.549636 + endloop + endfacet + facet normal 0.387523 0.907256 -0.163437 + outer loop + vertex 0.0225503 0.666735 -0.451898 + vertex 0.0948286 0.618256 -0.549636 + vertex 0.0159051 0.651454 -0.552484 + endloop + endfacet + facet normal 0.385365 0.89789 -0.212809 + outer loop + vertex 0.0159051 0.651454 -0.552484 + vertex 0.0948286 0.618256 -0.549636 + vertex 0.0853095 0.600116 -0.643408 + endloop + endfacet + facet normal 0.387589 0.897399 -0.210834 + outer loop + vertex 0.0159051 0.651454 -0.552484 + vertex 0.0853095 0.600116 -0.643408 + vertex 0.00822601 0.632478 -0.647371 + endloop + endfacet + facet normal 0.384758 0.88393 -0.265762 + outer loop + vertex 0.00822601 0.632478 -0.647371 + vertex 0.0853095 0.600116 -0.643408 + vertex 0.0748933 0.578352 -0.730878 + endloop + endfacet + facet normal 0.386465 0.883648 -0.264217 + outer loop + vertex 0.00822601 0.632478 -0.647371 + vertex 0.0748933 0.578352 -0.730878 + vertex -4.40478e-05 0.609509 -0.736286 + endloop + endfacet + facet normal 0.382974 0.864701 -0.324998 + outer loop + vertex -4.40478e-05 0.609509 -0.736286 + vertex 0.0748933 0.578352 -0.730878 + vertex 0.0640383 0.552782 -0.8117 + endloop + endfacet + facet normal 0.38384 0.864617 -0.324199 + outer loop + vertex -4.40478e-05 0.609509 -0.736286 + vertex 0.0640383 0.552782 -0.8117 + vertex -0.00846225 0.582249 -0.818954 + endloop + endfacet + facet normal 0.379827 0.838231 -0.39128 + outer loop + vertex -0.00846225 0.582249 -0.818954 + vertex 0.0640383 0.552782 -0.8117 + vertex 0.0532032 0.523228 -0.885532 + endloop + endfacet + facet normal 0.379977 0.838229 -0.391139 + outer loop + vertex -0.00846225 0.582249 -0.818954 + vertex 0.0532032 0.523228 -0.885532 + vertex -0.0165857 0.550399 -0.895101 + endloop + endfacet + facet normal 0.375876 0.801874 -0.464451 + outer loop + vertex -0.0165857 0.550399 -0.895101 + vertex 0.0532032 0.523228 -0.885532 + vertex 0.0437335 0.488947 -0.952382 + endloop + endfacet + facet normal 0.375867 0.801874 -0.46446 + outer loop + vertex -0.0165857 0.550399 -0.895101 + vertex 0.0437335 0.488947 -0.952382 + vertex -0.023528 0.513379 -0.964632 + endloop + endfacet + facet normal 0.372365 0.7533 -0.54211 + outer loop + vertex -0.023528 0.513379 -0.964632 + vertex 0.0437335 0.488947 -0.952382 + vertex 0.0369751 0.449196 -1.01226 + endloop + endfacet + facet normal 0.372642 0.753359 -0.541838 + outer loop + vertex -0.023528 0.513379 -0.964632 + vertex 0.0369751 0.449196 -1.01226 + vertex -0.0284025 0.470611 -1.02745 + endloop + endfacet + facet normal 0.370576 0.691767 -0.619783 + outer loop + vertex -0.0284025 0.470611 -1.02745 + vertex 0.0369751 0.449196 -1.01226 + vertex 0.0342738 0.403235 -1.06518 + endloop + endfacet + facet normal 0.371045 0.691939 -0.619311 + outer loop + vertex -0.0284025 0.470611 -1.02745 + vertex 0.0342738 0.403235 -1.06518 + vertex -0.0303229 0.421514 -1.08345 + endloop + endfacet + facet normal 0.474448 0.864129 -0.167868 + outer loop + vertex 0.102992 0.63295 -0.449905 + vertex 0.178774 0.591681 -0.44816 + vertex 0.169187 0.577716 -0.547144 + endloop + endfacet + facet normal 0.476309 0.863427 -0.166203 + outer loop + vertex 0.102992 0.63295 -0.449905 + vertex 0.169187 0.577716 -0.547144 + vertex 0.0948286 0.618256 -0.549636 + endloop + endfacet + facet normal 0.473022 0.854393 -0.21509 + outer loop + vertex 0.0948286 0.618256 -0.549636 + vertex 0.169187 0.577716 -0.547144 + vertex 0.157899 0.56061 -0.639916 + endloop + endfacet + facet normal 0.474922 0.853771 -0.213366 + outer loop + vertex 0.0948286 0.618256 -0.549636 + vertex 0.157899 0.56061 -0.639916 + vertex 0.0853095 0.600116 -0.643408 + endloop + endfacet + facet normal 0.470584 0.841086 -0.266691 + outer loop + vertex 0.0853095 0.600116 -0.643408 + vertex 0.157899 0.56061 -0.639916 + vertex 0.145337 0.540328 -0.726046 + endloop + endfacet + facet normal 0.471991 0.840708 -0.265396 + outer loop + vertex 0.0853095 0.600116 -0.643408 + vertex 0.145337 0.540328 -0.726046 + vertex 0.0748933 0.578352 -0.730878 + endloop + endfacet + facet normal 0.466511 0.823142 -0.323736 + outer loop + vertex 0.0748933 0.578352 -0.730878 + vertex 0.145337 0.540328 -0.726046 + vertex 0.13193 0.516834 -0.805104 + endloop + endfacet + facet normal 0.467174 0.823009 -0.323117 + outer loop + vertex 0.0748933 0.578352 -0.730878 + vertex 0.13193 0.516834 -0.805104 + vertex 0.0640383 0.552782 -0.8117 + endloop + endfacet + facet normal 0.460515 0.798627 -0.387454 + outer loop + vertex 0.0640383 0.552782 -0.8117 + vertex 0.13193 0.516834 -0.805104 + vertex 0.118106 0.49009 -0.876659 + endloop + endfacet + facet normal 0.460693 0.798606 -0.387285 + outer loop + vertex 0.0640383 0.552782 -0.8117 + vertex 0.118106 0.49009 -0.876659 + vertex 0.0532032 0.523228 -0.885532 + endloop + endfacet + facet normal 0.453375 0.765903 -0.455899 + outer loop + vertex 0.0532032 0.523228 -0.885532 + vertex 0.118106 0.49009 -0.876659 + vertex 0.105529 0.459485 -0.940583 + endloop + endfacet + facet normal 0.452391 0.765917 -0.456851 + outer loop + vertex 0.0532032 0.523228 -0.885532 + vertex 0.105529 0.459485 -0.940583 + vertex 0.0437335 0.488947 -0.952382 + endloop + endfacet + facet normal 0.445493 0.722881 -0.528185 + outer loop + vertex 0.0437335 0.488947 -0.952382 + vertex 0.105529 0.459485 -0.940583 + vertex 0.0958631 0.424405 -0.996746 + endloop + endfacet + facet normal 0.44383 0.722684 -0.529852 + outer loop + vertex 0.0437335 0.488947 -0.952382 + vertex 0.0958631 0.424405 -0.996746 + vertex 0.0369751 0.449196 -1.01226 + endloop + endfacet + facet normal 0.439351 0.667204 -0.601506 + outer loop + vertex 0.0369751 0.449196 -1.01226 + vertex 0.0958631 0.424405 -0.996746 + vertex 0.0917581 0.383347 -1.04529 + endloop + endfacet + facet normal 0.439022 0.667105 -0.601856 + outer loop + vertex 0.0369751 0.449196 -1.01226 + vertex 0.0917581 0.383347 -1.04529 + vertex 0.0342738 0.403235 -1.06518 + endloop + endfacet + facet normal 0.564142 0.808013 -0.169881 + outer loop + vertex 0.178774 0.591681 -0.44816 + vertex 0.248963 0.542938 -0.446914 + vertex 0.238068 0.529846 -0.545364 + endloop + endfacet + facet normal 0.565441 0.807357 -0.168671 + outer loop + vertex 0.178774 0.591681 -0.44816 + vertex 0.238068 0.529846 -0.545364 + vertex 0.169187 0.577716 -0.547144 + endloop + endfacet + facet normal 0.560873 0.798991 -0.216876 + outer loop + vertex 0.169187 0.577716 -0.547144 + vertex 0.238068 0.529846 -0.545364 + vertex 0.22511 0.513958 -0.637409 + endloop + endfacet + facet normal 0.562217 0.798387 -0.215617 + outer loop + vertex 0.169187 0.577716 -0.547144 + vertex 0.22511 0.513958 -0.637409 + vertex 0.157899 0.56061 -0.639916 + endloop + endfacet + facet normal 0.556157 0.786871 -0.267439 + outer loop + vertex 0.157899 0.56061 -0.639916 + vertex 0.22511 0.513958 -0.637409 + vertex 0.210445 0.495387 -0.722544 + endloop + endfacet + facet normal 0.557194 0.786469 -0.266462 + outer loop + vertex 0.157899 0.56061 -0.639916 + vertex 0.210445 0.495387 -0.722544 + vertex 0.145337 0.540328 -0.726046 + endloop + endfacet + facet normal 0.549351 0.770715 -0.322818 + outer loop + vertex 0.145337 0.540328 -0.726046 + vertex 0.210445 0.495387 -0.722544 + vertex 0.194432 0.474247 -0.800266 + endloop + endfacet + facet normal 0.549954 0.770523 -0.322249 + outer loop + vertex 0.145337 0.540328 -0.726046 + vertex 0.194432 0.474247 -0.800266 + vertex 0.13193 0.516834 -0.805104 + endloop + endfacet + facet normal 0.539915 0.748704 -0.384621 + outer loop + vertex 0.13193 0.516834 -0.805104 + vertex 0.194432 0.474247 -0.800266 + vertex 0.177427 0.450651 -0.870068 + endloop + endfacet + facet normal 0.54038 0.748594 -0.384184 + outer loop + vertex 0.13193 0.516834 -0.805104 + vertex 0.177427 0.450651 -0.870068 + vertex 0.118106 0.49009 -0.876659 + endloop + endfacet + facet normal 0.529048 0.720954 -0.447587 + outer loop + vertex 0.118106 0.49009 -0.876659 + vertex 0.177427 0.450651 -0.870068 + vertex 0.161005 0.424769 -0.931169 + endloop + endfacet + facet normal 0.527498 0.72117 -0.449065 + outer loop + vertex 0.118106 0.49009 -0.876659 + vertex 0.161005 0.424769 -0.931169 + vertex 0.105529 0.459485 -0.940583 + endloop + endfacet + facet normal 0.515976 0.685089 -0.514221 + outer loop + vertex 0.105529 0.459485 -0.940583 + vertex 0.161005 0.424769 -0.931169 + vertex 0.14674 0.396771 -0.982784 + endloop + endfacet + facet normal 0.513822 0.685106 -0.51635 + outer loop + vertex 0.105529 0.459485 -0.940583 + vertex 0.14674 0.396771 -0.982784 + vertex 0.0958631 0.424405 -0.996746 + endloop + endfacet + facet normal 0.505666 0.637007 -0.581828 + outer loop + vertex 0.0958631 0.424405 -0.996746 + vertex 0.14674 0.396771 -0.982784 + vertex 0.140147 0.363261 -1.0252 + endloop + endfacet + facet normal 0.505853 0.637047 -0.581622 + outer loop + vertex 0.0958631 0.424405 -0.996746 + vertex 0.140147 0.363261 -1.0252 + vertex 0.0917581 0.383347 -1.04529 + endloop + endfacet + facet normal 0.652861 0.737952 -0.170881 + outer loop + vertex 0.248963 0.542938 -0.446914 + vertex 0.312627 0.48673 -0.446415 + vertex 0.300558 0.47466 -0.544652 + endloop + endfacet + facet normal 0.653354 0.737627 -0.170394 + outer loop + vertex 0.248963 0.542938 -0.446914 + vertex 0.300558 0.47466 -0.544652 + vertex 0.238068 0.529846 -0.545364 + endloop + endfacet + facet normal 0.647452 0.730333 -0.217759 + outer loop + vertex 0.238068 0.529846 -0.545364 + vertex 0.300558 0.47466 -0.544652 + vertex 0.286057 0.460159 -0.636401 + endloop + endfacet + facet normal 0.647987 0.730015 -0.217234 + outer loop + vertex 0.238068 0.529846 -0.545364 + vertex 0.286057 0.460159 -0.636401 + vertex 0.22511 0.513958 -0.637409 + endloop + endfacet + facet normal 0.640085 0.720116 -0.267814 + outer loop + vertex 0.22511 0.513958 -0.637409 + vertex 0.286057 0.460159 -0.636401 + vertex 0.269375 0.443478 -0.721126 + endloop + endfacet + facet normal 0.64055 0.71987 -0.267361 + outer loop + vertex 0.22511 0.513958 -0.637409 + vertex 0.269375 0.443478 -0.721126 + vertex 0.210445 0.495387 -0.722544 + endloop + endfacet + facet normal 0.630065 0.706464 -0.322378 + outer loop + vertex 0.210445 0.495387 -0.722544 + vertex 0.269375 0.443478 -0.721126 + vertex 0.250764 0.424866 -0.798286 + endloop + endfacet + facet normal 0.630456 0.706286 -0.322004 + outer loop + vertex 0.210445 0.495387 -0.722544 + vertex 0.250764 0.424866 -0.798286 + vertex 0.194432 0.474247 -0.800266 + endloop + endfacet + facet normal 0.616444 0.687847 -0.383228 + outer loop + vertex 0.194432 0.474247 -0.800266 + vertex 0.250764 0.424866 -0.798286 + vertex 0.230473 0.404576 -0.867343 + endloop + endfacet + facet normal 0.616956 0.687653 -0.382751 + outer loop + vertex 0.194432 0.474247 -0.800266 + vertex 0.230473 0.404576 -0.867343 + vertex 0.177427 0.450651 -0.870068 + endloop + endfacet + facet normal 0.600759 0.66544 -0.443032 + outer loop + vertex 0.177427 0.450651 -0.870068 + vertex 0.230473 0.404576 -0.867343 + vertex 0.209579 0.383682 -0.927058 + endloop + endfacet + facet normal 0.600463 0.665528 -0.443302 + outer loop + vertex 0.177427 0.450651 -0.870068 + vertex 0.209579 0.383682 -0.927058 + vertex 0.161005 0.424769 -0.931169 + endloop + endfacet + facet normal 0.581483 0.636782 -0.506346 + outer loop + vertex 0.161005 0.424769 -0.931169 + vertex 0.209579 0.383682 -0.927058 + vertex 0.189158 0.363261 -0.976191 + endloop + endfacet + facet normal 0.581694 0.636739 -0.506157 + outer loop + vertex 0.161005 0.424769 -0.931169 + vertex 0.189158 0.363261 -0.976191 + vertex 0.14674 0.396771 -0.982784 + endloop + endfacet + facet normal 0.562735 0.600568 -0.568021 + outer loop + vertex 0.14674 0.396771 -0.982784 + vertex 0.189158 0.363261 -0.976191 + vertex 0.173079 0.347181 -1.00912 + endloop + endfacet + facet normal 0.568022 0.600568 -0.562734 + outer loop + vertex 0.14674 0.396771 -0.982784 + vertex 0.173079 0.347181 -1.00912 + vertex 0.140147 0.363261 -1.0252 + endloop + endfacet + facet normal -0.04276 0.986795 -0.156226 + outer loop + vertex -0.327179 0.726868 -0.457381 + vertex -0.327179 0.710571 -0.560317 + vertex -0.415232 0.706869 -0.559605 + endloop + endfacet + facet normal -0.0422456 0.986749 -0.15666 + outer loop + vertex -0.327179 0.726868 -0.457381 + vertex -0.415232 0.706869 -0.559605 + vertex -0.416941 0.723104 -0.456883 + endloop + endfacet + facet normal -0.1279 0.979297 -0.156907 + outer loop + vertex -0.416941 0.723104 -0.456883 + vertex -0.415232 0.706869 -0.559605 + vertex -0.502372 0.695773 -0.557825 + endloop + endfacet + facet normal -0.126599 0.979289 -0.158006 + outer loop + vertex -0.416941 0.723104 -0.456883 + vertex -0.502372 0.695773 -0.557825 + vertex -0.505771 0.711821 -0.455637 + endloop + endfacet + facet normal -0.2134 0.964023 -0.158495 + outer loop + vertex -0.505771 0.711821 -0.455637 + vertex -0.502372 0.695773 -0.557825 + vertex -0.587687 0.677297 -0.555333 + endloop + endfacet + facet normal -0.211558 0.96417 -0.16006 + outer loop + vertex -0.505771 0.711821 -0.455637 + vertex -0.587687 0.677297 -0.555333 + vertex -0.592737 0.693029 -0.453892 + endloop + endfacet + facet normal -0.299842 0.940346 -0.160761 + outer loop + vertex -0.592737 0.693029 -0.453892 + vertex -0.587687 0.677297 -0.555333 + vertex -0.670262 0.651454 -0.552484 + endloop + endfacet + facet normal -0.297714 0.940708 -0.162587 + outer loop + vertex -0.592737 0.693029 -0.453892 + vertex -0.670262 0.651454 -0.552484 + vertex -0.676908 0.666736 -0.451898 + endloop + endfacet + facet normal -0.387523 0.907256 -0.163438 + outer loop + vertex -0.676908 0.666736 -0.451898 + vertex -0.670262 0.651454 -0.552484 + vertex -0.749186 0.618256 -0.549636 + endloop + endfacet + facet normal -0.385384 0.907829 -0.165303 + outer loop + vertex -0.676908 0.666736 -0.451898 + vertex -0.749186 0.618256 -0.549636 + vertex -0.757349 0.63295 -0.449905 + endloop + endfacet + facet normal -0.476308 0.863428 -0.166203 + outer loop + vertex -0.757349 0.63295 -0.449905 + vertex -0.749186 0.618256 -0.549636 + vertex -0.823545 0.577716 -0.547144 + endloop + endfacet + facet normal -0.474447 0.86413 -0.167869 + outer loop + vertex -0.757349 0.63295 -0.449905 + vertex -0.823545 0.577716 -0.547144 + vertex -0.833131 0.591681 -0.44816 + endloop + endfacet + facet normal -0.56544 0.807358 -0.168672 + outer loop + vertex -0.833131 0.591681 -0.44816 + vertex -0.823545 0.577716 -0.547144 + vertex -0.892425 0.529846 -0.545364 + endloop + endfacet + facet normal -0.564141 0.808013 -0.169881 + outer loop + vertex -0.833131 0.591681 -0.44816 + vertex -0.892425 0.529846 -0.545364 + vertex -0.90332 0.542939 -0.446914 + endloop + endfacet + facet normal -0.653354 0.737628 -0.170394 + outer loop + vertex -0.90332 0.542939 -0.446914 + vertex -0.892425 0.529846 -0.545364 + vertex -0.954915 0.474661 -0.544652 + endloop + endfacet + facet normal -0.65286 0.737952 -0.170881 + outer loop + vertex -0.90332 0.542939 -0.446914 + vertex -0.954915 0.474661 -0.544652 + vertex -0.966985 0.48673 -0.446415 + endloop + endfacet + facet normal -0.0434605 0.978083 -0.203631 + outer loop + vertex -0.327179 0.710571 -0.560317 + vertex -0.327179 0.690219 -0.658075 + vertex -0.413286 0.686593 -0.657112 + endloop + endfacet + facet normal -0.0427778 0.977991 -0.204216 + outer loop + vertex -0.327179 0.710571 -0.560317 + vertex -0.413286 0.686593 -0.657112 + vertex -0.415232 0.706869 -0.559605 + endloop + endfacet + facet normal -0.129362 0.970313 -0.204348 + outer loop + vertex -0.415232 0.706869 -0.559605 + vertex -0.413286 0.686593 -0.657112 + vertex -0.49849 0.675743 -0.654694 + endloop + endfacet + facet normal -0.127744 0.970234 -0.205738 + outer loop + vertex -0.415232 0.706869 -0.559605 + vertex -0.49849 0.675743 -0.654694 + vertex -0.502372 0.695773 -0.557825 + endloop + endfacet + facet normal -0.214987 0.954641 -0.206011 + outer loop + vertex -0.502372 0.695773 -0.557825 + vertex -0.49849 0.675743 -0.654694 + vertex -0.58189 0.657696 -0.65129 + endloop + endfacet + facet normal -0.212828 0.95472 -0.20788 + outer loop + vertex -0.502372 0.695773 -0.557825 + vertex -0.58189 0.657696 -0.65129 + vertex -0.587687 0.677297 -0.555333 + endloop + endfacet + facet normal -0.300948 0.930618 -0.20828 + outer loop + vertex -0.587687 0.677297 -0.555333 + vertex -0.58189 0.657696 -0.65129 + vertex -0.662583 0.632478 -0.647371 + endloop + endfacet + facet normal -0.298599 0.930912 -0.210334 + outer loop + vertex -0.587687 0.677297 -0.555333 + vertex -0.662583 0.632478 -0.647371 + vertex -0.670262 0.651454 -0.552484 + endloop + endfacet + facet normal -0.387587 0.897399 -0.210834 + outer loop + vertex -0.670262 0.651454 -0.552484 + vertex -0.662583 0.632478 -0.647371 + vertex -0.739667 0.600116 -0.643408 + endloop + endfacet + facet normal -0.385365 0.89789 -0.212808 + outer loop + vertex -0.670262 0.651454 -0.552484 + vertex -0.739667 0.600116 -0.643408 + vertex -0.749186 0.618256 -0.549636 + endloop + endfacet + facet normal -0.474922 0.853771 -0.213364 + outer loop + vertex -0.749186 0.618256 -0.549636 + vertex -0.739667 0.600116 -0.643408 + vertex -0.812256 0.56061 -0.639916 + endloop + endfacet + facet normal -0.473021 0.854393 -0.21509 + outer loop + vertex -0.749186 0.618256 -0.549636 + vertex -0.812256 0.56061 -0.639916 + vertex -0.823545 0.577716 -0.547144 + endloop + endfacet + facet normal -0.562216 0.798387 -0.215616 + outer loop + vertex -0.823545 0.577716 -0.547144 + vertex -0.812256 0.56061 -0.639916 + vertex -0.879467 0.513958 -0.637409 + endloop + endfacet + facet normal -0.560872 0.798992 -0.216876 + outer loop + vertex -0.823545 0.577716 -0.547144 + vertex -0.879467 0.513958 -0.637409 + vertex -0.892425 0.529846 -0.545364 + endloop + endfacet + facet normal -0.647986 0.730016 -0.217235 + outer loop + vertex -0.892425 0.529846 -0.545364 + vertex -0.879467 0.513958 -0.637409 + vertex -0.940414 0.460159 -0.636401 + endloop + endfacet + facet normal -0.647452 0.730333 -0.217759 + outer loop + vertex -0.892425 0.529846 -0.545364 + vertex -0.940414 0.460159 -0.636401 + vertex -0.954915 0.474661 -0.544652 + endloop + endfacet + facet normal -0.0443402 0.964686 -0.259643 + outer loop + vertex -0.327179 0.690219 -0.658075 + vertex -0.327179 0.665375 -0.750381 + vertex -0.411244 0.661845 -0.74914 + endloop + endfacet + facet normal -0.0435243 0.964533 -0.260348 + outer loop + vertex -0.327179 0.690219 -0.658075 + vertex -0.411244 0.661845 -0.74914 + vertex -0.413286 0.686593 -0.657112 + endloop + endfacet + facet normal -0.130971 0.95664 -0.260166 + outer loop + vertex -0.413286 0.686593 -0.657112 + vertex -0.411244 0.661845 -0.74914 + vertex -0.494397 0.651317 -0.745993 + endloop + endfacet + facet normal -0.129225 0.956462 -0.261688 + outer loop + vertex -0.413286 0.686593 -0.657112 + vertex -0.494397 0.651317 -0.745993 + vertex -0.49849 0.675743 -0.654694 + endloop + endfacet + facet normal -0.216404 0.940667 -0.26137 + outer loop + vertex -0.49849 0.675743 -0.654694 + vertex -0.494397 0.651317 -0.745993 + vertex -0.575724 0.633851 -0.741516 + endloop + endfacet + facet normal -0.214291 0.940632 -0.263233 + outer loop + vertex -0.49849 0.675743 -0.654694 + vertex -0.575724 0.633851 -0.741516 + vertex -0.58189 0.657696 -0.65129 + endloop + endfacet + facet normal -0.301387 0.916564 -0.262825 + outer loop + vertex -0.58189 0.657696 -0.65129 + vertex -0.575724 0.633851 -0.741516 + vertex -0.654313 0.609509 -0.736286 + endloop + endfacet + facet normal -0.299339 0.916709 -0.264652 + outer loop + vertex -0.58189 0.657696 -0.65129 + vertex -0.654313 0.609509 -0.736286 + vertex -0.662583 0.632478 -0.647371 + endloop + endfacet + facet normal -0.386465 0.883649 -0.264216 + outer loop + vertex -0.662583 0.632478 -0.647371 + vertex -0.654313 0.609509 -0.736286 + vertex -0.729251 0.578352 -0.730878 + endloop + endfacet + facet normal -0.384757 0.88393 -0.265762 + outer loop + vertex -0.662583 0.632478 -0.647371 + vertex -0.729251 0.578352 -0.730878 + vertex -0.739667 0.600116 -0.643408 + endloop + endfacet + facet normal -0.471991 0.840708 -0.265396 + outer loop + vertex -0.739667 0.600116 -0.643408 + vertex -0.729251 0.578352 -0.730878 + vertex -0.799694 0.540329 -0.726046 + endloop + endfacet + facet normal -0.470584 0.841086 -0.266692 + outer loop + vertex -0.739667 0.600116 -0.643408 + vertex -0.799694 0.540329 -0.726046 + vertex -0.812256 0.56061 -0.639916 + endloop + endfacet + facet normal -0.557194 0.786469 -0.266462 + outer loop + vertex -0.812256 0.56061 -0.639916 + vertex -0.799694 0.540329 -0.726046 + vertex -0.864802 0.495388 -0.722544 + endloop + endfacet + facet normal -0.556156 0.786871 -0.26744 + outer loop + vertex -0.812256 0.56061 -0.639916 + vertex -0.864802 0.495388 -0.722544 + vertex -0.879467 0.513958 -0.637409 + endloop + endfacet + facet normal -0.64055 0.719871 -0.267361 + outer loop + vertex -0.879467 0.513958 -0.637409 + vertex -0.864802 0.495388 -0.722544 + vertex -0.923732 0.443478 -0.721126 + endloop + endfacet + facet normal -0.640084 0.720116 -0.267815 + outer loop + vertex -0.879467 0.513958 -0.637409 + vertex -0.923732 0.443478 -0.721126 + vertex -0.940414 0.460159 -0.636401 + endloop + endfacet + facet normal -0.0453633 0.944684 -0.324828 + outer loop + vertex -0.327179 0.665375 -0.750381 + vertex -0.327179 0.635605 -0.836959 + vertex -0.409251 0.632192 -0.835423 + endloop + endfacet + facet normal -0.0444647 0.944459 -0.325608 + outer loop + vertex -0.327179 0.665375 -0.750381 + vertex -0.409251 0.632192 -0.835423 + vertex -0.411244 0.661845 -0.74914 + endloop + endfacet + facet normal -0.13258 0.936416 -0.32488 + outer loop + vertex -0.411244 0.661845 -0.74914 + vertex -0.409251 0.632192 -0.835423 + vertex -0.490365 0.622079 -0.831472 + endloop + endfacet + facet normal -0.130881 0.936135 -0.326377 + outer loop + vertex -0.411244 0.661845 -0.74914 + vertex -0.490365 0.622079 -0.831472 + vertex -0.494397 0.651317 -0.745993 + endloop + endfacet + facet normal -0.217376 0.92037 -0.325064 + outer loop + vertex -0.494397 0.651317 -0.745993 + vertex -0.490365 0.622079 -0.831472 + vertex -0.569566 0.605389 -0.825763 + endloop + endfacet + facet normal -0.215608 0.920225 -0.326647 + outer loop + vertex -0.494397 0.651317 -0.745993 + vertex -0.569566 0.605389 -0.825763 + vertex -0.575724 0.633851 -0.741516 + endloop + endfacet + facet normal -0.300813 0.896631 -0.324905 + outer loop + vertex -0.575724 0.633851 -0.741516 + vertex -0.569566 0.605389 -0.825763 + vertex -0.645895 0.582249 -0.818953 + endloop + endfacet + facet normal -0.29943 0.896638 -0.326162 + outer loop + vertex -0.575724 0.633851 -0.741516 + vertex -0.645895 0.582249 -0.818953 + vertex -0.654313 0.609509 -0.736286 + endloop + endfacet + facet normal -0.383839 0.864617 -0.324199 + outer loop + vertex -0.654313 0.609509 -0.736286 + vertex -0.645895 0.582249 -0.818953 + vertex -0.718396 0.552782 -0.8117 + endloop + endfacet + facet normal -0.382974 0.864701 -0.324998 + outer loop + vertex -0.654313 0.609509 -0.736286 + vertex -0.718396 0.552782 -0.8117 + vertex -0.729251 0.578352 -0.730878 + endloop + endfacet + facet normal -0.467174 0.823009 -0.323116 + outer loop + vertex -0.729251 0.578352 -0.730878 + vertex -0.718396 0.552782 -0.8117 + vertex -0.786287 0.516834 -0.805104 + endloop + endfacet + facet normal -0.466511 0.823142 -0.323736 + outer loop + vertex -0.729251 0.578352 -0.730878 + vertex -0.786287 0.516834 -0.805104 + vertex -0.799694 0.540329 -0.726046 + endloop + endfacet + facet normal -0.549954 0.770523 -0.322249 + outer loop + vertex -0.799694 0.540329 -0.726046 + vertex -0.786287 0.516834 -0.805104 + vertex -0.848789 0.474247 -0.800266 + endloop + endfacet + facet normal -0.549351 0.770715 -0.322819 + outer loop + vertex -0.799694 0.540329 -0.726046 + vertex -0.848789 0.474247 -0.800266 + vertex -0.864802 0.495388 -0.722544 + endloop + endfacet + facet normal -0.630455 0.706286 -0.322005 + outer loop + vertex -0.864802 0.495388 -0.722544 + vertex -0.848789 0.474247 -0.800266 + vertex -0.905121 0.424866 -0.798286 + endloop + endfacet + facet normal -0.630064 0.706464 -0.322378 + outer loop + vertex -0.864802 0.495388 -0.722544 + vertex -0.905121 0.424866 -0.798286 + vertex -0.923732 0.443478 -0.721126 + endloop + endfacet + facet normal -0.0464682 0.915674 -0.399228 + outer loop + vertex -0.327179 0.635605 -0.836959 + vertex -0.327179 0.600474 -0.917536 + vertex -0.407447 0.597202 -0.915698 + endloop + endfacet + facet normal -0.0455517 0.915375 -0.400016 + outer loop + vertex -0.327179 0.635605 -0.836959 + vertex -0.407447 0.597202 -0.915698 + vertex -0.409251 0.632192 -0.835423 + endloop + endfacet + facet normal -0.134047 0.907322 -0.398495 + outer loop + vertex -0.409251 0.632192 -0.835423 + vertex -0.407447 0.597202 -0.915698 + vertex -0.486667 0.587614 -0.910881 + endloop + endfacet + facet normal -0.132557 0.906962 -0.399811 + outer loop + vertex -0.409251 0.632192 -0.835423 + vertex -0.486667 0.587614 -0.910881 + vertex -0.490365 0.622079 -0.831472 + endloop + endfacet + facet normal -0.217774 0.891565 -0.397097 + outer loop + vertex -0.490365 0.622079 -0.831472 + vertex -0.486667 0.587614 -0.910881 + vertex -0.563791 0.571936 -0.903784 + endloop + endfacet + facet normal -0.216537 0.891367 -0.398217 + outer loop + vertex -0.490365 0.622079 -0.831472 + vertex -0.563791 0.571936 -0.903784 + vertex -0.569566 0.605389 -0.825763 + endloop + endfacet + facet normal -0.299231 0.868747 -0.394639 + outer loop + vertex -0.569566 0.605389 -0.825763 + vertex -0.563791 0.571936 -0.903784 + vertex -0.637772 0.550399 -0.895101 + endloop + endfacet + facet normal -0.298618 0.868701 -0.395205 + outer loop + vertex -0.569566 0.605389 -0.825763 + vertex -0.637772 0.550399 -0.895101 + vertex -0.645895 0.582249 -0.818953 + endloop + endfacet + facet normal -0.379977 0.838229 -0.391139 + outer loop + vertex -0.645895 0.582249 -0.818953 + vertex -0.637772 0.550399 -0.895101 + vertex -0.70756 0.523228 -0.885532 + endloop + endfacet + facet normal -0.379827 0.838231 -0.39128 + outer loop + vertex -0.645895 0.582249 -0.818953 + vertex -0.70756 0.523228 -0.885532 + vertex -0.718396 0.552782 -0.8117 + endloop + endfacet + facet normal -0.460693 0.798606 -0.387286 + outer loop + vertex -0.718396 0.552782 -0.8117 + vertex -0.70756 0.523228 -0.885532 + vertex -0.772463 0.49009 -0.876659 + endloop + endfacet + facet normal -0.460515 0.798627 -0.387455 + outer loop + vertex -0.718396 0.552782 -0.8117 + vertex -0.772463 0.49009 -0.876659 + vertex -0.786287 0.516834 -0.805104 + endloop + endfacet + facet normal -0.54038 0.748593 -0.384184 + outer loop + vertex -0.786287 0.516834 -0.805104 + vertex -0.772463 0.49009 -0.876659 + vertex -0.831785 0.450651 -0.870068 + endloop + endfacet + facet normal -0.539916 0.748704 -0.384621 + outer loop + vertex -0.786287 0.516834 -0.805104 + vertex -0.831785 0.450651 -0.870068 + vertex -0.848789 0.474247 -0.800266 + endloop + endfacet + facet normal -0.616956 0.687653 -0.382751 + outer loop + vertex -0.848789 0.474247 -0.800266 + vertex -0.831785 0.450651 -0.870068 + vertex -0.88483 0.404576 -0.867343 + endloop + endfacet + facet normal -0.616443 0.687847 -0.383228 + outer loop + vertex -0.848789 0.474247 -0.800266 + vertex -0.88483 0.404576 -0.867343 + vertex -0.905121 0.424866 -0.798286 + endloop + endfacet + facet normal -0.0475431 0.874919 -0.48193 + outer loop + vertex -0.327179 0.600474 -0.917536 + vertex -0.327179 0.559548 -0.991836 + vertex -0.405975 0.556443 -0.9897 + endloop + endfacet + facet normal -0.0467026 0.874574 -0.482638 + outer loop + vertex -0.327179 0.600474 -0.917536 + vertex -0.405975 0.556443 -0.9897 + vertex -0.407447 0.597202 -0.915698 + endloop + endfacet + facet normal -0.135378 0.866719 -0.480074 + outer loop + vertex -0.407447 0.597202 -0.915698 + vertex -0.405975 0.556443 -0.9897 + vertex -0.483618 0.547478 -0.983989 + endloop + endfacet + facet normal -0.134109 0.8663 -0.481184 + outer loop + vertex -0.407447 0.597202 -0.915698 + vertex -0.483618 0.547478 -0.983989 + vertex -0.486667 0.587614 -0.910881 + endloop + endfacet + facet normal -0.217935 0.851656 -0.476641 + outer loop + vertex -0.486667 0.587614 -0.910881 + vertex -0.483618 0.547478 -0.983989 + vertex -0.558954 0.533007 -0.9754 + endloop + endfacet + facet normal -0.217012 0.851423 -0.477477 + outer loop + vertex -0.486667 0.587614 -0.910881 + vertex -0.558954 0.533007 -0.9754 + vertex -0.563791 0.571936 -0.903784 + endloop + endfacet + facet normal -0.297355 0.830274 -0.471407 + outer loop + vertex -0.563791 0.571936 -0.903784 + vertex -0.558954 0.533007 -0.9754 + vertex -0.630829 0.513379 -0.964632 + endloop + endfacet + facet normal -0.297057 0.830223 -0.471685 + outer loop + vertex -0.563791 0.571936 -0.903784 + vertex -0.630829 0.513379 -0.964632 + vertex -0.637772 0.550399 -0.895101 + endloop + endfacet + facet normal -0.375866 0.801874 -0.46446 + outer loop + vertex -0.637772 0.550399 -0.895101 + vertex -0.630829 0.513379 -0.964632 + vertex -0.698091 0.488947 -0.952382 + endloop + endfacet + facet normal -0.375876 0.801874 -0.464451 + outer loop + vertex -0.637772 0.550399 -0.895101 + vertex -0.698091 0.488947 -0.952382 + vertex -0.70756 0.523228 -0.885532 + endloop + endfacet + facet normal -0.452392 0.765917 -0.456851 + outer loop + vertex -0.70756 0.523228 -0.885532 + vertex -0.698091 0.488947 -0.952382 + vertex -0.759886 0.459485 -0.940583 + endloop + endfacet + facet normal -0.453375 0.765903 -0.455899 + outer loop + vertex -0.70756 0.523228 -0.885532 + vertex -0.759886 0.459485 -0.940583 + vertex -0.772463 0.49009 -0.876659 + endloop + endfacet + facet normal -0.527498 0.72117 -0.449066 + outer loop + vertex -0.772463 0.49009 -0.876659 + vertex -0.759886 0.459485 -0.940583 + vertex -0.815363 0.424769 -0.931169 + endloop + endfacet + facet normal -0.529048 0.720954 -0.447586 + outer loop + vertex -0.772463 0.49009 -0.876659 + vertex -0.815363 0.424769 -0.931169 + vertex -0.831785 0.450651 -0.870068 + endloop + endfacet + facet normal -0.600463 0.665528 -0.443302 + outer loop + vertex -0.831785 0.450651 -0.870068 + vertex -0.815363 0.424769 -0.931169 + vertex -0.863937 0.383682 -0.927058 + endloop + endfacet + facet normal -0.600759 0.665441 -0.443032 + outer loop + vertex -0.831785 0.450651 -0.870068 + vertex -0.863937 0.383682 -0.927058 + vertex -0.88483 0.404576 -0.867343 + endloop + endfacet + facet normal -0.0484136 0.819786 -0.570619 + outer loop + vertex -0.327179 0.559548 -0.991836 + vertex -0.327179 0.51239 -1.05958 + vertex -0.404978 0.509481 -1.05716 + endloop + endfacet + facet normal -0.0477763 0.819466 -0.571133 + outer loop + vertex -0.327179 0.559548 -0.991836 + vertex -0.404978 0.509481 -1.05716 + vertex -0.405975 0.556443 -0.9897 + endloop + endfacet + facet normal -0.136457 0.812111 -0.567323 + outer loop + vertex -0.405975 0.556443 -0.9897 + vertex -0.404978 0.509481 -1.05716 + vertex -0.481535 0.50123 -1.05056 + endloop + endfacet + facet normal -0.135503 0.811702 -0.568136 + outer loop + vertex -0.405975 0.556443 -0.9897 + vertex -0.481535 0.50123 -1.05056 + vertex -0.483618 0.547478 -0.983989 + endloop + endfacet + facet normal -0.218088 0.798289 -0.561402 + outer loop + vertex -0.483618 0.547478 -0.983989 + vertex -0.481535 0.50123 -1.05056 + vertex -0.555608 0.488114 -1.04044 + endloop + endfacet + facet normal -0.21737 0.798032 -0.562046 + outer loop + vertex -0.483618 0.547478 -0.983989 + vertex -0.555608 0.488114 -1.04044 + vertex -0.558954 0.533007 -0.9754 + endloop + endfacet + facet normal -0.295888 0.778939 -0.552906 + outer loop + vertex -0.558954 0.533007 -0.9754 + vertex -0.555608 0.488114 -1.04044 + vertex -0.625955 0.470611 -1.02745 + endloop + endfacet + facet normal -0.295566 0.778845 -0.553209 + outer loop + vertex -0.558954 0.533007 -0.9754 + vertex -0.625955 0.470611 -1.02745 + vertex -0.630829 0.513379 -0.964632 + endloop + endfacet + facet normal -0.372642 0.753359 -0.541838 + outer loop + vertex -0.630829 0.513379 -0.964632 + vertex -0.625955 0.470611 -1.02745 + vertex -0.691333 0.449197 -1.01226 + endloop + endfacet + facet normal -0.372365 0.753299 -0.542111 + outer loop + vertex -0.630829 0.513379 -0.964632 + vertex -0.691333 0.449197 -1.01226 + vertex -0.698091 0.488947 -0.952382 + endloop + endfacet + facet normal -0.44383 0.722683 -0.529853 + outer loop + vertex -0.698091 0.488947 -0.952382 + vertex -0.691333 0.449197 -1.01226 + vertex -0.750221 0.424405 -0.996746 + endloop + endfacet + facet normal -0.445493 0.722881 -0.528185 + outer loop + vertex -0.698091 0.488947 -0.952382 + vertex -0.750221 0.424405 -0.996746 + vertex -0.759886 0.459485 -0.940583 + endloop + endfacet + facet normal -0.513821 0.685106 -0.51635 + outer loop + vertex -0.759886 0.459485 -0.940583 + vertex -0.750221 0.424405 -0.996746 + vertex -0.801098 0.396771 -0.982784 + endloop + endfacet + facet normal -0.515976 0.685089 -0.51422 + outer loop + vertex -0.759886 0.459485 -0.940583 + vertex -0.801098 0.396771 -0.982784 + vertex -0.815363 0.424769 -0.931169 + endloop + endfacet + facet normal -0.581695 0.636739 -0.506156 + outer loop + vertex -0.815363 0.424769 -0.931169 + vertex -0.801098 0.396771 -0.982784 + vertex -0.843516 0.363261 -0.976191 + endloop + endfacet + facet normal -0.581483 0.636782 -0.506347 + outer loop + vertex -0.815363 0.424769 -0.931169 + vertex -0.843516 0.363261 -0.976191 + vertex -0.863937 0.383682 -0.927058 + endloop + endfacet + facet normal -0.0488427 0.748534 -0.661295 + outer loop + vertex -0.327179 0.51239 -1.05958 + vertex -0.327179 0.458568 -1.12051 + vertex -0.404598 0.455885 -1.11783 + endloop + endfacet + facet normal -0.0485713 0.748372 -0.661498 + outer loop + vertex -0.327179 0.51239 -1.05958 + vertex -0.404598 0.455885 -1.11783 + vertex -0.404978 0.509481 -1.05716 + endloop + endfacet + facet normal -0.13701 0.741915 -0.656347 + outer loop + vertex -0.404978 0.509481 -1.05716 + vertex -0.404598 0.455885 -1.11783 + vertex -0.480736 0.448425 -1.11037 + endloop + endfacet + facet normal -0.136575 0.741682 -0.6567 + outer loop + vertex -0.404978 0.509481 -1.05716 + vertex -0.480736 0.448425 -1.11037 + vertex -0.481535 0.50123 -1.05056 + endloop + endfacet + facet normal -0.218198 0.730102 -0.647566 + outer loop + vertex -0.481535 0.50123 -1.05056 + vertex -0.480736 0.448425 -1.11037 + vertex -0.554309 0.436772 -1.09871 + endloop + endfacet + facet normal -0.217805 0.729915 -0.647908 + outer loop + vertex -0.481535 0.50123 -1.05056 + vertex -0.554309 0.436772 -1.09871 + vertex -0.555608 0.488114 -1.04044 + endloop + endfacet + facet normal -0.295197 0.71363 -0.635288 + outer loop + vertex -0.555608 0.488114 -1.04044 + vertex -0.554309 0.436772 -1.09871 + vertex -0.624034 0.421514 -1.08345 + endloop + endfacet + facet normal -0.29487 0.713492 -0.635595 + outer loop + vertex -0.555608 0.488114 -1.04044 + vertex -0.624034 0.421514 -1.08345 + vertex -0.625955 0.470611 -1.02745 + endloop + endfacet + facet normal -0.371044 0.691939 -0.619312 + outer loop + vertex -0.625955 0.470611 -1.02745 + vertex -0.624034 0.421514 -1.08345 + vertex -0.688631 0.403235 -1.06518 + endloop + endfacet + facet normal -0.370577 0.691768 -0.619782 + outer loop + vertex -0.625955 0.470611 -1.02745 + vertex -0.688631 0.403235 -1.06518 + vertex -0.691333 0.449197 -1.01226 + endloop + endfacet + facet normal -0.439022 0.667106 -0.601855 + outer loop + vertex -0.691333 0.449197 -1.01226 + vertex -0.688631 0.403235 -1.06518 + vertex -0.746116 0.383347 -1.04529 + endloop + endfacet + facet normal -0.43935 0.667204 -0.601506 + outer loop + vertex -0.691333 0.449197 -1.01226 + vertex -0.746116 0.383347 -1.04529 + vertex -0.750221 0.424405 -0.996746 + endloop + endfacet + facet normal -0.505853 0.637047 -0.581622 + outer loop + vertex -0.750221 0.424405 -0.996746 + vertex -0.746116 0.383347 -1.04529 + vertex -0.794505 0.363261 -1.0252 + endloop + endfacet + facet normal -0.505665 0.637007 -0.581829 + outer loop + vertex -0.750221 0.424405 -0.996746 + vertex -0.794505 0.363261 -1.0252 + vertex -0.801098 0.396771 -0.982784 + endloop + endfacet + facet normal -0.568022 0.600567 -0.562734 + outer loop + vertex -0.801098 0.396771 -0.982784 + vertex -0.794505 0.363261 -1.0252 + vertex -0.827436 0.347181 -1.00912 + endloop + endfacet + facet normal -0.562735 0.600567 -0.568021 + outer loop + vertex -0.801098 0.396771 -0.982784 + vertex -0.827436 0.347181 -1.00912 + vertex -0.843516 0.363261 -0.976191 + endloop + endfacet + facet normal -0.0422553 0.992246 -0.116889 + outer loop + vertex -0.327179 0.726868 -0.457381 + vertex -0.416941 0.723104 -0.456883 + vertex -0.41827 0.735731 -0.34921 + endloop + endfacet + facet normal -0.0419438 0.992289 -0.11663 + outer loop + vertex -0.327179 0.726868 -0.457381 + vertex -0.41827 0.735731 -0.34921 + vertex -0.327179 0.739543 -0.349542 + endloop + endfacet + facet normal -0.0419616 0.995935 -0.079708 + outer loop + vertex -0.327179 0.739543 -0.349542 + vertex -0.41827 0.735731 -0.34921 + vertex -0.419288 0.7446 -0.237864 + endloop + endfacet + facet normal -0.0417472 0.995958 -0.0795322 + outer loop + vertex -0.327179 0.739543 -0.349542 + vertex -0.419288 0.7446 -0.237864 + vertex -0.327179 0.748444 -0.238072 + endloop + endfacet + facet normal -0.0417589 0.998167 -0.0437983 + outer loop + vertex -0.327179 0.748444 -0.238072 + vertex -0.419288 0.7446 -0.237864 + vertex -0.420061 0.749558 -0.124123 + endloop + endfacet + facet normal -0.0415597 0.998183 -0.043636 + outer loop + vertex -0.327179 0.748444 -0.238072 + vertex -0.420061 0.749558 -0.124123 + vertex -0.327179 0.75342 -0.124242 + endloop + endfacet + facet normal -0.0415525 0.999104 -0.00802147 + outer loop + vertex -0.327179 0.75342 -0.124242 + vertex -0.420061 0.749558 -0.124123 + vertex -0.42066 0.750456 -0.00926336 + endloop + endfacet + facet normal -0.0412978 0.999116 -0.00781407 + outer loop + vertex -0.327179 0.75342 -0.124242 + vertex -0.42066 0.750456 -0.00926336 + vertex -0.327179 0.754319 -0.0093227 + endloop + endfacet + facet normal -0.0412589 0.998737 0.0286893 + outer loop + vertex -0.327179 0.754319 -0.0093227 + vertex -0.42066 0.750456 -0.00926336 + vertex -0.42115 0.747141 0.105437 + endloop + endfacet + facet normal -0.0408898 0.998743 0.0289919 + outer loop + vertex -0.327179 0.754319 -0.0093227 + vertex -0.42115 0.747141 0.105437 + vertex -0.327179 0.750989 0.105413 + endloop + endfacet + facet normal -0.0406201 0.992678 0.113757 + outer loop + vertex -0.327179 0.750989 0.105413 + vertex -0.42115 0.747141 0.105437 + vertex -0.421763 0.734729 0.213522 + endloop + endfacet + facet normal -0.0398127 0.99263 0.114456 + outer loop + vertex -0.327179 0.750989 0.105413 + vertex -0.421763 0.734729 0.213522 + vertex -0.327179 0.738524 0.213516 + endloop + endfacet + facet normal -0.0386107 0.962906 0.267061 + outer loop + vertex -0.327179 0.738524 0.213516 + vertex -0.421763 0.734729 0.213522 + vertex -0.422729 0.708338 0.308537 + endloop + endfacet + facet normal -0.0370842 0.962569 0.268489 + outer loop + vertex -0.327179 0.738524 0.213516 + vertex -0.422729 0.708338 0.308537 + vertex -0.327179 0.712019 0.308537 + endloop + endfacet + facet normal -0.033037 0.857519 0.513391 + outer loop + vertex -0.327179 0.712019 0.308537 + vertex -0.422729 0.708338 0.308537 + vertex -0.424276 0.663083 0.384027 + endloop + endfacet + facet normal -0.0307591 0.856313 0.51554 + outer loop + vertex -0.327179 0.712019 0.308537 + vertex -0.424276 0.663083 0.384027 + vertex -0.327179 0.666571 0.384027 + endloop + endfacet + facet normal -0.12675 0.984922 -0.117745 + outer loop + vertex -0.416941 0.723104 -0.456883 + vertex -0.505771 0.711821 -0.455637 + vertex -0.508415 0.724304 -0.348379 + endloop + endfacet + facet normal -0.125964 0.985101 -0.117084 + outer loop + vertex -0.416941 0.723104 -0.456883 + vertex -0.508415 0.724304 -0.348379 + vertex -0.41827 0.735731 -0.34921 + endloop + endfacet + facet normal -0.126089 0.988756 -0.0803896 + outer loop + vertex -0.41827 0.735731 -0.34921 + vertex -0.508415 0.724304 -0.348379 + vertex -0.510432 0.733073 -0.237353 + endloop + endfacet + facet normal -0.125508 0.988869 -0.0799087 + outer loop + vertex -0.41827 0.735731 -0.34921 + vertex -0.510432 0.733073 -0.237353 + vertex -0.419288 0.7446 -0.237864 + endloop + endfacet + facet normal -0.12559 0.991081 -0.0445669 + outer loop + vertex -0.419288 0.7446 -0.237864 + vertex -0.510432 0.733073 -0.237353 + vertex -0.51195 0.737984 -0.123858 + endloop + endfacet + facet normal -0.124973 0.991181 -0.0440598 + outer loop + vertex -0.419288 0.7446 -0.237864 + vertex -0.51195 0.737984 -0.123858 + vertex -0.420061 0.749558 -0.124123 + endloop + endfacet + facet normal -0.12499 0.992116 -0.00909641 + outer loop + vertex -0.420061 0.749558 -0.124123 + vertex -0.51195 0.737984 -0.123858 + vertex -0.513098 0.738891 -0.00919506 + endloop + endfacet + facet normal -0.12414 0.992229 -0.0083979 + outer loop + vertex -0.420061 0.749558 -0.124123 + vertex -0.513098 0.738891 -0.00919506 + vertex -0.42066 0.750456 -0.00926336 + endloop + endfacet + facet normal -0.124073 0.991903 0.027113 + outer loop + vertex -0.42066 0.750456 -0.00926336 + vertex -0.513098 0.738891 -0.00919506 + vertex -0.514005 0.735647 0.105336 + endloop + endfacet + facet normal -0.122824 0.992029 0.0281465 + outer loop + vertex -0.42066 0.750456 -0.00926336 + vertex -0.514005 0.735647 0.105336 + vertex -0.42115 0.747141 0.105437 + endloop + endfacet + facet normal -0.122211 0.986356 0.110304 + outer loop + vertex -0.42115 0.747141 0.105437 + vertex -0.514005 0.735647 0.105336 + vertex -0.515157 0.723433 0.213278 + endloop + endfacet + facet normal -0.119604 0.986417 0.11259 + outer loop + vertex -0.42115 0.747141 0.105437 + vertex -0.515157 0.723433 0.213278 + vertex -0.421763 0.734729 0.213522 + endloop + endfacet + facet normal -0.116608 0.958457 0.260313 + outer loop + vertex -0.421763 0.734729 0.213522 + vertex -0.515157 0.723433 0.213278 + vertex -0.517041 0.69743 0.308176 + endloop + endfacet + facet normal -0.111791 0.957776 0.264893 + outer loop + vertex -0.421763 0.734729 0.213522 + vertex -0.517041 0.69743 0.308176 + vertex -0.422729 0.708338 0.308537 + endloop + endfacet + facet normal -0.101169 0.858036 0.503527 + outer loop + vertex -0.422729 0.708338 0.308537 + vertex -0.517041 0.69743 0.308176 + vertex -0.520144 0.652819 0.383572 + endloop + endfacet + facet normal -0.0939382 0.854743 0.510479 + outer loop + vertex -0.422729 0.708338 0.308537 + vertex -0.520144 0.652819 0.383572 + vertex -0.424276 0.663083 0.384027 + endloop + endfacet + facet normal -0.211993 0.969991 -0.119066 + outer loop + vertex -0.505771 0.711821 -0.455637 + vertex -0.592737 0.693029 -0.453892 + vertex -0.596666 0.705265 -0.347216 + endloop + endfacet + facet normal -0.210893 0.970346 -0.118123 + outer loop + vertex -0.505771 0.711821 -0.455637 + vertex -0.596666 0.705265 -0.347216 + vertex -0.508415 0.724304 -0.348379 + endloop + endfacet + facet normal -0.211207 0.974037 -0.0815011 + outer loop + vertex -0.508415 0.724304 -0.348379 + vertex -0.596666 0.705265 -0.347216 + vertex -0.599645 0.71387 -0.23665 + endloop + endfacet + facet normal -0.210349 0.974284 -0.080777 + outer loop + vertex -0.508415 0.724304 -0.348379 + vertex -0.599645 0.71387 -0.23665 + vertex -0.510432 0.733073 -0.237353 + endloop + endfacet + facet normal -0.210552 0.976505 -0.0458905 + outer loop + vertex -0.510432 0.733073 -0.237353 + vertex -0.599645 0.71387 -0.23665 + vertex -0.601849 0.718711 -0.123539 + endloop + endfacet + facet normal -0.20957 0.976754 -0.0450704 + outer loop + vertex -0.510432 0.733073 -0.237353 + vertex -0.601849 0.718711 -0.123539 + vertex -0.51195 0.737984 -0.123858 + endloop + endfacet + facet normal -0.209655 0.977714 -0.0109858 + outer loop + vertex -0.51195 0.737984 -0.123858 + vertex -0.601849 0.718711 -0.123539 + vertex -0.603451 0.719652 -0.00922753 + endloop + endfacet + facet normal -0.208255 0.978025 -0.00981884 + outer loop + vertex -0.51195 0.737984 -0.123858 + vertex -0.603451 0.719652 -0.00922753 + vertex -0.513098 0.738891 -0.00919506 + endloop + endfacet + facet normal -0.208215 0.97778 0.0243512 + outer loop + vertex -0.513098 0.738891 -0.00919506 + vertex -0.603451 0.719652 -0.00922753 + vertex -0.604624 0.716558 0.104939 + endloop + endfacet + facet normal -0.206162 0.97817 0.0260742 + outer loop + vertex -0.513098 0.738891 -0.00919506 + vertex -0.604624 0.716558 0.104939 + vertex -0.514005 0.735647 0.105336 + endloop + endfacet + facet normal -0.205439 0.973116 0.104119 + outer loop + vertex -0.514005 0.735647 0.105336 + vertex -0.604624 0.716558 0.104939 + vertex -0.606168 0.704722 0.212524 + endloop + endfacet + facet normal -0.201066 0.973604 0.10802 + outer loop + vertex -0.514005 0.735647 0.105336 + vertex -0.606168 0.704722 0.212524 + vertex -0.515157 0.723433 0.213278 + endloop + endfacet + facet normal -0.197066 0.948502 0.24801 + outer loop + vertex -0.515157 0.723433 0.213278 + vertex -0.606168 0.704722 0.212524 + vertex -0.608879 0.679431 0.307092 + endloop + endfacet + facet normal -0.188828 0.948048 0.256027 + outer loop + vertex -0.515157 0.723433 0.213278 + vertex -0.608879 0.679431 0.307092 + vertex -0.517041 0.69743 0.308176 + endloop + endfacet + facet normal -0.173704 0.857086 0.485005 + outer loop + vertex -0.517041 0.69743 0.308176 + vertex -0.608879 0.679431 0.307092 + vertex -0.613556 0.635977 0.382207 + endloop + endfacet + facet normal -0.160939 0.852302 0.497675 + outer loop + vertex -0.517041 0.69743 0.308176 + vertex -0.613556 0.635977 0.382207 + vertex -0.520144 0.652819 0.383572 + endloop + endfacet + facet normal -0.298598 0.946715 -0.120702 + outer loop + vertex -0.592737 0.693029 -0.453892 + vertex -0.676908 0.666736 -0.451898 + vertex -0.682076 0.678621 -0.345887 + endloop + endfacet + facet normal -0.297352 0.947247 -0.119601 + outer loop + vertex -0.592737 0.693029 -0.453892 + vertex -0.682076 0.678621 -0.345887 + vertex -0.596666 0.705265 -0.347216 + endloop + endfacet + facet normal -0.297944 0.950975 -0.0829247 + outer loop + vertex -0.596666 0.705265 -0.347216 + vertex -0.682076 0.678621 -0.345887 + vertex -0.685963 0.686997 -0.235868 + endloop + endfacet + facet normal -0.296929 0.951368 -0.0820467 + outer loop + vertex -0.596666 0.705265 -0.347216 + vertex -0.685963 0.686997 -0.235868 + vertex -0.599645 0.71387 -0.23665 + endloop + endfacet + facet normal -0.29731 0.953592 -0.0476354 + outer loop + vertex -0.599645 0.71387 -0.23665 + vertex -0.685963 0.686997 -0.235868 + vertex -0.688765 0.691749 -0.123256 + endloop + endfacet + facet normal -0.296093 0.954022 -0.0465951 + outer loop + vertex -0.599645 0.71387 -0.23665 + vertex -0.688765 0.691749 -0.123256 + vertex -0.601849 0.718711 -0.123539 + endloop + endfacet + facet normal -0.29629 0.955003 -0.0134867 + outer loop + vertex -0.601849 0.718711 -0.123539 + vertex -0.688765 0.691749 -0.123256 + vertex -0.690676 0.692763 -0.00947047 + endloop + endfacet + facet normal -0.294536 0.955565 -0.011993 + outer loop + vertex -0.601849 0.718711 -0.123539 + vertex -0.690676 0.692763 -0.00947047 + vertex -0.603451 0.719652 -0.00922753 + endloop + endfacet + facet normal -0.294577 0.955403 0.0207245 + outer loop + vertex -0.603451 0.719652 -0.00922753 + vertex -0.690676 0.692763 -0.00947047 + vertex -0.691892 0.689925 0.104073 + endloop + endfacet + facet normal -0.292031 0.956134 0.0229033 + outer loop + vertex -0.603451 0.719652 -0.00922753 + vertex -0.691892 0.689925 0.104073 + vertex -0.604624 0.716558 0.104939 + endloop + endfacet + facet normal -0.291434 0.951819 0.0954258 + outer loop + vertex -0.604624 0.716558 0.104939 + vertex -0.691892 0.689925 0.104073 + vertex -0.693604 0.678681 0.210997 + endloop + endfacet + facet normal -0.285595 0.953039 0.10076 + outer loop + vertex -0.604624 0.716558 0.104939 + vertex -0.693604 0.678681 0.210997 + vertex -0.606168 0.704722 0.212524 + endloop + endfacet + facet normal -0.281472 0.931625 0.229887 + outer loop + vertex -0.606168 0.704722 0.212524 + vertex -0.693604 0.678681 0.210997 + vertex -0.697004 0.654477 0.304924 + endloop + endfacet + facet normal -0.269887 0.932106 0.241537 + outer loop + vertex -0.606168 0.704722 0.212524 + vertex -0.697004 0.654477 0.304924 + vertex -0.608879 0.679431 0.307092 + endloop + endfacet + facet normal -0.252831 0.853222 0.456167 + outer loop + vertex -0.608879 0.679431 0.307092 + vertex -0.697004 0.654477 0.304924 + vertex -0.703282 0.612758 0.379476 + endloop + endfacet + facet normal -0.233889 0.847828 0.475902 + outer loop + vertex -0.608879 0.679431 0.307092 + vertex -0.703282 0.612758 0.379476 + vertex -0.613556 0.635977 0.382207 + endloop + endfacet + facet normal -0.386895 0.913954 -0.122472 + outer loop + vertex -0.676908 0.666736 -0.451898 + vertex -0.757349 0.63295 -0.449905 + vertex -0.763699 0.644379 -0.344558 + endloop + endfacet + facet normal -0.385678 0.914618 -0.121349 + outer loop + vertex -0.676908 0.666736 -0.451898 + vertex -0.763699 0.644379 -0.344558 + vertex -0.682076 0.678621 -0.345887 + endloop + endfacet + facet normal -0.386643 0.91835 -0.0844948 + outer loop + vertex -0.682076 0.678621 -0.345887 + vertex -0.763699 0.644379 -0.344558 + vertex -0.768421 0.65246 -0.235117 + endloop + endfacet + facet normal -0.385622 0.918863 -0.0835779 + outer loop + vertex -0.682076 0.678621 -0.345887 + vertex -0.768421 0.65246 -0.235117 + vertex -0.685963 0.686997 -0.235868 + endloop + endfacet + facet normal -0.386236 0.921067 -0.0495632 + outer loop + vertex -0.685963 0.686997 -0.235868 + vertex -0.768421 0.65246 -0.235117 + vertex -0.771702 0.657112 -0.123102 + endloop + endfacet + facet normal -0.384997 0.921644 -0.0484687 + outer loop + vertex -0.685963 0.686997 -0.235868 + vertex -0.771702 0.657112 -0.123102 + vertex -0.688765 0.691749 -0.123256 + endloop + endfacet + facet normal -0.385349 0.922629 -0.0162111 + outer loop + vertex -0.688765 0.691749 -0.123256 + vertex -0.771702 0.657112 -0.123102 + vertex -0.77373 0.658252 -0.0100336 + endloop + endfacet + facet normal -0.383595 0.923385 -0.0146712 + outer loop + vertex -0.688765 0.691749 -0.123256 + vertex -0.77373 0.658252 -0.0100336 + vertex -0.690676 0.692763 -0.00947047 + endloop + endfacet + facet normal -0.383764 0.923278 0.0168496 + outer loop + vertex -0.690676 0.692763 -0.00947047 + vertex -0.77373 0.658252 -0.0100336 + vertex -0.77469 0.655798 0.102567 + endloop + endfacet + facet normal -0.381303 0.924254 0.0190171 + outer loop + vertex -0.690676 0.692763 -0.00947047 + vertex -0.77469 0.655798 0.102567 + vertex -0.691892 0.689925 0.104073 + endloop + endfacet + facet normal -0.381023 0.920675 0.0847286 + outer loop + vertex -0.691892 0.689925 0.104073 + vertex -0.77469 0.655798 0.102567 + vertex -0.776276 0.645398 0.208436 + endloop + endfacet + facet normal -0.374336 0.922813 0.0910478 + outer loop + vertex -0.691892 0.689925 0.104073 + vertex -0.776276 0.645398 0.208436 + vertex -0.693604 0.678681 0.210997 + endloop + endfacet + facet normal -0.370951 0.905583 0.205707 + outer loop + vertex -0.693604 0.678681 0.210997 + vertex -0.776276 0.645398 0.208436 + vertex -0.78018 0.622703 0.30131 + endloop + endfacet + facet normal -0.356398 0.907812 0.221038 + outer loop + vertex -0.693604 0.678681 0.210997 + vertex -0.78018 0.622703 0.30131 + vertex -0.697004 0.654477 0.304924 + endloop + endfacet + facet normal -0.340423 0.843993 0.414473 + outer loop + vertex -0.697004 0.654477 0.304924 + vertex -0.78018 0.622703 0.30131 + vertex -0.788094 0.583359 0.374925 + endloop + endfacet + facet normal -0.314732 0.839358 0.443196 + outer loop + vertex -0.697004 0.654477 0.304924 + vertex -0.788094 0.583359 0.374925 + vertex -0.703282 0.612758 0.379476 + endloop + endfacet + facet normal -0.476759 0.870222 -0.124156 + outer loop + vertex -0.757349 0.63295 -0.449905 + vertex -0.833131 0.591681 -0.44816 + vertex -0.840587 0.602544 -0.343395 + endloop + endfacet + facet normal -0.475737 0.870922 -0.123158 + outer loop + vertex -0.757349 0.63295 -0.449905 + vertex -0.840587 0.602544 -0.343395 + vertex -0.763699 0.644379 -0.344558 + endloop + endfacet + facet normal -0.477173 0.874593 -0.0859817 + outer loop + vertex -0.763699 0.644379 -0.344558 + vertex -0.840587 0.602544 -0.343395 + vertex -0.846068 0.610261 -0.234478 + endloop + endfacet + facet normal -0.476318 0.875138 -0.0851731 + outer loop + vertex -0.763699 0.644379 -0.344558 + vertex -0.846068 0.610261 -0.234478 + vertex -0.768421 0.65246 -0.235117 + endloop + endfacet + facet normal -0.477208 0.877289 -0.0513495 + outer loop + vertex -0.768421 0.65246 -0.235117 + vertex -0.846068 0.610261 -0.234478 + vertex -0.84973 0.614792 -0.123039 + endloop + endfacet + facet normal -0.476189 0.877897 -0.0504055 + outer loop + vertex -0.768421 0.65246 -0.235117 + vertex -0.84973 0.614792 -0.123039 + vertex -0.771702 0.657112 -0.123102 + endloop + endfacet + facet normal -0.476692 0.878872 -0.0186715 + outer loop + vertex -0.771702 0.657112 -0.123102 + vertex -0.84973 0.614792 -0.123039 + vertex -0.851727 0.616095 -0.0107065 + endloop + endfacet + facet normal -0.475294 0.879655 -0.0173907 + outer loop + vertex -0.771702 0.657112 -0.123102 + vertex -0.851727 0.616095 -0.0107065 + vertex -0.77373 0.658252 -0.0100336 + endloop + endfacet + facet normal -0.475529 0.879598 0.0134134 + outer loop + vertex -0.77373 0.658252 -0.0100336 + vertex -0.851727 0.616095 -0.0107065 + vertex -0.852215 0.614129 0.100889 + endloop + endfacet + facet normal -0.47363 0.880593 0.0151528 + outer loop + vertex -0.77373 0.658252 -0.0100336 + vertex -0.852215 0.614129 0.100889 + vertex -0.77469 0.655798 0.102567 + endloop + endfacet + facet normal -0.473401 0.877855 0.072547 + outer loop + vertex -0.77469 0.655798 0.102567 + vertex -0.852215 0.614129 0.100889 + vertex -0.852933 0.605139 0.204991 + endloop + endfacet + facet normal -0.466289 0.881048 0.0795589 + outer loop + vertex -0.77469 0.655798 0.102567 + vertex -0.852933 0.605139 0.204991 + vertex -0.776276 0.645398 0.208436 + endloop + endfacet + facet normal -0.463839 0.868032 0.177127 + outer loop + vertex -0.776276 0.645398 0.208436 + vertex -0.852933 0.605139 0.204991 + vertex -0.85562 0.585368 0.294843 + endloop + endfacet + facet normal -0.448416 0.872439 0.194351 + outer loop + vertex -0.776276 0.645398 0.208436 + vertex -0.85562 0.585368 0.294843 + vertex -0.78018 0.622703 0.30131 + endloop + endfacet + facet normal -0.438231 0.822864 0.36173 + outer loop + vertex -0.78018 0.622703 0.30131 + vertex -0.85562 0.585368 0.294843 + vertex -0.86376 0.550085 0.365244 + endloop + endfacet + facet normal -0.411709 0.821392 0.39473 + outer loop + vertex -0.78018 0.622703 0.30131 + vertex -0.86376 0.550085 0.365244 + vertex -0.788094 0.583359 0.374925 + endloop + endfacet + facet normal -0.567392 0.81383 -0.12549 + outer loop + vertex -0.833131 0.591681 -0.44816 + vertex -0.90332 0.542939 -0.446914 + vertex -0.911794 0.553121 -0.342564 + endloop + endfacet + facet normal -0.566714 0.814413 -0.124772 + outer loop + vertex -0.833131 0.591681 -0.44816 + vertex -0.911794 0.553121 -0.342564 + vertex -0.840587 0.602544 -0.343395 + endloop + endfacet + facet normal -0.568704 0.817913 -0.0871441 + outer loop + vertex -0.840587 0.602544 -0.343395 + vertex -0.911794 0.553121 -0.342564 + vertex -0.917956 0.5604 -0.234031 + endloop + endfacet + facet normal -0.568145 0.818362 -0.0865755 + outer loop + vertex -0.840587 0.602544 -0.343395 + vertex -0.917956 0.5604 -0.234031 + vertex -0.846068 0.610261 -0.234478 + endloop + endfacet + facet normal -0.569351 0.820404 -0.0526921 + outer loop + vertex -0.846068 0.610261 -0.234478 + vertex -0.917956 0.5604 -0.234031 + vertex -0.921915 0.564782 -0.12303 + endloop + endfacet + facet normal -0.568715 0.820886 -0.0520628 + outer loop + vertex -0.846068 0.610261 -0.234478 + vertex -0.921915 0.564782 -0.12303 + vertex -0.84973 0.614792 -0.123039 + endloop + endfacet + facet normal -0.569365 0.82183 -0.0204611 + outer loop + vertex -0.84973 0.614792 -0.123039 + vertex -0.921915 0.564782 -0.12303 + vertex -0.923782 0.566271 -0.0112786 + endloop + endfacet + facet normal -0.568531 0.822427 -0.0196495 + outer loop + vertex -0.84973 0.614792 -0.123039 + vertex -0.923782 0.566271 -0.0112786 + vertex -0.851727 0.616095 -0.0107065 + endloop + endfacet + facet normal -0.568771 0.822422 0.0109736 + outer loop + vertex -0.851727 0.616095 -0.0107065 + vertex -0.923782 0.566271 -0.0112786 + vertex -0.923665 0.564873 0.0995073 + endloop + endfacet + facet normal -0.567694 0.823152 0.0120156 + outer loop + vertex -0.851727 0.616095 -0.0107065 + vertex -0.923665 0.564873 0.0995073 + vertex -0.852215 0.614129 0.100889 + endloop + endfacet + facet normal -0.567302 0.821185 0.0618336 + outer loop + vertex -0.852215 0.614129 0.100889 + vertex -0.923665 0.564873 0.0995073 + vertex -0.92233 0.558168 0.20081 + endloop + endfacet + facet normal -0.562031 0.824372 0.0673168 + outer loop + vertex -0.852215 0.614129 0.100889 + vertex -0.92233 0.558168 0.20081 + vertex -0.852933 0.605139 0.204991 + endloop + endfacet + facet normal -0.560226 0.81407 0.153093 + outer loop + vertex -0.852933 0.605139 0.204991 + vertex -0.92233 0.558168 0.20081 + vertex -0.920541 0.543733 0.284113 + endloop + endfacet + facet normal -0.551584 0.817942 0.163482 + outer loop + vertex -0.852933 0.605139 0.204991 + vertex -0.920541 0.543733 0.284113 + vertex -0.85562 0.585368 0.294843 + endloop + endfacet + facet normal -0.54939 0.778322 0.303951 + outer loop + vertex -0.85562 0.585368 0.294843 + vertex -0.920541 0.543733 0.284113 + vertex -0.926049 0.515237 0.347126 + endloop + endfacet + facet normal -0.532151 0.779957 0.329367 + outer loop + vertex -0.85562 0.585368 0.294843 + vertex -0.926049 0.515237 0.347126 + vertex -0.86376 0.550085 0.365244 + endloop + endfacet + facet normal -0.657109 0.743161 -0.126172 + outer loop + vertex -0.90332 0.542939 -0.446914 + vertex -0.966985 0.48673 -0.446415 + vertex -0.976372 0.496118 -0.342232 + endloop + endfacet + facet normal -0.656867 0.743424 -0.125886 + outer loop + vertex -0.90332 0.542939 -0.446914 + vertex -0.976372 0.496118 -0.342232 + vertex -0.911794 0.553121 -0.342564 + endloop + endfacet + facet normal -0.659469 0.746595 -0.087732 + outer loop + vertex -0.911794 0.553121 -0.342564 + vertex -0.976372 0.496118 -0.342232 + vertex -0.983135 0.50288 -0.233855 + endloop + endfacet + facet normal -0.659278 0.746789 -0.0875164 + outer loop + vertex -0.911794 0.553121 -0.342564 + vertex -0.983135 0.50288 -0.233855 + vertex -0.917956 0.5604 -0.234031 + endloop + endfacet + facet normal -0.660823 0.748644 -0.0533393 + outer loop + vertex -0.917956 0.5604 -0.234031 + vertex -0.983135 0.50288 -0.233855 + vertex -0.987328 0.507074 -0.123039 + endloop + endfacet + facet normal -0.660624 0.748835 -0.0531232 + outer loop + vertex -0.917956 0.5604 -0.234031 + vertex -0.987328 0.507074 -0.123039 + vertex -0.921915 0.564782 -0.12303 + endloop + endfacet + facet normal -0.66141 0.749722 -0.0212859 + outer loop + vertex -0.921915 0.564782 -0.12303 + vertex -0.987328 0.507074 -0.123039 + vertex -0.98901 0.508756 -0.0115394 + endloop + endfacet + facet normal -0.661176 0.749936 -0.0210368 + outer loop + vertex -0.921915 0.564782 -0.12303 + vertex -0.98901 0.508756 -0.0115394 + vertex -0.923782 0.566271 -0.0112786 + endloop + endfacet + facet normal -0.661359 0.750004 0.00987881 + outer loop + vertex -0.923782 0.566271 -0.0112786 + vertex -0.98901 0.508756 -0.0115394 + vertex -0.988237 0.507983 0.0988907 + endloop + endfacet + facet normal -0.661089 0.750238 0.0101605 + outer loop + vertex -0.923782 0.566271 -0.0112786 + vertex -0.988237 0.507983 0.0988907 + vertex -0.923665 0.564873 0.0995073 + endloop + endfacet + facet normal -0.660314 0.748855 0.0565847 + outer loop + vertex -0.923665 0.564873 0.0995073 + vertex -0.988237 0.507983 0.0988907 + vertex -0.984236 0.503981 0.198536 + endloop + endfacet + facet normal -0.658724 0.75012 0.0583349 + outer loop + vertex -0.923665 0.564873 0.0995073 + vertex -0.984236 0.503981 0.198536 + vertex -0.92233 0.558168 0.20081 + endloop + endfacet + facet normal -0.65496 0.742338 0.141285 + outer loop + vertex -0.92233 0.558168 0.20081 + vertex -0.984236 0.503981 0.198536 + vertex -0.976233 0.495979 0.277683 + endloop + endfacet + facet normal -0.653714 0.743144 0.142811 + outer loop + vertex -0.92233 0.558168 0.20081 + vertex -0.976233 0.495979 0.277683 + vertex -0.920541 0.543733 0.284113 + endloop + endfacet + facet normal -0.644467 0.715155 0.270584 + outer loop + vertex -0.920541 0.543733 0.284113 + vertex -0.976233 0.495979 0.277683 + vertex -0.966663 0.486408 0.325773 + endloop + endfacet + facet normal -0.647131 0.714299 0.266456 + outer loop + vertex -0.920541 0.543733 0.284113 + vertex -0.966663 0.486408 0.325773 + vertex -0.926049 0.515237 0.347126 + endloop + endfacet +endsolid patch1 diff --git a/tutorials/mesh/cvMesh/blob/system/collapseDict b/tutorials/mesh/cvMesh/blob/system/collapseDict new file mode 100644 index 0000000000000000000000000000000000000000..4948b7a61dddeec6c67cc7210ed6cbd1007d222c --- /dev/null +++ b/tutorials/mesh/cvMesh/blob/system/collapseDict @@ -0,0 +1,54 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: dev | +| \\ / A nd | Web: www.OpenFOAM.org | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ + +FoamFile +{ + version 2.0; + format ascii; + + root ""; + case ""; + instance ""; + local ""; + + class dictionary; + object collapseDict; +} + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +collapseEdgesCoeffs +{ + minimumEdgeLength 1e-4; + maximumMergeAngle 180; + reductionFactor 0.5; +} + + +collapseFacesCoeffs +{ + initialFaceLengthFactor 0.5; + reductionFactor 0.5; + + allowEarlyCollapseToPoint on; + allowEarlyCollapseCoeff 0.2; + guardFraction 0.1; + maxCollapseFaceToPointSideLengthCoeff 0.3; +} + + +meshQualityCoeffs +{ + #include "meshQualityDict"; + maximumIterations 10; + maximumSmoothingIterations 1; + maxPointErrorCount 5; +} + + +// ************************************************************************* // diff --git a/tutorials/mesh/cvMesh/blob/system/controlDict b/tutorials/mesh/cvMesh/blob/system/controlDict new file mode 100644 index 0000000000000000000000000000000000000000..56534bc1d5ad67209fb7d79524d0684cc1d0e4f6 --- /dev/null +++ b/tutorials/mesh/cvMesh/blob/system/controlDict @@ -0,0 +1,53 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: dev | +| \\ / A nd | Web: www.OpenFOAM.org | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ + +FoamFile +{ + version 2.0; + format ascii; + + root ""; + case ""; + instance ""; + local ""; + + class dictionary; + object controlDict; +} + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +startFrom startTime; + +startTime 0; + +stopAt endTime; + +endTime 80; + +deltaT 1; + +writeControl timeStep; + +writeInterval 80; + +purgeWrite 0; + +writeFormat ascii; + +writePrecision 12; + +writeCompression uncompressed; + +timeFormat general; + +timePrecision 6; + +runTimeModifiable yes; + +// ************************************************************************* // diff --git a/tutorials/mesh/cvMesh/blob/system/cvMeshDict b/tutorials/mesh/cvMesh/blob/system/cvMeshDict new file mode 100644 index 0000000000000000000000000000000000000000..eda52324f55ca0fdb1431ce058ee1304f61ab4de --- /dev/null +++ b/tutorials/mesh/cvMesh/blob/system/cvMeshDict @@ -0,0 +1,212 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: dev | +| \\ / A nd | Web: www.OpenFOAM.org | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ + +FoamFile +{ + version 2.0; + format ascii; + + root ""; + case ""; + instance ""; + local ""; + + class dictionary; + object cvMeshDict; +} + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +// Any scalar with a name <name>Coeff specifies a value that will be implemented +// as a faction of the local target cell size + +geometry +{ + blob.stl + { + type triSurfaceMesh; + } + + refinementBox + { + type searchableBox; + min (-0.2 -0.6 -0.2); + max ( 0.4 0.2 0.35); + } +} + + +backgroundMeshDecomposition +{ + minLevels 0; + sampleResolution 4; + spanScale 20; + maxCellWeightCoeff 20; +} + + +initialPoints +{ + minimumSurfaceDistanceCoeff 0.55; + + initialPointsMethod autoDensity; + // initialPointsMethod pointFile; + + autoDensityCoeffs + { + minLevels 0; + maxSizeRatio 5.0; + sampleResolution 5; + surfaceSampleResolution 5; + } + + pointFileCoeffs + { + pointFile "constant/internalDelaunayVertices"; + } +} + + +surfaceConformation +{ + locationInMesh (0.1 0.1 0.2); + + pointPairDistanceCoeff 0.1; + + mixedFeaturePointPPDistanceCoeff 5.0; + + featurePointExclusionDistanceCoeff 0.4; + + featureEdgeExclusionDistanceCoeff 0.2; + + surfaceSearchDistanceCoeff 5; + + nearBoundaryDistanceCoeff 5; + + maxSurfaceProtrusionCoeff 0.001; + + maxQuadAngle 125; + + surfaceConformationRebuildFrequency 10; + + specialiseFeaturePoints off; + + conformationControls + { + edgeSearchDistCoeff 5; + surfacePtReplaceDistCoeff 0.5; + surfacePtExclusionDistanceCoeff 0.5; + + maxIterations 15; + + iterationToInitialHitRatioLimit 0.0001; + } + + geometryToConformTo + { + blob.stl + { + featureMethod none; + } + } + + additionalFeatures + { + } +} + + +motionControl +{ + defaultCellSize 0.1; + + shapeControlFunctions + { + blob.stl + { + type searchableSurfaceControl; + priority 1; + mode bothSides; + + surfaceCellSizeFunction uniformValue; + uniformValueCoeffs + { + surfaceCellSize $defaultCellSize; + } + + cellSizeFunction uniform; + uniformCoeffs + {} + } + } + + maxRefinementIterations 1; + + cellAspectRatioControl + { + aspectRatio 1.0; + aspectRatioDirection (1 0 0); + } + + relaxationModel adaptiveLinear; + + adaptiveLinearCoeffs + { + relaxationStart 1.0; + relaxationEnd 0.0; + } + + objOutput no; + + timeChecks no; + + maxLoadUnbalance 0.5; + + alignmentSearchSpokes 24; + + alignmentAcceptanceAngle 48; + + sizeAndAlignmentRebuildFrequency 40; + + pointInsertionCriteria + { + cellCentreDistCoeff 1.75; + faceAreaRatioCoeff 0.0025; + acceptanceAngle 21.5; + } + + pointRemovalCriteria + { + cellCentreDistCoeff 0.65; + } + + faceAreaWeightModel piecewiseLinearRamp; + + piecewiseLinearRampCoeffs + { + lowerAreaFraction 0.5; + upperAreaFraction 1.0; + } +} + + +polyMeshFiltering +{ + filterEdges on; + filterFaces off; + writeTetDualMesh false; +} + + +meshQualityControls +{ + #include "meshQualityDict" +} + + +// ************************************************************************* // diff --git a/tutorials/mesh/cvMesh/blob/system/decomposeParDict b/tutorials/mesh/cvMesh/blob/system/decomposeParDict new file mode 100644 index 0000000000000000000000000000000000000000..3d3806e87382b1f4fef074e2aad6f535c98881b6 --- /dev/null +++ b/tutorials/mesh/cvMesh/blob/system/decomposeParDict @@ -0,0 +1,47 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: dev | +| \\ / A nd | Web: www.OpenFOAM.org | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + location "system"; + object decomposeParDict; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +numberOfSubdomains 2; + +method scotch; +//method ptscotch; +// method hierarchical; + +simpleCoeffs +{ + n ( 2 2 1 ); + delta 0.001; +} + +hierarchicalCoeffs +{ + n ( 2 1 1 ); + delta 0.001; + order xyz; +} + +manualCoeffs +{ + dataFile ""; +} + +distributed no; + +roots ( ); + + +// ************************************************************************* // diff --git a/tutorials/mesh/cvMesh/blob/system/fvSchemes b/tutorials/mesh/cvMesh/blob/system/fvSchemes new file mode 100644 index 0000000000000000000000000000000000000000..2e5c55b28ba64ca0cfc1a7c714148109cd736563 --- /dev/null +++ b/tutorials/mesh/cvMesh/blob/system/fvSchemes @@ -0,0 +1,54 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: dev | +| \\ / A nd | Web: www.OpenFOAM.org | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + location "system"; + object fvSchemes; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +ddtSchemes +{ + default none; +} + +gradSchemes +{ + default none; +} + +divSchemes +{ + default none; +} + +laplacianSchemes +{ + default none; +} + +interpolationSchemes +{ + default none; +} + +snGradSchemes +{ + default none; +} + +fluxRequired +{ + default no; +} + + +// ************************************************************************* // diff --git a/tutorials/mesh/cvMesh/blob/system/fvSolution b/tutorials/mesh/cvMesh/blob/system/fvSolution new file mode 100644 index 0000000000000000000000000000000000000000..740eb61a4bcb97e64ae0b33558f5c7057e7a6d20 --- /dev/null +++ b/tutorials/mesh/cvMesh/blob/system/fvSolution @@ -0,0 +1,22 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: dev | +| \\ / A nd | Web: www.OpenFOAM.org | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + location "system"; + object fvSolution; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +solvers +{ +} + +// ************************************************************************* // diff --git a/tutorials/mesh/cvMesh/blob/system/meshQualityDict b/tutorials/mesh/cvMesh/blob/system/meshQualityDict new file mode 100644 index 0000000000000000000000000000000000000000..fa5319e087c5e36fe7c3cd93d3a69d5ebc75463e --- /dev/null +++ b/tutorials/mesh/cvMesh/blob/system/meshQualityDict @@ -0,0 +1,73 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: dev | +| \\ / A nd | Web: www.OpenFOAM.org | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ + +FoamFile +{ + version 2.0; + format ascii; + + root ""; + case ""; + instance ""; + local ""; + + class dictionary; + object meshQualityDict; +} + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +//- Maximum non-orthogonality allowed. Set to 180 to disable. +maxNonOrtho 65; + +//- Max skewness allowed. Set to <0 to disable. +maxBoundarySkewness 50; +maxInternalSkewness 10; + +//- Max concaveness allowed. Is angle (in degrees) below which concavity +// is allowed. 0 is straight face, <0 would be convex face. +// Set to 180 to disable. +maxConcave 80; + +//- Minimum quality of the tet formed by the face-centre +// and variable base point minimum decomposition triangles and +// the cell centre. This has to be a positive number for tracking +// to work. Set to very negative number (e.g. -1E30) to +// disable. +// <0 = inside out tet, +// 0 = flat tet +// 1 = regular tet +minTetQuality 1e-30; + +//- Minimum pyramid volume. Is absolute volume of cell pyramid. +// Set to a sensible fraction of the smallest cell volume expected. +// Set to very negative number (e.g. -1E30) to disable. +minVol 1e-20; + +//- Minimum face area. Set to <0 to disable. +minArea -1; + +//- Minimum face twist. Set to <-1 to disable. dot product of face normal +//- and face centre triangles normal +minTwist 0.001; + +//- minimum normalised cell determinant +//- 1 = hex, <= 0 = folded or flattened illegal cell +minDeterminant 0.001; + +//- minFaceWeight (0 -> 0.5) +minFaceWeight 0.02; + +//- minVolRatio (0 -> 1) +minVolRatio 0.01; + +//must be >0 for Fluent compatibility +minTriangleTwist -1; + + +// ************************************************************************* // diff --git a/tutorials/mesh/cvMesh/blob/system/snappyHexMeshDict b/tutorials/mesh/cvMesh/blob/system/snappyHexMeshDict new file mode 100644 index 0000000000000000000000000000000000000000..c5723d829f22cd893114a969605b413cdcb75b84 --- /dev/null +++ b/tutorials/mesh/cvMesh/blob/system/snappyHexMeshDict @@ -0,0 +1,310 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: dev | +| \\ / A nd | Web: www.OpenFOAM.org | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + object snappyHexMeshDict; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +// Which of the steps to run +castellatedMesh false; +snap false; +addLayers true; + + +// Geometry. Definition of all surfaces. All surfaces are of class +// searchableSurface. +// Surfaces are used +// - to specify refinement for any mesh cell intersecting it +// - to specify refinement for any mesh cell inside/outside/near +// - to 'snap' the mesh boundary to the surface +geometry +{ +// motorBike.obj +// { +// type triSurfaceMesh; +// name motorBike; +// } +// +// refinementBox +// { +// type searchableBox; +// min (-1.0 -0.7 0.0); +// max ( 8.0 0.7 2.5); +// } +}; + + + +// Settings for the castellatedMesh generation. +castellatedMeshControls +{ + + // Refinement parameters + // ~~~~~~~~~~~~~~~~~~~~~ + + // If local number of cells is >= maxLocalCells on any processor + // switches from from refinement followed by balancing + // (current method) to (weighted) balancing before refinement. + maxLocalCells 100000; + + // Overall cell limit (approximately). Refinement will stop immediately + // upon reaching this number so a refinement level might not complete. + // Note that this is the number of cells before removing the part which + // is not 'visible' from the keepPoint. The final number of cells might + // actually be a lot less. + maxGlobalCells 2000000; + + // The surface refinement loop might spend lots of iterations refining just a + // few cells. This setting will cause refinement to stop if <= minimumRefine + // are selected for refinement. Note: it will at least do one iteration + // (unless the number of cells to refine is 0) + minRefinementCells 10; + + // Allow a certain level of imbalance during refining + // (since balancing is quite expensive) + // Expressed as fraction of perfect balance (= overall number of cells / + // nProcs). 0=balance always. + maxLoadUnbalance 0.10; + + + // Number of buffer layers between different levels. + // 1 means normal 2:1 refinement restriction, larger means slower + // refinement. + nCellsBetweenLevels 3; + + + + // Explicit feature edge refinement + // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + // Specifies a level for any cell intersected by its edges. + // This is a featureEdgeMesh, read from constant/triSurface for now. + features + ( + //{ + // file "someLine.eMesh"; + // level 2; + //} + ); + + + + // Surface based refinement + // ~~~~~~~~~~~~~~~~~~~~~~~~ + + // Specifies two levels for every surface. The first is the minimum level, + // every cell intersecting a surface gets refined up to the minimum level. + // The second level is the maximum level. Cells that 'see' multiple + // intersections where the intersections make an + // angle > resolveFeatureAngle get refined up to the maximum level. + + refinementSurfaces + { +// motorBike +// { +// // Surface-wise min and max refinement level +// level (5 6); +// +// // Optional specification of patch type (default is wall). No +// // constraint types (cyclic, symmetry) etc. are allowed. +// patchInfo +// { +// type wall; +// inGroups (motorBike); +// } +// } + } + + // Resolve sharp angles + resolveFeatureAngle 30; + + + // Region-wise refinement + // ~~~~~~~~~~~~~~~~~~~~~~ + + // Specifies refinement level for cells in relation to a surface. One of + // three modes + // - distance. 'levels' specifies per distance to the surface the + // wanted refinement level. The distances need to be specified in + // descending order. + // - inside. 'levels' is only one entry and only the level is used. All + // cells inside the surface get refined up to the level. The surface + // needs to be closed for this to be possible. + // - outside. Same but cells outside. + + refinementRegions + { +// refinementBox +// { +// mode inside; +// levels ((1E15 4)); +// } + } + + + // Mesh selection + // ~~~~~~~~~~~~~~ + + // After refinement patches get added for all refinementSurfaces and + // all cells intersecting the surfaces get put into these patches. The + // section reachable from the locationInMesh is kept. + // NOTE: This point should never be on a face, always inside a cell, even + // after refinement. + locationInMesh (-1 0 0); + + + // Whether any faceZones (as specified in the refinementSurfaces) + // are only on the boundary of corresponding cellZones or also allow + // free-standing zone faces. Not used if there are no faceZones. + allowFreeStandingZoneFaces true; +} + + + +// Settings for the snapping. +snapControls +{ + //- Number of patch smoothing iterations before finding correspondence + // to surface + nSmoothPatch 3; + + //- Relative distance for points to be attracted by surface feature point + // or edge. True distance is this factor times local + // maximum edge length. + tolerance 4.0; + + //- Number of mesh displacement relaxation iterations. + nSolveIter 0; + + //- Maximum number of snapping relaxation iterations. Should stop + // before upon reaching a correct mesh. + nRelaxIter 5; + + //- Highly experimental and wip: number of feature edge snapping + // iterations. Leave out altogether to disable. + // Do not use here since mesh resolution too low and baffles present + //nFeatureSnapIter 10; +} + + + +// Settings for the layer addition. +addLayersControls +{ + // Are the thickness parameters below relative to the undistorted + // size of the refined cell outside layer (true) or absolute sizes (false). + relativeSizes false; + + // Per final patch (so not geometry!) the layer information + layers + { + blob.stl_patch1 + { + nSurfaceLayers 4; + } + } + + // Expansion factor for layer mesh + expansionRatio 1.5; + + // Wanted thickness of final added cell layer. If multiple layers + // is the thickness of the layer furthest away from the wall. + // Relative to undistorted size of cell outside layer. + // is the thickness of the layer furthest away from the wall. + // See relativeSizes parameter. + finalLayerThickness 0.02; + + // Minimum thickness of cell layer. If for any reason layer + // cannot be above minThickness do not add layer. + // Relative to undistorted size of cell outside layer. + minThickness 0.005; + + // If points get not extruded do nGrow layers of connected faces that are + // also not grown. This helps convergence of the layer addition process + // close to features. + // Note: changed(corrected) w.r.t 17x! (didn't do anything in 17x) + nGrow 0; + + // Advanced settings + + // When not to extrude surface. 0 is flat surface, 90 is when two faces + // are perpendicular + featureAngle 90; + + // Maximum number of snapping relaxation iterations. Should stop + // before upon reaching a correct mesh. + nRelaxIter 3; + + // Number of smoothing iterations of surface normals + nSmoothSurfaceNormals 1; + + // Number of smoothing iterations of interior mesh movement direction + nSmoothNormals 3; + + // Smooth layer thickness over surface patches + nSmoothThickness 10; + + // Stop layer growth on highly warped cells + maxFaceThicknessRatio 1000; + + // Reduce layer growth where ratio thickness to medial + // distance is large + maxThicknessToMedialRatio 0.3; + + // Angle used to pick up medial axis points + // Note: changed(corrected) w.r.t 17x! 90 degrees corresponds to 130 in 17x. + minMedianAxisAngle 90; + + + // Create buffer region for new layer terminations + nBufferCellsNoExtrude 0; + + + // Overall max number of layer addition iterations. The mesher will exit + // if it reaches this number of iterations; possibly with an illegal + // mesh. + nLayerIter 50; +} + + + +// Generic mesh quality settings. At any undoable phase these determine +// where to undo. +meshQualityControls +{ + #include "meshQualityDict" + + // Advanced + + //- Number of error distribution iterations + nSmoothScale 4; + //- amount to scale back displacement at error points + errorReduction 0.75; +} + + +// Advanced + +// Flags for optional output +// 0 : only write final meshes +// 1 : write intermediate meshes +// 2 : write volScalarField with cellLevel for postprocessing +// 4 : write current intersections as .obj files +debug 0; + + +// Merge tolerance. Is fraction of overall bounding box of initial mesh. +// Note: the write tolerance needs to be higher than this. +mergeTolerance 1e-6; + + +// ************************************************************************* // diff --git a/tutorials/mesh/cvMesh/blob/system/topoSetDict b/tutorials/mesh/cvMesh/blob/system/topoSetDict new file mode 100644 index 0000000000000000000000000000000000000000..f58b038ef44b5ca08da4e9f125f1ef933fa66ebd --- /dev/null +++ b/tutorials/mesh/cvMesh/blob/system/topoSetDict @@ -0,0 +1,149 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: dev | +| \\ / A nd | Web: www.OpenFOAM.org | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + object topoSetDict; +} + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +actions +( + { + name z; + type cellSet; + action new; + source boxToCell; + sourceInfo + { + box (-100 -100 -0.2)(100 100 100); + } + } + + { + name zf; + type faceSet; + action new; + source cellToFace; + sourceInfo + { + set z; + option all; + } + } + + { + name z; + type cellSet; + action invert; + } + + { + name zf; + type faceSet; + action subset; + source cellToFace; + sourceInfo + { + set z; + option all; + } + } + + // ~~~~~~~~~~~~~~~~ // + + { + name x; + type cellSet; + action new; + source boxToCell; + sourceInfo + { + box (-0.32 -100 -100)(100 100 100); + } + } + + { + name xf; + type faceSet; + action new; + source cellToFace; + sourceInfo + { + set x; + option all; + } + } + + { + name x; + type cellSet; + action invert; + } + + { + name xf; + type faceSet; + action subset; + source cellToFace; + sourceInfo + { + set x; + option all; + } + } + + // ~~~~~~~~~~~~~~~~ // + + { + name sp; + type cellSet; + action new; + source sphereToCell; + sourceInfo + { + centre (-0.3 -0.3 -0.3); + radius 0.4; + } + } + + { + name spf; + type faceSet; + action new; + source cellToFace; + sourceInfo + { + set sp; + option all; + } + } + + { + name sp; + type cellSet; + action invert; + } + + { + name spf; + type faceSet; + action subset; + source cellToFace; + sourceInfo + { + set sp; + option all; + } + } +); + +// ************************************************************************* // diff --git a/tutorials/mesh/cvMesh/flange/Allclean b/tutorials/mesh/cvMesh/flange/Allclean new file mode 100755 index 0000000000000000000000000000000000000000..dc1ee49a8fe81c236846b581745b8bf9c0f9b13a --- /dev/null +++ b/tutorials/mesh/cvMesh/flange/Allclean @@ -0,0 +1,14 @@ +#!/bin/sh +cd ${0%/*} || exit 1 # run from this directory + +# Source tutorial run functions +. $WM_PROJECT_DIR/bin/tools/CleanFunctions + +rm -rf constant/extendedFeatureEdgeMesh > /dev/null 2>&1 +rm -r constant/ccx constant/ccy constant/ccz > /dev/null 2>&1 +rm -r constant/internalDelaunayVertices constant/targetCellSize > /dev/null 2>&1 +rm -r 0/ccx 0/ccy 0/ccz > /dev/null 2>&1 + +cleanCase + +# ----------------------------------------------------------------- end-of-file diff --git a/tutorials/mesh/cvMesh/flange/Allrun b/tutorials/mesh/cvMesh/flange/Allrun new file mode 100755 index 0000000000000000000000000000000000000000..f3f891243724f6262cc41d0e6115929907235b4d --- /dev/null +++ b/tutorials/mesh/cvMesh/flange/Allrun @@ -0,0 +1,19 @@ +#!/bin/sh +cd ${0%/*} || exit 1 # run from this directory + +# Source tutorial run functions +. $WM_PROJECT_DIR/bin/tools/RunFunctions + +runApplication surfaceFeatureExtract + +# Create tight-fitting background mesh +runApplication blockMesh +runApplication topoSet -dict system/topoSetDict-background +mv log.topoSet log.topoSet.background +runApplication subsetMesh background -patch walls -overwrite + +runApplication cvMesh +runApplication collapseEdges -latestTime -collapseFaces +runApplication checkMesh -latestTime -allGeometry -allTopology + +# ----------------------------------------------------------------- end-of-file diff --git a/tutorials/mesh/cvMesh/flange/Allrun-parallel b/tutorials/mesh/cvMesh/flange/Allrun-parallel new file mode 100755 index 0000000000000000000000000000000000000000..f5bedb8935ec8f063146fa1432b4769182cdc2f9 --- /dev/null +++ b/tutorials/mesh/cvMesh/flange/Allrun-parallel @@ -0,0 +1,26 @@ +#!/bin/sh +cd ${0%/*} || exit 1 # run from this directory + +# Source tutorial run functions +. $WM_PROJECT_DIR/bin/tools/RunFunctions + +# Get the number of processors to run on from system/decomposeParDict +nProc=$(getNumberOfProcessors) + +runApplication surfaceFeatureExtract + +# Create tight-fitting background mesh +runApplication blockMesh +runApplication topoSet -dict system/topoSetDict-background +mv log.topoSet log.topoSet.background +runApplication subsetMesh background -patch walls -overwrite + +runApplication decomposePar + +runParallel cvMesh $nProc +runParallel collapseEdges $nProc -latestTime -collapseFaces +runParallel checkMesh $nProc -latestTime -allTopology -allGeometry + +runApplication reconstructParMesh -latestTime + +# ----------------------------------------------------------------- end-of-file diff --git a/tutorials/mesh/cvMesh/flange/Alltest b/tutorials/mesh/cvMesh/flange/Alltest new file mode 100755 index 0000000000000000000000000000000000000000..75b5887193055fc87ce8120145c5e72d0c335399 --- /dev/null +++ b/tutorials/mesh/cvMesh/flange/Alltest @@ -0,0 +1,21 @@ +#!/bin/sh +cd ${0%/*} || exit 1 # run from this directory + +# Source tutorial run functions +. $WM_PROJECT_DIR/bin/tools/RunFunctions + +runApplication surfaceFeatureExtract + +# Create tight-fitting background mesh +runApplication blockMesh +runApplication cvMesh + +# Change collapseEdges to only do one iteration +cp system/collapseDict system/collapseDict.org + +sed -e s/"\(maximumIterations[ \t]*\)\([0-9]*\);"/"\1 1;"/g \ +system/collapseDict.org > system/collapseDict + +runApplication collapseEdges -latestTime -collapseFaces + +# ----------------------------------------------------------------- end-of-file diff --git a/tutorials/mesh/cvMesh/flange/constant/polyMesh/blockMeshDict b/tutorials/mesh/cvMesh/flange/constant/polyMesh/blockMeshDict new file mode 100644 index 0000000000000000000000000000000000000000..81d15816e37cbce5427f961bf339915ba1395524 --- /dev/null +++ b/tutorials/mesh/cvMesh/flange/constant/polyMesh/blockMeshDict @@ -0,0 +1,69 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: dev | +| \\ / A nd | Web: www.OpenFOAM.org | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + object blockMeshDict; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +convertToMeters 1.0; + +xmin -0.0265; +xmax 0.0265; +ymin -0.028; +ymax 0.023; +zmin -0.024; +zmax 0.01; + +vertices +( + ($xmin $ymin $zmin) + ($xmax $ymin $zmin) + ($xmax $ymax $zmin) + ($xmin $ymax $zmin) + ($xmin $ymin $zmax) + ($xmax $ymin $zmax) + ($xmax $ymax $zmax) + ($xmin $ymax $zmax) + +); + +blocks +( + hex (0 1 2 3 4 5 6 7) (5 6 3) simpleGrading (1 1 1) +); + +edges +( +); + +boundary +( + walls + { + type wall; + faces + ( + (3 7 6 2) + (0 4 7 3) + (2 6 5 1) + (1 5 4 0) + (0 3 2 1) + (4 5 6 7) + ); + } +); + +mergePatchPairs +( +); + +// ************************************************************************* // diff --git a/tutorials/mesh/cvMesh/flange/constant/polyMesh/boundary b/tutorials/mesh/cvMesh/flange/constant/polyMesh/boundary new file mode 100644 index 0000000000000000000000000000000000000000..efe6bfe832fedad4de807c79b291f6dcc2b14dde --- /dev/null +++ b/tutorials/mesh/cvMesh/flange/constant/polyMesh/boundary @@ -0,0 +1,28 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: dev | +| \\ / A nd | Web: www.OpenFOAM.org | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class polyBoundaryMesh; + location "constant/polyMesh"; + object boundary; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +1 +( + walls + { + type wall; + nFaces 126; + startFace 207; + } +) + +// ************************************************************************* // diff --git a/tutorials/mesh/cvMesh/flange/constant/triSurface/flange.obj b/tutorials/mesh/cvMesh/flange/constant/triSurface/flange.obj new file mode 100644 index 0000000000000000000000000000000000000000..8b3998fe8a8b0b5e4759cef6521038f4e71db02d --- /dev/null +++ b/tutorials/mesh/cvMesh/flange/constant/triSurface/flange.obj @@ -0,0 +1,9710 @@ +# Wavefront OBJ file +# Regions: +# 0 patch1 +# 1 patch2 +# 2 patch3 +# 3 patch4 +# +# points : 3228 +# triangles : 6468 +# +v 0.003234 0.00317894 -0.01375 +v 0.00232785 0.00310005 -0.01375 +v 0.002302 0.00389537 -0.01375 +v 0.002302 -0.00389537 -0.01375 +v 0.00232785 -0.00310005 -0.01375 +v 0.003234 -0.00317894 -0.01375 +v 0.0097686 0.002 -0.0152248 +v 0.0111516 0.002 -0.014182 +v 0.0115415 0.002 -0.0156366 +v 0.0131584 0.002 -0.0151265 +v 0.0146963 0.002 -0.016257 +v 0.0131946 0.002 -0.0158693 +v 0.0144921 0.002 -0.01727 +v 0.015699 0.002 -0.0175533 +v 0.0125608 0.002 -0.0164174 +v 0.0134607 0.002 -0.01688 +v 0.0115415 0.002 -0.00286344 +v 0.0111516 0.002 -0.0043179 +v 0.0097686 0.002 -0.00327517 +v 0.0131946 0.002 -0.0026307 +v 0.0146963 0.002 -0.00224303 +v 0.0131584 0.002 -0.0033735 +v 0.015699 0.002 -0.00094673 +v 0.0144921 0.002 -0.00123011 +v 0.0134607 0.002 -0.0016199 +v 0.0125608 0.002 -0.00208264 +v -0.002302 0.00389537 -0.01375 +v -0.00232785 0.00310005 -0.01375 +v -0.003234 0.00317894 -0.01375 +v -0.003234 -0.00317894 -0.01375 +v -0.00232785 -0.00310005 -0.01375 +v -0.002302 -0.00389537 -0.01375 +v -0.0115415 0.002 -0.0156366 +v -0.0111516 0.002 -0.014182 +v -0.0097686 0.002 -0.0152248 +v -0.0131946 0.002 -0.0158693 +v -0.0146963 0.002 -0.016257 +v -0.0131584 0.002 -0.0151265 +v -0.015699 0.002 -0.0175533 +v -0.0144921 0.002 -0.01727 +v -0.0134607 0.002 -0.01688 +v -0.0125608 0.002 -0.0164174 +v -0.0097686 0.002 -0.00327517 +v -0.0111516 0.002 -0.0043179 +v -0.0115415 0.002 -0.00286344 +v -0.0131584 0.002 -0.0033735 +v -0.0146963 0.002 -0.00224303 +v -0.0131946 0.002 -0.0026307 +v -0.0144921 0.002 -0.00123011 +v -0.015699 0.002 -0.00094673 +v -0.0125608 0.002 -0.00208264 +v -0.0134607 0.002 -0.0016199 +v 0.00081649 0.0016143 -0.01375 +v 4.8963e-05 0.00165237 -0.01375 +v 4.8963e-05 0.00230474 -0.01375 +v 0.00120133 0.00230474 -0.01375 +v 0.00155489 0.00150593 -0.01375 +v 0.0023537 0.00230474 -0.01375 +v 0.0023537 0.00115237 -0.01375 +v 0.00166327 0.00076753 -0.01375 +v 0.0023537 -1.74e-18 -0.01375 +v 0.00170133 -3.04e-18 -0.01375 +v 0.00097284 0.00038268 -0.01375 +v 0.00104896 -3.91e-18 -0.01375 +v 0.00075607 0.0007071 -0.01375 +v 0.000431646 0.00092388 -0.01375 +v 4.8963e-05 0.001 -0.01375 +v 0.00249896 -0.00094365 -0.00925 +v 0.00249896 -6.98e-16 -0.00925 +v 0.0022979 -6.98e-16 -0.010222 +v 0.0022932 -0.00097703 -0.0102324 +v 0.00081649 -0.0016143 -0.01375 +v 0.00120133 -0.00230474 -0.01375 +v 4.8963e-05 -0.00230474 -0.01375 +v 4.8963e-05 -0.00165237 -0.01375 +v 0.00155489 -0.00150593 -0.01375 +v 0.0023537 -0.00230474 -0.01375 +v 0.00166327 -0.00076753 -0.01375 +v 0.0023537 -0.00115237 -0.01375 +v 0.00097284 -0.00038268 -0.01375 +v 0.00075607 -0.0007071 -0.01375 +v 0.000431646 -0.00092388 -0.01375 +v 4.8963e-05 -0.001 -0.01375 +v 0.0107846 0.002 -0.0109912 +v 0.0096058 0.002 -0.011181 +v 0.009799 0.002 -0.00925 +v 0.0107791 0.002 -0.00925 +v 0.0117593 0.002 -0.00925 +v 0.0119634 0.002 -0.0108016 +v 0.0162069 0.002 -0.0150457 +v 0.0166766 0.002 -0.0163743 +v 0.0147592 0.002 -0.014446 +v 0.0177593 0.002 -0.01525 +v 0.0177593 0.002 -0.0166736 +v 0.0167117 0.002 -0.0174385 +v 0.0177593 0.002 -0.0183878 +v 0.0159418 0.002 -0.0192534 +v 0.008014 0.002 -0.0171347 +v 0.0065 0.002 -0.0165607 +v 0.0079468 0.002 -0.0149673 +v 0.0090659 0.002 -0.016288 +v 0.008476 0.002 -0.0185554 +v 0.0065 0.002 -0.018933 +v 0.0106532 0.002 -0.017664 +v 0.0087366 0.002 -0.0205014 +v 0.0065 0.002 -0.0213056 +v 0.0092624 0.002 -0.0224344 +v 0.0065 0.002 -0.02375 +v 0.0116557 0.002 -0.019395 +v 0.010708 0.002 -0.0196982 +v 0.0120812 0.002 -0.0185232 +v 0.0117868 0.002 -0.021232 +v 0.0130909 0.002 -0.0192646 +v 0.0121778 0.002 -0.019964 +v 0.0139919 0.002 -0.020182 +v 0.0089605 0.002 -0.0132056 +v 0.0120464 0.002 -0.0172835 +v 0.0129252 0.002 -0.017769 +v 0.013513 0.002 -0.013489 +v 0.0141125 0.002 -0.0183892 +v 0.0107617 0.002 -0.0127276 +v 0.012563 0.002 -0.0122497 +v 0.0022932 -0.00097703 -0.0082676 +v 0.0022979 -6.98e-16 -0.008278 +v 0.0235547 0.002 -0.0108036 +v 0.0237593 0.002 -0.00925 +v 0.0248843 0.002 -0.00925 +v 0.02461 0.002 -0.0112059 +v 0.0260093 0.002 -0.00925 +v 0.025665 0.002 -0.0116081 +v 0.0229553 0.002 -0.0122503 +v 0.0238083 0.002 -0.01301 +v 0.024661 0.002 -0.0137696 +v 0.022002 0.002 -0.0134926 +v 0.0225418 0.002 -0.0145232 +v 0.0230815 0.002 -0.0155537 +v 0.0207594 0.002 -0.014446 +v 0.0209085 0.002 -0.015629 +v 0.0210577 0.002 -0.016812 +v 0.0193148 0.002 -0.0150449 +v 0.0193617 0.002 -0.016288 +v 0.01945 0.002 -0.0175827 +v 0.0235547 0.002 -0.0076964 +v 0.02461 0.002 -0.0072941 +v 0.025665 0.002 -0.0068919 +v 0.0229553 0.002 -0.0062497 +v 0.0238083 0.002 -0.00549006 +v 0.024661 0.002 -0.0047304 +v 0.022002 0.002 -0.00500735 +v 0.0225418 0.002 -0.0039768 +v 0.0230815 0.002 -0.0029463 +v 0.0207594 0.002 -0.00405388 +v 0.0209085 0.002 -0.00287096 +v 0.0210577 0.002 -0.00168803 +v 0.0193148 0.002 -0.00345514 +v 0.0193617 0.002 -0.0022119 +v 0.0194085 0.002 -0.0009687 +v 0.0177593 0.002 -0.00325 +v 0.0177593 0.002 -0.00182637 +v 0.0177593 0.002 -0.000249369 +v 0.0107846 0.002 -0.0075088 +v 0.0096058 0.002 -0.007319 +v 0.0119634 0.002 -0.0076985 +v 0.0162069 0.002 -0.0034543 +v 0.0147592 0.002 -0.0040539 +v 0.0166766 0.002 -0.00212568 +v 0.0167117 0.002 -0.00106153 +v 0.0158684 0.002 0.00057542 +v 0.008014 0.002 -0.00136532 +v 0.0090659 0.002 -0.00221207 +v 0.0079468 0.002 -0.0035327 +v 0.0065 0.002 -0.00193928 +v 0.0065 0.002 0.00043318 +v 0.008476 0.002 5.5378e-05 +v 0.0106532 0.002 -0.00083587 +v 0.0065 0.002 0.00225 +v 0.0088096 0.002 0.00225 +v 0.0116557 0.002 0.00089514 +v 0.0120812 0.002 2.32197e-05 +v 0.010708 0.002 0.0011982 +v 0.0121778 0.002 0.00146398 +v 0.0130909 0.002 0.00076461 +v 0.0120291 0.002 0.00225 +v 0.0139774 0.002 0.00140021 +v 0.0089605 0.002 -0.00529437 +v 0.0120464 0.002 -0.0012165 +v 0.0129252 0.002 -0.000731 +v 0.013513 0.002 -0.00501106 +v 0.0141125 0.002 -0.000110779 +v 0.0107617 0.002 -0.0057724 +v 0.012563 0.002 -0.0062503 +v -0.00081649 0.0016143 -0.01375 +v -0.00120133 0.00230474 -0.01375 +v -0.00155489 0.00150593 -0.01375 +v -0.0023537 0.00230474 -0.01375 +v -0.00166327 0.00076753 -0.01375 +v -0.0023537 0.00115237 -0.01375 +v -0.00170133 -3.04e-18 -0.01375 +v -0.0023537 -1.74e-18 -0.01375 +v -0.00097284 0.00038268 -0.01375 +v -0.00104896 -3.91e-18 -0.01375 +v -0.00075607 0.0007071 -0.01375 +v -0.000431646 0.00092388 -0.01375 +v -0.00249896 -0.00094365 -0.00925 +v -0.0022932 -0.00097703 -0.0102324 +v -0.0022979 -6.98e-16 -0.010222 +v -0.00249896 -6.98e-16 -0.00925 +v -0.00081649 -0.0016143 -0.01375 +v -0.00120133 -0.00230474 -0.01375 +v -0.00155489 -0.00150593 -0.01375 +v -0.0023537 -0.00230474 -0.01375 +v -0.0023537 -0.00115237 -0.01375 +v -0.00166327 -0.00076753 -0.01375 +v -0.00097284 -0.00038268 -0.01375 +v -0.00075607 -0.0007071 -0.01375 +v -0.000431646 -0.00092388 -0.01375 +v -0.0107846 0.002 -0.0109912 +v -0.0107791 0.002 -0.00925 +v -0.009799 0.002 -0.00925 +v -0.0096058 0.002 -0.011181 +v -0.0117593 0.002 -0.00925 +v -0.0119634 0.002 -0.0108016 +v -0.0162069 0.002 -0.0150457 +v -0.0147592 0.002 -0.014446 +v -0.0166766 0.002 -0.0163743 +v -0.0177593 0.002 -0.0166736 +v -0.0177593 0.002 -0.01525 +v -0.0167117 0.002 -0.0174385 +v -0.0159418 0.002 -0.0192534 +v -0.0177593 0.002 -0.0183878 +v -0.008014 0.002 -0.0171347 +v -0.0090659 0.002 -0.016288 +v -0.0079468 0.002 -0.0149673 +v -0.0065 0.002 -0.0165607 +v -0.0065 0.002 -0.018933 +v -0.008476 0.002 -0.0185554 +v -0.0106532 0.002 -0.017664 +v -0.0087366 0.002 -0.0205014 +v -0.0065 0.002 -0.0213056 +v -0.0065 0.002 -0.02375 +v -0.0092624 0.002 -0.0224344 +v -0.0116557 0.002 -0.019395 +v -0.0120812 0.002 -0.0185232 +v -0.010708 0.002 -0.0196982 +v -0.0117868 0.002 -0.021232 +v -0.0121778 0.002 -0.019964 +v -0.0130909 0.002 -0.0192646 +v -0.0139919 0.002 -0.020182 +v -0.0089605 0.002 -0.0132056 +v -0.0120464 0.002 -0.0172835 +v -0.0129252 0.002 -0.017769 +v -0.013513 0.002 -0.013489 +v -0.0141125 0.002 -0.0183892 +v -0.0107617 0.002 -0.0127276 +v -0.012563 0.002 -0.0122497 +v -0.0022979 -6.98e-16 -0.008278 +v -0.0022932 -0.00097703 -0.0082676 +v -0.0235547 0.002 -0.0108036 +v -0.02461 0.002 -0.0112059 +v -0.0248843 0.002 -0.00925 +v -0.0237593 0.002 -0.00925 +v -0.025665 0.002 -0.0116081 +v -0.0260093 0.002 -0.00925 +v -0.0229553 0.002 -0.0122503 +v -0.0238083 0.002 -0.01301 +v -0.024661 0.002 -0.0137696 +v -0.022002 0.002 -0.0134926 +v -0.0225418 0.002 -0.0145232 +v -0.0230815 0.002 -0.0155537 +v -0.0207594 0.002 -0.014446 +v -0.0209085 0.002 -0.015629 +v -0.0210577 0.002 -0.016812 +v -0.0193148 0.002 -0.0150449 +v -0.0193617 0.002 -0.016288 +v -0.01945 0.002 -0.0175827 +v -0.0235547 0.002 -0.0076964 +v -0.02461 0.002 -0.0072941 +v -0.025665 0.002 -0.0068919 +v -0.0229553 0.002 -0.0062497 +v -0.0238083 0.002 -0.00549006 +v -0.024661 0.002 -0.0047304 +v -0.022002 0.002 -0.00500735 +v -0.0225418 0.002 -0.0039768 +v -0.0230815 0.002 -0.0029463 +v -0.0207594 0.002 -0.00405388 +v -0.0209085 0.002 -0.00287096 +v -0.0210577 0.002 -0.00168803 +v -0.0193148 0.002 -0.00345514 +v -0.0193617 0.002 -0.0022119 +v -0.0194085 0.002 -0.0009687 +v -0.0177593 0.002 -0.00182637 +v -0.0177593 0.002 -0.00325 +v -0.0177593 0.002 -0.000249369 +v -0.0107846 0.002 -0.0075088 +v -0.0096058 0.002 -0.007319 +v -0.0119634 0.002 -0.0076985 +v -0.0162069 0.002 -0.0034543 +v -0.0166766 0.002 -0.00212568 +v -0.0147592 0.002 -0.0040539 +v -0.0167117 0.002 -0.00106153 +v -0.0158684 0.002 0.00057542 +v -0.008014 0.002 -0.00136532 +v -0.0065 0.002 -0.00193928 +v -0.0079468 0.002 -0.0035327 +v -0.0090659 0.002 -0.00221207 +v -0.008476 0.002 5.5378e-05 +v -0.0065 0.002 0.00043318 +v -0.0106532 0.002 -0.00083587 +v -0.0088096 0.002 0.00225 +v -0.0065 0.002 0.00225 +v -0.0116557 0.002 0.00089514 +v -0.010708 0.002 0.0011982 +v -0.0120812 0.002 2.32197e-05 +v -0.0130909 0.002 0.00076461 +v -0.0121778 0.002 0.00146398 +v -0.0120291 0.002 0.00225 +v -0.0139774 0.002 0.00140021 +v -0.0089605 0.002 -0.00529437 +v -0.0120464 0.002 -0.0012165 +v -0.0129252 0.002 -0.000731 +v -0.013513 0.002 -0.00501106 +v -0.0141125 0.002 -0.000110779 +v -0.0107617 0.002 -0.0057724 +v -0.012563 0.002 -0.0062503 +v 0.0039486 0.00224557 -0.01375 +v 0.00315117 0.00227516 -0.01375 +v 0.00315117 -0.00227516 -0.01375 +v 0.0039486 -0.00224557 -0.01375 +v 0.00288809 -0.0275 -0.013156 +v 0.00312345 -0.0275 -0.01375 +v 0.00391928 -0.0275 -0.013087 +v 0.0032891 -0.0275 -0.01259 +v 0.00429036 -0.0275 -0.0126724 +v 0.00312345 -0.0275 -0.00475 +v 0.00288809 -0.0275 -0.005344 +v 0.00391928 -0.0275 -0.0054129 +v 0.0032891 -0.0275 -0.0059101 +v 0.00429036 -0.0275 -0.00582756 +v 0.0031568 0.00226529 0.00225 +v 0.0039599 0.00222589 0.00225 +v 0.00323885 0.00317405 0.00225 +v 0.00216496 0.00397147 0.00225 +v 0.00233276 0.00310005 0.00225 +v 0.0039599 -0.00222589 0.00225 +v 0.0031568 -0.00226529 0.00225 +v 0.00323885 -0.00317405 0.00225 +v 0.00233276 -0.00310005 0.00225 +v 0.00216496 -0.00397147 0.00225 +v -0.00315117 0.00227516 -0.01375 +v -0.0039486 0.00224557 -0.01375 +v -0.0039486 -0.00224557 -0.01375 +v -0.00315117 -0.00227516 -0.01375 +v -0.00312345 -0.0275 -0.01375 +v -0.00288809 -0.0275 -0.013156 +v -0.00391928 -0.0275 -0.013087 +v -0.0032891 -0.0275 -0.01259 +v -0.00429036 -0.0275 -0.0126724 +v -0.00288809 -0.0275 -0.005344 +v -0.00312345 -0.0275 -0.00475 +v -0.00391928 -0.0275 -0.0054129 +v -0.0032891 -0.0275 -0.0059101 +v -0.00429036 -0.0275 -0.00582756 +v -0.0039599 0.00222589 0.00225 +v -0.0031568 0.00226529 0.00225 +v -0.00323885 0.00317405 0.00225 +v -0.00233276 0.00310005 0.00225 +v -0.00216496 0.00397147 0.00225 +v -0.0031568 -0.00226529 0.00225 +v -0.0039599 -0.00222589 0.00225 +v -0.00323885 -0.00317405 0.00225 +v -0.00216496 -0.00397147 0.00225 +v -0.00233276 -0.00310005 0.00225 +v 0.0065 0.003375 -0.0165157 +v 0.0079194 0.0033836 -0.0149475 +v 0.0089295 0.00338968 -0.0131919 +v 0.00789208 0.0047672 -0.0149277 +v 0.0088986 0.00477936 -0.013178 +v 0.0065 0.00475 -0.0164708 +v 0.0095725 0.0033932 -0.0111742 +v 0.009765 0.00339429 -0.00925 +v 0.0095392 0.0047864 -0.0111675 +v 0.009731 0.00478857 -0.00925 +v 0.007871 0.00616027 -0.014888 +v 0.0088701 0.0061845 -0.0131506 +v 0.0078374 0.0075345 -0.014888 +v 0.0088366 0.0075587 -0.0131506 +v 0.0065 0.006125 -0.0164258 +v 0.0065 0.0075 -0.0163808 +v 0.0095061 0.0061986 -0.011154 +v 0.0094726 0.0075728 -0.011154 +v 0.0096965 0.006203 -0.00925 +v 0.009663 0.0075771 -0.00925 +v 4.8963e-05 0.0045 -0.02375 +v 4.8963e-05 0.0055 -0.02375 +v 0.0011137 0.0053555 -0.02375 +v 0.00104896 0.00438748 -0.02375 +v 4.8963e-05 0.0075 -0.02375 +v 0.00148663 0.0075 -0.02375 +v 0.00221962 0.0051977 -0.02375 +v 0.00216496 0.00397147 -0.02375 +v 0.0029119 0.0075 -0.02375 +v 0.00367495 0.005513 -0.02375 +v 0.00323885 0.00317405 -0.02375 +v 0.0042271 0.0075 -0.02375 +v 0.0043992 0.00115128 -0.02375 +v 0.0054496 0.00157564 -0.02375 +v 0.00552448 -6.84e-16 -0.02375 +v 0.004549 -6.84e-16 -0.02375 +v 0.0039599 0.00222589 -0.02375 +v 0.00523 0.00280044 -0.02375 +v 0.0048694 0.003962 -0.02375 +v 0.0051534 0.005731 -0.02375 +v 0.0054374 0.0075 -0.02375 +v 0.0065 5.47e-15 -0.02375 +v 0.0065 0.003375 -0.02375 +v 0.0065 0.00475 -0.02375 +v 0.0065 0.006125 -0.02375 +v 0.0065 0.0075 -0.02375 +v 4.8963e-05 -0.0045 -0.02375 +v 0.00104896 -0.00438748 -0.02375 +v 0.0011137 -0.0053555 -0.02375 +v 4.8963e-05 -0.0055 -0.02375 +v 0.00148663 -0.0075 -0.02375 +v 4.8963e-05 -0.0075 -0.02375 +v 0.00216496 -0.00397147 -0.02375 +v 0.00221962 -0.0051977 -0.02375 +v 0.0029119 -0.0075 -0.02375 +v 0.00323885 -0.00317405 -0.02375 +v 0.00367495 -0.005513 -0.02375 +v 0.0042271 -0.0075 -0.02375 +v 0.0043992 -0.00115128 -0.02375 +v 0.0054496 -0.00157564 -0.02375 +v 0.00523 -0.00280044 -0.02375 +v 0.0039599 -0.00222589 -0.02375 +v 0.0048694 -0.003962 -0.02375 +v 0.0051534 -0.005731 -0.02375 +v 0.0054374 -0.0075 -0.02375 +v 0.0065 -0.002 -0.02375 +v 0.0065 -0.003375 -0.02375 +v 0.0065 -0.00475 -0.02375 +v 0.0065 -0.006125 -0.02375 +v 0.0065 -0.0075 -0.02375 +v 4.8963e-05 -0.0175 -0.0147 +v 4.8963e-05 -0.0175 -0.016475 +v 0.00124515 -0.0175 -0.0163737 +v 0.00109717 -0.0175 -0.0145982 +v 4.8963e-05 -0.0175 -0.01825 +v 0.00139314 -0.0175 -0.018149 +v 0.00238149 -0.0175 -0.0160825 +v 0.0020612 -0.0175 -0.014315 +v 0.00270178 -0.0175 -0.01785 +v 0.00354179 -0.0175 -0.0155529 +v 0.00312345 -0.0175 -0.01375 +v 0.0039601 -0.0175 -0.0173557 +v 0.00448925 -0.0175 -0.0149068 +v 0.00391928 -0.0175 -0.013087 +v 0.0050592 -0.0175 -0.0167264 +v 0.00529216 -0.0175 -0.0142016 +v 0.00429036 -0.0175 -0.0126724 +v 0.006294 -0.0175 -0.0157307 +v 0.0047034 -0.0175 -0.0120852 +v 0.006085 -0.0175 -0.0132161 +v 0.0066761 -0.0175 -0.0121268 +v 0.00501887 -0.0175 -0.0114866 +v 0.00746649 -0.0175 -0.014347 +v 0.0083333 -0.0175 -0.012767 +v 0.0053672 -0.0175 -0.010441 +v 0.00712418 -0.0175 -0.0107105 +v 0.0088811 -0.0175 -0.01098 +v 0.005499 -0.0175 -0.00925 +v 0.007274 -0.0175 -0.00925 +v 0.009049 -0.0175 -0.00925 +v 4.8962e-05 -0.0275 -0.01245 +v 4.89625e-05 -0.0275 -0.0132 +v 0.00107307 -0.0275 -0.0130425 +v 0.00106101 -0.0275 -0.0122646 +v 4.8962e-05 -0.0275 -0.0117 +v 0.00104896 -0.0275 -0.0114868 +v 0.002086 -0.0275 -0.0127852 +v 0.0019891 -0.0275 -0.0118203 +v 0.00178137 -0.0275 -0.0109825 +v 0.00251807 -0.0275 -0.0118038 +v 0.00276864 -0.0275 -0.012485 +v 0.00252846 -0.0275 -0.0112413 +v 0.00231247 -0.0275 -0.0101877 +v 0.0032963 -0.0275 -0.0103751 +v 0.00249896 -0.0275 -0.00925 +v 0.0033171 -0.0275 -0.0092501 +v 0.003269 -0.0275 -0.0120778 +v 0.0037536 -0.0275 -0.0113674 +v 0.0047034 -0.0275 -0.0120852 +v 0.00501887 -0.0275 -0.0114866 +v 0.00433179 -0.0275 -0.010408 +v 0.0053672 -0.0275 -0.010441 +v 0.004509 -0.0275 -0.00925 +v 0.005499 -0.0275 -0.00925 +v 4.89628e-05 -0.0275 -0.01395 +v 0.00108512 -0.0275 -0.0138204 +v 4.8963e-05 -0.0275 -0.0147 +v 0.00109717 -0.0275 -0.0145982 +v 0.0020873 -0.0275 -0.0135446 +v 0.0020612 -0.0275 -0.014315 +v 0.00104896 0.0225 -0.0161782 +v 0.00127296 0.0224614 -0.0174672 +v 4.8963e-05 0.0224614 -0.017558 +v 4.8963e-05 0.0225 -0.01625 +v 0.0015038 0.0225 -0.0183849 +v 4.8963e-05 0.0225 -0.0185 +v 0.0021601 0.0225 -0.015924 +v 0.002536 0.0224614 -0.017177 +v 0.00284678 0.0225 -0.0180667 +v 0.0032438 0.0225 -0.0154784 +v 0.00373546 0.0224614 -0.0166946 +v 0.00408266 0.0225 -0.017574 +v 0.0043334 0.0225 -0.0147856 +v 0.0048854 0.0224614 -0.016 +v 0.0052903 0.0225 -0.0168717 +v 0.0054108 0.0225 -0.01375 +v 0.0059554 0.0224614 -0.0150654 +v 0.00635 0.0225 -0.016022 +v 0.0061985 0.0225 -0.0125942 +v 0.006682 0.0225 -0.0114866 +v 0.0077593 0.0224908 -0.0123186 +v 0.007018 0.0224787 -0.0137412 +v 0.008537 0.0225 -0.0129264 +v 0.0075997 0.0225 -0.014593 +v 0.0069557 0.0225 -0.010389 +v 0.0082141 0.0224979 -0.0107716 +v 0.009116 0.0225 -0.011081 +v 0.007049 0.0225 -0.00925 +v 0.008356 0.0225 -0.00925 +v 0.009299 0.0225 -0.00925 +v 0.00249896 -0.0018873 -0.00925 +v 0.0022885 -0.00195405 -0.0102427 +v 0.0017277 5.66e-08 -0.0110345 +v 0.0017277 -0.00115243 -0.0110345 +v 0.0017277 -0.0023048 -0.0110345 +v 0.000781428 -0.00161437 -0.011588 +v 4.8963e-05 -0.00165243 -0.0116999 +v 4.8963e-05 -0.0023048 -0.0116999 +v 0.0010918 -0.0023048 -0.011467 +v 0.00133196 -0.00150598 -0.0113372 +v 0.00139701 -0.00076758 -0.0112958 +v 0.00141894 5.66e-08 -0.0112812 +v 0.00096135 -0.00040932 -0.0115238 +v 0.00104896 -6.98e-16 -0.0114866 +v 0.00074085 -0.0007218 -0.0116002 +v 0.000427704 -0.00092555 -0.0116705 +v 4.8963e-05 -0.00100006 -0.0116999 +v 0.0065 0.003375 -0.00198425 +v 0.0079194 0.0033836 -0.0035525 +v 0.0089295 0.00338968 -0.0053081 +v 0.00789208 0.0047672 -0.00357229 +v 0.0088986 0.00477936 -0.00532189 +v 0.0065 0.00475 -0.00202923 +v 0.0095725 0.0033932 -0.0073258 +v 0.0095392 0.0047864 -0.0073325 +v 0.007871 0.00616027 -0.00361186 +v 0.0088701 0.0061845 -0.0053494 +v 0.0088366 0.0075587 -0.0053494 +v 0.0078374 0.0075345 -0.00361186 +v 0.0065 0.006125 -0.0020742 +v 0.0065 0.0075 -0.00211917 +v 0.0095061 0.0061986 -0.007346 +v 0.0094726 0.0075728 -0.007346 +v 0.000902 0.0044184 0.00225 +v 0.0011137 0.0053555 0.00225 +v 4.8963e-05 0.0055 0.00224996 +v 4.8963e-05 0.0045 0.00225 +v 0.00149694 0.0075 0.00225 +v 4.8963e-05 0.0075 0.00225 +v 0.00221962 0.0051977 0.00225 +v 0.0029119 0.0075 0.00225 +v 0.00352837 0.00529856 0.00225 +v 0.0042271 0.0075 0.00225 +v 0.0043992 0.00115128 0.00225 +v 0.004549 -1.38e-15 0.00225 +v 0.00530456 -1.38e-15 0.00225 +v 0.0052181 0.00148194 0.00225 +v 0.00503615 0.0027323 0.00225 +v 0.0047612 0.00394096 0.00225 +v 0.0049116 0.00555049 0.00225 +v 0.0054374 0.0075 0.00225 +v 0.0065 1.92e-08 0.00225 +v 0.0065 0.003375 0.00225 +v 0.0065 0.00475 0.00225 +v 0.0065 0.006125 0.00225 +v 0.0065 0.0075 0.00225 +v 0.000902 -0.0044184 0.00225 +v 4.8963e-05 -0.0045 0.00225 +v 4.8963e-05 -0.0055 0.00224996 +v 0.0011137 -0.0053555 0.00225 +v 4.8963e-05 -0.0075 0.00225 +v 0.00149694 -0.0075 0.00225 +v 0.00221962 -0.0051977 0.00225 +v 0.0029119 -0.0075 0.00225 +v 0.00352837 -0.00529856 0.00225 +v 0.0042271 -0.0075 0.00225 +v 0.0043992 -0.00115128 0.00225 +v 0.0052181 -0.00148194 0.00225 +v 0.00503615 -0.0027323 0.00225 +v 0.0047612 -0.00394096 0.00225 +v 0.0049116 -0.00555049 0.00225 +v 0.0054374 -0.0075 0.00225 +v 0.0065 -0.002 0.00225 +v 0.0065 -0.003375 0.00225 +v 0.0065 -0.00475 0.00225 +v 0.0065 -0.006125 0.00225 +v 0.0065 -0.0075 0.00225 +v 4.8963e-05 -0.0175 -0.0038 +v 0.00109717 -0.0175 -0.00390175 +v 0.00124515 -0.0175 -0.00212635 +v 4.8963e-05 -0.0175 -0.002025 +v 0.00139314 -0.0175 -0.000350945 +v 4.8963e-05 -0.0175 -0.00025 +v 0.0020612 -0.0175 -0.00418508 +v 0.00238149 -0.0175 -0.00241747 +v 0.00270178 -0.0175 -0.00064985 +v 0.00312345 -0.0175 -0.00475 +v 0.00354179 -0.0175 -0.00294714 +v 0.0039601 -0.0175 -0.00114427 +v 0.00391928 -0.0175 -0.0054129 +v 0.00448925 -0.0175 -0.00359324 +v 0.0050592 -0.0175 -0.00177355 +v 0.00429036 -0.0175 -0.00582756 +v 0.00529216 -0.0175 -0.0042984 +v 0.006294 -0.0175 -0.00276926 +v 0.0047034 -0.0175 -0.0064148 +v 0.00501887 -0.0175 -0.00701337 +v 0.0066761 -0.0175 -0.00637318 +v 0.006085 -0.0175 -0.00528385 +v 0.0083333 -0.0175 -0.005733 +v 0.00746649 -0.0175 -0.0041529 +v 0.0053672 -0.0175 -0.008059 +v 0.00712418 -0.0175 -0.00778949 +v 0.0088811 -0.0175 -0.00752 +v 4.8962e-05 -0.0275 -0.00605 +v 0.00106101 -0.0275 -0.00623537 +v 0.00107307 -0.0275 -0.0054575 +v 4.89625e-05 -0.0275 -0.0053 +v 4.8962e-05 -0.0275 -0.0068 +v 0.00104896 -0.0275 -0.0070132 +v 0.0019891 -0.0275 -0.00667967 +v 0.002086 -0.0275 -0.00571477 +v 0.00178137 -0.0275 -0.0075175 +v 0.00251807 -0.0275 -0.0066962 +v 0.00276864 -0.0275 -0.006015 +v 0.00252846 -0.0275 -0.0072587 +v 0.00231247 -0.0275 -0.00831229 +v 0.0032963 -0.0275 -0.0081249 +v 0.0037536 -0.0275 -0.0071326 +v 0.003269 -0.0275 -0.0064222 +v 0.00501887 -0.0275 -0.00701337 +v 0.0047034 -0.0275 -0.0064148 +v 0.00433179 -0.0275 -0.008092 +v 0.0053672 -0.0275 -0.008059 +v 0.00108512 -0.0275 -0.0046796 +v 4.89628e-05 -0.0275 -0.00455 +v 0.00109717 -0.0275 -0.00390175 +v 4.8963e-05 -0.0275 -0.0038 +v 0.0020873 -0.0275 -0.0049554 +v 0.0020612 -0.0275 -0.00418508 +v 0.00104896 0.0225 -0.00232179 +v 4.8963e-05 0.0225 -0.00225 +v 4.8963e-05 0.0224614 -0.00094208 +v 0.00127296 0.0224614 -0.0010328 +v 4.8963e-05 0.0225 0 +v 0.0015038 0.0225 -0.000115125 +v 0.0021601 0.0225 -0.00257594 +v 0.002536 0.0224614 -0.00132308 +v 0.00284678 0.0225 -0.00043327 +v 0.00373546 0.0224614 -0.00180545 +v 0.0032438 0.0225 -0.0030216 +v 0.00408266 0.0225 -0.00092583 +v 0.0048854 0.0224614 -0.0025 +v 0.0043334 0.0225 -0.00371436 +v 0.0052903 0.0225 -0.0016283 +v 0.0059554 0.0224614 -0.00343458 +v 0.0054108 0.0225 -0.00475 +v 0.00635 0.0225 -0.002478 +v 0.0061985 0.0225 -0.0059058 +v 0.007018 0.0224787 -0.0047588 +v 0.0077593 0.0224908 -0.0061814 +v 0.006682 0.0225 -0.00701337 +v 0.0075997 0.0225 -0.0039069 +v 0.008537 0.0225 -0.0055736 +v 0.0082141 0.0224979 -0.0077284 +v 0.0069557 0.0225 -0.0081109 +v 0.009116 0.0225 -0.007419 +v 0.0022885 -0.00195405 -0.0082573 +v 0.0017277 -0.00115243 -0.0074655 +v 0.0017277 5.66e-08 -0.0074655 +v 0.0017277 -0.0023048 -0.0074655 +v 0.00102184 -0.0011524 -0.0070027 +v 0.0010918 -0.0023048 -0.007033 +v 4.8963e-05 -0.0023048 -0.0068001 +v 4.8963e-05 -0.0011524 -0.00680007 +v 0.0009519 2.24e-11 -0.0069725 +v 4.8963e-05 6.26e-10 -0.0068 +v 0.00120133 0.00115236 0.00225003 +v 0.00120133 0.00230474 0.00225 +v 4.8962e-05 0.00230474 0.00225 +v 4.8962e-05 0.00115234 0.00225007 +v 0.0023537 0.00115237 0.00225 +v 0.0023537 0.00230474 0.00225 +v 0.00120133 2.8e-08 0.00225007 +v 0.0023537 4.2e-16 0.00225 +v 4.8962e-05 -5.6e-08 0.00225014 +v 0.00338055 0.00113612 0.00225 +v 0.0034513 4.2e-16 0.00225 +v 0.00119592 0.00333005 0.00225 +v 4.8963e-05 0.0034442 0.00225 +v 0.00120133 -0.00115236 0.00225003 +v 4.8962e-05 -0.00115234 0.00225007 +v 4.8962e-05 -0.00230474 0.00225 +v 0.00120133 -0.00230474 0.00225 +v 0.0023537 -0.00115237 0.00225 +v 0.0023537 -0.00230474 0.00225 +v 0.00338055 -0.00113612 0.00225 +v 0.00119592 -0.00333005 0.00225 +v 4.8963e-05 -0.0034442 0.00225 +v -0.0065 0.003375 -0.0165157 +v -0.0079194 0.0033836 -0.0149475 +v -0.0089295 0.00338968 -0.0131919 +v -0.00789208 0.0047672 -0.0149277 +v -0.0088986 0.00477936 -0.013178 +v -0.0065 0.00475 -0.0164708 +v -0.0095725 0.0033932 -0.0111742 +v -0.009765 0.00339429 -0.00925 +v -0.0095392 0.0047864 -0.0111675 +v -0.009731 0.00478857 -0.00925 +v -0.007871 0.00616027 -0.014888 +v -0.0088701 0.0061845 -0.0131506 +v -0.0088366 0.0075587 -0.0131506 +v -0.0078374 0.0075345 -0.014888 +v -0.0065 0.006125 -0.0164258 +v -0.0065 0.0075 -0.0163808 +v -0.0095061 0.0061986 -0.011154 +v -0.0094726 0.0075728 -0.011154 +v -0.0096965 0.006203 -0.00925 +v -0.009663 0.0075771 -0.00925 +v -0.00104896 0.00438748 -0.02375 +v -0.0011137 0.0053555 -0.02375 +v -0.00148663 0.0075 -0.02375 +v -0.00216496 0.00397147 -0.02375 +v -0.00221962 0.0051977 -0.02375 +v -0.0029119 0.0075 -0.02375 +v -0.00323885 0.00317405 -0.02375 +v -0.00367495 0.005513 -0.02375 +v -0.0042271 0.0075 -0.02375 +v -0.0043992 0.00115128 -0.02375 +v -0.004549 -6.84e-16 -0.02375 +v -0.00552448 -6.84e-16 -0.02375 +v -0.0054496 0.00157564 -0.02375 +v -0.00523 0.00280044 -0.02375 +v -0.0039599 0.00222589 -0.02375 +v -0.0048694 0.003962 -0.02375 +v -0.0051534 0.005731 -0.02375 +v -0.0054374 0.0075 -0.02375 +v -0.0065 5.47e-15 -0.02375 +v -0.0065 0.003375 -0.02375 +v -0.0065 0.00475 -0.02375 +v -0.0065 0.006125 -0.02375 +v -0.0065 0.0075 -0.02375 +v -0.0011137 -0.0053555 -0.02375 +v -0.00104896 -0.00438748 -0.02375 +v -0.00148663 -0.0075 -0.02375 +v -0.00221962 -0.0051977 -0.02375 +v -0.00216496 -0.00397147 -0.02375 +v -0.0029119 -0.0075 -0.02375 +v -0.00367495 -0.005513 -0.02375 +v -0.00323885 -0.00317405 -0.02375 +v -0.0042271 -0.0075 -0.02375 +v -0.0043992 -0.00115128 -0.02375 +v -0.0054496 -0.00157564 -0.02375 +v -0.0039599 -0.00222589 -0.02375 +v -0.00523 -0.00280044 -0.02375 +v -0.0048694 -0.003962 -0.02375 +v -0.0051534 -0.005731 -0.02375 +v -0.0054374 -0.0075 -0.02375 +v -0.0065 -0.002 -0.02375 +v -0.0065 -0.003375 -0.02375 +v -0.0065 -0.00475 -0.02375 +v -0.0065 -0.006125 -0.02375 +v -0.0065 -0.0075 -0.02375 +v -0.00109717 -0.0175 -0.0145982 +v -0.00124515 -0.0175 -0.0163737 +v -0.00139314 -0.0175 -0.018149 +v -0.0020612 -0.0175 -0.014315 +v -0.00238149 -0.0175 -0.0160825 +v -0.00270178 -0.0175 -0.01785 +v -0.00312345 -0.0175 -0.01375 +v -0.00354179 -0.0175 -0.0155529 +v -0.0039601 -0.0175 -0.0173557 +v -0.00391928 -0.0175 -0.013087 +v -0.00448925 -0.0175 -0.0149068 +v -0.0050592 -0.0175 -0.0167264 +v -0.00429036 -0.0175 -0.0126724 +v -0.00529216 -0.0175 -0.0142016 +v -0.006294 -0.0175 -0.0157307 +v -0.0047034 -0.0175 -0.0120852 +v -0.00501887 -0.0175 -0.0114866 +v -0.0066761 -0.0175 -0.0121268 +v -0.006085 -0.0175 -0.0132161 +v -0.0083333 -0.0175 -0.012767 +v -0.00746649 -0.0175 -0.014347 +v -0.0053672 -0.0175 -0.010441 +v -0.00712418 -0.0175 -0.0107105 +v -0.0088811 -0.0175 -0.01098 +v -0.005499 -0.0175 -0.00925 +v -0.007274 -0.0175 -0.00925 +v -0.009049 -0.0175 -0.00925 +v -0.00106101 -0.0275 -0.0122646 +v -0.00107307 -0.0275 -0.0130425 +v -0.00104896 -0.0275 -0.0114868 +v -0.0019891 -0.0275 -0.0118203 +v -0.002086 -0.0275 -0.0127852 +v -0.00178137 -0.0275 -0.0109825 +v -0.00251807 -0.0275 -0.0118038 +v -0.00276864 -0.0275 -0.012485 +v -0.00252846 -0.0275 -0.0112413 +v -0.00231247 -0.0275 -0.0101877 +v -0.0032963 -0.0275 -0.0103751 +v -0.00249896 -0.0275 -0.00925 +v -0.0033171 -0.0275 -0.0092501 +v -0.0037536 -0.0275 -0.0113674 +v -0.003269 -0.0275 -0.0120778 +v -0.00501887 -0.0275 -0.0114866 +v -0.0047034 -0.0275 -0.0120852 +v -0.00433179 -0.0275 -0.010408 +v -0.0053672 -0.0275 -0.010441 +v -0.004509 -0.0275 -0.00925 +v -0.005499 -0.0275 -0.00925 +v -0.00108512 -0.0275 -0.0138204 +v -0.00109717 -0.0275 -0.0145982 +v -0.0020873 -0.0275 -0.0135446 +v -0.0020612 -0.0275 -0.014315 +v -0.00104896 0.0225 -0.0161782 +v -0.00127296 0.0224614 -0.0174672 +v -0.0015038 0.0225 -0.0183849 +v -0.0021601 0.0225 -0.015924 +v -0.002536 0.0224614 -0.017177 +v -0.00284678 0.0225 -0.0180667 +v -0.00373546 0.0224614 -0.0166946 +v -0.0032438 0.0225 -0.0154784 +v -0.00408266 0.0225 -0.017574 +v -0.0048854 0.0224614 -0.016 +v -0.0043334 0.0225 -0.0147856 +v -0.0052903 0.0225 -0.0168717 +v -0.0059554 0.0224614 -0.0150654 +v -0.0054108 0.0225 -0.01375 +v -0.00635 0.0225 -0.016022 +v -0.0061985 0.0225 -0.0125942 +v -0.007018 0.0224787 -0.0137412 +v -0.0077593 0.0224908 -0.0123186 +v -0.006682 0.0225 -0.0114866 +v -0.0075997 0.0225 -0.014593 +v -0.008537 0.0225 -0.0129264 +v -0.0082141 0.0224979 -0.0107716 +v -0.0069557 0.0225 -0.010389 +v -0.009116 0.0225 -0.011081 +v -0.008356 0.0225 -0.00925 +v -0.007049 0.0225 -0.00925 +v -0.009299 0.0225 -0.00925 +v -0.00249896 -0.0018873 -0.00925 +v -0.0022885 -0.00195405 -0.0102427 +v -0.0017277 -0.00115243 -0.0110345 +v -0.0017277 5.66e-08 -0.0110345 +v -0.0017277 -0.0023048 -0.0110345 +v -0.000781428 -0.00161437 -0.011588 +v -0.0010918 -0.0023048 -0.011467 +v -0.00133196 -0.00150598 -0.0113372 +v -0.00139701 -0.00076758 -0.0112958 +v -0.00141894 5.66e-08 -0.0112812 +v -0.00096135 -0.00040932 -0.0115238 +v -0.00104896 -6.98e-16 -0.0114866 +v -0.00074085 -0.0007218 -0.0116002 +v -0.000427704 -0.00092555 -0.0116705 +v -0.0065 0.003375 -0.00198425 +v -0.0079194 0.0033836 -0.0035525 +v -0.0089295 0.00338968 -0.0053081 +v -0.00789208 0.0047672 -0.00357229 +v -0.0088986 0.00477936 -0.00532189 +v -0.0065 0.00475 -0.00202923 +v -0.0095725 0.0033932 -0.0073258 +v -0.0095392 0.0047864 -0.0073325 +v -0.007871 0.00616027 -0.00361186 +v -0.0088701 0.0061845 -0.0053494 +v -0.0078374 0.0075345 -0.00361186 +v -0.0088366 0.0075587 -0.0053494 +v -0.0065 0.006125 -0.0020742 +v -0.0065 0.0075 -0.00211917 +v -0.0095061 0.0061986 -0.007346 +v -0.0094726 0.0075728 -0.007346 +v -0.000902 0.0044184 0.00225 +v -0.0011137 0.0053555 0.00225 +v -0.00149694 0.0075 0.00225 +v -0.00221962 0.0051977 0.00225 +v -0.0029119 0.0075 0.00225 +v -0.00352837 0.00529856 0.00225 +v -0.0042271 0.0075 0.00225 +v -0.0043992 0.00115128 0.00225 +v -0.0052181 0.00148194 0.00225 +v -0.00530456 -1.38e-15 0.00225 +v -0.004549 -1.38e-15 0.00225 +v -0.00503615 0.0027323 0.00225 +v -0.0047612 0.00394096 0.00225 +v -0.0049116 0.00555049 0.00225 +v -0.0054374 0.0075 0.00225 +v -0.0065 1.92e-08 0.00225 +v -0.0065 0.003375 0.00225 +v -0.0065 0.00475 0.00225 +v -0.0065 0.006125 0.00225 +v -0.0065 0.0075 0.00225 +v -0.000902 -0.0044184 0.00225 +v -0.0011137 -0.0053555 0.00225 +v -0.00149694 -0.0075 0.00225 +v -0.00221962 -0.0051977 0.00225 +v -0.0029119 -0.0075 0.00225 +v -0.00352837 -0.00529856 0.00225 +v -0.0042271 -0.0075 0.00225 +v -0.0043992 -0.00115128 0.00225 +v -0.0052181 -0.00148194 0.00225 +v -0.00503615 -0.0027323 0.00225 +v -0.0047612 -0.00394096 0.00225 +v -0.0049116 -0.00555049 0.00225 +v -0.0054374 -0.0075 0.00225 +v -0.0065 -0.002 0.00225 +v -0.0065 -0.003375 0.00225 +v -0.0065 -0.00475 0.00225 +v -0.0065 -0.006125 0.00225 +v -0.0065 -0.0075 0.00225 +v -0.00124515 -0.0175 -0.00212635 +v -0.00109717 -0.0175 -0.00390175 +v -0.00139314 -0.0175 -0.000350945 +v -0.00238149 -0.0175 -0.00241747 +v -0.0020612 -0.0175 -0.00418508 +v -0.00270178 -0.0175 -0.00064985 +v -0.00354179 -0.0175 -0.00294714 +v -0.00312345 -0.0175 -0.00475 +v -0.0039601 -0.0175 -0.00114427 +v -0.00448925 -0.0175 -0.00359324 +v -0.00391928 -0.0175 -0.0054129 +v -0.0050592 -0.0175 -0.00177355 +v -0.00529216 -0.0175 -0.0042984 +v -0.00429036 -0.0175 -0.00582756 +v -0.006294 -0.0175 -0.00276926 +v -0.0047034 -0.0175 -0.0064148 +v -0.006085 -0.0175 -0.00528385 +v -0.0066761 -0.0175 -0.00637318 +v -0.00501887 -0.0175 -0.00701337 +v -0.00746649 -0.0175 -0.0041529 +v -0.0083333 -0.0175 -0.005733 +v -0.0053672 -0.0175 -0.008059 +v -0.00712418 -0.0175 -0.00778949 +v -0.0088811 -0.0175 -0.00752 +v -0.00107307 -0.0275 -0.0054575 +v -0.00106101 -0.0275 -0.00623537 +v -0.00104896 -0.0275 -0.0070132 +v -0.002086 -0.0275 -0.00571477 +v -0.0019891 -0.0275 -0.00667967 +v -0.00178137 -0.0275 -0.0075175 +v -0.00251807 -0.0275 -0.0066962 +v -0.00276864 -0.0275 -0.006015 +v -0.00252846 -0.0275 -0.0072587 +v -0.00231247 -0.0275 -0.00831229 +v -0.0032963 -0.0275 -0.0081249 +v -0.003269 -0.0275 -0.0064222 +v -0.0037536 -0.0275 -0.0071326 +v -0.0047034 -0.0275 -0.0064148 +v -0.00501887 -0.0275 -0.00701337 +v -0.00433179 -0.0275 -0.008092 +v -0.0053672 -0.0275 -0.008059 +v -0.00108512 -0.0275 -0.0046796 +v -0.00109717 -0.0275 -0.00390175 +v -0.0020873 -0.0275 -0.0049554 +v -0.0020612 -0.0275 -0.00418508 +v -0.00104896 0.0225 -0.00232179 +v -0.00127296 0.0224614 -0.0010328 +v -0.0015038 0.0225 -0.000115125 +v -0.0021601 0.0225 -0.00257594 +v -0.002536 0.0224614 -0.00132308 +v -0.00284678 0.0225 -0.00043327 +v -0.0032438 0.0225 -0.0030216 +v -0.00373546 0.0224614 -0.00180545 +v -0.00408266 0.0225 -0.00092583 +v -0.0043334 0.0225 -0.00371436 +v -0.0048854 0.0224614 -0.0025 +v -0.0052903 0.0225 -0.0016283 +v -0.0054108 0.0225 -0.00475 +v -0.0059554 0.0224614 -0.00343458 +v -0.00635 0.0225 -0.002478 +v -0.0061985 0.0225 -0.0059058 +v -0.006682 0.0225 -0.00701337 +v -0.0077593 0.0224908 -0.0061814 +v -0.007018 0.0224787 -0.0047588 +v -0.008537 0.0225 -0.0055736 +v -0.0075997 0.0225 -0.0039069 +v -0.0069557 0.0225 -0.0081109 +v -0.0082141 0.0224979 -0.0077284 +v -0.009116 0.0225 -0.007419 +v -0.0022885 -0.00195405 -0.0082573 +v -0.0017277 5.66e-08 -0.0074655 +v -0.0017277 -0.00115243 -0.0074655 +v -0.0017277 -0.0023048 -0.0074655 +v -0.00102184 -0.0011524 -0.0070027 +v -0.0010918 -0.0023048 -0.007033 +v -0.0009519 2.24e-11 -0.0069725 +v -0.00120133 0.00115236 0.00225003 +v -0.00120133 0.00230474 0.00225 +v -0.0023537 0.00115237 0.00225 +v -0.0023537 0.00230474 0.00225 +v -0.00120133 2.8e-08 0.00225007 +v -0.0023537 4.2e-16 0.00225 +v -0.00338055 0.00113612 0.00225 +v -0.0034513 4.2e-16 0.00225 +v -0.00119592 0.00333005 0.00225 +v -0.00120133 -0.00115236 0.00225003 +v -0.00120133 -0.00230474 0.00225 +v -0.0023537 -0.00115237 0.00225 +v -0.0023537 -0.00230474 0.00225 +v -0.00338055 -0.00113612 0.00225 +v -0.00119592 -0.00333005 0.00225 +v 0.0039486 0.00224557 -0.01485 +v 0.0039486 0.00224557 -0.0143 +v 0.0032389 0.00317894 -0.0146142 +v 0.0032438 0.00317894 -0.0154784 +v 0.0039486 -0.00224557 -0.01485 +v 0.0032438 -0.00317894 -0.0154784 +v 0.0032389 -0.00317894 -0.0146142 +v 0.0039486 -0.00224557 -0.0143 +v 0.0088096 9.5e-11 0.00225 +v 0.0120291 9.5e-11 0.00225 +v -0.0039486 0.00224557 -0.01485 +v -0.0032438 0.00317894 -0.0154784 +v -0.0032389 0.00317894 -0.0146142 +v -0.0039486 0.00224557 -0.0143 +v -0.0039486 -0.00224557 -0.01485 +v -0.0039486 -0.00224557 -0.0143 +v -0.0032389 -0.00317894 -0.0146142 +v -0.0032438 -0.00317894 -0.0154784 +v -0.0120291 9.5e-11 0.00225 +v -0.0088096 9.5e-11 0.00225 +v 0.00338055 0.00113612 -0.01375 +v 0.0044074 0.00111986 -0.01375 +v 0.00345133 -3.26e-18 -0.01375 +v 0.004549 -3.91e-18 -0.01375 +v 0.001191 0.00333005 -0.01375 +v 4.8963e-05 0.00340234 -0.01375 +v 0.00118068 0.00435537 -0.01375 +v 4.8963e-05 0.0044999 -0.01375 +v 4.8963e-05 0.0044999 -0.015 +v 0.00118068 0.00435537 -0.015 +v 0.0011137 0.00435537 -0.0161782 +v 4.8963e-05 0.0044999 -0.01625 +v 0.002302 0.00389537 -0.015 +v 0.00227915 0.00389537 -0.015924 +v 0.0044074 0.00111986 -0.0143 +v 0.004549 -3.91e-18 -0.014375 +v 0.0011137 0.0043554 -0.017486 +v 4.8963e-05 0.0045 -0.017558 +v 0.000902 0.0044184 -0.0187562 +v 4.8963e-05 0.0045 -0.0188659 +v 0.00227915 0.0038954 -0.017232 +v 0.00216496 0.00397147 -0.0184252 +v 0.0032438 0.00317897 -0.0167863 +v 0.0032438 0.003179 -0.018094 +v 4.8963e-05 0.0045 -0.020494 +v 0.000902 0.0044184 -0.0203843 +v 0.000902 0.0044184 -0.0220123 +v 4.8963e-05 0.0045 -0.022122 +v 0.00216496 0.00397147 -0.0201824 +v 0.00216496 0.00397147 -0.0219396 +v 0.00324218 0.00317736 -0.0199606 +v 0.00324054 0.00317573 -0.021827 +v 0.00338055 -0.00113612 -0.01375 +v 0.0044074 -0.00111986 -0.01375 +v 0.001191 -0.00333005 -0.01375 +v 4.8963e-05 -0.00340234 -0.01375 +v 0.00118068 -0.00435537 -0.01375 +v 4.8963e-05 -0.0044999 -0.01375 +v 0.00118068 -0.00435537 -0.015 +v 4.8963e-05 -0.0044999 -0.015 +v 0.0011137 -0.00435537 -0.0161782 +v 4.8963e-05 -0.0044999 -0.01625 +v 0.002302 -0.00389537 -0.015 +v 0.00227915 -0.00389537 -0.015924 +v 0.0044074 -0.00111986 -0.0143 +v 0.0011137 -0.0043554 -0.017486 +v 4.8963e-05 -0.0045 -0.017558 +v 0.000902 -0.0044184 -0.0187562 +v 4.8963e-05 -0.0045 -0.0188659 +v 0.00227915 -0.0038954 -0.017232 +v 0.00216496 -0.00397147 -0.0184252 +v 0.0032438 -0.00317897 -0.0167863 +v 0.0032438 -0.003179 -0.018094 +v 0.000902 -0.0044184 -0.0203843 +v 4.8963e-05 -0.0045 -0.020494 +v 0.000902 -0.0044184 -0.0220123 +v 4.8963e-05 -0.0045 -0.022122 +v 0.00216496 -0.00397147 -0.0201824 +v 0.00216496 -0.00397147 -0.0219396 +v 0.00324218 -0.00317736 -0.0199606 +v 0.00324054 -0.00317573 -0.021827 +v 4.8963e-05 0.0065 -0.01625 +v 0.00104896 0.0065 -0.0161782 +v 0.00104896 0.0085771 -0.0161782 +v 4.8963e-05 0.0085771 -0.01625 +v 0.0021601 0.0065 -0.015924 +v 0.0021601 0.0085771 -0.015924 +v 0.0032438 0.0065 -0.0154784 +v 0.0032438 0.0085771 -0.0154784 +v 0.0043334 0.0065 -0.0147856 +v 0.0043334 0.0085771 -0.0147856 +v 0.0054108 0.0065 -0.01375 +v 0.0054108 0.0085771 -0.01375 +v 0.0061985 0.0065 -0.0125942 +v 0.006682 0.0065 -0.0114866 +v 0.006682 0.0085771 -0.0114866 +v 0.0061985 0.0085771 -0.0125942 +v 0.0069557 0.0065 -0.010389 +v 0.0069557 0.0085771 -0.010389 +v 0.007049 0.0065 -0.00925 +v 0.007049 0.0085771 -0.00925 +v 0.00104896 0.0065 -0.0023218 +v 4.8963e-05 0.0065 -0.00225 +v 4.8963e-05 0.0085771 -0.00225 +v 0.00104896 0.0085771 -0.0023218 +v 0.0021601 0.0065 -0.00257594 +v 0.0021601 0.0085771 -0.00257594 +v 0.0032438 0.0065 -0.0030216 +v 0.0032438 0.0085771 -0.0030216 +v 0.0043334 0.0065 -0.00371436 +v 0.0043334 0.0085771 -0.00371436 +v 0.0054108 0.0065 -0.00475 +v 0.0054108 0.0085771 -0.00475 +v 0.006682 0.0065 -0.00701337 +v 0.0061985 0.0065 -0.00590579 +v 0.0061985 0.0085771 -0.00590579 +v 0.006682 0.0085771 -0.00701337 +v 0.0069557 0.0065 -0.0081109 +v 0.0069557 0.0085771 -0.0081109 +v -0.00338055 0.00113612 -0.01375 +v -0.0044074 0.00111986 -0.01375 +v -0.00345133 -3.26e-18 -0.01375 +v -0.004549 -3.91e-18 -0.01375 +v -0.001191 0.00333005 -0.01375 +v -0.00118068 0.00435537 -0.01375 +v -0.00118068 0.00435537 -0.015 +v -0.0011137 0.00435537 -0.0161782 +v -0.002302 0.00389537 -0.015 +v -0.00227915 0.00389537 -0.015924 +v -0.0044074 0.00111986 -0.0143 +v -0.004549 -3.91e-18 -0.014375 +v -0.0011137 0.0043554 -0.017486 +v -0.000902 0.0044184 -0.0187562 +v -0.00227915 0.0038954 -0.017232 +v -0.00216496 0.00397147 -0.0184252 +v -0.0032438 0.00317897 -0.0167863 +v -0.0032438 0.003179 -0.018094 +v -0.000902 0.0044184 -0.0203843 +v -0.000902 0.0044184 -0.0220123 +v -0.00216496 0.00397147 -0.0201824 +v -0.00216496 0.00397147 -0.0219396 +v -0.00324218 0.00317736 -0.0199606 +v -0.00324054 0.00317573 -0.021827 +v -0.00338055 -0.00113612 -0.01375 +v -0.0044074 -0.00111986 -0.01375 +v -0.001191 -0.00333005 -0.01375 +v -0.00118068 -0.00435537 -0.01375 +v -0.00118068 -0.00435537 -0.015 +v -0.0011137 -0.00435537 -0.0161782 +v -0.002302 -0.00389537 -0.015 +v -0.00227915 -0.00389537 -0.015924 +v -0.0044074 -0.00111986 -0.0143 +v -0.0011137 -0.0043554 -0.017486 +v -0.000902 -0.0044184 -0.0187562 +v -0.00227915 -0.0038954 -0.017232 +v -0.00216496 -0.00397147 -0.0184252 +v -0.0032438 -0.00317897 -0.0167863 +v -0.0032438 -0.003179 -0.018094 +v -0.000902 -0.0044184 -0.0203843 +v -0.000902 -0.0044184 -0.0220123 +v -0.00216496 -0.00397147 -0.0201824 +v -0.00216496 -0.00397147 -0.0219396 +v -0.00324218 -0.00317736 -0.0199606 +v -0.00324054 -0.00317573 -0.021827 +v -0.00104896 0.0065 -0.0161782 +v -0.00104896 0.0085771 -0.0161782 +v -0.0021601 0.0065 -0.015924 +v -0.0021601 0.0085771 -0.015924 +v -0.0032438 0.0065 -0.0154784 +v -0.0032438 0.0085771 -0.0154784 +v -0.0043334 0.0065 -0.0147856 +v -0.0043334 0.0085771 -0.0147856 +v -0.0054108 0.0065 -0.01375 +v -0.0054108 0.0085771 -0.01375 +v -0.006682 0.0065 -0.0114866 +v -0.0061985 0.0065 -0.0125942 +v -0.0061985 0.0085771 -0.0125942 +v -0.006682 0.0085771 -0.0114866 +v -0.0069557 0.0065 -0.010389 +v -0.0069557 0.0085771 -0.010389 +v -0.007049 0.0065 -0.00925 +v -0.007049 0.0085771 -0.00925 +v -0.00104896 0.0065 -0.0023218 +v -0.00104896 0.0085771 -0.0023218 +v -0.0021601 0.0065 -0.00257594 +v -0.0021601 0.0085771 -0.00257594 +v -0.0032438 0.0065 -0.0030216 +v -0.0032438 0.0085771 -0.0030216 +v -0.0043334 0.0065 -0.00371436 +v -0.0043334 0.0085771 -0.00371436 +v -0.0054108 0.0065 -0.00475 +v -0.0054108 0.0085771 -0.00475 +v -0.0061985 0.0065 -0.00590579 +v -0.006682 0.0065 -0.00701337 +v -0.006682 0.0085771 -0.00701337 +v -0.0061985 0.0085771 -0.00590579 +v -0.0069557 0.0065 -0.0081109 +v -0.0069557 0.0085771 -0.0081109 +v 0.004549 -3.91e-18 -0.01485 +v 0.0044074 -0.00111986 -0.01485 +v 0.00391928 -0.0195 -0.013087 +v 0.00312345 -0.0195 -0.01375 +v 0.00391928 -0.0215 -0.013087 +v 0.00312345 -0.0215 -0.01375 +v 0.00391928 -0.0235 -0.013087 +v 0.00312345 -0.0235 -0.01375 +v 0.00391928 -0.0255 -0.013087 +v 0.00312345 -0.0255 -0.01375 +v 0.00429036 -0.0195 -0.0126724 +v 0.00429036 -0.0215 -0.0126724 +v 0.00429036 -0.0235 -0.0126724 +v 0.00429036 -0.0255 -0.0126724 +v 0.00170827 -0.00324768 -0.0074478 +v 0.0022838 -0.00293108 -0.008247 +v 0.0022791 -0.0039081 -0.0082366 +v 0.00168883 -0.00419057 -0.00743008 +v 0.00249896 -0.00377459 -0.00925 +v 0.00249896 -0.00283094 -0.00925 +v -0.004549 -3.91e-18 -0.01485 +v -0.0044074 0.00111986 -0.01485 +v -0.00170827 -0.00324768 -0.0110522 +v -0.0022838 -0.00293108 -0.010253 +v -0.0022791 -0.0039081 -0.0102634 +v -0.00168883 -0.00419057 -0.01107 +v -0.00249896 -0.00377459 -0.00925 +v -0.00249896 -0.00283094 -0.00925 +v -0.00391928 -0.0195 -0.0054129 +v -0.00312345 -0.0195 -0.00475 +v -0.00391928 -0.0215 -0.0054129 +v -0.00312345 -0.0215 -0.00475 +v -0.00391928 -0.0235 -0.0054129 +v -0.00312345 -0.0235 -0.00475 +v -0.00391928 -0.0255 -0.0054129 +v -0.00312345 -0.0255 -0.00475 +v -0.00429036 -0.0195 -0.00582756 +v -0.00429036 -0.0215 -0.00582756 +v -0.00429036 -0.0235 -0.00582756 +v -0.00429036 -0.0255 -0.00582756 +v -0.0120291 -0.0075 0.00225 +v -0.0088096 -0.0075 0.00225 +v -0.0088096 -0.006 0.00225 +v -0.0120291 -0.006 0.00225 +v -0.0088096 -0.0045 0.00225 +v -0.0120291 -0.0045 0.00225 +v -0.0088096 -0.003 0.00225 +v -0.0120291 -0.003 0.00225 +v -0.0088096 -0.0015 0.00225 +v -0.0120291 -0.0015 0.00225 +v 0.0044074 0.00111986 -0.01485 +v 0.0044074 0.00111989 -0.0161579 +v 0.004549 2.82e-08 -0.0161579 +v 0.004549 5.64e-08 -0.0174658 +v 0.0043992 0.00115128 -0.0176229 +v 0.0039486 0.0022456 -0.0161579 +v 0.0039599 0.00222589 -0.01778 +v 0.0043992 0.00115128 -0.0196448 +v 0.004549 3.78e-08 -0.0195396 +v 0.0043992 0.00115128 -0.0216668 +v 0.004549 1.92e-08 -0.0216134 +v 0.0039599 0.00222589 -0.01975 +v 0.0039599 0.00222589 -0.02172 +v 0.0065 0.003375 0.00040305 +v 0.0065 0.00475 0.00037292 +v 0.0065 0.006125 0.000342788 +v 0.0065 0.0075 0.000312658 +v 0.0022958 -0.005204 -0.0082745 +v 0.0017351 -0.00534529 -0.0074738 +v 0.00231247 -0.0075 -0.00831229 +v 0.00178137 -0.0075 -0.0075175 +v 0.00249896 -0.0051373 -0.00925 +v 0.00249896 -0.0075 -0.00925 +v 0.00231247 -0.01 -0.00831229 +v 0.00178137 -0.01 -0.0075175 +v 0.00231247 -0.0125 -0.00831229 +v 0.00178137 -0.0125 -0.0075175 +v 0.00231247 -0.015 -0.00831229 +v 0.00178137 -0.015 -0.0075175 +v 0.00231247 -0.0175 -0.00831229 +v 0.00178137 -0.0175 -0.0075175 +v 0.00249896 -0.01 -0.00925 +v 0.00249896 -0.0125 -0.00925 +v 0.00249896 -0.015 -0.00925 +v 0.00249896 -0.0175 -0.00925 +v 0.00231247 -0.0195 -0.00831229 +v 0.00178137 -0.0195 -0.0075175 +v 0.00231247 -0.0215 -0.00831229 +v 0.00178137 -0.0215 -0.0075175 +v 0.00231247 -0.0235 -0.00831229 +v 0.00178137 -0.0235 -0.0075175 +v 0.00231247 -0.0255 -0.00831229 +v 0.00178137 -0.0255 -0.0075175 +v 0.00249896 -0.0195 -0.00925 +v 0.00249896 -0.0215 -0.00925 +v 0.00249896 -0.0235 -0.00925 +v 0.00249896 -0.0255 -0.00925 +v 0.025665 9.5e-11 -0.0068919 +v 0.0260093 9.5e-11 -0.00925 +v 0.024661 9.5e-11 -0.0047304 +v 0.0230815 9.5e-11 -0.0029463 +v 0.0210577 9.5e-11 -0.00168803 +v 0.0194085 9.5e-11 -0.0009687 +v 0.0177593 9.5e-11 -0.000249369 +v 0.025665 -0.0015 -0.0068919 +v 0.0260093 -0.0015 -0.00925 +v 0.025665 -0.003 -0.0068919 +v 0.0260093 -0.003 -0.00925 +v 0.025665 -0.0045 -0.0068919 +v 0.0260093 -0.0045 -0.00925 +v 0.025665 -0.006 -0.0068919 +v 0.0260093 -0.006 -0.00925 +v 0.025665 -0.0075 -0.0068919 +v 0.0260093 -0.0075 -0.00925 +v 0.024661 -0.0015 -0.0047304 +v 0.024661 -0.003 -0.0047304 +v 0.024661 -0.0045 -0.0047304 +v 0.024661 -0.006 -0.0047304 +v 0.024661 -0.0075 -0.0047304 +v 0.0230815 -0.0015 -0.0029463 +v 0.0230815 -0.003 -0.0029463 +v 0.0230815 -0.0045 -0.0029463 +v 0.0230815 -0.006 -0.0029463 +v 0.0230815 -0.0075 -0.0029463 +v 0.0210577 -0.0015 -0.00168803 +v 0.0210577 -0.003 -0.00168803 +v 0.0210577 -0.0045 -0.00168803 +v 0.0210577 -0.006 -0.00168803 +v 0.0210577 -0.0075 -0.00168803 +v 0.0194085 -0.0015 -0.0009687 +v 0.0194085 -0.003 -0.0009687 +v 0.0194085 -0.0045 -0.0009687 +v 0.0194085 -0.006 -0.0009687 +v 0.0194085 -0.0075 -0.0009687 +v 0.0177593 -0.0015 -0.000249369 +v 0.0177593 -0.003 -0.000249369 +v 0.0177593 -0.0045 -0.000249369 +v 0.0177593 -0.006 -0.000249369 +v 0.0177593 -0.0075 -0.000249369 +v 0.0139774 9.5e-11 0.00140021 +v 0.0158684 9.5e-11 0.00057542 +v 0.0139774 -0.0015 0.00140021 +v 0.0158684 -0.0015 0.00057542 +v 0.0139774 -0.003 0.00140021 +v 0.0158684 -0.003 0.00057542 +v 0.0139774 -0.0045 0.00140021 +v 0.0158684 -0.0045 0.00057542 +v 0.0139774 -0.006 0.00140021 +v 0.0158684 -0.006 0.00057542 +v 0.0139774 -0.0075 0.00140021 +v 0.0158684 -0.0075 0.00057542 +v -0.0065 0.003375 -0.018903 +v -0.0065 0.003375 -0.0212904 +v -0.0065 0.00475 -0.018873 +v -0.0065 0.00475 -0.021275 +v -0.0065 0.006125 -0.0188428 +v -0.0065 0.006125 -0.0212598 +v -0.0065 0.0075 -0.0188127 +v -0.0065 0.0075 -0.0212445 +v -0.0022958 -0.005204 -0.0102255 +v -0.0017351 -0.00534529 -0.0110262 +v -0.00231247 -0.0075 -0.0101877 +v -0.00178137 -0.0075 -0.0109825 +v -0.00249896 -0.0051373 -0.00925 +v -0.00249896 -0.0075 -0.00925 +v -0.0044074 -0.00111986 -0.01485 +v -0.0044074 -0.00111989 -0.0161579 +v -0.004549 2.82e-08 -0.0161579 +v -0.004549 5.64e-08 -0.0174658 +v -0.0043992 -0.00115128 -0.0176229 +v -0.0039486 -0.0022456 -0.0161579 +v -0.0039599 -0.00222589 -0.01778 +v -0.0043992 -0.00115128 -0.0196448 +v -0.004549 3.78e-08 -0.0195396 +v -0.0043992 -0.00115128 -0.0216668 +v -0.004549 1.92e-08 -0.0216134 +v -0.0039599 -0.00222589 -0.01975 +v -0.0039599 -0.00222589 -0.02172 +v -0.00231247 -0.01 -0.0101877 +v -0.00178137 -0.01 -0.0109825 +v -0.00231247 -0.0125 -0.0101877 +v -0.00178137 -0.0125 -0.0109825 +v -0.00231247 -0.015 -0.0101877 +v -0.00178137 -0.015 -0.0109825 +v -0.00231247 -0.0175 -0.0101877 +v -0.00178137 -0.0175 -0.0109825 +v -0.00249896 -0.01 -0.00925 +v -0.00249896 -0.0125 -0.00925 +v -0.00249896 -0.015 -0.00925 +v -0.00249896 -0.0175 -0.00925 +v -0.00231247 -0.0195 -0.0101877 +v -0.00178137 -0.0195 -0.0109825 +v -0.00231247 -0.0215 -0.0101877 +v -0.00178137 -0.0215 -0.0109825 +v -0.00231247 -0.0235 -0.0101877 +v -0.00178137 -0.0235 -0.0109825 +v -0.00231247 -0.0255 -0.0101877 +v -0.00178137 -0.0255 -0.0109825 +v -0.00249896 -0.0195 -0.00925 +v -0.00249896 -0.0215 -0.00925 +v -0.00249896 -0.0235 -0.00925 +v -0.00249896 -0.0255 -0.00925 +v -0.0139919 9.5e-11 -0.020182 +v -0.0159418 9.5e-11 -0.0192534 +v -0.0139919 -0.0015 -0.020182 +v -0.0159418 -0.0015 -0.0192534 +v -0.0139919 -0.003 -0.020182 +v -0.0159418 -0.003 -0.0192534 +v -0.0139919 -0.0045 -0.020182 +v -0.0159418 -0.0045 -0.0192534 +v -0.0139919 -0.006 -0.020182 +v -0.0159418 -0.006 -0.0192534 +v -0.0139919 -0.0075 -0.020182 +v -0.0159418 -0.0075 -0.0192534 +v -0.025665 9.5e-11 -0.0116081 +v -0.0260093 9.5e-11 -0.00925 +v -0.024661 9.5e-11 -0.0137696 +v -0.0230815 9.5e-11 -0.0155537 +v -0.0210577 9.5e-11 -0.016812 +v -0.01945 9.5e-11 -0.0175827 +v -0.0177593 9.5e-11 -0.0183878 +v -0.025665 -0.0015 -0.0116081 +v -0.0260093 -0.0015 -0.00925 +v -0.025665 -0.003 -0.0116081 +v -0.0260093 -0.003 -0.00925 +v -0.025665 -0.0045 -0.0116081 +v -0.0260093 -0.0045 -0.00925 +v -0.025665 -0.006 -0.0116081 +v -0.0260093 -0.006 -0.00925 +v -0.025665 -0.0075 -0.0116081 +v -0.0260093 -0.0075 -0.00925 +v -0.024661 -0.0015 -0.0137696 +v -0.024661 -0.003 -0.0137696 +v -0.024661 -0.0045 -0.0137696 +v -0.024661 -0.006 -0.0137696 +v -0.024661 -0.0075 -0.0137696 +v -0.0230815 -0.0015 -0.0155537 +v -0.0230815 -0.003 -0.0155537 +v -0.0230815 -0.0045 -0.0155537 +v -0.0230815 -0.006 -0.0155537 +v -0.0230815 -0.0075 -0.0155537 +v -0.0210577 -0.0015 -0.016812 +v -0.0210577 -0.003 -0.016812 +v -0.0210577 -0.0045 -0.016812 +v -0.0210577 -0.006 -0.016812 +v -0.0210577 -0.0075 -0.016812 +v -0.01945 -0.0015 -0.0175827 +v -0.01945 -0.003 -0.0175827 +v -0.01945 -0.0045 -0.0175827 +v -0.01945 -0.006 -0.0175827 +v -0.01945 -0.0075 -0.0175827 +v -0.0177593 -0.0015 -0.0183878 +v -0.0177593 -0.003 -0.0183878 +v -0.0177593 -0.0045 -0.0183878 +v -0.0177593 -0.006 -0.0183878 +v -0.0177593 -0.0075 -0.0183878 +v 0.00170827 -0.00324768 -0.0110522 +v 0.00168883 -0.00419057 -0.01107 +v 0.0022791 -0.0039081 -0.0102634 +v 0.0022838 -0.00293108 -0.010253 +v 0.00312345 -0.0195 -0.00475 +v 0.00391928 -0.0195 -0.0054129 +v 0.00312345 -0.0215 -0.00475 +v 0.00391928 -0.0215 -0.0054129 +v 0.00312345 -0.0235 -0.00475 +v 0.00391928 -0.0235 -0.0054129 +v 0.00312345 -0.0255 -0.00475 +v 0.00391928 -0.0255 -0.0054129 +v 0.00429036 -0.0195 -0.00582756 +v 0.00429036 -0.0215 -0.00582756 +v 0.00429036 -0.0235 -0.00582756 +v 0.00429036 -0.0255 -0.00582756 +v 0.0120291 -0.0075 0.00225 +v 0.0120291 -0.006 0.00225 +v 0.0088096 -0.006 0.00225 +v 0.0088096 -0.0075 0.00225 +v 0.0120291 -0.0045 0.00225 +v 0.0088096 -0.0045 0.00225 +v 0.0120291 -0.003 0.00225 +v 0.0088096 -0.003 0.00225 +v 0.0120291 -0.0015 0.00225 +v 0.0088096 -0.0015 0.00225 +v -0.00312345 -0.0195 -0.01375 +v -0.00391928 -0.0195 -0.013087 +v -0.00312345 -0.0215 -0.01375 +v -0.00391928 -0.0215 -0.013087 +v -0.00312345 -0.0235 -0.01375 +v -0.00391928 -0.0235 -0.013087 +v -0.00312345 -0.0255 -0.01375 +v -0.00391928 -0.0255 -0.013087 +v -0.00429036 -0.0195 -0.0126724 +v -0.00429036 -0.0215 -0.0126724 +v -0.00429036 -0.0235 -0.0126724 +v -0.00429036 -0.0255 -0.0126724 +v -0.00170827 -0.00324768 -0.0074478 +v -0.00168883 -0.00419057 -0.00743008 +v -0.0022791 -0.0039081 -0.0082366 +v -0.0022838 -0.00293108 -0.008247 +v 0.00104896 2.83e-08 -0.012725 +v 0.00097284 0.00038271 -0.012725 +v 0.00096135 0.00040932 -0.0115238 +v 0.00075607 0.00070714 -0.012725 +v 0.00074085 0.0007218 -0.0116002 +v 0.000431646 0.0009239 -0.012725 +v 0.000427704 0.00092555 -0.0116705 +v 4.8963e-05 0.00100003 -0.012725 +v 4.8963e-05 0.00100006 -0.0116999 +v 4.8963e-05 0.0075 -0.0188659 +v 0.00149694 0.0075 -0.0187562 +v 0.00149694 0.0075 -0.0203843 +v 4.8963e-05 0.0075 -0.020494 +v 0.00149694 0.0075 -0.0220123 +v 4.8963e-05 0.0075 -0.022122 +v 0.0029119 0.0075 -0.0184298 +v 0.0029119 0.0075 -0.0201854 +v 0.0029119 0.0075 -0.021941 +v 0.0042271 0.0075 -0.0179107 +v 0.0042271 0.0075 -0.0198377 +v 0.0042271 0.0075 -0.0217646 +v 0.0054374 0.0075 -0.0172143 +v 0.0054374 0.0075 -0.019371 +v 0.0054374 0.0075 -0.0215278 +v 0.0065 0.0075 -0.0188127 +v 0.0065 0.0075 -0.0212445 +v 0.00107038 -0.00334614 -0.0114768 +v 4.8963e-05 -0.0034024 -0.0117 +v 0.00104896 -0.00438748 -0.0114866 +v 4.8963e-05 -0.0045 -0.0117 +v 4.8963e-05 -0.0055 -0.0117 +v 0.00104896 -0.0053875 -0.0114866 +v 4.8962e-05 -0.0075 -0.0117 +v 0.00104896 -0.0075 -0.0114868 +v 0.0017351 -0.00534529 -0.0110262 +v 0.00178137 -0.0075 -0.0109825 +v 4.8962e-05 -0.01 -0.0117 +v 0.00104896 -0.01 -0.0114868 +v 4.8962e-05 -0.0125 -0.0117 +v 0.00104896 -0.0125 -0.0114868 +v 4.8962e-05 -0.015 -0.0117 +v 0.00104896 -0.015 -0.0114868 +v 4.8962e-05 -0.0175 -0.0117 +v 0.00104896 -0.0175 -0.0114868 +v 0.00178137 -0.01 -0.0109825 +v 0.00178137 -0.0125 -0.0109825 +v 0.00178137 -0.015 -0.0109825 +v 0.00178137 -0.0175 -0.0109825 +v 0.00139314 -0.0075 -0.018149 +v 0.00139314 -0.01 -0.018149 +v 4.8963e-05 -0.01 -0.01825 +v 4.8963e-05 -0.0075 -0.01825 +v 0.00139314 -0.0125 -0.018149 +v 4.8963e-05 -0.0125 -0.01825 +v 0.00139314 -0.015 -0.018149 +v 4.8963e-05 -0.015 -0.01825 +v 0.00270178 -0.0075 -0.01785 +v 0.00270178 -0.01 -0.01785 +v 0.00270178 -0.0125 -0.01785 +v 0.00270178 -0.015 -0.01785 +v 0.0039601 -0.0075 -0.0173557 +v 0.0039601 -0.01 -0.0173557 +v 0.0039601 -0.0125 -0.0173557 +v 0.0039601 -0.015 -0.0173557 +v 0.0050592 -0.0075 -0.0167264 +v 0.0050592 -0.01 -0.0167264 +v 0.0050592 -0.0125 -0.0167264 +v 0.0050592 -0.015 -0.0167264 +v 0.006294 -0.0075 -0.0157307 +v 0.006294 -0.01 -0.0157307 +v 0.006294 -0.0125 -0.0157307 +v 0.006294 -0.015 -0.0157307 +v 0.0083333 -0.0075 -0.012767 +v 0.0083333 -0.01 -0.012767 +v 0.00746649 -0.01 -0.014347 +v 0.00746649 -0.0075 -0.014347 +v 0.0083333 -0.0125 -0.012767 +v 0.00746649 -0.0125 -0.014347 +v 0.0083333 -0.015 -0.012767 +v 0.00746649 -0.015 -0.014347 +v 0.0088811 -0.0075 -0.01098 +v 0.0088811 -0.01 -0.01098 +v 0.0088811 -0.0125 -0.01098 +v 0.0088811 -0.015 -0.01098 +v 0.009049 -0.0075 -0.00925 +v 0.009049 -0.01 -0.00925 +v 0.009049 -0.0125 -0.00925 +v 0.009049 -0.015 -0.00925 +v 4.8962e-05 -0.0195 -0.0117 +v 0.00104896 -0.0195 -0.0114868 +v 4.8962e-05 -0.0215 -0.0117 +v 0.00104896 -0.0215 -0.0114868 +v 4.8962e-05 -0.0235 -0.0117 +v 0.00104896 -0.0235 -0.0114868 +v 4.8962e-05 -0.0255 -0.0117 +v 0.00104896 -0.0255 -0.0114868 +v 0.00178137 -0.0195 -0.0109825 +v 0.00178137 -0.0215 -0.0109825 +v 0.00178137 -0.0235 -0.0109825 +v 0.00178137 -0.0255 -0.0109825 +v 0.00501887 -0.0195 -0.0114866 +v 0.0047034 -0.0195 -0.0120852 +v 0.00501887 -0.0215 -0.0114866 +v 0.0047034 -0.0215 -0.0120852 +v 0.00501887 -0.0235 -0.0114866 +v 0.0047034 -0.0235 -0.0120852 +v 0.00501887 -0.0255 -0.0114866 +v 0.0047034 -0.0255 -0.0120852 +v 0.0053672 -0.0195 -0.010441 +v 0.0053672 -0.0215 -0.010441 +v 0.0053672 -0.0235 -0.010441 +v 0.0053672 -0.0255 -0.010441 +v 0.005499 -0.0195 -0.00925 +v 0.005499 -0.0215 -0.00925 +v 0.005499 -0.0235 -0.00925 +v 0.005499 -0.0255 -0.00925 +v 0.00109717 -0.0195 -0.0145982 +v 4.8963e-05 -0.0195 -0.0147 +v 0.00109717 -0.0215 -0.0145982 +v 4.8963e-05 -0.0215 -0.0147 +v 0.00109717 -0.0235 -0.0145982 +v 4.8963e-05 -0.0235 -0.0147 +v 0.00109717 -0.0255 -0.0145982 +v 4.8963e-05 -0.0255 -0.0147 +v 0.0020612 -0.0195 -0.014315 +v 0.0020612 -0.0215 -0.014315 +v 0.0020612 -0.0235 -0.014315 +v 0.0020612 -0.0255 -0.014315 +v 0.00149327 0.0084994 -0.018732 +v 4.8963e-05 0.0085009 -0.0188414 +v 0.00290464 0.0084994 -0.0184065 +v 0.0042165 0.0084994 -0.0178887 +v 0.0054374 0.0085 -0.0172143 +v 0.0064836 0.0084994 -0.0163628 +v 0.0078177 0.0085339 -0.0148738 +v 0.0088143 0.0085581 -0.0131407 +v 0.0094487 0.0085722 -0.0111492 +v 0.0096393 0.0085474 -0.00925 +v 4.8963e-05 0.0112315 -0.0187748 +v 0.00149538 0.0112995 -0.0186627 +v 4.8963e-05 0.014088 -0.018705 +v 0.00149748 0.0140996 -0.0185932 +v 4.8963e-05 0.0168813 -0.018637 +v 0.0014996 0.0168998 -0.0185238 +v 4.8963e-05 0.0195887 -0.018571 +v 0.0015017 0.0197 -0.0184543 +v 0.00289307 0.0112995 -0.0183385 +v 0.0028815 0.0140996 -0.0182706 +v 0.0028699 0.0168997 -0.0182026 +v 0.00285835 0.0197 -0.0181347 +v 0.0041897 0.0112995 -0.0178258 +v 0.004163 0.0140996 -0.017763 +v 0.0041362 0.0168998 -0.0177 +v 0.0041094 0.0197 -0.017637 +v 0.005408 0.0113 -0.0171457 +v 0.0053786 0.0141 -0.0170772 +v 0.00534918 0.0169 -0.0170087 +v 0.00531976 0.0197 -0.0169402 +v 0.0064569 0.0112995 -0.0162946 +v 0.00643017 0.0140996 -0.0162265 +v 0.0064034 0.0168998 -0.0161583 +v 0.00637669 0.0197 -0.01609 +v 0.007774 0.011327 -0.0148177 +v 0.0087588 0.0113465 -0.0130978 +v 0.0077305 0.0141203 -0.0147615 +v 0.0087034 0.0141349 -0.013055 +v 0.0076869 0.0169133 -0.0147054 +v 0.008648 0.0169233 -0.013012 +v 0.0076433 0.0197062 -0.0146492 +v 0.0085925 0.0197116 -0.0129693 +v 0.0093822 0.0113578 -0.0111356 +v 0.0093156 0.0141433 -0.011122 +v 0.009249 0.0169289 -0.0111083 +v 0.0091825 0.0197144 -0.0110947 +v 0.009571 0.0113471 -0.00925 +v 0.0095026 0.0141504 -0.00925 +v 0.0094357 0.0168943 -0.00925 +v 0.0093668 0.0197167 -0.00925 +v 0.00097284 -0.00038271 -0.012725 +v 0.00075607 -0.00070714 -0.012725 +v 0.000431646 -0.0009239 -0.012725 +v 4.8963e-05 -0.00100003 -0.012725 +v 0.0177593 9.5e-11 -0.0183878 +v 0.0159418 9.5e-11 -0.0192534 +v 0.0092624 9.5e-11 -0.0224344 +v 0.0117868 9.5e-11 -0.021232 +v 0.0139919 9.5e-11 -0.020182 +v 0.0177593 -0.0015 -0.0183878 +v 0.0159418 -0.0015 -0.0192534 +v 0.0177593 -0.003 -0.0183878 +v 0.0159418 -0.003 -0.0192534 +v 0.0177593 -0.0045 -0.0183878 +v 0.0159418 -0.0045 -0.0192534 +v 0.0177593 -0.006 -0.0183878 +v 0.0159418 -0.006 -0.0192534 +v 0.0177593 -0.0075 -0.0183878 +v 0.0159418 -0.0075 -0.0192534 +v 0.0092624 -0.0015 -0.0224344 +v 0.0092624 -0.003 -0.0224344 +v 0.0092624 -0.0045 -0.0224344 +v 0.0092624 -0.006 -0.0224344 +v 0.0092624 -0.0075 -0.0224344 +v 0.0117868 -0.0015 -0.021232 +v 0.0117868 -0.003 -0.021232 +v 0.0117868 -0.0045 -0.021232 +v 0.0117868 -0.006 -0.021232 +v 0.0117868 -0.0075 -0.021232 +v 0.0139919 -0.0015 -0.020182 +v 0.0139919 -0.003 -0.020182 +v 0.0139919 -0.0045 -0.020182 +v 0.0139919 -0.006 -0.020182 +v 0.0139919 -0.0075 -0.020182 +v 4.8963e-05 0.0075 0.00036585 +v 4.8963e-05 0.0075 0.00134268 +v 0.00149694 0.0075 0.00123304 +v 0.00149694 0.0075 0.000256209 +v 0.0029119 0.0075 0.00103423 +v 0.0029119 0.0075 -7.0227e-05 +v 0.0042271 0.0075 0.00068645 +v 0.0042271 0.0075 -0.0005893 +v 0.0054374 0.0075 0.00021983 +v 0.0054374 0.0075 -0.00128575 +v 0.00107038 -0.00334614 -0.0070232 +v 4.8963e-05 -0.0034024 -0.0068001 +v 0.00104896 -0.00438748 -0.00701337 +v 4.8963e-05 -0.0045 -0.0068 +v 0.00104896 -0.0053875 -0.0070134 +v 4.8963e-05 -0.0055 -0.0068001 +v 0.00104896 -0.0075 -0.0070132 +v 4.8962e-05 -0.0075 -0.0068 +v 0.00104896 -0.01 -0.0070132 +v 4.8962e-05 -0.01 -0.0068 +v 0.00104896 -0.0125 -0.0070132 +v 4.8962e-05 -0.0125 -0.0068 +v 0.00104896 -0.015 -0.0070132 +v 4.8962e-05 -0.015 -0.0068 +v 0.00104896 -0.0175 -0.0070132 +v 4.8962e-05 -0.0175 -0.0068 +v 4.8963e-05 -0.0075 -0.00025 +v 4.8963e-05 -0.01 -0.00025 +v 0.00139314 -0.01 -0.000350945 +v 0.00139314 -0.0075 -0.000350945 +v 4.8963e-05 -0.0125 -0.00025 +v 0.00139314 -0.0125 -0.000350945 +v 4.8963e-05 -0.015 -0.00025 +v 0.00139314 -0.015 -0.000350945 +v 0.00270178 -0.01 -0.00064985 +v 0.00270178 -0.0075 -0.00064985 +v 0.00270178 -0.0125 -0.00064985 +v 0.00270178 -0.015 -0.00064985 +v 0.0039601 -0.01 -0.00114427 +v 0.0039601 -0.0075 -0.00114427 +v 0.0039601 -0.0125 -0.00114427 +v 0.0039601 -0.015 -0.00114427 +v 0.0050592 -0.01 -0.00177355 +v 0.0050592 -0.0075 -0.00177355 +v 0.0050592 -0.0125 -0.00177355 +v 0.0050592 -0.015 -0.00177355 +v 0.006294 -0.01 -0.00276926 +v 0.006294 -0.0075 -0.00276926 +v 0.006294 -0.0125 -0.00276926 +v 0.006294 -0.015 -0.00276926 +v 0.00746649 -0.0075 -0.0041529 +v 0.00746649 -0.01 -0.0041529 +v 0.0083333 -0.01 -0.005733 +v 0.0083333 -0.0075 -0.005733 +v 0.00746649 -0.0125 -0.0041529 +v 0.0083333 -0.0125 -0.005733 +v 0.00746649 -0.015 -0.0041529 +v 0.0083333 -0.015 -0.005733 +v 0.0088811 -0.01 -0.00752 +v 0.0088811 -0.0075 -0.00752 +v 0.0088811 -0.0125 -0.00752 +v 0.0088811 -0.015 -0.00752 +v 0.00104896 -0.0195 -0.0070132 +v 4.8962e-05 -0.0195 -0.0068 +v 0.00104896 -0.0215 -0.0070132 +v 4.8962e-05 -0.0215 -0.0068 +v 0.00104896 -0.0235 -0.0070132 +v 4.8962e-05 -0.0235 -0.0068 +v 0.00104896 -0.0255 -0.0070132 +v 4.8962e-05 -0.0255 -0.0068 +v 0.0047034 -0.0195 -0.0064148 +v 0.00501887 -0.0195 -0.00701337 +v 0.0047034 -0.0215 -0.0064148 +v 0.00501887 -0.0215 -0.00701337 +v 0.0047034 -0.0235 -0.0064148 +v 0.00501887 -0.0235 -0.00701337 +v 0.0047034 -0.0255 -0.0064148 +v 0.00501887 -0.0255 -0.00701337 +v 0.0053672 -0.0195 -0.008059 +v 0.0053672 -0.0215 -0.008059 +v 0.0053672 -0.0235 -0.008059 +v 0.0053672 -0.0255 -0.008059 +v 4.8963e-05 -0.0195 -0.0038 +v 0.00109717 -0.0195 -0.00390175 +v 4.8963e-05 -0.0215 -0.0038 +v 0.00109717 -0.0215 -0.00390175 +v 4.8963e-05 -0.0235 -0.0038 +v 0.00109717 -0.0235 -0.00390175 +v 4.8963e-05 -0.0255 -0.0038 +v 0.00109717 -0.0255 -0.00390175 +v 0.0020612 -0.0195 -0.00418508 +v 0.0020612 -0.0215 -0.00418508 +v 0.0020612 -0.0235 -0.00418508 +v 0.0020612 -0.0255 -0.00418508 +v 0.00149327 0.0084994 0.00023211 +v 4.8963e-05 0.0085009 0.00034144 +v 0.00290464 0.0084994 -9.3497e-05 +v 0.0042165 0.0084994 -0.00061125 +v 0.0054374 0.0085 -0.00128575 +v 0.0064836 0.0084994 -0.00213725 +v 0.0078177 0.0085339 -0.00362616 +v 0.0088143 0.0085581 -0.0053593 +v 0.0094487 0.0085722 -0.0073508 +v 4.8963e-05 0.0112315 0.00027484 +v 0.00149538 0.0112995 0.000162663 +v 0.00149748 0.0140996 9.3216e-05 +v 4.8963e-05 0.014088 0.00020517 +v 4.8963e-05 0.0168813 0.00013704 +v 0.0014996 0.0168998 2.3769e-05 +v 4.8963e-05 0.0195887 7.10078e-05 +v 0.0015017 0.0197 -4.56776e-05 +v 0.00289307 0.0112995 -0.000161452 +v 0.0028815 0.0140996 -0.000229407 +v 0.0028699 0.0168997 -0.00029736 +v 0.00285835 0.0197 -0.000365315 +v 0.0041897 0.0112995 -0.00067417 +v 0.004163 0.0140996 -0.00073708 +v 0.0041362 0.0168998 -0.0008 +v 0.0041094 0.0197 -0.00086291 +v 0.005408 0.0113 -0.00135426 +v 0.0053786 0.0141 -0.00142277 +v 0.00534918 0.0169 -0.00149127 +v 0.00531976 0.0197 -0.00155978 +v 0.0064569 0.0112995 -0.0022054 +v 0.00643017 0.0140996 -0.00227354 +v 0.0064034 0.0168998 -0.0023417 +v 0.00637669 0.0197 -0.00240984 +v 0.007774 0.011327 -0.0036823 +v 0.0087588 0.0113465 -0.00540216 +v 0.0077305 0.0141203 -0.00373847 +v 0.0087034 0.0141349 -0.005445 +v 0.0076869 0.0169133 -0.0037946 +v 0.008648 0.0169233 -0.00548788 +v 0.0076433 0.0197062 -0.00385076 +v 0.0085925 0.0197116 -0.0055307 +v 0.0093822 0.0113578 -0.0073644 +v 0.0093156 0.0141433 -0.00737808 +v 0.009249 0.0169289 -0.0073917 +v 0.0091825 0.0197144 -0.0074053 +v 0.0208985 0.002 -0.0100915 +v 0.0208985 9.5e-11 -0.0100915 +v 0.0210093 9.5e-11 -0.00925 +v 0.0210093 0.002 -0.00925 +v 0.0205738 0.002 -0.0108751 +v 0.0205738 9.5e-11 -0.0108751 +v 0.0200574 0.002 -0.011548 +v 0.0200574 9.5e-11 -0.011548 +v 0.0193844 0.002 -0.0120646 +v 0.0193844 9.5e-11 -0.0120646 +v 0.0186019 0.002 -0.0123889 +v 0.0186019 9.5e-11 -0.0123889 +v 0.0177593 0.002 -0.0125 +v 0.0177593 9.5e-11 -0.0125 +v 0.0169184 0.002 -0.0123893 +v 0.0169184 9.5e-11 -0.0123893 +v 0.0161343 0.002 -0.0120645 +v 0.0161343 9.5e-11 -0.0120645 +v 0.0154592 0.002 -0.011546 +v 0.0154592 9.5e-11 -0.011546 +v 0.0149446 0.002 -0.0108748 +v 0.0149446 9.5e-11 -0.0108748 +v 0.01462 0.002 -0.0100904 +v 0.01462 9.5e-11 -0.0100904 +v 0.0145093 0.002 -0.00925 +v 0.0145093 9.5e-11 -0.00925 +v 0.0208985 -0.0015 -0.0100915 +v 0.0210093 -0.0015 -0.00925 +v 0.0208985 -0.003 -0.0100915 +v 0.0210093 -0.003 -0.00925 +v 0.0208985 -0.0045 -0.0100915 +v 0.0210093 -0.0045 -0.00925 +v 0.0208985 -0.006 -0.0100915 +v 0.0210093 -0.006 -0.00925 +v 0.0208985 -0.0075 -0.0100915 +v 0.0210093 -0.0075 -0.00925 +v 0.0205738 -0.0015 -0.0108751 +v 0.0205738 -0.003 -0.0108751 +v 0.0205738 -0.0045 -0.0108751 +v 0.0205738 -0.006 -0.0108751 +v 0.0205738 -0.0075 -0.0108751 +v 0.0200574 -0.0015 -0.011548 +v 0.0200574 -0.003 -0.011548 +v 0.0200574 -0.0045 -0.011548 +v 0.0200574 -0.006 -0.011548 +v 0.0200574 -0.0075 -0.011548 +v 0.0193844 -0.0015 -0.0120646 +v 0.0193844 -0.003 -0.0120646 +v 0.0193844 -0.0045 -0.0120646 +v 0.0193844 -0.006 -0.0120646 +v 0.0193844 -0.0075 -0.0120646 +v 0.0186019 -0.0015 -0.0123889 +v 0.0186019 -0.003 -0.0123889 +v 0.0186019 -0.0045 -0.0123889 +v 0.0186019 -0.006 -0.0123889 +v 0.0186019 -0.0075 -0.0123889 +v 0.0177593 -0.0015 -0.0125 +v 0.0177593 -0.003 -0.0125 +v 0.0177593 -0.0045 -0.0125 +v 0.0177593 -0.006 -0.0125 +v 0.0177593 -0.0075 -0.0125 +v 0.0169184 -0.0015 -0.0123893 +v 0.0169184 -0.003 -0.0123893 +v 0.0169184 -0.0045 -0.0123893 +v 0.0169184 -0.006 -0.0123893 +v 0.0169184 -0.0075 -0.0123893 +v 0.0161343 -0.0015 -0.0120645 +v 0.0161343 -0.003 -0.0120645 +v 0.0161343 -0.0045 -0.0120645 +v 0.0161343 -0.006 -0.0120645 +v 0.0161343 -0.0075 -0.0120645 +v 0.0154592 -0.0015 -0.011546 +v 0.0154592 -0.003 -0.011546 +v 0.0154592 -0.0045 -0.011546 +v 0.0154592 -0.006 -0.011546 +v 0.0154592 -0.0075 -0.011546 +v 0.0149446 -0.0015 -0.0108748 +v 0.0149446 -0.003 -0.0108748 +v 0.0149446 -0.0045 -0.0108748 +v 0.0149446 -0.006 -0.0108748 +v 0.0149446 -0.0075 -0.0108748 +v 0.01462 -0.0015 -0.0100904 +v 0.01462 -0.003 -0.0100904 +v 0.01462 -0.0045 -0.0100904 +v 0.01462 -0.006 -0.0100904 +v 0.01462 -0.0075 -0.0100904 +v 0.0145093 -0.0015 -0.00925 +v 0.0145093 -0.003 -0.00925 +v 0.0145093 -0.0045 -0.00925 +v 0.0145093 -0.006 -0.00925 +v 0.0145093 -0.0075 -0.00925 +v 0.0208985 9.5e-11 -0.0084085 +v 0.0208985 0.002 -0.0084085 +v 0.0205738 9.5e-11 -0.0076249 +v 0.0205738 0.002 -0.0076249 +v 0.0200574 9.5e-11 -0.0069519 +v 0.0200574 0.002 -0.0069519 +v 0.0193844 9.5e-11 -0.0064354 +v 0.0193844 0.002 -0.0064354 +v 0.0186019 9.5e-11 -0.0061111 +v 0.0186019 0.002 -0.0061111 +v 0.0177593 9.5e-11 -0.006 +v 0.0177593 0.002 -0.006 +v 0.0169184 9.5e-11 -0.00611067 +v 0.0169184 0.002 -0.00611067 +v 0.0161343 9.5e-11 -0.0064355 +v 0.0161343 0.002 -0.0064355 +v 0.0154592 9.5e-11 -0.0069539 +v 0.0154592 0.002 -0.0069539 +v 0.0149446 9.5e-11 -0.00762518 +v 0.0149446 0.002 -0.00762518 +v 0.01462 9.5e-11 -0.0084096 +v 0.01462 0.002 -0.0084096 +v 0.0208985 -0.0015 -0.0084085 +v 0.0208985 -0.003 -0.0084085 +v 0.0208985 -0.0045 -0.0084085 +v 0.0208985 -0.006 -0.0084085 +v 0.0208985 -0.0075 -0.0084085 +v 0.0205738 -0.0015 -0.0076249 +v 0.0205738 -0.003 -0.0076249 +v 0.0205738 -0.0045 -0.0076249 +v 0.0205738 -0.006 -0.0076249 +v 0.0205738 -0.0075 -0.0076249 +v 0.0200574 -0.0015 -0.0069519 +v 0.0200574 -0.003 -0.0069519 +v 0.0200574 -0.0045 -0.0069519 +v 0.0200574 -0.006 -0.0069519 +v 0.0200574 -0.0075 -0.0069519 +v 0.0193844 -0.0015 -0.0064354 +v 0.0193844 -0.003 -0.0064354 +v 0.0193844 -0.0045 -0.0064354 +v 0.0193844 -0.006 -0.0064354 +v 0.0193844 -0.0075 -0.0064354 +v 0.0186019 -0.0015 -0.0061111 +v 0.0186019 -0.003 -0.0061111 +v 0.0186019 -0.0045 -0.0061111 +v 0.0186019 -0.006 -0.0061111 +v 0.0186019 -0.0075 -0.0061111 +v 0.0177593 -0.0015 -0.006 +v 0.0177593 -0.003 -0.006 +v 0.0177593 -0.0045 -0.006 +v 0.0177593 -0.006 -0.006 +v 0.0177593 -0.0075 -0.006 +v 0.0169184 -0.0015 -0.00611067 +v 0.0169184 -0.003 -0.00611067 +v 0.0169184 -0.0045 -0.00611067 +v 0.0169184 -0.006 -0.00611067 +v 0.0169184 -0.0075 -0.00611067 +v 0.0161343 -0.0015 -0.0064355 +v 0.0161343 -0.003 -0.0064355 +v 0.0161343 -0.0045 -0.0064355 +v 0.0161343 -0.006 -0.0064355 +v 0.0161343 -0.0075 -0.0064355 +v 0.0154592 -0.0015 -0.0069539 +v 0.0154592 -0.003 -0.0069539 +v 0.0154592 -0.0045 -0.0069539 +v 0.0154592 -0.006 -0.0069539 +v 0.0154592 -0.0075 -0.0069539 +v 0.0149446 -0.0015 -0.00762518 +v 0.0149446 -0.003 -0.00762518 +v 0.0149446 -0.0045 -0.00762518 +v 0.0149446 -0.006 -0.00762518 +v 0.0149446 -0.0075 -0.00762518 +v 0.01462 -0.0015 -0.0084096 +v 0.01462 -0.003 -0.0084096 +v 0.01462 -0.0045 -0.0084096 +v 0.01462 -0.006 -0.0084096 +v 0.01462 -0.0075 -0.0084096 +v -0.00097284 0.00038271 -0.012725 +v -0.00104896 2.83e-08 -0.012725 +v -0.00096135 0.00040932 -0.0115238 +v -0.00075607 0.00070714 -0.012725 +v -0.00074085 0.0007218 -0.0116002 +v -0.000431646 0.0009239 -0.012725 +v -0.000427704 0.00092555 -0.0116705 +v -0.00149694 0.0075 -0.0203843 +v -0.00149694 0.0075 -0.0187562 +v -0.00149694 0.0075 -0.0220123 +v -0.0029119 0.0075 -0.0201854 +v -0.0029119 0.0075 -0.0184298 +v -0.0029119 0.0075 -0.021941 +v -0.0042271 0.0075 -0.0198377 +v -0.0042271 0.0075 -0.0179107 +v -0.0042271 0.0075 -0.0217646 +v -0.0054374 0.0075 -0.019371 +v -0.0054374 0.0075 -0.0172143 +v -0.0054374 0.0075 -0.0215278 +v -0.00107038 -0.00334614 -0.0114768 +v -0.00104896 -0.00438748 -0.0114866 +v -0.00104896 -0.0053875 -0.0114866 +v -0.00104896 -0.0075 -0.0114868 +v -0.00104896 -0.01 -0.0114868 +v -0.00104896 -0.0125 -0.0114868 +v -0.00104896 -0.015 -0.0114868 +v -0.00104896 -0.0175 -0.0114868 +v -0.00139314 -0.01 -0.018149 +v -0.00139314 -0.0075 -0.018149 +v -0.00139314 -0.0125 -0.018149 +v -0.00139314 -0.015 -0.018149 +v -0.00270178 -0.01 -0.01785 +v -0.00270178 -0.0075 -0.01785 +v -0.00270178 -0.0125 -0.01785 +v -0.00270178 -0.015 -0.01785 +v -0.0039601 -0.01 -0.0173557 +v -0.0039601 -0.0075 -0.0173557 +v -0.0039601 -0.0125 -0.0173557 +v -0.0039601 -0.015 -0.0173557 +v -0.0050592 -0.01 -0.0167264 +v -0.0050592 -0.0075 -0.0167264 +v -0.0050592 -0.0125 -0.0167264 +v -0.0050592 -0.015 -0.0167264 +v -0.006294 -0.01 -0.0157307 +v -0.006294 -0.0075 -0.0157307 +v -0.006294 -0.0125 -0.0157307 +v -0.006294 -0.015 -0.0157307 +v -0.00746649 -0.0075 -0.014347 +v -0.00746649 -0.01 -0.014347 +v -0.0083333 -0.01 -0.012767 +v -0.0083333 -0.0075 -0.012767 +v -0.00746649 -0.0125 -0.014347 +v -0.0083333 -0.0125 -0.012767 +v -0.00746649 -0.015 -0.014347 +v -0.0083333 -0.015 -0.012767 +v -0.0088811 -0.01 -0.01098 +v -0.0088811 -0.0075 -0.01098 +v -0.0088811 -0.0125 -0.01098 +v -0.0088811 -0.015 -0.01098 +v -0.009049 -0.01 -0.00925 +v -0.009049 -0.0075 -0.00925 +v -0.009049 -0.0125 -0.00925 +v -0.009049 -0.015 -0.00925 +v -0.00104896 -0.0195 -0.0114868 +v -0.00104896 -0.0215 -0.0114868 +v -0.00104896 -0.0235 -0.0114868 +v -0.00104896 -0.0255 -0.0114868 +v -0.0047034 -0.0195 -0.0120852 +v -0.00501887 -0.0195 -0.0114866 +v -0.0047034 -0.0215 -0.0120852 +v -0.00501887 -0.0215 -0.0114866 +v -0.0047034 -0.0235 -0.0120852 +v -0.00501887 -0.0235 -0.0114866 +v -0.0047034 -0.0255 -0.0120852 +v -0.00501887 -0.0255 -0.0114866 +v -0.0053672 -0.0195 -0.010441 +v -0.0053672 -0.0215 -0.010441 +v -0.0053672 -0.0235 -0.010441 +v -0.0053672 -0.0255 -0.010441 +v -0.005499 -0.0195 -0.00925 +v -0.005499 -0.0215 -0.00925 +v -0.005499 -0.0235 -0.00925 +v -0.005499 -0.0255 -0.00925 +v -0.00109717 -0.0195 -0.0145982 +v -0.00109717 -0.0215 -0.0145982 +v -0.00109717 -0.0235 -0.0145982 +v -0.00109717 -0.0255 -0.0145982 +v -0.0020612 -0.0195 -0.014315 +v -0.0020612 -0.0215 -0.014315 +v -0.0020612 -0.0235 -0.014315 +v -0.0020612 -0.0255 -0.014315 +v -0.00149327 0.0084994 -0.018732 +v -0.00290464 0.0084994 -0.0184065 +v -0.0042165 0.0084994 -0.0178887 +v -0.0054374 0.0085 -0.0172143 +v -0.0064836 0.0084994 -0.0163628 +v -0.0078177 0.0085339 -0.0148738 +v -0.0088143 0.0085581 -0.0131407 +v -0.0094487 0.0085722 -0.0111492 +v -0.0096393 0.0085474 -0.00925 +v -0.00149538 0.0112995 -0.0186627 +v -0.00149748 0.0140996 -0.0185932 +v -0.0014996 0.0168998 -0.0185238 +v -0.0015017 0.0197 -0.0184543 +v -0.00289307 0.0112995 -0.0183385 +v -0.0028815 0.0140996 -0.0182706 +v -0.0028699 0.0168997 -0.0182026 +v -0.00285835 0.0197 -0.0181347 +v -0.0041897 0.0112995 -0.0178258 +v -0.004163 0.0140996 -0.017763 +v -0.0041362 0.0168998 -0.0177 +v -0.0041094 0.0197 -0.017637 +v -0.005408 0.0113 -0.0171457 +v -0.0053786 0.0141 -0.0170772 +v -0.00534918 0.0169 -0.0170087 +v -0.00531976 0.0197 -0.0169402 +v -0.0064569 0.0112995 -0.0162946 +v -0.00643017 0.0140996 -0.0162265 +v -0.0064034 0.0168998 -0.0161583 +v -0.00637669 0.0197 -0.01609 +v -0.007774 0.011327 -0.0148177 +v -0.0087588 0.0113465 -0.0130978 +v -0.0077305 0.0141203 -0.0147615 +v -0.0087034 0.0141349 -0.013055 +v -0.0076869 0.0169133 -0.0147054 +v -0.008648 0.0169233 -0.013012 +v -0.0076433 0.0197062 -0.0146492 +v -0.0085925 0.0197116 -0.0129693 +v -0.0093822 0.0113578 -0.0111356 +v -0.0093156 0.0141433 -0.011122 +v -0.009249 0.0169289 -0.0111083 +v -0.0091825 0.0197144 -0.0110947 +v -0.009571 0.0113471 -0.00925 +v -0.0095026 0.0141504 -0.00925 +v -0.0094357 0.0168943 -0.00925 +v -0.0093668 0.0197167 -0.00925 +v -0.00097284 -0.00038271 -0.012725 +v -0.00075607 -0.00070714 -0.012725 +v -0.000431646 -0.0009239 -0.012725 +v -0.0092624 9.5e-11 -0.0224344 +v -0.0117868 9.5e-11 -0.021232 +v -0.0092624 -0.0015 -0.0224344 +v -0.0092624 -0.003 -0.0224344 +v -0.0092624 -0.0045 -0.0224344 +v -0.0092624 -0.006 -0.0224344 +v -0.0092624 -0.0075 -0.0224344 +v -0.0117868 -0.0015 -0.021232 +v -0.0117868 -0.003 -0.021232 +v -0.0117868 -0.0045 -0.021232 +v -0.0117868 -0.006 -0.021232 +v -0.0117868 -0.0075 -0.021232 +v -0.00149694 0.0075 0.000256209 +v -0.00149694 0.0075 0.00123304 +v -0.0029119 0.0075 -7.0227e-05 +v -0.0029119 0.0075 0.00103423 +v -0.0042271 0.0075 -0.0005893 +v -0.0042271 0.0075 0.00068645 +v -0.0054374 0.0075 -0.00128575 +v -0.0054374 0.0075 0.00021983 +v -0.0065 0.0075 0.000312658 +v -0.00107038 -0.00334614 -0.0070232 +v -0.00104896 -0.00438748 -0.00701337 +v -0.00104896 -0.0053875 -0.0070134 +v -0.00104896 -0.0075 -0.0070132 +v -0.0017351 -0.00534529 -0.0074738 +v -0.00178137 -0.0075 -0.0075175 +v -0.00104896 -0.01 -0.0070132 +v -0.00104896 -0.0125 -0.0070132 +v -0.00104896 -0.015 -0.0070132 +v -0.00104896 -0.0175 -0.0070132 +v -0.00178137 -0.01 -0.0075175 +v -0.00178137 -0.0125 -0.0075175 +v -0.00178137 -0.015 -0.0075175 +v -0.00178137 -0.0175 -0.0075175 +v -0.00139314 -0.0075 -0.000350945 +v -0.00139314 -0.01 -0.000350945 +v -0.00139314 -0.0125 -0.000350945 +v -0.00139314 -0.015 -0.000350945 +v -0.00270178 -0.0075 -0.00064985 +v -0.00270178 -0.01 -0.00064985 +v -0.00270178 -0.0125 -0.00064985 +v -0.00270178 -0.015 -0.00064985 +v -0.0039601 -0.0075 -0.00114427 +v -0.0039601 -0.01 -0.00114427 +v -0.0039601 -0.0125 -0.00114427 +v -0.0039601 -0.015 -0.00114427 +v -0.0050592 -0.0075 -0.00177355 +v -0.0050592 -0.01 -0.00177355 +v -0.0050592 -0.0125 -0.00177355 +v -0.0050592 -0.015 -0.00177355 +v -0.006294 -0.0075 -0.00276926 +v -0.006294 -0.01 -0.00276926 +v -0.006294 -0.0125 -0.00276926 +v -0.006294 -0.015 -0.00276926 +v -0.0083333 -0.0075 -0.005733 +v -0.0083333 -0.01 -0.005733 +v -0.00746649 -0.01 -0.0041529 +v -0.00746649 -0.0075 -0.0041529 +v -0.0083333 -0.0125 -0.005733 +v -0.00746649 -0.0125 -0.0041529 +v -0.0083333 -0.015 -0.005733 +v -0.00746649 -0.015 -0.0041529 +v -0.0088811 -0.0075 -0.00752 +v -0.0088811 -0.01 -0.00752 +v -0.0088811 -0.0125 -0.00752 +v -0.0088811 -0.015 -0.00752 +v -0.00104896 -0.0195 -0.0070132 +v -0.00104896 -0.0215 -0.0070132 +v -0.00104896 -0.0235 -0.0070132 +v -0.00104896 -0.0255 -0.0070132 +v -0.00178137 -0.0195 -0.0075175 +v -0.00178137 -0.0215 -0.0075175 +v -0.00178137 -0.0235 -0.0075175 +v -0.00178137 -0.0255 -0.0075175 +v -0.00501887 -0.0195 -0.00701337 +v -0.0047034 -0.0195 -0.0064148 +v -0.00501887 -0.0215 -0.00701337 +v -0.0047034 -0.0215 -0.0064148 +v -0.00501887 -0.0235 -0.00701337 +v -0.0047034 -0.0235 -0.0064148 +v -0.00501887 -0.0255 -0.00701337 +v -0.0047034 -0.0255 -0.0064148 +v -0.0053672 -0.0195 -0.008059 +v -0.0053672 -0.0215 -0.008059 +v -0.0053672 -0.0235 -0.008059 +v -0.0053672 -0.0255 -0.008059 +v -0.00109717 -0.0195 -0.00390175 +v -0.00109717 -0.0215 -0.00390175 +v -0.00109717 -0.0235 -0.00390175 +v -0.00109717 -0.0255 -0.00390175 +v -0.0020612 -0.0195 -0.00418508 +v -0.0020612 -0.0215 -0.00418508 +v -0.0020612 -0.0235 -0.00418508 +v -0.0020612 -0.0255 -0.00418508 +v -0.00149327 0.0084994 0.00023211 +v -0.00290464 0.0084994 -9.3497e-05 +v -0.0042165 0.0084994 -0.00061125 +v -0.0054374 0.0085 -0.00128575 +v -0.0064836 0.0084994 -0.00213725 +v -0.0078177 0.0085339 -0.00362616 +v -0.0088143 0.0085581 -0.0053593 +v -0.0094487 0.0085722 -0.0073508 +v -0.00149538 0.0112995 0.000162663 +v -0.00149748 0.0140996 9.3216e-05 +v -0.0014996 0.0168998 2.3769e-05 +v -0.0015017 0.0197 -4.56776e-05 +v -0.00289307 0.0112995 -0.000161452 +v -0.0028815 0.0140996 -0.000229407 +v -0.0028699 0.0168997 -0.00029736 +v -0.00285835 0.0197 -0.000365315 +v -0.0041897 0.0112995 -0.00067417 +v -0.004163 0.0140996 -0.00073708 +v -0.0041362 0.0168998 -0.0008 +v -0.0041094 0.0197 -0.00086291 +v -0.005408 0.0113 -0.00135426 +v -0.0053786 0.0141 -0.00142277 +v -0.00534918 0.0169 -0.00149127 +v -0.00531976 0.0197 -0.00155978 +v -0.0064569 0.0112995 -0.0022054 +v -0.00643017 0.0140996 -0.00227354 +v -0.0064034 0.0168998 -0.0023417 +v -0.00637669 0.0197 -0.00240984 +v -0.007774 0.011327 -0.0036823 +v -0.0087588 0.0113465 -0.00540216 +v -0.0077305 0.0141203 -0.00373847 +v -0.0087034 0.0141349 -0.005445 +v -0.0076869 0.0169133 -0.0037946 +v -0.008648 0.0169233 -0.00548788 +v -0.0076433 0.0197062 -0.00385076 +v -0.0085925 0.0197116 -0.0055307 +v -0.0093822 0.0113578 -0.0073644 +v -0.0093156 0.0141433 -0.00737808 +v -0.009249 0.0169289 -0.0073917 +v -0.0091825 0.0197144 -0.0074053 +v -0.0210093 0.002 -0.00925 +v -0.0210093 9.5e-11 -0.00925 +v -0.0208985 9.5e-11 -0.0100915 +v -0.0208985 0.002 -0.0100915 +v -0.0205738 9.5e-11 -0.0108751 +v -0.0205738 0.002 -0.0108751 +v -0.0200574 9.5e-11 -0.011548 +v -0.0200574 0.002 -0.011548 +v -0.0193844 9.5e-11 -0.0120646 +v -0.0193844 0.002 -0.0120646 +v -0.0186019 9.5e-11 -0.0123889 +v -0.0186019 0.002 -0.0123889 +v -0.0177593 9.5e-11 -0.0125 +v -0.0177593 0.002 -0.0125 +v -0.0169184 9.5e-11 -0.0123893 +v -0.0169184 0.002 -0.0123893 +v -0.0161343 9.5e-11 -0.0120645 +v -0.0161343 0.002 -0.0120645 +v -0.0154592 9.5e-11 -0.011546 +v -0.0154592 0.002 -0.011546 +v -0.0149446 9.5e-11 -0.0108748 +v -0.0149446 0.002 -0.0108748 +v -0.01462 9.5e-11 -0.0100904 +v -0.01462 0.002 -0.0100904 +v -0.0145093 9.5e-11 -0.00925 +v -0.0145093 0.002 -0.00925 +v -0.0210093 -0.0015 -0.00925 +v -0.0208985 -0.0015 -0.0100915 +v -0.0210093 -0.003 -0.00925 +v -0.0208985 -0.003 -0.0100915 +v -0.0210093 -0.0045 -0.00925 +v -0.0208985 -0.0045 -0.0100915 +v -0.0210093 -0.006 -0.00925 +v -0.0208985 -0.006 -0.0100915 +v -0.0210093 -0.0075 -0.00925 +v -0.0208985 -0.0075 -0.0100915 +v -0.0205738 -0.0015 -0.0108751 +v -0.0205738 -0.003 -0.0108751 +v -0.0205738 -0.0045 -0.0108751 +v -0.0205738 -0.006 -0.0108751 +v -0.0205738 -0.0075 -0.0108751 +v -0.0200574 -0.0015 -0.011548 +v -0.0200574 -0.003 -0.011548 +v -0.0200574 -0.0045 -0.011548 +v -0.0200574 -0.006 -0.011548 +v -0.0200574 -0.0075 -0.011548 +v -0.0193844 -0.0015 -0.0120646 +v -0.0193844 -0.003 -0.0120646 +v -0.0193844 -0.0045 -0.0120646 +v -0.0193844 -0.006 -0.0120646 +v -0.0193844 -0.0075 -0.0120646 +v -0.0186019 -0.0015 -0.0123889 +v -0.0186019 -0.003 -0.0123889 +v -0.0186019 -0.0045 -0.0123889 +v -0.0186019 -0.006 -0.0123889 +v -0.0186019 -0.0075 -0.0123889 +v -0.0177593 -0.0015 -0.0125 +v -0.0177593 -0.003 -0.0125 +v -0.0177593 -0.0045 -0.0125 +v -0.0177593 -0.006 -0.0125 +v -0.0177593 -0.0075 -0.0125 +v -0.0169184 -0.0015 -0.0123893 +v -0.0169184 -0.003 -0.0123893 +v -0.0169184 -0.0045 -0.0123893 +v -0.0169184 -0.006 -0.0123893 +v -0.0169184 -0.0075 -0.0123893 +v -0.0161343 -0.0015 -0.0120645 +v -0.0161343 -0.003 -0.0120645 +v -0.0161343 -0.0045 -0.0120645 +v -0.0161343 -0.006 -0.0120645 +v -0.0161343 -0.0075 -0.0120645 +v -0.0154592 -0.0015 -0.011546 +v -0.0154592 -0.003 -0.011546 +v -0.0154592 -0.0045 -0.011546 +v -0.0154592 -0.006 -0.011546 +v -0.0154592 -0.0075 -0.011546 +v -0.0149446 -0.0015 -0.0108748 +v -0.0149446 -0.003 -0.0108748 +v -0.0149446 -0.0045 -0.0108748 +v -0.0149446 -0.006 -0.0108748 +v -0.0149446 -0.0075 -0.0108748 +v -0.01462 -0.0015 -0.0100904 +v -0.01462 -0.003 -0.0100904 +v -0.01462 -0.0045 -0.0100904 +v -0.01462 -0.006 -0.0100904 +v -0.01462 -0.0075 -0.0100904 +v -0.0145093 -0.0015 -0.00925 +v -0.0145093 -0.003 -0.00925 +v -0.0145093 -0.0045 -0.00925 +v -0.0145093 -0.006 -0.00925 +v -0.0145093 -0.0075 -0.00925 +v -0.0208985 0.002 -0.0084085 +v -0.0208985 9.5e-11 -0.0084085 +v -0.0205738 0.002 -0.0076249 +v -0.0205738 9.5e-11 -0.0076249 +v -0.0200574 0.002 -0.0069519 +v -0.0200574 9.5e-11 -0.0069519 +v -0.0193844 0.002 -0.0064354 +v -0.0193844 9.5e-11 -0.0064354 +v -0.0186019 0.002 -0.0061111 +v -0.0186019 9.5e-11 -0.0061111 +v -0.0177593 0.002 -0.006 +v -0.0177593 9.5e-11 -0.006 +v -0.0169184 0.002 -0.00611067 +v -0.0169184 9.5e-11 -0.00611067 +v -0.0161343 0.002 -0.0064355 +v -0.0161343 9.5e-11 -0.0064355 +v -0.0154592 0.002 -0.0069539 +v -0.0154592 9.5e-11 -0.0069539 +v -0.0149446 0.002 -0.00762518 +v -0.0149446 9.5e-11 -0.00762518 +v -0.01462 0.002 -0.0084096 +v -0.01462 9.5e-11 -0.0084096 +v -0.0208985 -0.0015 -0.0084085 +v -0.0208985 -0.003 -0.0084085 +v -0.0208985 -0.0045 -0.0084085 +v -0.0208985 -0.006 -0.0084085 +v -0.0208985 -0.0075 -0.0084085 +v -0.0205738 -0.0015 -0.0076249 +v -0.0205738 -0.003 -0.0076249 +v -0.0205738 -0.0045 -0.0076249 +v -0.0205738 -0.006 -0.0076249 +v -0.0205738 -0.0075 -0.0076249 +v -0.0200574 -0.0015 -0.0069519 +v -0.0200574 -0.003 -0.0069519 +v -0.0200574 -0.0045 -0.0069519 +v -0.0200574 -0.006 -0.0069519 +v -0.0200574 -0.0075 -0.0069519 +v -0.0193844 -0.0015 -0.0064354 +v -0.0193844 -0.003 -0.0064354 +v -0.0193844 -0.0045 -0.0064354 +v -0.0193844 -0.006 -0.0064354 +v -0.0193844 -0.0075 -0.0064354 +v -0.0186019 -0.0015 -0.0061111 +v -0.0186019 -0.003 -0.0061111 +v -0.0186019 -0.0045 -0.0061111 +v -0.0186019 -0.006 -0.0061111 +v -0.0186019 -0.0075 -0.0061111 +v -0.0177593 -0.0015 -0.006 +v -0.0177593 -0.003 -0.006 +v -0.0177593 -0.0045 -0.006 +v -0.0177593 -0.006 -0.006 +v -0.0177593 -0.0075 -0.006 +v -0.0169184 -0.0015 -0.00611067 +v -0.0169184 -0.003 -0.00611067 +v -0.0169184 -0.0045 -0.00611067 +v -0.0169184 -0.006 -0.00611067 +v -0.0169184 -0.0075 -0.00611067 +v -0.0161343 -0.0015 -0.0064355 +v -0.0161343 -0.003 -0.0064355 +v -0.0161343 -0.0045 -0.0064355 +v -0.0161343 -0.006 -0.0064355 +v -0.0161343 -0.0075 -0.0064355 +v -0.0154592 -0.0015 -0.0069539 +v -0.0154592 -0.003 -0.0069539 +v -0.0154592 -0.0045 -0.0069539 +v -0.0154592 -0.006 -0.0069539 +v -0.0154592 -0.0075 -0.0069539 +v -0.0149446 -0.0015 -0.00762518 +v -0.0149446 -0.003 -0.00762518 +v -0.0149446 -0.0045 -0.00762518 +v -0.0149446 -0.006 -0.00762518 +v -0.0149446 -0.0075 -0.00762518 +v -0.01462 -0.0015 -0.0084096 +v -0.01462 -0.003 -0.0084096 +v -0.01462 -0.0045 -0.0084096 +v -0.01462 -0.006 -0.0084096 +v -0.01462 -0.0075 -0.0084096 +v -0.0177593 9.5e-11 -0.000249369 +v -0.0158684 9.5e-11 0.00057542 +v -0.0139774 9.5e-11 0.00140021 +v -0.0177593 -0.0015 -0.000249369 +v -0.0158684 -0.0015 0.00057542 +v -0.0177593 -0.003 -0.000249369 +v -0.0158684 -0.003 0.00057542 +v -0.0177593 -0.0045 -0.000249369 +v -0.0158684 -0.0045 0.00057542 +v -0.0177593 -0.006 -0.000249369 +v -0.0158684 -0.006 0.00057542 +v -0.0177593 -0.0075 -0.000249369 +v -0.0158684 -0.0075 0.00057542 +v -0.0139774 -0.0015 0.00140021 +v -0.0139774 -0.003 0.00140021 +v -0.0139774 -0.0045 0.00140021 +v -0.0139774 -0.006 0.00140021 +v -0.0139774 -0.0075 0.00140021 +v 0.0065 0.003375 -0.018903 +v 0.0065 0.003375 -0.0212904 +v 0.0065 0.00475 -0.018873 +v 0.0065 0.00475 -0.021275 +v 0.0065 0.006125 -0.0188428 +v 0.0065 0.006125 -0.0212598 +v 0.0022958 -0.005204 -0.0102255 +v 0.00231247 -0.0075 -0.0101877 +v 0.0044074 -0.00111989 -0.0161579 +v 0.0043992 -0.00115128 -0.0176229 +v 0.0039486 -0.0022456 -0.0161579 +v 0.0039599 -0.00222589 -0.01778 +v 0.0043992 -0.00115128 -0.0196448 +v 0.0043992 -0.00115128 -0.0216668 +v 0.0039599 -0.00222589 -0.01975 +v 0.0039599 -0.00222589 -0.02172 +v 0.00231247 -0.01 -0.0101877 +v 0.00231247 -0.0125 -0.0101877 +v 0.00231247 -0.015 -0.0101877 +v 0.00231247 -0.0175 -0.0101877 +v 0.00231247 -0.0195 -0.0101877 +v 0.00231247 -0.0215 -0.0101877 +v 0.00231247 -0.0235 -0.0101877 +v 0.00231247 -0.0255 -0.0101877 +v 0.025665 9.5e-11 -0.0116081 +v 0.024661 9.5e-11 -0.0137696 +v 0.0230815 9.5e-11 -0.0155537 +v 0.0210577 9.5e-11 -0.016812 +v 0.01945 9.5e-11 -0.0175827 +v 0.025665 -0.0015 -0.0116081 +v 0.025665 -0.003 -0.0116081 +v 0.025665 -0.0045 -0.0116081 +v 0.025665 -0.006 -0.0116081 +v 0.025665 -0.0075 -0.0116081 +v 0.024661 -0.0015 -0.0137696 +v 0.024661 -0.003 -0.0137696 +v 0.024661 -0.0045 -0.0137696 +v 0.024661 -0.006 -0.0137696 +v 0.024661 -0.0075 -0.0137696 +v 0.0230815 -0.0015 -0.0155537 +v 0.0230815 -0.003 -0.0155537 +v 0.0230815 -0.0045 -0.0155537 +v 0.0230815 -0.006 -0.0155537 +v 0.0230815 -0.0075 -0.0155537 +v 0.0210577 -0.0015 -0.016812 +v 0.0210577 -0.003 -0.016812 +v 0.0210577 -0.0045 -0.016812 +v 0.0210577 -0.006 -0.016812 +v 0.0210577 -0.0075 -0.016812 +v 0.01945 -0.0015 -0.0175827 +v 0.01945 -0.003 -0.0175827 +v 0.01945 -0.0045 -0.0175827 +v 0.01945 -0.006 -0.0175827 +v 0.01945 -0.0075 -0.0175827 +v -0.0044074 0.00111989 -0.0161579 +v -0.0043992 0.00115128 -0.0176229 +v -0.0039486 0.0022456 -0.0161579 +v -0.0039599 0.00222589 -0.01778 +v -0.0043992 0.00115128 -0.0196448 +v -0.0043992 0.00115128 -0.0216668 +v -0.0039599 0.00222589 -0.01975 +v -0.0039599 0.00222589 -0.02172 +v -0.0065 0.003375 0.00040305 +v -0.0065 0.00475 0.00037292 +v -0.0065 0.006125 0.000342788 +v -0.0022958 -0.005204 -0.0082745 +v -0.00231247 -0.0075 -0.00831229 +v -0.00231247 -0.01 -0.00831229 +v -0.00231247 -0.0125 -0.00831229 +v -0.00231247 -0.015 -0.00831229 +v -0.00231247 -0.0175 -0.00831229 +v -0.00231247 -0.0195 -0.00831229 +v -0.00231247 -0.0215 -0.00831229 +v -0.00231247 -0.0235 -0.00831229 +v -0.00231247 -0.0255 -0.00831229 +v -0.025665 9.5e-11 -0.0068919 +v -0.024661 9.5e-11 -0.0047304 +v -0.0230815 9.5e-11 -0.0029463 +v -0.0210577 9.5e-11 -0.00168803 +v -0.0194085 9.5e-11 -0.0009687 +v -0.025665 -0.0015 -0.0068919 +v -0.025665 -0.003 -0.0068919 +v -0.025665 -0.0045 -0.0068919 +v -0.025665 -0.006 -0.0068919 +v -0.025665 -0.0075 -0.0068919 +v -0.024661 -0.0015 -0.0047304 +v -0.024661 -0.003 -0.0047304 +v -0.024661 -0.0045 -0.0047304 +v -0.024661 -0.006 -0.0047304 +v -0.024661 -0.0075 -0.0047304 +v -0.0230815 -0.0015 -0.0029463 +v -0.0230815 -0.003 -0.0029463 +v -0.0230815 -0.0045 -0.0029463 +v -0.0230815 -0.006 -0.0029463 +v -0.0230815 -0.0075 -0.0029463 +v -0.0210577 -0.0015 -0.00168803 +v -0.0210577 -0.003 -0.00168803 +v -0.0210577 -0.0045 -0.00168803 +v -0.0210577 -0.006 -0.00168803 +v -0.0210577 -0.0075 -0.00168803 +v -0.0194085 -0.0015 -0.0009687 +v -0.0194085 -0.003 -0.0009687 +v -0.0194085 -0.0045 -0.0009687 +v -0.0194085 -0.006 -0.0009687 +v -0.0194085 -0.0075 -0.0009687 +v 0.010708 -0.0075 0.0011982 +v -0.010708 -0.0075 0.0011982 +v 0.0097686 -0.0075 -0.0152248 +v 0.0115415 -0.0075 -0.0156366 +v 0.0111516 -0.0075 -0.014182 +v 0.0131584 -0.0075 -0.0151265 +v 0.0131946 -0.0075 -0.0158693 +v 0.0146963 -0.0075 -0.016257 +v 0.0144921 -0.0075 -0.01727 +v 0.015699 -0.0075 -0.0175533 +v 0.0125608 -0.0075 -0.0164174 +v 0.0134607 -0.0075 -0.01688 +v 0.0115415 -0.0075 -0.00286344 +v 0.0097686 -0.0075 -0.00327517 +v 0.0111516 -0.0075 -0.0043179 +v 0.0131946 -0.0075 -0.0026307 +v 0.0131584 -0.0075 -0.0033735 +v 0.0146963 -0.0075 -0.00224303 +v 0.015699 -0.0075 -0.00094673 +v 0.0144921 -0.0075 -0.00123011 +v 0.0134607 -0.0075 -0.0016199 +v 0.0125608 -0.0075 -0.00208264 +v -0.0115415 -0.0075 -0.0156366 +v -0.0097686 -0.0075 -0.0152248 +v -0.0111516 -0.0075 -0.014182 +v -0.0131946 -0.0075 -0.0158693 +v -0.0131584 -0.0075 -0.0151265 +v -0.0146963 -0.0075 -0.016257 +v -0.015699 -0.0075 -0.0175533 +v -0.0144921 -0.0075 -0.01727 +v -0.0134607 -0.0075 -0.01688 +v -0.0125608 -0.0075 -0.0164174 +v -0.0097686 -0.0075 -0.00327517 +v -0.0115415 -0.0075 -0.00286344 +v -0.0111516 -0.0075 -0.0043179 +v -0.0131584 -0.0075 -0.0033735 +v -0.0131946 -0.0075 -0.0026307 +v -0.0146963 -0.0075 -0.00224303 +v -0.0144921 -0.0075 -0.00123011 +v -0.015699 -0.0075 -0.00094673 +v -0.0125608 -0.0075 -0.00208264 +v -0.0134607 -0.0075 -0.0016199 +v 0.0107846 -0.0075 -0.0109912 +v 0.0107791 -0.0075 -0.00925 +v 0.0117593 -0.0075 -0.00925 +v 0.0119634 -0.0075 -0.0108016 +v 0.0162069 -0.0075 -0.0150457 +v 0.0147592 -0.0075 -0.014446 +v 0.0166766 -0.0075 -0.0163743 +v 0.0177593 -0.0075 -0.0166736 +v 0.0177593 -0.0075 -0.01525 +v 0.0167117 -0.0075 -0.0174385 +v 0.008014 -0.0075 -0.0171347 +v 0.0090659 -0.0075 -0.016288 +v 0.0065 -0.0075 -0.0188127 +v 0.008476 -0.0075 -0.0185554 +v 0.0106532 -0.0075 -0.017664 +v 0.0087366 -0.0075 -0.0205014 +v 0.0065 -0.0075 -0.0212445 +v 0.0116557 -0.0075 -0.019395 +v 0.0120812 -0.0075 -0.0185232 +v 0.010708 -0.0075 -0.0196982 +v 0.0121778 -0.0075 -0.019964 +v 0.0130909 -0.0075 -0.0192646 +v 0.0120464 -0.0075 -0.0172835 +v 0.0129252 -0.0075 -0.017769 +v 0.013513 -0.0075 -0.013489 +v 0.0141125 -0.0075 -0.0183892 +v 0.0107617 -0.0075 -0.0127276 +v 0.012563 -0.0075 -0.0122497 +v 0.0222266 -0.0075 -0.0104476 +v 0.0235547 -0.0075 -0.0108036 +v 0.0237593 -0.0075 -0.00925 +v 0.0223843 -0.0075 -0.00925 +v 0.0217646 -0.0075 -0.0115627 +v 0.0229553 -0.0075 -0.0122503 +v 0.0210297 -0.0075 -0.0125204 +v 0.022002 -0.0075 -0.0134926 +v 0.0200719 -0.0075 -0.0132553 +v 0.0207594 -0.0075 -0.014446 +v 0.0189584 -0.0075 -0.0137169 +v 0.0193148 -0.0075 -0.0150449 +v 0.0177593 -0.0075 -0.013875 +v 0.02461 -0.0075 -0.0112059 +v 0.0248843 -0.0075 -0.00925 +v 0.0238083 -0.0075 -0.01301 +v 0.0225418 -0.0075 -0.0145232 +v 0.0209085 -0.0075 -0.015629 +v 0.0193617 -0.0075 -0.016288 +v 0.0165626 -0.0075 -0.0137175 +v 0.0154467 -0.0075 -0.0132553 +v 0.014486 -0.0075 -0.0125175 +v 0.0137538 -0.0075 -0.0115622 +v 0.0132916 -0.0075 -0.010446 +v 0.0131343 -0.0075 -0.00925 +v 0.0222266 -0.0075 -0.0080524 +v 0.0235547 -0.0075 -0.0076964 +v 0.0217646 -0.0075 -0.0069373 +v 0.0229553 -0.0075 -0.0062497 +v 0.0210297 -0.0075 -0.0059796 +v 0.022002 -0.0075 -0.00500735 +v 0.0207594 -0.0075 -0.00405388 +v 0.0200719 -0.0075 -0.00524466 +v 0.0189584 -0.0075 -0.0047831 +v 0.0193148 -0.0075 -0.00345514 +v 0.0177593 -0.0075 -0.00325 +v 0.0177593 -0.0075 -0.004625 +v 0.02461 -0.0075 -0.0072941 +v 0.0238083 -0.0075 -0.00549006 +v 0.0225418 -0.0075 -0.0039768 +v 0.0209085 -0.0075 -0.00287096 +v 0.0193617 -0.0075 -0.0022119 +v 0.0177593 -0.0075 -0.00182637 +v 0.0162069 -0.0075 -0.0034543 +v 0.0165626 -0.0075 -0.0047825 +v 0.0147592 -0.0075 -0.0040539 +v 0.0154467 -0.0075 -0.00524469 +v 0.013513 -0.0075 -0.00501106 +v 0.014486 -0.0075 -0.00598248 +v 0.012563 -0.0075 -0.0062503 +v 0.0137538 -0.0075 -0.0069378 +v 0.0132916 -0.0075 -0.008054 +v 0.0119634 -0.0075 -0.0076985 +v 0.0107846 -0.0075 -0.0075088 +v 0.0166766 -0.0075 -0.00212568 +v 0.0167117 -0.0075 -0.00106153 +v 0.008014 -0.0075 -0.00136532 +v 0.0090659 -0.0075 -0.00221207 +v 0.008476 -0.0075 5.5378e-05 +v 0.0065 -0.0075 0.000312658 +v 0.0106532 -0.0075 -0.00083587 +v 0.0116557 -0.0075 0.00089514 +v 0.0120812 -0.0075 2.32197e-05 +v 0.0130909 -0.0075 0.00076461 +v 0.0121778 -0.0075 0.00146398 +v 0.0120464 -0.0075 -0.0012165 +v 0.0129252 -0.0075 -0.000731 +v 0.0141125 -0.0075 -0.000110779 +v 0.0107617 -0.0075 -0.0057724 +v -0.0107791 -0.0075 -0.00925 +v -0.0107846 -0.0075 -0.0109912 +v -0.0117593 -0.0075 -0.00925 +v -0.0119634 -0.0075 -0.0108016 +v -0.0162069 -0.0075 -0.0150457 +v -0.0166766 -0.0075 -0.0163743 +v -0.0147592 -0.0075 -0.014446 +v -0.0177593 -0.0075 -0.01525 +v -0.0177593 -0.0075 -0.0166736 +v -0.0167117 -0.0075 -0.0174385 +v -0.008014 -0.0075 -0.0171347 +v -0.0090659 -0.0075 -0.016288 +v -0.008476 -0.0075 -0.0185554 +v -0.0065 -0.0075 -0.0188127 +v -0.0106532 -0.0075 -0.017664 +v -0.0087366 -0.0075 -0.0205014 +v -0.0065 -0.0075 -0.0212445 +v -0.0116557 -0.0075 -0.019395 +v -0.010708 -0.0075 -0.0196982 +v -0.0120812 -0.0075 -0.0185232 +v -0.0130909 -0.0075 -0.0192646 +v -0.0121778 -0.0075 -0.019964 +v -0.0120464 -0.0075 -0.0172835 +v -0.0129252 -0.0075 -0.017769 +v -0.013513 -0.0075 -0.013489 +v -0.0141125 -0.0075 -0.0183892 +v -0.0107617 -0.0075 -0.0127276 +v -0.012563 -0.0075 -0.0122497 +v -0.0222266 -0.0075 -0.0104476 +v -0.0223843 -0.0075 -0.00925 +v -0.0237593 -0.0075 -0.00925 +v -0.0235547 -0.0075 -0.0108036 +v -0.0217646 -0.0075 -0.0115627 +v -0.0229553 -0.0075 -0.0122503 +v -0.0210297 -0.0075 -0.0125204 +v -0.022002 -0.0075 -0.0134926 +v -0.0207594 -0.0075 -0.014446 +v -0.0200719 -0.0075 -0.0132553 +v -0.0189584 -0.0075 -0.0137169 +v -0.0193148 -0.0075 -0.0150449 +v -0.0177593 -0.0075 -0.013875 +v -0.0248843 -0.0075 -0.00925 +v -0.02461 -0.0075 -0.0112059 +v -0.0238083 -0.0075 -0.01301 +v -0.0225418 -0.0075 -0.0145232 +v -0.0209085 -0.0075 -0.015629 +v -0.0193617 -0.0075 -0.016288 +v -0.0165626 -0.0075 -0.0137175 +v -0.0154467 -0.0075 -0.0132553 +v -0.014486 -0.0075 -0.0125175 +v -0.0137538 -0.0075 -0.0115622 +v -0.0132916 -0.0075 -0.010446 +v -0.0131343 -0.0075 -0.00925 +v -0.0222266 -0.0075 -0.0080524 +v -0.0235547 -0.0075 -0.0076964 +v -0.0217646 -0.0075 -0.0069373 +v -0.0229553 -0.0075 -0.0062497 +v -0.0210297 -0.0075 -0.0059796 +v -0.022002 -0.0075 -0.00500735 +v -0.0200719 -0.0075 -0.00524466 +v -0.0207594 -0.0075 -0.00405388 +v -0.0189584 -0.0075 -0.0047831 +v -0.0193148 -0.0075 -0.00345514 +v -0.0177593 -0.0075 -0.004625 +v -0.0177593 -0.0075 -0.00325 +v -0.02461 -0.0075 -0.0072941 +v -0.0238083 -0.0075 -0.00549006 +v -0.0225418 -0.0075 -0.0039768 +v -0.0209085 -0.0075 -0.00287096 +v -0.0193617 -0.0075 -0.0022119 +v -0.0177593 -0.0075 -0.00182637 +v -0.0165626 -0.0075 -0.0047825 +v -0.0162069 -0.0075 -0.0034543 +v -0.0154467 -0.0075 -0.00524469 +v -0.0147592 -0.0075 -0.0040539 +v -0.014486 -0.0075 -0.00598248 +v -0.013513 -0.0075 -0.00501106 +v -0.0137538 -0.0075 -0.0069378 +v -0.012563 -0.0075 -0.0062503 +v -0.0132916 -0.0075 -0.008054 +v -0.0119634 -0.0075 -0.0076985 +v -0.0107846 -0.0075 -0.0075088 +v -0.0166766 -0.0075 -0.00212568 +v -0.0167117 -0.0075 -0.00106153 +v -0.008014 -0.0075 -0.00136532 +v -0.0090659 -0.0075 -0.00221207 +v -0.0065 -0.0075 0.000312658 +v -0.008476 -0.0075 5.5378e-05 +v -0.0106532 -0.0075 -0.00083587 +v -0.0116557 -0.0075 0.00089514 +v -0.0120812 -0.0075 2.32197e-05 +v -0.0121778 -0.0075 0.00146398 +v -0.0130909 -0.0075 0.00076461 +v -0.0120464 -0.0075 -0.0012165 +v -0.0129252 -0.0075 -0.000731 +v -0.0141125 -0.0075 -0.000110779 +v -0.0107617 -0.0075 -0.0057724 +v 4.8963e-05 -0.0075 -0.020494 +v 0.00149694 -0.0075 -0.0203843 +v 0.00149694 -0.0075 -0.0220123 +v 4.8963e-05 -0.0075 -0.022122 +v 0.0029119 -0.0075 -0.0201854 +v 0.0029119 -0.0075 -0.021941 +v 0.0042271 -0.0075 -0.0198377 +v 0.0042271 -0.0075 -0.0217646 +v 0.0054374 -0.0075 -0.019371 +v 0.0054374 -0.0075 -0.0215278 +v 0.00149694 -0.0075 0.00123304 +v 4.8963e-05 -0.0075 0.00134268 +v 0.0029119 -0.0075 0.00103423 +v 0.0042271 -0.0075 0.00068645 +v 0.0054374 -0.0075 0.00021983 +v -0.00149694 -0.0075 -0.0203843 +v -0.00149694 -0.0075 -0.0220123 +v -0.0029119 -0.0075 -0.0201854 +v -0.0029119 -0.0075 -0.021941 +v -0.0042271 -0.0075 -0.0198377 +v -0.0042271 -0.0075 -0.0217646 +v -0.0054374 -0.0075 -0.019371 +v -0.0054374 -0.0075 -0.0215278 +v -0.00149694 -0.0075 0.00123304 +v -0.0029119 -0.0075 0.00103423 +v -0.0042271 -0.0075 0.00068645 +v -0.0054374 -0.0075 0.00021983 +v 0.0222266 0.002 -0.0104476 +v 0.0223843 0.002 -0.00925 +v 0.0217646 0.002 -0.0115627 +v 0.0210297 0.002 -0.0125204 +v 0.0200719 0.002 -0.0132553 +v 0.0189584 0.002 -0.0137169 +v 0.0177593 0.002 -0.013875 +v 0.0165626 0.002 -0.0137175 +v 0.0154467 0.002 -0.0132553 +v 0.014486 0.002 -0.0125175 +v 0.0137538 0.002 -0.0115622 +v 0.0132916 0.002 -0.010446 +v 0.0131343 0.002 -0.00925 +v 0.0222266 0.002 -0.0080524 +v 0.0217646 0.002 -0.0069373 +v 0.0210297 0.002 -0.0059796 +v 0.0200719 0.002 -0.00524466 +v 0.0189584 0.002 -0.0047831 +v 0.0177593 0.002 -0.004625 +v 0.0165626 0.002 -0.0047825 +v 0.0154467 0.002 -0.00524469 +v 0.014486 0.002 -0.00598248 +v 0.0137538 0.002 -0.0069378 +v 0.0132916 0.002 -0.008054 +v -0.0222266 0.002 -0.0104476 +v -0.0223843 0.002 -0.00925 +v -0.0217646 0.002 -0.0115627 +v -0.0210297 0.002 -0.0125204 +v -0.0200719 0.002 -0.0132553 +v -0.0189584 0.002 -0.0137169 +v -0.0177593 0.002 -0.013875 +v -0.0165626 0.002 -0.0137175 +v -0.0154467 0.002 -0.0132553 +v -0.014486 0.002 -0.0125175 +v -0.0137538 0.002 -0.0115622 +v -0.0132916 0.002 -0.010446 +v -0.0131343 0.002 -0.00925 +v -0.0222266 0.002 -0.0080524 +v -0.0217646 0.002 -0.0069373 +v -0.0210297 0.002 -0.0059796 +v -0.0200719 0.002 -0.00524466 +v -0.0189584 0.002 -0.0047831 +v -0.0177593 0.002 -0.004625 +v -0.0165626 0.002 -0.0047825 +v -0.0154467 0.002 -0.00524469 +v -0.014486 0.002 -0.00598248 +v -0.0137538 0.002 -0.0069378 +v -0.0132916 0.002 -0.008054 +v 0.000781428 0.00161437 -0.011588 +v 0.0010918 0.0023048 -0.011467 +v 4.8963e-05 0.0023048 -0.0116999 +v 4.8963e-05 0.00165243 -0.0116999 +v 0.00133196 0.00150598 -0.0113372 +v 0.0017277 0.0023048 -0.0110345 +v 0.00139701 0.00076758 -0.0112958 +v 0.0017277 0.00115243 -0.0110345 +v 0.00102184 0.0011524 -0.0070027 +v 4.8963e-05 0.0011524 -0.00680007 +v 4.8963e-05 0.0023048 -0.0068001 +v 0.0010918 0.0023048 -0.007033 +v 0.0017277 0.0023048 -0.0074655 +v 0.0017277 0.00115243 -0.0074655 +v -0.000781428 0.00161437 -0.011588 +v -0.0010918 0.0023048 -0.011467 +v -0.0017277 0.0023048 -0.0110345 +v -0.00133196 0.00150598 -0.0113372 +v -0.0017277 0.00115243 -0.0110345 +v -0.00139701 0.00076758 -0.0112958 +v -0.00102184 0.0011524 -0.0070027 +v -0.0010918 0.0023048 -0.007033 +v -0.0017277 0.00115243 -0.0074655 +v -0.0017277 0.0023048 -0.0074655 +v 0.0022885 0.00195405 -0.0102427 +v 0.0022932 0.00097703 -0.0102324 +v 0.00249896 0.0018873 -0.00925 +v 0.00249896 0.00094365 -0.00925 +v 0.0022885 0.00195405 -0.0082573 +v 0.0022932 0.00097703 -0.0082676 +v -0.0022885 0.00195405 -0.0102427 +v -0.0022932 0.00097703 -0.0102324 +v -0.00249896 0.0018873 -0.00925 +v -0.00249896 0.00094365 -0.00925 +v -0.0022885 0.00195405 -0.0082573 +v -0.0022932 0.00097703 -0.0082676 +v 0.00170827 0.00324768 -0.0110522 +v 0.0022838 0.00293108 -0.010253 +v 0.0022791 0.0039081 -0.0102634 +v 0.00168883 0.00419057 -0.01107 +v 0.00249896 0.00377459 -0.00925 +v 0.00249896 0.00283094 -0.00925 +v -0.00170827 0.00324768 -0.0074478 +v -0.0022838 0.00293108 -0.008247 +v -0.0022791 0.0039081 -0.0082366 +v -0.00168883 0.00419057 -0.00743008 +v -0.00249896 0.00377459 -0.00925 +v -0.00249896 0.00283094 -0.00925 +v 0.0022958 0.005204 -0.0102255 +v 0.0017351 0.00534529 -0.0110262 +v 0.00231247 0.0065 -0.0101876 +v 0.00178137 0.0065 -0.0109824 +v 0.00249896 0.0051373 -0.00925 +v 0.00249896 0.0065 -0.00925 +v -0.0022958 0.005204 -0.0082745 +v -0.0017351 0.00534529 -0.0074738 +v -0.00231247 0.0065 -0.0083124 +v -0.00178137 0.0065 -0.00751759 +v -0.00249896 0.0051373 -0.00925 +v -0.00249896 0.0065 -0.00925 +v 0.00170827 0.00324768 -0.0074478 +v 0.00168883 0.00419057 -0.00743008 +v 0.0022791 0.0039081 -0.0082366 +v 0.0022838 0.00293108 -0.008247 +v -0.00170827 0.00324768 -0.0110522 +v -0.00168883 0.00419057 -0.01107 +v -0.0022791 0.0039081 -0.0102634 +v -0.0022838 0.00293108 -0.010253 +v 0.00107038 0.00334614 -0.0114768 +v 4.8963e-05 0.0034024 -0.0117 +v 0.00104896 0.00438748 -0.0114866 +v 4.8963e-05 0.0045 -0.0117 +v 0.00104896 0.0053875 -0.0114866 +v 4.8963e-05 0.0055 -0.0117 +v 0.00104896 0.0065 -0.0114866 +v 4.8963e-05 0.0065 -0.0116999 +v 0.00107038 0.00334614 -0.0070232 +v 4.8963e-05 0.0034024 -0.0068001 +v 0.00104896 0.00438748 -0.00701337 +v 4.8963e-05 0.0045 -0.0068 +v 4.8963e-05 0.0055 -0.0068001 +v 0.00104896 0.0053875 -0.0070134 +v 4.8963e-05 0.0065 -0.0068001 +v 0.00104896 0.0065 -0.00701337 +v 0.0017351 0.00534529 -0.0074738 +v 0.00178137 0.0065 -0.00751759 +v -0.00107038 0.00334614 -0.0114768 +v -0.00104896 0.00438748 -0.0114866 +v -0.00104896 0.0053875 -0.0114866 +v -0.00104896 0.0065 -0.0114866 +v -0.0017351 0.00534529 -0.0110262 +v -0.00178137 0.0065 -0.0109824 +v -0.00107038 0.00334614 -0.0070232 +v -0.00104896 0.00438748 -0.00701337 +v -0.00104896 0.0053875 -0.0070134 +v -0.00104896 0.0065 -0.00701337 +v 0.0022958 0.005204 -0.0082745 +v 0.00231247 0.0065 -0.0083124 +v -0.0022958 0.005204 -0.0102255 +v -0.00231247 0.0065 -0.0101876 +v 0.0032389 0.0065 -0.0146142 +v 0.0043224 0.0065 -0.01375 +v 0.0032389 0.0065 -0.0038858 +v 0.0043224 0.0065 -0.00475 +v -0.0032389 0.0065 -0.0146142 +v -0.0043224 0.0065 -0.01375 +v -0.0032389 0.0065 -0.0038858 +v -0.0043224 0.0065 -0.00475 +v 4.8963e-05 0.0065 -0.012725 +v 0.0011229 0.0065 -0.0126915 +v 0.00111594 0.0065 -0.01375 +v 4.8963e-05 0.0065 -0.01375 +v 0.00219685 0.0065 -0.012658 +v 0.00218293 0.0065 -0.01375 +v 0.00325477 0.0065 -0.012625 +v 0.003234 0.0065 -0.01375 +v 0.00327555 0.0065 -0.0115 +v 0.0032963 0.0065 -0.010375 +v 0.0033171 0.0065 -0.00925 +v 0.0047266 0.0065 -0.0126096 +v 0.00497879 0.0065 -0.0114933 +v 0.005126 0.0065 -0.010382 +v 0.005183 0.0065 -0.00925 +v 4.8963e-05 0.0065 -0.00577507 +v 4.8963e-05 0.0065 -0.00475 +v 0.00111594 0.0065 -0.00475 +v 0.0011229 0.0065 -0.0058085 +v 0.00218293 0.0065 -0.00475 +v 0.00219685 0.0065 -0.005842 +v 0.003234 0.0065 -0.00475 +v 0.00325477 0.0065 -0.005875 +v 0.00327555 0.0065 -0.007 +v 0.0032963 0.0065 -0.008125 +v 0.0047266 0.0065 -0.0058904 +v 0.00497879 0.0065 -0.00700669 +v 0.005126 0.0065 -0.008118 +v -0.00111594 0.0065 -0.01375 +v -0.0011229 0.0065 -0.0126915 +v -0.00218293 0.0065 -0.01375 +v -0.00219685 0.0065 -0.012658 +v -0.003234 0.0065 -0.01375 +v -0.00325477 0.0065 -0.012625 +v -0.00327555 0.0065 -0.0115 +v -0.0032963 0.0065 -0.010375 +v -0.0033171 0.0065 -0.00925 +v -0.0047266 0.0065 -0.0126096 +v -0.00497879 0.0065 -0.0114933 +v -0.005126 0.0065 -0.010382 +v -0.005183 0.0065 -0.00925 +v -0.0011229 0.0065 -0.0058085 +v -0.00111594 0.0065 -0.00475 +v -0.00219685 0.0065 -0.005842 +v -0.00218293 0.0065 -0.00475 +v -0.00325477 0.0065 -0.005875 +v -0.003234 0.0065 -0.00475 +v -0.00327555 0.0065 -0.007 +v -0.0032963 0.0065 -0.008125 +v -0.0047266 0.0065 -0.0058904 +v -0.00497879 0.0065 -0.00700669 +v -0.005126 0.0065 -0.008118 +v 0.00111594 0.0065 -0.015 +v 4.8963e-05 0.0065 -0.015 +v 0.00218293 0.0065 -0.015 +v 4.8963e-05 0.0065 -0.0035 +v 0.00111594 0.0065 -0.0035 +v 0.00218293 0.0065 -0.0035 +v -0.00111594 0.0065 -0.015 +v -0.00218293 0.0065 -0.015 +v -0.00111594 0.0065 -0.0035 +v -0.00218293 0.0065 -0.0035 +v 0.00104896 0.0113617 -0.0161782 +v 4.8963e-05 0.0113617 -0.01625 +v 0.0021601 0.0113617 -0.015924 +v 0.0032438 0.0113617 -0.0154784 +v 0.0043334 0.0113617 -0.0147856 +v 0.0054108 0.0113617 -0.01375 +v 0.006682 0.0113617 -0.0114866 +v 0.0061985 0.0113617 -0.0125942 +v 0.0069557 0.0113617 -0.010389 +v 0.007049 0.0113617 -0.00925 +v 0.00104896 0.0113617 -0.00232179 +v 4.8963e-05 0.0113617 -0.00225 +v 0.0021601 0.0113617 -0.00257594 +v 0.0032438 0.0113617 -0.0030216 +v 0.0043334 0.0113617 -0.00371436 +v 0.0054108 0.0113617 -0.00475 +v 0.0061985 0.0113617 -0.0059058 +v 0.006682 0.0113617 -0.00701337 +v 0.0069557 0.0113617 -0.0081109 +v -0.00104896 0.0113617 -0.0161782 +v -0.0021601 0.0113617 -0.015924 +v -0.0032438 0.0113617 -0.0154784 +v -0.0043334 0.0113617 -0.0147856 +v -0.0054108 0.0113617 -0.01375 +v -0.0061985 0.0113617 -0.0125942 +v -0.006682 0.0113617 -0.0114866 +v -0.0069557 0.0113617 -0.010389 +v -0.007049 0.0113617 -0.00925 +v -0.00104896 0.0113617 -0.00232179 +v -0.0021601 0.0113617 -0.00257594 +v -0.0032438 0.0113617 -0.0030216 +v -0.0043334 0.0113617 -0.00371436 +v -0.0054108 0.0113617 -0.00475 +v -0.0061985 0.0113617 -0.0059058 +v -0.006682 0.0113617 -0.00701337 +v -0.0069557 0.0113617 -0.0081109 +v 0.00104896 0.0141463 -0.0161782 +v 4.8963e-05 0.0141463 -0.01625 +v 0.0021601 0.0141463 -0.015924 +v 0.0032438 0.0141463 -0.0154784 +v 0.0043334 0.0141463 -0.0147856 +v 0.0054108 0.0141463 -0.01375 +v 0.006682 0.0141463 -0.0114866 +v 0.0061985 0.0141463 -0.0125942 +v 0.0069557 0.0141463 -0.010389 +v 0.007049 0.0141463 -0.00925 +v 4.8963e-05 0.0141463 -0.00225 +v 0.00104896 0.0141463 -0.00232179 +v 0.0021601 0.0141463 -0.00257594 +v 0.0032438 0.0141463 -0.0030216 +v 0.0043334 0.0141463 -0.00371436 +v 0.0054108 0.0141463 -0.00475 +v 0.0061985 0.0141463 -0.0059058 +v 0.006682 0.0141463 -0.00701337 +v 0.0069557 0.0141463 -0.0081109 +v -0.00104896 0.0141463 -0.0161782 +v -0.0021601 0.0141463 -0.015924 +v -0.0032438 0.0141463 -0.0154784 +v -0.0043334 0.0141463 -0.0147856 +v -0.0054108 0.0141463 -0.01375 +v -0.0061985 0.0141463 -0.0125942 +v -0.006682 0.0141463 -0.0114866 +v -0.0069557 0.0141463 -0.010389 +v -0.007049 0.0141463 -0.00925 +v -0.00104896 0.0141463 -0.00232179 +v -0.0021601 0.0141463 -0.00257594 +v -0.0032438 0.0141463 -0.0030216 +v -0.0043334 0.0141463 -0.00371436 +v -0.0054108 0.0141463 -0.00475 +v -0.006682 0.0141463 -0.00701337 +v -0.0061985 0.0141463 -0.0059058 +v -0.0069557 0.0141463 -0.0081109 +v 0.00104896 0.0169309 -0.0161782 +v 4.8963e-05 0.0169309 -0.01625 +v 0.0021601 0.0169309 -0.015924 +v 0.0032438 0.0169309 -0.0154784 +v 0.0043334 0.0169309 -0.0147856 +v 0.0054108 0.0169309 -0.01375 +v 0.006682 0.0169309 -0.0114866 +v 0.0061985 0.0169309 -0.0125942 +v 0.0069557 0.0169309 -0.010389 +v 0.007049 0.0169309 -0.00925 +v 4.8963e-05 0.0169309 -0.00225 +v 0.00104896 0.0169309 -0.00232179 +v 0.0021601 0.0169309 -0.00257594 +v 0.0032438 0.0169309 -0.0030216 +v 0.0043334 0.0169309 -0.00371436 +v 0.0054108 0.0169309 -0.00475 +v 0.0061985 0.0169309 -0.0059058 +v 0.006682 0.0169309 -0.00701337 +v 0.0069557 0.0169309 -0.0081109 +v -0.00104896 0.0169309 -0.0161782 +v -0.0021601 0.0169309 -0.015924 +v -0.0032438 0.0169309 -0.0154784 +v -0.0043334 0.0169309 -0.0147856 +v -0.0054108 0.0169309 -0.01375 +v -0.0061985 0.0169309 -0.0125942 +v -0.006682 0.0169309 -0.0114866 +v -0.0069557 0.0169309 -0.010389 +v -0.007049 0.0169309 -0.00925 +v -0.00104896 0.0169309 -0.00232179 +v -0.0021601 0.0169309 -0.00257594 +v -0.0032438 0.0169309 -0.0030216 +v -0.0043334 0.0169309 -0.00371436 +v -0.0054108 0.0169309 -0.00475 +v -0.006682 0.0169309 -0.00701337 +v -0.0061985 0.0169309 -0.0059058 +v -0.0069557 0.0169309 -0.0081109 +v 0.00104896 0.0197154 -0.0161782 +v 4.8963e-05 0.0197154 -0.01625 +v 0.0021601 0.0197154 -0.015924 +v 0.0032438 0.0197154 -0.0154784 +v 0.0043334 0.0197154 -0.0147856 +v 0.0054108 0.0197154 -0.01375 +v 0.006682 0.0197154 -0.0114866 +v 0.0061985 0.0197154 -0.0125942 +v 0.0069557 0.0197154 -0.010389 +v 0.007049 0.0197154 -0.00925 +v 4.8963e-05 0.0197154 -0.00225 +v 0.00104896 0.0197154 -0.00232179 +v 0.0021601 0.0197154 -0.00257594 +v 0.0032438 0.0197154 -0.0030216 +v 0.0043334 0.0197154 -0.00371436 +v 0.0054108 0.0197154 -0.00475 +v 0.0061985 0.0197154 -0.0059058 +v 0.006682 0.0197154 -0.00701337 +v 0.0069557 0.0197154 -0.0081109 +v -0.00104896 0.0197154 -0.0161782 +v -0.0021601 0.0197154 -0.015924 +v -0.0032438 0.0197154 -0.0154784 +v -0.0043334 0.0197154 -0.0147856 +v -0.0054108 0.0197154 -0.01375 +v -0.0061985 0.0197154 -0.0125942 +v -0.006682 0.0197154 -0.0114866 +v -0.0069557 0.0197154 -0.010389 +v -0.007049 0.0197154 -0.00925 +v -0.00104896 0.0197154 -0.00232179 +v -0.0021601 0.0197154 -0.00257594 +v -0.0032438 0.0197154 -0.0030216 +v -0.0043334 0.0197154 -0.00371436 +v -0.0054108 0.0197154 -0.00475 +v -0.006682 0.0197154 -0.00701337 +v -0.0061985 0.0197154 -0.0059058 +v -0.0069557 0.0197154 -0.0081109 +g patch1 +f 1 2 3 +f 4 5 6 +f 7 8 9 +f 10 11 12 +f 13 11 14 +f 15 12 16 +f 17 18 19 +f 20 21 22 +f 23 21 24 +f 25 20 26 +f 27 28 29 +f 30 31 32 +f 33 34 35 +f 36 37 38 +f 39 37 40 +f 41 36 42 +f 43 44 45 +f 46 47 48 +f 49 47 50 +f 51 48 52 +f 53 54 55 +f 55 56 53 +f 57 53 56 +f 56 58 57 +f 57 58 59 +f 59 60 57 +f 60 59 61 +f 61 62 60 +f 63 60 62 +f 62 64 63 +f 60 63 65 +f 65 57 60 +f 53 57 65 +f 65 66 53 +f 66 67 54 +f 54 53 66 +f 68 69 70 +f 70 71 68 +f 72 73 74 +f 74 75 72 +f 76 77 73 +f 73 72 76 +f 76 78 79 +f 79 77 76 +f 78 62 61 +f 61 79 78 +f 80 64 62 +f 62 78 80 +f 78 76 81 +f 81 80 78 +f 72 82 81 +f 81 76 72 +f 82 72 75 +f 75 83 82 +f 84 85 86 +f 86 87 84 +f 88 89 84 +f 84 87 88 +f 90 91 11 +f 11 92 90 +f 91 90 93 +f 93 94 91 +f 95 96 97 +f 97 14 95 +f 95 91 94 +f 94 96 95 +f 14 11 91 +f 91 95 14 +f 98 99 100 +f 100 101 98 +f 98 102 103 +f 103 99 98 +f 98 101 104 +f 104 102 98 +f 105 106 103 +f 103 102 105 +f 106 105 107 +f 107 108 106 +f 109 110 104 +f 104 111 109 +f 110 105 102 +f 102 104 110 +f 110 112 107 +f 107 105 110 +f 109 111 113 +f 113 114 109 +f 114 112 110 +f 110 109 114 +f 114 113 115 +f 115 112 114 +f 7 101 100 +f 100 116 7 +f 7 9 104 +f 104 101 7 +f 117 118 111 +f 111 104 117 +f 15 16 118 +f 118 117 15 +f 117 104 9 +f 9 15 117 +f 12 15 9 +f 9 10 12 +f 92 11 10 +f 10 119 92 +f 16 12 11 +f 11 13 16 +f 120 97 115 +f 115 113 120 +f 14 97 120 +f 120 13 14 +f 118 120 113 +f 113 111 118 +f 16 13 120 +f 120 118 16 +f 85 84 121 +f 121 116 85 +f 89 122 121 +f 121 84 89 +f 8 7 116 +f 116 121 8 +f 122 119 8 +f 8 121 122 +f 10 9 8 +f 8 119 10 +f 68 123 124 +f 124 69 68 +f 125 126 127 +f 127 128 125 +f 128 127 129 +f 129 130 128 +f 131 125 128 +f 128 132 131 +f 132 128 130 +f 130 133 132 +f 134 131 132 +f 132 135 134 +f 135 132 133 +f 133 136 135 +f 137 134 135 +f 135 138 137 +f 138 135 136 +f 136 139 138 +f 140 137 138 +f 138 141 140 +f 141 138 139 +f 139 142 141 +f 141 94 93 +f 93 140 141 +f 142 96 94 +f 94 141 142 +f 143 144 127 +f 127 126 143 +f 144 145 129 +f 129 127 144 +f 146 147 144 +f 144 143 146 +f 147 148 145 +f 145 144 147 +f 149 150 147 +f 147 146 149 +f 150 151 148 +f 148 147 150 +f 152 153 150 +f 150 149 152 +f 153 154 151 +f 151 150 153 +f 155 156 153 +f 153 152 155 +f 156 157 154 +f 154 153 156 +f 156 155 158 +f 158 159 156 +f 157 156 159 +f 159 160 157 +f 161 87 86 +f 86 162 161 +f 88 87 161 +f 161 163 88 +f 164 165 21 +f 21 166 164 +f 166 159 158 +f 158 164 166 +f 167 23 168 +f 168 160 167 +f 167 160 159 +f 159 166 167 +f 23 167 166 +f 166 21 23 +f 169 170 171 +f 171 172 169 +f 169 172 173 +f 173 174 169 +f 169 174 175 +f 175 170 169 +f 173 176 177 +f 177 174 173 +f 178 179 175 +f 175 180 178 +f 180 175 174 +f 174 177 180 +f 178 181 182 +f 182 179 178 +f 181 178 180 +f 180 183 181 +f 181 183 184 +f 184 182 181 +f 19 185 171 +f 171 170 19 +f 19 170 175 +f 175 17 19 +f 186 175 179 +f 179 187 186 +f 26 186 187 +f 187 25 26 +f 186 26 17 +f 17 175 186 +f 20 22 17 +f 17 26 20 +f 165 188 22 +f 22 21 165 +f 25 24 21 +f 21 20 25 +f 184 168 189 +f 189 182 184 +f 23 24 189 +f 189 168 23 +f 187 179 182 +f 182 189 187 +f 25 187 189 +f 189 24 25 +f 162 185 190 +f 190 161 162 +f 163 161 190 +f 190 191 163 +f 18 190 185 +f 185 19 18 +f 191 190 18 +f 18 188 191 +f 22 188 18 +f 18 17 22 +f 192 193 55 +f 55 54 192 +f 194 195 193 +f 193 192 194 +f 194 196 197 +f 197 195 194 +f 196 198 199 +f 199 197 196 +f 200 201 198 +f 198 196 200 +f 196 194 202 +f 202 200 196 +f 192 203 202 +f 202 194 192 +f 203 192 54 +f 54 67 203 +f 204 205 206 +f 206 207 204 +f 208 75 74 +f 74 209 208 +f 210 208 209 +f 209 211 210 +f 210 211 212 +f 212 213 210 +f 213 212 199 +f 199 198 213 +f 214 213 198 +f 198 201 214 +f 213 214 215 +f 215 210 213 +f 208 210 215 +f 215 216 208 +f 216 83 75 +f 75 208 216 +f 217 218 219 +f 219 220 217 +f 221 218 217 +f 217 222 221 +f 223 224 37 +f 37 225 223 +f 225 226 227 +f 227 223 225 +f 228 39 229 +f 229 230 228 +f 228 230 226 +f 226 225 228 +f 39 228 225 +f 225 37 39 +f 231 232 233 +f 233 234 231 +f 231 234 235 +f 235 236 231 +f 231 236 237 +f 237 232 231 +f 238 236 235 +f 235 239 238 +f 239 240 241 +f 241 238 239 +f 242 243 237 +f 237 244 242 +f 244 237 236 +f 236 238 244 +f 244 238 241 +f 241 245 244 +f 242 246 247 +f 247 243 242 +f 246 242 244 +f 244 245 246 +f 246 245 248 +f 248 247 246 +f 35 249 233 +f 233 232 35 +f 35 232 237 +f 237 33 35 +f 250 237 243 +f 243 251 250 +f 42 250 251 +f 251 41 42 +f 250 42 33 +f 33 237 250 +f 36 38 33 +f 33 42 36 +f 224 252 38 +f 38 37 224 +f 41 40 37 +f 37 36 41 +f 253 247 248 +f 248 229 253 +f 39 40 253 +f 253 229 39 +f 251 243 247 +f 247 253 251 +f 41 251 253 +f 253 40 41 +f 220 249 254 +f 254 217 220 +f 222 217 254 +f 254 255 222 +f 34 254 249 +f 249 35 34 +f 255 254 34 +f 34 252 255 +f 38 252 34 +f 34 33 38 +f 204 207 256 +f 256 257 204 +f 258 259 260 +f 260 261 258 +f 259 262 263 +f 263 260 259 +f 264 265 259 +f 259 258 264 +f 265 266 262 +f 262 259 265 +f 267 268 265 +f 265 264 267 +f 268 269 266 +f 266 265 268 +f 270 271 268 +f 268 267 270 +f 271 272 269 +f 269 268 271 +f 273 274 271 +f 271 270 273 +f 274 275 272 +f 272 271 274 +f 274 273 227 +f 227 226 274 +f 275 274 226 +f 226 230 275 +f 276 261 260 +f 260 277 276 +f 277 260 263 +f 263 278 277 +f 279 276 277 +f 277 280 279 +f 280 277 278 +f 278 281 280 +f 282 279 280 +f 280 283 282 +f 283 280 281 +f 281 284 283 +f 285 282 283 +f 283 286 285 +f 286 283 284 +f 284 287 286 +f 288 285 286 +f 286 289 288 +f 289 286 287 +f 287 290 289 +f 289 291 292 +f 292 288 289 +f 290 293 291 +f 291 289 290 +f 294 295 219 +f 219 218 294 +f 221 296 294 +f 294 218 221 +f 297 298 47 +f 47 299 297 +f 298 297 292 +f 292 291 298 +f 300 293 301 +f 301 50 300 +f 300 298 291 +f 291 293 300 +f 50 47 298 +f 298 300 50 +f 302 303 304 +f 304 305 302 +f 302 306 307 +f 307 303 302 +f 302 305 308 +f 308 306 302 +f 307 306 309 +f 309 310 307 +f 311 312 308 +f 308 313 311 +f 312 309 306 +f 306 308 312 +f 311 313 314 +f 314 315 311 +f 315 316 312 +f 312 311 315 +f 315 314 317 +f 317 316 315 +f 43 305 304 +f 304 318 43 +f 43 45 308 +f 308 305 43 +f 319 320 313 +f 313 308 319 +f 51 52 320 +f 320 319 51 +f 319 308 45 +f 45 51 319 +f 48 51 45 +f 45 46 48 +f 299 47 46 +f 46 321 299 +f 52 48 47 +f 47 49 52 +f 317 314 322 +f 322 301 317 +f 50 301 322 +f 322 49 50 +f 320 322 314 +f 314 313 320 +f 52 49 322 +f 322 320 52 +f 295 294 323 +f 323 318 295 +f 296 324 323 +f 323 294 296 +f 44 43 318 +f 318 323 44 +f 324 321 44 +f 44 323 324 +f 46 45 44 +f 44 321 46 +f 325 326 1 +f 327 328 6 +f 329 330 331 +f 332 331 333 +f 334 335 336 +f 336 337 338 +f 177 183 180 +f 339 340 341 +f 342 343 341 +f 344 345 346 +f 347 348 346 +f 349 350 29 +f 351 352 30 +f 353 354 355 +f 355 356 357 +f 358 359 360 +f 361 360 362 +f 316 309 312 +f 363 364 365 +f 366 367 365 +f 368 369 370 +f 371 372 370 +f 58 2 1 +f 1 326 58 +f 373 374 100 +f 100 99 373 +f 374 375 116 +f 116 100 374 +f 376 377 375 +f 375 374 376 +f 378 376 374 +f 374 373 378 +f 375 379 85 +f 85 116 375 +f 379 380 86 +f 86 85 379 +f 377 381 379 +f 379 375 377 +f 381 382 380 +f 380 379 381 +f 383 384 377 +f 377 376 383 +f 383 385 386 +f 386 384 383 +f 387 383 376 +f 376 378 387 +f 388 385 383 +f 383 387 388 +f 384 389 381 +f 381 377 384 +f 384 386 390 +f 390 389 384 +f 389 391 382 +f 382 381 389 +f 392 391 389 +f 389 390 392 +f 393 394 395 +f 395 396 393 +f 394 397 398 +f 398 395 394 +f 396 395 399 +f 399 400 396 +f 398 401 399 +f 399 395 398 +f 400 399 402 +f 402 403 400 +f 402 399 401 +f 401 404 402 +f 405 406 407 +f 407 408 405 +f 406 405 409 +f 409 410 406 +f 409 403 411 +f 411 410 409 +f 411 403 402 +f 402 412 411 +f 412 402 404 +f 404 413 412 +f 406 108 414 +f 414 407 406 +f 108 406 410 +f 410 415 108 +f 415 410 411 +f 411 416 415 +f 416 411 412 +f 412 417 416 +f 417 412 413 +f 413 418 417 +f 77 327 6 +f 6 5 77 +f 419 420 421 +f 421 422 419 +f 422 421 423 +f 423 424 422 +f 420 425 426 +f 426 421 420 +f 423 421 426 +f 426 427 423 +f 425 428 429 +f 429 426 425 +f 429 430 427 +f 427 426 429 +f 431 408 407 +f 407 432 431 +f 432 433 434 +f 434 431 432 +f 434 433 435 +f 435 428 434 +f 435 436 429 +f 429 428 435 +f 436 437 430 +f 430 429 436 +f 432 407 414 +f 414 438 432 +f 438 439 433 +f 433 432 438 +f 439 440 435 +f 435 433 439 +f 440 441 436 +f 436 435 440 +f 441 442 437 +f 437 436 441 +f 443 444 445 +f 445 446 443 +f 444 447 448 +f 448 445 444 +f 446 445 449 +f 449 450 446 +f 445 448 451 +f 451 449 445 +f 450 449 452 +f 452 453 450 +f 449 451 454 +f 454 452 449 +f 453 452 455 +f 455 456 453 +f 452 454 457 +f 457 455 452 +f 456 455 458 +f 458 459 456 +f 455 457 460 +f 460 458 455 +f 461 462 463 +f 463 464 461 +f 462 465 466 +f 466 463 462 +f 459 458 462 +f 462 461 459 +f 458 460 465 +f 465 462 458 +f 467 464 463 +f 463 468 467 +f 468 463 466 +f 466 469 468 +f 470 467 468 +f 468 471 470 +f 471 468 469 +f 469 472 471 +f 473 474 475 +f 475 476 473 +f 477 473 476 +f 476 478 477 +f 476 475 479 +f 479 480 476 +f 478 476 480 +f 480 481 478 +f 482 480 479 +f 479 483 482 +f 484 481 480 +f 480 482 484 +f 485 481 484 +f 484 486 485 +f 487 485 486 +f 486 488 487 +f 482 489 490 +f 490 484 482 +f 490 489 491 +f 491 492 490 +f 483 332 489 +f 489 482 483 +f 333 491 489 +f 489 332 333 +f 486 484 490 +f 490 493 486 +f 493 490 492 +f 492 494 493 +f 493 495 488 +f 488 486 493 +f 495 493 494 +f 494 496 495 +f 474 497 498 +f 498 475 474 +f 497 499 500 +f 500 498 497 +f 501 479 475 +f 475 498 501 +f 502 501 498 +f 498 500 502 +f 479 501 329 +f 329 483 479 +f 501 502 330 +f 330 329 501 +f 332 483 329 +f 329 331 332 +f 503 504 505 +f 505 506 503 +f 504 507 508 +f 508 505 504 +f 509 510 504 +f 504 503 509 +f 510 511 507 +f 507 504 510 +f 509 512 513 +f 513 510 509 +f 510 513 514 +f 514 511 510 +f 512 515 516 +f 516 513 512 +f 513 516 517 +f 517 514 513 +f 515 518 519 +f 519 516 515 +f 520 517 516 +f 516 519 520 +f 521 522 523 +f 523 524 521 +f 524 523 525 +f 525 526 524 +f 518 521 524 +f 524 519 518 +f 519 524 526 +f 526 520 519 +f 522 527 528 +f 528 523 522 +f 523 528 529 +f 529 525 523 +f 527 530 531 +f 531 528 527 +f 528 531 532 +f 532 529 528 +f 533 68 71 +f 71 534 533 +f 71 70 535 +f 535 536 71 +f 534 71 536 +f 536 537 534 +f 538 539 540 +f 540 541 538 +f 541 537 542 +f 542 538 541 +f 542 537 536 +f 536 543 542 +f 543 536 535 +f 535 544 543 +f 545 543 544 +f 544 546 545 +f 543 545 547 +f 547 542 543 +f 538 542 547 +f 547 548 538 +f 548 549 539 +f 539 538 548 +f 550 172 171 +f 171 551 550 +f 551 171 185 +f 185 552 551 +f 553 551 552 +f 552 554 553 +f 555 550 551 +f 551 553 555 +f 552 185 162 +f 162 556 552 +f 556 162 86 +f 86 380 556 +f 554 552 556 +f 556 557 554 +f 557 556 380 +f 380 382 557 +f 558 553 554 +f 554 559 558 +f 558 559 560 +f 560 561 558 +f 562 555 553 +f 553 558 562 +f 563 562 558 +f 558 561 563 +f 559 554 557 +f 557 564 559 +f 559 564 565 +f 565 560 559 +f 564 557 382 +f 382 391 564 +f 392 565 564 +f 564 391 392 +f 566 567 568 +f 568 569 566 +f 568 567 570 +f 570 571 568 +f 566 342 572 +f 572 567 566 +f 570 567 572 +f 572 573 570 +f 342 341 574 +f 574 572 342 +f 574 575 573 +f 573 572 574 +f 576 577 578 +f 578 579 576 +f 579 580 340 +f 340 576 579 +f 580 581 341 +f 341 340 580 +f 581 582 574 +f 574 341 581 +f 582 583 575 +f 575 574 582 +f 579 578 584 +f 584 176 579 +f 176 585 580 +f 580 579 176 +f 585 586 581 +f 581 580 585 +f 582 581 586 +f 586 587 582 +f 587 588 583 +f 583 582 587 +f 589 590 591 +f 591 592 589 +f 591 593 594 +f 594 592 591 +f 589 592 595 +f 595 348 589 +f 594 596 595 +f 595 592 594 +f 348 595 597 +f 597 346 348 +f 597 595 596 +f 596 598 597 +f 599 600 578 +f 578 577 599 +f 600 599 344 +f 344 601 600 +f 601 344 346 +f 346 602 601 +f 602 346 597 +f 597 603 602 +f 603 597 598 +f 598 604 603 +f 600 605 584 +f 584 578 600 +f 605 600 601 +f 601 606 605 +f 606 601 602 +f 602 607 606 +f 603 608 607 +f 607 602 603 +f 608 603 604 +f 604 609 608 +f 610 611 612 +f 612 613 610 +f 613 612 614 +f 614 615 613 +f 611 616 617 +f 617 612 611 +f 612 617 618 +f 618 614 612 +f 616 619 620 +f 620 617 616 +f 617 620 621 +f 621 618 617 +f 619 622 623 +f 623 620 619 +f 620 623 624 +f 624 621 620 +f 622 625 626 +f 626 623 622 +f 623 626 627 +f 627 624 623 +f 628 629 630 +f 630 631 628 +f 631 630 632 +f 632 633 631 +f 625 628 631 +f 631 626 625 +f 626 631 633 +f 633 627 626 +f 634 635 630 +f 630 629 634 +f 635 636 632 +f 632 630 635 +f 470 471 635 +f 635 634 470 +f 471 472 636 +f 636 635 471 +f 637 638 639 +f 639 640 637 +f 641 642 638 +f 638 637 641 +f 638 643 644 +f 644 639 638 +f 642 645 643 +f 643 638 642 +f 646 647 644 +f 644 643 646 +f 648 646 643 +f 643 645 648 +f 649 650 648 +f 648 645 649 +f 487 488 650 +f 650 649 487 +f 646 648 651 +f 651 652 646 +f 651 653 654 +f 654 652 651 +f 647 646 652 +f 652 337 647 +f 338 337 652 +f 652 654 338 +f 650 655 651 +f 651 648 650 +f 655 656 653 +f 653 651 655 +f 655 650 488 +f 488 495 655 +f 495 496 656 +f 656 655 495 +f 640 639 657 +f 657 658 640 +f 658 657 659 +f 659 660 658 +f 661 657 639 +f 639 644 661 +f 662 659 657 +f 657 661 662 +f 644 647 335 +f 335 661 644 +f 661 335 334 +f 334 662 661 +f 337 336 335 +f 335 647 337 +f 663 664 665 +f 665 666 663 +f 666 665 667 +f 667 668 666 +f 669 663 666 +f 666 670 669 +f 670 666 668 +f 668 671 670 +f 669 670 672 +f 672 673 669 +f 670 671 674 +f 674 672 670 +f 673 672 675 +f 675 676 673 +f 672 674 677 +f 677 675 672 +f 676 675 678 +f 678 679 676 +f 680 678 675 +f 675 677 680 +f 681 682 683 +f 683 684 681 +f 682 685 686 +f 686 683 682 +f 679 678 682 +f 682 681 679 +f 678 680 685 +f 685 682 678 +f 684 683 687 +f 687 688 684 +f 683 686 689 +f 689 687 683 +f 688 687 531 +f 531 530 688 +f 687 689 532 +f 532 531 687 +f 533 690 123 +f 123 68 533 +f 123 691 692 +f 692 124 123 +f 690 693 691 +f 691 123 690 +f 694 695 696 +f 696 697 694 +f 695 694 691 +f 691 693 695 +f 694 698 692 +f 692 691 694 +f 698 694 697 +f 697 699 698 +f 700 701 702 +f 702 703 700 +f 704 705 701 +f 701 700 704 +f 706 707 704 +f 704 700 706 +f 706 700 703 +f 703 708 706 +f 339 705 704 +f 704 709 339 +f 340 339 709 +f 709 576 340 +f 709 704 707 +f 707 710 709 +f 576 709 710 +f 710 577 576 +f 711 712 702 +f 702 701 711 +f 566 569 712 +f 712 711 566 +f 343 711 701 +f 701 705 343 +f 342 566 711 +f 711 343 342 +f 705 339 341 +f 341 343 705 +f 713 714 715 +f 715 716 713 +f 717 713 716 +f 716 718 717 +f 707 706 713 +f 713 717 707 +f 708 714 713 +f 713 706 708 +f 345 719 717 +f 717 718 345 +f 344 599 719 +f 719 345 344 +f 719 710 707 +f 707 717 719 +f 599 577 710 +f 710 719 599 +f 720 716 715 +f 715 721 720 +f 589 720 721 +f 721 590 589 +f 347 718 716 +f 716 720 347 +f 348 347 720 +f 720 589 348 +f 718 347 346 +f 346 345 718 +f 195 349 29 +f 29 28 195 +f 722 234 233 +f 233 723 722 +f 723 233 249 +f 249 724 723 +f 725 723 724 +f 724 726 725 +f 727 722 723 +f 723 725 727 +f 724 249 220 +f 220 728 724 +f 728 220 219 +f 219 729 728 +f 726 724 728 +f 728 730 726 +f 730 728 729 +f 729 731 730 +f 732 725 726 +f 726 733 732 +f 732 733 734 +f 734 735 732 +f 736 727 725 +f 725 732 736 +f 737 736 732 +f 732 735 737 +f 733 726 730 +f 730 738 733 +f 733 738 739 +f 739 734 733 +f 738 730 731 +f 731 740 738 +f 741 739 738 +f 738 740 741 +f 393 742 743 +f 743 394 393 +f 394 743 744 +f 744 397 394 +f 742 745 746 +f 746 743 742 +f 744 743 746 +f 746 747 744 +f 745 748 749 +f 749 746 745 +f 749 750 747 +f 747 746 749 +f 751 752 753 +f 753 754 751 +f 754 755 756 +f 756 751 754 +f 756 755 757 +f 757 748 756 +f 757 758 749 +f 749 748 757 +f 758 759 750 +f 750 749 758 +f 754 753 760 +f 760 240 754 +f 240 761 755 +f 755 754 240 +f 761 762 757 +f 757 755 761 +f 762 763 758 +f 758 757 762 +f 763 764 759 +f 759 758 763 +f 211 31 30 +f 30 352 211 +f 419 422 765 +f 765 766 419 +f 422 424 767 +f 767 765 422 +f 766 765 768 +f 768 769 766 +f 767 770 768 +f 768 765 767 +f 769 768 771 +f 771 772 769 +f 771 768 770 +f 770 773 771 +f 774 775 753 +f 753 752 774 +f 775 774 776 +f 776 777 775 +f 776 772 778 +f 778 777 776 +f 778 772 771 +f 771 779 778 +f 779 771 773 +f 773 780 779 +f 775 781 760 +f 760 753 775 +f 781 775 777 +f 777 782 781 +f 782 777 778 +f 778 783 782 +f 783 778 779 +f 779 784 783 +f 784 779 780 +f 780 785 784 +f 443 786 787 +f 787 444 443 +f 444 787 788 +f 788 447 444 +f 786 789 790 +f 790 787 786 +f 787 790 791 +f 791 788 787 +f 789 792 793 +f 793 790 789 +f 790 793 794 +f 794 791 790 +f 792 795 796 +f 796 793 792 +f 793 796 797 +f 797 794 793 +f 795 798 799 +f 799 796 795 +f 796 799 800 +f 800 797 796 +f 801 802 803 +f 803 804 801 +f 804 803 805 +f 805 806 804 +f 798 801 804 +f 804 799 798 +f 799 804 806 +f 806 800 799 +f 807 808 803 +f 803 802 807 +f 808 809 805 +f 805 803 808 +f 810 811 808 +f 808 807 810 +f 811 812 809 +f 809 808 811 +f 473 813 814 +f 814 474 473 +f 477 815 813 +f 813 473 477 +f 813 816 817 +f 817 814 813 +f 815 818 816 +f 816 813 815 +f 819 820 817 +f 817 816 819 +f 821 819 816 +f 816 818 821 +f 822 823 821 +f 821 818 822 +f 824 825 823 +f 823 822 824 +f 819 821 826 +f 826 827 819 +f 826 828 829 +f 829 827 826 +f 820 819 827 +f 827 356 820 +f 357 356 827 +f 827 829 357 +f 823 830 826 +f 826 821 823 +f 830 831 828 +f 828 826 830 +f 830 823 825 +f 825 832 830 +f 832 833 831 +f 831 830 832 +f 474 814 834 +f 834 497 474 +f 497 834 835 +f 835 499 497 +f 836 834 814 +f 814 817 836 +f 837 835 834 +f 834 836 837 +f 817 820 354 +f 354 836 817 +f 836 354 353 +f 353 837 836 +f 356 355 354 +f 354 820 356 +f 838 506 505 +f 505 839 838 +f 839 505 508 +f 508 840 839 +f 841 838 839 +f 839 842 841 +f 842 839 840 +f 840 843 842 +f 841 842 844 +f 844 845 841 +f 842 843 846 +f 846 844 842 +f 845 844 847 +f 847 848 845 +f 844 846 849 +f 849 847 844 +f 848 847 850 +f 850 851 848 +f 852 850 847 +f 847 849 852 +f 853 854 855 +f 855 856 853 +f 854 857 858 +f 858 855 854 +f 851 850 854 +f 854 853 851 +f 850 852 857 +f 857 854 850 +f 856 855 859 +f 859 860 856 +f 855 858 861 +f 861 859 855 +f 860 859 862 +f 862 863 860 +f 859 861 864 +f 864 862 859 +f 865 866 205 +f 205 204 865 +f 205 867 868 +f 868 206 205 +f 866 869 867 +f 867 205 866 +f 870 871 540 +f 540 539 870 +f 871 870 872 +f 872 869 871 +f 872 873 867 +f 867 869 872 +f 873 874 868 +f 868 867 873 +f 875 876 874 +f 874 873 875 +f 873 872 877 +f 877 875 873 +f 870 878 877 +f 877 872 870 +f 878 870 539 +f 539 549 878 +f 879 880 304 +f 304 303 879 +f 880 881 318 +f 318 304 880 +f 882 883 881 +f 881 880 882 +f 884 882 880 +f 880 879 884 +f 881 885 295 +f 295 318 881 +f 885 729 219 +f 219 295 885 +f 883 886 885 +f 885 881 883 +f 886 731 729 +f 729 885 886 +f 887 888 883 +f 883 882 887 +f 887 889 890 +f 890 888 887 +f 891 887 882 +f 882 884 891 +f 892 889 887 +f 887 891 892 +f 888 893 886 +f 886 883 888 +f 888 890 894 +f 894 893 888 +f 893 740 731 +f 731 886 893 +f 741 740 893 +f 893 894 741 +f 895 569 568 +f 568 896 895 +f 568 571 897 +f 897 896 568 +f 895 896 898 +f 898 367 895 +f 897 899 898 +f 898 896 897 +f 367 898 900 +f 900 365 367 +f 900 898 899 +f 899 901 900 +f 902 903 904 +f 904 905 902 +f 903 902 363 +f 363 906 903 +f 906 363 365 +f 365 907 906 +f 907 365 900 +f 900 908 907 +f 908 900 901 +f 901 909 908 +f 903 310 910 +f 910 904 903 +f 310 903 906 +f 906 911 310 +f 911 906 907 +f 907 912 911 +f 908 913 912 +f 912 907 908 +f 913 908 909 +f 909 914 913 +f 915 916 591 +f 591 590 915 +f 591 916 917 +f 917 593 591 +f 915 371 918 +f 918 916 915 +f 917 916 918 +f 918 919 917 +f 371 370 920 +f 920 918 371 +f 920 921 919 +f 919 918 920 +f 922 905 904 +f 904 923 922 +f 923 924 369 +f 369 922 923 +f 924 925 370 +f 370 369 924 +f 925 926 920 +f 920 370 925 +f 926 927 921 +f 921 920 926 +f 923 904 910 +f 910 928 923 +f 928 929 924 +f 924 923 928 +f 929 930 925 +f 925 924 929 +f 926 925 930 +f 930 931 926 +f 931 932 927 +f 927 926 931 +f 610 613 933 +f 933 934 610 +f 613 615 935 +f 935 933 613 +f 934 933 936 +f 936 937 934 +f 933 935 938 +f 938 936 933 +f 937 936 939 +f 939 940 937 +f 936 938 941 +f 941 939 936 +f 940 939 942 +f 942 943 940 +f 939 941 944 +f 944 942 939 +f 943 942 945 +f 945 946 943 +f 942 944 947 +f 947 945 942 +f 948 949 950 +f 950 951 948 +f 949 952 953 +f 953 950 949 +f 946 945 949 +f 949 948 946 +f 945 947 952 +f 952 949 945 +f 954 951 950 +f 950 955 954 +f 955 950 953 +f 953 956 955 +f 810 954 955 +f 955 811 810 +f 811 955 956 +f 956 812 811 +f 637 640 957 +f 957 958 637 +f 641 637 958 +f 958 959 641 +f 958 957 960 +f 960 961 958 +f 959 958 961 +f 961 962 959 +f 963 961 960 +f 960 964 963 +f 965 962 961 +f 961 963 965 +f 966 962 965 +f 965 967 966 +f 824 966 967 +f 967 825 824 +f 963 968 969 +f 969 965 963 +f 969 968 970 +f 970 971 969 +f 964 361 968 +f 968 963 964 +f 362 970 968 +f 968 361 362 +f 967 965 969 +f 969 972 967 +f 972 969 971 +f 971 973 972 +f 972 832 825 +f 825 967 972 +f 832 972 973 +f 973 833 832 +f 640 658 974 +f 974 957 640 +f 658 660 975 +f 975 974 658 +f 976 960 957 +f 957 974 976 +f 977 976 974 +f 974 975 977 +f 960 976 358 +f 358 964 960 +f 976 977 359 +f 359 358 976 +f 361 964 358 +f 358 360 361 +f 978 979 665 +f 665 664 978 +f 979 980 667 +f 667 665 979 +f 981 982 979 +f 979 978 981 +f 982 983 980 +f 980 979 982 +f 981 984 985 +f 985 982 981 +f 982 985 986 +f 986 983 982 +f 984 987 988 +f 988 985 984 +f 985 988 989 +f 989 986 985 +f 987 990 991 +f 991 988 987 +f 992 989 988 +f 988 991 992 +f 993 994 995 +f 995 996 993 +f 996 995 997 +f 997 998 996 +f 990 993 996 +f 996 991 990 +f 991 996 998 +f 998 992 991 +f 994 999 1000 +f 1000 995 994 +f 995 1000 1001 +f 1001 997 995 +f 999 863 862 +f 862 1000 999 +f 1000 862 864 +f 864 1001 1000 +f 865 204 257 +f 257 1002 865 +f 257 256 1003 +f 1003 1004 257 +f 1002 257 1004 +f 1004 1005 1002 +f 1006 697 696 +f 696 1007 1006 +f 1007 1005 1004 +f 1004 1006 1007 +f 1006 1004 1003 +f 1003 1008 1006 +f 1008 699 697 +f 697 1006 1008 +f 1009 703 702 +f 702 1010 1009 +f 1011 1009 1010 +f 1010 1012 1011 +f 1013 1009 1011 +f 1011 1014 1013 +f 1013 708 703 +f 703 1009 1013 +f 364 1015 1011 +f 1011 1012 364 +f 363 902 1015 +f 1015 364 363 +f 1015 1016 1014 +f 1014 1011 1015 +f 902 905 1016 +f 1016 1015 902 +f 1017 1010 702 +f 702 712 1017 +f 895 1017 712 +f 712 569 895 +f 366 1012 1010 +f 1010 1017 366 +f 367 366 1017 +f 1017 895 367 +f 1012 366 365 +f 365 364 1012 +f 1018 1019 715 +f 715 714 1018 +f 1020 1021 1019 +f 1019 1018 1020 +f 1014 1020 1018 +f 1018 1013 1014 +f 708 1013 1018 +f 1018 714 708 +f 368 1021 1020 +f 1020 1022 368 +f 369 368 1022 +f 1022 922 369 +f 1022 1020 1014 +f 1014 1016 1022 +f 922 1022 1016 +f 1016 905 922 +f 1023 721 715 +f 715 1019 1023 +f 915 590 721 +f 721 1023 915 +f 372 1023 1019 +f 1019 1021 372 +f 371 915 1023 +f 1023 372 371 +f 1021 368 370 +f 370 372 1021 +f 1024 1025 1026 +f 1026 1027 1024 +f 1028 1029 1030 +f 1030 1031 1028 +f 1032 1033 183 +f 183 177 1032 +f 1034 1035 1036 +f 1036 1037 1034 +f 1038 1039 1040 +f 1040 1041 1038 +f 1042 1043 309 +f 309 316 1042 +f 326 1044 59 +f 59 58 326 +f 325 1045 1044 +f 1044 326 325 +f 1044 1046 61 +f 61 59 1044 +f 1045 1047 1046 +f 1046 1044 1045 +f 1048 56 55 +f 55 1049 1048 +f 1050 1048 1049 +f 1049 1051 1050 +f 2 58 56 +f 56 1048 2 +f 3 2 1048 +f 1048 1050 3 +f 1050 1051 1052 +f 1052 1053 1050 +f 1054 1053 1052 +f 1052 1055 1054 +f 3 1050 1053 +f 1053 1056 3 +f 1057 1056 1053 +f 1053 1054 1057 +f 1026 1 3 +f 3 1056 1026 +f 1027 1026 1056 +f 1056 1057 1027 +f 1045 325 1025 +f 1025 1058 1045 +f 1058 1059 1047 +f 1047 1045 1058 +f 1025 325 1 +f 1 1026 1025 +f 1060 1054 1055 +f 1055 1061 1060 +f 1062 1060 1061 +f 1061 1063 1062 +f 1054 1060 1064 +f 1064 1057 1054 +f 1060 1062 1065 +f 1065 1064 1060 +f 1066 1027 1057 +f 1057 1064 1066 +f 1064 1065 1067 +f 1067 1066 1064 +f 1063 1068 1069 +f 1069 1062 1063 +f 1070 1069 1068 +f 1068 1071 1070 +f 1071 393 396 +f 396 1070 1071 +f 1062 1069 1072 +f 1072 1065 1062 +f 1069 1070 1073 +f 1073 1072 1069 +f 396 400 1073 +f 1073 1070 396 +f 1065 1072 1074 +f 1074 1067 1065 +f 1072 1073 1075 +f 1075 1074 1072 +f 1073 400 403 +f 403 1075 1073 +f 327 77 79 +f 79 1076 327 +f 328 327 1076 +f 1076 1077 328 +f 1076 79 61 +f 61 1046 1076 +f 1077 1076 1046 +f 1046 1047 1077 +f 1078 1079 74 +f 74 73 1078 +f 1080 1081 1079 +f 1079 1078 1080 +f 5 1078 73 +f 73 77 5 +f 4 1080 1078 +f 1078 5 4 +f 1081 1080 1082 +f 1082 1083 1081 +f 1084 1085 1083 +f 1083 1082 1084 +f 1080 4 1086 +f 1086 1082 1080 +f 1087 1084 1082 +f 1082 1086 1087 +f 1030 1086 4 +f 4 6 1030 +f 1029 1087 1086 +f 1086 1030 1029 +f 328 1077 1088 +f 1088 1031 328 +f 1088 1077 1047 +f 1047 1059 1088 +f 1031 1030 6 +f 6 328 1031 +f 1089 1090 1085 +f 1085 1084 1089 +f 1091 1092 1090 +f 1090 1089 1091 +f 1084 1087 1093 +f 1093 1089 1084 +f 1089 1093 1094 +f 1094 1091 1089 +f 1095 1093 1087 +f 1087 1029 1095 +f 1093 1095 1096 +f 1096 1094 1093 +f 1092 1091 1097 +f 1097 1098 1092 +f 1099 1100 1098 +f 1098 1097 1099 +f 1100 1099 420 +f 420 419 1100 +f 1091 1094 1101 +f 1101 1097 1091 +f 1097 1101 1102 +f 1102 1099 1097 +f 420 1099 1102 +f 1102 425 420 +f 1094 1096 1103 +f 1103 1101 1094 +f 1101 1103 1104 +f 1104 1102 1101 +f 1102 1104 428 +f 428 425 1102 +f 1105 1106 1107 +f 1107 1108 1105 +f 1106 1109 1110 +f 1110 1107 1106 +f 1109 1111 1112 +f 1112 1110 1109 +f 1111 1113 1114 +f 1114 1112 1111 +f 1113 1115 1116 +f 1116 1114 1113 +f 1117 1118 1119 +f 1119 1120 1117 +f 1115 1117 1120 +f 1120 1116 1115 +f 1118 1121 1122 +f 1122 1119 1118 +f 1121 1123 1124 +f 1124 1122 1121 +f 1125 1126 1127 +f 1127 1128 1125 +f 1129 1125 1128 +f 1128 1130 1129 +f 1131 1129 1130 +f 1130 1132 1131 +f 1133 1131 1132 +f 1132 1134 1133 +f 1135 1133 1134 +f 1134 1136 1135 +f 1137 1138 1139 +f 1139 1140 1137 +f 1138 1135 1136 +f 1136 1139 1138 +f 1141 1137 1140 +f 1140 1142 1141 +f 1123 1141 1142 +f 1142 1124 1123 +f 349 195 197 +f 197 1143 349 +f 350 349 1143 +f 1143 1144 350 +f 1143 197 199 +f 199 1145 1143 +f 1144 1143 1145 +f 1145 1146 1144 +f 1147 1049 55 +f 55 193 1147 +f 1148 1051 1049 +f 1049 1147 1148 +f 28 1147 193 +f 193 195 28 +f 27 1148 1147 +f 1147 28 27 +f 1051 1148 1149 +f 1149 1052 1051 +f 1150 1055 1052 +f 1052 1149 1150 +f 1148 27 1151 +f 1151 1149 1148 +f 1152 1150 1149 +f 1149 1151 1152 +f 1036 1151 27 +f 27 29 1036 +f 1035 1152 1151 +f 1151 1036 1035 +f 350 1144 1153 +f 1153 1037 350 +f 1153 1144 1146 +f 1146 1154 1153 +f 1037 1036 29 +f 29 350 1037 +f 1155 1061 1055 +f 1055 1150 1155 +f 1156 1063 1061 +f 1061 1155 1156 +f 1150 1152 1157 +f 1157 1155 1150 +f 1155 1157 1158 +f 1158 1156 1155 +f 1159 1157 1152 +f 1152 1035 1159 +f 1157 1159 1160 +f 1160 1158 1157 +f 1063 1156 1161 +f 1161 1068 1063 +f 1162 1071 1068 +f 1068 1161 1162 +f 1071 1162 742 +f 742 393 1071 +f 1156 1158 1163 +f 1163 1161 1156 +f 1161 1163 1164 +f 1164 1162 1161 +f 742 1162 1164 +f 1164 745 742 +f 1158 1160 1165 +f 1165 1163 1158 +f 1163 1165 1166 +f 1166 1164 1163 +f 1164 1166 748 +f 748 745 1164 +f 352 1167 212 +f 212 211 352 +f 351 1168 1167 +f 1167 352 351 +f 1167 1145 199 +f 199 212 1167 +f 1168 1146 1145 +f 1145 1167 1168 +f 1169 209 74 +f 74 1079 1169 +f 1170 1169 1079 +f 1079 1081 1170 +f 31 211 209 +f 209 1169 31 +f 32 31 1169 +f 1169 1170 32 +f 1170 1081 1083 +f 1083 1171 1170 +f 1172 1171 1083 +f 1083 1085 1172 +f 32 1170 1171 +f 1171 1173 32 +f 1174 1173 1171 +f 1171 1172 1174 +f 1040 30 32 +f 32 1173 1040 +f 1041 1040 1173 +f 1173 1174 1041 +f 1168 351 1039 +f 1039 1175 1168 +f 1175 1154 1146 +f 1146 1168 1175 +f 1039 351 30 +f 30 1040 1039 +f 1176 1172 1085 +f 1085 1090 1176 +f 1177 1176 1090 +f 1090 1092 1177 +f 1172 1176 1178 +f 1178 1174 1172 +f 1176 1177 1179 +f 1179 1178 1176 +f 1180 1041 1174 +f 1174 1178 1180 +f 1178 1179 1181 +f 1181 1180 1178 +f 1092 1098 1182 +f 1182 1177 1092 +f 1183 1182 1098 +f 1098 1100 1183 +f 1100 419 766 +f 766 1183 1100 +f 1177 1182 1184 +f 1184 1179 1177 +f 1182 1183 1185 +f 1185 1184 1182 +f 766 769 1185 +f 1185 1183 766 +f 1179 1184 1186 +f 1186 1181 1179 +f 1184 1185 1187 +f 1187 1186 1184 +f 1185 769 772 +f 772 1187 1185 +f 1188 1105 1108 +f 1108 1189 1188 +f 1190 1188 1189 +f 1189 1191 1190 +f 1192 1190 1191 +f 1191 1193 1192 +f 1194 1192 1193 +f 1193 1195 1194 +f 1196 1194 1195 +f 1195 1197 1196 +f 1198 1199 1200 +f 1200 1201 1198 +f 1199 1196 1197 +f 1197 1200 1199 +f 1202 1198 1201 +f 1201 1203 1202 +f 1204 1202 1203 +f 1203 1205 1204 +f 1126 1206 1207 +f 1207 1127 1126 +f 1206 1208 1209 +f 1209 1207 1206 +f 1208 1210 1211 +f 1211 1209 1208 +f 1210 1212 1213 +f 1213 1211 1210 +f 1212 1214 1215 +f 1215 1213 1212 +f 1216 1217 1218 +f 1218 1219 1216 +f 1214 1216 1219 +f 1219 1215 1214 +f 1217 1220 1221 +f 1221 1218 1217 +f 1220 1204 1205 +f 1205 1221 1220 +f 1059 1222 1223 +f 1223 1088 1059 +f 1088 1223 1028 +f 1028 1031 1088 +f 453 456 1224 +f 1224 1225 453 +f 1225 1224 1226 +f 1226 1227 1225 +f 1227 1226 1228 +f 1228 1229 1227 +f 1229 1228 1230 +f 1230 1231 1229 +f 1231 1230 331 +f 331 330 1231 +f 456 459 1232 +f 1232 1224 456 +f 1224 1232 1233 +f 1233 1226 1224 +f 1226 1233 1234 +f 1234 1228 1226 +f 1228 1234 1235 +f 1235 1230 1228 +f 1230 1235 333 +f 333 331 1230 +f 1236 1237 1238 +f 1238 1239 1236 +f 1240 1238 1237 +f 1237 1241 1240 +f 1154 1242 1243 +f 1243 1153 1154 +f 1153 1243 1034 +f 1034 1037 1153 +f 1244 1245 1246 +f 1246 1247 1244 +f 1248 1246 1245 +f 1245 1249 1248 +f 940 943 1250 +f 1250 1251 940 +f 1251 1250 1252 +f 1252 1253 1251 +f 1253 1252 1254 +f 1254 1255 1253 +f 1255 1254 1256 +f 1256 1257 1255 +f 1257 1256 360 +f 360 359 1257 +f 943 946 1258 +f 1258 1250 943 +f 1250 1258 1259 +f 1259 1252 1250 +f 1252 1259 1260 +f 1260 1254 1252 +f 1254 1260 1261 +f 1261 1256 1254 +f 1256 1261 362 +f 362 360 1256 +f 1262 1263 1264 +f 1264 1265 1262 +f 1265 1264 1266 +f 1266 1267 1265 +f 1267 1266 1268 +f 1268 1269 1267 +f 1269 1268 1270 +f 1270 1271 1269 +f 1271 1270 1043 +f 1043 1042 1271 +f 1272 1273 1274 +f 1274 1222 1272 +f 1275 1274 1273 +f 1273 1276 1275 +f 1024 1277 1273 +f 1273 1272 1024 +f 1276 1273 1277 +f 1277 1278 1276 +f 1277 1024 1027 +f 1027 1066 1277 +f 1066 1067 1278 +f 1278 1277 1066 +f 1276 1279 1280 +f 1280 1275 1276 +f 1279 1281 1282 +f 1282 1280 1279 +f 1281 405 408 +f 408 1282 1281 +f 1278 1283 1279 +f 1279 1276 1278 +f 1283 1284 1281 +f 1281 1279 1283 +f 1284 409 405 +f 405 1281 1284 +f 1067 1074 1283 +f 1283 1278 1067 +f 1074 1075 1284 +f 1284 1283 1074 +f 1075 403 409 +f 409 1284 1075 +f 172 550 1285 +f 1285 173 172 +f 173 1285 585 +f 585 176 173 +f 550 555 1286 +f 1286 1285 550 +f 1285 1286 586 +f 586 585 1285 +f 555 562 1287 +f 1287 1286 555 +f 1286 1287 587 +f 587 586 1286 +f 562 563 1288 +f 1288 1287 562 +f 1287 1288 588 +f 588 587 1287 +f 1239 1238 1289 +f 1289 1290 1239 +f 1290 1289 1291 +f 1291 1292 1290 +f 1238 1240 1293 +f 1293 1289 1238 +f 1289 1293 1294 +f 1294 1291 1289 +f 1292 1291 1295 +f 1295 1296 1292 +f 1296 1295 1297 +f 1297 1298 1296 +f 1298 1297 1299 +f 1299 1300 1298 +f 1300 1299 1301 +f 1301 1302 1300 +f 1291 1294 1303 +f 1303 1295 1291 +f 1295 1303 1304 +f 1304 1297 1295 +f 1297 1304 1305 +f 1305 1299 1297 +f 1299 1305 1306 +f 1306 1301 1299 +f 1302 1301 1307 +f 1307 1308 1302 +f 1308 1307 1309 +f 1309 1310 1308 +f 1310 1309 1311 +f 1311 1312 1310 +f 1312 1311 1313 +f 1313 1314 1312 +f 1314 1313 649 +f 649 645 1314 +f 1301 1306 1315 +f 1315 1307 1301 +f 1307 1315 1316 +f 1316 1309 1307 +f 1309 1316 1317 +f 1317 1311 1309 +f 1311 1317 1318 +f 1318 1313 1311 +f 1313 1318 487 +f 487 649 1313 +f 129 145 1319 +f 1319 1320 129 +f 145 148 1321 +f 1321 1319 145 +f 148 151 1322 +f 1322 1321 148 +f 151 154 1323 +f 1323 1322 151 +f 154 157 1324 +f 1324 1323 154 +f 157 160 1325 +f 1325 1324 157 +f 1320 1319 1326 +f 1326 1327 1320 +f 1327 1326 1328 +f 1328 1329 1327 +f 1329 1328 1330 +f 1330 1331 1329 +f 1331 1330 1332 +f 1332 1333 1331 +f 1333 1332 1334 +f 1334 1335 1333 +f 1319 1321 1336 +f 1336 1326 1319 +f 1326 1336 1337 +f 1337 1328 1326 +f 1328 1337 1338 +f 1338 1330 1328 +f 1330 1338 1339 +f 1339 1332 1330 +f 1332 1339 1340 +f 1340 1334 1332 +f 1321 1322 1341 +f 1341 1336 1321 +f 1336 1341 1342 +f 1342 1337 1336 +f 1337 1342 1343 +f 1343 1338 1337 +f 1338 1343 1344 +f 1344 1339 1338 +f 1339 1344 1345 +f 1345 1340 1339 +f 1322 1323 1346 +f 1346 1341 1322 +f 1341 1346 1347 +f 1347 1342 1341 +f 1342 1347 1348 +f 1348 1343 1342 +f 1343 1348 1349 +f 1349 1344 1343 +f 1344 1349 1350 +f 1350 1345 1344 +f 1323 1324 1351 +f 1351 1346 1323 +f 1346 1351 1352 +f 1352 1347 1346 +f 1347 1352 1353 +f 1353 1348 1347 +f 1348 1353 1354 +f 1354 1349 1348 +f 1349 1354 1355 +f 1355 1350 1349 +f 1324 1325 1356 +f 1356 1351 1324 +f 1351 1356 1357 +f 1357 1352 1351 +f 1352 1357 1358 +f 1358 1353 1352 +f 1353 1358 1359 +f 1359 1354 1353 +f 1354 1359 1360 +f 1360 1355 1354 +f 168 184 1361 +f 1361 1362 168 +f 1362 1361 1363 +f 1363 1364 1362 +f 1364 1363 1365 +f 1365 1366 1364 +f 1366 1365 1367 +f 1367 1368 1366 +f 1368 1367 1369 +f 1369 1370 1368 +f 1370 1369 1371 +f 1371 1372 1370 +f 234 722 1373 +f 1373 235 234 +f 235 1373 1374 +f 1374 239 235 +f 239 1374 761 +f 761 240 239 +f 722 727 1375 +f 1375 1373 722 +f 1373 1375 1376 +f 1376 1374 1373 +f 1374 1376 762 +f 762 761 1374 +f 727 736 1377 +f 1377 1375 727 +f 1375 1377 1378 +f 1378 1376 1375 +f 1376 1378 763 +f 763 762 1376 +f 736 737 1379 +f 1379 1377 736 +f 1377 1379 1380 +f 1380 1378 1377 +f 1378 1380 764 +f 764 763 1378 +f 1247 1246 1381 +f 1381 1382 1247 +f 1382 1381 1383 +f 1383 1384 1382 +f 1246 1248 1385 +f 1385 1381 1246 +f 1381 1385 1386 +f 1386 1383 1381 +f 1387 1388 1389 +f 1389 1242 1387 +f 1390 1389 1388 +f 1388 1391 1390 +f 1038 1392 1388 +f 1388 1387 1038 +f 1391 1388 1392 +f 1392 1393 1391 +f 1392 1038 1041 +f 1041 1180 1392 +f 1180 1181 1393 +f 1393 1392 1180 +f 1391 1394 1395 +f 1395 1390 1391 +f 1394 1396 1397 +f 1397 1395 1394 +f 1396 774 752 +f 752 1397 1396 +f 1393 1398 1394 +f 1394 1391 1393 +f 1398 1399 1396 +f 1396 1394 1398 +f 1399 776 774 +f 774 1396 1399 +f 1181 1186 1398 +f 1398 1393 1181 +f 1186 1187 1399 +f 1399 1398 1186 +f 1187 772 776 +f 776 1399 1187 +f 1384 1383 1400 +f 1400 1401 1384 +f 1401 1400 1402 +f 1402 1403 1401 +f 1403 1402 1404 +f 1404 1405 1403 +f 1405 1404 1406 +f 1406 1407 1405 +f 1383 1386 1408 +f 1408 1400 1383 +f 1400 1408 1409 +f 1409 1402 1400 +f 1402 1409 1410 +f 1410 1404 1402 +f 1404 1410 1411 +f 1411 1406 1404 +f 1407 1406 1412 +f 1412 1413 1407 +f 1413 1412 1414 +f 1414 1415 1413 +f 1415 1414 1416 +f 1416 1417 1415 +f 1417 1416 1418 +f 1418 1419 1417 +f 1419 1418 822 +f 822 818 1419 +f 1406 1411 1420 +f 1420 1412 1406 +f 1412 1420 1421 +f 1421 1414 1412 +f 1414 1421 1422 +f 1422 1416 1414 +f 1416 1422 1423 +f 1423 1418 1416 +f 1418 1423 824 +f 824 822 1418 +f 229 248 1424 +f 1424 1425 229 +f 1425 1424 1426 +f 1426 1427 1425 +f 1427 1426 1428 +f 1428 1429 1427 +f 1429 1428 1430 +f 1430 1431 1429 +f 1431 1430 1432 +f 1432 1433 1431 +f 1433 1432 1434 +f 1434 1435 1433 +f 263 262 1436 +f 1436 1437 263 +f 262 266 1438 +f 1438 1436 262 +f 266 269 1439 +f 1439 1438 266 +f 269 272 1440 +f 1440 1439 269 +f 272 275 1441 +f 1441 1440 272 +f 275 230 1442 +f 1442 1441 275 +f 1437 1436 1443 +f 1443 1444 1437 +f 1444 1443 1445 +f 1445 1446 1444 +f 1446 1445 1447 +f 1447 1448 1446 +f 1448 1447 1449 +f 1449 1450 1448 +f 1450 1449 1451 +f 1451 1452 1450 +f 1436 1438 1453 +f 1453 1443 1436 +f 1443 1453 1454 +f 1454 1445 1443 +f 1445 1454 1455 +f 1455 1447 1445 +f 1447 1455 1456 +f 1456 1449 1447 +f 1449 1456 1457 +f 1457 1451 1449 +f 1438 1439 1458 +f 1458 1453 1438 +f 1453 1458 1459 +f 1459 1454 1453 +f 1454 1459 1460 +f 1460 1455 1454 +f 1455 1460 1461 +f 1461 1456 1455 +f 1456 1461 1462 +f 1462 1457 1456 +f 1439 1440 1463 +f 1463 1458 1439 +f 1458 1463 1464 +f 1464 1459 1458 +f 1459 1464 1465 +f 1465 1460 1459 +f 1460 1465 1466 +f 1466 1461 1460 +f 1461 1466 1467 +f 1467 1462 1461 +f 1440 1441 1468 +f 1468 1463 1440 +f 1463 1468 1469 +f 1469 1464 1463 +f 1464 1469 1470 +f 1470 1465 1464 +f 1465 1470 1471 +f 1471 1466 1465 +f 1466 1471 1472 +f 1472 1467 1466 +f 1441 1442 1473 +f 1473 1468 1441 +f 1468 1473 1474 +f 1474 1469 1468 +f 1469 1474 1475 +f 1475 1470 1469 +f 1470 1475 1476 +f 1476 1471 1470 +f 1471 1476 1477 +f 1477 1472 1471 +f 1059 1058 1272 +f 1272 1222 1059 +f 1058 1025 1024 +f 1024 1272 1058 +f 1478 1479 1480 +f 1480 1481 1478 +f 1240 1241 1481 +f 1481 1480 1240 +f 619 1482 1483 +f 1483 622 619 +f 1482 1484 1485 +f 1485 1483 1482 +f 1484 1486 1487 +f 1487 1485 1484 +f 1486 1488 1489 +f 1489 1487 1486 +f 1488 334 336 +f 336 1489 1488 +f 622 1483 1490 +f 1490 625 622 +f 1483 1485 1491 +f 1491 1490 1483 +f 1485 1487 1492 +f 1492 1491 1485 +f 1487 1489 1493 +f 1493 1492 1487 +f 1489 336 338 +f 338 1493 1489 +f 1494 1495 1496 +f 1496 1497 1494 +f 1495 1498 1499 +f 1499 1496 1495 +f 1498 1500 1501 +f 1501 1499 1498 +f 1500 1502 1503 +f 1503 1501 1500 +f 1502 1033 1032 +f 1032 1503 1502 +f 1154 1175 1387 +f 1387 1242 1154 +f 1175 1039 1038 +f 1038 1387 1175 +f 792 1504 1505 +f 1505 795 792 +f 1504 1506 1507 +f 1507 1505 1504 +f 1506 1508 1509 +f 1509 1507 1506 +f 1508 1510 1511 +f 1511 1509 1508 +f 1510 353 355 +f 355 1511 1510 +f 795 1505 1512 +f 1512 798 795 +f 1505 1507 1513 +f 1513 1512 1505 +f 1507 1509 1514 +f 1514 1513 1507 +f 1509 1511 1515 +f 1515 1514 1509 +f 1511 355 357 +f 357 1515 1511 +f 1516 1517 1518 +f 1518 1519 1516 +f 1248 1249 1519 +f 1519 1518 1248 +f 63 64 1520 +f 1520 1521 63 +f 1522 1521 1520 +f 1520 546 1522 +f 65 63 1521 +f 1521 1523 65 +f 1524 1523 1521 +f 1521 1522 1524 +f 1523 1525 66 +f 66 65 1523 +f 1526 1525 1523 +f 1523 1524 1526 +f 67 66 1525 +f 1525 1527 67 +f 1528 1527 1525 +f 1525 1526 1528 +f 1529 1530 1531 +f 1531 1532 1529 +f 1533 1534 1532 +f 1532 1531 1533 +f 1534 1533 398 +f 398 397 1534 +f 1530 1535 1536 +f 1536 1531 1530 +f 1531 1536 1537 +f 1537 1533 1531 +f 1533 1537 401 +f 401 398 1533 +f 1535 1538 1539 +f 1539 1536 1535 +f 1536 1539 1540 +f 1540 1537 1536 +f 1537 1540 404 +f 404 401 1537 +f 1538 1541 1542 +f 1542 1539 1538 +f 1539 1542 1543 +f 1543 1540 1539 +f 1540 1543 413 +f 413 404 1540 +f 1541 388 1544 +f 1544 1542 1541 +f 1542 1544 1545 +f 1545 1543 1542 +f 1543 1545 418 +f 418 413 1543 +f 1546 541 540 +f 540 1547 1546 +f 1548 1546 1547 +f 1547 1549 1548 +f 1478 537 541 +f 541 1546 1478 +f 1479 1478 1546 +f 1546 1548 1479 +f 537 1478 1481 +f 1481 534 537 +f 1241 533 534 +f 534 1481 1241 +f 1549 1550 1551 +f 1551 1548 1549 +f 1550 1552 1553 +f 1553 1551 1550 +f 1548 1551 1554 +f 1554 1479 1548 +f 1551 1553 1555 +f 1555 1554 1551 +f 1552 1556 1557 +f 1557 1553 1552 +f 1556 1558 1559 +f 1559 1557 1556 +f 1558 1560 1561 +f 1561 1559 1558 +f 1560 1562 1563 +f 1563 1561 1560 +f 1553 1557 1564 +f 1564 1555 1553 +f 1557 1559 1565 +f 1565 1564 1557 +f 1559 1561 1566 +f 1566 1565 1559 +f 1561 1563 1567 +f 1567 1566 1561 +f 1568 1569 1570 +f 1570 1571 1568 +f 1569 1572 1573 +f 1573 1570 1569 +f 1572 1574 1575 +f 1575 1573 1572 +f 1574 448 447 +f 447 1575 1574 +f 1576 1577 1569 +f 1569 1568 1576 +f 1577 1578 1572 +f 1572 1569 1577 +f 1578 1579 1574 +f 1574 1572 1578 +f 1579 451 448 +f 448 1574 1579 +f 1580 1581 1577 +f 1577 1576 1580 +f 1581 1582 1578 +f 1578 1577 1581 +f 1582 1583 1579 +f 1579 1578 1582 +f 1583 454 451 +f 451 1579 1583 +f 1584 1585 1581 +f 1581 1580 1584 +f 1585 1586 1582 +f 1582 1581 1585 +f 1586 1587 1583 +f 1583 1582 1586 +f 1587 457 454 +f 454 1583 1587 +f 1588 1589 1585 +f 1585 1584 1588 +f 1589 1590 1586 +f 1586 1585 1589 +f 1590 1591 1587 +f 1587 1586 1590 +f 1591 460 457 +f 457 1587 1591 +f 1592 1593 1594 +f 1594 1595 1592 +f 1593 1596 1597 +f 1597 1594 1593 +f 1596 1598 1599 +f 1599 1597 1596 +f 1598 466 465 +f 465 1599 1598 +f 1595 1594 1589 +f 1589 1588 1595 +f 1594 1597 1590 +f 1590 1589 1594 +f 1597 1599 1591 +f 1591 1590 1597 +f 1599 465 460 +f 460 1591 1599 +f 1600 1601 1593 +f 1593 1592 1600 +f 1601 1602 1596 +f 1596 1593 1601 +f 1602 1603 1598 +f 1598 1596 1602 +f 1603 469 466 +f 466 1598 1603 +f 1604 1605 1601 +f 1601 1600 1604 +f 1605 1606 1602 +f 1602 1601 1605 +f 1606 1607 1603 +f 1603 1602 1606 +f 1607 472 469 +f 469 1603 1607 +f 1562 1608 1609 +f 1609 1563 1562 +f 1608 1610 1611 +f 1611 1609 1608 +f 1610 1612 1613 +f 1613 1611 1610 +f 1612 1614 1615 +f 1615 1613 1612 +f 1614 477 478 +f 478 1615 1614 +f 1563 1609 1616 +f 1616 1567 1563 +f 1609 1611 1617 +f 1617 1616 1609 +f 1611 1613 1618 +f 1618 1617 1611 +f 1613 1615 1619 +f 1619 1618 1613 +f 1615 478 481 +f 481 1619 1615 +f 464 1620 1621 +f 1621 461 464 +f 1620 1622 1623 +f 1623 1621 1620 +f 1622 1624 1625 +f 1625 1623 1622 +f 1624 1626 1627 +f 1627 1625 1624 +f 1626 492 491 +f 491 1627 1626 +f 461 1621 1232 +f 1232 459 461 +f 1621 1623 1233 +f 1233 1232 1621 +f 1623 1625 1234 +f 1234 1233 1623 +f 1625 1627 1235 +f 1235 1234 1625 +f 1627 491 333 +f 333 1235 1627 +f 467 1628 1620 +f 1620 464 467 +f 1628 1629 1622 +f 1622 1620 1628 +f 1629 1630 1624 +f 1624 1622 1629 +f 1630 1631 1626 +f 1626 1624 1630 +f 1631 494 492 +f 492 1626 1631 +f 470 1632 1628 +f 1628 467 470 +f 1632 1633 1629 +f 1629 1628 1632 +f 1633 1634 1630 +f 1630 1629 1633 +f 1634 1635 1631 +f 1631 1630 1634 +f 1635 496 494 +f 494 1631 1635 +f 446 1636 1637 +f 1637 443 446 +f 1636 1638 1639 +f 1639 1637 1636 +f 1638 1640 1641 +f 1641 1639 1638 +f 1640 1642 1643 +f 1643 1641 1640 +f 1642 500 499 +f 499 1643 1642 +f 450 1644 1636 +f 1636 446 450 +f 1644 1645 1638 +f 1638 1636 1644 +f 1645 1646 1640 +f 1640 1638 1645 +f 1646 1647 1642 +f 1642 1640 1646 +f 1647 502 500 +f 500 1642 1647 +f 453 1225 1644 +f 1644 450 453 +f 1225 1227 1645 +f 1645 1644 1225 +f 1227 1229 1646 +f 1646 1645 1227 +f 1229 1231 1647 +f 1647 1646 1229 +f 1231 330 502 +f 502 1647 1231 +f 1648 1530 1529 +f 1529 1649 1648 +f 1648 1650 1535 +f 1535 1530 1648 +f 1650 1651 1538 +f 1538 1535 1650 +f 1651 1652 1541 +f 1541 1538 1651 +f 1653 388 1541 +f 1541 1652 1653 +f 1654 1655 386 +f 386 385 1654 +f 1653 1654 385 +f 385 388 1653 +f 1655 1656 390 +f 390 386 1655 +f 1657 392 390 +f 390 1656 1657 +f 1658 1659 1648 +f 1648 1649 1658 +f 1659 1658 1660 +f 1660 1661 1659 +f 1662 1663 1661 +f 1661 1660 1662 +f 1664 1665 1663 +f 1663 1662 1664 +f 1665 1664 508 +f 508 507 1665 +f 1659 1666 1650 +f 1650 1648 1659 +f 1661 1667 1666 +f 1666 1659 1661 +f 1663 1668 1667 +f 1667 1661 1663 +f 1665 1669 1668 +f 1668 1663 1665 +f 507 511 1669 +f 1669 1665 507 +f 1666 1670 1651 +f 1651 1650 1666 +f 1667 1671 1670 +f 1670 1666 1667 +f 1668 1672 1671 +f 1671 1667 1668 +f 1669 1673 1672 +f 1672 1668 1669 +f 511 514 1673 +f 1673 1669 511 +f 1652 1651 1670 +f 1670 1674 1652 +f 1674 1670 1671 +f 1671 1675 1674 +f 1675 1671 1672 +f 1672 1676 1675 +f 1676 1672 1673 +f 1673 1677 1676 +f 1677 1673 514 +f 514 517 1677 +f 1653 1652 1674 +f 1674 1678 1653 +f 1678 1674 1675 +f 1675 1679 1678 +f 1679 1675 1676 +f 1676 1680 1679 +f 1680 1676 1677 +f 1677 1681 1680 +f 1681 1677 517 +f 517 520 1681 +f 1682 1683 1655 +f 1655 1654 1682 +f 1684 1685 1683 +f 1683 1682 1684 +f 1686 1687 1685 +f 1685 1684 1686 +f 1688 1689 1687 +f 1687 1686 1688 +f 526 525 1689 +f 1689 1688 526 +f 1678 1682 1654 +f 1654 1653 1678 +f 1679 1684 1682 +f 1682 1678 1679 +f 1680 1686 1684 +f 1684 1679 1680 +f 1681 1688 1686 +f 1686 1680 1681 +f 520 526 1688 +f 1688 1681 520 +f 1683 1690 1656 +f 1656 1655 1683 +f 1685 1691 1690 +f 1690 1683 1685 +f 1687 1692 1691 +f 1691 1685 1687 +f 1689 1693 1692 +f 1692 1687 1689 +f 525 529 1693 +f 1693 1689 525 +f 1656 1690 1694 +f 1694 1657 1656 +f 1691 1695 1694 +f 1694 1690 1691 +f 1696 1695 1691 +f 1691 1692 1696 +f 1692 1693 1697 +f 1697 1696 1692 +f 529 532 1697 +f 1697 1693 529 +f 80 1698 1520 +f 1520 64 80 +f 545 546 1520 +f 1520 1698 545 +f 81 1699 1698 +f 1698 80 81 +f 547 545 1698 +f 1698 1699 547 +f 1699 81 82 +f 82 1700 1699 +f 548 547 1699 +f 1699 1700 548 +f 83 1701 1700 +f 1700 82 83 +f 549 548 1700 +f 1700 1701 549 +f 96 1702 1703 +f 1703 97 96 +f 1704 414 108 +f 108 107 1704 +f 112 1705 1704 +f 1704 107 112 +f 115 1706 1705 +f 1705 112 115 +f 1702 1707 1708 +f 1708 1703 1702 +f 1707 1709 1710 +f 1710 1708 1707 +f 1709 1711 1712 +f 1712 1710 1709 +f 1711 1713 1714 +f 1714 1712 1711 +f 1713 1715 1716 +f 1716 1714 1713 +f 1717 438 414 +f 414 1704 1717 +f 438 1717 1718 +f 1718 439 438 +f 439 1718 1719 +f 1719 440 439 +f 440 1719 1720 +f 1720 441 440 +f 441 1720 1721 +f 1721 442 441 +f 1705 1722 1717 +f 1717 1704 1705 +f 1722 1723 1718 +f 1718 1717 1722 +f 1723 1724 1719 +f 1719 1718 1723 +f 1724 1725 1720 +f 1720 1719 1724 +f 1725 1726 1721 +f 1721 1720 1725 +f 1706 1727 1722 +f 1722 1705 1706 +f 1727 1728 1723 +f 1723 1722 1727 +f 1728 1729 1724 +f 1724 1723 1728 +f 1729 1730 1725 +f 1725 1724 1729 +f 1730 1731 1726 +f 1726 1725 1730 +f 1732 1733 1734 +f 1734 1735 1732 +f 1733 571 570 +f 570 1734 1733 +f 1735 1734 1736 +f 1736 1737 1735 +f 1734 570 573 +f 573 1736 1734 +f 1737 1736 1738 +f 1738 1739 1737 +f 1736 573 575 +f 575 1738 1736 +f 1739 1738 1740 +f 1740 1741 1739 +f 1738 575 583 +f 583 1740 1738 +f 1741 1740 1288 +f 1288 563 1741 +f 1288 1740 583 +f 583 588 1288 +f 1742 1743 696 +f 696 695 1742 +f 1744 1745 1743 +f 1743 1742 1744 +f 1236 1742 695 +f 695 693 1236 +f 1239 1744 1742 +f 1742 1236 1239 +f 693 690 1237 +f 1237 1236 693 +f 1241 1237 690 +f 690 533 1241 +f 1745 1744 1746 +f 1746 1747 1745 +f 1747 1746 1748 +f 1748 1749 1747 +f 1744 1239 1290 +f 1290 1746 1744 +f 1746 1290 1292 +f 1292 1748 1746 +f 1748 1750 1751 +f 1751 1749 1748 +f 1750 1752 1753 +f 1753 1751 1750 +f 1752 1754 1755 +f 1755 1753 1752 +f 1754 1756 1757 +f 1757 1755 1754 +f 1292 1296 1750 +f 1750 1748 1292 +f 1296 1298 1752 +f 1752 1750 1296 +f 1298 1300 1754 +f 1754 1752 1298 +f 1300 1302 1756 +f 1756 1754 1300 +f 1758 1759 1760 +f 1760 1761 1758 +f 1759 1762 1763 +f 1763 1760 1759 +f 1762 1764 1765 +f 1765 1763 1762 +f 1764 615 614 +f 614 1765 1764 +f 1761 1760 1766 +f 1766 1767 1761 +f 1760 1763 1768 +f 1768 1766 1760 +f 1763 1765 1769 +f 1769 1768 1763 +f 1765 614 618 +f 618 1769 1765 +f 1767 1766 1770 +f 1770 1771 1767 +f 1766 1768 1772 +f 1772 1770 1766 +f 1768 1769 1773 +f 1773 1772 1768 +f 1769 618 621 +f 621 1773 1769 +f 1771 1770 1774 +f 1774 1775 1771 +f 1770 1772 1776 +f 1776 1774 1770 +f 1772 1773 1777 +f 1777 1776 1772 +f 1773 621 624 +f 624 1777 1773 +f 1775 1774 1778 +f 1778 1779 1775 +f 1774 1776 1780 +f 1780 1778 1774 +f 1776 1777 1781 +f 1781 1780 1776 +f 1777 624 627 +f 627 1781 1777 +f 1782 1783 1784 +f 1784 1785 1782 +f 1783 1786 1787 +f 1787 1784 1783 +f 1786 1788 1789 +f 1789 1787 1786 +f 1788 633 632 +f 632 1789 1788 +f 1779 1778 1783 +f 1783 1782 1779 +f 1778 1780 1786 +f 1786 1783 1778 +f 1780 1781 1788 +f 1788 1786 1780 +f 1781 627 633 +f 633 1788 1781 +f 1785 1784 1790 +f 1790 1791 1785 +f 1784 1787 1792 +f 1792 1790 1784 +f 1787 1789 1793 +f 1793 1792 1787 +f 1789 632 636 +f 636 1793 1789 +f 1791 1790 1605 +f 1605 1604 1791 +f 1790 1792 1606 +f 1606 1605 1790 +f 1792 1793 1607 +f 1607 1606 1792 +f 1793 636 472 +f 472 1607 1793 +f 1756 1794 1795 +f 1795 1757 1756 +f 1794 1796 1797 +f 1797 1795 1794 +f 1796 1798 1799 +f 1799 1797 1796 +f 1798 1800 1801 +f 1801 1799 1798 +f 1800 642 641 +f 641 1801 1800 +f 1302 1308 1794 +f 1794 1756 1302 +f 1308 1310 1796 +f 1796 1794 1308 +f 1310 1312 1798 +f 1798 1796 1310 +f 1312 1314 1800 +f 1800 1798 1312 +f 1314 645 642 +f 642 1800 1314 +f 628 1802 1803 +f 1803 629 628 +f 1802 1804 1805 +f 1805 1803 1802 +f 1804 1806 1807 +f 1807 1805 1804 +f 1806 1808 1809 +f 1809 1807 1806 +f 1808 654 653 +f 653 1809 1808 +f 625 1490 1802 +f 1802 628 625 +f 1490 1491 1804 +f 1804 1802 1490 +f 1491 1492 1806 +f 1806 1804 1491 +f 1492 1493 1808 +f 1808 1806 1492 +f 1493 338 654 +f 654 1808 1493 +f 629 1803 1810 +f 1810 634 629 +f 1803 1805 1811 +f 1811 1810 1803 +f 1805 1807 1812 +f 1812 1811 1805 +f 1807 1809 1813 +f 1813 1812 1807 +f 1809 653 656 +f 656 1813 1809 +f 634 1810 1632 +f 1632 470 634 +f 1810 1811 1633 +f 1633 1632 1810 +f 1811 1812 1634 +f 1634 1633 1811 +f 1812 1813 1635 +f 1635 1634 1812 +f 1813 656 496 +f 496 1635 1813 +f 610 1814 1815 +f 1815 611 610 +f 1814 1816 1817 +f 1817 1815 1814 +f 1816 1818 1819 +f 1819 1817 1816 +f 1818 1820 1821 +f 1821 1819 1818 +f 1820 660 659 +f 659 1821 1820 +f 611 1815 1822 +f 1822 616 611 +f 1815 1817 1823 +f 1823 1822 1815 +f 1817 1819 1824 +f 1824 1823 1817 +f 1819 1821 1825 +f 1825 1824 1819 +f 1821 659 662 +f 662 1825 1821 +f 616 1822 1482 +f 1482 619 616 +f 1822 1823 1484 +f 1484 1482 1822 +f 1823 1824 1486 +f 1486 1484 1823 +f 1824 1825 1488 +f 1488 1486 1824 +f 1825 662 334 +f 334 1488 1825 +f 1826 1827 1732 +f 1732 1735 1826 +f 1828 1826 1735 +f 1735 1737 1828 +f 1829 1828 1737 +f 1737 1739 1829 +f 1829 1739 1741 +f 1741 1830 1829 +f 1831 1830 1741 +f 1741 563 1831 +f 1832 561 560 +f 560 1833 1832 +f 1831 563 561 +f 561 1832 1831 +f 1833 560 565 +f 565 1834 1833 +f 1657 1834 565 +f 565 392 1657 +f 1835 1827 1826 +f 1826 1836 1835 +f 1836 1837 1838 +f 1838 1835 1836 +f 1839 1838 1837 +f 1837 1840 1839 +f 1841 1839 1840 +f 1840 1842 1841 +f 1842 668 667 +f 667 1841 1842 +f 1836 1826 1828 +f 1828 1843 1836 +f 1837 1836 1843 +f 1843 1844 1837 +f 1840 1837 1844 +f 1844 1845 1840 +f 1842 1840 1845 +f 1845 1846 1842 +f 668 1842 1846 +f 1846 671 668 +f 1843 1828 1829 +f 1829 1847 1843 +f 1844 1843 1847 +f 1847 1848 1844 +f 1845 1844 1848 +f 1848 1849 1845 +f 1846 1845 1849 +f 1849 1850 1846 +f 671 1846 1850 +f 1850 674 671 +f 1830 1851 1847 +f 1847 1829 1830 +f 1851 1852 1848 +f 1848 1847 1851 +f 1852 1853 1849 +f 1849 1848 1852 +f 1853 1854 1850 +f 1850 1849 1853 +f 1854 677 674 +f 674 1850 1854 +f 1831 1855 1851 +f 1851 1830 1831 +f 1855 1856 1852 +f 1852 1851 1855 +f 1856 1857 1853 +f 1853 1852 1856 +f 1857 1858 1854 +f 1854 1853 1857 +f 1858 680 677 +f 677 1854 1858 +f 1859 1832 1833 +f 1833 1860 1859 +f 1861 1859 1860 +f 1860 1862 1861 +f 1863 1861 1862 +f 1862 1864 1863 +f 1865 1863 1864 +f 1864 1866 1865 +f 685 1865 1866 +f 1866 686 685 +f 1855 1831 1832 +f 1832 1859 1855 +f 1856 1855 1859 +f 1859 1861 1856 +f 1857 1856 1861 +f 1861 1863 1857 +f 1858 1857 1863 +f 1863 1865 1858 +f 680 1858 1865 +f 1865 685 680 +f 1860 1833 1834 +f 1834 1867 1860 +f 1862 1860 1867 +f 1867 1868 1862 +f 1864 1862 1868 +f 1868 1869 1864 +f 1866 1864 1869 +f 1869 1870 1866 +f 686 1866 1870 +f 1870 689 686 +f 1834 1657 1694 +f 1694 1867 1834 +f 1868 1867 1694 +f 1694 1695 1868 +f 1696 1869 1868 +f 1868 1695 1696 +f 1869 1696 1697 +f 1697 1870 1869 +f 689 1870 1697 +f 1697 532 689 +f 1871 1872 1873 +f 1873 1874 1871 +f 1875 1876 1872 +f 1872 1871 1875 +f 1877 1878 1876 +f 1876 1875 1877 +f 1879 1880 1878 +f 1878 1877 1879 +f 1881 1882 1880 +f 1880 1879 1881 +f 1883 1884 1882 +f 1882 1881 1883 +f 1885 1886 1884 +f 1884 1883 1885 +f 1887 1888 1886 +f 1886 1885 1887 +f 1889 1890 1888 +f 1888 1887 1889 +f 1891 1892 1890 +f 1890 1889 1891 +f 1893 1894 1892 +f 1892 1891 1893 +f 1895 1896 1894 +f 1894 1893 1895 +f 1872 1897 1898 +f 1898 1873 1872 +f 1897 1899 1900 +f 1900 1898 1897 +f 1899 1901 1902 +f 1902 1900 1899 +f 1901 1903 1904 +f 1904 1902 1901 +f 1903 1905 1906 +f 1906 1904 1903 +f 1876 1907 1897 +f 1897 1872 1876 +f 1907 1908 1899 +f 1899 1897 1907 +f 1908 1909 1901 +f 1901 1899 1908 +f 1909 1910 1903 +f 1903 1901 1909 +f 1910 1911 1905 +f 1905 1903 1910 +f 1878 1912 1907 +f 1907 1876 1878 +f 1912 1913 1908 +f 1908 1907 1912 +f 1913 1914 1909 +f 1909 1908 1913 +f 1914 1915 1910 +f 1910 1909 1914 +f 1915 1916 1911 +f 1911 1910 1915 +f 1880 1917 1912 +f 1912 1878 1880 +f 1917 1918 1913 +f 1913 1912 1917 +f 1918 1919 1914 +f 1914 1913 1918 +f 1919 1920 1915 +f 1915 1914 1919 +f 1920 1921 1916 +f 1916 1915 1920 +f 1882 1922 1917 +f 1917 1880 1882 +f 1922 1923 1918 +f 1918 1917 1922 +f 1923 1924 1919 +f 1919 1918 1923 +f 1924 1925 1920 +f 1920 1919 1924 +f 1925 1926 1921 +f 1921 1920 1925 +f 1884 1927 1922 +f 1922 1882 1884 +f 1927 1928 1923 +f 1923 1922 1927 +f 1928 1929 1924 +f 1924 1923 1928 +f 1929 1930 1925 +f 1925 1924 1929 +f 1930 1931 1926 +f 1926 1925 1930 +f 1886 1932 1927 +f 1927 1884 1886 +f 1932 1933 1928 +f 1928 1927 1932 +f 1933 1934 1929 +f 1929 1928 1933 +f 1934 1935 1930 +f 1930 1929 1934 +f 1935 1936 1931 +f 1931 1930 1935 +f 1888 1937 1932 +f 1932 1886 1888 +f 1937 1938 1933 +f 1933 1932 1937 +f 1938 1939 1934 +f 1934 1933 1938 +f 1939 1940 1935 +f 1935 1934 1939 +f 1940 1941 1936 +f 1936 1935 1940 +f 1890 1942 1937 +f 1937 1888 1890 +f 1942 1943 1938 +f 1938 1937 1942 +f 1943 1944 1939 +f 1939 1938 1943 +f 1944 1945 1940 +f 1940 1939 1944 +f 1945 1946 1941 +f 1941 1940 1945 +f 1892 1947 1942 +f 1942 1890 1892 +f 1947 1948 1943 +f 1943 1942 1947 +f 1948 1949 1944 +f 1944 1943 1948 +f 1949 1950 1945 +f 1945 1944 1949 +f 1950 1951 1946 +f 1946 1945 1950 +f 1894 1952 1947 +f 1947 1892 1894 +f 1952 1953 1948 +f 1948 1947 1952 +f 1953 1954 1949 +f 1949 1948 1953 +f 1954 1955 1950 +f 1950 1949 1954 +f 1955 1956 1951 +f 1951 1950 1955 +f 1896 1957 1952 +f 1952 1894 1896 +f 1957 1958 1953 +f 1953 1952 1957 +f 1958 1959 1954 +f 1954 1953 1958 +f 1959 1960 1955 +f 1955 1954 1959 +f 1960 1961 1956 +f 1956 1955 1960 +f 1874 1873 1962 +f 1962 1963 1874 +f 1963 1962 1964 +f 1964 1965 1963 +f 1965 1964 1966 +f 1966 1967 1965 +f 1967 1966 1968 +f 1968 1969 1967 +f 1969 1968 1970 +f 1970 1971 1969 +f 1971 1970 1972 +f 1972 1973 1971 +f 1973 1972 1974 +f 1974 1975 1973 +f 1975 1974 1976 +f 1976 1977 1975 +f 1977 1976 1978 +f 1978 1979 1977 +f 1979 1978 1980 +f 1980 1981 1979 +f 1981 1980 1982 +f 1982 1983 1981 +f 1983 1982 1896 +f 1896 1895 1983 +f 1873 1898 1984 +f 1984 1962 1873 +f 1898 1900 1985 +f 1985 1984 1898 +f 1900 1902 1986 +f 1986 1985 1900 +f 1902 1904 1987 +f 1987 1986 1902 +f 1904 1906 1988 +f 1988 1987 1904 +f 1962 1984 1989 +f 1989 1964 1962 +f 1984 1985 1990 +f 1990 1989 1984 +f 1985 1986 1991 +f 1991 1990 1985 +f 1986 1987 1992 +f 1992 1991 1986 +f 1987 1988 1993 +f 1993 1992 1987 +f 1964 1989 1994 +f 1994 1966 1964 +f 1989 1990 1995 +f 1995 1994 1989 +f 1990 1991 1996 +f 1996 1995 1990 +f 1991 1992 1997 +f 1997 1996 1991 +f 1992 1993 1998 +f 1998 1997 1992 +f 1966 1994 1999 +f 1999 1968 1966 +f 1994 1995 2000 +f 2000 1999 1994 +f 1995 1996 2001 +f 2001 2000 1995 +f 1996 1997 2002 +f 2002 2001 1996 +f 1997 1998 2003 +f 2003 2002 1997 +f 1968 1999 2004 +f 2004 1970 1968 +f 1999 2000 2005 +f 2005 2004 1999 +f 2000 2001 2006 +f 2006 2005 2000 +f 2001 2002 2007 +f 2007 2006 2001 +f 2002 2003 2008 +f 2008 2007 2002 +f 1970 2004 2009 +f 2009 1972 1970 +f 2004 2005 2010 +f 2010 2009 2004 +f 2005 2006 2011 +f 2011 2010 2005 +f 2006 2007 2012 +f 2012 2011 2006 +f 2007 2008 2013 +f 2013 2012 2007 +f 1972 2009 2014 +f 2014 1974 1972 +f 2009 2010 2015 +f 2015 2014 2009 +f 2010 2011 2016 +f 2016 2015 2010 +f 2011 2012 2017 +f 2017 2016 2011 +f 2012 2013 2018 +f 2018 2017 2012 +f 1974 2014 2019 +f 2019 1976 1974 +f 2014 2015 2020 +f 2020 2019 2014 +f 2015 2016 2021 +f 2021 2020 2015 +f 2016 2017 2022 +f 2022 2021 2016 +f 2017 2018 2023 +f 2023 2022 2017 +f 1976 2019 2024 +f 2024 1978 1976 +f 2019 2020 2025 +f 2025 2024 2019 +f 2020 2021 2026 +f 2026 2025 2020 +f 2021 2022 2027 +f 2027 2026 2021 +f 2022 2023 2028 +f 2028 2027 2022 +f 1978 2024 2029 +f 2029 1980 1978 +f 2024 2025 2030 +f 2030 2029 2024 +f 2025 2026 2031 +f 2031 2030 2025 +f 2026 2027 2032 +f 2032 2031 2026 +f 2027 2028 2033 +f 2033 2032 2027 +f 1980 2029 2034 +f 2034 1982 1980 +f 2029 2030 2035 +f 2035 2034 2029 +f 2030 2031 2036 +f 2036 2035 2030 +f 2031 2032 2037 +f 2037 2036 2031 +f 2032 2033 2038 +f 2038 2037 2032 +f 1982 2034 1957 +f 1957 1896 1982 +f 2034 2035 1958 +f 1958 1957 2034 +f 2035 2036 1959 +f 1959 1958 2035 +f 2036 2037 1960 +f 1960 1959 2036 +f 2037 2038 1961 +f 1961 1960 2037 +f 168 1362 1325 +f 1325 160 168 +f 584 1032 177 +f 177 176 584 +f 183 1033 1361 +f 1361 184 183 +f 1362 1364 1356 +f 1356 1325 1362 +f 1364 1366 1357 +f 1357 1356 1364 +f 1366 1368 1358 +f 1358 1357 1366 +f 1368 1370 1359 +f 1359 1358 1368 +f 1370 1372 1360 +f 1360 1359 1370 +f 1503 1032 584 +f 584 605 1503 +f 605 606 1501 +f 1501 1503 605 +f 606 607 1499 +f 1499 1501 606 +f 607 608 1496 +f 1496 1499 607 +f 608 609 1497 +f 1497 1496 608 +f 1033 1502 1363 +f 1363 1361 1033 +f 1502 1500 1365 +f 1365 1363 1502 +f 1500 1498 1367 +f 1367 1365 1500 +f 1498 1495 1369 +f 1369 1367 1498 +f 1495 1494 1371 +f 1371 1369 1495 +f 200 2039 2040 +f 2040 201 200 +f 2041 876 2040 +f 2040 2039 2041 +f 202 2042 2039 +f 2039 200 202 +f 2043 2041 2039 +f 2039 2042 2043 +f 2042 202 203 +f 203 2044 2042 +f 2045 2043 2042 +f 2042 2044 2045 +f 67 1527 2044 +f 2044 203 67 +f 1528 2045 2044 +f 2044 1527 1528 +f 1529 1532 2046 +f 2046 2047 1529 +f 2048 2046 1532 +f 1532 1534 2048 +f 1534 397 744 +f 744 2048 1534 +f 2047 2046 2049 +f 2049 2050 2047 +f 2046 2048 2051 +f 2051 2049 2046 +f 2048 744 747 +f 747 2051 2048 +f 2050 2049 2052 +f 2052 2053 2050 +f 2049 2051 2054 +f 2054 2052 2049 +f 2051 747 750 +f 750 2054 2051 +f 2053 2052 2055 +f 2055 2056 2053 +f 2052 2054 2057 +f 2057 2055 2052 +f 2054 750 759 +f 759 2057 2054 +f 2056 2055 1379 +f 1379 737 2056 +f 2055 2057 1380 +f 1380 1379 2055 +f 2057 759 764 +f 764 1380 2057 +f 2058 1547 540 +f 540 871 2058 +f 2059 1549 1547 +f 1547 2058 2059 +f 1244 2058 871 +f 871 869 1244 +f 1247 2059 2058 +f 2058 1244 1247 +f 869 866 1245 +f 1245 1244 869 +f 1249 1245 866 +f 866 865 1249 +f 1549 2059 2060 +f 2060 1550 1549 +f 1550 2060 2061 +f 2061 1552 1550 +f 2059 1247 1382 +f 1382 2060 2059 +f 2060 1382 1384 +f 1384 2061 2060 +f 2061 2062 1556 +f 1556 1552 2061 +f 2062 2063 1558 +f 1558 1556 2062 +f 2063 2064 1560 +f 1560 1558 2063 +f 2064 2065 1562 +f 1562 1560 2064 +f 1384 1401 2062 +f 2062 2061 1384 +f 1401 1403 2063 +f 2063 2062 1401 +f 1403 1405 2064 +f 2064 2063 1403 +f 1405 1407 2065 +f 2065 2064 1405 +f 1571 1570 2066 +f 2066 2067 1571 +f 1570 1573 2068 +f 2068 2066 1570 +f 1573 1575 2069 +f 2069 2068 1573 +f 1575 447 788 +f 788 2069 1575 +f 2067 2066 2070 +f 2070 2071 2067 +f 2066 2068 2072 +f 2072 2070 2066 +f 2068 2069 2073 +f 2073 2072 2068 +f 2069 788 791 +f 791 2073 2069 +f 2071 2070 2074 +f 2074 2075 2071 +f 2070 2072 2076 +f 2076 2074 2070 +f 2072 2073 2077 +f 2077 2076 2072 +f 2073 791 794 +f 794 2077 2073 +f 2075 2074 2078 +f 2078 2079 2075 +f 2074 2076 2080 +f 2080 2078 2074 +f 2076 2077 2081 +f 2081 2080 2076 +f 2077 794 797 +f 797 2081 2077 +f 2079 2078 2082 +f 2082 2083 2079 +f 2078 2080 2084 +f 2084 2082 2078 +f 2080 2081 2085 +f 2085 2084 2080 +f 2081 797 800 +f 800 2085 2081 +f 2086 2087 2088 +f 2088 2089 2086 +f 2087 2090 2091 +f 2091 2088 2087 +f 2090 2092 2093 +f 2093 2091 2090 +f 2092 806 805 +f 805 2093 2092 +f 2083 2082 2087 +f 2087 2086 2083 +f 2082 2084 2090 +f 2090 2087 2082 +f 2084 2085 2092 +f 2092 2090 2084 +f 2085 800 806 +f 806 2092 2085 +f 2089 2088 2094 +f 2094 2095 2089 +f 2088 2091 2096 +f 2096 2094 2088 +f 2091 2093 2097 +f 2097 2096 2091 +f 2093 805 809 +f 809 2097 2093 +f 2095 2094 2098 +f 2098 2099 2095 +f 2094 2096 2100 +f 2100 2098 2094 +f 2096 2097 2101 +f 2101 2100 2096 +f 2097 809 812 +f 812 2101 2097 +f 2065 2102 1608 +f 1608 1562 2065 +f 2102 2103 1610 +f 1610 1608 2102 +f 2103 2104 1612 +f 1612 1610 2103 +f 2104 2105 1614 +f 1614 1612 2104 +f 2105 815 477 +f 477 1614 2105 +f 1407 1413 2102 +f 2102 2065 1407 +f 1413 1415 2103 +f 2103 2102 1413 +f 1415 1417 2104 +f 2104 2103 1415 +f 1417 1419 2105 +f 2105 2104 1417 +f 1419 818 815 +f 815 2105 1419 +f 801 2106 2107 +f 2107 802 801 +f 2106 2108 2109 +f 2109 2107 2106 +f 2108 2110 2111 +f 2111 2109 2108 +f 2110 2112 2113 +f 2113 2111 2110 +f 2112 829 828 +f 828 2113 2112 +f 798 1512 2106 +f 2106 801 798 +f 1512 1513 2108 +f 2108 2106 1512 +f 1513 1514 2110 +f 2110 2108 1513 +f 1514 1515 2112 +f 2112 2110 1514 +f 1515 357 829 +f 829 2112 1515 +f 802 2107 2114 +f 2114 807 802 +f 2107 2109 2115 +f 2115 2114 2107 +f 2109 2111 2116 +f 2116 2115 2109 +f 2111 2113 2117 +f 2117 2116 2111 +f 2113 828 831 +f 831 2117 2113 +f 807 2114 2118 +f 2118 810 807 +f 2114 2115 2119 +f 2119 2118 2114 +f 2115 2116 2120 +f 2120 2119 2115 +f 2116 2117 2121 +f 2121 2120 2116 +f 2117 831 833 +f 833 2121 2117 +f 443 1637 2122 +f 2122 786 443 +f 1637 1639 2123 +f 2123 2122 1637 +f 1639 1641 2124 +f 2124 2123 1639 +f 1641 1643 2125 +f 2125 2124 1641 +f 1643 499 835 +f 835 2125 1643 +f 786 2122 2126 +f 2126 789 786 +f 2122 2123 2127 +f 2127 2126 2122 +f 2123 2124 2128 +f 2128 2127 2123 +f 2124 2125 2129 +f 2129 2128 2124 +f 2125 835 837 +f 837 2129 2125 +f 789 2126 1504 +f 1504 792 789 +f 2126 2127 1506 +f 1506 1504 2126 +f 2127 2128 1508 +f 1508 1506 2127 +f 2128 2129 1510 +f 1510 1508 2128 +f 2129 837 353 +f 353 1510 2129 +f 2130 1649 1529 +f 1529 2047 2130 +f 2130 2047 2050 +f 2050 2131 2130 +f 2131 2050 2053 +f 2053 2132 2131 +f 2132 2053 2056 +f 2056 2133 2132 +f 2134 2133 2056 +f 2056 737 2134 +f 2135 735 734 +f 734 2136 2135 +f 2134 737 735 +f 735 2135 2134 +f 2136 734 739 +f 739 2137 2136 +f 2138 2137 739 +f 739 741 2138 +f 1658 1649 2130 +f 2130 2139 1658 +f 2139 2140 1660 +f 1660 1658 2139 +f 1662 1660 2140 +f 2140 2141 1662 +f 1664 1662 2141 +f 2141 2142 1664 +f 2142 840 508 +f 508 1664 2142 +f 2139 2130 2131 +f 2131 2143 2139 +f 2140 2139 2143 +f 2143 2144 2140 +f 2141 2140 2144 +f 2144 2145 2141 +f 2142 2141 2145 +f 2145 2146 2142 +f 840 2142 2146 +f 2146 843 840 +f 2143 2131 2132 +f 2132 2147 2143 +f 2144 2143 2147 +f 2147 2148 2144 +f 2145 2144 2148 +f 2148 2149 2145 +f 2146 2145 2149 +f 2149 2150 2146 +f 843 2146 2150 +f 2150 846 843 +f 2133 2151 2147 +f 2147 2132 2133 +f 2151 2152 2148 +f 2148 2147 2151 +f 2152 2153 2149 +f 2149 2148 2152 +f 2153 2154 2150 +f 2150 2149 2153 +f 2154 849 846 +f 846 2150 2154 +f 2134 2155 2151 +f 2151 2133 2134 +f 2155 2156 2152 +f 2152 2151 2155 +f 2156 2157 2153 +f 2153 2152 2156 +f 2157 2158 2154 +f 2154 2153 2157 +f 2158 852 849 +f 849 2154 2158 +f 2159 2135 2136 +f 2136 2160 2159 +f 2161 2159 2160 +f 2160 2162 2161 +f 2163 2161 2162 +f 2162 2164 2163 +f 2165 2163 2164 +f 2164 2166 2165 +f 857 2165 2166 +f 2166 858 857 +f 2155 2134 2135 +f 2135 2159 2155 +f 2156 2155 2159 +f 2159 2161 2156 +f 2157 2156 2161 +f 2161 2163 2157 +f 2158 2157 2163 +f 2163 2165 2158 +f 852 2158 2165 +f 2165 857 852 +f 2160 2136 2137 +f 2137 2167 2160 +f 2162 2160 2167 +f 2167 2168 2162 +f 2164 2162 2168 +f 2168 2169 2164 +f 2166 2164 2169 +f 2169 2170 2166 +f 858 2166 2170 +f 2170 861 858 +f 2137 2138 2171 +f 2171 2167 2137 +f 2168 2167 2171 +f 2171 2172 2168 +f 2173 2169 2168 +f 2168 2172 2173 +f 2169 2173 2174 +f 2174 2170 2169 +f 861 2170 2174 +f 2174 864 861 +f 214 201 2040 +f 2040 2175 214 +f 875 2175 2040 +f 2040 876 875 +f 215 214 2175 +f 2175 2176 215 +f 877 2176 2175 +f 2175 875 877 +f 2176 2177 216 +f 216 215 2176 +f 878 2177 2176 +f 2176 877 878 +f 83 216 2177 +f 2177 1701 83 +f 549 1701 2177 +f 2177 878 549 +f 229 1425 1442 +f 1442 230 229 +f 2178 241 240 +f 240 760 2178 +f 241 2178 2179 +f 2179 245 241 +f 245 2179 1424 +f 1424 248 245 +f 1425 1427 1473 +f 1473 1442 1425 +f 1427 1429 1474 +f 1474 1473 1427 +f 1429 1431 1475 +f 1475 1474 1429 +f 1431 1433 1476 +f 1476 1475 1431 +f 1433 1435 1477 +f 1477 1476 1433 +f 2180 2178 760 +f 760 781 2180 +f 781 782 2181 +f 2181 2180 781 +f 782 783 2182 +f 2182 2181 782 +f 783 784 2183 +f 2183 2182 783 +f 784 785 2184 +f 2184 2183 784 +f 2178 2180 2185 +f 2185 2179 2178 +f 2180 2181 2186 +f 2186 2185 2180 +f 2181 2182 2187 +f 2187 2186 2181 +f 2182 2183 2188 +f 2188 2187 2182 +f 2183 2184 2189 +f 2189 2188 2183 +f 2179 2185 1426 +f 1426 1424 2179 +f 2185 2186 1428 +f 1428 1426 2185 +f 2186 2187 1430 +f 1430 1428 2186 +f 2187 2188 1432 +f 1432 1430 2187 +f 2188 2189 1434 +f 1434 1432 2188 +f 1732 2190 2191 +f 2191 1733 1732 +f 1733 2191 897 +f 897 571 1733 +f 2190 2192 2193 +f 2193 2191 2190 +f 2191 2193 899 +f 899 897 2191 +f 2192 2194 2195 +f 2195 2193 2192 +f 2193 2195 901 +f 901 899 2193 +f 2194 2196 2197 +f 2197 2195 2194 +f 2195 2197 909 +f 909 901 2195 +f 2196 892 2198 +f 2198 2197 2196 +f 2198 914 909 +f 909 2197 2198 +f 2199 1007 696 +f 696 1743 2199 +f 2200 2199 1743 +f 1743 1745 2200 +f 1516 1005 1007 +f 1007 2199 1516 +f 1517 1516 2199 +f 2199 2200 1517 +f 1005 1516 1519 +f 1519 1002 1005 +f 1249 865 1002 +f 1002 1519 1249 +f 1745 1747 2201 +f 2201 2200 1745 +f 1747 1749 2202 +f 2202 2201 1747 +f 2200 2201 2203 +f 2203 1517 2200 +f 2201 2202 2204 +f 2204 2203 2201 +f 1749 1751 2205 +f 2205 2202 1749 +f 1751 1753 2206 +f 2206 2205 1751 +f 1753 1755 2207 +f 2207 2206 1753 +f 1755 1757 2208 +f 2208 2207 1755 +f 2202 2205 2209 +f 2209 2204 2202 +f 2205 2206 2210 +f 2210 2209 2205 +f 2206 2207 2211 +f 2211 2210 2206 +f 2207 2208 2212 +f 2212 2211 2207 +f 2213 2214 1759 +f 1759 1758 2213 +f 2214 2215 1762 +f 1762 1759 2214 +f 2215 2216 1764 +f 1764 1762 2215 +f 2216 935 615 +f 615 1764 2216 +f 2217 2218 2214 +f 2214 2213 2217 +f 2218 2219 2215 +f 2215 2214 2218 +f 2219 2220 2216 +f 2216 2215 2219 +f 2220 938 935 +f 935 2216 2220 +f 2221 2222 2218 +f 2218 2217 2221 +f 2222 2223 2219 +f 2219 2218 2222 +f 2223 2224 2220 +f 2220 2219 2223 +f 2224 941 938 +f 938 2220 2224 +f 2225 2226 2222 +f 2222 2221 2225 +f 2226 2227 2223 +f 2223 2222 2226 +f 2227 2228 2224 +f 2224 2223 2227 +f 2228 944 941 +f 941 2224 2228 +f 2229 2230 2226 +f 2226 2225 2229 +f 2230 2231 2227 +f 2227 2226 2230 +f 2231 2232 2228 +f 2228 2227 2231 +f 2232 947 944 +f 944 2228 2232 +f 2233 2234 2235 +f 2235 2236 2233 +f 2234 2237 2238 +f 2238 2235 2234 +f 2237 2239 2240 +f 2240 2238 2237 +f 2239 953 952 +f 952 2240 2239 +f 2236 2235 2230 +f 2230 2229 2236 +f 2235 2238 2231 +f 2231 2230 2235 +f 2238 2240 2232 +f 2232 2231 2238 +f 2240 952 947 +f 947 2232 2240 +f 2241 2242 2234 +f 2234 2233 2241 +f 2242 2243 2237 +f 2237 2234 2242 +f 2243 2244 2239 +f 2239 2237 2243 +f 2244 956 953 +f 953 2239 2244 +f 2099 2098 2242 +f 2242 2241 2099 +f 2098 2100 2243 +f 2243 2242 2098 +f 2100 2101 2244 +f 2244 2243 2100 +f 2101 812 956 +f 956 2244 2101 +f 1757 1795 2245 +f 2245 2208 1757 +f 1795 1797 2246 +f 2246 2245 1795 +f 1797 1799 2247 +f 2247 2246 1797 +f 1799 1801 2248 +f 2248 2247 1799 +f 1801 641 959 +f 959 2248 1801 +f 2208 2245 2249 +f 2249 2212 2208 +f 2245 2246 2250 +f 2250 2249 2245 +f 2246 2247 2251 +f 2251 2250 2246 +f 2247 2248 2252 +f 2252 2251 2247 +f 2248 959 962 +f 962 2252 2248 +f 951 2253 2254 +f 2254 948 951 +f 2253 2255 2256 +f 2256 2254 2253 +f 2255 2257 2258 +f 2258 2256 2255 +f 2257 2259 2260 +f 2260 2258 2257 +f 2259 971 970 +f 970 2260 2259 +f 948 2254 1258 +f 1258 946 948 +f 2254 2256 1259 +f 1259 1258 2254 +f 2256 2258 1260 +f 1260 1259 2256 +f 2258 2260 1261 +f 1261 1260 2258 +f 2260 970 362 +f 362 1261 2260 +f 954 2261 2253 +f 2253 951 954 +f 2261 2262 2255 +f 2255 2253 2261 +f 2262 2263 2257 +f 2257 2255 2262 +f 2263 2264 2259 +f 2259 2257 2263 +f 2264 973 971 +f 971 2259 2264 +f 810 2118 2261 +f 2261 954 810 +f 2118 2119 2262 +f 2262 2261 2118 +f 2119 2120 2263 +f 2263 2262 2119 +f 2120 2121 2264 +f 2264 2263 2120 +f 2121 833 973 +f 973 2264 2121 +f 934 2265 1814 +f 1814 610 934 +f 2265 2266 1816 +f 1816 1814 2265 +f 2266 2267 1818 +f 1818 1816 2266 +f 2267 2268 1820 +f 1820 1818 2267 +f 2268 975 660 +f 660 1820 2268 +f 937 2269 2265 +f 2265 934 937 +f 2269 2270 2266 +f 2266 2265 2269 +f 2270 2271 2267 +f 2267 2266 2270 +f 2271 2272 2268 +f 2268 2267 2271 +f 2272 977 975 +f 975 2268 2272 +f 940 1251 2269 +f 2269 937 940 +f 1251 1253 2270 +f 2270 2269 1251 +f 1253 1255 2271 +f 2271 2270 1253 +f 1255 1257 2272 +f 2272 2271 1255 +f 1257 359 977 +f 977 2272 1257 +f 2273 2190 1732 +f 1732 1827 2273 +f 2274 2192 2190 +f 2190 2273 2274 +f 2275 2194 2192 +f 2192 2274 2275 +f 2275 2276 2196 +f 2196 2194 2275 +f 2277 892 2196 +f 2196 2276 2277 +f 2278 2279 890 +f 890 889 2278 +f 2277 2278 889 +f 889 892 2277 +f 2279 2280 894 +f 894 890 2279 +f 2138 741 894 +f 894 2280 2138 +f 1835 2281 2273 +f 2273 1827 1835 +f 2281 1835 1838 +f 1838 2282 2281 +f 1839 2283 2282 +f 2282 1838 1839 +f 1841 2284 2283 +f 2283 1839 1841 +f 2284 1841 667 +f 667 980 2284 +f 2281 2285 2274 +f 2274 2273 2281 +f 2282 2286 2285 +f 2285 2281 2282 +f 2283 2287 2286 +f 2286 2282 2283 +f 2284 2288 2287 +f 2287 2283 2284 +f 980 983 2288 +f 2288 2284 980 +f 2285 2289 2275 +f 2275 2274 2285 +f 2286 2290 2289 +f 2289 2285 2286 +f 2287 2291 2290 +f 2290 2286 2287 +f 2288 2292 2291 +f 2291 2287 2288 +f 983 986 2292 +f 2292 2288 983 +f 2276 2275 2289 +f 2289 2293 2276 +f 2293 2289 2290 +f 2290 2294 2293 +f 2294 2290 2291 +f 2291 2295 2294 +f 2295 2291 2292 +f 2292 2296 2295 +f 2296 2292 986 +f 986 989 2296 +f 2277 2276 2293 +f 2293 2297 2277 +f 2297 2293 2294 +f 2294 2298 2297 +f 2298 2294 2295 +f 2295 2299 2298 +f 2299 2295 2296 +f 2296 2300 2299 +f 2300 2296 989 +f 989 992 2300 +f 2301 2302 2279 +f 2279 2278 2301 +f 2303 2304 2302 +f 2302 2301 2303 +f 2305 2306 2304 +f 2304 2303 2305 +f 2307 2308 2306 +f 2306 2305 2307 +f 998 997 2308 +f 2308 2307 998 +f 2297 2301 2278 +f 2278 2277 2297 +f 2298 2303 2301 +f 2301 2297 2298 +f 2299 2305 2303 +f 2303 2298 2299 +f 2300 2307 2305 +f 2305 2299 2300 +f 992 998 2307 +f 2307 2300 992 +f 2302 2309 2280 +f 2280 2279 2302 +f 2304 2310 2309 +f 2309 2302 2304 +f 2306 2311 2310 +f 2310 2304 2306 +f 2308 2312 2311 +f 2311 2306 2308 +f 997 1001 2312 +f 2312 2308 997 +f 2280 2309 2171 +f 2171 2138 2280 +f 2310 2172 2171 +f 2171 2309 2310 +f 2173 2172 2310 +f 2310 2311 2173 +f 2311 2312 2174 +f 2174 2173 2311 +f 1001 864 2174 +f 2174 2312 1001 +f 2313 2314 2315 +f 2315 2316 2313 +f 2316 2315 2317 +f 2317 2318 2316 +f 2318 2317 2319 +f 2319 2320 2318 +f 2320 2319 2321 +f 2321 2322 2320 +f 2322 2321 2323 +f 2323 2324 2322 +f 2324 2323 2325 +f 2325 2326 2324 +f 2326 2325 2327 +f 2327 2328 2326 +f 2328 2327 2329 +f 2329 2330 2328 +f 2330 2329 2331 +f 2331 2332 2330 +f 2332 2331 2333 +f 2333 2334 2332 +f 2334 2333 2335 +f 2335 2336 2334 +f 2336 2335 2337 +f 2337 2338 2336 +f 2314 2339 2340 +f 2340 2315 2314 +f 2339 2341 2342 +f 2342 2340 2339 +f 2341 2343 2344 +f 2344 2342 2341 +f 2343 2345 2346 +f 2346 2344 2343 +f 2345 2347 2348 +f 2348 2346 2345 +f 2315 2340 2349 +f 2349 2317 2315 +f 2340 2342 2350 +f 2350 2349 2340 +f 2342 2344 2351 +f 2351 2350 2342 +f 2344 2346 2352 +f 2352 2351 2344 +f 2346 2348 2353 +f 2353 2352 2346 +f 2317 2349 2354 +f 2354 2319 2317 +f 2349 2350 2355 +f 2355 2354 2349 +f 2350 2351 2356 +f 2356 2355 2350 +f 2351 2352 2357 +f 2357 2356 2351 +f 2352 2353 2358 +f 2358 2357 2352 +f 2319 2354 2359 +f 2359 2321 2319 +f 2354 2355 2360 +f 2360 2359 2354 +f 2355 2356 2361 +f 2361 2360 2355 +f 2356 2357 2362 +f 2362 2361 2356 +f 2357 2358 2363 +f 2363 2362 2357 +f 2321 2359 2364 +f 2364 2323 2321 +f 2359 2360 2365 +f 2365 2364 2359 +f 2360 2361 2366 +f 2366 2365 2360 +f 2361 2362 2367 +f 2367 2366 2361 +f 2362 2363 2368 +f 2368 2367 2362 +f 2323 2364 2369 +f 2369 2325 2323 +f 2364 2365 2370 +f 2370 2369 2364 +f 2365 2366 2371 +f 2371 2370 2365 +f 2366 2367 2372 +f 2372 2371 2366 +f 2367 2368 2373 +f 2373 2372 2367 +f 2325 2369 2374 +f 2374 2327 2325 +f 2369 2370 2375 +f 2375 2374 2369 +f 2370 2371 2376 +f 2376 2375 2370 +f 2371 2372 2377 +f 2377 2376 2371 +f 2372 2373 2378 +f 2378 2377 2372 +f 2327 2374 2379 +f 2379 2329 2327 +f 2374 2375 2380 +f 2380 2379 2374 +f 2375 2376 2381 +f 2381 2380 2375 +f 2376 2377 2382 +f 2382 2381 2376 +f 2377 2378 2383 +f 2383 2382 2377 +f 2329 2379 2384 +f 2384 2331 2329 +f 2379 2380 2385 +f 2385 2384 2379 +f 2380 2381 2386 +f 2386 2385 2380 +f 2381 2382 2387 +f 2387 2386 2381 +f 2382 2383 2388 +f 2388 2387 2382 +f 2331 2384 2389 +f 2389 2333 2331 +f 2384 2385 2390 +f 2390 2389 2384 +f 2385 2386 2391 +f 2391 2390 2385 +f 2386 2387 2392 +f 2392 2391 2386 +f 2387 2388 2393 +f 2393 2392 2387 +f 2333 2389 2394 +f 2394 2335 2333 +f 2389 2390 2395 +f 2395 2394 2389 +f 2390 2391 2396 +f 2396 2395 2390 +f 2391 2392 2397 +f 2397 2396 2391 +f 2392 2393 2398 +f 2398 2397 2392 +f 2335 2394 2399 +f 2399 2337 2335 +f 2394 2395 2400 +f 2400 2399 2394 +f 2395 2396 2401 +f 2401 2400 2395 +f 2396 2397 2402 +f 2402 2401 2396 +f 2397 2398 2403 +f 2403 2402 2397 +f 2404 2405 2314 +f 2314 2313 2404 +f 2406 2407 2405 +f 2405 2404 2406 +f 2408 2409 2407 +f 2407 2406 2408 +f 2410 2411 2409 +f 2409 2408 2410 +f 2412 2413 2411 +f 2411 2410 2412 +f 2414 2415 2413 +f 2413 2412 2414 +f 2416 2417 2415 +f 2415 2414 2416 +f 2418 2419 2417 +f 2417 2416 2418 +f 2420 2421 2419 +f 2419 2418 2420 +f 2422 2423 2421 +f 2421 2420 2422 +f 2424 2425 2423 +f 2423 2422 2424 +f 2338 2337 2425 +f 2425 2424 2338 +f 2405 2426 2339 +f 2339 2314 2405 +f 2426 2427 2341 +f 2341 2339 2426 +f 2427 2428 2343 +f 2343 2341 2427 +f 2428 2429 2345 +f 2345 2343 2428 +f 2429 2430 2347 +f 2347 2345 2429 +f 2407 2431 2426 +f 2426 2405 2407 +f 2431 2432 2427 +f 2427 2426 2431 +f 2432 2433 2428 +f 2428 2427 2432 +f 2433 2434 2429 +f 2429 2428 2433 +f 2434 2435 2430 +f 2430 2429 2434 +f 2409 2436 2431 +f 2431 2407 2409 +f 2436 2437 2432 +f 2432 2431 2436 +f 2437 2438 2433 +f 2433 2432 2437 +f 2438 2439 2434 +f 2434 2433 2438 +f 2439 2440 2435 +f 2435 2434 2439 +f 2411 2441 2436 +f 2436 2409 2411 +f 2441 2442 2437 +f 2437 2436 2441 +f 2442 2443 2438 +f 2438 2437 2442 +f 2443 2444 2439 +f 2439 2438 2443 +f 2444 2445 2440 +f 2440 2439 2444 +f 2413 2446 2441 +f 2441 2411 2413 +f 2446 2447 2442 +f 2442 2441 2446 +f 2447 2448 2443 +f 2443 2442 2447 +f 2448 2449 2444 +f 2444 2443 2448 +f 2449 2450 2445 +f 2445 2444 2449 +f 2415 2451 2446 +f 2446 2413 2415 +f 2451 2452 2447 +f 2447 2446 2451 +f 2452 2453 2448 +f 2448 2447 2452 +f 2453 2454 2449 +f 2449 2448 2453 +f 2454 2455 2450 +f 2450 2449 2454 +f 2417 2456 2451 +f 2451 2415 2417 +f 2456 2457 2452 +f 2452 2451 2456 +f 2457 2458 2453 +f 2453 2452 2457 +f 2458 2459 2454 +f 2454 2453 2458 +f 2459 2460 2455 +f 2455 2454 2459 +f 2419 2461 2456 +f 2456 2417 2419 +f 2461 2462 2457 +f 2457 2456 2461 +f 2462 2463 2458 +f 2458 2457 2462 +f 2463 2464 2459 +f 2459 2458 2463 +f 2464 2465 2460 +f 2460 2459 2464 +f 2421 2466 2461 +f 2461 2419 2421 +f 2466 2467 2462 +f 2462 2461 2466 +f 2467 2468 2463 +f 2463 2462 2467 +f 2468 2469 2464 +f 2464 2463 2468 +f 2469 2470 2465 +f 2465 2464 2469 +f 2423 2471 2466 +f 2466 2421 2423 +f 2471 2472 2467 +f 2467 2466 2471 +f 2472 2473 2468 +f 2468 2467 2472 +f 2473 2474 2469 +f 2469 2468 2473 +f 2474 2475 2470 +f 2470 2469 2474 +f 2425 2476 2471 +f 2471 2423 2425 +f 2476 2477 2472 +f 2472 2471 2476 +f 2477 2478 2473 +f 2473 2472 2477 +f 2478 2479 2474 +f 2474 2473 2478 +f 2479 2480 2475 +f 2475 2474 2479 +f 2337 2399 2476 +f 2476 2425 2337 +f 2399 2400 2477 +f 2477 2476 2399 +f 2400 2401 2478 +f 2478 2477 2400 +f 2401 2402 2479 +f 2479 2478 2401 +f 2402 2403 2480 +f 2480 2479 2402 +f 293 2481 2482 +f 2482 301 293 +f 910 310 309 +f 309 1043 910 +f 317 2483 1042 +f 1042 316 317 +f 2481 2484 2485 +f 2485 2482 2481 +f 2484 2486 2487 +f 2487 2485 2484 +f 2486 2488 2489 +f 2489 2487 2486 +f 2488 2490 2491 +f 2491 2489 2488 +f 2490 2492 2493 +f 2493 2491 2490 +f 1270 928 910 +f 910 1043 1270 +f 928 1270 1268 +f 1268 929 928 +f 929 1268 1266 +f 1266 930 929 +f 930 1266 1264 +f 1264 931 930 +f 931 1264 1263 +f 1263 932 931 +f 2483 2494 1271 +f 1271 1042 2483 +f 2494 2495 1269 +f 1269 1271 2494 +f 2495 2496 1267 +f 1267 1269 2495 +f 2496 2497 1265 +f 1265 1267 2496 +f 2497 2498 1262 +f 1262 1265 2497 +f 99 103 2499 +f 2499 373 99 +f 103 106 2500 +f 2500 2499 103 +f 106 108 415 +f 415 2500 106 +f 373 2499 2501 +f 2501 378 373 +f 2499 2500 2502 +f 2502 2501 2499 +f 2500 415 416 +f 416 2502 2500 +f 378 2501 2503 +f 2503 387 378 +f 2501 2502 2504 +f 2504 2503 2501 +f 2502 416 417 +f 417 2504 2502 +f 387 2503 1544 +f 1544 388 387 +f 2503 2504 1545 +f 1545 1544 2503 +f 2504 417 418 +f 418 1545 2504 +f 1479 1554 2505 +f 2505 1480 1479 +f 1554 1555 2506 +f 2506 2505 1554 +f 1480 2505 1293 +f 1293 1240 1480 +f 2505 2506 1294 +f 1294 1293 2505 +f 1223 1222 1274 +f 1274 2507 1223 +f 1275 2508 2507 +f 2507 1274 1275 +f 2507 2509 1028 +f 1028 1223 2507 +f 2508 2510 2509 +f 2509 2507 2508 +f 2509 1095 1029 +f 1029 1028 2509 +f 1095 2509 2510 +f 2510 1096 1095 +f 2508 1275 1280 +f 1280 2511 2508 +f 2511 1280 1282 +f 1282 2512 2511 +f 2512 1282 408 +f 408 431 2512 +f 2510 2508 2511 +f 2511 2513 2510 +f 2513 2511 2512 +f 2512 2514 2513 +f 2514 2512 431 +f 431 434 2514 +f 1096 2510 2513 +f 2513 1103 1096 +f 1103 2513 2514 +f 2514 1104 1103 +f 1104 2514 434 +f 434 428 1104 +f 1555 1564 2515 +f 2515 2506 1555 +f 1564 1565 2516 +f 2516 2515 1564 +f 1565 1566 2517 +f 2517 2516 1565 +f 1566 1567 2518 +f 2518 2517 1566 +f 2506 2515 1303 +f 1303 1294 2506 +f 2515 2516 1304 +f 1304 1303 2515 +f 2516 2517 1305 +f 1305 1304 2516 +f 2517 2518 1306 +f 1306 1305 2517 +f 1567 1616 2519 +f 2519 2518 1567 +f 1616 1617 2520 +f 2520 2519 1616 +f 1617 1618 2521 +f 2521 2520 1617 +f 1618 1619 2522 +f 2522 2521 1618 +f 1619 481 485 +f 485 2522 1619 +f 2518 2519 1315 +f 1315 1306 2518 +f 2519 2520 1316 +f 1316 1315 2519 +f 2520 2521 1317 +f 1317 1316 2520 +f 2521 2522 1318 +f 1318 1317 2521 +f 2522 485 487 +f 487 1318 2522 +f 97 1703 1706 +f 1706 115 97 +f 1703 1708 1727 +f 1727 1706 1703 +f 1708 1710 1728 +f 1728 1727 1708 +f 1710 1712 1729 +f 1729 1728 1710 +f 1712 1714 1730 +f 1730 1729 1712 +f 1714 1716 1731 +f 1731 1730 1714 +f 129 1320 2523 +f 2523 130 129 +f 130 2523 2524 +f 2524 133 130 +f 133 2524 2525 +f 2525 136 133 +f 136 2525 2526 +f 2526 139 136 +f 139 2526 2527 +f 2527 142 139 +f 142 2527 1702 +f 1702 96 142 +f 1320 1327 2528 +f 2528 2523 1320 +f 1327 1329 2529 +f 2529 2528 1327 +f 1329 1331 2530 +f 2530 2529 1329 +f 1331 1333 2531 +f 2531 2530 1331 +f 1333 1335 2532 +f 2532 2531 1333 +f 2523 2528 2533 +f 2533 2524 2523 +f 2528 2529 2534 +f 2534 2533 2528 +f 2529 2530 2535 +f 2535 2534 2529 +f 2530 2531 2536 +f 2536 2535 2530 +f 2531 2532 2537 +f 2537 2536 2531 +f 2524 2533 2538 +f 2538 2525 2524 +f 2533 2534 2539 +f 2539 2538 2533 +f 2534 2535 2540 +f 2540 2539 2534 +f 2535 2536 2541 +f 2541 2540 2535 +f 2536 2537 2542 +f 2542 2541 2536 +f 2525 2538 2543 +f 2543 2526 2525 +f 2538 2539 2544 +f 2544 2543 2538 +f 2539 2540 2545 +f 2545 2544 2539 +f 2540 2541 2546 +f 2546 2545 2540 +f 2541 2542 2547 +f 2547 2546 2541 +f 2526 2543 2548 +f 2548 2527 2526 +f 2543 2544 2549 +f 2549 2548 2543 +f 2544 2545 2550 +f 2550 2549 2544 +f 2545 2546 2551 +f 2551 2550 2545 +f 2546 2547 2552 +f 2552 2551 2546 +f 2527 2548 1707 +f 1707 1702 2527 +f 2548 2549 1709 +f 1709 1707 2548 +f 2549 2550 1711 +f 1711 1709 2549 +f 2550 2551 1713 +f 1713 1711 2550 +f 2551 2552 1715 +f 1715 1713 2551 +f 1243 1242 1389 +f 1389 2553 1243 +f 1390 2554 2553 +f 2553 1389 1390 +f 2553 2555 1034 +f 1034 1243 2553 +f 2554 2556 2555 +f 2555 2553 2554 +f 2555 1159 1035 +f 1035 1034 2555 +f 1159 2555 2556 +f 2556 1160 1159 +f 2554 1390 1395 +f 1395 2557 2554 +f 2557 1395 1397 +f 1397 2558 2557 +f 2558 1397 752 +f 752 751 2558 +f 2556 2554 2557 +f 2557 2559 2556 +f 2559 2557 2558 +f 2558 2560 2559 +f 2560 2558 751 +f 751 756 2560 +f 1160 2556 2559 +f 2559 1165 1160 +f 1165 2559 2560 +f 2560 1166 1165 +f 1166 2560 756 +f 756 748 1166 +f 303 307 2561 +f 2561 879 303 +f 307 310 911 +f 911 2561 307 +f 879 2561 2562 +f 2562 884 879 +f 2561 911 912 +f 912 2562 2561 +f 884 2562 2563 +f 2563 891 884 +f 2562 912 913 +f 913 2563 2562 +f 891 2563 2198 +f 2198 892 891 +f 2563 913 914 +f 914 2198 2563 +f 1517 2203 2564 +f 2564 1518 1517 +f 2203 2204 2565 +f 2565 2564 2203 +f 1518 2564 1385 +f 1385 1248 1518 +f 2564 2565 1386 +f 1386 1385 2564 +f 2204 2209 2566 +f 2566 2565 2204 +f 2209 2210 2567 +f 2567 2566 2209 +f 2210 2211 2568 +f 2568 2567 2210 +f 2211 2212 2569 +f 2569 2568 2211 +f 2565 2566 1408 +f 1408 1386 2565 +f 2566 2567 1409 +f 1409 1408 2566 +f 2567 2568 1410 +f 1410 1409 2567 +f 2568 2569 1411 +f 1411 1410 2568 +f 2212 2249 2570 +f 2570 2569 2212 +f 2249 2250 2571 +f 2571 2570 2249 +f 2250 2251 2572 +f 2572 2571 2250 +f 2251 2252 2573 +f 2573 2572 2251 +f 2252 962 966 +f 966 2573 2252 +f 2569 2570 1420 +f 1420 1411 2569 +f 2570 2571 1421 +f 1421 1420 2570 +f 2571 2572 1422 +f 1422 1421 2571 +f 2572 2573 1423 +f 1423 1422 2572 +f 2573 966 824 +f 824 1423 2573 +f 263 1437 2574 +f 2574 278 263 +f 278 2574 2575 +f 2575 281 278 +f 281 2575 2576 +f 2576 284 281 +f 284 2576 2577 +f 2577 287 284 +f 287 2577 2578 +f 2578 290 287 +f 290 2578 2481 +f 2481 293 290 +f 1437 1444 2579 +f 2579 2574 1437 +f 1444 1446 2580 +f 2580 2579 1444 +f 1446 1448 2581 +f 2581 2580 1446 +f 1448 1450 2582 +f 2582 2581 1448 +f 1450 1452 2583 +f 2583 2582 1450 +f 2574 2579 2584 +f 2584 2575 2574 +f 2579 2580 2585 +f 2585 2584 2579 +f 2580 2581 2586 +f 2586 2585 2580 +f 2581 2582 2587 +f 2587 2586 2581 +f 2582 2583 2588 +f 2588 2587 2582 +f 2575 2584 2589 +f 2589 2576 2575 +f 2584 2585 2590 +f 2590 2589 2584 +f 2585 2586 2591 +f 2591 2590 2585 +f 2586 2587 2592 +f 2592 2591 2586 +f 2587 2588 2593 +f 2593 2592 2587 +f 2576 2589 2594 +f 2594 2577 2576 +f 2589 2590 2595 +f 2595 2594 2589 +f 2590 2591 2596 +f 2596 2595 2590 +f 2591 2592 2597 +f 2597 2596 2591 +f 2592 2593 2598 +f 2598 2597 2592 +f 2577 2594 2599 +f 2599 2578 2577 +f 2594 2595 2600 +f 2600 2599 2594 +f 2595 2596 2601 +f 2601 2600 2595 +f 2596 2597 2602 +f 2602 2601 2596 +f 2597 2598 2603 +f 2603 2602 2597 +f 2578 2599 2484 +f 2484 2481 2578 +f 2599 2600 2486 +f 2486 2484 2599 +f 2600 2601 2488 +f 2488 2486 2600 +f 2601 2602 2490 +f 2490 2488 2601 +f 2602 2603 2492 +f 2492 2490 2602 +f 301 2482 2483 +f 2483 317 301 +f 2482 2485 2494 +f 2494 2483 2482 +f 2485 2487 2495 +f 2495 2494 2485 +f 2487 2489 2496 +f 2496 2495 2487 +f 2489 2491 2497 +f 2497 2496 2489 +f 2491 2493 2498 +f 2498 2497 2491 +g patch2 +f 1494 1497 2604 +f 2605 1263 1262 +f 2606 2607 2608 +f 2609 2610 2611 +f 2612 2613 2611 +f 2614 2615 2610 +f 2616 2617 2618 +f 2619 2620 2621 +f 2622 2623 2621 +f 2624 2625 2619 +f 2626 2627 2628 +f 2629 2630 2631 +f 2632 2633 2631 +f 2634 2635 2629 +f 2636 2637 2638 +f 2639 2640 2641 +f 2642 2643 2641 +f 2644 2645 2640 +f 1604 1600 2646 +f 2646 2647 1604 +f 2648 2647 2646 +f 2646 2649 2648 +f 2650 2651 2611 +f 2611 2652 2650 +f 2652 2653 2654 +f 2654 2650 2652 +f 2655 2613 1716 +f 1716 1715 2655 +f 2655 1715 2653 +f 2653 2652 2655 +f 2613 2655 2652 +f 2652 2611 2613 +f 2656 2657 1595 +f 1595 1588 2656 +f 2656 1588 2658 +f 2658 2659 2656 +f 2656 2659 2660 +f 2660 2657 2656 +f 2661 2659 2658 +f 2658 2662 2661 +f 2662 442 1721 +f 1721 2661 2662 +f 2663 2664 2660 +f 2660 2665 2663 +f 2665 2660 2659 +f 2659 2661 2665 +f 2665 2661 1721 +f 1721 1726 2665 +f 2663 2666 2667 +f 2667 2664 2663 +f 2666 2663 2665 +f 2665 1726 2666 +f 2666 1726 1731 +f 1731 2667 2666 +f 2606 1592 1595 +f 1595 2657 2606 +f 2606 2657 2660 +f 2660 2607 2606 +f 2668 2660 2664 +f 2664 2669 2668 +f 2614 2668 2669 +f 2669 2615 2614 +f 2668 2614 2607 +f 2607 2660 2668 +f 2610 2609 2607 +f 2607 2614 2610 +f 2651 2670 2609 +f 2609 2611 2651 +f 2615 2612 2611 +f 2611 2610 2615 +f 2671 2667 1731 +f 1731 1716 2671 +f 2613 2612 2671 +f 2671 1716 2613 +f 2669 2664 2667 +f 2667 2671 2669 +f 2615 2669 2671 +f 2671 2612 2615 +f 1600 1592 2672 +f 2672 2646 1600 +f 2649 2646 2672 +f 2672 2673 2649 +f 2608 2672 1592 +f 1592 2606 2608 +f 2673 2672 2608 +f 2608 2670 2673 +f 2609 2670 2608 +f 2608 2607 2609 +f 2674 2675 2676 +f 2676 2677 2674 +f 2678 2679 2675 +f 2675 2674 2678 +f 2680 2681 2679 +f 2679 2678 2680 +f 2680 2682 2683 +f 2683 2681 2680 +f 2684 2685 2683 +f 2683 2682 2684 +f 2684 2686 2654 +f 2654 2685 2684 +f 1905 2674 2677 +f 2677 1906 1905 +f 1905 1911 2678 +f 2678 2674 1905 +f 1911 1916 2680 +f 2680 2678 1911 +f 1921 2682 2680 +f 2680 1916 1921 +f 1921 1926 2684 +f 2684 2682 1921 +f 1926 1931 2686 +f 2686 2684 1926 +f 2675 2687 2688 +f 2688 2676 2675 +f 2687 2532 1335 +f 1335 2688 2687 +f 2679 2689 2687 +f 2687 2675 2679 +f 2689 2537 2532 +f 2532 2687 2689 +f 2681 2690 2689 +f 2689 2679 2681 +f 2690 2542 2537 +f 2537 2689 2690 +f 2683 2691 2690 +f 2690 2681 2683 +f 2691 2547 2542 +f 2542 2690 2691 +f 2685 2692 2691 +f 2691 2683 2685 +f 2692 2552 2547 +f 2547 2691 2692 +f 2692 2685 2654 +f 2654 2653 2692 +f 2552 2692 2653 +f 2653 1715 2552 +f 2686 2693 2650 +f 2650 2654 2686 +f 2693 2694 2651 +f 2651 2650 2693 +f 2694 2695 2670 +f 2670 2651 2694 +f 2695 2696 2673 +f 2673 2670 2695 +f 2696 2697 2649 +f 2649 2673 2696 +f 2697 2698 2648 +f 2648 2649 2697 +f 1931 1936 2693 +f 2693 2686 1931 +f 1936 1941 2694 +f 2694 2693 1936 +f 1946 2695 2694 +f 2694 1941 1946 +f 1951 2696 2695 +f 2695 1946 1951 +f 1951 1956 2697 +f 2697 2696 1951 +f 1961 2698 2697 +f 2697 1956 1961 +f 2699 2677 2676 +f 2676 2700 2699 +f 2701 2699 2700 +f 2700 2702 2701 +f 2703 2701 2702 +f 2702 2704 2703 +f 2703 2704 2705 +f 2705 2706 2703 +f 2707 2706 2705 +f 2705 2708 2707 +f 2707 2708 2709 +f 2709 2710 2707 +f 1988 1906 2677 +f 2677 2699 1988 +f 1988 2699 2701 +f 2701 1993 1988 +f 1998 1993 2701 +f 2701 2703 1998 +f 2003 1998 2703 +f 2703 2706 2003 +f 2003 2706 2707 +f 2707 2008 2003 +f 2008 2707 2710 +f 2710 2013 2008 +f 2700 2676 2688 +f 2688 2711 2700 +f 2711 2688 1335 +f 1335 1334 2711 +f 2702 2700 2711 +f 2711 2712 2702 +f 2712 2711 1334 +f 1334 1340 2712 +f 2704 2702 2712 +f 2712 2713 2704 +f 2713 2712 1340 +f 1340 1345 2713 +f 2705 2704 2713 +f 2713 2714 2705 +f 2714 2713 1345 +f 1345 1350 2714 +f 2708 2705 2714 +f 2714 2715 2708 +f 2715 2714 1350 +f 1350 1355 2715 +f 2715 2716 2709 +f 2709 2708 2715 +f 1355 1360 2716 +f 2716 2715 1355 +f 2710 2709 2717 +f 2717 2718 2710 +f 2718 2717 2719 +f 2719 2720 2718 +f 2720 2719 2721 +f 2721 2722 2720 +f 2722 2721 2723 +f 2723 2724 2722 +f 2725 2724 2723 +f 2723 2726 2725 +f 2698 2725 2726 +f 2726 2648 2698 +f 2018 2013 2710 +f 2710 2718 2018 +f 2018 2718 2720 +f 2720 2023 2018 +f 2028 2023 2720 +f 2720 2722 2028 +f 2033 2028 2722 +f 2722 2724 2033 +f 2033 2724 2725 +f 2725 2038 2033 +f 1961 2038 2725 +f 2725 2698 1961 +f 1604 2647 2727 +f 2727 1791 1604 +f 2648 2726 2727 +f 2727 2647 2648 +f 2717 2728 2621 +f 2621 2719 2717 +f 2728 2717 2709 +f 2709 2716 2728 +f 2729 1360 1372 +f 1372 2622 2729 +f 2729 2728 2716 +f 2716 1360 2729 +f 2622 2621 2728 +f 2728 2729 2622 +f 2730 1779 1782 +f 1782 2731 2730 +f 2730 2732 2733 +f 2733 1779 2730 +f 2730 2731 2734 +f 2734 2732 2730 +f 2733 2732 1497 +f 1497 609 2733 +f 2735 2604 2734 +f 2734 2736 2735 +f 2604 1497 2732 +f 2732 2734 2604 +f 2735 2736 2737 +f 2737 2738 2735 +f 2738 1494 2604 +f 2604 2735 2738 +f 2738 2737 1371 +f 1371 1494 2738 +f 2617 2731 1782 +f 1782 1785 2617 +f 2617 2616 2734 +f 2734 2731 2617 +f 2739 2740 2736 +f 2736 2734 2739 +f 2625 2624 2740 +f 2740 2739 2625 +f 2739 2734 2616 +f 2616 2625 2739 +f 2619 2625 2616 +f 2616 2620 2619 +f 2719 2621 2620 +f 2620 2721 2719 +f 2624 2619 2621 +f 2621 2623 2624 +f 1371 2737 2741 +f 2741 1372 1371 +f 2622 1372 2741 +f 2741 2623 2622 +f 2740 2741 2737 +f 2737 2736 2740 +f 2624 2623 2741 +f 2741 2740 2624 +f 1791 2727 2742 +f 2742 1785 1791 +f 2726 2723 2742 +f 2742 2727 2726 +f 2618 2617 1785 +f 1785 2742 2618 +f 2723 2721 2618 +f 2618 2742 2723 +f 2620 2616 2618 +f 2618 2721 2620 +f 2099 2743 2744 +f 2744 2095 2099 +f 2745 2746 2744 +f 2744 2743 2745 +f 2747 2748 2631 +f 2631 2749 2747 +f 2748 2747 2750 +f 2750 2751 2748 +f 2752 1477 1435 +f 1435 2632 2752 +f 2752 2748 2751 +f 2751 1477 2752 +f 2632 2631 2748 +f 2748 2752 2632 +f 2753 2083 2086 +f 2086 2754 2753 +f 2753 2755 2756 +f 2756 2083 2753 +f 2753 2754 2757 +f 2757 2755 2753 +f 2758 2759 2756 +f 2756 2755 2758 +f 2759 2758 2184 +f 2184 785 2759 +f 2760 2761 2757 +f 2757 2762 2760 +f 2761 2758 2755 +f 2755 2757 2761 +f 2761 2189 2184 +f 2184 2758 2761 +f 2760 2762 2763 +f 2763 2764 2760 +f 2764 2189 2761 +f 2761 2760 2764 +f 2764 2763 1434 +f 1434 2189 2764 +f 2627 2754 2086 +f 2086 2089 2627 +f 2627 2626 2757 +f 2757 2754 2627 +f 2765 2766 2762 +f 2762 2757 2765 +f 2635 2634 2766 +f 2766 2765 2635 +f 2765 2757 2626 +f 2626 2635 2765 +f 2629 2635 2626 +f 2626 2630 2629 +f 2749 2631 2630 +f 2630 2767 2749 +f 2634 2629 2631 +f 2631 2633 2634 +f 2768 1435 1434 +f 1434 2763 2768 +f 2632 1435 2768 +f 2768 2633 2632 +f 2766 2768 2763 +f 2763 2762 2766 +f 2634 2633 2768 +f 2768 2766 2634 +f 2095 2744 2769 +f 2769 2089 2095 +f 2746 2770 2769 +f 2769 2744 2746 +f 2628 2627 2089 +f 2089 2769 2628 +f 2770 2767 2628 +f 2628 2769 2770 +f 2630 2626 2628 +f 2628 2767 2630 +f 2771 2772 2773 +f 2773 2774 2771 +f 2775 2771 2774 +f 2774 2776 2775 +f 2777 2775 2776 +f 2776 2778 2777 +f 2777 2778 2779 +f 2779 2780 2777 +f 2781 2780 2779 +f 2779 2782 2781 +f 2781 2782 2750 +f 2750 2783 2781 +f 2348 2347 2772 +f 2772 2771 2348 +f 2348 2771 2775 +f 2775 2353 2348 +f 2353 2775 2777 +f 2777 2358 2353 +f 2363 2358 2777 +f 2777 2780 2363 +f 2363 2780 2781 +f 2781 2368 2363 +f 2368 2781 2783 +f 2783 2373 2368 +f 2774 2773 2784 +f 2784 2785 2774 +f 2785 2784 1452 +f 1452 1451 2785 +f 2776 2774 2785 +f 2785 2786 2776 +f 2786 2785 1451 +f 1451 1457 2786 +f 2778 2776 2786 +f 2786 2787 2778 +f 2787 2786 1457 +f 1457 1462 2787 +f 2779 2778 2787 +f 2787 2788 2779 +f 2788 2787 1462 +f 1462 1467 2788 +f 2782 2779 2788 +f 2788 2789 2782 +f 2789 2788 1467 +f 1467 1472 2789 +f 2789 2751 2750 +f 2750 2782 2789 +f 1472 1477 2751 +f 2751 2789 1472 +f 2783 2750 2747 +f 2747 2790 2783 +f 2790 2747 2749 +f 2749 2791 2790 +f 2791 2749 2767 +f 2767 2792 2791 +f 2792 2767 2770 +f 2770 2793 2792 +f 2793 2770 2746 +f 2746 2794 2793 +f 2794 2746 2745 +f 2745 2795 2794 +f 2373 2783 2790 +f 2790 2378 2373 +f 2378 2790 2791 +f 2791 2383 2378 +f 2388 2383 2791 +f 2791 2792 2388 +f 2393 2388 2792 +f 2792 2793 2393 +f 2393 2793 2794 +f 2794 2398 2393 +f 2403 2398 2794 +f 2794 2795 2403 +f 2796 2797 2773 +f 2773 2772 2796 +f 2798 2799 2797 +f 2797 2796 2798 +f 2800 2801 2799 +f 2799 2798 2800 +f 2800 2802 2803 +f 2803 2801 2800 +f 2804 2805 2803 +f 2803 2802 2804 +f 2804 2806 2807 +f 2807 2805 2804 +f 2430 2796 2772 +f 2772 2347 2430 +f 2430 2435 2798 +f 2798 2796 2430 +f 2440 2800 2798 +f 2798 2435 2440 +f 2445 2802 2800 +f 2800 2440 2445 +f 2445 2450 2804 +f 2804 2802 2445 +f 2450 2455 2806 +f 2806 2804 2450 +f 2797 2808 2784 +f 2784 2773 2797 +f 2808 2583 1452 +f 1452 2784 2808 +f 2799 2809 2808 +f 2808 2797 2799 +f 2809 2588 2583 +f 2583 2808 2809 +f 2801 2810 2809 +f 2809 2799 2801 +f 2810 2593 2588 +f 2588 2809 2810 +f 2803 2811 2810 +f 2810 2801 2803 +f 2811 2598 2593 +f 2593 2810 2811 +f 2805 2812 2811 +f 2811 2803 2805 +f 2812 2603 2598 +f 2598 2811 2812 +f 2812 2805 2807 +f 2807 2813 2812 +f 2603 2812 2813 +f 2813 2492 2603 +f 2806 2814 2815 +f 2815 2807 2806 +f 2814 2816 2817 +f 2817 2815 2814 +f 2816 2818 2819 +f 2819 2817 2816 +f 2818 2820 2821 +f 2821 2819 2818 +f 2822 2823 2821 +f 2821 2820 2822 +f 2795 2745 2823 +f 2823 2822 2795 +f 2460 2814 2806 +f 2806 2455 2460 +f 2460 2465 2816 +f 2816 2814 2460 +f 2470 2818 2816 +f 2816 2465 2470 +f 2475 2820 2818 +f 2818 2470 2475 +f 2475 2480 2822 +f 2822 2820 2475 +f 2403 2795 2822 +f 2822 2480 2403 +f 2099 2241 2824 +f 2824 2743 2099 +f 2745 2743 2824 +f 2824 2823 2745 +f 2815 2817 2641 +f 2641 2825 2815 +f 2825 2813 2807 +f 2807 2815 2825 +f 2826 2643 2493 +f 2493 2492 2826 +f 2826 2492 2813 +f 2813 2825 2826 +f 2643 2826 2825 +f 2825 2641 2643 +f 2827 2828 2236 +f 2236 2229 2827 +f 2827 2229 2829 +f 2829 2830 2827 +f 2827 2830 2831 +f 2831 2828 2827 +f 2829 932 1263 +f 1263 2830 2829 +f 2832 2833 2831 +f 2831 2605 2832 +f 2605 2831 2830 +f 2830 1263 2605 +f 2832 2834 2835 +f 2835 2833 2832 +f 2834 2832 2605 +f 2605 1262 2834 +f 2834 1262 2498 +f 2498 2835 2834 +f 2636 2233 2236 +f 2236 2828 2636 +f 2636 2828 2831 +f 2831 2637 2636 +f 2836 2831 2833 +f 2833 2837 2836 +f 2644 2836 2837 +f 2837 2645 2644 +f 2836 2644 2637 +f 2637 2831 2836 +f 2640 2639 2637 +f 2637 2644 2640 +f 2817 2819 2639 +f 2639 2641 2817 +f 2645 2642 2641 +f 2641 2640 2645 +f 2498 2493 2838 +f 2838 2835 2498 +f 2643 2642 2838 +f 2838 2493 2643 +f 2837 2833 2835 +f 2835 2838 2837 +f 2645 2837 2838 +f 2838 2642 2645 +f 2241 2233 2839 +f 2839 2824 2241 +f 2823 2824 2839 +f 2839 2821 2823 +f 2638 2839 2233 +f 2233 2636 2638 +f 2821 2839 2638 +f 2638 2819 2821 +f 2639 2819 2638 +f 2638 2637 2639 +f 1571 2840 2841 +f 2841 1568 1571 +f 2842 2841 2840 +f 2840 2843 2842 +f 2843 424 423 +f 423 2842 2843 +f 1568 2841 2844 +f 2844 1576 1568 +f 2841 2842 2845 +f 2845 2844 2841 +f 2842 423 427 +f 427 2845 2842 +f 1576 2844 2846 +f 2846 1580 1576 +f 2844 2845 2847 +f 2847 2846 2844 +f 2845 427 430 +f 430 2847 2845 +f 1580 2846 2848 +f 2848 1584 1580 +f 2846 2847 2849 +f 2849 2848 2846 +f 2847 430 437 +f 437 2849 2847 +f 1584 2848 2658 +f 2658 1588 1584 +f 2848 2849 2662 +f 2662 2658 2848 +f 2849 437 442 +f 442 2662 2849 +f 1758 1761 2850 +f 2850 2851 1758 +f 2851 2850 594 +f 594 593 2851 +f 1761 1767 2852 +f 2852 2850 1761 +f 2850 2852 596 +f 596 594 2850 +f 1767 1771 2853 +f 2853 2852 1767 +f 2852 2853 598 +f 598 596 2852 +f 1771 1775 2854 +f 2854 2853 1771 +f 2853 2854 604 +f 604 598 2853 +f 1775 1779 2733 +f 2733 2854 1775 +f 2733 609 604 +f 604 2854 2733 +f 1571 2067 2855 +f 2855 2840 1571 +f 2856 2843 2840 +f 2840 2855 2856 +f 2843 2856 767 +f 767 424 2843 +f 2067 2071 2857 +f 2857 2855 2067 +f 2855 2857 2858 +f 2858 2856 2855 +f 2856 2858 770 +f 770 767 2856 +f 2071 2075 2859 +f 2859 2857 2071 +f 2857 2859 2860 +f 2860 2858 2857 +f 2858 2860 773 +f 773 770 2858 +f 2075 2079 2861 +f 2861 2859 2075 +f 2859 2861 2862 +f 2862 2860 2859 +f 2860 2862 780 +f 780 773 2860 +f 2079 2083 2756 +f 2756 2861 2079 +f 2861 2756 2759 +f 2759 2862 2861 +f 2862 2759 785 +f 785 780 2862 +f 1758 2851 2863 +f 2863 2213 1758 +f 2851 593 917 +f 917 2863 2851 +f 2213 2863 2864 +f 2864 2217 2213 +f 2863 917 919 +f 919 2864 2863 +f 2217 2864 2865 +f 2865 2221 2217 +f 2864 919 921 +f 921 2865 2864 +f 2221 2865 2866 +f 2866 2225 2221 +f 2865 921 927 +f 927 2866 2865 +f 2225 2866 2829 +f 2829 2229 2225 +f 2829 2866 927 +f 927 932 2829 +g patch3 +f 2867 2868 126 +f 126 125 2867 +f 2869 2867 125 +f 125 131 2869 +f 2870 2869 131 +f 131 134 2870 +f 2870 134 137 +f 137 2871 2870 +f 2872 2871 137 +f 137 140 2872 +f 2872 140 93 +f 93 2873 2872 +f 1871 1874 2868 +f 2868 2867 1871 +f 1871 2867 2869 +f 2869 1875 1871 +f 1875 2869 2870 +f 2870 1877 1875 +f 1879 1877 2870 +f 2870 2871 1879 +f 1879 2871 2872 +f 2872 1881 1879 +f 1881 2872 2873 +f 2873 1883 1881 +f 2873 93 90 +f 90 2874 2873 +f 2874 90 92 +f 92 2875 2874 +f 2875 92 119 +f 119 2876 2875 +f 2876 119 122 +f 122 2877 2876 +f 2877 122 89 +f 89 2878 2877 +f 2878 89 88 +f 88 2879 2878 +f 1883 2873 2874 +f 2874 1885 1883 +f 1885 2874 2875 +f 2875 1887 1885 +f 1889 1887 2875 +f 2875 2876 1889 +f 1891 1889 2876 +f 2876 2877 1891 +f 1891 2877 2878 +f 2878 1893 1891 +f 1895 1893 2878 +f 2878 2879 1895 +f 2880 143 126 +f 126 2868 2880 +f 2881 146 143 +f 143 2880 2881 +f 2882 149 146 +f 146 2881 2882 +f 2882 2883 152 +f 152 149 2882 +f 2884 155 152 +f 152 2883 2884 +f 2884 2885 158 +f 158 155 2884 +f 1963 2880 2868 +f 2868 1874 1963 +f 1963 1965 2881 +f 2881 2880 1963 +f 1967 2882 2881 +f 2881 1965 1967 +f 1969 2883 2882 +f 2882 1967 1969 +f 1969 1971 2884 +f 2884 2883 1969 +f 1971 1973 2885 +f 2885 2884 1971 +f 2885 2886 164 +f 164 158 2885 +f 2886 2887 165 +f 165 164 2886 +f 2887 2888 188 +f 188 165 2887 +f 2888 2889 191 +f 191 188 2888 +f 2890 163 191 +f 191 2889 2890 +f 2879 88 163 +f 163 2890 2879 +f 1975 2886 2885 +f 2885 1973 1975 +f 1975 1977 2887 +f 2887 2886 1975 +f 1979 2888 2887 +f 2887 1977 1979 +f 1981 2889 2888 +f 2888 1979 1981 +f 1981 1983 2890 +f 2890 2889 1981 +f 1895 2879 2890 +f 2890 1983 1895 +f 2891 258 261 +f 261 2892 2891 +f 2893 264 258 +f 258 2891 2893 +f 2894 267 264 +f 264 2893 2894 +f 2894 2895 270 +f 270 267 2894 +f 2896 273 270 +f 270 2895 2896 +f 2896 2897 227 +f 227 273 2896 +f 2316 2891 2892 +f 2892 2313 2316 +f 2316 2318 2893 +f 2893 2891 2316 +f 2318 2320 2894 +f 2894 2893 2318 +f 2322 2895 2894 +f 2894 2320 2322 +f 2322 2324 2896 +f 2896 2895 2322 +f 2324 2326 2897 +f 2897 2896 2324 +f 2897 2898 223 +f 223 227 2897 +f 2898 2899 224 +f 224 223 2898 +f 2899 2900 252 +f 252 224 2899 +f 2900 2901 255 +f 255 252 2900 +f 2901 2902 222 +f 222 255 2901 +f 2902 2903 221 +f 221 222 2902 +f 2326 2328 2898 +f 2898 2897 2326 +f 2328 2330 2899 +f 2899 2898 2328 +f 2332 2900 2899 +f 2899 2330 2332 +f 2334 2901 2900 +f 2900 2332 2334 +f 2334 2336 2902 +f 2902 2901 2334 +f 2338 2903 2902 +f 2902 2336 2338 +f 2904 2892 261 +f 261 276 2904 +f 2905 2904 276 +f 276 279 2905 +f 2906 2905 279 +f 279 282 2906 +f 2906 282 285 +f 285 2907 2906 +f 2908 2907 285 +f 285 288 2908 +f 2908 288 292 +f 292 2909 2908 +f 2404 2313 2892 +f 2892 2904 2404 +f 2404 2904 2905 +f 2905 2406 2404 +f 2408 2406 2905 +f 2905 2906 2408 +f 2410 2408 2906 +f 2906 2907 2410 +f 2410 2907 2908 +f 2908 2412 2410 +f 2412 2908 2909 +f 2909 2414 2412 +f 2909 292 297 +f 297 2910 2909 +f 2910 297 299 +f 299 2911 2910 +f 2911 299 321 +f 321 2912 2911 +f 2912 321 324 +f 324 2913 2912 +f 2914 2913 324 +f 324 296 2914 +f 2903 2914 296 +f 296 221 2903 +f 2416 2414 2909 +f 2909 2910 2416 +f 2416 2910 2911 +f 2911 2418 2416 +f 2420 2418 2911 +f 2911 2912 2420 +f 2422 2420 2912 +f 2912 2913 2422 +f 2422 2913 2914 +f 2914 2424 2422 +f 2338 2424 2914 +f 2914 2903 2338 +g patch4 +f 2915 2916 2917 +f 2917 2918 2915 +f 2916 2915 2919 +f 2919 2920 2916 +f 2919 2921 2922 +f 2922 2920 2919 +f 2921 544 535 +f 535 2922 2921 +f 1522 546 544 +f 544 2921 1522 +f 2921 2919 1524 +f 1524 1522 2921 +f 2915 1526 1524 +f 1524 2919 2915 +f 1526 2915 2918 +f 2918 1528 1526 +f 2923 2924 2925 +f 2925 2926 2923 +f 2926 2927 2928 +f 2928 2923 2926 +f 2923 2928 692 +f 692 698 2923 +f 698 699 2924 +f 2924 2923 698 +f 2929 2918 2917 +f 2917 2930 2929 +f 2930 2931 2932 +f 2932 2929 2930 +f 2932 2931 2933 +f 2933 2934 2932 +f 2934 2933 868 +f 868 874 2934 +f 2041 2934 874 +f 874 876 2041 +f 2934 2041 2043 +f 2043 2932 2934 +f 2929 2932 2043 +f 2043 2045 2929 +f 2045 1528 2918 +f 2918 2929 2045 +f 2935 2936 2925 +f 2925 2924 2935 +f 2936 2935 2937 +f 2937 2938 2936 +f 2935 1008 1003 +f 1003 2937 2935 +f 1008 2935 2924 +f 2924 699 1008 +f 2939 2920 2922 +f 2922 2940 2939 +f 2941 2939 2940 +f 2940 2942 2941 +f 2940 2922 535 +f 535 70 2940 +f 2942 2940 70 +f 70 69 2942 +f 2943 2944 2928 +f 2928 2927 2943 +f 2941 2942 2944 +f 2944 2943 2941 +f 2944 124 692 +f 692 2928 2944 +f 2942 69 124 +f 124 2944 2942 +f 2945 2946 2933 +f 2933 2931 2945 +f 2947 2948 2946 +f 2946 2945 2947 +f 2946 206 868 +f 868 2933 2946 +f 2948 207 206 +f 206 2946 2948 +f 2949 2938 2937 +f 2937 2950 2949 +f 2947 2949 2950 +f 2950 2948 2947 +f 2950 2937 1003 +f 1003 256 2950 +f 2948 2950 256 +f 256 207 2948 +f 2951 2952 2953 +f 2953 2954 2951 +f 2955 2953 2952 +f 2952 2956 2955 +f 2957 2958 2959 +f 2959 2960 2957 +f 2961 2959 2958 +f 2958 2962 2961 +f 2954 2953 2963 +f 2963 2964 2954 +f 2964 2963 2965 +f 2965 2966 2964 +f 2953 2955 2967 +f 2967 2963 2953 +f 2963 2967 2968 +f 2968 2965 2963 +f 2960 2959 2969 +f 2969 2970 2960 +f 2970 2969 2971 +f 2971 2972 2970 +f 2959 2961 2973 +f 2973 2969 2959 +f 2969 2973 2974 +f 2974 2971 2969 +f 2975 2976 2977 +f 2977 2978 2975 +f 2955 2956 2978 +f 2978 2977 2955 +f 2979 2980 2981 +f 2981 2982 2979 +f 2961 2962 2982 +f 2982 2981 2961 +f 2983 2984 2917 +f 2917 2916 2983 +f 2985 2986 2984 +f 2984 2983 2985 +f 2951 2983 2916 +f 2916 2920 2951 +f 2954 2985 2983 +f 2983 2951 2954 +f 2920 2939 2952 +f 2952 2951 2920 +f 2956 2952 2939 +f 2939 2941 2956 +f 2986 2985 2987 +f 2987 2988 2986 +f 2988 2987 2989 +f 2989 2990 2988 +f 2985 2954 2964 +f 2964 2987 2985 +f 2987 2964 2966 +f 2966 2989 2987 +f 2991 2926 2925 +f 2925 2992 2991 +f 2993 2991 2992 +f 2992 2994 2993 +f 2975 2927 2926 +f 2926 2991 2975 +f 2976 2975 2991 +f 2991 2993 2976 +f 2927 2975 2978 +f 2978 2943 2927 +f 2956 2941 2943 +f 2943 2978 2956 +f 2994 2995 2996 +f 2996 2993 2994 +f 2995 2997 2998 +f 2998 2996 2995 +f 2993 2996 2999 +f 2999 2976 2993 +f 2996 2998 3000 +f 3000 2999 2996 +f 3001 2930 2917 +f 2917 2984 3001 +f 3002 3001 2984 +f 2984 2986 3002 +f 2979 2931 2930 +f 2930 3001 2979 +f 2980 2979 3001 +f 3001 3002 2980 +f 2931 2979 2982 +f 2982 2945 2931 +f 2962 2947 2945 +f 2945 2982 2962 +f 2986 2988 3003 +f 3003 3002 2986 +f 2988 2990 3004 +f 3004 3003 2988 +f 3002 3003 3005 +f 3005 2980 3002 +f 3003 3004 3006 +f 3006 3005 3003 +f 3007 2992 2925 +f 2925 2936 3007 +f 3008 2994 2992 +f 2992 3007 3008 +f 2957 3007 2936 +f 2936 2938 2957 +f 2960 3008 3007 +f 3007 2957 2960 +f 2938 2949 2958 +f 2958 2957 2938 +f 2962 2958 2949 +f 2949 2947 2962 +f 2994 3008 3009 +f 3009 2995 2994 +f 2995 3009 3010 +f 3010 2997 2995 +f 3008 2960 2970 +f 2970 3009 3008 +f 3009 2970 2972 +f 2972 3010 3009 +f 2976 2999 3011 +f 3011 2977 2976 +f 2999 3000 3012 +f 3012 3011 2999 +f 2977 3011 2967 +f 2967 2955 2977 +f 3011 3012 2968 +f 2968 2967 3011 +f 2980 3005 3013 +f 3013 2981 2980 +f 3005 3006 3014 +f 3014 3013 3005 +f 2981 3013 2973 +f 2973 2961 2981 +f 3013 3014 2974 +f 2974 2973 3013 +f 1111 3015 1113 +f 1113 3016 1115 +f 3017 1131 1133 +f 3018 1133 1135 +f 3019 1192 1194 +f 3020 1194 1196 +f 1210 3021 1212 +f 1212 3022 1214 +f 3023 3024 3025 +f 3025 3026 3023 +f 2990 2989 3024 +f 3024 3023 2990 +f 3024 3027 3028 +f 3028 3025 3024 +f 2989 2966 3027 +f 3027 3024 2989 +f 3027 3029 3030 +f 3030 3028 3027 +f 3031 3029 3027 +f 3027 2966 3031 +f 2965 3032 3031 +f 3031 2966 2965 +f 2968 3033 3032 +f 3032 2965 2968 +f 3034 3029 3031 +f 3031 3035 3034 +f 1117 3034 3035 +f 3035 1118 1117 +f 3016 3030 3029 +f 3029 3034 3016 +f 1115 3016 3034 +f 3034 1117 1115 +f 3035 3031 3032 +f 3032 3036 3035 +f 1118 3035 3036 +f 3036 1121 1118 +f 3036 3032 3033 +f 3033 3037 3036 +f 1121 3036 3037 +f 3037 1123 1121 +f 3038 3039 3040 +f 3040 3041 3038 +f 2997 3038 3041 +f 3041 2998 2997 +f 3041 3040 3042 +f 3042 3043 3041 +f 2998 3041 3043 +f 3043 3000 2998 +f 3043 3042 3044 +f 3044 3045 3043 +f 3046 3000 3043 +f 3043 3045 3046 +f 3012 3000 3046 +f 3046 3047 3012 +f 2968 3012 3047 +f 3047 3033 2968 +f 3048 3049 3046 +f 3046 3045 3048 +f 1138 1137 3049 +f 3049 3048 1138 +f 3018 3048 3045 +f 3045 3044 3018 +f 1135 1138 3048 +f 3048 3018 1135 +f 3049 3050 3047 +f 3047 3046 3049 +f 1137 1141 3050 +f 3050 3049 1137 +f 3050 3037 3033 +f 3033 3047 3050 +f 1141 1123 3037 +f 3037 3050 1141 +f 3023 3026 3051 +f 3051 3052 3023 +f 2990 3023 3052 +f 3052 3004 2990 +f 3052 3051 3053 +f 3053 3054 3052 +f 3004 3052 3054 +f 3054 3006 3004 +f 3054 3053 3055 +f 3055 3056 3054 +f 3057 3006 3054 +f 3054 3056 3057 +f 3014 3006 3057 +f 3057 3058 3014 +f 2974 3014 3058 +f 3058 3059 2974 +f 3060 3061 3057 +f 3057 3056 3060 +f 1199 1198 3061 +f 3061 3060 1199 +f 3020 3060 3056 +f 3056 3055 3020 +f 1196 1199 3060 +f 3060 3020 1196 +f 3061 3062 3058 +f 3058 3057 3061 +f 1198 1202 3062 +f 3062 3061 1198 +f 3062 3063 3059 +f 3059 3058 3062 +f 1202 1204 3063 +f 3063 3062 1202 +f 3038 3064 3065 +f 3065 3039 3038 +f 2997 3010 3064 +f 3064 3038 2997 +f 3064 3066 3067 +f 3067 3065 3064 +f 3010 2972 3066 +f 3066 3064 3010 +f 3066 3068 3069 +f 3069 3067 3066 +f 3070 3068 3066 +f 3066 2972 3070 +f 2971 3071 3070 +f 3070 2972 2971 +f 2974 3059 3071 +f 3071 2971 2974 +f 3072 3068 3070 +f 3070 3073 3072 +f 1216 3072 3073 +f 3073 1217 1216 +f 3022 3069 3068 +f 3068 3072 3022 +f 1214 3022 3072 +f 3072 1216 1214 +f 3073 3070 3071 +f 3071 3074 3073 +f 1217 3073 3074 +f 3074 1220 1217 +f 3074 3071 3059 +f 3059 3063 3074 +f 1220 3074 3063 +f 3063 1204 1220 +f 3025 3075 3076 +f 3076 3026 3025 +f 1106 1105 3076 +f 3076 3075 1106 +f 3028 3077 3075 +f 3075 3025 3028 +f 1109 1106 3075 +f 3075 3077 1109 +f 3015 3077 3028 +f 3028 3030 3015 +f 1111 1109 3077 +f 3077 3015 1111 +f 3015 3030 3016 +f 3016 1113 3015 +f 3039 3078 3079 +f 3079 3040 3039 +f 1125 3079 3078 +f 3078 1126 1125 +f 3040 3079 3080 +f 3080 3042 3040 +f 1129 3080 3079 +f 3079 1125 1129 +f 3017 3044 3042 +f 3042 3080 3017 +f 1131 3017 3080 +f 3080 1129 1131 +f 3017 1133 3018 +f 3018 3044 3017 +f 3026 3076 3081 +f 3081 3051 3026 +f 1188 3081 3076 +f 3076 1105 1188 +f 3051 3081 3082 +f 3082 3053 3051 +f 1190 3082 3081 +f 3081 1188 1190 +f 3019 3055 3053 +f 3053 3082 3019 +f 1192 3019 3082 +f 3082 1190 1192 +f 3019 1194 3020 +f 3020 3055 3019 +f 3065 3083 3078 +f 3078 3039 3065 +f 1206 1126 3078 +f 3078 3083 1206 +f 3067 3084 3083 +f 3083 3065 3067 +f 1208 1206 3083 +f 3083 3084 1208 +f 3021 3084 3067 +f 3067 3069 3021 +f 1210 1208 3084 +f 3084 3021 1210 +f 3021 3069 3022 +f 3022 1212 3021 +f 1108 1107 3085 +f 3085 3086 1108 +f 1107 1110 3087 +f 3087 3085 1107 +f 1110 1112 3088 +f 3088 3087 1110 +f 1112 1114 3089 +f 3089 3088 1112 +f 1114 1116 3090 +f 3090 3089 1114 +f 1120 1119 3091 +f 3091 3092 1120 +f 1116 1120 3092 +f 3092 3090 1116 +f 1119 1122 3093 +f 3093 3091 1119 +f 1122 1124 3094 +f 3094 3093 1122 +f 3095 1128 1127 +f 1127 3096 3095 +f 1128 3095 3097 +f 3097 1130 1128 +f 1132 1130 3097 +f 3097 3098 1132 +f 1134 1132 3098 +f 3098 3099 1134 +f 1136 1134 3099 +f 3099 3100 1136 +f 3101 3102 1140 +f 1140 1139 3101 +f 1139 1136 3100 +f 3100 3101 1139 +f 1142 1140 3102 +f 3102 3103 1142 +f 1124 1142 3103 +f 3103 3094 1124 +f 1189 1108 3086 +f 3086 3104 1189 +f 1191 1189 3104 +f 3104 3105 1191 +f 1193 1191 3105 +f 3105 3106 1193 +f 1195 1193 3106 +f 3106 3107 1195 +f 1197 1195 3107 +f 3107 3108 1197 +f 1201 1200 3109 +f 3109 3110 1201 +f 1200 1197 3108 +f 3108 3109 1200 +f 1203 1201 3110 +f 3110 3111 1203 +f 1205 1203 3111 +f 3111 3112 1205 +f 3113 3096 1127 +f 1127 1207 3113 +f 1207 1209 3114 +f 3114 3113 1207 +f 1209 1211 3115 +f 3115 3114 1209 +f 1211 1213 3116 +f 3116 3115 1211 +f 1213 1215 3117 +f 3117 3116 1213 +f 3118 1219 1218 +f 1218 3119 3118 +f 1219 3118 3117 +f 3117 1215 1219 +f 1218 1221 3120 +f 3120 3119 1218 +f 1221 1205 3112 +f 3112 3120 1221 +f 3086 3085 3121 +f 3121 3122 3086 +f 3085 3087 3123 +f 3123 3121 3085 +f 3087 3088 3124 +f 3124 3123 3087 +f 3088 3089 3125 +f 3125 3124 3088 +f 3089 3090 3126 +f 3126 3125 3089 +f 3092 3091 3127 +f 3127 3128 3092 +f 3090 3092 3128 +f 3128 3126 3090 +f 3091 3093 3129 +f 3129 3127 3091 +f 3093 3094 3130 +f 3130 3129 3093 +f 3095 3096 3131 +f 3131 3132 3095 +f 3097 3095 3132 +f 3132 3133 3097 +f 3098 3097 3133 +f 3133 3134 3098 +f 3099 3098 3134 +f 3134 3135 3099 +f 3100 3099 3135 +f 3135 3136 3100 +f 3102 3101 3137 +f 3137 3138 3102 +f 3101 3100 3136 +f 3136 3137 3101 +f 3103 3102 3138 +f 3138 3139 3103 +f 3094 3103 3139 +f 3139 3130 3094 +f 3104 3086 3122 +f 3122 3140 3104 +f 3105 3104 3140 +f 3140 3141 3105 +f 3106 3105 3141 +f 3141 3142 3106 +f 3107 3106 3142 +f 3142 3143 3107 +f 3108 3107 3143 +f 3143 3144 3108 +f 3110 3109 3145 +f 3145 3146 3110 +f 3109 3108 3144 +f 3144 3145 3109 +f 3111 3110 3146 +f 3146 3147 3111 +f 3112 3111 3147 +f 3147 3148 3112 +f 3096 3113 3149 +f 3149 3131 3096 +f 3113 3114 3150 +f 3150 3149 3113 +f 3114 3115 3151 +f 3151 3150 3114 +f 3115 3116 3152 +f 3152 3151 3115 +f 3116 3117 3153 +f 3153 3152 3116 +f 3118 3119 3154 +f 3154 3155 3118 +f 3117 3118 3155 +f 3155 3153 3117 +f 3119 3120 3156 +f 3156 3154 3119 +f 3120 3112 3148 +f 3148 3156 3120 +f 3122 3121 3157 +f 3157 3158 3122 +f 3121 3123 3159 +f 3159 3157 3121 +f 3123 3124 3160 +f 3160 3159 3123 +f 3124 3125 3161 +f 3161 3160 3124 +f 3125 3126 3162 +f 3162 3161 3125 +f 3128 3127 3163 +f 3163 3164 3128 +f 3126 3128 3164 +f 3164 3162 3126 +f 3127 3129 3165 +f 3165 3163 3127 +f 3129 3130 3166 +f 3166 3165 3129 +f 3132 3131 3167 +f 3167 3168 3132 +f 3133 3132 3168 +f 3168 3169 3133 +f 3134 3133 3169 +f 3169 3170 3134 +f 3135 3134 3170 +f 3170 3171 3135 +f 3136 3135 3171 +f 3171 3172 3136 +f 3138 3137 3173 +f 3173 3174 3138 +f 3137 3136 3172 +f 3172 3173 3137 +f 3139 3138 3174 +f 3174 3175 3139 +f 3130 3139 3175 +f 3175 3166 3130 +f 3140 3122 3158 +f 3158 3176 3140 +f 3141 3140 3176 +f 3176 3177 3141 +f 3142 3141 3177 +f 3177 3178 3142 +f 3143 3142 3178 +f 3178 3179 3143 +f 3144 3143 3179 +f 3179 3180 3144 +f 3146 3145 3181 +f 3181 3182 3146 +f 3145 3144 3180 +f 3180 3181 3145 +f 3147 3146 3182 +f 3182 3183 3147 +f 3148 3147 3183 +f 3183 3184 3148 +f 3131 3149 3185 +f 3185 3167 3131 +f 3149 3150 3186 +f 3186 3185 3149 +f 3150 3151 3187 +f 3187 3186 3150 +f 3151 3152 3188 +f 3188 3187 3151 +f 3152 3153 3189 +f 3189 3188 3152 +f 3155 3154 3190 +f 3190 3191 3155 +f 3153 3155 3191 +f 3191 3189 3153 +f 3154 3156 3192 +f 3192 3190 3154 +f 3156 3148 3184 +f 3184 3192 3156 +f 3158 3157 3193 +f 3193 3194 3158 +f 3157 3159 3195 +f 3195 3193 3157 +f 3159 3160 3196 +f 3196 3195 3159 +f 3160 3161 3197 +f 3197 3196 3160 +f 3161 3162 3198 +f 3198 3197 3161 +f 3164 3163 3199 +f 3199 3200 3164 +f 3162 3164 3200 +f 3200 3198 3162 +f 3163 3165 3201 +f 3201 3199 3163 +f 3165 3166 3202 +f 3202 3201 3165 +f 3168 3167 3203 +f 3203 3204 3168 +f 3169 3168 3204 +f 3204 3205 3169 +f 3170 3169 3205 +f 3205 3206 3170 +f 3171 3170 3206 +f 3206 3207 3171 +f 3172 3171 3207 +f 3207 3208 3172 +f 3174 3173 3209 +f 3209 3210 3174 +f 3173 3172 3208 +f 3208 3209 3173 +f 3175 3174 3210 +f 3210 3211 3175 +f 3166 3175 3211 +f 3211 3202 3166 +f 3176 3158 3194 +f 3194 3212 3176 +f 3177 3176 3212 +f 3212 3213 3177 +f 3178 3177 3213 +f 3213 3214 3178 +f 3179 3178 3214 +f 3214 3215 3179 +f 3180 3179 3215 +f 3215 3216 3180 +f 3182 3181 3217 +f 3217 3218 3182 +f 3181 3180 3216 +f 3216 3217 3181 +f 3183 3182 3218 +f 3218 3219 3183 +f 3184 3183 3219 +f 3219 3220 3184 +f 3167 3185 3221 +f 3221 3203 3167 +f 3185 3186 3222 +f 3222 3221 3185 +f 3186 3187 3223 +f 3223 3222 3186 +f 3187 3188 3224 +f 3224 3223 3187 +f 3188 3189 3225 +f 3225 3224 3188 +f 3191 3190 3226 +f 3226 3227 3191 +f 3189 3191 3227 +f 3227 3225 3189 +f 3190 3192 3228 +f 3228 3226 3190 +f 3192 3184 3220 +f 3220 3228 3192 +f 3194 3193 503 +f 503 506 3194 +f 3193 3195 509 +f 509 503 3193 +f 3195 3196 512 +f 512 509 3195 +f 3196 3197 515 +f 515 512 3196 +f 3197 3198 518 +f 518 515 3197 +f 3200 3199 522 +f 522 521 3200 +f 3198 3200 521 +f 521 518 3198 +f 3199 3201 527 +f 527 522 3199 +f 3201 3202 530 +f 530 527 3201 +f 3204 3203 664 +f 664 663 3204 +f 3205 3204 663 +f 663 669 3205 +f 3206 3205 669 +f 669 673 3206 +f 3207 3206 673 +f 673 676 3207 +f 3208 3207 676 +f 676 679 3208 +f 3210 3209 681 +f 681 684 3210 +f 3209 3208 679 +f 679 681 3209 +f 3211 3210 684 +f 684 688 3211 +f 3202 3211 688 +f 688 530 3202 +f 3212 3194 506 +f 506 838 3212 +f 3213 3212 838 +f 838 841 3213 +f 3214 3213 841 +f 841 845 3214 +f 3215 3214 845 +f 845 848 3215 +f 3216 3215 848 +f 848 851 3216 +f 3218 3217 853 +f 853 856 3218 +f 3217 3216 851 +f 851 853 3217 +f 3219 3218 856 +f 856 860 3219 +f 3220 3219 860 +f 860 863 3220 +f 3203 3221 978 +f 978 664 3203 +f 3221 3222 981 +f 981 978 3221 +f 3222 3223 984 +f 984 981 3222 +f 3223 3224 987 +f 987 984 3223 +f 3224 3225 990 +f 990 987 3224 +f 3227 3226 994 +f 994 993 3227 +f 3225 3227 993 +f 993 990 3225 +f 3226 3228 999 +f 999 994 3226 +f 3228 3220 863 +f 863 999 3228 diff --git a/tutorials/mesh/cvMesh/flange/system/collapseDict b/tutorials/mesh/cvMesh/flange/system/collapseDict new file mode 100644 index 0000000000000000000000000000000000000000..729710d9fdd70b60a0f0787fc62d2fe3e0d0b415 --- /dev/null +++ b/tutorials/mesh/cvMesh/flange/system/collapseDict @@ -0,0 +1,52 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: dev | +| \\ / A nd | Web: www.OpenFOAM.org | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ + +FoamFile +{ + version 2.0; + format ascii; + + root ""; + case ""; + instance ""; + local ""; + + class dictionary; + object collapseDict; +} + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +collapseEdgesCoeffs +{ + minimumEdgeLength 1e-6; + maximumMergeAngle 180; + reductionFactor 0.5; +} + +collapseFacesCoeffs +{ + initialFaceLengthFactor 0.5; + reductionFactor 0.5; + + allowEarlyCollapseToPoint on; + allowEarlyCollapseCoeff 0.2; + guardFraction 0.1; + maxCollapseFaceToPointSideLengthCoeff 0.3; +} + +meshQualityCoeffs +{ + #include "meshQualityDict"; + maximumIterations 10; + maximumSmoothingIterations 1; + maxPointErrorCount 5; +} + + +// ************************************************************************* // diff --git a/tutorials/mesh/cvMesh/flange/system/controlDict b/tutorials/mesh/cvMesh/flange/system/controlDict new file mode 100644 index 0000000000000000000000000000000000000000..8d7092895478f5bc1dc88904efe55f2249ce6ee6 --- /dev/null +++ b/tutorials/mesh/cvMesh/flange/system/controlDict @@ -0,0 +1,58 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: dev | +| \\ / A nd | Web: www.OpenFOAM.org | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ + +FoamFile +{ + version 2.0; + format ascii; + + root ""; + case ""; + instance ""; + local ""; + + class dictionary; + object controlDict; +} + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +application cvMesh; + +startFrom startTime; + +startTime 0; + +stopAt endTime; + +endTime 100; + +deltaT 1; + +writeControl timeStep; + +writeInterval 100; + +purgeWrite 0; + +writeFormat ascii; + +writePrecision 10; + +writeCompression uncompressed; + +timeFormat general; + +timePrecision 6; + +runTimeModifiable yes; + +libs ("libdistributed.so"); + + +// ************************************************************************* // diff --git a/tutorials/mesh/cvMesh/flange/system/cvMeshDict b/tutorials/mesh/cvMesh/flange/system/cvMeshDict new file mode 100644 index 0000000000000000000000000000000000000000..fe581a549397396649d5df9696bac8cef3367406 --- /dev/null +++ b/tutorials/mesh/cvMesh/flange/system/cvMeshDict @@ -0,0 +1,200 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: dev | +| \\ / A nd | Web: www.OpenFOAM.org | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ + +FoamFile +{ + version 2.0; + format ascii; + + root ""; + case ""; + instance ""; + local ""; + + class dictionary; + object cvMeshDict; +} + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +// Any scalar with a name <name>Coeff specifies a value that will be implemented +// as a faction of the local target cell size + +geometry +{ + flange.obj + { + type triSurfaceMesh; + } +} + + +backgroundMeshDecomposition +{ + minLevels 1; + sampleResolution 4; + spanScale 5; + maxCellWeightCoeff 10; +} + + +surfaceConformation +{ + locationInMesh (0 0 0); + + pointPairDistanceCoeff 0.1; + + mixedFeaturePointPPDistanceCoeff 5.0; + + featurePointExclusionDistanceCoeff 0.7; + + featureEdgeExclusionDistanceCoeff 0.7; + + surfaceSearchDistanceCoeff 5; + + maxSurfaceProtrusionCoeff 0.1; + + maxQuadAngle 125; + + surfaceConformationRebuildFrequency 10; + + specialiseFeaturePoints on; + + conformationControls + { + edgeSearchDistCoeff 5; + surfacePtReplaceDistCoeff 0.5; + surfacePtExclusionDistanceCoeff 0.5; + + maxIterations 15; + + iterationToInitialHitRatioLimit 0.0001; + } + + geometryToConformTo + { + flange.obj + { + featureMethod extendedFeatureEdgeMesh; + extendedFeatureEdgeMesh "flange.extendedFeatureEdgeMesh"; + } + } + + additionalFeatures + { + } +} + + +initialPoints +{ + minimumSurfaceDistanceCoeff 0.55; + + initialPointsMethod autoDensity; + //initialPointsMethod pointFile; + + autoDensityCoeffs + { + minLevels 1; + maxSizeRatio 3.0; + sampleResolution 4; + surfaceSampleResolution 5; + } + + pointFileCoeffs + { + pointFile "constant/internalDelaunayVertices"; + } +} + + +motionControl +{ + defaultCellSize 0.001; + + shapeControlFunctions + { + flange.obj + { + type searchableSurfaceControl; + priority 1; + mode inside; + surfaceCellSizeFunction uniformValue; + uniformValueCoeffs + { + surfaceCellSize $defaultCellSize; + } + + cellSizeFunction uniform; + uniformCoeffs{} + } + } + + cellAspectRatioControl + { + aspectRatio 1.0; + aspectRatioDirection (0 0 0); + } + + relaxationModel adaptiveLinear; + + adaptiveLinearCoeffs + { + relaxationStart 1.0; + relaxationEnd 0.0; + } + + objOutput no; + + timeChecks no; + + maxLoadUnbalance 0.2; + + alignmentSearchSpokes 36; + + alignmentAcceptanceAngle 48; + + sizeAndAlignmentRebuildFrequency 20; + + pointInsertionCriteria + { + cellCentreDistCoeff 1.75; + faceAreaRatioCoeff 0.0025; + acceptanceAngle 21.5; + } + + pointRemovalCriteria + { + cellCentreDistCoeff 0.65; + } + + faceAreaWeightModel piecewiseLinearRamp; + + piecewiseLinearRampCoeffs + { + lowerAreaFraction 0.5; + upperAreaFraction 1.0; + } +} + + +polyMeshFiltering +{ + filterEdges on; + filterFaces off; + writeTetDualMesh false; +} + + +meshQualityControls +{ + #include "meshQualityDict" +} + + +// ************************************************************************* // diff --git a/tutorials/mesh/cvMesh/flange/system/decomposeParDict b/tutorials/mesh/cvMesh/flange/system/decomposeParDict new file mode 100644 index 0000000000000000000000000000000000000000..afb5d8a226cc699ab6db67b043e65ba01103f2d7 --- /dev/null +++ b/tutorials/mesh/cvMesh/flange/system/decomposeParDict @@ -0,0 +1,46 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: dev | +| \\ / A nd | Web: www.OpenFOAM.org | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + location "system"; + object decomposeParDict; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +numberOfSubdomains 8; + +//method scotch; +method hierarchical; + +simpleCoeffs +{ + n ( 2 2 2 ); + delta 0.001; +} + +hierarchicalCoeffs +{ + n ( 2 2 2 ); + delta 0.001; + order xyz; +} + +manualCoeffs +{ + dataFile ""; +} + +distributed no; + +roots ( ); + + +// ************************************************************************* // diff --git a/tutorials/mesh/cvMesh/flange/system/faceSetDict b/tutorials/mesh/cvMesh/flange/system/faceSetDict new file mode 100644 index 0000000000000000000000000000000000000000..68666ebc86dbf5e0b216a9c6d6e51a790506f54d --- /dev/null +++ b/tutorials/mesh/cvMesh/flange/system/faceSetDict @@ -0,0 +1,35 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: dev | +| \\ / A nd | Web: www.OpenFOAM.org | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + object faceSetDict; +} + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +// Name of set to operate on +name facesToBeRemoved; + +// One of clear/new/invert/add/delete|subset/list +action new; + +// Actions to apply to pointSet. These are all the topoSetSource's ending +// in ..ToFace (see the meshTools library). +topoSetSources +( + // Select by explicitly providing face labels + labelToFace + { + value #include "../facesToBeRemoved"; + } +); + +// ************************************************************************* // diff --git a/tutorials/mesh/cvMesh/flange/system/fvSchemes b/tutorials/mesh/cvMesh/flange/system/fvSchemes new file mode 100644 index 0000000000000000000000000000000000000000..046181f3576de294a25da6429547f491989dd144 --- /dev/null +++ b/tutorials/mesh/cvMesh/flange/system/fvSchemes @@ -0,0 +1,55 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: dev | +| \\ / A nd | Web: www.OpenFOAM.org | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + location "system"; + object fvSchemes; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +ddtSchemes +{ + default none; +} + +gradSchemes +{ + default Gauss linear; +} + +divSchemes +{ + default none; +} + +laplacianSchemes +{ + default none; + laplacian(nn) Gauss linear corrected; +} + +interpolationSchemes +{ + default none; +} + +snGradSchemes +{ + default corrected; +} + +fluxRequired +{ + default no; +} + + +// ************************************************************************* // diff --git a/tutorials/mesh/cvMesh/flange/system/fvSolution b/tutorials/mesh/cvMesh/flange/system/fvSolution new file mode 100644 index 0000000000000000000000000000000000000000..6368c1229865b54c53db9d5d239567540a12540b --- /dev/null +++ b/tutorials/mesh/cvMesh/flange/system/fvSolution @@ -0,0 +1,29 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: dev | +| \\ / A nd | Web: www.OpenFOAM.org | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + location "system"; + object fvSolution; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +solvers +{ + nn + { + solver PCG; + preconditioner DIC; + tolerance 1e-06; + relTol 0; + } +} + +// ************************************************************************* // diff --git a/tutorials/mesh/cvMesh/flange/system/meshQualityDict b/tutorials/mesh/cvMesh/flange/system/meshQualityDict new file mode 100644 index 0000000000000000000000000000000000000000..4a182cc0b58b9795df86df5d6e220f285bd42595 --- /dev/null +++ b/tutorials/mesh/cvMesh/flange/system/meshQualityDict @@ -0,0 +1,73 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: dev | +| \\ / A nd | Web: www.OpenFOAM.org | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ + +FoamFile +{ + version 2.0; + format ascii; + + root ""; + case ""; + instance ""; + local ""; + + class dictionary; + object meshQualityDict; +} + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +//- Maximum non-orthogonality allowed. Set to 180 to disable. +maxNonOrtho 45; + +//- Max skewness allowed. Set to <0 to disable. +maxBoundarySkewness 50; +maxInternalSkewness 10; + +//- Max concaveness allowed. Is angle (in degrees) below which concavity +// is allowed. 0 is straight face, <0 would be convex face. +// Set to 180 to disable. +maxConcave 80; + +//- Minimum quality of the tet formed by the face-centre +// and variable base point minimum decomposition triangles and +// the cell centre. This has to be a positive number for tracking +// to work. Set to very negative number (e.g. -1E30) to +// disable. +// <0 = inside out tet, +// 0 = flat tet +// 1 = regular tet +minTetQuality 1e-30; + +//- Minimum pyramid volume. Is absolute volume of cell pyramid. +// Set to a sensible fraction of the smallest cell volume expected. +// Set to very negative number (e.g. -1E30) to disable. +minVol 0; + +//- Minimum face area. Set to <0 to disable. +minArea -1; + +//- Minimum face twist. Set to <-1 to disable. dot product of face normal +//- and face centre triangles normal +minTwist 0.001; + +//- minimum normalised cell determinant +//- 1 = hex, <= 0 = folded or flattened illegal cell +minDeterminant 0.001; + +//- minFaceWeight (0 -> 0.5) +minFaceWeight 0.02; + +//- minVolRatio (0 -> 1) +minVolRatio 0.01; + +//must be >0 for Fluent compatibility +minTriangleTwist -1; + + +// ************************************************************************* // diff --git a/tutorials/mesh/cvMesh/flange/system/snappyHexMeshDict b/tutorials/mesh/cvMesh/flange/system/snappyHexMeshDict new file mode 100644 index 0000000000000000000000000000000000000000..12c88b16c4dba21ff638a3d6c8738fb70fa44c40 --- /dev/null +++ b/tutorials/mesh/cvMesh/flange/system/snappyHexMeshDict @@ -0,0 +1,308 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: dev | +| \\ / A nd | Web: www.OpenFOAM.org | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + object snappyHexMeshDict; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +// Which of the steps to run +castellatedMesh false; +snap false; +addLayers true; + + +// Geometry. Definition of all surfaces. All surfaces are of class +// searchableSurface. +// Surfaces are used +// - to specify refinement for any mesh cell intersecting it +// - to specify refinement for any mesh cell inside/outside/near +// - to 'snap' the mesh boundary to the surface +geometry +{ +// motorBike.obj +// { +// type triSurfaceMesh; +// name motorBike; +// } +// +// refinementBox +// { +// type searchableBox; +// min (-1.0 -0.7 0.0); +// max ( 8.0 0.7 2.5); +// } +}; + + + +// Settings for the castellatedMesh generation. +castellatedMeshControls +{ + + // Refinement parameters + // ~~~~~~~~~~~~~~~~~~~~~ + + // If local number of cells is >= maxLocalCells on any processor + // switches from from refinement followed by balancing + // (current method) to (weighted) balancing before refinement. + maxLocalCells 100000; + + // Overall cell limit (approximately). Refinement will stop immediately + // upon reaching this number so a refinement level might not complete. + // Note that this is the number of cells before removing the part which + // is not 'visible' from the keepPoint. The final number of cells might + // actually be a lot less. + maxGlobalCells 2000000; + + // The surface refinement loop might spend lots of iterations refining just a + // few cells. This setting will cause refinement to stop if <= minimumRefine + // are selected for refinement. Note: it will at least do one iteration + // (unless the number of cells to refine is 0) + minRefinementCells 10; + + // Allow a certain level of imbalance during refining + // (since balancing is quite expensive) + // Expressed as fraction of perfect balance (= overall number of cells / + // nProcs). 0=balance always. + maxLoadUnbalance 0.10; + + + // Number of buffer layers between different levels. + // 1 means normal 2:1 refinement restriction, larger means slower + // refinement. + nCellsBetweenLevels 3; + + + + // Explicit feature edge refinement + // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + // Specifies a level for any cell intersected by its edges. + // This is a featureEdgeMesh, read from constant/triSurface for now. + features + ( + //{ + // file "someLine.eMesh"; + // level 2; + //} + ); + + + + // Surface based refinement + // ~~~~~~~~~~~~~~~~~~~~~~~~ + + // Specifies two levels for every surface. The first is the minimum level, + // every cell intersecting a surface gets refined up to the minimum level. + // The second level is the maximum level. Cells that 'see' multiple + // intersections where the intersections make an + // angle > resolveFeatureAngle get refined up to the maximum level. + + refinementSurfaces + { +// motorBike +// { +// // Surface-wise min and max refinement level +// level (5 6); +// +// // Optional specification of patch type (default is wall). No +// // constraint types (cyclic, symmetry) etc. are allowed. +// patchInfo +// { +// type wall; +// inGroups (motorBike); +// } +// } + } + + // Resolve sharp angles + resolveFeatureAngle 30; + + + // Region-wise refinement + // ~~~~~~~~~~~~~~~~~~~~~~ + + // Specifies refinement level for cells in relation to a surface. One of + // three modes + // - distance. 'levels' specifies per distance to the surface the + // wanted refinement level. The distances need to be specified in + // descending order. + // - inside. 'levels' is only one entry and only the level is used. All + // cells inside the surface get refined up to the level. The surface + // needs to be closed for this to be possible. + // - outside. Same but cells outside. + + refinementRegions + { +// refinementBox +// { +// mode inside; +// levels ((1E15 4)); +// } + } + + + // Mesh selection + // ~~~~~~~~~~~~~~ + + // After refinement patches get added for all refinementSurfaces and + // all cells intersecting the surfaces get put into these patches. The + // section reachable from the locationInMesh is kept. + // NOTE: This point should never be on a face, always inside a cell, even + // after refinement. + locationInMesh (-1 0 0); + + + // Whether any faceZones (as specified in the refinementSurfaces) + // are only on the boundary of corresponding cellZones or also allow + // free-standing zone faces. Not used if there are no faceZones. + allowFreeStandingZoneFaces true; +} + + + +// Settings for the snapping. +snapControls +{ + //- Number of patch smoothing iterations before finding correspondence + // to surface + nSmoothPatch 3; + + //- Relative distance for points to be attracted by surface feature point + // or edge. True distance is this factor times local + // maximum edge length. + tolerance 4.0; + + //- Number of mesh displacement relaxation iterations. + nSolveIter 0; + + //- Maximum number of snapping relaxation iterations. Should stop + // before upon reaching a correct mesh. + nRelaxIter 5; + + //- Highly experimental and wip: number of feature edge snapping + // iterations. Leave out altogether to disable. + // Do not use here since mesh resolution too low and baffles present + //nFeatureSnapIter 10; +} + + + +// Settings for the layer addition. +addLayersControls +{ + // Are the thickness parameters below relative to the undistorted + // size of the refined cell outside layer (true) or absolute sizes (false). + relativeSizes false; + + // Per final patch (so not geometry!) the layer information + layers + { + "flange.obj.*" + { + nSurfaceLayers 1; + } + } + + // Expansion factor for layer mesh + expansionRatio 1.5; + + // Wanted thickness of final added cell layer. If multiple layers + // is the thickness of the layer furthest away from the wall. + // Relative to undistorted size of cell outside layer. + // is the thickness of the layer furthest away from the wall. + // See relativeSizes parameter. + finalLayerThickness 0.0003; + + // Minimum thickness of cell layer. If for any reason layer + // cannot be above minThickness do not add layer. + // Relative to undistorted size of cell outside layer. + minThickness 0.0001; + + // If points get not extruded do nGrow layers of connected faces that are + // also not grown. This helps convergence of the layer addition process + // close to features. + // Note: changed(corrected) w.r.t 17x! (didn't do anything in 17x) + nGrow 0; + + // Advanced settings + + // When not to extrude surface. 0 is flat surface, 90 is when two faces + // are perpendicular + featureAngle 90; + + // Maximum number of snapping relaxation iterations. Should stop + // before upon reaching a correct mesh. + nRelaxIter 3; + + // Number of smoothing iterations of surface normals + nSmoothSurfaceNormals 1; + + // Number of smoothing iterations of interior mesh movement direction + nSmoothNormals 3; + + // Smooth layer thickness over surface patches + nSmoothThickness 10; + + // Stop layer growth on highly warped cells + maxFaceThicknessRatio 1000; + + // Reduce layer growth where ratio thickness to medial + // distance is large + maxThicknessToMedialRatio 0.3; + + // Angle used to pick up medial axis points + // Note: changed(corrected) w.r.t 17x! 90 degrees corresponds to 130 in 17x. + minMedianAxisAngle 90; + + + // Create buffer region for new layer terminations + nBufferCellsNoExtrude 0; + + + // Overall max number of layer addition iterations. The mesher will exit + // if it reaches this number of iterations; possibly with an illegal + // mesh. + nLayerIter 50; +} + + + +meshQualityControls +{ + // Generic mesh quality settings. At any undoable phase these determine + // where to undo. + #include "meshQualityDict" + + //- Number of error distribution iterations + nSmoothScale 4; + //- amount to scale back displacement at error points + errorReduction 0.75; +} + + +// Advanced + +// Flags for optional output +// 0 : only write final meshes +// 1 : write intermediate meshes +// 2 : write volScalarField with cellLevel for postprocessing +// 4 : write current intersections as .obj files +debug 0; + + +// Merge tolerance. Is fraction of overall bounding box of initial mesh. +// Note: the write tolerance needs to be higher than this. +mergeTolerance 1e-6; + + +// ************************************************************************* // diff --git a/tutorials/mesh/cvMesh/flange/system/surfaceFeatureExtractDict b/tutorials/mesh/cvMesh/flange/system/surfaceFeatureExtractDict new file mode 100644 index 0000000000000000000000000000000000000000..520df11958ba69a71cf8b55c16a97653b883cdd3 --- /dev/null +++ b/tutorials/mesh/cvMesh/flange/system/surfaceFeatureExtractDict @@ -0,0 +1,38 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: dev | +| \\ / A nd | Web: www.OpenFOAM.org | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + object surfaceFeatureExtractDict; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +flange.obj +{ + extractionMethod extractFromSurface; + + extractFromSurfaceCoeffs + { + // Mark edges whose adjacent surface normals are at an angle less + // than includedAngle as features + // - 0 : selects no edges + // - 180: selects all edges + includedAngle 100; + } + + + // Write options + + // Write features to obj format for postprocessing + writeObj yes; +} + + +// ************************************************************************* // diff --git a/tutorials/mesh/cvMesh/flange/system/topoSetDict-background b/tutorials/mesh/cvMesh/flange/system/topoSetDict-background new file mode 100644 index 0000000000000000000000000000000000000000..03ae10303e7b0724ba72c8fce5db5ae5611aafe3 --- /dev/null +++ b/tutorials/mesh/cvMesh/flange/system/topoSetDict-background @@ -0,0 +1,319 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: dev | +| \\ / A nd | Web: www.OpenFOAM.org | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + object topoSetDict; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +// List of actions. Each action is a dictionary with e.g. +// // name of set +// name c0; +// +// // type: pointSet/faceSet/cellSet/faceZoneSet/cellZoneSet +// type cellSet; +// +// // action to perform on set. Two types: +// // - require no source : clear/invert +// // - require source : new/add/delete/subset +// action new; +// +// The source entry varies according to the type of set: +// +// cellSet +// ~~~~~~~ +// +// // Select by explicitly providing cell labels +// source labelToCell; +// { +// value (12 13 56); // labels of cells +// } +// +// // Copy elements from cellSet +// source cellToCell; +// { +// set c1; +// } +// +// // Cells in cell zone +// source zoneToCell; +// { +// name ".*Zone"; // Name of cellZone, regular expressions allowed +// } +// +// // Cells on master or slave side of faceZone +// source faceZoneToCell; +// { +// name ".*Zone"; // Name of faceZone, regular expressions allowed +// option master; // master/slave +// } +// +// // Select based on faceSet +// source faceToCell; +// { +// set f0; // Name of faceSet +// +// //option neighbour; // cell with neighbour in faceSet +// //option owner; // ,, owner +// option any; // cell with any face in faceSet +// //option all; // cell with all faces in faceSet +// } +// +// // Select based on pointSet +// source pointToCell; +// { +// set p0; +// option any; // cell with any point in pointSet +// //option all; // cell with all points in pointSet +// } +// +// // Select based on cellShape +// source shapeToCell; +// { +// type hex; // hex/wedge/prism/pyr/tet/tetWedge/splitHex +// } +// +// // Cells with cell centre within box +// source boxToCell; +// { +// box (0 0 0) (1 1 1); +// } +// +// // Cells with cell centre within box +// // Is skewed, rotated box. Given as origin and three spanning vectors. +// source rotatedBoxToCell; +// { +// origin (0.2 0.2 -10); +// i (0.2 0.2 0); +// j (-0.2 0.2 0); +// k (10 10 10); +// } +// +// // Cells with centre within cylinder +// source cylinderToCell; +// { +// p1 (0.2 0.2 -10); // start point on cylinder axis +// p2 (0.2 0.2 0); // end point on cylinder axis +// radius 5.0; +// } +// +// // Cells with centre within sphere +// source sphereToCell; +// { +// centre (0.2 0.2 -10); +// radius 5.0; +// } +// +// // Cells with cellCentre nearest to coordinates +// source nearestToCell; +// { +// points ((0 0 0) (1 1 1)(2 2 2)); +// } +// +// // Select based on surface +// source surfaceToCell; +// { +// file "www.avl.com-geometry.stl"; +// outsidePoints ((-99 -99 -59)); // definition of outside +// includeCut false; // cells cut by surface +// includeInside false; // cells not on outside of surf +// includeOutside false; // cells on outside of surf +// nearDistance -1; // cells with centre near surf +// // (set to -1 if not used) +// curvature 0.9; // cells within nearDistance +// // and near surf curvature +// // (set to -100 if not used) +// } +// +// // values of field within certain range +// source fieldToCell; +// { +// fieldName U; // Note: uses mag(U) since volVectorField +// min 0.1; +// max 0.5; +// } +// +// // Mesh region (non-face connected part of (subset of)mesh) +// source regionToCell; +// { +// set c0; // name of cellSet giving mesh subset +// insidePoint (1 2 3); // point inside region to select +// } +// +// +// +// faceSet +// ~~~~~~~ +// +// // Copy elements from faceSet +// source faceToFace; +// { +// set f1; +// } +// +// // Select based on cellSet +// source cellToFace; +// { +// set c0; +// option all; // All faces of cells +// //option both; // Only faces whose owner&neighbour are in cellSet +// } +// +// // Select based on pointSet +// source pointToFace; +// { +// set p0; +// option any; // Faces using any point in pointSet +// //option all // Faces with all points in pointSet +// } +// +// // Select by explicitly providing face labels +// source labelToFace; +// { +// value (12 13 56); // labels of faces +// } +// +// // All faces of patch +// source patchToFace; +// { +// name ".*Wall"; // Name of patch, regular expressions allowed +// } +// +// // All faces of faceZone +// source zoneToFace; +// { +// name ".*Zone1"; // Name of faceZone, regular expressions allowed +// } +// +// // Faces with face centre within box +// source boxToFace; +// { +// box (0 0 0) (1 1 1); +// } +// +// // Faces with normal to within certain angle aligned with vector. +// source normalToFace; +// { +// normal (0 0 1); // Vector +// cos 0.01; // Tolerance (max cos of angle) +// } +// +// +// +// pointSet +// ~~~~~~~ +// +// // Copy elements from pointSet +// source pointToPoint; +// { +// set p1; +// } +// +// // Select based on cellSet +// source cellToPoint; +// { +// set c0; +// option all; // all points of cell +// } +// +// // Select based on faceSet +// source faceToPoint; +// { +// set f0; // name of faceSet +// option all; // all points of face +// } +// +// // Select by explicitly providing point labels +// source labelToPoint; +// { +// value (12 13 56); // labels of points +// } +// +// // All points in pointzone +// source zoneToPoint; +// { +// name ".*Zone"; // name of pointZone, regular expressions allowed +// } +// +// // Points nearest to coordinates +// source nearestToPoint; +// { +// points ((0 0 0) (1 1 1)); +// } +// +// // Points with coordinate within box +// source boxToPoint; +// { +// box (0 0 0) (1 1 1); +// } +// +// // Select based on surface +// source surfaceToPoint; +// { +// file "www.avl.com-geometry.stl"; +// nearDistance 0.1; // points near to surface +// includeInside false; // points on inside of surface +// // (requires closed surface with consistent +// // normals) +// includeOutside false; // ,, outside ,, +// } +// +// +// +// +// cellZoneSet +// ~~~~~~~~~~~ +// (mirrors operations on a cellSet into a cellZone) +// +// // Select based on cellSet +// source setToCellZone; +// { +// set c0; // name of cellSet +// } +// +// +// +// faceZoneSet +// ~~~~~~~~~~~ +// // Select based on faceSet without orientation +// source setToFaceZone; +// { +// set f0; // name of faceSet +// } +// +// // Select based on faceSet, using cellSet to determine orientation +// source setsToFaceZone; +// { +// faceSet f0; // name of faceSet +// cellSet c0; // name of cellSet of slave side +// } + +actions +( + { + name background; + type cellSet; + action new; + source surfaceToCell; + sourceInfo + { + file "constant/triSurface/flange.obj"; + outsidePoints ((-0.026 -0.0275 -0.0235)); + includeCut true; + includeInside true; + includeOutside false; + nearDistance -1; + curvature -100; + } + } +); + +// ************************************************************************* // diff --git a/tutorials/mesh/cvMesh/flange/system/topoSetDict-slices b/tutorials/mesh/cvMesh/flange/system/topoSetDict-slices new file mode 100644 index 0000000000000000000000000000000000000000..2b158377884d20598c8b95069b483b7a5c9b739b --- /dev/null +++ b/tutorials/mesh/cvMesh/flange/system/topoSetDict-slices @@ -0,0 +1,152 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: dev | +| \\ / A nd | Web: www.OpenFOAM.org | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + object topoSetDict; +} + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +zSlice -0.009; +ySlice 0.0; +xSlice 0.0; + +actions +( + { + name z; + type cellSet; + action new; + source boxToCell; + sourceInfo + { + box (-100 -100 $zSlice)(100 100 100); + } + } + + { + name zf; + type faceSet; + action new; + source cellToFace; + sourceInfo + { + set z; + option all; + } + } + + { + name z; + type cellSet; + action invert; + } + + { + name zf; + type faceSet; + action subset; + source cellToFace; + sourceInfo + { + set z; + option all; + } + } + + // ~~~~~~~~~~~~~~~~ // + + { + name y; + type cellSet; + action new; + source boxToCell; + sourceInfo + { + box (-100 $ySlice -100)(100 100 100); + } + } + + { + name yf; + type faceSet; + action new; + source cellToFace; + sourceInfo + { + set y; + option all; + } + } + + { + name y; + type cellSet; + action invert; + } + + { + name yf; + type faceSet; + action subset; + source cellToFace; + sourceInfo + { + set y; + option all; + } + } + + // ~~~~~~~~~~~~~~~~ // + + { + name x; + type cellSet; + action new; + source boxToCell; + sourceInfo + { + box ($xSlice -100 -100)(100 100 100); + } + } + + { + name xf; + type faceSet; + action new; + source cellToFace; + sourceInfo + { + set x; + option all; + } + } + + { + name x; + type cellSet; + action invert; + } + + { + name xf; + type faceSet; + action subset; + source cellToFace; + sourceInfo + { + set x; + option all; + } + } +); + +// ************************************************************************* // diff --git a/tutorials/mesh/cvMesh/simpleShapes/Allclean b/tutorials/mesh/cvMesh/simpleShapes/Allclean new file mode 100755 index 0000000000000000000000000000000000000000..5361756c0d83d2cb6bf35f75930d4b625fd7d142 --- /dev/null +++ b/tutorials/mesh/cvMesh/simpleShapes/Allclean @@ -0,0 +1,18 @@ +#!/bin/sh +cd ${0%/*} || exit 1 # run from this directory + +# Source tutorial run functions +. $WM_PROJECT_DIR/bin/tools/CleanFunctions + +rm -r constant/extendedFeatureEdgeMesh constant/internalDelaunayVertices > /dev/null 2>&1 +rm constant/triSurface/*.eMesh > /dev/null 2>&1 +rm constant/triSurface/*_clean* > /dev/null 2>&1 +rm -r constant/polyMesh > /dev/null 2>&1 +rm constant/targetCellSize > /dev/null 2>&1 +rm -r constant/tetDualMesh > /dev/null 2>&1 + +rm domain coneAndSphere > /dev/null 2>&1 + +cleanCase + +# ----------------------------------------------------------------- end-of-file diff --git a/tutorials/mesh/cvMesh/simpleShapes/Allrun b/tutorials/mesh/cvMesh/simpleShapes/Allrun new file mode 100755 index 0000000000000000000000000000000000000000..c37109987b9f66122fdddb9d394a3ccaea0e059a --- /dev/null +++ b/tutorials/mesh/cvMesh/simpleShapes/Allrun @@ -0,0 +1,43 @@ +#!/bin/sh +cd ${0%/*} || exit 1 # run from this directory + +# Source tutorial run functions +. $WM_PROJECT_DIR/bin/tools/RunFunctions + +# Remove any small triangles (edges < 1e-4, sliver with Q < 1e-6) from surface +# (cvMesh will try to conform to every feature). +runApplication surfaceClean \ + constant/triSurface/coneAndSphere.obj \ + 1e-4 1e-6 \ + constant/triSurface/coneAndSphere_clean.obj +mv log.surfaceClean log.surfaceClean.coneAndSphere +# Orient so point to be meshed is inside surface +runApplication surfaceOrient \ + constant/triSurface/coneAndSphere_clean.obj \ + -inside '(0 -0.5 0)' \ + constant/triSurface/coneAndSphere_clean_orient.obj +mv log.surfaceOrient log.surfaceOrient.coneAndSphere + +# Same for outside +runApplication surfaceClean \ + constant/triSurface/domain.stl \ + 1e-4 1e-6 \ + constant/triSurface/domain_clean.stl +mv log.surfaceClean log.surfaceClean.domain +runApplication surfaceOrient \ + constant/triSurface/domain_clean.stl \ + -inside '(0 -0.5 0)' \ + constant/triSurface/domain_clean_orient.stl +mv log.surfaceOrient log.surfaceOrient.domain + +unset FOAM_SIGFPE +runApplication surfaceFeatureExtract + +# Generate aligned points (in constant/internalDelaunayVertices) and a +# mesh from that. +runApplication cvMesh + +# Generate some sets for a bit of mesh inspection +runApplication topoSet -time 0:100 + +# ----------------------------------------------------------------- end-of-file diff --git a/tutorials/mesh/cvMesh/simpleShapes/constant/triSurface/cone.stl b/tutorials/mesh/cvMesh/simpleShapes/constant/triSurface/cone.stl new file mode 100644 index 0000000000000000000000000000000000000000..98e4698edbb223cbe7ea60d269b901911fdcd368 --- /dev/null +++ b/tutorials/mesh/cvMesh/simpleShapes/constant/triSurface/cone.stl @@ -0,0 +1,828 @@ +solid ascii + facet normal -1 0 0 + outer loop + vertex -0.5 0.475528 -0.154509 + vertex -0.5 0.456773 -0.203368 + vertex -0.5 0.489074 -0.103956 + endloop + endfacet + facet normal -1 0 0 + outer loop + vertex -0.5 0.489074 -0.103956 + vertex -0.5 0.456773 -0.203368 + vertex -0.5 0.497261 -0.0522642 + endloop + endfacet + facet normal -1 0 0 + outer loop + vertex -0.5 0.497261 -0.0522642 + vertex -0.5 0.456773 -0.203368 + vertex -0.5 0.5 0 + endloop + endfacet + facet normal -1 0 0 + outer loop + vertex -0.5 0.5 0 + vertex -0.5 0.456773 -0.203368 + vertex -0.5 0.497261 0.0522642 + endloop + endfacet + facet normal -1 0 0 + outer loop + vertex -0.5 0.497261 0.0522642 + vertex -0.5 0.456773 -0.203368 + vertex -0.5 0.489074 0.103956 + endloop + endfacet + facet normal -1 0 0 + outer loop + vertex -0.5 0.489074 0.103956 + vertex -0.5 0.456773 -0.203368 + vertex -0.5 0.475528 0.154509 + endloop + endfacet + facet normal -1 0 0 + outer loop + vertex -0.5 0.475528 0.154509 + vertex -0.5 0.456773 -0.203368 + vertex -0.5 0.456773 0.203368 + endloop + endfacet + facet normal -1 0 0 + outer loop + vertex -0.5 0.456773 0.203368 + vertex -0.5 0.456773 -0.203368 + vertex -0.5 0.433013 0.25 + endloop + endfacet + facet normal -1 0 0 + outer loop + vertex -0.5 0.456773 -0.203368 + vertex -0.5 0.433013 -0.25 + vertex -0.5 0.433013 0.25 + endloop + endfacet + facet normal -1 0 0 + outer loop + vertex -0.5 0.433013 0.25 + vertex -0.5 0.433013 -0.25 + vertex -0.5 0.404509 0.293893 + endloop + endfacet + facet normal -1 0 0 + outer loop + vertex -0.5 0.404509 0.293893 + vertex -0.5 0.433013 -0.25 + vertex -0.5 0.371572 0.334565 + endloop + endfacet + facet normal -1 0 0 + outer loop + vertex -0.5 0.433013 -0.25 + vertex -0.5 0.404509 -0.293893 + vertex -0.5 0.371572 0.334565 + endloop + endfacet + facet normal -1 0 0 + outer loop + vertex -0.5 0.404509 -0.293893 + vertex -0.5 0.371572 -0.334565 + vertex -0.5 0.371572 0.334565 + endloop + endfacet + facet normal -1 0 0 + outer loop + vertex -0.5 0.371572 0.334565 + vertex -0.5 0.371572 -0.334565 + vertex -0.5 0.334565 0.371572 + endloop + endfacet + facet normal -1 0 0 + outer loop + vertex -0.5 0.334565 0.371572 + vertex -0.5 0.371572 -0.334565 + vertex -0.5 0.293893 0.404509 + endloop + endfacet + facet normal -1 0 0 + outer loop + vertex -0.5 0.293893 0.404509 + vertex -0.5 0.371572 -0.334565 + vertex -0.5 0.25 0.433013 + endloop + endfacet + facet normal -1 0 0 + outer loop + vertex -0.5 0.25 0.433013 + vertex -0.5 0.371572 -0.334565 + vertex -0.5 0.203368 0.456773 + endloop + endfacet + facet normal -1 0 0 + outer loop + vertex -0.5 0.203368 0.456773 + vertex -0.5 0.371572 -0.334565 + vertex -0.5 0.154509 0.475528 + endloop + endfacet + facet normal -1 0 0 + outer loop + vertex -0.5 0.154509 0.475528 + vertex -0.5 0.371572 -0.334565 + vertex -0.5 0.103956 0.489074 + endloop + endfacet + facet normal -1 0 0 + outer loop + vertex -0.5 0.103956 0.489074 + vertex -0.5 0.371572 -0.334565 + vertex -0.5 0.0522642 0.497261 + endloop + endfacet + facet normal -1 0 0 + outer loop + vertex -0.5 0.0522642 0.497261 + vertex -0.5 0.371572 -0.334565 + vertex -0.5 -1.02552e-10 0.5 + endloop + endfacet + facet normal -1 0 0 + outer loop + vertex -0.5 -1.02552e-10 0.5 + vertex -0.5 0.371572 -0.334565 + vertex -0.5 -0.0522642 0.497261 + endloop + endfacet + facet normal -1 0 0 + outer loop + vertex -0.5 -0.0522642 0.497261 + vertex -0.5 0.371572 -0.334565 + vertex -0.5 -0.103956 0.489074 + endloop + endfacet + facet normal -1 0 0 + outer loop + vertex -0.5 -0.103956 0.489074 + vertex -0.5 0.371572 -0.334565 + vertex -0.5 -0.154509 0.475528 + endloop + endfacet + facet normal -1 0 0 + outer loop + vertex -0.5 -0.154509 0.475528 + vertex -0.5 0.371572 -0.334565 + vertex -0.5 -0.203368 0.456773 + endloop + endfacet + facet normal -1 0 0 + outer loop + vertex -0.5 -0.203368 0.456773 + vertex -0.5 0.371572 -0.334565 + vertex -0.5 -0.25 0.433013 + endloop + endfacet + facet normal -1 0 0 + outer loop + vertex -0.5 -0.25 0.433013 + vertex -0.5 0.371572 -0.334565 + vertex -0.5 -0.293893 0.404509 + endloop + endfacet + facet normal -1 0 0 + outer loop + vertex -0.5 -0.293893 0.404509 + vertex -0.5 0.371572 -0.334565 + vertex -0.5 -0.334565 0.371572 + endloop + endfacet + facet normal -1 0 0 + outer loop + vertex -0.5 -0.334565 0.371572 + vertex -0.5 0.371572 -0.334565 + vertex -0.5 -0.371572 0.334565 + endloop + endfacet + facet normal -1 0 0 + outer loop + vertex -0.5 -0.371572 0.334565 + vertex -0.5 0.371572 -0.334565 + vertex -0.5 -0.404509 0.293893 + endloop + endfacet + facet normal -1 0 0 + outer loop + vertex -0.5 -0.404509 0.293893 + vertex -0.5 0.371572 -0.334565 + vertex -0.5 -0.433013 0.25 + endloop + endfacet + facet normal -1 0 0 + outer loop + vertex -0.5 -0.433013 0.25 + vertex -0.5 0.371572 -0.334565 + vertex -0.5 -0.456773 0.203368 + endloop + endfacet + facet normal -1 0 0 + outer loop + vertex -0.5 -0.456773 0.203368 + vertex -0.5 0.371572 -0.334565 + vertex -0.5 -0.475528 0.154509 + endloop + endfacet + facet normal -1 0 0 + outer loop + vertex -0.5 -0.475528 0.154509 + vertex -0.5 0.371572 -0.334565 + vertex -0.5 -0.489074 0.103956 + endloop + endfacet + facet normal -1 0 0 + outer loop + vertex -0.5 -0.489074 0.103956 + vertex -0.5 0.371572 -0.334565 + vertex -0.5 -0.497261 0.0522642 + endloop + endfacet + facet normal -1 0 0 + outer loop + vertex -0.5 -0.497261 0.0522642 + vertex -0.5 0.371572 -0.334565 + vertex -0.5 -0.5 -2.05103e-10 + endloop + endfacet + facet normal -1 0 0 + outer loop + vertex -0.5 -0.5 -2.05103e-10 + vertex -0.5 0.371572 -0.334565 + vertex -0.5 -0.497261 -0.0522642 + endloop + endfacet + facet normal -1 0 0 + outer loop + vertex -0.5 -0.497261 -0.0522642 + vertex -0.5 0.371572 -0.334565 + vertex -0.5 -0.489074 -0.103956 + endloop + endfacet + facet normal -1 0 0 + outer loop + vertex -0.5 -0.489074 -0.103956 + vertex -0.5 0.371572 -0.334565 + vertex -0.5 -0.475528 -0.154509 + endloop + endfacet + facet normal -1 0 0 + outer loop + vertex -0.5 -0.475528 -0.154509 + vertex -0.5 0.371572 -0.334565 + vertex -0.5 -0.456773 -0.203368 + endloop + endfacet + facet normal -1 0 0 + outer loop + vertex -0.5 -0.456773 -0.203368 + vertex -0.5 0.371572 -0.334565 + vertex -0.5 -0.433013 -0.25 + endloop + endfacet + facet normal -1 0 0 + outer loop + vertex -0.5 -0.433013 -0.25 + vertex -0.5 0.371572 -0.334565 + vertex -0.5 -0.404509 -0.293893 + endloop + endfacet + facet normal -1 0 0 + outer loop + vertex -0.5 -0.404509 -0.293893 + vertex -0.5 0.371572 -0.334565 + vertex -0.5 -0.371572 -0.334565 + endloop + endfacet + facet normal -1 -0 0 + outer loop + vertex -0.5 -0.371572 -0.334565 + vertex -0.5 0.371572 -0.334565 + vertex -0.5 -0.334565 -0.371572 + endloop + endfacet + facet normal -1 0 0 + outer loop + vertex -0.5 -0.334565 -0.371572 + vertex -0.5 0.371572 -0.334565 + vertex -0.5 -0.293893 -0.404509 + endloop + endfacet + facet normal -1 0 0 + outer loop + vertex -0.5 -0.293893 -0.404509 + vertex -0.5 0.371572 -0.334565 + vertex -0.5 -0.25 -0.433013 + endloop + endfacet + facet normal -1 0 0 + outer loop + vertex -0.5 -0.25 -0.433013 + vertex -0.5 0.371572 -0.334565 + vertex -0.5 -0.203368 -0.456773 + endloop + endfacet + facet normal -1 0 0 + outer loop + vertex -0.5 -0.203368 -0.456773 + vertex -0.5 0.371572 -0.334565 + vertex -0.5 -0.154509 -0.475528 + endloop + endfacet + facet normal -1 0 0 + outer loop + vertex -0.5 -0.154509 -0.475528 + vertex -0.5 0.371572 -0.334565 + vertex -0.5 -0.103956 -0.489074 + endloop + endfacet + facet normal -1 0 0 + outer loop + vertex -0.5 -0.103956 -0.489074 + vertex -0.5 0.371572 -0.334565 + vertex -0.5 -0.0522642 -0.497261 + endloop + endfacet + facet normal -1 0 0 + outer loop + vertex -0.5 -0.0522642 -0.497261 + vertex -0.5 0.371572 -0.334565 + vertex -0.5 3.07655e-10 -0.5 + endloop + endfacet + facet normal -1 0 0 + outer loop + vertex -0.5 3.07655e-10 -0.5 + vertex -0.5 0.371572 -0.334565 + vertex -0.5 0.0522642 -0.497261 + endloop + endfacet + facet normal -1 0 0 + outer loop + vertex -0.5 0.0522642 -0.497261 + vertex -0.5 0.371572 -0.334565 + vertex -0.5 0.103956 -0.489074 + endloop + endfacet + facet normal -1 0 0 + outer loop + vertex -0.5 0.103956 -0.489074 + vertex -0.5 0.371572 -0.334565 + vertex -0.5 0.154509 -0.475528 + endloop + endfacet + facet normal -1 -0 0 + outer loop + vertex -0.5 0.371572 -0.334565 + vertex -0.5 0.334565 -0.371572 + vertex -0.5 0.154509 -0.475528 + endloop + endfacet + facet normal -1 -0 0 + outer loop + vertex -0.5 0.334565 -0.371572 + vertex -0.5 0.293893 -0.404509 + vertex -0.5 0.154509 -0.475528 + endloop + endfacet + facet normal -1 -0 0 + outer loop + vertex -0.5 0.293893 -0.404509 + vertex -0.5 0.25 -0.433013 + vertex -0.5 0.154509 -0.475528 + endloop + endfacet + facet normal -1 0 0 + outer loop + vertex -0.5 0.203368 -0.456773 + vertex -0.5 0.154509 -0.475528 + vertex -0.5 0.25 -0.433013 + endloop + endfacet + facet normal 0.446723 0.893446 0.0468234 + outer loop + vertex 0.5 0 0 + vertex -0.5 0.5 0 + vertex -0.5 0.497261 0.0522642 + endloop + endfacet + facet normal 0.446723 0.883657 0.139958 + outer loop + vertex 0.5 0 0 + vertex -0.5 0.497261 0.0522642 + vertex -0.5 0.489074 0.103956 + endloop + endfacet + facet normal 0.446723 0.864187 0.231558 + outer loop + vertex 0.5 0 0 + vertex -0.5 0.489074 0.103956 + vertex -0.5 0.475528 0.154509 + endloop + endfacet + facet normal 0.446723 0.835248 0.320622 + outer loop + vertex 0.5 0 0 + vertex -0.5 0.475528 0.154509 + vertex -0.5 0.456773 0.203368 + endloop + endfacet + facet normal 0.446723 0.797159 0.406173 + outer loop + vertex 0.5 0 0 + vertex -0.5 0.456773 0.203368 + vertex -0.5 0.433013 0.25 + endloop + endfacet + facet normal 0.446723 0.750335 0.487273 + outer loop + vertex 0.5 0 0 + vertex -0.5 0.433013 0.25 + vertex -0.5 0.404509 0.293893 + endloop + endfacet + facet normal 0.446723 0.695291 0.563036 + outer loop + vertex 0.5 0 0 + vertex -0.5 0.404509 0.293893 + vertex -0.5 0.371572 0.334565 + endloop + endfacet + facet normal 0.446723 0.632629 0.632629 + outer loop + vertex 0.5 0 0 + vertex -0.5 0.371572 0.334565 + vertex -0.5 0.334565 0.371572 + endloop + endfacet + facet normal 0.446723 0.563036 0.695291 + outer loop + vertex 0.5 0 0 + vertex -0.5 0.334565 0.371572 + vertex -0.5 0.293893 0.404509 + endloop + endfacet + facet normal 0.446723 0.487273 0.750335 + outer loop + vertex 0.5 0 0 + vertex -0.5 0.293893 0.404509 + vertex -0.5 0.25 0.433013 + endloop + endfacet + facet normal 0.446723 0.406173 0.797159 + outer loop + vertex 0.5 0 0 + vertex -0.5 0.25 0.433013 + vertex -0.5 0.203368 0.456773 + endloop + endfacet + facet normal 0.446723 0.320622 0.835248 + outer loop + vertex 0.5 0 0 + vertex -0.5 0.203368 0.456773 + vertex -0.5 0.154509 0.475528 + endloop + endfacet + facet normal 0.446723 0.231558 0.864187 + outer loop + vertex 0.5 0 0 + vertex -0.5 0.154509 0.475528 + vertex -0.5 0.103956 0.489074 + endloop + endfacet + facet normal 0.446723 0.139958 0.883657 + outer loop + vertex 0.5 0 0 + vertex -0.5 0.103956 0.489074 + vertex -0.5 0.0522642 0.497261 + endloop + endfacet + facet normal 0.446723 0.0468234 0.893446 + outer loop + vertex 0.5 0 0 + vertex -0.5 0.0522642 0.497261 + vertex -0.5 -1.02552e-10 0.5 + endloop + endfacet + facet normal 0.446723 -0.0468234 0.893446 + outer loop + vertex 0.5 0 0 + vertex -0.5 -1.02552e-10 0.5 + vertex -0.5 -0.0522642 0.497261 + endloop + endfacet + facet normal 0.446723 -0.139958 0.883657 + outer loop + vertex 0.5 0 0 + vertex -0.5 -0.0522642 0.497261 + vertex -0.5 -0.103956 0.489074 + endloop + endfacet + facet normal 0.446723 -0.231558 0.864187 + outer loop + vertex 0.5 0 0 + vertex -0.5 -0.103956 0.489074 + vertex -0.5 -0.154509 0.475528 + endloop + endfacet + facet normal 0.446723 -0.320622 0.835248 + outer loop + vertex 0.5 0 0 + vertex -0.5 -0.154509 0.475528 + vertex -0.5 -0.203368 0.456773 + endloop + endfacet + facet normal 0.446723 -0.406173 0.797159 + outer loop + vertex 0.5 0 0 + vertex -0.5 -0.203368 0.456773 + vertex -0.5 -0.25 0.433013 + endloop + endfacet + facet normal 0.446723 -0.487273 0.750335 + outer loop + vertex 0.5 0 0 + vertex -0.5 -0.25 0.433013 + vertex -0.5 -0.293893 0.404509 + endloop + endfacet + facet normal 0.446723 -0.563036 0.695291 + outer loop + vertex 0.5 0 0 + vertex -0.5 -0.293893 0.404509 + vertex -0.5 -0.334565 0.371572 + endloop + endfacet + facet normal 0.446723 -0.632629 0.632629 + outer loop + vertex 0.5 0 0 + vertex -0.5 -0.334565 0.371572 + vertex -0.5 -0.371572 0.334565 + endloop + endfacet + facet normal 0.446723 -0.695291 0.563036 + outer loop + vertex 0.5 0 0 + vertex -0.5 -0.371572 0.334565 + vertex -0.5 -0.404509 0.293893 + endloop + endfacet + facet normal 0.446723 -0.750335 0.487273 + outer loop + vertex 0.5 0 0 + vertex -0.5 -0.404509 0.293893 + vertex -0.5 -0.433013 0.25 + endloop + endfacet + facet normal 0.446723 -0.797159 0.406173 + outer loop + vertex 0.5 0 0 + vertex -0.5 -0.433013 0.25 + vertex -0.5 -0.456773 0.203368 + endloop + endfacet + facet normal 0.446723 -0.835248 0.320622 + outer loop + vertex 0.5 0 0 + vertex -0.5 -0.456773 0.203368 + vertex -0.5 -0.475528 0.154509 + endloop + endfacet + facet normal 0.446723 -0.864187 0.231558 + outer loop + vertex 0.5 0 0 + vertex -0.5 -0.475528 0.154509 + vertex -0.5 -0.489074 0.103956 + endloop + endfacet + facet normal 0.446723 -0.883657 0.139958 + outer loop + vertex 0.5 0 0 + vertex -0.5 -0.489074 0.103956 + vertex -0.5 -0.497261 0.0522642 + endloop + endfacet + facet normal 0.446723 -0.893446 0.0468234 + outer loop + vertex 0.5 0 0 + vertex -0.5 -0.497261 0.0522642 + vertex -0.5 -0.5 -2.05103e-10 + endloop + endfacet + facet normal 0.446723 -0.893446 -0.0468234 + outer loop + vertex 0.5 0 0 + vertex -0.5 -0.5 -2.05103e-10 + vertex -0.5 -0.497261 -0.0522642 + endloop + endfacet + facet normal 0.446723 -0.883657 -0.139958 + outer loop + vertex 0.5 0 0 + vertex -0.5 -0.497261 -0.0522642 + vertex -0.5 -0.489074 -0.103956 + endloop + endfacet + facet normal 0.446723 -0.864187 -0.231558 + outer loop + vertex 0.5 0 0 + vertex -0.5 -0.489074 -0.103956 + vertex -0.5 -0.475528 -0.154509 + endloop + endfacet + facet normal 0.446723 -0.835248 -0.320622 + outer loop + vertex 0.5 0 0 + vertex -0.5 -0.475528 -0.154509 + vertex -0.5 -0.456773 -0.203368 + endloop + endfacet + facet normal 0.446723 -0.797159 -0.406173 + outer loop + vertex 0.5 0 0 + vertex -0.5 -0.456773 -0.203368 + vertex -0.5 -0.433013 -0.25 + endloop + endfacet + facet normal 0.446723 -0.750335 -0.487273 + outer loop + vertex 0.5 0 0 + vertex -0.5 -0.433013 -0.25 + vertex -0.5 -0.404509 -0.293893 + endloop + endfacet + facet normal 0.446723 -0.695291 -0.563036 + outer loop + vertex 0.5 0 0 + vertex -0.5 -0.404509 -0.293893 + vertex -0.5 -0.371572 -0.334565 + endloop + endfacet + facet normal 0.446723 -0.632629 -0.632629 + outer loop + vertex 0.5 0 0 + vertex -0.5 -0.371572 -0.334565 + vertex -0.5 -0.334565 -0.371572 + endloop + endfacet + facet normal 0.446723 -0.563036 -0.695291 + outer loop + vertex 0.5 0 0 + vertex -0.5 -0.334565 -0.371572 + vertex -0.5 -0.293893 -0.404509 + endloop + endfacet + facet normal 0.446723 -0.487273 -0.750335 + outer loop + vertex 0.5 0 0 + vertex -0.5 -0.293893 -0.404509 + vertex -0.5 -0.25 -0.433013 + endloop + endfacet + facet normal 0.446723 -0.406173 -0.797159 + outer loop + vertex 0.5 0 0 + vertex -0.5 -0.25 -0.433013 + vertex -0.5 -0.203368 -0.456773 + endloop + endfacet + facet normal 0.446723 -0.320622 -0.835248 + outer loop + vertex 0.5 0 0 + vertex -0.5 -0.203368 -0.456773 + vertex -0.5 -0.154509 -0.475528 + endloop + endfacet + facet normal 0.446723 -0.231558 -0.864187 + outer loop + vertex 0.5 0 0 + vertex -0.5 -0.154509 -0.475528 + vertex -0.5 -0.103956 -0.489074 + endloop + endfacet + facet normal 0.446723 -0.139958 -0.883657 + outer loop + vertex 0.5 0 0 + vertex -0.5 -0.103956 -0.489074 + vertex -0.5 -0.0522642 -0.497261 + endloop + endfacet + facet normal 0.446723 -0.0468234 -0.893446 + outer loop + vertex 0.5 0 0 + vertex -0.5 -0.0522642 -0.497261 + vertex -0.5 3.07655e-10 -0.5 + endloop + endfacet + facet normal 0.446723 0.0468234 -0.893446 + outer loop + vertex 0.5 0 0 + vertex -0.5 3.07655e-10 -0.5 + vertex -0.5 0.0522642 -0.497261 + endloop + endfacet + facet normal 0.446723 0.139958 -0.883657 + outer loop + vertex 0.5 0 0 + vertex -0.5 0.0522642 -0.497261 + vertex -0.5 0.103956 -0.489074 + endloop + endfacet + facet normal 0.446723 0.231558 -0.864187 + outer loop + vertex 0.5 0 0 + vertex -0.5 0.103956 -0.489074 + vertex -0.5 0.154509 -0.475528 + endloop + endfacet + facet normal 0.446723 0.320622 -0.835248 + outer loop + vertex 0.5 0 0 + vertex -0.5 0.154509 -0.475528 + vertex -0.5 0.203368 -0.456773 + endloop + endfacet + facet normal 0.446723 0.406173 -0.797159 + outer loop + vertex 0.5 0 0 + vertex -0.5 0.203368 -0.456773 + vertex -0.5 0.25 -0.433013 + endloop + endfacet + facet normal 0.446723 0.487273 -0.750335 + outer loop + vertex 0.5 0 0 + vertex -0.5 0.25 -0.433013 + vertex -0.5 0.293893 -0.404509 + endloop + endfacet + facet normal 0.446723 0.563036 -0.695291 + outer loop + vertex 0.5 0 0 + vertex -0.5 0.293893 -0.404509 + vertex -0.5 0.334565 -0.371572 + endloop + endfacet + facet normal 0.446723 0.632629 -0.632629 + outer loop + vertex 0.5 0 0 + vertex -0.5 0.334565 -0.371572 + vertex -0.5 0.371572 -0.334565 + endloop + endfacet + facet normal 0.446723 0.695291 -0.563036 + outer loop + vertex 0.5 0 0 + vertex -0.5 0.371572 -0.334565 + vertex -0.5 0.404509 -0.293893 + endloop + endfacet + facet normal 0.446723 0.750335 -0.487273 + outer loop + vertex 0.5 0 0 + vertex -0.5 0.404509 -0.293893 + vertex -0.5 0.433013 -0.25 + endloop + endfacet + facet normal 0.446723 0.797159 -0.406173 + outer loop + vertex 0.5 0 0 + vertex -0.5 0.433013 -0.25 + vertex -0.5 0.456773 -0.203368 + endloop + endfacet + facet normal 0.446723 0.835248 -0.320622 + outer loop + vertex 0.5 0 0 + vertex -0.5 0.456773 -0.203368 + vertex -0.5 0.475528 -0.154509 + endloop + endfacet + facet normal 0.446723 0.864187 -0.231558 + outer loop + vertex 0.5 0 0 + vertex -0.5 0.475528 -0.154509 + vertex -0.5 0.489074 -0.103956 + endloop + endfacet + facet normal 0.446723 0.883657 -0.139958 + outer loop + vertex 0.5 0 0 + vertex -0.5 0.489074 -0.103956 + vertex -0.5 0.497261 -0.0522642 + endloop + endfacet + facet normal 0.446723 0.893446 -0.0468234 + outer loop + vertex 0.5 0 0 + vertex -0.5 0.497261 -0.0522642 + vertex -0.5 0.5 0 + endloop + endfacet +endsolid diff --git a/tutorials/mesh/cvMesh/simpleShapes/constant/triSurface/coneAndSphere.obj b/tutorials/mesh/cvMesh/simpleShapes/constant/triSurface/coneAndSphere.obj new file mode 100644 index 0000000000000000000000000000000000000000..d90d10e85faf369f8cb5347a328e1ba3889e63d2 --- /dev/null +++ b/tutorials/mesh/cvMesh/simpleShapes/constant/triSurface/coneAndSphere.obj @@ -0,0 +1,1489 @@ +# Wavefront OBJ file +# Regions: +# 0 patch0 +# +# points : 495 +# triangles : 986 +# +v -0.5 0.371572 0.334565 +v -0.5 0.371572 -0.334565 +v -0.5 0.334565 0.371572 +v -0.5 -0.334565 0.371572 +v -0.5 -0.371572 0.334565 +v -0.5 -0.371572 -0.334565 +v -0.5 -0.334565 -0.371572 +v -0.5 0.334565 -0.371572 +v -0.5 0.475528 -0.154509 +v -0.5 0.475528 0.154509 +v -0.5 0.154509 0.475528 +v -0.5 -0.154509 0.475528 +v -0.5 -0.475528 0.154509 +v -0.5 -0.475528 -0.154509 +v -0.5 -0.154509 -0.475528 +v -0.5 0.154509 -0.475528 +v -0.5 0.5 0 +v -0.5 -1.02552e-10 0.5 +v -0.5 -0.5 -2.05103e-10 +v -0.5 3.07655e-10 -0.5 +v -0.5 0.497261 -0.0522642 +v -0.5 0.497261 0.0522642 +v -0.5 0.0522642 0.497261 +v -0.5 -0.0522642 0.497261 +v -0.5 -0.497261 0.0522642 +v -0.5 -0.497261 -0.0522642 +v -0.5 -0.0522642 -0.497261 +v -0.5 0.0522642 -0.497261 +v -0.5 0.456773 -0.203368 +v -0.5 0.456773 0.203368 +v -0.5 0.203368 0.456773 +v -0.5 -0.203368 0.456773 +v -0.5 -0.456773 0.203368 +v -0.5 -0.456773 -0.203368 +v -0.5 -0.203368 -0.456773 +v -0.5 0.203368 -0.456773 +v -0.5 0.489074 -0.103956 +v -0.5 0.489074 0.103956 +v -0.5 0.103956 0.489074 +v -0.5 -0.103956 0.489074 +v -0.5 -0.489074 0.103956 +v -0.5 -0.489074 -0.103956 +v -0.5 -0.103956 -0.489074 +v -0.5 0.103956 -0.489074 +v -0.5 0.433013 0.25 +v -0.5 0.433013 -0.25 +v -0.5 0.25 0.433013 +v -0.5 -0.25 0.433013 +v -0.5 -0.433013 0.25 +v -0.5 -0.433013 -0.25 +v -0.5 -0.25 -0.433013 +v -0.5 0.25 -0.433013 +v -0.5 0.404509 0.293893 +v -0.5 0.404509 -0.293893 +v -0.5 0.293893 0.404509 +v -0.5 -0.293893 0.404509 +v -0.5 -0.404509 0.293893 +v -0.5 -0.404509 -0.293893 +v -0.5 -0.293893 -0.404509 +v -0.5 0.293893 -0.404509 +v 0.139023 0.150219 0.122743 +v 0.139023 0.150219 -0.122743 +v 0.164524 0.158505 0.200848 +v 0.164524 0.158505 -0.200848 +v 0.229562 0.0308609 0.200848 +v 0.229562 0.0308609 -0.200848 +v 0.101708 0.3 0.0412897 +v 0.101708 0.3 -0.0412897 +v 0.307111 -0.103127 0.0412897 +v 0.307111 -0.103127 -0.0412897 +v 0.1153 0.3 0.122743 +v 0.1153 0.3 -0.122743 +v 0.3151 -0.0921307 0.122743 +v 0.3151 -0.0921307 -0.122743 +v 0.201904 0.170651 0.273474 +v 0.201904 0.170651 -0.273474 +v 0.261359 0.0539629 0.273474 +v 0.261359 0.0539629 -0.273474 +v 0.142113 0.3 0.200848 +v 0.142113 0.3 -0.200848 +v 0.330861 -0.0704381 0.200848 +v 0.330861 -0.0704381 -0.200848 +v 0.181417 0.3 0.273474 +v 0.181417 0.3 -0.273474 +v 0.353963 -0.038641 0.273474 +v 0.353963 -0.038641 -0.273474 +v 0.250142 0.186324 0.338641 +v 0.250143 0.186324 -0.338641 +v 0.302393 0.0837761 0.338641 +v 0.302393 0.0837761 -0.338641 +v 0.126096 0.453981 0.0412897 +v 0.126096 0.453981 -0.0412897 +v 0.446019 -0.173904 0.0412897 +v 0.446019 -0.173904 -0.0412897 +v 0.139023 0.449781 0.122743 +v 0.139023 0.449781 -0.122743 +v 0.450219 -0.160977 0.122743 +v 0.450219 -0.160977 -0.122743 +v 0.232138 0.3 0.338641 +v 0.232138 0.3 -0.338641 +v 0.383776 0.0023934 0.338641 +v 0.383776 0.00239342 -0.338641 +v 0.164524 0.441495 0.200848 +v 0.164524 0.441495 -0.200848 +v 0.458505 -0.135476 0.200848 +v 0.458505 -0.135476 -0.200848 +v 0.307925 0.205099 0.39457 +v 0.307925 0.205099 -0.39457 +v 0.351546 0.119487 0.39457 +v 0.351546 0.119487 -0.39457 +v 0.201904 0.429349 0.273474 +v 0.201904 0.429349 -0.273474 +v 0.470651 -0.0980963 0.273474 +v 0.470651 -0.0980963 -0.273474 +v 0.292894 0.3 0.39457 +v 0.292894 0.3 -0.39457 +v 0.419487 0.0515457 0.39457 +v 0.419487 0.0515457 -0.39457 +v 0.250142 0.413676 0.338641 +v 0.250143 0.413676 -0.338641 +v 0.486324 -0.0498575 0.338641 +v 0.486324 -0.0498575 -0.338641 +v 0.373674 0.226462 0.439737 +v 0.373674 0.226462 -0.439737 +v 0.407475 0.160123 0.439737 +v 0.407475 0.160123 -0.439737 +v 0.196873 0.592889 0.0412897 +v 0.196873 0.592889 -0.0412897 +v 0.207869 0.5849 0.122743 +v 0.207869 0.5849 -0.122743 +v 0.6 -0.198292 0.0412897 +v 0.6 -0.198292 -0.0412897 +v 0.307924 0.394901 0.39457 +v 0.307925 0.394901 -0.39457 +v 0.6 -0.1847 0.122743 +v 0.6 -0.1847 -0.122743 +v 0.505099 0.00792448 0.39457 +v 0.505099 0.00792451 -0.39457 +v 0.362026 0.3 0.439737 +v 0.362026 0.3 -0.439737 +v 0.460123 0.107475 0.439737 +v 0.460123 0.107475 -0.439737 +v 0.229562 0.569139 0.200848 +v 0.229562 0.569139 -0.200848 +v 0.6 -0.157887 0.200848 +v 0.6 -0.157887 -0.200848 +v 0.261359 0.546037 0.273474 +v 0.261359 0.546037 -0.273474 +v 0.6 -0.118583 0.273474 +v 0.6 -0.118583 -0.273474 +v 0.373674 0.373538 0.439737 +v 0.373674 0.373538 -0.439737 +v 0.302393 0.516224 0.338641 +v 0.302393 0.516224 -0.338641 +v 0.526462 0.0736736 0.439737 +v 0.526462 0.0736736 -0.439737 +v 0.6 -0.0678619 -0.338641 +v 0.6 -0.067862 0.338641 +v 0.445596 0.249831 0.472909 +v 0.445596 0.249831 -0.472909 +v 0.468656 0.204573 0.472909 +v 0.468656 0.204573 -0.472909 +v 0.43765 0.3 0.472909 +v 0.43765 0.3 -0.472909 +v 0.504573 0.168656 0.472909 +v 0.504573 0.168656 -0.472909 +v 0.351546 0.480513 0.39457 +v 0.351546 0.480513 -0.39457 +v 0.6 -0.00710633 -0.39457 +v 0.6 -0.00710636 0.39457 +v 0.445596 0.350169 0.472909 +v 0.445596 0.350169 -0.472909 +v 0.549831 0.145596 0.472909 +v 0.549831 0.145596 -0.472909 +v 0.407475 0.439877 0.439737 +v 0.407475 0.439877 -0.439737 +v 0.6 0.0620263 0.439737 +v 0.6 0.0620263 -0.439737 +v 0.307111 0.703127 0.0412897 +v 0.307111 0.703127 -0.0412897 +v 0.521731 0.274569 0.493181 +v 0.521731 0.274569 -0.493181 +v 0.53342 0.251627 0.493181 +v 0.53342 0.251627 -0.493181 +v 0.3151 0.692131 0.122743 +v 0.3151 0.692131 -0.122743 +v 0.330861 0.670438 0.200848 +v 0.330861 0.670438 -0.200848 +v 0.468656 0.395427 0.472909 +v 0.468656 0.395427 -0.472909 +v 0.753981 -0.173904 0.0412897 +v 0.753981 -0.173904 -0.0412897 +v 0.517703 0.3 0.493181 +v 0.517703 0.3 -0.493181 +v 0.551627 0.23342 0.493181 +v 0.551627 0.23342 -0.493181 +v 0.6 0.13765 0.472909 +v 0.6 0.13765 -0.472909 +v 0.749781 -0.160977 0.122743 +v 0.749781 -0.160977 -0.122743 +v 0.353963 0.638641 0.273474 +v 0.353963 0.638641 -0.273474 +v 0.741495 -0.135476 0.200848 +v 0.741495 -0.135476 -0.200848 +v 0.729349 -0.0980963 0.273474 +v 0.729349 -0.0980963 -0.273474 +v 0.383776 0.597607 0.338641 +v 0.383776 0.597607 -0.338641 +v 0.521731 0.325431 0.493181 +v 0.521731 0.325431 -0.493181 +v 0.574569 0.221731 0.493181 +v 0.574569 0.221731 -0.493181 +v 0.713676 -0.0498575 0.338641 +v 0.713676 -0.0498575 -0.338641 +v 0.419487 0.548454 0.39457 +v 0.419487 0.548454 -0.39457 +v 0.694901 0.0079245 0.39457 +v 0.694901 0.00792454 -0.39457 +v 0.460123 0.492525 0.439737 +v 0.460123 0.492525 -0.439737 +v 0.53342 0.348373 0.493181 +v 0.53342 0.348373 -0.493181 +v 0.6 0.217703 0.493181 +v 0.6 0.217703 -0.493181 +v 0.673538 0.0736736 0.439737 +v 0.673538 0.0736736 -0.439737 +v 0.504573 0.431344 0.472909 +v 0.504573 0.431344 -0.472909 +v 0.650169 0.145596 0.472909 +v 0.650169 0.145596 -0.472909 +v 0.551627 0.36658 0.493181 +v 0.551627 0.36658 -0.493181 +v 0.625431 0.221731 0.493181 +v 0.625431 0.221731 -0.493181 +v 0.6 0.3 0.5 +v 0.6 0.3 -0.5 +v 0.574569 0.378269 0.493181 +v 0.574569 0.378269 -0.493181 +v 0.648373 0.23342 0.493181 +v 0.648373 0.23342 -0.493181 +v 0.549831 0.454404 0.472909 +v 0.549831 0.454404 -0.472909 +v 0.695427 0.168656 0.472909 +v 0.695427 0.168656 -0.472909 +v 0.526462 0.526326 0.439737 +v 0.526462 0.526326 -0.439737 +v 0.6 0.382297 0.493181 +v 0.6 0.382297 -0.493181 +v 0.66658 0.251627 0.493181 +v 0.66658 0.251627 -0.493181 +v 0.739877 0.107475 0.439737 +v 0.739877 0.107475 -0.439737 +v 0.505099 0.592075 -0.39457 +v 0.505099 0.592076 0.39457 +v 0.780513 0.0515458 0.39457 +v 0.780513 0.0515458 -0.39457 +v 0.486324 0.649857 -0.338641 +v 0.486324 0.649858 0.338641 +v 0.625431 0.378269 0.493181 +v 0.625431 0.378269 -0.493181 +v 0.678269 0.274569 0.493181 +v 0.678269 0.274569 -0.493181 +v 0.816224 0.00239345 0.338641 +v 0.816224 0.00239348 -0.338641 +v 0.470651 0.698096 0.273474 +v 0.470651 0.698096 -0.273474 +v 0.458505 0.735476 0.200848 +v 0.458505 0.735476 -0.200848 +v 0.846037 -0.0386409 0.273474 +v 0.846037 -0.0386409 -0.273474 +v 0.450219 0.760977 0.122743 +v 0.450219 0.760977 -0.122743 +v 0.6 0.46235 0.472909 +v 0.6 0.46235 -0.472909 +v 0.648373 0.36658 0.493181 +v 0.648373 0.36658 -0.493181 +v 0.682297 0.3 0.493181 +v 0.682297 0.3 -0.493181 +v 0.446019 0.773904 0.0412897 +v 0.446019 0.773904 -0.0412897 +v 0.731344 0.204573 0.472909 +v 0.731344 0.204573 -0.472909 +v 0.869139 -0.070438 -0.200848 +v 0.869139 -0.0704381 0.200848 +v 0.8849 -0.0921306 0.122743 +v 0.8849 -0.0921306 -0.122743 +v 0.66658 0.348373 0.493181 +v 0.66658 0.348373 -0.493181 +v 0.678269 0.325431 0.493181 +v 0.678269 0.325431 -0.493181 +v 0.892889 -0.103127 0.0412897 +v 0.892889 -0.103127 -0.0412897 +v 0.6 0.537974 0.439737 +v 0.6 0.537974 -0.439737 +v 0.792525 0.160123 0.439737 +v 0.792525 0.160123 -0.439737 +v 0.650169 0.454404 0.472909 +v 0.650169 0.454404 -0.472909 +v 0.754404 0.249831 0.472909 +v 0.754404 0.249831 -0.472909 +v 0.6 0.607106 0.39457 +v 0.6 0.607106 -0.39457 +v 0.848454 0.119487 0.39457 +v 0.848454 0.119487 -0.39457 +v 0.695427 0.431344 0.472909 +v 0.695427 0.431344 -0.472909 +v 0.76235 0.3 0.472909 +v 0.76235 0.3 -0.472909 +v 0.731344 0.395427 0.472909 +v 0.731344 0.395427 -0.472909 +v 0.754404 0.350169 0.472909 +v 0.754404 0.350169 -0.472909 +v 0.6 0.667862 0.338641 +v 0.6 0.667862 -0.338641 +v 0.673538 0.526326 0.439737 +v 0.673538 0.526326 -0.439737 +v 0.897607 0.0837762 0.338641 +v 0.897607 0.0837762 -0.338641 +v 0.826326 0.226462 0.439737 +v 0.826326 0.226462 -0.439737 +v 0.6 0.718583 0.273474 +v 0.6 0.718583 -0.273474 +v 0.938641 0.053963 0.273474 +v 0.938641 0.053963 -0.273474 +v 0.6 0.757887 0.200848 +v 0.6 0.757887 -0.200848 +v 0.970438 0.030861 0.200848 +v 0.970438 0.030861 -0.200848 +v 0.739877 0.492525 0.439737 +v 0.739877 0.492525 -0.439737 +v 0.837974 0.3 0.439737 +v 0.837974 0.3 -0.439737 +v 0.694901 0.592075 -0.39457 +v 0.694901 0.592076 0.39457 +v 0.6 0.7847 0.122743 +v 0.6 0.7847 -0.122743 +v 0.892075 0.205099 -0.39457 +v 0.892076 0.205099 0.39457 +v 0.6 0.798292 0.0412897 +v 0.6 0.798292 -0.0412897 +v 0.992131 0.0151005 0.122743 +v 0.992131 0.0151005 -0.122743 +v 1.00313 0.00711123 0.0412897 +v 1.00313 0.00711123 -0.0412897 +v 0.792525 0.439877 0.439737 +v 0.792525 0.439877 -0.439737 +v 0.826326 0.373538 0.439737 +v 0.826326 0.373538 -0.439737 +v 0.713676 0.649858 0.338641 +v 0.713676 0.649858 -0.338641 +v 0.949858 0.186324 0.338641 +v 0.949858 0.186324 -0.338641 +v 0.780513 0.548454 0.39457 +v 0.780513 0.548454 -0.39457 +v 0.907106 0.3 0.39457 +v 0.907106 0.3 -0.39457 +v 0.729349 0.698096 0.273474 +v 0.729349 0.698096 -0.273474 +v 0.998096 0.170651 0.273474 +v 0.998096 0.170651 -0.273474 +v 0.848454 0.480513 0.39457 +v 0.848454 0.480513 -0.39457 +v 0.892075 0.394901 0.39457 +v 0.892075 0.394901 -0.39457 +v 0.741495 0.735476 0.200848 +v 0.741495 0.735476 -0.200848 +v 1.03548 0.158505 0.200848 +v 1.03548 0.158505 -0.200848 +v 0.816224 0.597607 0.338641 +v 0.816224 0.597607 -0.338641 +v 0.967862 0.3 0.338641 +v 0.967862 0.3 -0.338641 +v 0.749781 0.760977 0.122743 +v 0.749781 0.760977 -0.122743 +v 1.06098 0.15022 0.122743 +v 1.06098 0.15022 -0.122743 +v 0.753981 0.773904 0.0412897 +v 0.753981 0.773904 -0.0412897 +v 1.0739 0.146019 0.0412897 +v 1.0739 0.146019 -0.0412897 +v 0.897607 0.516224 0.338641 +v 0.897607 0.516224 -0.338641 +v 0.949857 0.413676 -0.338641 +v 0.949858 0.413676 0.338641 +v 0.846037 0.638641 0.273474 +v 0.846037 0.638641 -0.273474 +v 1.01858 0.3 0.273474 +v 1.01858 0.3 -0.273474 +v 0.869139 0.670438 0.200848 +v 0.869139 0.670438 -0.200848 +v 1.05789 0.3 0.200848 +v 1.05789 0.3 -0.200848 +v 0.938641 0.546037 0.273474 +v 0.938641 0.546037 -0.273474 +v 0.998096 0.429349 0.273474 +v 0.998096 0.429349 -0.273474 +v 0.8849 0.692131 0.122743 +v 0.8849 0.692131 -0.122743 +v 1.0847 0.3 0.122743 +v 1.0847 0.3 -0.122743 +v 0.892889 0.703127 0.0412897 +v 0.892889 0.703127 -0.0412897 +v 1.09829 0.3 0.0412897 +v 1.09829 0.3 -0.0412897 +v 0.970438 0.569139 0.200848 +v 0.970438 0.569139 -0.200848 +v 1.03548 0.441495 0.200848 +v 1.03548 0.441495 -0.200848 +v 0.992131 0.5849 0.122743 +v 0.992131 0.5849 -0.122743 +v 1.06098 0.449781 0.122743 +v 1.06098 0.449781 -0.122743 +v 1.00313 0.592889 0.0412897 +v 1.00313 0.592889 -0.0412897 +v 1.0739 0.453981 0.0412897 +v 1.0739 0.453981 -0.0412897 +v 0.302656 -0.098672 -4.04758e-11 +v 0.119055 0.190472 0 +v 0.302295 -0.098311 0.0103329 +v 0.301208 -0.097224 0.0206656 +v 0.299383 -0.095399 0.0309971 +v 0.11977 0.185961 0.0395272 +v 0.119235 0.18934 0.0199004 +v 0.15894 0.114107 -0.126728 +v 0.170235 0.0969156 -0.133393 +v 0.180792 0.0798019 -0.138221 +v 0.190576 0.0629269 -0.141336 +v 0.199568 0.0464194 -0.142864 +v 0.207764 0.0303797 -0.142925 +v 0.239765 -0.013601 -0.129405 +v 0.216833 0.0147995 -0.140808 +v 0.22907 8.3353e-11 -0.135465 +v 0.249054 -0.0260873 -0.122731 +v 0.258454 -0.0373211 -0.114862 +v 0.266658 -0.0474544 -0.106585 +v 0.273756 -0.0565611 -0.0979668 +v 0.279826 -0.0647075 -0.0890622 +v 0.284938 -0.0719522 -0.079911 +v 0.289149 -0.0783464 -0.0705434 +v 0.292507 -0.0839329 -0.0609809 +v 0.295049 -0.0887464 -0.0512377 +v 0.296806 -0.0928137 -0.0413232 +v 0.137914 0.146467 -0.106414 +v 0.148 0.130793 -0.117767 +v 0.123693 0.178944 -0.0581427 +v 0.128047 0.169898 -0.0756434 +v 0.132459 0.15915 -0.0918852 +v 0.119235 0.18934 -0.0199004 +v 0.11977 0.185961 -0.0395272 +v 0.299383 -0.095399 -0.0309971 +v 0.301208 -0.097224 -0.0206656 +v 0.302295 -0.098311 -0.0103329 +v 0.284938 -0.0719522 0.079911 +v 0.279826 -0.0647075 0.0890622 +v 0.273756 -0.0565611 0.0979668 +v 0.266657 -0.0474544 0.106585 +v 0.258454 -0.0373211 0.114862 +v 0.249054 -0.0260873 0.122731 +v 0.207764 0.0303797 0.142925 +v 0.199568 0.0464194 0.142864 +v 0.190576 0.0629269 0.141336 +v 0.180792 0.0798019 0.138221 +v 0.170235 0.0969156 0.133393 +v 0.15894 0.114107 0.126728 +v 0.239765 -0.013601 0.129405 +v 0.22907 -2.77844e-11 0.135465 +v 0.216833 0.0147995 0.140808 +v 0.296806 -0.0928137 0.0413232 +v 0.295049 -0.0887464 0.0512377 +v 0.292507 -0.0839329 0.0609809 +v 0.289149 -0.0783464 0.0705434 +v 0.148 0.130793 0.117767 +v 0.137914 0.146467 0.106414 +v 0.132459 0.15915 0.0918852 +v 0.128047 0.169898 0.0756434 +v 0.123693 0.178944 0.0581428 +v 0.275476 -0.0588694 -0.0954436 +v 0.249037 -0.0260675 -0.122743 +v 0.153399 0.122005 -0.122743 +v 0.213211 0.0189815 -0.141977 +v 0.136027 0.149246 -0.103866 +v 0.228378 0.000836743 -0.135767 +v 0.298434 -0.0944504 -0.0347901 +v 0.296809 -0.0928248 -0.0412897 +v 0.119851 0.185446 -0.0412897 +v 0.295059 -0.0887695 0.0511813 +v 0.296809 -0.0928248 0.0412897 +v 0.144975 0.135494 0.114362 +v 0.119851 0.185446 0.0412897 +v 0.123804 0.178715 0.0585855 +v 0.136027 0.149246 0.103866 +v 0.249037 -0.0260675 0.122743 +v 0.153399 0.122005 0.122743 +v 0.19695 0.0512265 0.142419 +v 0.213211 0.0189815 0.141977 +g patch0 +f 19 417 26 +f 417 452 26 +f 25 19 26 +f 25 26 41 +f 41 26 13 +f 13 26 33 +f 33 26 49 +f 49 26 57 +f 57 26 5 +f 5 26 4 +f 4 26 56 +f 56 26 48 +f 48 26 32 +f 32 26 12 +f 12 26 40 +f 40 26 24 +f 24 26 18 +f 18 26 23 +f 23 26 39 +f 39 26 11 +f 11 26 31 +f 31 26 47 +f 47 26 55 +f 55 26 3 +f 3 26 1 +f 1 26 53 +f 53 26 45 +f 45 26 30 +f 30 26 10 +f 10 26 38 +f 38 26 22 +f 22 26 17 +f 17 26 21 +f 21 26 37 +f 37 26 9 +f 9 26 29 +f 29 26 46 +f 46 26 54 +f 54 26 2 +f 2 26 8 +f 8 26 60 +f 60 26 52 +f 52 26 36 +f 36 26 16 +f 16 26 44 +f 44 26 28 +f 28 26 20 +f 20 26 27 +f 27 26 43 +f 43 26 15 +f 15 26 35 +f 35 26 51 +f 51 26 59 +f 59 26 7 +f 7 26 6 +f 6 26 58 +f 58 26 50 +f 50 26 34 +f 34 26 14 +f 14 26 42 +f 19 25 417 +f 25 419 417 +f 421 487 69 +f 421 69 420 +f 419 420 69 +f 417 419 69 +f 452 417 69 +f 70 452 69 +f 70 451 452 +f 483 450 70 +f 70 450 451 +f 26 452 42 +f 452 451 42 +f 42 451 14 +f 451 450 14 +f 14 450 34 +f 450 483 34 +f 484 442 34 +f 483 484 34 +f 34 442 50 +f 442 441 50 +f 50 441 58 +f 441 440 58 +f 58 440 6 +f 440 439 6 +f 6 439 7 +f 439 438 7 +f 59 7 438 +f 59 438 437 +f 51 59 437 +f 51 437 436 +f 436 437 477 +f 35 51 436 +f 35 436 435 +f 15 35 435 +f 15 435 434 +f 43 15 434 +f 43 434 433 +f 27 43 433 +f 27 478 430 +f 27 433 478 +f 20 27 430 +f 20 430 432 +f 28 20 432 +f 28 432 431 +f 431 432 482 +f 44 28 431 +f 44 480 429 +f 44 431 480 +f 16 44 429 +f 16 429 428 +f 36 16 428 +f 36 428 427 +f 52 36 427 +f 52 427 426 +f 60 52 426 +f 60 426 425 +f 8 60 425 +f 8 425 424 +f 2 8 424 +f 2 479 444 +f 2 424 479 +f 54 2 444 +f 54 444 443 +f 46 54 443 +f 46 481 447 +f 46 443 481 +f 29 46 447 +f 29 447 446 +f 9 29 446 +f 9 446 445 +f 37 9 445 +f 37 485 449 +f 37 445 485 +f 21 37 449 +f 21 449 448 +f 17 21 448 +f 17 448 418 +f 423 22 17 +f 423 17 418 +f 422 38 22 +f 422 22 423 +f 476 10 38 +f 476 38 489 +f 489 38 422 +f 475 30 10 +f 475 10 490 +f 490 10 476 +f 474 45 30 +f 474 30 475 +f 473 53 45 +f 473 45 491 +f 491 45 474 +f 472 1 53 +f 472 53 488 +f 488 53 473 +f 464 3 1 +f 464 1 493 +f 493 1 472 +f 55 3 463 +f 3 464 463 +f 47 55 462 +f 55 463 462 +f 31 47 461 +f 47 462 461 +f 11 31 460 +f 31 461 494 +f 31 494 460 +f 39 11 459 +f 11 460 459 +f 23 39 467 +f 39 459 495 +f 39 495 467 +f 18 23 466 +f 23 467 466 +f 24 18 465 +f 18 466 465 +f 40 24 458 +f 24 465 492 +f 24 492 458 +f 12 40 457 +f 40 458 457 +f 32 12 456 +f 12 457 456 +f 48 32 455 +f 32 456 455 +f 56 48 454 +f 48 455 454 +f 4 56 453 +f 56 454 453 +f 5 4 471 +f 4 453 471 +f 57 5 470 +f 5 471 470 +f 49 57 469 +f 57 470 469 +f 33 49 468 +f 49 469 486 +f 49 486 468 +f 13 33 421 +f 33 468 487 +f 33 487 421 +f 41 13 420 +f 13 421 420 +f 25 41 419 +f 41 420 419 +f 70 69 94 +f 69 93 94 +f 468 486 69 +f 468 69 487 +f 458 492 73 +f 458 73 457 +f 456 457 73 +f 455 456 73 +f 454 455 73 +f 453 454 73 +f 471 453 73 +f 470 471 73 +f 469 470 73 +f 486 469 73 +f 486 73 69 +f 69 73 93 +f 70 94 98 +f 70 98 74 +f 74 477 437 +f 74 437 70 +f 484 70 442 +f 442 70 441 +f 441 70 440 +f 440 70 439 +f 70 437 438 +f 70 438 439 +f 484 483 70 +f 74 478 433 +f 74 436 477 +f 74 435 436 +f 74 434 435 +f 74 433 434 +f 82 482 432 +f 82 432 74 +f 74 430 478 +f 74 432 430 +f 480 431 66 +f 431 482 82 +f 431 82 66 +f 66 62 479 +f 66 429 480 +f 66 428 429 +f 66 427 428 +f 66 426 427 +f 66 425 426 +f 66 424 425 +f 66 479 424 +f 62 481 443 +f 62 444 479 +f 62 443 444 +f 62 447 481 +f 62 446 447 +f 62 68 445 +f 445 68 485 +f 62 445 446 +f 485 68 67 +f 485 67 449 +f 449 67 448 +f 418 448 67 +f 423 418 67 +f 422 423 67 +f 489 422 67 +f 489 67 71 +f 489 71 476 +f 476 71 490 +f 490 71 61 +f 490 61 475 +f 475 61 474 +f 491 474 61 +f 473 491 61 +f 473 61 488 +f 472 61 493 +f 488 61 472 +f 493 61 63 +f 493 63 464 +f 464 63 463 +f 462 463 63 +f 461 462 63 +f 494 461 63 +f 494 63 65 +f 494 65 460 +f 460 65 459 +f 495 459 65 +f 467 495 65 +f 467 65 466 +f 465 466 65 +f 492 465 65 +f 492 65 73 +f 94 93 132 +f 93 131 132 +f 73 97 93 +f 93 97 131 +f 94 132 136 +f 94 136 98 +f 65 81 73 +f 73 81 97 +f 98 136 146 +f 98 146 106 +f 74 98 106 +f 74 106 82 +f 82 106 114 +f 82 114 86 +f 66 82 86 +f 66 86 78 +f 64 66 78 +f 62 66 64 +f 72 62 64 +f 68 62 72 +f 68 72 92 +f 67 68 92 +f 67 92 91 +f 67 91 95 +f 67 95 71 +f 71 95 103 +f 71 103 79 +f 71 79 61 +f 61 79 63 +f 79 83 63 +f 63 83 75 +f 63 75 65 +f 75 77 65 +f 65 77 81 +f 132 131 192 +f 131 191 192 +f 97 135 131 +f 131 135 191 +f 132 192 200 +f 132 200 136 +f 81 105 97 +f 97 105 135 +f 136 200 204 +f 136 204 146 +f 77 85 81 +f 81 85 105 +f 146 204 206 +f 146 206 150 +f 106 146 150 +f 106 150 114 +f 114 150 157 +f 114 157 122 +f 86 114 122 +f 86 122 102 +f 78 86 102 +f 78 102 90 +f 76 78 90 +f 64 78 76 +f 80 64 76 +f 72 64 80 +f 72 80 96 +f 72 96 92 +f 92 96 128 +f 91 92 128 +f 91 128 127 +f 91 127 129 +f 91 129 95 +f 95 129 143 +f 95 143 103 +f 103 143 147 +f 103 147 111 +f 79 103 111 +f 79 111 83 +f 83 111 119 +f 83 119 99 +f 83 99 75 +f 75 99 87 +f 75 87 77 +f 87 89 77 +f 77 89 85 +f 192 191 292 +f 191 291 292 +f 135 199 191 +f 199 291 191 +f 192 292 286 +f 200 192 286 +f 105 145 135 +f 135 145 199 +f 200 286 283 +f 204 200 283 +f 85 113 105 +f 105 113 145 +f 204 283 270 +f 206 204 270 +f 89 101 85 +f 85 101 113 +f 206 270 264 +f 214 206 264 +f 150 206 214 +f 150 214 157 +f 157 214 218 +f 157 218 169 +f 122 157 169 +f 122 169 138 +f 102 122 138 +f 102 138 118 +f 90 102 118 +f 90 118 110 +f 88 90 110 +f 76 90 88 +f 84 76 88 +f 80 76 84 +f 80 84 104 +f 96 80 104 +f 96 104 130 +f 96 130 128 +f 128 130 180 +f 127 128 180 +f 127 180 179 +f 127 179 185 +f 127 185 129 +f 129 185 187 +f 129 187 143 +f 147 143 187 +f 147 187 201 +f 147 201 153 +f 201 207 153 +f 111 147 153 +f 111 153 119 +f 119 153 167 +f 119 167 133 +f 99 119 133 +f 99 133 115 +f 99 115 87 +f 87 115 107 +f 87 107 89 +f 89 107 109 +f 89 109 101 +f 292 291 344 +f 291 343 344 +f 199 285 291 +f 285 343 291 +f 292 344 342 +f 286 292 342 +f 145 203 199 +f 203 285 199 +f 286 342 328 +f 283 286 328 +f 113 149 145 +f 145 149 203 +f 283 328 324 +f 270 283 324 +f 101 121 113 +f 113 121 149 +f 270 324 318 +f 264 270 318 +f 109 117 101 +f 101 117 121 +f 264 318 304 +f 256 264 304 +f 214 264 256 +f 218 214 256 +f 218 256 252 +f 226 218 252 +f 169 218 226 +f 169 226 178 +f 138 169 178 +f 138 178 156 +f 118 138 156 +f 118 156 142 +f 110 118 142 +f 110 142 126 +f 108 110 126 +f 88 110 108 +f 100 88 108 +f 84 88 100 +f 84 100 112 +f 104 84 112 +f 104 112 144 +f 104 144 130 +f 130 144 186 +f 130 186 180 +f 180 186 280 +f 179 180 280 +f 179 280 279 +f 179 279 271 +f 179 271 185 +f 185 271 267 +f 185 267 187 +f 187 267 265 +f 187 265 201 +f 201 265 258 +f 201 258 207 +f 207 258 254 +f 207 254 215 +f 153 207 167 +f 207 215 167 +f 167 215 219 +f 167 219 175 +f 133 167 175 +f 133 175 151 +f 115 133 151 +f 115 151 139 +f 115 139 107 +f 107 139 123 +f 107 123 109 +f 109 123 125 +f 109 125 117 +f 344 343 380 +f 343 379 380 +f 285 341 343 +f 341 379 343 +f 344 380 376 +f 342 344 376 +f 203 284 285 +f 284 341 285 +f 342 376 368 +f 328 342 368 +f 149 205 203 +f 205 284 203 +f 328 368 360 +f 324 328 360 +f 121 158 149 +f 149 158 205 +f 324 360 352 +f 318 324 352 +f 117 137 121 +f 121 137 158 +f 337 318 352 +f 304 318 337 +f 125 141 117 +f 117 141 137 +f 320 304 337 +f 296 304 320 +f 256 304 296 +f 252 256 296 +f 282 252 296 +f 244 252 282 +f 226 252 244 +f 230 226 244 +f 178 226 230 +f 178 230 198 +f 156 178 198 +f 156 198 174 +f 142 156 174 +f 142 174 166 +f 126 142 166 +f 126 166 162 +f 124 126 162 +f 108 126 124 +f 116 108 124 +f 100 108 116 +f 100 116 120 +f 112 100 120 +f 112 120 148 +f 112 148 144 +f 188 144 148 +f 188 148 202 +f 144 188 186 +f 186 188 272 +f 186 272 280 +f 280 272 340 +f 279 280 340 +f 279 340 339 +f 279 339 335 +f 279 335 271 +f 271 335 325 +f 271 325 267 +f 267 325 321 +f 267 321 265 +f 265 321 313 +f 265 313 258 +f 258 313 301 +f 258 301 254 +f 254 301 293 +f 254 293 245 +f 215 254 245 +f 215 245 219 +f 219 245 241 +f 219 241 227 +f 175 219 227 +f 175 227 189 +f 151 175 189 +f 151 189 171 +f 139 151 171 +f 139 171 163 +f 139 163 123 +f 123 163 159 +f 123 159 125 +f 125 159 161 +f 125 161 141 +f 380 379 404 +f 379 403 404 +f 341 375 379 +f 375 403 379 +f 380 404 400 +f 376 380 400 +f 284 327 341 +f 327 375 341 +f 392 376 400 +f 368 376 392 +f 205 269 284 +f 269 327 284 +f 388 368 392 +f 360 368 388 +f 158 213 205 +f 213 269 205 +f 372 360 388 +f 352 360 372 +f 137 170 158 +f 158 170 213 +f 356 352 372 +f 337 352 356 +f 141 155 137 +f 137 155 170 +f 332 337 356 +f 320 337 332 +f 141 161 165 +f 141 165 155 +f 308 320 332 +f 300 320 308 +f 300 296 320 +f 282 296 300 +f 262 282 300 +f 250 282 262 +f 250 244 282 +f 240 244 250 +f 240 230 244 +f 234 230 240 +f 198 230 234 +f 198 234 224 +f 174 198 224 +f 174 224 212 +f 166 174 212 +f 166 212 196 +f 162 166 196 +f 162 196 184 +f 160 162 184 +f 124 162 160 +f 140 124 160 +f 116 124 140 +f 116 140 134 +f 120 116 134 +f 120 134 154 +f 120 154 148 +f 202 148 154 +f 202 154 208 +f 202 208 266 +f 202 266 268 +f 188 202 268 +f 188 268 272 +f 272 268 336 +f 272 336 340 +f 336 378 340 +f 339 340 378 +f 339 378 377 +f 339 377 373 +f 335 339 373 +f 335 373 365 +f 325 335 365 +f 325 365 357 +f 321 325 357 +f 321 357 349 +f 313 321 349 +f 313 349 334 +f 301 313 334 +f 301 334 315 +f 293 301 315 +f 293 315 297 +f 273 293 297 +f 245 293 273 +f 245 273 241 +f 241 273 247 +f 241 247 237 +f 227 241 237 +f 227 237 231 +f 189 227 231 +f 189 231 221 +f 171 189 221 +f 171 221 209 +f 163 171 209 +f 163 209 193 +f 163 193 159 +f 159 193 181 +f 159 181 161 +f 161 181 183 +f 161 183 165 +f 375 399 403 +f 415 403 399 +f 416 404 415 +f 404 403 415 +f 412 404 416 +f 412 400 404 +f 327 367 375 +f 367 399 375 +f 408 400 412 +f 408 392 400 +f 269 323 327 +f 323 367 327 +f 396 392 408 +f 396 388 392 +f 213 263 269 +f 263 323 269 +f 383 388 396 +f 383 372 388 +f 170 217 213 +f 217 263 213 +f 364 372 383 +f 364 356 372 +f 155 177 170 +f 170 177 217 +f 348 356 364 +f 348 332 356 +f 165 173 155 +f 155 173 177 +f 312 332 348 +f 312 308 332 +f 165 183 195 +f 165 195 173 +f 278 300 308 +f 290 308 312 +f 290 278 308 +f 262 300 278 +f 236 262 278 +f 236 250 262 +f 236 240 250 +f 236 234 240 +f 224 234 236 +f 212 224 236 +f 196 212 236 +f 184 196 236 +f 182 184 236 +f 160 184 182 +f 164 160 182 +f 140 160 164 +f 140 164 152 +f 134 140 152 +f 134 152 168 +f 154 134 168 +f 208 154 168 +f 208 168 216 +f 208 216 257 +f 208 257 266 +f 266 257 322 +f 266 322 326 +f 268 266 326 +f 268 326 336 +f 326 374 336 +f 336 374 378 +f 374 402 378 +f 377 378 402 +f 377 402 401 +f 377 401 397 +f 373 377 397 +f 373 397 389 +f 365 373 389 +f 365 389 385 +f 357 365 385 +f 357 385 369 +f 349 357 369 +f 349 369 353 +f 334 349 353 +f 334 353 329 +f 315 334 329 +f 315 329 305 +f 297 315 305 +f 275 297 305 +f 259 297 275 +f 273 297 259 +f 247 273 259 +f 235 247 259 +f 237 247 235 +f 231 237 235 +f 221 231 235 +f 209 221 235 +f 193 209 235 +f 193 235 181 +f 181 235 183 +f 183 235 195 +f 367 391 399 +f 391 411 399 +f 411 415 399 +f 414 416 413 +f 416 415 413 +f 413 415 411 +f 410 416 414 +f 410 412 416 +f 406 412 410 +f 406 408 412 +f 323 359 367 +f 359 391 367 +f 394 408 406 +f 394 396 408 +f 263 317 323 +f 317 359 323 +f 382 396 394 +f 382 383 396 +f 217 255 263 +f 255 317 263 +f 362 383 382 +f 362 364 383 +f 177 225 217 +f 225 255 217 +f 346 364 362 +f 346 348 364 +f 173 197 177 +f 177 197 225 +f 310 348 346 +f 310 312 348 +f 173 195 211 +f 173 211 197 +f 288 312 310 +f 288 290 312 +f 195 235 211 +f 236 278 290 +f 236 290 288 +f 236 288 276 +f 236 276 260 +f 236 260 248 +f 238 236 248 +f 232 236 238 +f 222 236 232 +f 210 236 222 +f 194 236 210 +f 194 182 236 +f 164 182 194 +f 164 194 172 +f 152 164 172 +f 152 172 176 +f 168 152 176 +f 168 176 216 +f 176 220 216 +f 216 220 253 +f 216 253 257 +f 257 253 314 +f 257 314 322 +f 314 358 322 +f 322 358 366 +f 322 366 326 +f 326 366 374 +f 366 398 374 +f 374 398 402 +f 398 414 402 +f 401 402 414 +f 401 414 413 +f 401 413 409 +f 397 401 409 +f 397 409 405 +f 389 397 405 +f 389 405 393 +f 385 389 393 +f 385 393 381 +f 369 385 381 +f 369 381 361 +f 353 369 361 +f 353 361 345 +f 329 353 345 +f 309 329 345 +f 305 329 309 +f 287 305 309 +f 275 305 287 +f 235 275 287 +f 235 259 275 +f 235 277 261 +f 235 261 249 +f 235 249 239 +f 235 239 233 +f 223 235 233 +f 211 235 223 +f 235 287 289 +f 235 289 277 +f 359 387 391 +f 387 407 391 +f 407 411 391 +f 409 413 411 +f 409 411 407 +f 398 410 414 +f 390 410 398 +f 390 406 410 +f 386 406 390 +f 386 394 406 +f 317 351 359 +f 351 387 359 +f 370 394 386 +f 370 382 394 +f 255 303 317 +f 303 351 317 +f 354 382 370 +f 354 362 382 +f 225 251 255 +f 251 303 255 +f 330 362 354 +f 330 346 362 +f 197 229 225 +f 229 251 225 +f 306 346 330 +f 306 310 346 +f 211 223 197 +f 197 223 229 +f 276 310 306 +f 276 288 310 +f 260 276 306 +f 248 260 298 +f 260 306 298 +f 238 248 274 +f 248 298 274 +f 242 232 238 +f 242 238 274 +f 228 222 232 +f 228 232 242 +f 190 210 222 +f 190 222 228 +f 172 194 210 +f 172 210 190 +f 176 172 190 +f 176 190 220 +f 220 190 228 +f 220 228 246 +f 220 246 253 +f 253 246 302 +f 253 302 314 +f 302 350 314 +f 314 350 358 +f 350 386 358 +f 358 386 390 +f 358 390 366 +f 366 390 398 +f 405 409 407 +f 405 407 395 +f 393 405 395 +f 393 395 384 +f 381 393 384 +f 363 381 384 +f 361 381 363 +f 347 361 363 +f 345 361 347 +f 311 345 347 +f 309 345 311 +f 289 309 311 +f 287 309 289 +f 261 277 307 +f 289 311 277 +f 277 311 307 +f 261 307 299 +f 249 261 299 +f 249 299 281 +f 239 249 281 +f 239 281 243 +f 233 239 243 +f 233 243 229 +f 223 233 229 +f 351 371 387 +f 371 395 387 +f 395 407 387 +f 350 370 386 +f 303 338 351 +f 338 371 351 +f 333 370 350 +f 333 354 370 +f 251 295 303 +f 295 338 303 +f 316 354 333 +f 316 330 354 +f 229 243 251 +f 243 295 251 +f 298 330 316 +f 298 306 330 +f 274 298 316 +f 274 316 294 +f 242 274 294 +f 246 242 294 +f 228 242 246 +f 246 294 302 +f 294 333 302 +f 302 333 350 +f 384 395 371 +f 355 384 371 +f 363 384 355 +f 331 363 355 +f 347 363 331 +f 307 347 331 +f 311 347 307 +f 299 307 331 +f 299 331 319 +f 281 299 319 +f 281 319 295 +f 243 281 295 +f 338 355 371 +f 295 319 338 +f 319 355 338 +f 294 316 333 +f 319 331 355 diff --git a/tutorials/mesh/cvMesh/simpleShapes/constant/triSurface/domain.stl b/tutorials/mesh/cvMesh/simpleShapes/constant/triSurface/domain.stl new file mode 100644 index 0000000000000000000000000000000000000000..5650ed200133c64ccaf37ccf55701500b6acfbac --- /dev/null +++ b/tutorials/mesh/cvMesh/simpleShapes/constant/triSurface/domain.stl @@ -0,0 +1,86 @@ +solid ascii + facet normal -1 0 0 + outer loop + vertex -0.7 -0.9 -1 + vertex -0.7 -0.9 1 + vertex -0.7 1.1 -1 + endloop + endfacet + facet normal -1 0 0 + outer loop + vertex -0.7 1.1 1 + vertex -0.7 1.1 -1 + vertex -0.7 -0.9 1 + endloop + endfacet + facet normal 1 0 0 + outer loop + vertex 1.3 -0.9 -1 + vertex 1.3 1.1 -1 + vertex 1.3 -0.9 1 + endloop + endfacet + facet normal 1 -0 0 + outer loop + vertex 1.3 1.1 1 + vertex 1.3 -0.9 1 + vertex 1.3 1.1 -1 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex -0.7 -0.9 -1 + vertex 1.3 -0.9 -1 + vertex -0.7 -0.9 1 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 1.3 -0.9 1 + vertex -0.7 -0.9 1 + vertex 1.3 -0.9 -1 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -0.7 1.1 -1 + vertex -0.7 1.1 1 + vertex 1.3 1.1 -1 + endloop + endfacet + facet normal 0 1 -0 + outer loop + vertex 1.3 1.1 1 + vertex 1.3 1.1 -1 + vertex -0.7 1.1 1 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -0.7 -0.9 -1 + vertex -0.7 1.1 -1 + vertex 1.3 -0.9 -1 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 1.3 1.1 -1 + vertex 1.3 -0.9 -1 + vertex -0.7 1.1 -1 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -0.7 -0.9 1 + vertex 1.3 -0.9 1 + vertex -0.7 1.1 1 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex 1.3 1.1 1 + vertex -0.7 1.1 1 + vertex 1.3 -0.9 1 + endloop + endfacet +endsolid diff --git a/tutorials/mesh/cvMesh/simpleShapes/constant/triSurface/sphere.stl b/tutorials/mesh/cvMesh/simpleShapes/constant/triSurface/sphere.stl new file mode 100644 index 0000000000000000000000000000000000000000..f054ffb23807b393279709c553e34fa393031aa6 --- /dev/null +++ b/tutorials/mesh/cvMesh/simpleShapes/constant/triSurface/sphere.stl @@ -0,0 +1,5042 @@ +solid ascii + facet normal 0.0825722 0.0130781 0.996499 + outer loop + vertex 0.682297 0.3 0.493181 + vertex 0.678269 0.325431 0.493181 + vertex 0.6 0.3 0.5 + endloop + endfacet + facet normal 0.0744894 0.0379543 0.996499 + outer loop + vertex 0.678269 0.325431 0.493181 + vertex 0.66658 0.348373 0.493181 + vertex 0.6 0.3 0.5 + endloop + endfacet + facet normal 0.0591152 0.0591152 0.996499 + outer loop + vertex 0.66658 0.348373 0.493181 + vertex 0.648373 0.36658 0.493181 + vertex 0.6 0.3 0.5 + endloop + endfacet + facet normal 0.0379542 0.0744895 0.996499 + outer loop + vertex 0.648373 0.36658 0.493181 + vertex 0.625431 0.378269 0.493181 + vertex 0.6 0.3 0.5 + endloop + endfacet + facet normal 0.0130782 0.0825722 0.996499 + outer loop + vertex 0.625431 0.378269 0.493181 + vertex 0.6 0.382297 0.493181 + vertex 0.6 0.3 0.5 + endloop + endfacet + facet normal -0.0130782 0.0825722 0.996499 + outer loop + vertex 0.6 0.382297 0.493181 + vertex 0.574569 0.378269 0.493181 + vertex 0.6 0.3 0.5 + endloop + endfacet + facet normal -0.0379542 0.0744894 0.996499 + outer loop + vertex 0.574569 0.378269 0.493181 + vertex 0.551627 0.36658 0.493181 + vertex 0.6 0.3 0.5 + endloop + endfacet + facet normal -0.0591151 0.0591151 0.996499 + outer loop + vertex 0.551627 0.36658 0.493181 + vertex 0.53342 0.348373 0.493181 + vertex 0.6 0.3 0.5 + endloop + endfacet + facet normal -0.0744894 0.0379543 0.996499 + outer loop + vertex 0.53342 0.348373 0.493181 + vertex 0.521731 0.325431 0.493181 + vertex 0.6 0.3 0.5 + endloop + endfacet + facet normal -0.0825721 0.0130781 0.996499 + outer loop + vertex 0.521731 0.325431 0.493181 + vertex 0.517703 0.3 0.493181 + vertex 0.6 0.3 0.5 + endloop + endfacet + facet normal -0.0825721 -0.0130781 0.996499 + outer loop + vertex 0.517703 0.3 0.493181 + vertex 0.521731 0.274569 0.493181 + vertex 0.6 0.3 0.5 + endloop + endfacet + facet normal -0.0744894 -0.0379543 0.996499 + outer loop + vertex 0.521731 0.274569 0.493181 + vertex 0.53342 0.251627 0.493181 + vertex 0.6 0.3 0.5 + endloop + endfacet + facet normal -0.0591151 -0.0591151 0.996499 + outer loop + vertex 0.53342 0.251627 0.493181 + vertex 0.551627 0.23342 0.493181 + vertex 0.6 0.3 0.5 + endloop + endfacet + facet normal -0.0379542 -0.0744894 0.996499 + outer loop + vertex 0.551627 0.23342 0.493181 + vertex 0.574569 0.221731 0.493181 + vertex 0.6 0.3 0.5 + endloop + endfacet + facet normal -0.0130781 -0.0825721 0.996499 + outer loop + vertex 0.574569 0.221731 0.493181 + vertex 0.6 0.217703 0.493181 + vertex 0.6 0.3 0.5 + endloop + endfacet + facet normal 0.0130781 -0.0825721 0.996499 + outer loop + vertex 0.6 0.217703 0.493181 + vertex 0.625431 0.221731 0.493181 + vertex 0.6 0.3 0.5 + endloop + endfacet + facet normal 0.0379543 -0.0744894 0.996499 + outer loop + vertex 0.625431 0.221731 0.493181 + vertex 0.648373 0.23342 0.493181 + vertex 0.6 0.3 0.5 + endloop + endfacet + facet normal 0.0591152 -0.0591151 0.996499 + outer loop + vertex 0.648373 0.23342 0.493181 + vertex 0.66658 0.251627 0.493181 + vertex 0.6 0.3 0.5 + endloop + endfacet + facet normal 0.0744894 -0.0379543 0.996499 + outer loop + vertex 0.66658 0.251627 0.493181 + vertex 0.678269 0.274569 0.493181 + vertex 0.6 0.3 0.5 + endloop + endfacet + facet normal 0.0825722 -0.0130781 0.996499 + outer loop + vertex 0.678269 0.274569 0.493181 + vertex 0.682297 0.3 0.493181 + vertex 0.6 0.3 0.5 + endloop + endfacet + facet normal 0.0825722 0.0130781 -0.996499 + outer loop + vertex 0.682297 0.3 -0.493181 + vertex 0.6 0.3 -0.5 + vertex 0.678269 0.325431 -0.493181 + endloop + endfacet + facet normal 0.0744895 0.0379542 -0.996499 + outer loop + vertex 0.678269 0.325431 -0.493181 + vertex 0.6 0.3 -0.5 + vertex 0.66658 0.348373 -0.493181 + endloop + endfacet + facet normal 0.0591152 0.0591152 -0.996499 + outer loop + vertex 0.66658 0.348373 -0.493181 + vertex 0.6 0.3 -0.5 + vertex 0.648373 0.36658 -0.493181 + endloop + endfacet + facet normal 0.0379542 0.0744895 -0.996499 + outer loop + vertex 0.648373 0.36658 -0.493181 + vertex 0.6 0.3 -0.5 + vertex 0.625431 0.378269 -0.493181 + endloop + endfacet + facet normal 0.0130781 0.0825722 -0.996499 + outer loop + vertex 0.625431 0.378269 -0.493181 + vertex 0.6 0.3 -0.5 + vertex 0.6 0.382297 -0.493181 + endloop + endfacet + facet normal -0.0130781 0.0825722 -0.996499 + outer loop + vertex 0.6 0.382297 -0.493181 + vertex 0.6 0.3 -0.5 + vertex 0.574569 0.378269 -0.493181 + endloop + endfacet + facet normal -0.0379543 0.0744894 -0.996499 + outer loop + vertex 0.574569 0.378269 -0.493181 + vertex 0.6 0.3 -0.5 + vertex 0.551627 0.36658 -0.493181 + endloop + endfacet + facet normal -0.0591152 0.0591151 -0.996499 + outer loop + vertex 0.551627 0.36658 -0.493181 + vertex 0.6 0.3 -0.5 + vertex 0.53342 0.348373 -0.493181 + endloop + endfacet + facet normal -0.0744894 0.0379543 -0.996499 + outer loop + vertex 0.53342 0.348373 -0.493181 + vertex 0.6 0.3 -0.5 + vertex 0.521731 0.325431 -0.493181 + endloop + endfacet + facet normal -0.0825722 0.0130781 -0.996499 + outer loop + vertex 0.521731 0.325431 -0.493181 + vertex 0.6 0.3 -0.5 + vertex 0.517703 0.3 -0.493181 + endloop + endfacet + facet normal -0.0825722 -0.0130781 -0.996499 + outer loop + vertex 0.517703 0.3 -0.493181 + vertex 0.6 0.3 -0.5 + vertex 0.521731 0.274569 -0.493181 + endloop + endfacet + facet normal -0.0744894 -0.0379543 -0.996499 + outer loop + vertex 0.521731 0.274569 -0.493181 + vertex 0.6 0.3 -0.5 + vertex 0.53342 0.251627 -0.493181 + endloop + endfacet + facet normal -0.0591151 -0.0591152 -0.996499 + outer loop + vertex 0.53342 0.251627 -0.493181 + vertex 0.6 0.3 -0.5 + vertex 0.551627 0.23342 -0.493181 + endloop + endfacet + facet normal -0.0379543 -0.0744894 -0.996499 + outer loop + vertex 0.551627 0.23342 -0.493181 + vertex 0.6 0.3 -0.5 + vertex 0.574569 0.221731 -0.493181 + endloop + endfacet + facet normal -0.0130781 -0.0825722 -0.996499 + outer loop + vertex 0.574569 0.221731 -0.493181 + vertex 0.6 0.3 -0.5 + vertex 0.6 0.217703 -0.493181 + endloop + endfacet + facet normal 0.0130782 -0.0825722 -0.996499 + outer loop + vertex 0.6 0.217703 -0.493181 + vertex 0.6 0.3 -0.5 + vertex 0.625431 0.221731 -0.493181 + endloop + endfacet + facet normal 0.0379543 -0.0744895 -0.996499 + outer loop + vertex 0.625431 0.221731 -0.493181 + vertex 0.6 0.3 -0.5 + vertex 0.648373 0.23342 -0.493181 + endloop + endfacet + facet normal 0.0591152 -0.0591152 -0.996499 + outer loop + vertex 0.648373 0.23342 -0.493181 + vertex 0.6 0.3 -0.5 + vertex 0.66658 0.251627 -0.493181 + endloop + endfacet + facet normal 0.0744895 -0.0379542 -0.996499 + outer loop + vertex 0.66658 0.251627 -0.493181 + vertex 0.6 0.3 -0.5 + vertex 0.678269 0.274569 -0.493181 + endloop + endfacet + facet normal 0.0825722 -0.0130781 -0.996499 + outer loop + vertex 0.678269 0.274569 -0.493181 + vertex 0.6 0.3 -0.5 + vertex 0.682297 0.3 -0.493181 + endloop + endfacet + facet normal 0.2453 0.0388517 0.968668 + outer loop + vertex 0.682297 0.3 0.493181 + vertex 0.76235 0.3 0.472909 + vertex 0.754404 0.350169 0.472909 + endloop + endfacet + facet normal 0.2453 0.0388517 0.968668 + outer loop + vertex 0.682297 0.3 0.493181 + vertex 0.754404 0.350169 0.472909 + vertex 0.678269 0.325431 0.493181 + endloop + endfacet + facet normal 0.400885 0.063494 0.913926 + outer loop + vertex 0.76235 0.3 0.472909 + vertex 0.837974 0.3 0.439737 + vertex 0.826326 0.373538 0.439737 + endloop + endfacet + facet normal 0.400885 0.0634939 0.913926 + outer loop + vertex 0.76235 0.3 0.472909 + vertex 0.826326 0.373538 0.439737 + vertex 0.754404 0.350169 0.472909 + endloop + endfacet + facet normal 0.544907 0.0863049 0.834043 + outer loop + vertex 0.837974 0.3 0.439737 + vertex 0.907106 0.3 0.39457 + vertex 0.892075 0.394901 0.39457 + endloop + endfacet + facet normal 0.544907 0.086305 0.834043 + outer loop + vertex 0.837974 0.3 0.439737 + vertex 0.892075 0.394901 0.39457 + vertex 0.826326 0.373538 0.439737 + endloop + endfacet + facet normal 0.673418 0.106659 0.731527 + outer loop + vertex 0.907106 0.3 0.39457 + vertex 0.967862 0.3 0.338641 + vertex 0.949858 0.413676 0.338641 + endloop + endfacet + facet normal 0.673418 0.106659 0.731527 + outer loop + vertex 0.907106 0.3 0.39457 + vertex 0.949858 0.413676 0.338641 + vertex 0.892075 0.394901 0.39457 + endloop + endfacet + facet normal 0.783048 0.124023 0.609471 + outer loop + vertex 0.967862 0.3 0.338641 + vertex 1.01858 0.3 0.273474 + vertex 0.998096 0.429349 0.273474 + endloop + endfacet + facet normal 0.783048 0.124022 0.609471 + outer loop + vertex 0.967862 0.3 0.338641 + vertex 0.998096 0.429349 0.273474 + vertex 0.949858 0.413676 0.338641 + endloop + endfacet + facet normal 0.871064 0.137963 0.471396 + outer loop + vertex 1.01858 0.3 0.273474 + vertex 1.05789 0.3 0.200848 + vertex 1.03548 0.441495 0.200848 + endloop + endfacet + facet normal 0.871064 0.137963 0.471396 + outer loop + vertex 1.01858 0.3 0.273474 + vertex 1.03548 0.441495 0.200848 + vertex 0.998096 0.429349 0.273474 + endloop + endfacet + facet normal 0.93538 0.14815 0.321116 + outer loop + vertex 1.05789 0.3 0.200848 + vertex 1.0847 0.3 0.122743 + vertex 1.06098 0.449781 0.122743 + endloop + endfacet + facet normal 0.93538 0.14815 0.321116 + outer loop + vertex 1.05789 0.3 0.200848 + vertex 1.06098 0.449781 0.122743 + vertex 1.03548 0.441495 0.200848 + endloop + endfacet + facet normal 0.974541 0.154352 0.162622 + outer loop + vertex 1.0847 0.3 0.122743 + vertex 1.09829 0.3 0.0412897 + vertex 1.0739 0.453981 0.0412897 + endloop + endfacet + facet normal 0.974541 0.154352 0.162621 + outer loop + vertex 1.0847 0.3 0.122743 + vertex 1.0739 0.453981 0.0412897 + vertex 1.06098 0.449781 0.122743 + endloop + endfacet + facet normal 0.987688 0.156435 -0 + outer loop + vertex 1.09829 0.3 0.0412897 + vertex 1.09829 0.3 -0.0412897 + vertex 1.0739 0.453981 -0.0412897 + endloop + endfacet + facet normal 0.987688 0.156435 -0 + outer loop + vertex 1.09829 0.3 0.0412897 + vertex 1.0739 0.453981 -0.0412897 + vertex 1.0739 0.453981 0.0412897 + endloop + endfacet + facet normal 0.974541 0.154352 -0.162622 + outer loop + vertex 1.09829 0.3 -0.0412897 + vertex 1.0847 0.3 -0.122743 + vertex 1.06098 0.449781 -0.122743 + endloop + endfacet + facet normal 0.974541 0.154352 -0.162621 + outer loop + vertex 1.09829 0.3 -0.0412897 + vertex 1.06098 0.449781 -0.122743 + vertex 1.0739 0.453981 -0.0412897 + endloop + endfacet + facet normal 0.93538 0.148149 -0.321117 + outer loop + vertex 1.0847 0.3 -0.122743 + vertex 1.05789 0.3 -0.200848 + vertex 1.03548 0.441495 -0.200848 + endloop + endfacet + facet normal 0.93538 0.14815 -0.321116 + outer loop + vertex 1.0847 0.3 -0.122743 + vertex 1.03548 0.441495 -0.200848 + vertex 1.06098 0.449781 -0.122743 + endloop + endfacet + facet normal 0.871064 0.137963 -0.471396 + outer loop + vertex 1.05789 0.3 -0.200848 + vertex 1.01858 0.3 -0.273474 + vertex 0.998096 0.429349 -0.273474 + endloop + endfacet + facet normal 0.871064 0.137963 -0.471396 + outer loop + vertex 1.05789 0.3 -0.200848 + vertex 0.998096 0.429349 -0.273474 + vertex 1.03548 0.441495 -0.200848 + endloop + endfacet + facet normal 0.783048 0.124023 -0.60947 + outer loop + vertex 1.01858 0.3 -0.273474 + vertex 0.967862 0.3 -0.338641 + vertex 0.949857 0.413676 -0.338641 + endloop + endfacet + facet normal 0.783048 0.124022 -0.609471 + outer loop + vertex 1.01858 0.3 -0.273474 + vertex 0.949857 0.413676 -0.338641 + vertex 0.998096 0.429349 -0.273474 + endloop + endfacet + facet normal 0.673418 0.106659 -0.731527 + outer loop + vertex 0.967862 0.3 -0.338641 + vertex 0.907106 0.3 -0.39457 + vertex 0.892075 0.394901 -0.39457 + endloop + endfacet + facet normal 0.673418 0.106659 -0.731527 + outer loop + vertex 0.967862 0.3 -0.338641 + vertex 0.892075 0.394901 -0.39457 + vertex 0.949857 0.413676 -0.338641 + endloop + endfacet + facet normal 0.544907 0.0863046 -0.834043 + outer loop + vertex 0.907106 0.3 -0.39457 + vertex 0.837974 0.3 -0.439737 + vertex 0.826326 0.373538 -0.439737 + endloop + endfacet + facet normal 0.544908 0.0863049 -0.834043 + outer loop + vertex 0.907106 0.3 -0.39457 + vertex 0.826326 0.373538 -0.439737 + vertex 0.892075 0.394901 -0.39457 + endloop + endfacet + facet normal 0.400885 0.0634944 -0.913925 + outer loop + vertex 0.837974 0.3 -0.439737 + vertex 0.76235 0.3 -0.472909 + vertex 0.754404 0.350169 -0.472909 + endloop + endfacet + facet normal 0.400885 0.0634937 -0.913926 + outer loop + vertex 0.837974 0.3 -0.439737 + vertex 0.754404 0.350169 -0.472909 + vertex 0.826326 0.373538 -0.439737 + endloop + endfacet + facet normal 0.2453 0.0388516 -0.968668 + outer loop + vertex 0.76235 0.3 -0.472909 + vertex 0.682297 0.3 -0.493181 + vertex 0.678269 0.325431 -0.493181 + endloop + endfacet + facet normal 0.2453 0.038852 -0.968668 + outer loop + vertex 0.76235 0.3 -0.472909 + vertex 0.678269 0.325431 -0.493181 + vertex 0.754404 0.350169 -0.472909 + endloop + endfacet + facet normal 0.221289 0.112752 0.968668 + outer loop + vertex 0.678269 0.325431 0.493181 + vertex 0.754404 0.350169 0.472909 + vertex 0.731344 0.395427 0.472909 + endloop + endfacet + facet normal 0.221289 0.112752 0.968668 + outer loop + vertex 0.678269 0.325431 0.493181 + vertex 0.731344 0.395427 0.472909 + vertex 0.66658 0.348373 0.493181 + endloop + endfacet + facet normal 0.361643 0.184267 0.913926 + outer loop + vertex 0.754404 0.350169 0.472909 + vertex 0.826326 0.373538 0.439737 + vertex 0.792525 0.439877 0.439737 + endloop + endfacet + facet normal 0.361643 0.184267 0.913926 + outer loop + vertex 0.754404 0.350169 0.472909 + vertex 0.792525 0.439877 0.439737 + vertex 0.731344 0.395427 0.472909 + endloop + endfacet + facet normal 0.491568 0.250466 0.834043 + outer loop + vertex 0.826326 0.373538 0.439737 + vertex 0.892075 0.394901 0.39457 + vertex 0.848454 0.480513 0.39457 + endloop + endfacet + facet normal 0.491568 0.250466 0.834043 + outer loop + vertex 0.826326 0.373538 0.439737 + vertex 0.848454 0.480513 0.39457 + vertex 0.792525 0.439877 0.439737 + endloop + endfacet + facet normal 0.607499 0.309536 0.731527 + outer loop + vertex 0.892075 0.394901 0.39457 + vertex 0.949858 0.413676 0.338641 + vertex 0.897607 0.516224 0.338641 + endloop + endfacet + facet normal 0.607499 0.309536 0.731527 + outer loop + vertex 0.892075 0.394901 0.39457 + vertex 0.897607 0.516224 0.338641 + vertex 0.848454 0.480513 0.39457 + endloop + endfacet + facet normal 0.706398 0.359928 0.609471 + outer loop + vertex 0.949858 0.413676 0.338641 + vertex 0.998096 0.429349 0.273474 + vertex 0.938641 0.546037 0.273474 + endloop + endfacet + facet normal 0.706397 0.359928 0.609471 + outer loop + vertex 0.949858 0.413676 0.338641 + vertex 0.938641 0.546037 0.273474 + vertex 0.897607 0.516224 0.338641 + endloop + endfacet + facet normal 0.785798 0.400384 0.471396 + outer loop + vertex 0.998096 0.429349 0.273474 + vertex 1.03548 0.441495 0.200848 + vertex 0.970438 0.569139 0.200848 + endloop + endfacet + facet normal 0.785798 0.400384 0.471396 + outer loop + vertex 0.998096 0.429349 0.273474 + vertex 0.970438 0.569139 0.200848 + vertex 0.938641 0.546037 0.273474 + endloop + endfacet + facet normal 0.843819 0.429947 0.321116 + outer loop + vertex 1.03548 0.441495 0.200848 + vertex 1.06098 0.449781 0.122743 + vertex 0.992131 0.5849 0.122743 + endloop + endfacet + facet normal 0.843819 0.429947 0.321116 + outer loop + vertex 1.03548 0.441495 0.200848 + vertex 0.992131 0.5849 0.122743 + vertex 0.970438 0.569139 0.200848 + endloop + endfacet + facet normal 0.879146 0.447947 0.162622 + outer loop + vertex 1.06098 0.449781 0.122743 + vertex 1.0739 0.453981 0.0412897 + vertex 1.00313 0.592889 0.0412897 + endloop + endfacet + facet normal 0.879146 0.447947 0.162622 + outer loop + vertex 1.06098 0.449781 0.122743 + vertex 1.00313 0.592889 0.0412897 + vertex 0.992131 0.5849 0.122743 + endloop + endfacet + facet normal 0.891007 0.45399 -0 + outer loop + vertex 1.0739 0.453981 0.0412897 + vertex 1.0739 0.453981 -0.0412897 + vertex 1.00313 0.592889 -0.0412897 + endloop + endfacet + facet normal 0.891007 0.45399 -0 + outer loop + vertex 1.0739 0.453981 0.0412897 + vertex 1.00313 0.592889 -0.0412897 + vertex 1.00313 0.592889 0.0412897 + endloop + endfacet + facet normal 0.879146 0.447947 -0.162622 + outer loop + vertex 1.0739 0.453981 -0.0412897 + vertex 1.06098 0.449781 -0.122743 + vertex 0.992131 0.5849 -0.122743 + endloop + endfacet + facet normal 0.879146 0.447947 -0.162622 + outer loop + vertex 1.0739 0.453981 -0.0412897 + vertex 0.992131 0.5849 -0.122743 + vertex 1.00313 0.592889 -0.0412897 + endloop + endfacet + facet normal 0.843818 0.429947 -0.321116 + outer loop + vertex 1.06098 0.449781 -0.122743 + vertex 1.03548 0.441495 -0.200848 + vertex 0.970438 0.569139 -0.200848 + endloop + endfacet + facet normal 0.843818 0.429947 -0.321117 + outer loop + vertex 1.06098 0.449781 -0.122743 + vertex 0.970438 0.569139 -0.200848 + vertex 0.992131 0.5849 -0.122743 + endloop + endfacet + facet normal 0.785798 0.400384 -0.471396 + outer loop + vertex 1.03548 0.441495 -0.200848 + vertex 0.998096 0.429349 -0.273474 + vertex 0.938641 0.546037 -0.273474 + endloop + endfacet + facet normal 0.785798 0.400384 -0.471396 + outer loop + vertex 1.03548 0.441495 -0.200848 + vertex 0.938641 0.546037 -0.273474 + vertex 0.970438 0.569139 -0.200848 + endloop + endfacet + facet normal 0.706398 0.359928 -0.609471 + outer loop + vertex 0.998096 0.429349 -0.273474 + vertex 0.949857 0.413676 -0.338641 + vertex 0.897607 0.516224 -0.338641 + endloop + endfacet + facet normal 0.706398 0.359927 -0.609471 + outer loop + vertex 0.998096 0.429349 -0.273474 + vertex 0.897607 0.516224 -0.338641 + vertex 0.938641 0.546037 -0.273474 + endloop + endfacet + facet normal 0.607499 0.309536 -0.731527 + outer loop + vertex 0.949857 0.413676 -0.338641 + vertex 0.892075 0.394901 -0.39457 + vertex 0.848454 0.480513 -0.39457 + endloop + endfacet + facet normal 0.607499 0.309536 -0.731527 + outer loop + vertex 0.949857 0.413676 -0.338641 + vertex 0.848454 0.480513 -0.39457 + vertex 0.897607 0.516224 -0.338641 + endloop + endfacet + facet normal 0.491568 0.250467 -0.834043 + outer loop + vertex 0.892075 0.394901 -0.39457 + vertex 0.826326 0.373538 -0.439737 + vertex 0.792525 0.439877 -0.439737 + endloop + endfacet + facet normal 0.491568 0.250466 -0.834043 + outer loop + vertex 0.892075 0.394901 -0.39457 + vertex 0.792525 0.439877 -0.439737 + vertex 0.848454 0.480513 -0.39457 + endloop + endfacet + facet normal 0.361643 0.184266 -0.913926 + outer loop + vertex 0.826326 0.373538 -0.439737 + vertex 0.754404 0.350169 -0.472909 + vertex 0.731344 0.395427 -0.472909 + endloop + endfacet + facet normal 0.361643 0.184267 -0.913926 + outer loop + vertex 0.826326 0.373538 -0.439737 + vertex 0.731344 0.395427 -0.472909 + vertex 0.792525 0.439877 -0.439737 + endloop + endfacet + facet normal 0.221288 0.112752 -0.968668 + outer loop + vertex 0.754404 0.350169 -0.472909 + vertex 0.678269 0.325431 -0.493181 + vertex 0.66658 0.348373 -0.493181 + endloop + endfacet + facet normal 0.221288 0.112752 -0.968668 + outer loop + vertex 0.754404 0.350169 -0.472909 + vertex 0.66658 0.348373 -0.493181 + vertex 0.731344 0.395427 -0.472909 + endloop + endfacet + facet normal 0.175616 0.175616 0.968668 + outer loop + vertex 0.66658 0.348373 0.493181 + vertex 0.731344 0.395427 0.472909 + vertex 0.695427 0.431344 0.472909 + endloop + endfacet + facet normal 0.175616 0.175616 0.968668 + outer loop + vertex 0.66658 0.348373 0.493181 + vertex 0.695427 0.431344 0.472909 + vertex 0.648373 0.36658 0.493181 + endloop + endfacet + facet normal 0.287002 0.287002 0.913926 + outer loop + vertex 0.731344 0.395427 0.472909 + vertex 0.792525 0.439877 0.439737 + vertex 0.739877 0.492525 0.439737 + endloop + endfacet + facet normal 0.287002 0.287002 0.913925 + outer loop + vertex 0.731344 0.395427 0.472909 + vertex 0.739877 0.492525 0.439737 + vertex 0.695427 0.431344 0.472909 + endloop + endfacet + facet normal 0.390111 0.390111 0.834043 + outer loop + vertex 0.792525 0.439877 0.439737 + vertex 0.848454 0.480513 0.39457 + vertex 0.780513 0.548454 0.39457 + endloop + endfacet + facet normal 0.39011 0.390111 0.834043 + outer loop + vertex 0.792525 0.439877 0.439737 + vertex 0.780513 0.548454 0.39457 + vertex 0.739877 0.492525 0.439737 + endloop + endfacet + facet normal 0.482114 0.482114 0.731527 + outer loop + vertex 0.848454 0.480513 0.39457 + vertex 0.897607 0.516224 0.338641 + vertex 0.816224 0.597607 0.338641 + endloop + endfacet + facet normal 0.482114 0.482114 0.731527 + outer loop + vertex 0.848454 0.480513 0.39457 + vertex 0.816224 0.597607 0.338641 + vertex 0.780513 0.548454 0.39457 + endloop + endfacet + facet normal 0.5606 0.560601 0.609471 + outer loop + vertex 0.897607 0.516224 0.338641 + vertex 0.938641 0.546037 0.273474 + vertex 0.846037 0.638641 0.273474 + endloop + endfacet + facet normal 0.5606 0.5606 0.60947 + outer loop + vertex 0.897607 0.516224 0.338641 + vertex 0.846037 0.638641 0.273474 + vertex 0.816224 0.597607 0.338641 + endloop + endfacet + facet normal 0.623613 0.623613 0.471396 + outer loop + vertex 0.938641 0.546037 0.273474 + vertex 0.970438 0.569139 0.200848 + vertex 0.869139 0.670438 0.200848 + endloop + endfacet + facet normal 0.623612 0.623613 0.471396 + outer loop + vertex 0.938641 0.546037 0.273474 + vertex 0.869139 0.670438 0.200848 + vertex 0.846037 0.638641 0.273474 + endloop + endfacet + facet normal 0.669658 0.669658 0.321116 + outer loop + vertex 0.970438 0.569139 0.200848 + vertex 0.992131 0.5849 0.122743 + vertex 0.8849 0.692131 0.122743 + endloop + endfacet + facet normal 0.669658 0.669658 0.321116 + outer loop + vertex 0.970438 0.569139 0.200848 + vertex 0.8849 0.692131 0.122743 + vertex 0.869139 0.670438 0.200848 + endloop + endfacet + facet normal 0.697694 0.697694 0.162622 + outer loop + vertex 0.992131 0.5849 0.122743 + vertex 1.00313 0.592889 0.0412897 + vertex 0.892889 0.703127 0.0412897 + endloop + endfacet + facet normal 0.697694 0.697694 0.162622 + outer loop + vertex 0.992131 0.5849 0.122743 + vertex 0.892889 0.703127 0.0412897 + vertex 0.8849 0.692131 0.122743 + endloop + endfacet + facet normal 0.707107 0.707107 -0 + outer loop + vertex 1.00313 0.592889 0.0412897 + vertex 1.00313 0.592889 -0.0412897 + vertex 0.892889 0.703127 -0.0412897 + endloop + endfacet + facet normal 0.707107 0.707107 -0 + outer loop + vertex 1.00313 0.592889 0.0412897 + vertex 0.892889 0.703127 -0.0412897 + vertex 0.892889 0.703127 0.0412897 + endloop + endfacet + facet normal 0.697694 0.697694 -0.162622 + outer loop + vertex 1.00313 0.592889 -0.0412897 + vertex 0.992131 0.5849 -0.122743 + vertex 0.8849 0.692131 -0.122743 + endloop + endfacet + facet normal 0.697694 0.697694 -0.162623 + outer loop + vertex 1.00313 0.592889 -0.0412897 + vertex 0.8849 0.692131 -0.122743 + vertex 0.892889 0.703127 -0.0412897 + endloop + endfacet + facet normal 0.669658 0.669658 -0.321117 + outer loop + vertex 0.992131 0.5849 -0.122743 + vertex 0.970438 0.569139 -0.200848 + vertex 0.869139 0.670438 -0.200848 + endloop + endfacet + facet normal 0.669658 0.669659 -0.321116 + outer loop + vertex 0.992131 0.5849 -0.122743 + vertex 0.869139 0.670438 -0.200848 + vertex 0.8849 0.692131 -0.122743 + endloop + endfacet + facet normal 0.623613 0.623613 -0.471396 + outer loop + vertex 0.970438 0.569139 -0.200848 + vertex 0.938641 0.546037 -0.273474 + vertex 0.846037 0.638641 -0.273474 + endloop + endfacet + facet normal 0.623613 0.623612 -0.471396 + outer loop + vertex 0.970438 0.569139 -0.200848 + vertex 0.846037 0.638641 -0.273474 + vertex 0.869139 0.670438 -0.200848 + endloop + endfacet + facet normal 0.5606 0.560601 -0.609471 + outer loop + vertex 0.938641 0.546037 -0.273474 + vertex 0.897607 0.516224 -0.338641 + vertex 0.816224 0.597607 -0.338641 + endloop + endfacet + facet normal 0.5606 0.5606 -0.609471 + outer loop + vertex 0.938641 0.546037 -0.273474 + vertex 0.816224 0.597607 -0.338641 + vertex 0.846037 0.638641 -0.273474 + endloop + endfacet + facet normal 0.482114 0.482114 -0.731527 + outer loop + vertex 0.897607 0.516224 -0.338641 + vertex 0.848454 0.480513 -0.39457 + vertex 0.780513 0.548454 -0.39457 + endloop + endfacet + facet normal 0.482114 0.482114 -0.731527 + outer loop + vertex 0.897607 0.516224 -0.338641 + vertex 0.780513 0.548454 -0.39457 + vertex 0.816224 0.597607 -0.338641 + endloop + endfacet + facet normal 0.390111 0.390111 -0.834043 + outer loop + vertex 0.848454 0.480513 -0.39457 + vertex 0.792525 0.439877 -0.439737 + vertex 0.739877 0.492525 -0.439737 + endloop + endfacet + facet normal 0.390111 0.390111 -0.834043 + outer loop + vertex 0.848454 0.480513 -0.39457 + vertex 0.739877 0.492525 -0.439737 + vertex 0.780513 0.548454 -0.39457 + endloop + endfacet + facet normal 0.287002 0.287002 -0.913926 + outer loop + vertex 0.792525 0.439877 -0.439737 + vertex 0.731344 0.395427 -0.472909 + vertex 0.695427 0.431344 -0.472909 + endloop + endfacet + facet normal 0.287002 0.287002 -0.913926 + outer loop + vertex 0.792525 0.439877 -0.439737 + vertex 0.695427 0.431344 -0.472909 + vertex 0.739877 0.492525 -0.439737 + endloop + endfacet + facet normal 0.175615 0.175615 -0.968668 + outer loop + vertex 0.731344 0.395427 -0.472909 + vertex 0.66658 0.348373 -0.493181 + vertex 0.648373 0.36658 -0.493181 + endloop + endfacet + facet normal 0.175615 0.175615 -0.968668 + outer loop + vertex 0.731344 0.395427 -0.472909 + vertex 0.648373 0.36658 -0.493181 + vertex 0.695427 0.431344 -0.472909 + endloop + endfacet + facet normal 0.112752 0.221289 0.968668 + outer loop + vertex 0.648373 0.36658 0.493181 + vertex 0.695427 0.431344 0.472909 + vertex 0.650169 0.454404 0.472909 + endloop + endfacet + facet normal 0.112752 0.221289 0.968668 + outer loop + vertex 0.648373 0.36658 0.493181 + vertex 0.650169 0.454404 0.472909 + vertex 0.625431 0.378269 0.493181 + endloop + endfacet + facet normal 0.184267 0.361644 0.913925 + outer loop + vertex 0.695427 0.431344 0.472909 + vertex 0.739877 0.492525 0.439737 + vertex 0.673538 0.526326 0.439737 + endloop + endfacet + facet normal 0.184267 0.361644 0.913925 + outer loop + vertex 0.695427 0.431344 0.472909 + vertex 0.673538 0.526326 0.439737 + vertex 0.650169 0.454404 0.472909 + endloop + endfacet + facet normal 0.250466 0.491568 0.834043 + outer loop + vertex 0.739877 0.492525 0.439737 + vertex 0.780513 0.548454 0.39457 + vertex 0.694901 0.592076 0.39457 + endloop + endfacet + facet normal 0.250466 0.491568 0.834043 + outer loop + vertex 0.739877 0.492525 0.439737 + vertex 0.694901 0.592076 0.39457 + vertex 0.673538 0.526326 0.439737 + endloop + endfacet + facet normal 0.309536 0.607499 0.731527 + outer loop + vertex 0.780513 0.548454 0.39457 + vertex 0.816224 0.597607 0.338641 + vertex 0.713676 0.649858 0.338641 + endloop + endfacet + facet normal 0.309536 0.607499 0.731527 + outer loop + vertex 0.780513 0.548454 0.39457 + vertex 0.713676 0.649858 0.338641 + vertex 0.694901 0.592076 0.39457 + endloop + endfacet + facet normal 0.359928 0.706398 0.60947 + outer loop + vertex 0.816224 0.597607 0.338641 + vertex 0.846037 0.638641 0.273474 + vertex 0.729349 0.698096 0.273474 + endloop + endfacet + facet normal 0.359927 0.706398 0.609471 + outer loop + vertex 0.816224 0.597607 0.338641 + vertex 0.729349 0.698096 0.273474 + vertex 0.713676 0.649858 0.338641 + endloop + endfacet + facet normal 0.400384 0.785798 0.471396 + outer loop + vertex 0.846037 0.638641 0.273474 + vertex 0.869139 0.670438 0.200848 + vertex 0.741495 0.735476 0.200848 + endloop + endfacet + facet normal 0.400384 0.785798 0.471396 + outer loop + vertex 0.846037 0.638641 0.273474 + vertex 0.741495 0.735476 0.200848 + vertex 0.729349 0.698096 0.273474 + endloop + endfacet + facet normal 0.429947 0.843819 0.321116 + outer loop + vertex 0.869139 0.670438 0.200848 + vertex 0.8849 0.692131 0.122743 + vertex 0.749781 0.760977 0.122743 + endloop + endfacet + facet normal 0.429947 0.843819 0.321116 + outer loop + vertex 0.869139 0.670438 0.200848 + vertex 0.749781 0.760977 0.122743 + vertex 0.741495 0.735476 0.200848 + endloop + endfacet + facet normal 0.447947 0.879146 0.162622 + outer loop + vertex 0.8849 0.692131 0.122743 + vertex 0.892889 0.703127 0.0412897 + vertex 0.753981 0.773904 0.0412897 + endloop + endfacet + facet normal 0.447947 0.879146 0.162622 + outer loop + vertex 0.8849 0.692131 0.122743 + vertex 0.753981 0.773904 0.0412897 + vertex 0.749781 0.760977 0.122743 + endloop + endfacet + facet normal 0.45399 0.891007 -0 + outer loop + vertex 0.892889 0.703127 0.0412897 + vertex 0.892889 0.703127 -0.0412897 + vertex 0.753981 0.773904 -0.0412897 + endloop + endfacet + facet normal 0.45399 0.891007 -0 + outer loop + vertex 0.892889 0.703127 0.0412897 + vertex 0.753981 0.773904 -0.0412897 + vertex 0.753981 0.773904 0.0412897 + endloop + endfacet + facet normal 0.447947 0.879146 -0.162623 + outer loop + vertex 0.892889 0.703127 -0.0412897 + vertex 0.8849 0.692131 -0.122743 + vertex 0.749781 0.760977 -0.122743 + endloop + endfacet + facet normal 0.447947 0.879146 -0.162622 + outer loop + vertex 0.892889 0.703127 -0.0412897 + vertex 0.749781 0.760977 -0.122743 + vertex 0.753981 0.773904 -0.0412897 + endloop + endfacet + facet normal 0.429947 0.843819 -0.321116 + outer loop + vertex 0.8849 0.692131 -0.122743 + vertex 0.869139 0.670438 -0.200848 + vertex 0.741495 0.735476 -0.200848 + endloop + endfacet + facet normal 0.429947 0.843819 -0.321116 + outer loop + vertex 0.8849 0.692131 -0.122743 + vertex 0.741495 0.735476 -0.200848 + vertex 0.749781 0.760977 -0.122743 + endloop + endfacet + facet normal 0.400384 0.785798 -0.471397 + outer loop + vertex 0.869139 0.670438 -0.200848 + vertex 0.846037 0.638641 -0.273474 + vertex 0.729349 0.698096 -0.273474 + endloop + endfacet + facet normal 0.400384 0.785798 -0.471396 + outer loop + vertex 0.869139 0.670438 -0.200848 + vertex 0.729349 0.698096 -0.273474 + vertex 0.741495 0.735476 -0.200848 + endloop + endfacet + facet normal 0.359928 0.706397 -0.609471 + outer loop + vertex 0.846037 0.638641 -0.273474 + vertex 0.816224 0.597607 -0.338641 + vertex 0.713676 0.649858 -0.338641 + endloop + endfacet + facet normal 0.359928 0.706398 -0.609471 + outer loop + vertex 0.846037 0.638641 -0.273474 + vertex 0.713676 0.649858 -0.338641 + vertex 0.729349 0.698096 -0.273474 + endloop + endfacet + facet normal 0.309536 0.607499 -0.731527 + outer loop + vertex 0.816224 0.597607 -0.338641 + vertex 0.780513 0.548454 -0.39457 + vertex 0.694901 0.592075 -0.39457 + endloop + endfacet + facet normal 0.309536 0.607499 -0.731527 + outer loop + vertex 0.816224 0.597607 -0.338641 + vertex 0.694901 0.592075 -0.39457 + vertex 0.713676 0.649858 -0.338641 + endloop + endfacet + facet normal 0.250467 0.491568 -0.834043 + outer loop + vertex 0.780513 0.548454 -0.39457 + vertex 0.739877 0.492525 -0.439737 + vertex 0.673538 0.526326 -0.439737 + endloop + endfacet + facet normal 0.250467 0.491568 -0.834043 + outer loop + vertex 0.780513 0.548454 -0.39457 + vertex 0.673538 0.526326 -0.439737 + vertex 0.694901 0.592075 -0.39457 + endloop + endfacet + facet normal 0.184266 0.361644 -0.913925 + outer loop + vertex 0.739877 0.492525 -0.439737 + vertex 0.695427 0.431344 -0.472909 + vertex 0.650169 0.454404 -0.472909 + endloop + endfacet + facet normal 0.184267 0.361643 -0.913926 + outer loop + vertex 0.739877 0.492525 -0.439737 + vertex 0.650169 0.454404 -0.472909 + vertex 0.673538 0.526326 -0.439737 + endloop + endfacet + facet normal 0.112752 0.221288 -0.968668 + outer loop + vertex 0.695427 0.431344 -0.472909 + vertex 0.648373 0.36658 -0.493181 + vertex 0.625431 0.378269 -0.493181 + endloop + endfacet + facet normal 0.112752 0.221288 -0.968668 + outer loop + vertex 0.695427 0.431344 -0.472909 + vertex 0.625431 0.378269 -0.493181 + vertex 0.650169 0.454404 -0.472909 + endloop + endfacet + facet normal 0.0388517 0.2453 0.968668 + outer loop + vertex 0.625431 0.378269 0.493181 + vertex 0.650169 0.454404 0.472909 + vertex 0.6 0.46235 0.472909 + endloop + endfacet + facet normal 0.038852 0.2453 0.968668 + outer loop + vertex 0.625431 0.378269 0.493181 + vertex 0.6 0.46235 0.472909 + vertex 0.6 0.382297 0.493181 + endloop + endfacet + facet normal 0.063494 0.400885 0.913925 + outer loop + vertex 0.650169 0.454404 0.472909 + vertex 0.673538 0.526326 0.439737 + vertex 0.6 0.537974 0.439737 + endloop + endfacet + facet normal 0.0634938 0.400885 0.913926 + outer loop + vertex 0.650169 0.454404 0.472909 + vertex 0.6 0.537974 0.439737 + vertex 0.6 0.46235 0.472909 + endloop + endfacet + facet normal 0.0863048 0.544907 0.834043 + outer loop + vertex 0.673538 0.526326 0.439737 + vertex 0.694901 0.592076 0.39457 + vertex 0.6 0.607106 0.39457 + endloop + endfacet + facet normal 0.0863049 0.544907 0.834043 + outer loop + vertex 0.673538 0.526326 0.439737 + vertex 0.6 0.607106 0.39457 + vertex 0.6 0.537974 0.439737 + endloop + endfacet + facet normal 0.106659 0.673418 0.731527 + outer loop + vertex 0.694901 0.592076 0.39457 + vertex 0.713676 0.649858 0.338641 + vertex 0.6 0.667862 0.338641 + endloop + endfacet + facet normal 0.106659 0.673418 0.731527 + outer loop + vertex 0.694901 0.592076 0.39457 + vertex 0.6 0.667862 0.338641 + vertex 0.6 0.607106 0.39457 + endloop + endfacet + facet normal 0.124022 0.783048 0.609471 + outer loop + vertex 0.713676 0.649858 0.338641 + vertex 0.729349 0.698096 0.273474 + vertex 0.6 0.718583 0.273474 + endloop + endfacet + facet normal 0.124022 0.783048 0.609471 + outer loop + vertex 0.713676 0.649858 0.338641 + vertex 0.6 0.718583 0.273474 + vertex 0.6 0.667862 0.338641 + endloop + endfacet + facet normal 0.137963 0.871064 0.471396 + outer loop + vertex 0.729349 0.698096 0.273474 + vertex 0.741495 0.735476 0.200848 + vertex 0.6 0.757887 0.200848 + endloop + endfacet + facet normal 0.137963 0.871064 0.471396 + outer loop + vertex 0.729349 0.698096 0.273474 + vertex 0.6 0.757887 0.200848 + vertex 0.6 0.718583 0.273474 + endloop + endfacet + facet normal 0.14815 0.93538 0.321116 + outer loop + vertex 0.741495 0.735476 0.200848 + vertex 0.749781 0.760977 0.122743 + vertex 0.6 0.7847 0.122743 + endloop + endfacet + facet normal 0.14815 0.93538 0.321117 + outer loop + vertex 0.741495 0.735476 0.200848 + vertex 0.6 0.7847 0.122743 + vertex 0.6 0.757887 0.200848 + endloop + endfacet + facet normal 0.154352 0.974541 0.162622 + outer loop + vertex 0.749781 0.760977 0.122743 + vertex 0.753981 0.773904 0.0412897 + vertex 0.6 0.798292 0.0412897 + endloop + endfacet + facet normal 0.154352 0.974541 0.162621 + outer loop + vertex 0.749781 0.760977 0.122743 + vertex 0.6 0.798292 0.0412897 + vertex 0.6 0.7847 0.122743 + endloop + endfacet + facet normal 0.156434 0.987688 -0 + outer loop + vertex 0.753981 0.773904 0.0412897 + vertex 0.753981 0.773904 -0.0412897 + vertex 0.6 0.798292 -0.0412897 + endloop + endfacet + facet normal 0.156434 0.987688 -0 + outer loop + vertex 0.753981 0.773904 0.0412897 + vertex 0.6 0.798292 -0.0412897 + vertex 0.6 0.798292 0.0412897 + endloop + endfacet + facet normal 0.154352 0.974541 -0.162622 + outer loop + vertex 0.753981 0.773904 -0.0412897 + vertex 0.749781 0.760977 -0.122743 + vertex 0.6 0.7847 -0.122743 + endloop + endfacet + facet normal 0.154352 0.974541 -0.162622 + outer loop + vertex 0.753981 0.773904 -0.0412897 + vertex 0.6 0.7847 -0.122743 + vertex 0.6 0.798292 -0.0412897 + endloop + endfacet + facet normal 0.14815 0.93538 -0.321116 + outer loop + vertex 0.749781 0.760977 -0.122743 + vertex 0.741495 0.735476 -0.200848 + vertex 0.6 0.757887 -0.200848 + endloop + endfacet + facet normal 0.14815 0.93538 -0.321117 + outer loop + vertex 0.749781 0.760977 -0.122743 + vertex 0.6 0.757887 -0.200848 + vertex 0.6 0.7847 -0.122743 + endloop + endfacet + facet normal 0.137963 0.871064 -0.471396 + outer loop + vertex 0.741495 0.735476 -0.200848 + vertex 0.729349 0.698096 -0.273474 + vertex 0.6 0.718583 -0.273474 + endloop + endfacet + facet normal 0.137963 0.871064 -0.471396 + outer loop + vertex 0.741495 0.735476 -0.200848 + vertex 0.6 0.718583 -0.273474 + vertex 0.6 0.757887 -0.200848 + endloop + endfacet + facet normal 0.124022 0.783048 -0.609471 + outer loop + vertex 0.729349 0.698096 -0.273474 + vertex 0.713676 0.649858 -0.338641 + vertex 0.6 0.667862 -0.338641 + endloop + endfacet + facet normal 0.124022 0.783048 -0.609471 + outer loop + vertex 0.729349 0.698096 -0.273474 + vertex 0.6 0.667862 -0.338641 + vertex 0.6 0.718583 -0.273474 + endloop + endfacet + facet normal 0.106659 0.673418 -0.731527 + outer loop + vertex 0.713676 0.649858 -0.338641 + vertex 0.694901 0.592075 -0.39457 + vertex 0.6 0.607106 -0.39457 + endloop + endfacet + facet normal 0.106659 0.673418 -0.731527 + outer loop + vertex 0.713676 0.649858 -0.338641 + vertex 0.6 0.607106 -0.39457 + vertex 0.6 0.667862 -0.338641 + endloop + endfacet + facet normal 0.0863046 0.544908 -0.834043 + outer loop + vertex 0.694901 0.592075 -0.39457 + vertex 0.673538 0.526326 -0.439737 + vertex 0.6 0.537974 -0.439737 + endloop + endfacet + facet normal 0.0863049 0.544907 -0.834043 + outer loop + vertex 0.694901 0.592075 -0.39457 + vertex 0.6 0.537974 -0.439737 + vertex 0.6 0.607106 -0.39457 + endloop + endfacet + facet normal 0.0634938 0.400885 -0.913926 + outer loop + vertex 0.673538 0.526326 -0.439737 + vertex 0.650169 0.454404 -0.472909 + vertex 0.6 0.46235 -0.472909 + endloop + endfacet + facet normal 0.0634937 0.400885 -0.913926 + outer loop + vertex 0.673538 0.526326 -0.439737 + vertex 0.6 0.46235 -0.472909 + vertex 0.6 0.537974 -0.439737 + endloop + endfacet + facet normal 0.0388516 0.2453 -0.968668 + outer loop + vertex 0.650169 0.454404 -0.472909 + vertex 0.625431 0.378269 -0.493181 + vertex 0.6 0.382297 -0.493181 + endloop + endfacet + facet normal 0.0388516 0.2453 -0.968668 + outer loop + vertex 0.650169 0.454404 -0.472909 + vertex 0.6 0.382297 -0.493181 + vertex 0.6 0.46235 -0.472909 + endloop + endfacet + facet normal -0.0388517 0.2453 0.968668 + outer loop + vertex 0.6 0.382297 0.493181 + vertex 0.6 0.46235 0.472909 + vertex 0.549831 0.454404 0.472909 + endloop + endfacet + facet normal -0.0388519 0.2453 0.968668 + outer loop + vertex 0.6 0.382297 0.493181 + vertex 0.549831 0.454404 0.472909 + vertex 0.574569 0.378269 0.493181 + endloop + endfacet + facet normal -0.0634941 0.400885 0.913925 + outer loop + vertex 0.6 0.46235 0.472909 + vertex 0.6 0.537974 0.439737 + vertex 0.526462 0.526326 0.439737 + endloop + endfacet + facet normal -0.0634939 0.400885 0.913925 + outer loop + vertex 0.6 0.46235 0.472909 + vertex 0.526462 0.526326 0.439737 + vertex 0.549831 0.454404 0.472909 + endloop + endfacet + facet normal -0.0863048 0.544907 0.834043 + outer loop + vertex 0.6 0.537974 0.439737 + vertex 0.6 0.607106 0.39457 + vertex 0.505099 0.592076 0.39457 + endloop + endfacet + facet normal -0.086305 0.544907 0.834043 + outer loop + vertex 0.6 0.537974 0.439737 + vertex 0.505099 0.592076 0.39457 + vertex 0.526462 0.526326 0.439737 + endloop + endfacet + facet normal -0.106659 0.673419 0.731527 + outer loop + vertex 0.6 0.607106 0.39457 + vertex 0.6 0.667862 0.338641 + vertex 0.486324 0.649858 0.338641 + endloop + endfacet + facet normal -0.106659 0.673418 0.731527 + outer loop + vertex 0.6 0.607106 0.39457 + vertex 0.486324 0.649858 0.338641 + vertex 0.505099 0.592076 0.39457 + endloop + endfacet + facet normal -0.124022 0.783048 0.609471 + outer loop + vertex 0.6 0.667862 0.338641 + vertex 0.6 0.718583 0.273474 + vertex 0.470651 0.698096 0.273474 + endloop + endfacet + facet normal -0.124022 0.783048 0.609471 + outer loop + vertex 0.6 0.667862 0.338641 + vertex 0.470651 0.698096 0.273474 + vertex 0.486324 0.649858 0.338641 + endloop + endfacet + facet normal -0.137963 0.871064 0.471396 + outer loop + vertex 0.6 0.718583 0.273474 + vertex 0.6 0.757887 0.200848 + vertex 0.458505 0.735476 0.200848 + endloop + endfacet + facet normal -0.137963 0.871064 0.471396 + outer loop + vertex 0.6 0.718583 0.273474 + vertex 0.458505 0.735476 0.200848 + vertex 0.470651 0.698096 0.273474 + endloop + endfacet + facet normal -0.14815 0.93538 0.321117 + outer loop + vertex 0.6 0.757887 0.200848 + vertex 0.6 0.7847 0.122743 + vertex 0.450219 0.760977 0.122743 + endloop + endfacet + facet normal -0.14815 0.93538 0.321116 + outer loop + vertex 0.6 0.757887 0.200848 + vertex 0.450219 0.760977 0.122743 + vertex 0.458505 0.735476 0.200848 + endloop + endfacet + facet normal -0.154352 0.974541 0.162621 + outer loop + vertex 0.6 0.7847 0.122743 + vertex 0.6 0.798292 0.0412897 + vertex 0.446019 0.773904 0.0412897 + endloop + endfacet + facet normal -0.154352 0.974541 0.162622 + outer loop + vertex 0.6 0.7847 0.122743 + vertex 0.446019 0.773904 0.0412897 + vertex 0.450219 0.760977 0.122743 + endloop + endfacet + facet normal -0.156434 0.987688 0 + outer loop + vertex 0.6 0.798292 0.0412897 + vertex 0.6 0.798292 -0.0412897 + vertex 0.446019 0.773904 -0.0412897 + endloop + endfacet + facet normal -0.156434 0.987688 0 + outer loop + vertex 0.6 0.798292 0.0412897 + vertex 0.446019 0.773904 -0.0412897 + vertex 0.446019 0.773904 0.0412897 + endloop + endfacet + facet normal -0.154352 0.974541 -0.162621 + outer loop + vertex 0.6 0.798292 -0.0412897 + vertex 0.6 0.7847 -0.122743 + vertex 0.450219 0.760977 -0.122743 + endloop + endfacet + facet normal -0.154352 0.974541 -0.162622 + outer loop + vertex 0.6 0.798292 -0.0412897 + vertex 0.450219 0.760977 -0.122743 + vertex 0.446019 0.773904 -0.0412897 + endloop + endfacet + facet normal -0.14815 0.93538 -0.321117 + outer loop + vertex 0.6 0.7847 -0.122743 + vertex 0.6 0.757887 -0.200848 + vertex 0.458505 0.735476 -0.200848 + endloop + endfacet + facet normal -0.14815 0.93538 -0.321116 + outer loop + vertex 0.6 0.7847 -0.122743 + vertex 0.458505 0.735476 -0.200848 + vertex 0.450219 0.760977 -0.122743 + endloop + endfacet + facet normal -0.137963 0.871064 -0.471396 + outer loop + vertex 0.6 0.757887 -0.200848 + vertex 0.6 0.718583 -0.273474 + vertex 0.470651 0.698096 -0.273474 + endloop + endfacet + facet normal -0.137963 0.871064 -0.471396 + outer loop + vertex 0.6 0.757887 -0.200848 + vertex 0.470651 0.698096 -0.273474 + vertex 0.458505 0.735476 -0.200848 + endloop + endfacet + facet normal -0.124023 0.783048 -0.609471 + outer loop + vertex 0.6 0.718583 -0.273474 + vertex 0.6 0.667862 -0.338641 + vertex 0.486324 0.649857 -0.338641 + endloop + endfacet + facet normal -0.124023 0.783048 -0.609471 + outer loop + vertex 0.6 0.718583 -0.273474 + vertex 0.486324 0.649857 -0.338641 + vertex 0.470651 0.698096 -0.273474 + endloop + endfacet + facet normal -0.106659 0.673418 -0.731527 + outer loop + vertex 0.6 0.667862 -0.338641 + vertex 0.6 0.607106 -0.39457 + vertex 0.505099 0.592075 -0.39457 + endloop + endfacet + facet normal -0.106659 0.673418 -0.731527 + outer loop + vertex 0.6 0.667862 -0.338641 + vertex 0.505099 0.592075 -0.39457 + vertex 0.486324 0.649857 -0.338641 + endloop + endfacet + facet normal -0.0863046 0.544907 -0.834043 + outer loop + vertex 0.6 0.607106 -0.39457 + vertex 0.6 0.537974 -0.439737 + vertex 0.526462 0.526326 -0.439737 + endloop + endfacet + facet normal -0.086305 0.544908 -0.834043 + outer loop + vertex 0.6 0.607106 -0.39457 + vertex 0.526462 0.526326 -0.439737 + vertex 0.505099 0.592075 -0.39457 + endloop + endfacet + facet normal -0.0634939 0.400885 -0.913926 + outer loop + vertex 0.6 0.537974 -0.439737 + vertex 0.6 0.46235 -0.472909 + vertex 0.549831 0.454404 -0.472909 + endloop + endfacet + facet normal -0.0634937 0.400885 -0.913926 + outer loop + vertex 0.6 0.537974 -0.439737 + vertex 0.549831 0.454404 -0.472909 + vertex 0.526462 0.526326 -0.439737 + endloop + endfacet + facet normal -0.0388516 0.2453 -0.968668 + outer loop + vertex 0.6 0.46235 -0.472909 + vertex 0.6 0.382297 -0.493181 + vertex 0.574569 0.378269 -0.493181 + endloop + endfacet + facet normal -0.0388517 0.2453 -0.968668 + outer loop + vertex 0.6 0.46235 -0.472909 + vertex 0.574569 0.378269 -0.493181 + vertex 0.549831 0.454404 -0.472909 + endloop + endfacet + facet normal -0.112752 0.221289 0.968668 + outer loop + vertex 0.574569 0.378269 0.493181 + vertex 0.549831 0.454404 0.472909 + vertex 0.504573 0.431344 0.472909 + endloop + endfacet + facet normal -0.112752 0.221289 0.968668 + outer loop + vertex 0.574569 0.378269 0.493181 + vertex 0.504573 0.431344 0.472909 + vertex 0.551627 0.36658 0.493181 + endloop + endfacet + facet normal -0.184266 0.361644 0.913925 + outer loop + vertex 0.549831 0.454404 0.472909 + vertex 0.526462 0.526326 0.439737 + vertex 0.460123 0.492525 0.439737 + endloop + endfacet + facet normal -0.184267 0.361643 0.913926 + outer loop + vertex 0.549831 0.454404 0.472909 + vertex 0.460123 0.492525 0.439737 + vertex 0.504573 0.431344 0.472909 + endloop + endfacet + facet normal -0.250466 0.491568 0.834043 + outer loop + vertex 0.526462 0.526326 0.439737 + vertex 0.505099 0.592076 0.39457 + vertex 0.419487 0.548454 0.39457 + endloop + endfacet + facet normal -0.250466 0.491568 0.834043 + outer loop + vertex 0.526462 0.526326 0.439737 + vertex 0.419487 0.548454 0.39457 + vertex 0.460123 0.492525 0.439737 + endloop + endfacet + facet normal -0.309537 0.607499 0.731527 + outer loop + vertex 0.505099 0.592076 0.39457 + vertex 0.486324 0.649858 0.338641 + vertex 0.383776 0.597607 0.338641 + endloop + endfacet + facet normal -0.309537 0.6075 0.731527 + outer loop + vertex 0.505099 0.592076 0.39457 + vertex 0.383776 0.597607 0.338641 + vertex 0.419487 0.548454 0.39457 + endloop + endfacet + facet normal -0.359928 0.706398 0.609471 + outer loop + vertex 0.486324 0.649858 0.338641 + vertex 0.470651 0.698096 0.273474 + vertex 0.353963 0.638641 0.273474 + endloop + endfacet + facet normal -0.359928 0.706397 0.609471 + outer loop + vertex 0.486324 0.649858 0.338641 + vertex 0.353963 0.638641 0.273474 + vertex 0.383776 0.597607 0.338641 + endloop + endfacet + facet normal -0.400384 0.785798 0.471396 + outer loop + vertex 0.470651 0.698096 0.273474 + vertex 0.458505 0.735476 0.200848 + vertex 0.330861 0.670438 0.200848 + endloop + endfacet + facet normal -0.400384 0.785798 0.471396 + outer loop + vertex 0.470651 0.698096 0.273474 + vertex 0.330861 0.670438 0.200848 + vertex 0.353963 0.638641 0.273474 + endloop + endfacet + facet normal -0.429947 0.843819 0.321116 + outer loop + vertex 0.458505 0.735476 0.200848 + vertex 0.450219 0.760977 0.122743 + vertex 0.3151 0.692131 0.122743 + endloop + endfacet + facet normal -0.429947 0.843818 0.321117 + outer loop + vertex 0.458505 0.735476 0.200848 + vertex 0.3151 0.692131 0.122743 + vertex 0.330861 0.670438 0.200848 + endloop + endfacet + facet normal -0.447947 0.879146 0.162622 + outer loop + vertex 0.450219 0.760977 0.122743 + vertex 0.446019 0.773904 0.0412897 + vertex 0.307111 0.703127 0.0412897 + endloop + endfacet + facet normal -0.447947 0.879146 0.162622 + outer loop + vertex 0.450219 0.760977 0.122743 + vertex 0.307111 0.703127 0.0412897 + vertex 0.3151 0.692131 0.122743 + endloop + endfacet + facet normal -0.453991 0.891006 0 + outer loop + vertex 0.446019 0.773904 0.0412897 + vertex 0.446019 0.773904 -0.0412897 + vertex 0.307111 0.703127 -0.0412897 + endloop + endfacet + facet normal -0.45399 0.891007 -6.43116e-07 + outer loop + vertex 0.446019 0.773904 0.0412897 + vertex 0.307111 0.703127 -0.0412897 + vertex 0.307111 0.703127 0.0412897 + endloop + endfacet + facet normal -0.447947 0.879146 -0.162622 + outer loop + vertex 0.446019 0.773904 -0.0412897 + vertex 0.450219 0.760977 -0.122743 + vertex 0.3151 0.692131 -0.122743 + endloop + endfacet + facet normal -0.447947 0.879146 -0.162622 + outer loop + vertex 0.446019 0.773904 -0.0412897 + vertex 0.3151 0.692131 -0.122743 + vertex 0.307111 0.703127 -0.0412897 + endloop + endfacet + facet normal -0.429947 0.843819 -0.321116 + outer loop + vertex 0.450219 0.760977 -0.122743 + vertex 0.458505 0.735476 -0.200848 + vertex 0.330861 0.670438 -0.200848 + endloop + endfacet + facet normal -0.429947 0.843819 -0.321116 + outer loop + vertex 0.450219 0.760977 -0.122743 + vertex 0.330861 0.670438 -0.200848 + vertex 0.3151 0.692131 -0.122743 + endloop + endfacet + facet normal -0.400384 0.785798 -0.471396 + outer loop + vertex 0.458505 0.735476 -0.200848 + vertex 0.470651 0.698096 -0.273474 + vertex 0.353963 0.638641 -0.273474 + endloop + endfacet + facet normal -0.400384 0.785798 -0.471396 + outer loop + vertex 0.458505 0.735476 -0.200848 + vertex 0.353963 0.638641 -0.273474 + vertex 0.330861 0.670438 -0.200848 + endloop + endfacet + facet normal -0.359927 0.706398 -0.609471 + outer loop + vertex 0.470651 0.698096 -0.273474 + vertex 0.486324 0.649857 -0.338641 + vertex 0.383776 0.597607 -0.338641 + endloop + endfacet + facet normal -0.359927 0.706398 -0.609471 + outer loop + vertex 0.470651 0.698096 -0.273474 + vertex 0.383776 0.597607 -0.338641 + vertex 0.353963 0.638641 -0.273474 + endloop + endfacet + facet normal -0.309536 0.607499 -0.731527 + outer loop + vertex 0.486324 0.649857 -0.338641 + vertex 0.505099 0.592075 -0.39457 + vertex 0.419487 0.548454 -0.39457 + endloop + endfacet + facet normal -0.309536 0.607499 -0.731527 + outer loop + vertex 0.486324 0.649857 -0.338641 + vertex 0.419487 0.548454 -0.39457 + vertex 0.383776 0.597607 -0.338641 + endloop + endfacet + facet normal -0.250467 0.491568 -0.834043 + outer loop + vertex 0.505099 0.592075 -0.39457 + vertex 0.526462 0.526326 -0.439737 + vertex 0.460123 0.492525 -0.439737 + endloop + endfacet + facet normal -0.250466 0.491568 -0.834043 + outer loop + vertex 0.505099 0.592075 -0.39457 + vertex 0.460123 0.492525 -0.439737 + vertex 0.419487 0.548454 -0.39457 + endloop + endfacet + facet normal -0.184267 0.361643 -0.913926 + outer loop + vertex 0.526462 0.526326 -0.439737 + vertex 0.549831 0.454404 -0.472909 + vertex 0.504573 0.431344 -0.472909 + endloop + endfacet + facet normal -0.184267 0.361643 -0.913926 + outer loop + vertex 0.526462 0.526326 -0.439737 + vertex 0.504573 0.431344 -0.472909 + vertex 0.460123 0.492525 -0.439737 + endloop + endfacet + facet normal -0.112752 0.221288 -0.968668 + outer loop + vertex 0.549831 0.454404 -0.472909 + vertex 0.574569 0.378269 -0.493181 + vertex 0.551627 0.36658 -0.493181 + endloop + endfacet + facet normal -0.112752 0.221288 -0.968668 + outer loop + vertex 0.549831 0.454404 -0.472909 + vertex 0.551627 0.36658 -0.493181 + vertex 0.504573 0.431344 -0.472909 + endloop + endfacet + facet normal -0.175616 0.175616 0.968668 + outer loop + vertex 0.551627 0.36658 0.493181 + vertex 0.504573 0.431344 0.472909 + vertex 0.468656 0.395427 0.472909 + endloop + endfacet + facet normal -0.175616 0.175616 0.968668 + outer loop + vertex 0.551627 0.36658 0.493181 + vertex 0.468656 0.395427 0.472909 + vertex 0.53342 0.348373 0.493181 + endloop + endfacet + facet normal -0.287002 0.287002 0.913926 + outer loop + vertex 0.504573 0.431344 0.472909 + vertex 0.460123 0.492525 0.439737 + vertex 0.407475 0.439877 0.439737 + endloop + endfacet + facet normal -0.287002 0.287002 0.913925 + outer loop + vertex 0.504573 0.431344 0.472909 + vertex 0.407475 0.439877 0.439737 + vertex 0.468656 0.395427 0.472909 + endloop + endfacet + facet normal -0.390111 0.39011 0.834043 + outer loop + vertex 0.460123 0.492525 0.439737 + vertex 0.419487 0.548454 0.39457 + vertex 0.351546 0.480513 0.39457 + endloop + endfacet + facet normal -0.390111 0.39011 0.834043 + outer loop + vertex 0.460123 0.492525 0.439737 + vertex 0.351546 0.480513 0.39457 + vertex 0.407475 0.439877 0.439737 + endloop + endfacet + facet normal -0.482114 0.482114 0.731527 + outer loop + vertex 0.419487 0.548454 0.39457 + vertex 0.383776 0.597607 0.338641 + vertex 0.302393 0.516224 0.338641 + endloop + endfacet + facet normal -0.482114 0.482114 0.731527 + outer loop + vertex 0.419487 0.548454 0.39457 + vertex 0.302393 0.516224 0.338641 + vertex 0.351546 0.480513 0.39457 + endloop + endfacet + facet normal -0.5606 0.5606 0.609471 + outer loop + vertex 0.383776 0.597607 0.338641 + vertex 0.353963 0.638641 0.273474 + vertex 0.261359 0.546037 0.273474 + endloop + endfacet + facet normal -0.5606 0.5606 0.609471 + outer loop + vertex 0.383776 0.597607 0.338641 + vertex 0.261359 0.546037 0.273474 + vertex 0.302393 0.516224 0.338641 + endloop + endfacet + facet normal -0.623613 0.623613 0.471396 + outer loop + vertex 0.353963 0.638641 0.273474 + vertex 0.330861 0.670438 0.200848 + vertex 0.229562 0.569139 0.200848 + endloop + endfacet + facet normal -0.623613 0.623613 0.471396 + outer loop + vertex 0.353963 0.638641 0.273474 + vertex 0.229562 0.569139 0.200848 + vertex 0.261359 0.546037 0.273474 + endloop + endfacet + facet normal -0.669658 0.669658 0.321117 + outer loop + vertex 0.330861 0.670438 0.200848 + vertex 0.3151 0.692131 0.122743 + vertex 0.207869 0.5849 0.122743 + endloop + endfacet + facet normal -0.669658 0.669658 0.321116 + outer loop + vertex 0.330861 0.670438 0.200848 + vertex 0.207869 0.5849 0.122743 + vertex 0.229562 0.569139 0.200848 + endloop + endfacet + facet normal -0.697694 0.697694 0.162622 + outer loop + vertex 0.3151 0.692131 0.122743 + vertex 0.307111 0.703127 0.0412897 + vertex 0.196873 0.592889 0.0412897 + endloop + endfacet + facet normal -0.697694 0.697694 0.162622 + outer loop + vertex 0.3151 0.692131 0.122743 + vertex 0.196873 0.592889 0.0412897 + vertex 0.207869 0.5849 0.122743 + endloop + endfacet + facet normal -0.707107 0.707107 -5.1038e-07 + outer loop + vertex 0.307111 0.703127 0.0412897 + vertex 0.307111 0.703127 -0.0412897 + vertex 0.196873 0.592889 -0.0412897 + endloop + endfacet + facet normal -0.707107 0.707107 0 + outer loop + vertex 0.307111 0.703127 0.0412897 + vertex 0.196873 0.592889 -0.0412897 + vertex 0.196873 0.592889 0.0412897 + endloop + endfacet + facet normal -0.697694 0.697694 -0.162622 + outer loop + vertex 0.307111 0.703127 -0.0412897 + vertex 0.3151 0.692131 -0.122743 + vertex 0.207869 0.5849 -0.122743 + endloop + endfacet + facet normal -0.697694 0.697694 -0.162622 + outer loop + vertex 0.307111 0.703127 -0.0412897 + vertex 0.207869 0.5849 -0.122743 + vertex 0.196873 0.592889 -0.0412897 + endloop + endfacet + facet normal -0.669658 0.669658 -0.321116 + outer loop + vertex 0.3151 0.692131 -0.122743 + vertex 0.330861 0.670438 -0.200848 + vertex 0.229562 0.569139 -0.200848 + endloop + endfacet + facet normal -0.669658 0.669658 -0.321116 + outer loop + vertex 0.3151 0.692131 -0.122743 + vertex 0.229562 0.569139 -0.200848 + vertex 0.207869 0.5849 -0.122743 + endloop + endfacet + facet normal -0.623613 0.623613 -0.471396 + outer loop + vertex 0.330861 0.670438 -0.200848 + vertex 0.353963 0.638641 -0.273474 + vertex 0.261359 0.546037 -0.273474 + endloop + endfacet + facet normal -0.623613 0.623613 -0.471396 + outer loop + vertex 0.330861 0.670438 -0.200848 + vertex 0.261359 0.546037 -0.273474 + vertex 0.229562 0.569139 -0.200848 + endloop + endfacet + facet normal -0.5606 0.5606 -0.609471 + outer loop + vertex 0.353963 0.638641 -0.273474 + vertex 0.383776 0.597607 -0.338641 + vertex 0.302393 0.516224 -0.338641 + endloop + endfacet + facet normal -0.5606 0.5606 -0.609471 + outer loop + vertex 0.353963 0.638641 -0.273474 + vertex 0.302393 0.516224 -0.338641 + vertex 0.261359 0.546037 -0.273474 + endloop + endfacet + facet normal -0.482114 0.482114 -0.731527 + outer loop + vertex 0.383776 0.597607 -0.338641 + vertex 0.419487 0.548454 -0.39457 + vertex 0.351546 0.480513 -0.39457 + endloop + endfacet + facet normal -0.482114 0.482114 -0.731527 + outer loop + vertex 0.383776 0.597607 -0.338641 + vertex 0.351546 0.480513 -0.39457 + vertex 0.302393 0.516224 -0.338641 + endloop + endfacet + facet normal -0.390111 0.390111 -0.834043 + outer loop + vertex 0.419487 0.548454 -0.39457 + vertex 0.460123 0.492525 -0.439737 + vertex 0.407475 0.439877 -0.439737 + endloop + endfacet + facet normal -0.390111 0.390111 -0.834043 + outer loop + vertex 0.419487 0.548454 -0.39457 + vertex 0.407475 0.439877 -0.439737 + vertex 0.351546 0.480513 -0.39457 + endloop + endfacet + facet normal -0.287002 0.287002 -0.913926 + outer loop + vertex 0.460123 0.492525 -0.439737 + vertex 0.504573 0.431344 -0.472909 + vertex 0.468656 0.395427 -0.472909 + endloop + endfacet + facet normal -0.287002 0.287002 -0.913926 + outer loop + vertex 0.460123 0.492525 -0.439737 + vertex 0.468656 0.395427 -0.472909 + vertex 0.407475 0.439877 -0.439737 + endloop + endfacet + facet normal -0.175616 0.175615 -0.968668 + outer loop + vertex 0.504573 0.431344 -0.472909 + vertex 0.551627 0.36658 -0.493181 + vertex 0.53342 0.348373 -0.493181 + endloop + endfacet + facet normal -0.175615 0.175615 -0.968668 + outer loop + vertex 0.504573 0.431344 -0.472909 + vertex 0.53342 0.348373 -0.493181 + vertex 0.468656 0.395427 -0.472909 + endloop + endfacet + facet normal -0.221289 0.112752 0.968668 + outer loop + vertex 0.53342 0.348373 0.493181 + vertex 0.468656 0.395427 0.472909 + vertex 0.445596 0.350169 0.472909 + endloop + endfacet + facet normal -0.221289 0.112752 0.968668 + outer loop + vertex 0.53342 0.348373 0.493181 + vertex 0.445596 0.350169 0.472909 + vertex 0.521731 0.325431 0.493181 + endloop + endfacet + facet normal -0.361643 0.184267 0.913925 + outer loop + vertex 0.468656 0.395427 0.472909 + vertex 0.407475 0.439877 0.439737 + vertex 0.373674 0.373538 0.439737 + endloop + endfacet + facet normal -0.361643 0.184267 0.913925 + outer loop + vertex 0.468656 0.395427 0.472909 + vertex 0.373674 0.373538 0.439737 + vertex 0.445596 0.350169 0.472909 + endloop + endfacet + facet normal -0.491568 0.250466 0.834043 + outer loop + vertex 0.407475 0.439877 0.439737 + vertex 0.351546 0.480513 0.39457 + vertex 0.307924 0.394901 0.39457 + endloop + endfacet + facet normal -0.491568 0.250466 0.834043 + outer loop + vertex 0.407475 0.439877 0.439737 + vertex 0.307924 0.394901 0.39457 + vertex 0.373674 0.373538 0.439737 + endloop + endfacet + facet normal -0.607499 0.309536 0.731527 + outer loop + vertex 0.351546 0.480513 0.39457 + vertex 0.302393 0.516224 0.338641 + vertex 0.250142 0.413676 0.338641 + endloop + endfacet + facet normal -0.607499 0.309536 0.731527 + outer loop + vertex 0.351546 0.480513 0.39457 + vertex 0.250142 0.413676 0.338641 + vertex 0.307924 0.394901 0.39457 + endloop + endfacet + facet normal -0.706398 0.359928 0.609471 + outer loop + vertex 0.302393 0.516224 0.338641 + vertex 0.261359 0.546037 0.273474 + vertex 0.201904 0.429349 0.273474 + endloop + endfacet + facet normal -0.706398 0.359928 0.609471 + outer loop + vertex 0.302393 0.516224 0.338641 + vertex 0.201904 0.429349 0.273474 + vertex 0.250142 0.413676 0.338641 + endloop + endfacet + facet normal -0.785798 0.400384 0.471396 + outer loop + vertex 0.261359 0.546037 0.273474 + vertex 0.229562 0.569139 0.200848 + vertex 0.164524 0.441495 0.200848 + endloop + endfacet + facet normal -0.785798 0.400384 0.471396 + outer loop + vertex 0.261359 0.546037 0.273474 + vertex 0.164524 0.441495 0.200848 + vertex 0.201904 0.429349 0.273474 + endloop + endfacet + facet normal -0.843819 0.429947 0.321116 + outer loop + vertex 0.229562 0.569139 0.200848 + vertex 0.207869 0.5849 0.122743 + vertex 0.139023 0.449781 0.122743 + endloop + endfacet + facet normal -0.843819 0.429947 0.321116 + outer loop + vertex 0.229562 0.569139 0.200848 + vertex 0.139023 0.449781 0.122743 + vertex 0.164524 0.441495 0.200848 + endloop + endfacet + facet normal -0.879146 0.447947 0.162622 + outer loop + vertex 0.207869 0.5849 0.122743 + vertex 0.196873 0.592889 0.0412897 + vertex 0.126096 0.453981 0.0412897 + endloop + endfacet + facet normal -0.879146 0.447947 0.162622 + outer loop + vertex 0.207869 0.5849 0.122743 + vertex 0.126096 0.453981 0.0412897 + vertex 0.139023 0.449781 0.122743 + endloop + endfacet + facet normal -0.891007 0.45399 0 + outer loop + vertex 0.196873 0.592889 0.0412897 + vertex 0.196873 0.592889 -0.0412897 + vertex 0.126096 0.453981 -0.0412897 + endloop + endfacet + facet normal -0.891007 0.45399 -1.60779e-07 + outer loop + vertex 0.196873 0.592889 0.0412897 + vertex 0.126096 0.453981 -0.0412897 + vertex 0.126096 0.453981 0.0412897 + endloop + endfacet + facet normal -0.879146 0.447947 -0.162622 + outer loop + vertex 0.196873 0.592889 -0.0412897 + vertex 0.207869 0.5849 -0.122743 + vertex 0.139023 0.449781 -0.122743 + endloop + endfacet + facet normal -0.879146 0.447947 -0.162622 + outer loop + vertex 0.196873 0.592889 -0.0412897 + vertex 0.139023 0.449781 -0.122743 + vertex 0.126096 0.453981 -0.0412897 + endloop + endfacet + facet normal -0.843819 0.429947 -0.321116 + outer loop + vertex 0.207869 0.5849 -0.122743 + vertex 0.229562 0.569139 -0.200848 + vertex 0.164524 0.441495 -0.200848 + endloop + endfacet + facet normal -0.843819 0.429947 -0.321116 + outer loop + vertex 0.207869 0.5849 -0.122743 + vertex 0.164524 0.441495 -0.200848 + vertex 0.139023 0.449781 -0.122743 + endloop + endfacet + facet normal -0.785798 0.400384 -0.471396 + outer loop + vertex 0.229562 0.569139 -0.200848 + vertex 0.261359 0.546037 -0.273474 + vertex 0.201904 0.429349 -0.273474 + endloop + endfacet + facet normal -0.785798 0.400384 -0.471396 + outer loop + vertex 0.229562 0.569139 -0.200848 + vertex 0.201904 0.429349 -0.273474 + vertex 0.164524 0.441495 -0.200848 + endloop + endfacet + facet normal -0.706398 0.359927 -0.609471 + outer loop + vertex 0.261359 0.546037 -0.273474 + vertex 0.302393 0.516224 -0.338641 + vertex 0.250143 0.413676 -0.338641 + endloop + endfacet + facet normal -0.706398 0.359927 -0.609471 + outer loop + vertex 0.261359 0.546037 -0.273474 + vertex 0.250143 0.413676 -0.338641 + vertex 0.201904 0.429349 -0.273474 + endloop + endfacet + facet normal -0.607499 0.309536 -0.731527 + outer loop + vertex 0.302393 0.516224 -0.338641 + vertex 0.351546 0.480513 -0.39457 + vertex 0.307925 0.394901 -0.39457 + endloop + endfacet + facet normal -0.607499 0.309536 -0.731527 + outer loop + vertex 0.302393 0.516224 -0.338641 + vertex 0.307925 0.394901 -0.39457 + vertex 0.250143 0.413676 -0.338641 + endloop + endfacet + facet normal -0.491568 0.250467 -0.834043 + outer loop + vertex 0.351546 0.480513 -0.39457 + vertex 0.407475 0.439877 -0.439737 + vertex 0.373674 0.373538 -0.439737 + endloop + endfacet + facet normal -0.491568 0.250466 -0.834043 + outer loop + vertex 0.351546 0.480513 -0.39457 + vertex 0.373674 0.373538 -0.439737 + vertex 0.307925 0.394901 -0.39457 + endloop + endfacet + facet normal -0.361643 0.184267 -0.913926 + outer loop + vertex 0.407475 0.439877 -0.439737 + vertex 0.468656 0.395427 -0.472909 + vertex 0.445596 0.350169 -0.472909 + endloop + endfacet + facet normal -0.361643 0.184267 -0.913926 + outer loop + vertex 0.407475 0.439877 -0.439737 + vertex 0.445596 0.350169 -0.472909 + vertex 0.373674 0.373538 -0.439737 + endloop + endfacet + facet normal -0.221288 0.112752 -0.968668 + outer loop + vertex 0.468656 0.395427 -0.472909 + vertex 0.53342 0.348373 -0.493181 + vertex 0.521731 0.325431 -0.493181 + endloop + endfacet + facet normal -0.221288 0.112752 -0.968668 + outer loop + vertex 0.468656 0.395427 -0.472909 + vertex 0.521731 0.325431 -0.493181 + vertex 0.445596 0.350169 -0.472909 + endloop + endfacet + facet normal -0.2453 0.0388517 0.968668 + outer loop + vertex 0.521731 0.325431 0.493181 + vertex 0.445596 0.350169 0.472909 + vertex 0.43765 0.3 0.472909 + endloop + endfacet + facet normal -0.2453 0.0388516 0.968668 + outer loop + vertex 0.521731 0.325431 0.493181 + vertex 0.43765 0.3 0.472909 + vertex 0.517703 0.3 0.493181 + endloop + endfacet + facet normal -0.400885 0.0634939 0.913926 + outer loop + vertex 0.445596 0.350169 0.472909 + vertex 0.373674 0.373538 0.439737 + vertex 0.362026 0.3 0.439737 + endloop + endfacet + facet normal -0.400885 0.0634939 0.913926 + outer loop + vertex 0.445596 0.350169 0.472909 + vertex 0.362026 0.3 0.439737 + vertex 0.43765 0.3 0.472909 + endloop + endfacet + facet normal -0.544907 0.0863047 0.834043 + outer loop + vertex 0.373674 0.373538 0.439737 + vertex 0.307924 0.394901 0.39457 + vertex 0.292894 0.3 0.39457 + endloop + endfacet + facet normal -0.544907 0.0863048 0.834043 + outer loop + vertex 0.373674 0.373538 0.439737 + vertex 0.292894 0.3 0.39457 + vertex 0.362026 0.3 0.439737 + endloop + endfacet + facet normal -0.673418 0.106659 0.731527 + outer loop + vertex 0.307924 0.394901 0.39457 + vertex 0.250142 0.413676 0.338641 + vertex 0.232138 0.3 0.338641 + endloop + endfacet + facet normal -0.673418 0.106659 0.731527 + outer loop + vertex 0.307924 0.394901 0.39457 + vertex 0.232138 0.3 0.338641 + vertex 0.292894 0.3 0.39457 + endloop + endfacet + facet normal -0.783048 0.124023 0.609471 + outer loop + vertex 0.250142 0.413676 0.338641 + vertex 0.201904 0.429349 0.273474 + vertex 0.181417 0.3 0.273474 + endloop + endfacet + facet normal -0.783048 0.124023 0.609471 + outer loop + vertex 0.250142 0.413676 0.338641 + vertex 0.181417 0.3 0.273474 + vertex 0.232138 0.3 0.338641 + endloop + endfacet + facet normal -0.871064 0.137963 0.471396 + outer loop + vertex 0.201904 0.429349 0.273474 + vertex 0.164524 0.441495 0.200848 + vertex 0.142113 0.3 0.200848 + endloop + endfacet + facet normal -0.871064 0.137963 0.471396 + outer loop + vertex 0.201904 0.429349 0.273474 + vertex 0.142113 0.3 0.200848 + vertex 0.181417 0.3 0.273474 + endloop + endfacet + facet normal -0.93538 0.14815 0.321116 + outer loop + vertex 0.164524 0.441495 0.200848 + vertex 0.139023 0.449781 0.122743 + vertex 0.1153 0.3 0.122743 + endloop + endfacet + facet normal -0.93538 0.14815 0.321116 + outer loop + vertex 0.164524 0.441495 0.200848 + vertex 0.1153 0.3 0.122743 + vertex 0.142113 0.3 0.200848 + endloop + endfacet + facet normal -0.974541 0.154352 0.162622 + outer loop + vertex 0.139023 0.449781 0.122743 + vertex 0.126096 0.453981 0.0412897 + vertex 0.101708 0.3 0.0412897 + endloop + endfacet + facet normal -0.974541 0.154352 0.162622 + outer loop + vertex 0.139023 0.449781 0.122743 + vertex 0.101708 0.3 0.0412897 + vertex 0.1153 0.3 0.122743 + endloop + endfacet + facet normal -0.987688 0.156434 -1.78225e-07 + outer loop + vertex 0.126096 0.453981 0.0412897 + vertex 0.126096 0.453981 -0.0412897 + vertex 0.101708 0.3 -0.0412897 + endloop + endfacet + facet normal -0.987688 0.156434 -8.91125e-08 + outer loop + vertex 0.126096 0.453981 0.0412897 + vertex 0.101708 0.3 -0.0412897 + vertex 0.101708 0.3 0.0412897 + endloop + endfacet + facet normal -0.974541 0.154352 -0.162622 + outer loop + vertex 0.126096 0.453981 -0.0412897 + vertex 0.139023 0.449781 -0.122743 + vertex 0.1153 0.3 -0.122743 + endloop + endfacet + facet normal -0.974541 0.154352 -0.162622 + outer loop + vertex 0.126096 0.453981 -0.0412897 + vertex 0.1153 0.3 -0.122743 + vertex 0.101708 0.3 -0.0412897 + endloop + endfacet + facet normal -0.93538 0.14815 -0.321116 + outer loop + vertex 0.139023 0.449781 -0.122743 + vertex 0.164524 0.441495 -0.200848 + vertex 0.142113 0.3 -0.200848 + endloop + endfacet + facet normal -0.93538 0.14815 -0.321116 + outer loop + vertex 0.139023 0.449781 -0.122743 + vertex 0.142113 0.3 -0.200848 + vertex 0.1153 0.3 -0.122743 + endloop + endfacet + facet normal -0.871064 0.137963 -0.471396 + outer loop + vertex 0.164524 0.441495 -0.200848 + vertex 0.201904 0.429349 -0.273474 + vertex 0.181417 0.3 -0.273474 + endloop + endfacet + facet normal -0.871064 0.137963 -0.471396 + outer loop + vertex 0.164524 0.441495 -0.200848 + vertex 0.181417 0.3 -0.273474 + vertex 0.142113 0.3 -0.200848 + endloop + endfacet + facet normal -0.783048 0.124023 -0.609471 + outer loop + vertex 0.201904 0.429349 -0.273474 + vertex 0.250143 0.413676 -0.338641 + vertex 0.232138 0.3 -0.338641 + endloop + endfacet + facet normal -0.783048 0.124022 -0.609471 + outer loop + vertex 0.201904 0.429349 -0.273474 + vertex 0.232138 0.3 -0.338641 + vertex 0.181417 0.3 -0.273474 + endloop + endfacet + facet normal -0.673418 0.106659 -0.731527 + outer loop + vertex 0.250143 0.413676 -0.338641 + vertex 0.307925 0.394901 -0.39457 + vertex 0.292894 0.3 -0.39457 + endloop + endfacet + facet normal -0.673418 0.106659 -0.731527 + outer loop + vertex 0.250143 0.413676 -0.338641 + vertex 0.292894 0.3 -0.39457 + vertex 0.232138 0.3 -0.338641 + endloop + endfacet + facet normal -0.544908 0.0863048 -0.834043 + outer loop + vertex 0.307925 0.394901 -0.39457 + vertex 0.373674 0.373538 -0.439737 + vertex 0.362026 0.3 -0.439737 + endloop + endfacet + facet normal -0.544908 0.0863048 -0.834043 + outer loop + vertex 0.307925 0.394901 -0.39457 + vertex 0.362026 0.3 -0.439737 + vertex 0.292894 0.3 -0.39457 + endloop + endfacet + facet normal -0.400885 0.0634939 -0.913926 + outer loop + vertex 0.373674 0.373538 -0.439737 + vertex 0.445596 0.350169 -0.472909 + vertex 0.43765 0.3 -0.472909 + endloop + endfacet + facet normal -0.400885 0.0634939 -0.913926 + outer loop + vertex 0.373674 0.373538 -0.439737 + vertex 0.43765 0.3 -0.472909 + vertex 0.362026 0.3 -0.439737 + endloop + endfacet + facet normal -0.2453 0.0388516 -0.968668 + outer loop + vertex 0.445596 0.350169 -0.472909 + vertex 0.521731 0.325431 -0.493181 + vertex 0.517703 0.3 -0.493181 + endloop + endfacet + facet normal -0.2453 0.0388517 -0.968668 + outer loop + vertex 0.445596 0.350169 -0.472909 + vertex 0.517703 0.3 -0.493181 + vertex 0.43765 0.3 -0.472909 + endloop + endfacet + facet normal -0.2453 -0.0388517 0.968668 + outer loop + vertex 0.517703 0.3 0.493181 + vertex 0.43765 0.3 0.472909 + vertex 0.445596 0.249831 0.472909 + endloop + endfacet + facet normal -0.2453 -0.0388517 0.968668 + outer loop + vertex 0.517703 0.3 0.493181 + vertex 0.445596 0.249831 0.472909 + vertex 0.521731 0.274569 0.493181 + endloop + endfacet + facet normal -0.400885 -0.0634939 0.913926 + outer loop + vertex 0.43765 0.3 0.472909 + vertex 0.362026 0.3 0.439737 + vertex 0.373674 0.226462 0.439737 + endloop + endfacet + facet normal -0.400885 -0.0634939 0.913926 + outer loop + vertex 0.43765 0.3 0.472909 + vertex 0.373674 0.226462 0.439737 + vertex 0.445596 0.249831 0.472909 + endloop + endfacet + facet normal -0.544907 -0.0863049 0.834043 + outer loop + vertex 0.362026 0.3 0.439737 + vertex 0.292894 0.3 0.39457 + vertex 0.307925 0.205099 0.39457 + endloop + endfacet + facet normal -0.544907 -0.0863048 0.834043 + outer loop + vertex 0.362026 0.3 0.439737 + vertex 0.307925 0.205099 0.39457 + vertex 0.373674 0.226462 0.439737 + endloop + endfacet + facet normal -0.673418 -0.106659 0.731527 + outer loop + vertex 0.292894 0.3 0.39457 + vertex 0.232138 0.3 0.338641 + vertex 0.250142 0.186324 0.338641 + endloop + endfacet + facet normal -0.673418 -0.106659 0.731527 + outer loop + vertex 0.292894 0.3 0.39457 + vertex 0.250142 0.186324 0.338641 + vertex 0.307925 0.205099 0.39457 + endloop + endfacet + facet normal -0.783048 -0.124023 0.609471 + outer loop + vertex 0.232138 0.3 0.338641 + vertex 0.181417 0.3 0.273474 + vertex 0.201904 0.170651 0.273474 + endloop + endfacet + facet normal -0.783048 -0.124023 0.609471 + outer loop + vertex 0.232138 0.3 0.338641 + vertex 0.201904 0.170651 0.273474 + vertex 0.250142 0.186324 0.338641 + endloop + endfacet + facet normal -0.871064 -0.137963 0.471396 + outer loop + vertex 0.181417 0.3 0.273474 + vertex 0.142113 0.3 0.200848 + vertex 0.164524 0.158505 0.200848 + endloop + endfacet + facet normal -0.871064 -0.137963 0.471396 + outer loop + vertex 0.181417 0.3 0.273474 + vertex 0.164524 0.158505 0.200848 + vertex 0.201904 0.170651 0.273474 + endloop + endfacet + facet normal -0.93538 -0.14815 0.321116 + outer loop + vertex 0.142113 0.3 0.200848 + vertex 0.1153 0.3 0.122743 + vertex 0.139023 0.150219 0.122743 + endloop + endfacet + facet normal -0.93538 -0.14815 0.321116 + outer loop + vertex 0.142113 0.3 0.200848 + vertex 0.139023 0.150219 0.122743 + vertex 0.164524 0.158505 0.200848 + endloop + endfacet + facet normal -0.974541 -0.154352 0.162622 + outer loop + vertex 0.1153 0.3 0.122743 + vertex 0.101708 0.3 0.0412897 + vertex 0.126096 0.146019 0.0412897 + endloop + endfacet + facet normal -0.974541 -0.154352 0.162622 + outer loop + vertex 0.1153 0.3 0.122743 + vertex 0.126096 0.146019 0.0412897 + vertex 0.139023 0.150219 0.122743 + endloop + endfacet + facet normal -0.987688 -0.156435 -8.91125e-08 + outer loop + vertex 0.101708 0.3 0.0412897 + vertex 0.101708 0.3 -0.0412897 + vertex 0.126096 0.146019 -0.0412897 + endloop + endfacet + facet normal -0.987688 -0.156435 -1.78225e-07 + outer loop + vertex 0.101708 0.3 0.0412897 + vertex 0.126096 0.146019 -0.0412897 + vertex 0.126096 0.146019 0.0412897 + endloop + endfacet + facet normal -0.974541 -0.154352 -0.162622 + outer loop + vertex 0.101708 0.3 -0.0412897 + vertex 0.1153 0.3 -0.122743 + vertex 0.139023 0.150219 -0.122743 + endloop + endfacet + facet normal -0.974541 -0.154352 -0.162622 + outer loop + vertex 0.101708 0.3 -0.0412897 + vertex 0.139023 0.150219 -0.122743 + vertex 0.126096 0.146019 -0.0412897 + endloop + endfacet + facet normal -0.93538 -0.14815 -0.321116 + outer loop + vertex 0.1153 0.3 -0.122743 + vertex 0.142113 0.3 -0.200848 + vertex 0.164524 0.158505 -0.200848 + endloop + endfacet + facet normal -0.93538 -0.14815 -0.321116 + outer loop + vertex 0.1153 0.3 -0.122743 + vertex 0.164524 0.158505 -0.200848 + vertex 0.139023 0.150219 -0.122743 + endloop + endfacet + facet normal -0.871064 -0.137963 -0.471396 + outer loop + vertex 0.142113 0.3 -0.200848 + vertex 0.181417 0.3 -0.273474 + vertex 0.201904 0.170651 -0.273474 + endloop + endfacet + facet normal -0.871064 -0.137963 -0.471396 + outer loop + vertex 0.142113 0.3 -0.200848 + vertex 0.201904 0.170651 -0.273474 + vertex 0.164524 0.158505 -0.200848 + endloop + endfacet + facet normal -0.783048 -0.124023 -0.609471 + outer loop + vertex 0.181417 0.3 -0.273474 + vertex 0.232138 0.3 -0.338641 + vertex 0.250143 0.186324 -0.338641 + endloop + endfacet + facet normal -0.783048 -0.124023 -0.609471 + outer loop + vertex 0.181417 0.3 -0.273474 + vertex 0.250143 0.186324 -0.338641 + vertex 0.201904 0.170651 -0.273474 + endloop + endfacet + facet normal -0.673418 -0.106659 -0.731527 + outer loop + vertex 0.232138 0.3 -0.338641 + vertex 0.292894 0.3 -0.39457 + vertex 0.307925 0.205099 -0.39457 + endloop + endfacet + facet normal -0.673418 -0.106659 -0.731527 + outer loop + vertex 0.232138 0.3 -0.338641 + vertex 0.307925 0.205099 -0.39457 + vertex 0.250143 0.186324 -0.338641 + endloop + endfacet + facet normal -0.544908 -0.086305 -0.834043 + outer loop + vertex 0.292894 0.3 -0.39457 + vertex 0.362026 0.3 -0.439737 + vertex 0.373674 0.226462 -0.439737 + endloop + endfacet + facet normal -0.544907 -0.0863049 -0.834043 + outer loop + vertex 0.292894 0.3 -0.39457 + vertex 0.373674 0.226462 -0.439737 + vertex 0.307925 0.205099 -0.39457 + endloop + endfacet + facet normal -0.400885 -0.0634941 -0.913925 + outer loop + vertex 0.362026 0.3 -0.439737 + vertex 0.43765 0.3 -0.472909 + vertex 0.445596 0.249831 -0.472909 + endloop + endfacet + facet normal -0.400885 -0.063494 -0.913926 + outer loop + vertex 0.362026 0.3 -0.439737 + vertex 0.445596 0.249831 -0.472909 + vertex 0.373674 0.226462 -0.439737 + endloop + endfacet + facet normal -0.2453 -0.0388516 -0.968668 + outer loop + vertex 0.43765 0.3 -0.472909 + vertex 0.517703 0.3 -0.493181 + vertex 0.521731 0.274569 -0.493181 + endloop + endfacet + facet normal -0.2453 -0.0388518 -0.968668 + outer loop + vertex 0.43765 0.3 -0.472909 + vertex 0.521731 0.274569 -0.493181 + vertex 0.445596 0.249831 -0.472909 + endloop + endfacet + facet normal -0.221289 -0.112752 0.968668 + outer loop + vertex 0.521731 0.274569 0.493181 + vertex 0.445596 0.249831 0.472909 + vertex 0.468656 0.204573 0.472909 + endloop + endfacet + facet normal -0.221289 -0.112752 0.968668 + outer loop + vertex 0.521731 0.274569 0.493181 + vertex 0.468656 0.204573 0.472909 + vertex 0.53342 0.251627 0.493181 + endloop + endfacet + facet normal -0.361643 -0.184267 0.913926 + outer loop + vertex 0.445596 0.249831 0.472909 + vertex 0.373674 0.226462 0.439737 + vertex 0.407475 0.160123 0.439737 + endloop + endfacet + facet normal -0.361643 -0.184267 0.913926 + outer loop + vertex 0.445596 0.249831 0.472909 + vertex 0.407475 0.160123 0.439737 + vertex 0.468656 0.204573 0.472909 + endloop + endfacet + facet normal -0.491568 -0.250466 0.834043 + outer loop + vertex 0.373674 0.226462 0.439737 + vertex 0.307925 0.205099 0.39457 + vertex 0.351546 0.119487 0.39457 + endloop + endfacet + facet normal -0.491568 -0.250466 0.834043 + outer loop + vertex 0.373674 0.226462 0.439737 + vertex 0.351546 0.119487 0.39457 + vertex 0.407475 0.160123 0.439737 + endloop + endfacet + facet normal -0.607499 -0.309536 0.731527 + outer loop + vertex 0.307925 0.205099 0.39457 + vertex 0.250142 0.186324 0.338641 + vertex 0.302393 0.0837761 0.338641 + endloop + endfacet + facet normal -0.607499 -0.309536 0.731527 + outer loop + vertex 0.307925 0.205099 0.39457 + vertex 0.302393 0.0837761 0.338641 + vertex 0.351546 0.119487 0.39457 + endloop + endfacet + facet normal -0.706398 -0.359928 0.609471 + outer loop + vertex 0.250142 0.186324 0.338641 + vertex 0.201904 0.170651 0.273474 + vertex 0.261359 0.0539629 0.273474 + endloop + endfacet + facet normal -0.706398 -0.359928 0.609471 + outer loop + vertex 0.250142 0.186324 0.338641 + vertex 0.261359 0.0539629 0.273474 + vertex 0.302393 0.0837761 0.338641 + endloop + endfacet + facet normal -0.785798 -0.400384 0.471396 + outer loop + vertex 0.201904 0.170651 0.273474 + vertex 0.164524 0.158505 0.200848 + vertex 0.229562 0.0308609 0.200848 + endloop + endfacet + facet normal -0.785798 -0.400384 0.471396 + outer loop + vertex 0.201904 0.170651 0.273474 + vertex 0.229562 0.0308609 0.200848 + vertex 0.261359 0.0539629 0.273474 + endloop + endfacet + facet normal -0.843819 -0.429947 0.321116 + outer loop + vertex 0.164524 0.158505 0.200848 + vertex 0.139023 0.150219 0.122743 + vertex 0.207869 0.0151004 0.122743 + endloop + endfacet + facet normal -0.843819 -0.429947 0.321116 + outer loop + vertex 0.164524 0.158505 0.200848 + vertex 0.207869 0.0151004 0.122743 + vertex 0.229562 0.0308609 0.200848 + endloop + endfacet + facet normal -0.879146 -0.447947 0.162622 + outer loop + vertex 0.139023 0.150219 0.122743 + vertex 0.126096 0.146019 0.0412897 + vertex 0.196873 0.00711112 0.0412897 + endloop + endfacet + facet normal -0.879146 -0.447947 0.162622 + outer loop + vertex 0.139023 0.150219 0.122743 + vertex 0.196873 0.00711112 0.0412897 + vertex 0.207869 0.0151004 0.122743 + endloop + endfacet + facet normal -0.891006 -0.453991 -1.60779e-07 + outer loop + vertex 0.126096 0.146019 0.0412897 + vertex 0.126096 0.146019 -0.0412897 + vertex 0.196873 0.00711113 -0.0412897 + endloop + endfacet + facet normal -0.891006 -0.453991 -1.73579e-07 + outer loop + vertex 0.126096 0.146019 0.0412897 + vertex 0.196873 0.00711113 -0.0412897 + vertex 0.196873 0.00711112 0.0412897 + endloop + endfacet + facet normal -0.879146 -0.447947 -0.162622 + outer loop + vertex 0.126096 0.146019 -0.0412897 + vertex 0.139023 0.150219 -0.122743 + vertex 0.207869 0.0151004 -0.122743 + endloop + endfacet + facet normal -0.879146 -0.447947 -0.162622 + outer loop + vertex 0.126096 0.146019 -0.0412897 + vertex 0.207869 0.0151004 -0.122743 + vertex 0.196873 0.00711113 -0.0412897 + endloop + endfacet + facet normal -0.843819 -0.429947 -0.321116 + outer loop + vertex 0.139023 0.150219 -0.122743 + vertex 0.164524 0.158505 -0.200848 + vertex 0.229562 0.0308609 -0.200848 + endloop + endfacet + facet normal -0.843819 -0.429947 -0.321116 + outer loop + vertex 0.139023 0.150219 -0.122743 + vertex 0.229562 0.0308609 -0.200848 + vertex 0.207869 0.0151004 -0.122743 + endloop + endfacet + facet normal -0.785798 -0.400384 -0.471396 + outer loop + vertex 0.164524 0.158505 -0.200848 + vertex 0.201904 0.170651 -0.273474 + vertex 0.261359 0.0539629 -0.273474 + endloop + endfacet + facet normal -0.785798 -0.400384 -0.471396 + outer loop + vertex 0.164524 0.158505 -0.200848 + vertex 0.261359 0.0539629 -0.273474 + vertex 0.229562 0.0308609 -0.200848 + endloop + endfacet + facet normal -0.706398 -0.359928 -0.609471 + outer loop + vertex 0.201904 0.170651 -0.273474 + vertex 0.250143 0.186324 -0.338641 + vertex 0.302393 0.0837761 -0.338641 + endloop + endfacet + facet normal -0.706398 -0.359928 -0.609471 + outer loop + vertex 0.201904 0.170651 -0.273474 + vertex 0.302393 0.0837761 -0.338641 + vertex 0.261359 0.0539629 -0.273474 + endloop + endfacet + facet normal -0.607499 -0.309536 -0.731527 + outer loop + vertex 0.250143 0.186324 -0.338641 + vertex 0.307925 0.205099 -0.39457 + vertex 0.351546 0.119487 -0.39457 + endloop + endfacet + facet normal -0.607499 -0.309536 -0.731527 + outer loop + vertex 0.250143 0.186324 -0.338641 + vertex 0.351546 0.119487 -0.39457 + vertex 0.302393 0.0837761 -0.338641 + endloop + endfacet + facet normal -0.491568 -0.250466 -0.834043 + outer loop + vertex 0.307925 0.205099 -0.39457 + vertex 0.373674 0.226462 -0.439737 + vertex 0.407475 0.160123 -0.439737 + endloop + endfacet + facet normal -0.491568 -0.250467 -0.834043 + outer loop + vertex 0.307925 0.205099 -0.39457 + vertex 0.407475 0.160123 -0.439737 + vertex 0.351546 0.119487 -0.39457 + endloop + endfacet + facet normal -0.361643 -0.184266 -0.913926 + outer loop + vertex 0.373674 0.226462 -0.439737 + vertex 0.445596 0.249831 -0.472909 + vertex 0.468656 0.204573 -0.472909 + endloop + endfacet + facet normal -0.361644 -0.184266 -0.913926 + outer loop + vertex 0.373674 0.226462 -0.439737 + vertex 0.468656 0.204573 -0.472909 + vertex 0.407475 0.160123 -0.439737 + endloop + endfacet + facet normal -0.221288 -0.112752 -0.968668 + outer loop + vertex 0.445596 0.249831 -0.472909 + vertex 0.521731 0.274569 -0.493181 + vertex 0.53342 0.251627 -0.493181 + endloop + endfacet + facet normal -0.221288 -0.112752 -0.968668 + outer loop + vertex 0.445596 0.249831 -0.472909 + vertex 0.53342 0.251627 -0.493181 + vertex 0.468656 0.204573 -0.472909 + endloop + endfacet + facet normal -0.175616 -0.175616 0.968668 + outer loop + vertex 0.53342 0.251627 0.493181 + vertex 0.468656 0.204573 0.472909 + vertex 0.504573 0.168656 0.472909 + endloop + endfacet + facet normal -0.175616 -0.175616 0.968668 + outer loop + vertex 0.53342 0.251627 0.493181 + vertex 0.504573 0.168656 0.472909 + vertex 0.551627 0.23342 0.493181 + endloop + endfacet + facet normal -0.287002 -0.287002 0.913926 + outer loop + vertex 0.468656 0.204573 0.472909 + vertex 0.407475 0.160123 0.439737 + vertex 0.460123 0.107475 0.439737 + endloop + endfacet + facet normal -0.287002 -0.287002 0.913926 + outer loop + vertex 0.468656 0.204573 0.472909 + vertex 0.460123 0.107475 0.439737 + vertex 0.504573 0.168656 0.472909 + endloop + endfacet + facet normal -0.390111 -0.390111 0.834043 + outer loop + vertex 0.407475 0.160123 0.439737 + vertex 0.351546 0.119487 0.39457 + vertex 0.419487 0.0515457 0.39457 + endloop + endfacet + facet normal -0.390111 -0.390111 0.834043 + outer loop + vertex 0.407475 0.160123 0.439737 + vertex 0.419487 0.0515457 0.39457 + vertex 0.460123 0.107475 0.439737 + endloop + endfacet + facet normal -0.482114 -0.482114 0.731527 + outer loop + vertex 0.351546 0.119487 0.39457 + vertex 0.302393 0.0837761 0.338641 + vertex 0.383776 0.0023934 0.338641 + endloop + endfacet + facet normal -0.482114 -0.482114 0.731527 + outer loop + vertex 0.351546 0.119487 0.39457 + vertex 0.383776 0.0023934 0.338641 + vertex 0.419487 0.0515457 0.39457 + endloop + endfacet + facet normal -0.5606 -0.560601 0.609471 + outer loop + vertex 0.302393 0.0837761 0.338641 + vertex 0.261359 0.0539629 0.273474 + vertex 0.353963 -0.038641 0.273474 + endloop + endfacet + facet normal -0.5606 -0.560601 0.60947 + outer loop + vertex 0.302393 0.0837761 0.338641 + vertex 0.353963 -0.038641 0.273474 + vertex 0.383776 0.0023934 0.338641 + endloop + endfacet + facet normal -0.623613 -0.623613 0.471396 + outer loop + vertex 0.261359 0.0539629 0.273474 + vertex 0.229562 0.0308609 0.200848 + vertex 0.330861 -0.0704381 0.200848 + endloop + endfacet + facet normal -0.623613 -0.623613 0.471396 + outer loop + vertex 0.261359 0.0539629 0.273474 + vertex 0.330861 -0.0704381 0.200848 + vertex 0.353963 -0.038641 0.273474 + endloop + endfacet + facet normal -0.669658 -0.669658 0.321116 + outer loop + vertex 0.229562 0.0308609 0.200848 + vertex 0.207869 0.0151004 0.122743 + vertex 0.3151 -0.0921307 0.122743 + endloop + endfacet + facet normal -0.669658 -0.669658 0.321116 + outer loop + vertex 0.229562 0.0308609 0.200848 + vertex 0.3151 -0.0921307 0.122743 + vertex 0.330861 -0.0704381 0.200848 + endloop + endfacet + facet normal -0.697694 -0.697694 0.162622 + outer loop + vertex 0.207869 0.0151004 0.122743 + vertex 0.196873 0.00711112 0.0412897 + vertex 0.307111 -0.103127 0.0412897 + endloop + endfacet + facet normal -0.697694 -0.697694 0.162622 + outer loop + vertex 0.207869 0.0151004 0.122743 + vertex 0.307111 -0.103127 0.0412897 + vertex 0.3151 -0.0921307 0.122743 + endloop + endfacet + facet normal -0.707107 -0.707107 -1.47532e-07 + outer loop + vertex 0.196873 0.00711112 0.0412897 + vertex 0.196873 0.00711113 -0.0412897 + vertex 0.307111 -0.103127 -0.0412897 + endloop + endfacet + facet normal -0.707107 -0.707107 0 + outer loop + vertex 0.196873 0.00711112 0.0412897 + vertex 0.307111 -0.103127 -0.0412897 + vertex 0.307111 -0.103127 0.0412897 + endloop + endfacet + facet normal -0.697694 -0.697694 -0.162622 + outer loop + vertex 0.196873 0.00711113 -0.0412897 + vertex 0.207869 0.0151004 -0.122743 + vertex 0.3151 -0.0921307 -0.122743 + endloop + endfacet + facet normal -0.697694 -0.697694 -0.162622 + outer loop + vertex 0.196873 0.00711113 -0.0412897 + vertex 0.3151 -0.0921307 -0.122743 + vertex 0.307111 -0.103127 -0.0412897 + endloop + endfacet + facet normal -0.669658 -0.669658 -0.321116 + outer loop + vertex 0.207869 0.0151004 -0.122743 + vertex 0.229562 0.0308609 -0.200848 + vertex 0.330861 -0.0704381 -0.200848 + endloop + endfacet + facet normal -0.669658 -0.669658 -0.321116 + outer loop + vertex 0.207869 0.0151004 -0.122743 + vertex 0.330861 -0.0704381 -0.200848 + vertex 0.3151 -0.0921307 -0.122743 + endloop + endfacet + facet normal -0.623613 -0.623613 -0.471396 + outer loop + vertex 0.229562 0.0308609 -0.200848 + vertex 0.261359 0.0539629 -0.273474 + vertex 0.353963 -0.038641 -0.273474 + endloop + endfacet + facet normal -0.623613 -0.623613 -0.471396 + outer loop + vertex 0.229562 0.0308609 -0.200848 + vertex 0.353963 -0.038641 -0.273474 + vertex 0.330861 -0.0704381 -0.200848 + endloop + endfacet + facet normal -0.5606 -0.560601 -0.609471 + outer loop + vertex 0.261359 0.0539629 -0.273474 + vertex 0.302393 0.0837761 -0.338641 + vertex 0.383776 0.00239342 -0.338641 + endloop + endfacet + facet normal -0.5606 -0.5606 -0.609471 + outer loop + vertex 0.261359 0.0539629 -0.273474 + vertex 0.383776 0.00239342 -0.338641 + vertex 0.353963 -0.038641 -0.273474 + endloop + endfacet + facet normal -0.482114 -0.482114 -0.731527 + outer loop + vertex 0.302393 0.0837761 -0.338641 + vertex 0.351546 0.119487 -0.39457 + vertex 0.419487 0.0515457 -0.39457 + endloop + endfacet + facet normal -0.482114 -0.482114 -0.731527 + outer loop + vertex 0.302393 0.0837761 -0.338641 + vertex 0.419487 0.0515457 -0.39457 + vertex 0.383776 0.00239342 -0.338641 + endloop + endfacet + facet normal -0.390111 -0.390111 -0.834043 + outer loop + vertex 0.351546 0.119487 -0.39457 + vertex 0.407475 0.160123 -0.439737 + vertex 0.460123 0.107475 -0.439737 + endloop + endfacet + facet normal -0.390111 -0.390111 -0.834043 + outer loop + vertex 0.351546 0.119487 -0.39457 + vertex 0.460123 0.107475 -0.439737 + vertex 0.419487 0.0515457 -0.39457 + endloop + endfacet + facet normal -0.287002 -0.287002 -0.913926 + outer loop + vertex 0.407475 0.160123 -0.439737 + vertex 0.468656 0.204573 -0.472909 + vertex 0.504573 0.168656 -0.472909 + endloop + endfacet + facet normal -0.287002 -0.287002 -0.913926 + outer loop + vertex 0.407475 0.160123 -0.439737 + vertex 0.504573 0.168656 -0.472909 + vertex 0.460123 0.107475 -0.439737 + endloop + endfacet + facet normal -0.175615 -0.175615 -0.968668 + outer loop + vertex 0.468656 0.204573 -0.472909 + vertex 0.53342 0.251627 -0.493181 + vertex 0.551627 0.23342 -0.493181 + endloop + endfacet + facet normal -0.175615 -0.175615 -0.968668 + outer loop + vertex 0.468656 0.204573 -0.472909 + vertex 0.551627 0.23342 -0.493181 + vertex 0.504573 0.168656 -0.472909 + endloop + endfacet + facet normal -0.112752 -0.221289 0.968668 + outer loop + vertex 0.551627 0.23342 0.493181 + vertex 0.504573 0.168656 0.472909 + vertex 0.549831 0.145596 0.472909 + endloop + endfacet + facet normal -0.112752 -0.221289 0.968668 + outer loop + vertex 0.551627 0.23342 0.493181 + vertex 0.549831 0.145596 0.472909 + vertex 0.574569 0.221731 0.493181 + endloop + endfacet + facet normal -0.184266 -0.361644 0.913926 + outer loop + vertex 0.504573 0.168656 0.472909 + vertex 0.460123 0.107475 0.439737 + vertex 0.526462 0.0736736 0.439737 + endloop + endfacet + facet normal -0.184266 -0.361644 0.913926 + outer loop + vertex 0.504573 0.168656 0.472909 + vertex 0.526462 0.0736736 0.439737 + vertex 0.549831 0.145596 0.472909 + endloop + endfacet + facet normal -0.250466 -0.491568 0.834043 + outer loop + vertex 0.460123 0.107475 0.439737 + vertex 0.419487 0.0515457 0.39457 + vertex 0.505099 0.00792448 0.39457 + endloop + endfacet + facet normal -0.250466 -0.491568 0.834043 + outer loop + vertex 0.460123 0.107475 0.439737 + vertex 0.505099 0.00792448 0.39457 + vertex 0.526462 0.0736736 0.439737 + endloop + endfacet + facet normal -0.309536 -0.607499 0.731527 + outer loop + vertex 0.419487 0.0515457 0.39457 + vertex 0.383776 0.0023934 0.338641 + vertex 0.486324 -0.0498575 0.338641 + endloop + endfacet + facet normal -0.309536 -0.607499 0.731527 + outer loop + vertex 0.419487 0.0515457 0.39457 + vertex 0.486324 -0.0498575 0.338641 + vertex 0.505099 0.00792448 0.39457 + endloop + endfacet + facet normal -0.359928 -0.706398 0.609471 + outer loop + vertex 0.383776 0.0023934 0.338641 + vertex 0.353963 -0.038641 0.273474 + vertex 0.470651 -0.0980963 0.273474 + endloop + endfacet + facet normal -0.359927 -0.706398 0.609471 + outer loop + vertex 0.383776 0.0023934 0.338641 + vertex 0.470651 -0.0980963 0.273474 + vertex 0.486324 -0.0498575 0.338641 + endloop + endfacet + facet normal -0.400384 -0.785798 0.471396 + outer loop + vertex 0.353963 -0.038641 0.273474 + vertex 0.330861 -0.0704381 0.200848 + vertex 0.458505 -0.135476 0.200848 + endloop + endfacet + facet normal -0.400384 -0.785798 0.471396 + outer loop + vertex 0.353963 -0.038641 0.273474 + vertex 0.458505 -0.135476 0.200848 + vertex 0.470651 -0.0980963 0.273474 + endloop + endfacet + facet normal -0.429947 -0.843819 0.321116 + outer loop + vertex 0.330861 -0.0704381 0.200848 + vertex 0.3151 -0.0921307 0.122743 + vertex 0.450219 -0.160977 0.122743 + endloop + endfacet + facet normal -0.429947 -0.843819 0.321116 + outer loop + vertex 0.330861 -0.0704381 0.200848 + vertex 0.450219 -0.160977 0.122743 + vertex 0.458505 -0.135476 0.200848 + endloop + endfacet + facet normal -0.447947 -0.879146 0.162622 + outer loop + vertex 0.3151 -0.0921307 0.122743 + vertex 0.307111 -0.103127 0.0412897 + vertex 0.446019 -0.173904 0.0412897 + endloop + endfacet + facet normal -0.447947 -0.879146 0.162622 + outer loop + vertex 0.3151 -0.0921307 0.122743 + vertex 0.446019 -0.173904 0.0412897 + vertex 0.450219 -0.160977 0.122743 + endloop + endfacet + facet normal -0.45399 -0.891007 0 + outer loop + vertex 0.307111 -0.103127 0.0412897 + vertex 0.307111 -0.103127 -0.0412897 + vertex 0.446019 -0.173904 -0.0412897 + endloop + endfacet + facet normal -0.45399 -0.891007 0 + outer loop + vertex 0.307111 -0.103127 0.0412897 + vertex 0.446019 -0.173904 -0.0412897 + vertex 0.446019 -0.173904 0.0412897 + endloop + endfacet + facet normal -0.447947 -0.879146 -0.162622 + outer loop + vertex 0.307111 -0.103127 -0.0412897 + vertex 0.3151 -0.0921307 -0.122743 + vertex 0.450219 -0.160977 -0.122743 + endloop + endfacet + facet normal -0.447947 -0.879146 -0.162622 + outer loop + vertex 0.307111 -0.103127 -0.0412897 + vertex 0.450219 -0.160977 -0.122743 + vertex 0.446019 -0.173904 -0.0412897 + endloop + endfacet + facet normal -0.429947 -0.843819 -0.321116 + outer loop + vertex 0.3151 -0.0921307 -0.122743 + vertex 0.330861 -0.0704381 -0.200848 + vertex 0.458505 -0.135476 -0.200848 + endloop + endfacet + facet normal -0.429947 -0.843819 -0.321116 + outer loop + vertex 0.3151 -0.0921307 -0.122743 + vertex 0.458505 -0.135476 -0.200848 + vertex 0.450219 -0.160977 -0.122743 + endloop + endfacet + facet normal -0.400384 -0.785798 -0.471396 + outer loop + vertex 0.330861 -0.0704381 -0.200848 + vertex 0.353963 -0.038641 -0.273474 + vertex 0.470651 -0.0980963 -0.273474 + endloop + endfacet + facet normal -0.400384 -0.785798 -0.471396 + outer loop + vertex 0.330861 -0.0704381 -0.200848 + vertex 0.470651 -0.0980963 -0.273474 + vertex 0.458505 -0.135476 -0.200848 + endloop + endfacet + facet normal -0.359928 -0.706398 -0.609471 + outer loop + vertex 0.353963 -0.038641 -0.273474 + vertex 0.383776 0.00239342 -0.338641 + vertex 0.486324 -0.0498575 -0.338641 + endloop + endfacet + facet normal -0.359927 -0.706398 -0.609471 + outer loop + vertex 0.353963 -0.038641 -0.273474 + vertex 0.486324 -0.0498575 -0.338641 + vertex 0.470651 -0.0980963 -0.273474 + endloop + endfacet + facet normal -0.309536 -0.607499 -0.731527 + outer loop + vertex 0.383776 0.00239342 -0.338641 + vertex 0.419487 0.0515457 -0.39457 + vertex 0.505099 0.00792451 -0.39457 + endloop + endfacet + facet normal -0.309536 -0.607499 -0.731527 + outer loop + vertex 0.383776 0.00239342 -0.338641 + vertex 0.505099 0.00792451 -0.39457 + vertex 0.486324 -0.0498575 -0.338641 + endloop + endfacet + facet normal -0.250466 -0.491568 -0.834043 + outer loop + vertex 0.419487 0.0515457 -0.39457 + vertex 0.460123 0.107475 -0.439737 + vertex 0.526462 0.0736736 -0.439737 + endloop + endfacet + facet normal -0.250466 -0.491568 -0.834043 + outer loop + vertex 0.419487 0.0515457 -0.39457 + vertex 0.526462 0.0736736 -0.439737 + vertex 0.505099 0.00792451 -0.39457 + endloop + endfacet + facet normal -0.184267 -0.361643 -0.913926 + outer loop + vertex 0.460123 0.107475 -0.439737 + vertex 0.504573 0.168656 -0.472909 + vertex 0.549831 0.145596 -0.472909 + endloop + endfacet + facet normal -0.184266 -0.361644 -0.913926 + outer loop + vertex 0.460123 0.107475 -0.439737 + vertex 0.549831 0.145596 -0.472909 + vertex 0.526462 0.0736736 -0.439737 + endloop + endfacet + facet normal -0.112752 -0.221288 -0.968668 + outer loop + vertex 0.504573 0.168656 -0.472909 + vertex 0.551627 0.23342 -0.493181 + vertex 0.574569 0.221731 -0.493181 + endloop + endfacet + facet normal -0.112752 -0.221288 -0.968668 + outer loop + vertex 0.504573 0.168656 -0.472909 + vertex 0.574569 0.221731 -0.493181 + vertex 0.549831 0.145596 -0.472909 + endloop + endfacet + facet normal -0.0388517 -0.2453 0.968668 + outer loop + vertex 0.574569 0.221731 0.493181 + vertex 0.549831 0.145596 0.472909 + vertex 0.6 0.13765 0.472909 + endloop + endfacet + facet normal -0.0388518 -0.2453 0.968668 + outer loop + vertex 0.574569 0.221731 0.493181 + vertex 0.6 0.13765 0.472909 + vertex 0.6 0.217703 0.493181 + endloop + endfacet + facet normal -0.0634939 -0.400885 0.913926 + outer loop + vertex 0.549831 0.145596 0.472909 + vertex 0.526462 0.0736736 0.439737 + vertex 0.6 0.0620263 0.439737 + endloop + endfacet + facet normal -0.0634939 -0.400885 0.913926 + outer loop + vertex 0.549831 0.145596 0.472909 + vertex 0.6 0.0620263 0.439737 + vertex 0.6 0.13765 0.472909 + endloop + endfacet + facet normal -0.0863048 -0.544907 0.834043 + outer loop + vertex 0.526462 0.0736736 0.439737 + vertex 0.505099 0.00792448 0.39457 + vertex 0.6 -0.00710636 0.39457 + endloop + endfacet + facet normal -0.0863048 -0.544907 0.834043 + outer loop + vertex 0.526462 0.0736736 0.439737 + vertex 0.6 -0.00710636 0.39457 + vertex 0.6 0.0620263 0.439737 + endloop + endfacet + facet normal -0.106659 -0.673418 0.731527 + outer loop + vertex 0.505099 0.00792448 0.39457 + vertex 0.486324 -0.0498575 0.338641 + vertex 0.6 -0.067862 0.338641 + endloop + endfacet + facet normal -0.106659 -0.673418 0.731527 + outer loop + vertex 0.505099 0.00792448 0.39457 + vertex 0.6 -0.067862 0.338641 + vertex 0.6 -0.00710636 0.39457 + endloop + endfacet + facet normal -0.124022 -0.783048 0.609471 + outer loop + vertex 0.486324 -0.0498575 0.338641 + vertex 0.470651 -0.0980963 0.273474 + vertex 0.6 -0.118583 0.273474 + endloop + endfacet + facet normal -0.124023 -0.783048 0.60947 + outer loop + vertex 0.486324 -0.0498575 0.338641 + vertex 0.6 -0.118583 0.273474 + vertex 0.6 -0.067862 0.338641 + endloop + endfacet + facet normal -0.137963 -0.871064 0.471396 + outer loop + vertex 0.470651 -0.0980963 0.273474 + vertex 0.458505 -0.135476 0.200848 + vertex 0.6 -0.157887 0.200848 + endloop + endfacet + facet normal -0.137963 -0.871064 0.471396 + outer loop + vertex 0.470651 -0.0980963 0.273474 + vertex 0.6 -0.157887 0.200848 + vertex 0.6 -0.118583 0.273474 + endloop + endfacet + facet normal -0.148149 -0.93538 0.321116 + outer loop + vertex 0.458505 -0.135476 0.200848 + vertex 0.450219 -0.160977 0.122743 + vertex 0.6 -0.1847 0.122743 + endloop + endfacet + facet normal -0.14815 -0.93538 0.321116 + outer loop + vertex 0.458505 -0.135476 0.200848 + vertex 0.6 -0.1847 0.122743 + vertex 0.6 -0.157887 0.200848 + endloop + endfacet + facet normal -0.154352 -0.974541 0.162622 + outer loop + vertex 0.450219 -0.160977 0.122743 + vertex 0.446019 -0.173904 0.0412897 + vertex 0.6 -0.198292 0.0412897 + endloop + endfacet + facet normal -0.154352 -0.974541 0.162622 + outer loop + vertex 0.450219 -0.160977 0.122743 + vertex 0.6 -0.198292 0.0412897 + vertex 0.6 -0.1847 0.122743 + endloop + endfacet + facet normal -0.156434 -0.987688 0 + outer loop + vertex 0.446019 -0.173904 0.0412897 + vertex 0.446019 -0.173904 -0.0412897 + vertex 0.6 -0.198292 -0.0412897 + endloop + endfacet + facet normal -0.156434 -0.987688 -1.78225e-07 + outer loop + vertex 0.446019 -0.173904 0.0412897 + vertex 0.6 -0.198292 -0.0412897 + vertex 0.6 -0.198292 0.0412897 + endloop + endfacet + facet normal -0.154352 -0.974541 -0.162622 + outer loop + vertex 0.446019 -0.173904 -0.0412897 + vertex 0.450219 -0.160977 -0.122743 + vertex 0.6 -0.1847 -0.122743 + endloop + endfacet + facet normal -0.154352 -0.974541 -0.162622 + outer loop + vertex 0.446019 -0.173904 -0.0412897 + vertex 0.6 -0.1847 -0.122743 + vertex 0.6 -0.198292 -0.0412897 + endloop + endfacet + facet normal -0.14815 -0.93538 -0.321116 + outer loop + vertex 0.450219 -0.160977 -0.122743 + vertex 0.458505 -0.135476 -0.200848 + vertex 0.6 -0.157887 -0.200848 + endloop + endfacet + facet normal -0.14815 -0.93538 -0.321116 + outer loop + vertex 0.450219 -0.160977 -0.122743 + vertex 0.6 -0.157887 -0.200848 + vertex 0.6 -0.1847 -0.122743 + endloop + endfacet + facet normal -0.137963 -0.871064 -0.471396 + outer loop + vertex 0.458505 -0.135476 -0.200848 + vertex 0.470651 -0.0980963 -0.273474 + vertex 0.6 -0.118583 -0.273474 + endloop + endfacet + facet normal -0.137963 -0.871064 -0.471396 + outer loop + vertex 0.458505 -0.135476 -0.200848 + vertex 0.6 -0.118583 -0.273474 + vertex 0.6 -0.157887 -0.200848 + endloop + endfacet + facet normal -0.124023 -0.783048 -0.609471 + outer loop + vertex 0.470651 -0.0980963 -0.273474 + vertex 0.486324 -0.0498575 -0.338641 + vertex 0.6 -0.0678619 -0.338641 + endloop + endfacet + facet normal -0.124022 -0.783048 -0.609471 + outer loop + vertex 0.470651 -0.0980963 -0.273474 + vertex 0.6 -0.0678619 -0.338641 + vertex 0.6 -0.118583 -0.273474 + endloop + endfacet + facet normal -0.106659 -0.673418 -0.731527 + outer loop + vertex 0.486324 -0.0498575 -0.338641 + vertex 0.505099 0.00792451 -0.39457 + vertex 0.6 -0.00710633 -0.39457 + endloop + endfacet + facet normal -0.106659 -0.673418 -0.731527 + outer loop + vertex 0.486324 -0.0498575 -0.338641 + vertex 0.6 -0.00710633 -0.39457 + vertex 0.6 -0.0678619 -0.338641 + endloop + endfacet + facet normal -0.0863048 -0.544908 -0.834043 + outer loop + vertex 0.505099 0.00792451 -0.39457 + vertex 0.526462 0.0736736 -0.439737 + vertex 0.6 0.0620263 -0.439737 + endloop + endfacet + facet normal -0.0863048 -0.544908 -0.834043 + outer loop + vertex 0.505099 0.00792451 -0.39457 + vertex 0.6 0.0620263 -0.439737 + vertex 0.6 -0.00710633 -0.39457 + endloop + endfacet + facet normal -0.0634939 -0.400885 -0.913926 + outer loop + vertex 0.526462 0.0736736 -0.439737 + vertex 0.549831 0.145596 -0.472909 + vertex 0.6 0.13765 -0.472909 + endloop + endfacet + facet normal -0.0634939 -0.400885 -0.913926 + outer loop + vertex 0.526462 0.0736736 -0.439737 + vertex 0.6 0.13765 -0.472909 + vertex 0.6 0.0620263 -0.439737 + endloop + endfacet + facet normal -0.0388516 -0.2453 -0.968668 + outer loop + vertex 0.549831 0.145596 -0.472909 + vertex 0.574569 0.221731 -0.493181 + vertex 0.6 0.217703 -0.493181 + endloop + endfacet + facet normal -0.0388517 -0.2453 -0.968668 + outer loop + vertex 0.549831 0.145596 -0.472909 + vertex 0.6 0.217703 -0.493181 + vertex 0.6 0.13765 -0.472909 + endloop + endfacet + facet normal 0.0388518 -0.2453 0.968668 + outer loop + vertex 0.6 0.217703 0.493181 + vertex 0.6 0.13765 0.472909 + vertex 0.650169 0.145596 0.472909 + endloop + endfacet + facet normal 0.0388518 -0.2453 0.968668 + outer loop + vertex 0.6 0.217703 0.493181 + vertex 0.650169 0.145596 0.472909 + vertex 0.625431 0.221731 0.493181 + endloop + endfacet + facet normal 0.063494 -0.400885 0.913926 + outer loop + vertex 0.6 0.13765 0.472909 + vertex 0.6 0.0620263 0.439737 + vertex 0.673538 0.0736736 0.439737 + endloop + endfacet + facet normal 0.063494 -0.400885 0.913926 + outer loop + vertex 0.6 0.13765 0.472909 + vertex 0.673538 0.0736736 0.439737 + vertex 0.650169 0.145596 0.472909 + endloop + endfacet + facet normal 0.0863049 -0.544907 0.834043 + outer loop + vertex 0.6 0.0620263 0.439737 + vertex 0.6 -0.00710636 0.39457 + vertex 0.694901 0.0079245 0.39457 + endloop + endfacet + facet normal 0.0863049 -0.544907 0.834043 + outer loop + vertex 0.6 0.0620263 0.439737 + vertex 0.694901 0.0079245 0.39457 + vertex 0.673538 0.0736736 0.439737 + endloop + endfacet + facet normal 0.106659 -0.673418 0.731527 + outer loop + vertex 0.6 -0.00710636 0.39457 + vertex 0.6 -0.067862 0.338641 + vertex 0.713676 -0.0498575 0.338641 + endloop + endfacet + facet normal 0.106659 -0.673418 0.731527 + outer loop + vertex 0.6 -0.00710636 0.39457 + vertex 0.713676 -0.0498575 0.338641 + vertex 0.694901 0.0079245 0.39457 + endloop + endfacet + facet normal 0.124023 -0.783048 0.609471 + outer loop + vertex 0.6 -0.067862 0.338641 + vertex 0.6 -0.118583 0.273474 + vertex 0.729349 -0.0980963 0.273474 + endloop + endfacet + facet normal 0.124023 -0.783048 0.609471 + outer loop + vertex 0.6 -0.067862 0.338641 + vertex 0.729349 -0.0980963 0.273474 + vertex 0.713676 -0.0498575 0.338641 + endloop + endfacet + facet normal 0.137963 -0.871064 0.471396 + outer loop + vertex 0.6 -0.118583 0.273474 + vertex 0.6 -0.157887 0.200848 + vertex 0.741495 -0.135476 0.200848 + endloop + endfacet + facet normal 0.137963 -0.871064 0.471396 + outer loop + vertex 0.6 -0.118583 0.273474 + vertex 0.741495 -0.135476 0.200848 + vertex 0.729349 -0.0980963 0.273474 + endloop + endfacet + facet normal 0.14815 -0.93538 0.321116 + outer loop + vertex 0.6 -0.157887 0.200848 + vertex 0.6 -0.1847 0.122743 + vertex 0.749781 -0.160977 0.122743 + endloop + endfacet + facet normal 0.14815 -0.93538 0.321116 + outer loop + vertex 0.6 -0.157887 0.200848 + vertex 0.749781 -0.160977 0.122743 + vertex 0.741495 -0.135476 0.200848 + endloop + endfacet + facet normal 0.154352 -0.974541 0.162622 + outer loop + vertex 0.6 -0.1847 0.122743 + vertex 0.6 -0.198292 0.0412897 + vertex 0.753981 -0.173904 0.0412897 + endloop + endfacet + facet normal 0.154352 -0.974541 0.162622 + outer loop + vertex 0.6 -0.1847 0.122743 + vertex 0.753981 -0.173904 0.0412897 + vertex 0.749781 -0.160977 0.122743 + endloop + endfacet + facet normal 0.156435 -0.987688 -1.78225e-07 + outer loop + vertex 0.6 -0.198292 0.0412897 + vertex 0.6 -0.198292 -0.0412897 + vertex 0.753981 -0.173904 -0.0412897 + endloop + endfacet + facet normal 0.156435 -0.987688 0 + outer loop + vertex 0.6 -0.198292 0.0412897 + vertex 0.753981 -0.173904 -0.0412897 + vertex 0.753981 -0.173904 0.0412897 + endloop + endfacet + facet normal 0.154352 -0.974541 -0.162622 + outer loop + vertex 0.6 -0.198292 -0.0412897 + vertex 0.6 -0.1847 -0.122743 + vertex 0.749781 -0.160977 -0.122743 + endloop + endfacet + facet normal 0.154352 -0.974541 -0.162622 + outer loop + vertex 0.6 -0.198292 -0.0412897 + vertex 0.749781 -0.160977 -0.122743 + vertex 0.753981 -0.173904 -0.0412897 + endloop + endfacet + facet normal 0.14815 -0.93538 -0.321116 + outer loop + vertex 0.6 -0.1847 -0.122743 + vertex 0.6 -0.157887 -0.200848 + vertex 0.741495 -0.135476 -0.200848 + endloop + endfacet + facet normal 0.14815 -0.93538 -0.321116 + outer loop + vertex 0.6 -0.1847 -0.122743 + vertex 0.741495 -0.135476 -0.200848 + vertex 0.749781 -0.160977 -0.122743 + endloop + endfacet + facet normal 0.137963 -0.871064 -0.471396 + outer loop + vertex 0.6 -0.157887 -0.200848 + vertex 0.6 -0.118583 -0.273474 + vertex 0.729349 -0.0980963 -0.273474 + endloop + endfacet + facet normal 0.137963 -0.871064 -0.471396 + outer loop + vertex 0.6 -0.157887 -0.200848 + vertex 0.729349 -0.0980963 -0.273474 + vertex 0.741495 -0.135476 -0.200848 + endloop + endfacet + facet normal 0.124023 -0.783048 -0.609471 + outer loop + vertex 0.6 -0.118583 -0.273474 + vertex 0.6 -0.0678619 -0.338641 + vertex 0.713676 -0.0498575 -0.338641 + endloop + endfacet + facet normal 0.124023 -0.783048 -0.609471 + outer loop + vertex 0.6 -0.118583 -0.273474 + vertex 0.713676 -0.0498575 -0.338641 + vertex 0.729349 -0.0980963 -0.273474 + endloop + endfacet + facet normal 0.106659 -0.673418 -0.731527 + outer loop + vertex 0.6 -0.0678619 -0.338641 + vertex 0.6 -0.00710633 -0.39457 + vertex 0.694901 0.00792454 -0.39457 + endloop + endfacet + facet normal 0.106659 -0.673418 -0.731527 + outer loop + vertex 0.6 -0.0678619 -0.338641 + vertex 0.694901 0.00792454 -0.39457 + vertex 0.713676 -0.0498575 -0.338641 + endloop + endfacet + facet normal 0.086305 -0.544908 -0.834043 + outer loop + vertex 0.6 -0.00710633 -0.39457 + vertex 0.6 0.0620263 -0.439737 + vertex 0.673538 0.0736736 -0.439737 + endloop + endfacet + facet normal 0.0863049 -0.544907 -0.834043 + outer loop + vertex 0.6 -0.00710633 -0.39457 + vertex 0.673538 0.0736736 -0.439737 + vertex 0.694901 0.00792454 -0.39457 + endloop + endfacet + facet normal 0.063494 -0.400885 -0.913926 + outer loop + vertex 0.6 0.0620263 -0.439737 + vertex 0.6 0.13765 -0.472909 + vertex 0.650169 0.145596 -0.472909 + endloop + endfacet + facet normal 0.063494 -0.400885 -0.913926 + outer loop + vertex 0.6 0.0620263 -0.439737 + vertex 0.650169 0.145596 -0.472909 + vertex 0.673538 0.0736736 -0.439737 + endloop + endfacet + facet normal 0.0388518 -0.2453 -0.968668 + outer loop + vertex 0.6 0.13765 -0.472909 + vertex 0.6 0.217703 -0.493181 + vertex 0.625431 0.221731 -0.493181 + endloop + endfacet + facet normal 0.0388517 -0.2453 -0.968668 + outer loop + vertex 0.6 0.13765 -0.472909 + vertex 0.625431 0.221731 -0.493181 + vertex 0.650169 0.145596 -0.472909 + endloop + endfacet + facet normal 0.112752 -0.221289 0.968668 + outer loop + vertex 0.625431 0.221731 0.493181 + vertex 0.650169 0.145596 0.472909 + vertex 0.695427 0.168656 0.472909 + endloop + endfacet + facet normal 0.112752 -0.221288 0.968668 + outer loop + vertex 0.625431 0.221731 0.493181 + vertex 0.695427 0.168656 0.472909 + vertex 0.648373 0.23342 0.493181 + endloop + endfacet + facet normal 0.184267 -0.361643 0.913926 + outer loop + vertex 0.650169 0.145596 0.472909 + vertex 0.673538 0.0736736 0.439737 + vertex 0.739877 0.107475 0.439737 + endloop + endfacet + facet normal 0.184266 -0.361644 0.913925 + outer loop + vertex 0.650169 0.145596 0.472909 + vertex 0.739877 0.107475 0.439737 + vertex 0.695427 0.168656 0.472909 + endloop + endfacet + facet normal 0.250466 -0.491568 0.834043 + outer loop + vertex 0.673538 0.0736736 0.439737 + vertex 0.694901 0.0079245 0.39457 + vertex 0.780513 0.0515458 0.39457 + endloop + endfacet + facet normal 0.250467 -0.491568 0.834043 + outer loop + vertex 0.673538 0.0736736 0.439737 + vertex 0.780513 0.0515458 0.39457 + vertex 0.739877 0.107475 0.439737 + endloop + endfacet + facet normal 0.309536 -0.607499 0.731527 + outer loop + vertex 0.694901 0.0079245 0.39457 + vertex 0.713676 -0.0498575 0.338641 + vertex 0.816224 0.00239345 0.338641 + endloop + endfacet + facet normal 0.309536 -0.607499 0.731527 + outer loop + vertex 0.694901 0.0079245 0.39457 + vertex 0.816224 0.00239345 0.338641 + vertex 0.780513 0.0515458 0.39457 + endloop + endfacet + facet normal 0.359928 -0.706398 0.609471 + outer loop + vertex 0.713676 -0.0498575 0.338641 + vertex 0.729349 -0.0980963 0.273474 + vertex 0.846037 -0.0386409 0.273474 + endloop + endfacet + facet normal 0.359928 -0.706398 0.609471 + outer loop + vertex 0.713676 -0.0498575 0.338641 + vertex 0.846037 -0.0386409 0.273474 + vertex 0.816224 0.00239345 0.338641 + endloop + endfacet + facet normal 0.400384 -0.785798 0.471396 + outer loop + vertex 0.729349 -0.0980963 0.273474 + vertex 0.741495 -0.135476 0.200848 + vertex 0.869139 -0.0704381 0.200848 + endloop + endfacet + facet normal 0.400384 -0.785798 0.471396 + outer loop + vertex 0.729349 -0.0980963 0.273474 + vertex 0.869139 -0.0704381 0.200848 + vertex 0.846037 -0.0386409 0.273474 + endloop + endfacet + facet normal 0.429947 -0.843819 0.321116 + outer loop + vertex 0.741495 -0.135476 0.200848 + vertex 0.749781 -0.160977 0.122743 + vertex 0.8849 -0.0921306 0.122743 + endloop + endfacet + facet normal 0.429947 -0.843818 0.321117 + outer loop + vertex 0.741495 -0.135476 0.200848 + vertex 0.8849 -0.0921306 0.122743 + vertex 0.869139 -0.0704381 0.200848 + endloop + endfacet + facet normal 0.447947 -0.879146 0.162622 + outer loop + vertex 0.749781 -0.160977 0.122743 + vertex 0.753981 -0.173904 0.0412897 + vertex 0.892889 -0.103127 0.0412897 + endloop + endfacet + facet normal 0.447947 -0.879146 0.162622 + outer loop + vertex 0.749781 -0.160977 0.122743 + vertex 0.892889 -0.103127 0.0412897 + vertex 0.8849 -0.0921306 0.122743 + endloop + endfacet + facet normal 0.453991 -0.891007 0 + outer loop + vertex 0.753981 -0.173904 0.0412897 + vertex 0.753981 -0.173904 -0.0412897 + vertex 0.892889 -0.103127 -0.0412897 + endloop + endfacet + facet normal 0.453991 -0.891007 0 + outer loop + vertex 0.753981 -0.173904 0.0412897 + vertex 0.892889 -0.103127 -0.0412897 + vertex 0.892889 -0.103127 0.0412897 + endloop + endfacet + facet normal 0.447947 -0.879146 -0.162622 + outer loop + vertex 0.753981 -0.173904 -0.0412897 + vertex 0.749781 -0.160977 -0.122743 + vertex 0.8849 -0.0921306 -0.122743 + endloop + endfacet + facet normal 0.447947 -0.879146 -0.162622 + outer loop + vertex 0.753981 -0.173904 -0.0412897 + vertex 0.8849 -0.0921306 -0.122743 + vertex 0.892889 -0.103127 -0.0412897 + endloop + endfacet + facet normal 0.429947 -0.843818 -0.321116 + outer loop + vertex 0.749781 -0.160977 -0.122743 + vertex 0.741495 -0.135476 -0.200848 + vertex 0.869139 -0.070438 -0.200848 + endloop + endfacet + facet normal 0.429947 -0.843818 -0.321116 + outer loop + vertex 0.749781 -0.160977 -0.122743 + vertex 0.869139 -0.070438 -0.200848 + vertex 0.8849 -0.0921306 -0.122743 + endloop + endfacet + facet normal 0.400384 -0.785798 -0.471396 + outer loop + vertex 0.741495 -0.135476 -0.200848 + vertex 0.729349 -0.0980963 -0.273474 + vertex 0.846037 -0.0386409 -0.273474 + endloop + endfacet + facet normal 0.400384 -0.785798 -0.471396 + outer loop + vertex 0.741495 -0.135476 -0.200848 + vertex 0.846037 -0.0386409 -0.273474 + vertex 0.869139 -0.070438 -0.200848 + endloop + endfacet + facet normal 0.359928 -0.706398 -0.609471 + outer loop + vertex 0.729349 -0.0980963 -0.273474 + vertex 0.713676 -0.0498575 -0.338641 + vertex 0.816224 0.00239348 -0.338641 + endloop + endfacet + facet normal 0.359928 -0.706398 -0.609471 + outer loop + vertex 0.729349 -0.0980963 -0.273474 + vertex 0.816224 0.00239348 -0.338641 + vertex 0.846037 -0.0386409 -0.273474 + endloop + endfacet + facet normal 0.309536 -0.607499 -0.731527 + outer loop + vertex 0.713676 -0.0498575 -0.338641 + vertex 0.694901 0.00792454 -0.39457 + vertex 0.780513 0.0515458 -0.39457 + endloop + endfacet + facet normal 0.309536 -0.607499 -0.731527 + outer loop + vertex 0.713676 -0.0498575 -0.338641 + vertex 0.780513 0.0515458 -0.39457 + vertex 0.816224 0.00239348 -0.338641 + endloop + endfacet + facet normal 0.250466 -0.491568 -0.834043 + outer loop + vertex 0.694901 0.00792454 -0.39457 + vertex 0.673538 0.0736736 -0.439737 + vertex 0.739877 0.107475 -0.439737 + endloop + endfacet + facet normal 0.250467 -0.491568 -0.834043 + outer loop + vertex 0.694901 0.00792454 -0.39457 + vertex 0.739877 0.107475 -0.439737 + vertex 0.780513 0.0515458 -0.39457 + endloop + endfacet + facet normal 0.184267 -0.361643 -0.913925 + outer loop + vertex 0.673538 0.0736736 -0.439737 + vertex 0.650169 0.145596 -0.472909 + vertex 0.695427 0.168656 -0.472909 + endloop + endfacet + facet normal 0.184266 -0.361643 -0.913926 + outer loop + vertex 0.673538 0.0736736 -0.439737 + vertex 0.695427 0.168656 -0.472909 + vertex 0.739877 0.107475 -0.439737 + endloop + endfacet + facet normal 0.112752 -0.221288 -0.968668 + outer loop + vertex 0.650169 0.145596 -0.472909 + vertex 0.625431 0.221731 -0.493181 + vertex 0.648373 0.23342 -0.493181 + endloop + endfacet + facet normal 0.112752 -0.221288 -0.968668 + outer loop + vertex 0.650169 0.145596 -0.472909 + vertex 0.648373 0.23342 -0.493181 + vertex 0.695427 0.168656 -0.472909 + endloop + endfacet + facet normal 0.175616 -0.175615 0.968668 + outer loop + vertex 0.648373 0.23342 0.493181 + vertex 0.695427 0.168656 0.472909 + vertex 0.731344 0.204573 0.472909 + endloop + endfacet + facet normal 0.175616 -0.175616 0.968668 + outer loop + vertex 0.648373 0.23342 0.493181 + vertex 0.731344 0.204573 0.472909 + vertex 0.66658 0.251627 0.493181 + endloop + endfacet + facet normal 0.287002 -0.287002 0.913925 + outer loop + vertex 0.695427 0.168656 0.472909 + vertex 0.739877 0.107475 0.439737 + vertex 0.792525 0.160123 0.439737 + endloop + endfacet + facet normal 0.287002 -0.287002 0.913926 + outer loop + vertex 0.695427 0.168656 0.472909 + vertex 0.792525 0.160123 0.439737 + vertex 0.731344 0.204573 0.472909 + endloop + endfacet + facet normal 0.390111 -0.39011 0.834043 + outer loop + vertex 0.739877 0.107475 0.439737 + vertex 0.780513 0.0515458 0.39457 + vertex 0.848454 0.119487 0.39457 + endloop + endfacet + facet normal 0.390111 -0.390111 0.834043 + outer loop + vertex 0.739877 0.107475 0.439737 + vertex 0.848454 0.119487 0.39457 + vertex 0.792525 0.160123 0.439737 + endloop + endfacet + facet normal 0.482114 -0.482114 0.731527 + outer loop + vertex 0.780513 0.0515458 0.39457 + vertex 0.816224 0.00239345 0.338641 + vertex 0.897607 0.0837762 0.338641 + endloop + endfacet + facet normal 0.482114 -0.482114 0.731527 + outer loop + vertex 0.780513 0.0515458 0.39457 + vertex 0.897607 0.0837762 0.338641 + vertex 0.848454 0.119487 0.39457 + endloop + endfacet + facet normal 0.5606 -0.5606 0.609471 + outer loop + vertex 0.816224 0.00239345 0.338641 + vertex 0.846037 -0.0386409 0.273474 + vertex 0.938641 0.053963 0.273474 + endloop + endfacet + facet normal 0.5606 -0.5606 0.609471 + outer loop + vertex 0.816224 0.00239345 0.338641 + vertex 0.938641 0.053963 0.273474 + vertex 0.897607 0.0837762 0.338641 + endloop + endfacet + facet normal 0.623613 -0.623613 0.471396 + outer loop + vertex 0.846037 -0.0386409 0.273474 + vertex 0.869139 -0.0704381 0.200848 + vertex 0.970438 0.030861 0.200848 + endloop + endfacet + facet normal 0.623613 -0.623613 0.471396 + outer loop + vertex 0.846037 -0.0386409 0.273474 + vertex 0.970438 0.030861 0.200848 + vertex 0.938641 0.053963 0.273474 + endloop + endfacet + facet normal 0.669658 -0.669658 0.321117 + outer loop + vertex 0.869139 -0.0704381 0.200848 + vertex 0.8849 -0.0921306 0.122743 + vertex 0.992131 0.0151005 0.122743 + endloop + endfacet + facet normal 0.669658 -0.669658 0.321117 + outer loop + vertex 0.869139 -0.0704381 0.200848 + vertex 0.992131 0.0151005 0.122743 + vertex 0.970438 0.030861 0.200848 + endloop + endfacet + facet normal 0.697694 -0.697694 0.162622 + outer loop + vertex 0.8849 -0.0921306 0.122743 + vertex 0.892889 -0.103127 0.0412897 + vertex 1.00313 0.00711123 0.0412897 + endloop + endfacet + facet normal 0.697694 -0.697694 0.162622 + outer loop + vertex 0.8849 -0.0921306 0.122743 + vertex 1.00313 0.00711123 0.0412897 + vertex 0.992131 0.0151005 0.122743 + endloop + endfacet + facet normal 0.707107 -0.707107 0 + outer loop + vertex 0.892889 -0.103127 0.0412897 + vertex 0.892889 -0.103127 -0.0412897 + vertex 1.00313 0.00711123 -0.0412897 + endloop + endfacet + facet normal 0.707107 -0.707107 -1.99367e-08 + outer loop + vertex 0.892889 -0.103127 0.0412897 + vertex 1.00313 0.00711123 -0.0412897 + vertex 1.00313 0.00711123 0.0412897 + endloop + endfacet + facet normal 0.697694 -0.697694 -0.162623 + outer loop + vertex 0.892889 -0.103127 -0.0412897 + vertex 0.8849 -0.0921306 -0.122743 + vertex 0.992131 0.0151005 -0.122743 + endloop + endfacet + facet normal 0.697694 -0.697694 -0.162622 + outer loop + vertex 0.892889 -0.103127 -0.0412897 + vertex 0.992131 0.0151005 -0.122743 + vertex 1.00313 0.00711123 -0.0412897 + endloop + endfacet + facet normal 0.669658 -0.669658 -0.321116 + outer loop + vertex 0.8849 -0.0921306 -0.122743 + vertex 0.869139 -0.070438 -0.200848 + vertex 0.970438 0.030861 -0.200848 + endloop + endfacet + facet normal 0.669658 -0.669658 -0.321117 + outer loop + vertex 0.8849 -0.0921306 -0.122743 + vertex 0.970438 0.030861 -0.200848 + vertex 0.992131 0.0151005 -0.122743 + endloop + endfacet + facet normal 0.623613 -0.623613 -0.471396 + outer loop + vertex 0.869139 -0.070438 -0.200848 + vertex 0.846037 -0.0386409 -0.273474 + vertex 0.938641 0.053963 -0.273474 + endloop + endfacet + facet normal 0.623613 -0.623613 -0.471396 + outer loop + vertex 0.869139 -0.070438 -0.200848 + vertex 0.938641 0.053963 -0.273474 + vertex 0.970438 0.030861 -0.200848 + endloop + endfacet + facet normal 0.5606 -0.5606 -0.609471 + outer loop + vertex 0.846037 -0.0386409 -0.273474 + vertex 0.816224 0.00239348 -0.338641 + vertex 0.897607 0.0837762 -0.338641 + endloop + endfacet + facet normal 0.560601 -0.5606 -0.60947 + outer loop + vertex 0.846037 -0.0386409 -0.273474 + vertex 0.897607 0.0837762 -0.338641 + vertex 0.938641 0.053963 -0.273474 + endloop + endfacet + facet normal 0.482114 -0.482114 -0.731527 + outer loop + vertex 0.816224 0.00239348 -0.338641 + vertex 0.780513 0.0515458 -0.39457 + vertex 0.848454 0.119487 -0.39457 + endloop + endfacet + facet normal 0.482114 -0.482114 -0.731527 + outer loop + vertex 0.816224 0.00239348 -0.338641 + vertex 0.848454 0.119487 -0.39457 + vertex 0.897607 0.0837762 -0.338641 + endloop + endfacet + facet normal 0.390111 -0.390111 -0.834043 + outer loop + vertex 0.780513 0.0515458 -0.39457 + vertex 0.739877 0.107475 -0.439737 + vertex 0.792525 0.160123 -0.439737 + endloop + endfacet + facet normal 0.390111 -0.390111 -0.834043 + outer loop + vertex 0.780513 0.0515458 -0.39457 + vertex 0.792525 0.160123 -0.439737 + vertex 0.848454 0.119487 -0.39457 + endloop + endfacet + facet normal 0.287002 -0.287002 -0.913926 + outer loop + vertex 0.739877 0.107475 -0.439737 + vertex 0.695427 0.168656 -0.472909 + vertex 0.731344 0.204573 -0.472909 + endloop + endfacet + facet normal 0.287002 -0.287002 -0.913926 + outer loop + vertex 0.739877 0.107475 -0.439737 + vertex 0.731344 0.204573 -0.472909 + vertex 0.792525 0.160123 -0.439737 + endloop + endfacet + facet normal 0.175615 -0.175615 -0.968668 + outer loop + vertex 0.695427 0.168656 -0.472909 + vertex 0.648373 0.23342 -0.493181 + vertex 0.66658 0.251627 -0.493181 + endloop + endfacet + facet normal 0.175615 -0.175615 -0.968668 + outer loop + vertex 0.695427 0.168656 -0.472909 + vertex 0.66658 0.251627 -0.493181 + vertex 0.731344 0.204573 -0.472909 + endloop + endfacet + facet normal 0.221289 -0.112752 0.968668 + outer loop + vertex 0.66658 0.251627 0.493181 + vertex 0.731344 0.204573 0.472909 + vertex 0.754404 0.249831 0.472909 + endloop + endfacet + facet normal 0.221289 -0.112752 0.968668 + outer loop + vertex 0.66658 0.251627 0.493181 + vertex 0.754404 0.249831 0.472909 + vertex 0.678269 0.274569 0.493181 + endloop + endfacet + facet normal 0.361643 -0.184266 0.913926 + outer loop + vertex 0.731344 0.204573 0.472909 + vertex 0.792525 0.160123 0.439737 + vertex 0.826326 0.226462 0.439737 + endloop + endfacet + facet normal 0.361643 -0.184267 0.913925 + outer loop + vertex 0.731344 0.204573 0.472909 + vertex 0.826326 0.226462 0.439737 + vertex 0.754404 0.249831 0.472909 + endloop + endfacet + facet normal 0.491568 -0.250466 0.834043 + outer loop + vertex 0.792525 0.160123 0.439737 + vertex 0.848454 0.119487 0.39457 + vertex 0.892076 0.205099 0.39457 + endloop + endfacet + facet normal 0.491568 -0.250466 0.834043 + outer loop + vertex 0.792525 0.160123 0.439737 + vertex 0.892076 0.205099 0.39457 + vertex 0.826326 0.226462 0.439737 + endloop + endfacet + facet normal 0.607499 -0.309536 0.731527 + outer loop + vertex 0.848454 0.119487 0.39457 + vertex 0.897607 0.0837762 0.338641 + vertex 0.949858 0.186324 0.338641 + endloop + endfacet + facet normal 0.607499 -0.309536 0.731527 + outer loop + vertex 0.848454 0.119487 0.39457 + vertex 0.949858 0.186324 0.338641 + vertex 0.892076 0.205099 0.39457 + endloop + endfacet + facet normal 0.706398 -0.359927 0.609471 + outer loop + vertex 0.897607 0.0837762 0.338641 + vertex 0.938641 0.053963 0.273474 + vertex 0.998096 0.170651 0.273474 + endloop + endfacet + facet normal 0.706398 -0.359927 0.609471 + outer loop + vertex 0.897607 0.0837762 0.338641 + vertex 0.998096 0.170651 0.273474 + vertex 0.949858 0.186324 0.338641 + endloop + endfacet + facet normal 0.785798 -0.400384 0.471396 + outer loop + vertex 0.938641 0.053963 0.273474 + vertex 0.970438 0.030861 0.200848 + vertex 1.03548 0.158505 0.200848 + endloop + endfacet + facet normal 0.785798 -0.400384 0.471396 + outer loop + vertex 0.938641 0.053963 0.273474 + vertex 1.03548 0.158505 0.200848 + vertex 0.998096 0.170651 0.273474 + endloop + endfacet + facet normal 0.843819 -0.429947 0.321117 + outer loop + vertex 0.970438 0.030861 0.200848 + vertex 0.992131 0.0151005 0.122743 + vertex 1.06098 0.15022 0.122743 + endloop + endfacet + facet normal 0.843819 -0.429947 0.321116 + outer loop + vertex 0.970438 0.030861 0.200848 + vertex 1.06098 0.15022 0.122743 + vertex 1.03548 0.158505 0.200848 + endloop + endfacet + facet normal 0.879146 -0.447947 0.162622 + outer loop + vertex 0.992131 0.0151005 0.122743 + vertex 1.00313 0.00711123 0.0412897 + vertex 1.0739 0.146019 0.0412897 + endloop + endfacet + facet normal 0.879146 -0.447947 0.162623 + outer loop + vertex 0.992131 0.0151005 0.122743 + vertex 1.0739 0.146019 0.0412897 + vertex 1.06098 0.15022 0.122743 + endloop + endfacet + facet normal 0.891007 -0.45399 -1.28002e-08 + outer loop + vertex 1.00313 0.00711123 0.0412897 + vertex 1.00313 0.00711123 -0.0412897 + vertex 1.0739 0.146019 -0.0412897 + endloop + endfacet + facet normal 0.891007 -0.45399 0 + outer loop + vertex 1.00313 0.00711123 0.0412897 + vertex 1.0739 0.146019 -0.0412897 + vertex 1.0739 0.146019 0.0412897 + endloop + endfacet + facet normal 0.879146 -0.447947 -0.162622 + outer loop + vertex 1.00313 0.00711123 -0.0412897 + vertex 0.992131 0.0151005 -0.122743 + vertex 1.06098 0.15022 -0.122743 + endloop + endfacet + facet normal 0.879146 -0.447947 -0.162623 + outer loop + vertex 1.00313 0.00711123 -0.0412897 + vertex 1.06098 0.15022 -0.122743 + vertex 1.0739 0.146019 -0.0412897 + endloop + endfacet + facet normal 0.843819 -0.429947 -0.321117 + outer loop + vertex 0.992131 0.0151005 -0.122743 + vertex 0.970438 0.030861 -0.200848 + vertex 1.03548 0.158505 -0.200848 + endloop + endfacet + facet normal 0.843819 -0.429947 -0.321116 + outer loop + vertex 0.992131 0.0151005 -0.122743 + vertex 1.03548 0.158505 -0.200848 + vertex 1.06098 0.15022 -0.122743 + endloop + endfacet + facet normal 0.785798 -0.400384 -0.471396 + outer loop + vertex 0.970438 0.030861 -0.200848 + vertex 0.938641 0.053963 -0.273474 + vertex 0.998096 0.170651 -0.273474 + endloop + endfacet + facet normal 0.785798 -0.400384 -0.471396 + outer loop + vertex 0.970438 0.030861 -0.200848 + vertex 0.998096 0.170651 -0.273474 + vertex 1.03548 0.158505 -0.200848 + endloop + endfacet + facet normal 0.706398 -0.359928 -0.60947 + outer loop + vertex 0.938641 0.053963 -0.273474 + vertex 0.897607 0.0837762 -0.338641 + vertex 0.949858 0.186324 -0.338641 + endloop + endfacet + facet normal 0.706398 -0.359928 -0.609471 + outer loop + vertex 0.938641 0.053963 -0.273474 + vertex 0.949858 0.186324 -0.338641 + vertex 0.998096 0.170651 -0.273474 + endloop + endfacet + facet normal 0.607499 -0.309536 -0.731527 + outer loop + vertex 0.897607 0.0837762 -0.338641 + vertex 0.848454 0.119487 -0.39457 + vertex 0.892075 0.205099 -0.39457 + endloop + endfacet + facet normal 0.607499 -0.309536 -0.731527 + outer loop + vertex 0.897607 0.0837762 -0.338641 + vertex 0.892075 0.205099 -0.39457 + vertex 0.949858 0.186324 -0.338641 + endloop + endfacet + facet normal 0.491568 -0.250466 -0.834043 + outer loop + vertex 0.848454 0.119487 -0.39457 + vertex 0.792525 0.160123 -0.439737 + vertex 0.826326 0.226462 -0.439737 + endloop + endfacet + facet normal 0.491568 -0.250466 -0.834043 + outer loop + vertex 0.848454 0.119487 -0.39457 + vertex 0.826326 0.226462 -0.439737 + vertex 0.892075 0.205099 -0.39457 + endloop + endfacet + facet normal 0.361643 -0.184267 -0.913926 + outer loop + vertex 0.792525 0.160123 -0.439737 + vertex 0.731344 0.204573 -0.472909 + vertex 0.754404 0.249831 -0.472909 + endloop + endfacet + facet normal 0.361643 -0.184267 -0.913926 + outer loop + vertex 0.792525 0.160123 -0.439737 + vertex 0.754404 0.249831 -0.472909 + vertex 0.826326 0.226462 -0.439737 + endloop + endfacet + facet normal 0.221288 -0.112752 -0.968668 + outer loop + vertex 0.731344 0.204573 -0.472909 + vertex 0.66658 0.251627 -0.493181 + vertex 0.678269 0.274569 -0.493181 + endloop + endfacet + facet normal 0.221288 -0.112752 -0.968668 + outer loop + vertex 0.731344 0.204573 -0.472909 + vertex 0.678269 0.274569 -0.493181 + vertex 0.754404 0.249831 -0.472909 + endloop + endfacet + facet normal 0.2453 -0.0388517 0.968668 + outer loop + vertex 0.678269 0.274569 0.493181 + vertex 0.754404 0.249831 0.472909 + vertex 0.76235 0.3 0.472909 + endloop + endfacet + facet normal 0.2453 -0.0388516 0.968668 + outer loop + vertex 0.678269 0.274569 0.493181 + vertex 0.76235 0.3 0.472909 + vertex 0.682297 0.3 0.493181 + endloop + endfacet + facet normal 0.400885 -0.0634941 0.913926 + outer loop + vertex 0.754404 0.249831 0.472909 + vertex 0.826326 0.226462 0.439737 + vertex 0.837974 0.3 0.439737 + endloop + endfacet + facet normal 0.400885 -0.0634939 0.913926 + outer loop + vertex 0.754404 0.249831 0.472909 + vertex 0.837974 0.3 0.439737 + vertex 0.76235 0.3 0.472909 + endloop + endfacet + facet normal 0.544907 -0.0863045 0.834043 + outer loop + vertex 0.826326 0.226462 0.439737 + vertex 0.892076 0.205099 0.39457 + vertex 0.907106 0.3 0.39457 + endloop + endfacet + facet normal 0.544907 -0.0863051 0.834043 + outer loop + vertex 0.826326 0.226462 0.439737 + vertex 0.907106 0.3 0.39457 + vertex 0.837974 0.3 0.439737 + endloop + endfacet + facet normal 0.673418 -0.106659 0.731527 + outer loop + vertex 0.892076 0.205099 0.39457 + vertex 0.949858 0.186324 0.338641 + vertex 0.967862 0.3 0.338641 + endloop + endfacet + facet normal 0.673418 -0.106659 0.731527 + outer loop + vertex 0.892076 0.205099 0.39457 + vertex 0.967862 0.3 0.338641 + vertex 0.907106 0.3 0.39457 + endloop + endfacet + facet normal 0.783048 -0.124023 0.609471 + outer loop + vertex 0.949858 0.186324 0.338641 + vertex 0.998096 0.170651 0.273474 + vertex 1.01858 0.3 0.273474 + endloop + endfacet + facet normal 0.783048 -0.124022 0.609471 + outer loop + vertex 0.949858 0.186324 0.338641 + vertex 1.01858 0.3 0.273474 + vertex 0.967862 0.3 0.338641 + endloop + endfacet + facet normal 0.871064 -0.137963 0.471396 + outer loop + vertex 0.998096 0.170651 0.273474 + vertex 1.03548 0.158505 0.200848 + vertex 1.05789 0.3 0.200848 + endloop + endfacet + facet normal 0.871064 -0.137963 0.471396 + outer loop + vertex 0.998096 0.170651 0.273474 + vertex 1.05789 0.3 0.200848 + vertex 1.01858 0.3 0.273474 + endloop + endfacet + facet normal 0.93538 -0.14815 0.321116 + outer loop + vertex 1.03548 0.158505 0.200848 + vertex 1.06098 0.15022 0.122743 + vertex 1.0847 0.3 0.122743 + endloop + endfacet + facet normal 0.93538 -0.14815 0.321115 + outer loop + vertex 1.03548 0.158505 0.200848 + vertex 1.0847 0.3 0.122743 + vertex 1.05789 0.3 0.200848 + endloop + endfacet + facet normal 0.974541 -0.154352 0.162623 + outer loop + vertex 1.06098 0.15022 0.122743 + vertex 1.0739 0.146019 0.0412897 + vertex 1.09829 0.3 0.0412897 + endloop + endfacet + facet normal 0.974541 -0.154352 0.162622 + outer loop + vertex 1.06098 0.15022 0.122743 + vertex 1.09829 0.3 0.0412897 + vertex 1.0847 0.3 0.122743 + endloop + endfacet + facet normal 0.987688 -0.156434 0 + outer loop + vertex 1.0739 0.146019 0.0412897 + vertex 1.0739 0.146019 -0.0412897 + vertex 1.09829 0.3 -0.0412897 + endloop + endfacet + facet normal 0.987688 -0.156434 0 + outer loop + vertex 1.0739 0.146019 0.0412897 + vertex 1.09829 0.3 -0.0412897 + vertex 1.09829 0.3 0.0412897 + endloop + endfacet + facet normal 0.974541 -0.154352 -0.162623 + outer loop + vertex 1.0739 0.146019 -0.0412897 + vertex 1.06098 0.15022 -0.122743 + vertex 1.0847 0.3 -0.122743 + endloop + endfacet + facet normal 0.974541 -0.154352 -0.162622 + outer loop + vertex 1.0739 0.146019 -0.0412897 + vertex 1.0847 0.3 -0.122743 + vertex 1.09829 0.3 -0.0412897 + endloop + endfacet + facet normal 0.93538 -0.148149 -0.321116 + outer loop + vertex 1.06098 0.15022 -0.122743 + vertex 1.03548 0.158505 -0.200848 + vertex 1.05789 0.3 -0.200848 + endloop + endfacet + facet normal 0.93538 -0.14815 -0.321117 + outer loop + vertex 1.06098 0.15022 -0.122743 + vertex 1.05789 0.3 -0.200848 + vertex 1.0847 0.3 -0.122743 + endloop + endfacet + facet normal 0.871064 -0.137962 -0.471396 + outer loop + vertex 1.03548 0.158505 -0.200848 + vertex 0.998096 0.170651 -0.273474 + vertex 1.01858 0.3 -0.273474 + endloop + endfacet + facet normal 0.871064 -0.137963 -0.471396 + outer loop + vertex 1.03548 0.158505 -0.200848 + vertex 1.01858 0.3 -0.273474 + vertex 1.05789 0.3 -0.200848 + endloop + endfacet + facet normal 0.783048 -0.124022 -0.609471 + outer loop + vertex 0.998096 0.170651 -0.273474 + vertex 0.949858 0.186324 -0.338641 + vertex 0.967862 0.3 -0.338641 + endloop + endfacet + facet normal 0.783048 -0.124022 -0.60947 + outer loop + vertex 0.998096 0.170651 -0.273474 + vertex 0.967862 0.3 -0.338641 + vertex 1.01858 0.3 -0.273474 + endloop + endfacet + facet normal 0.673418 -0.106659 -0.731527 + outer loop + vertex 0.949858 0.186324 -0.338641 + vertex 0.892075 0.205099 -0.39457 + vertex 0.907106 0.3 -0.39457 + endloop + endfacet + facet normal 0.673418 -0.106659 -0.731527 + outer loop + vertex 0.949858 0.186324 -0.338641 + vertex 0.907106 0.3 -0.39457 + vertex 0.967862 0.3 -0.338641 + endloop + endfacet + facet normal 0.544908 -0.0863047 -0.834043 + outer loop + vertex 0.892075 0.205099 -0.39457 + vertex 0.826326 0.226462 -0.439737 + vertex 0.837974 0.3 -0.439737 + endloop + endfacet + facet normal 0.544907 -0.0863049 -0.834043 + outer loop + vertex 0.892075 0.205099 -0.39457 + vertex 0.837974 0.3 -0.439737 + vertex 0.907106 0.3 -0.39457 + endloop + endfacet + facet normal 0.400885 -0.0634939 -0.913926 + outer loop + vertex 0.826326 0.226462 -0.439737 + vertex 0.754404 0.249831 -0.472909 + vertex 0.76235 0.3 -0.472909 + endloop + endfacet + facet normal 0.400885 -0.0634938 -0.913925 + outer loop + vertex 0.826326 0.226462 -0.439737 + vertex 0.76235 0.3 -0.472909 + vertex 0.837974 0.3 -0.439737 + endloop + endfacet + facet normal 0.2453 -0.0388516 -0.968668 + outer loop + vertex 0.754404 0.249831 -0.472909 + vertex 0.678269 0.274569 -0.493181 + vertex 0.682297 0.3 -0.493181 + endloop + endfacet + facet normal 0.2453 -0.0388517 -0.968668 + outer loop + vertex 0.754404 0.249831 -0.472909 + vertex 0.682297 0.3 -0.493181 + vertex 0.76235 0.3 -0.472909 + endloop + endfacet +endsolid diff --git a/tutorials/mesh/cvMesh/simpleShapes/system/collapseDict b/tutorials/mesh/cvMesh/simpleShapes/system/collapseDict new file mode 100644 index 0000000000000000000000000000000000000000..9034677ca9c28252bd5ecf19eb24095c33c763c9 --- /dev/null +++ b/tutorials/mesh/cvMesh/simpleShapes/system/collapseDict @@ -0,0 +1,52 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: dev | +| \\ / A nd | Web: www.OpenFOAM.org | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ + +FoamFile +{ + version 2.0; + format ascii; + + root ""; + case ""; + instance ""; + local ""; + + class dictionary; + object collapseDict; +} + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +collapseEdgesCoeffs +{ + minimumEdgeLength 1e-6; + maximumMergeAngle 180; + reductionFactor 0.5; +} + +collapseFacesCoeffs +{ + initialFaceLengthFactor 0.5; + reductionFactor 0.5; + + allowEarlyCollapseToPoint on; + allowEarlyCollapseCoeff 0.2; + guardFraction 0.1; + maxCollapseFaceToPointSideLengthCoeff 0.3; +} + +meshQualityCoeffs +{ + #include "meshQualityDict"; + maximumIterations 30; + maximumSmoothingIterations 1; + maxPointErrorCount 5; +} + + +// ************************************************************************* // diff --git a/tutorials/mesh/cvMesh/simpleShapes/system/controlDict b/tutorials/mesh/cvMesh/simpleShapes/system/controlDict new file mode 100644 index 0000000000000000000000000000000000000000..8bbced6c67a446eef989729934ebaa162998c034 --- /dev/null +++ b/tutorials/mesh/cvMesh/simpleShapes/system/controlDict @@ -0,0 +1,54 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: dev | +| \\ / A nd | Web: www.OpenFOAM.org | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ + +FoamFile +{ + version 2.0; + format ascii; + + root ""; + case ""; + instance ""; + local ""; + + class dictionary; + object controlDict; +} + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +startFrom latestTime; + +startTime 0; + +stopAt endTime; + +endTime 80; + +deltaT 1; + +writeControl timeStep; + +writeInterval 80; // 10 to see the meshing steps + +purgeWrite 0; + +writeFormat ascii; + +writePrecision 10; + +writeCompression uncompressed; + +timeFormat general; + +timePrecision 6; + +runTimeModifiable yes; + + +// ************************************************************************* // diff --git a/tutorials/mesh/cvMesh/simpleShapes/system/cvMeshDict b/tutorials/mesh/cvMesh/simpleShapes/system/cvMeshDict new file mode 100644 index 0000000000000000000000000000000000000000..99379e62c9399731eb8f9949bfcf84f4daf669cc --- /dev/null +++ b/tutorials/mesh/cvMesh/simpleShapes/system/cvMeshDict @@ -0,0 +1,371 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: dev | +| \\ / A nd | Web: www.OpenFOAM.org | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ + +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + object cvMeshDict; +} + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + + +/* + +Control dictionary for cvMesh - polyhedral mesh generator. + +cvMesh phases: +1. fill volume with initial points (initialPoints subdictionary). An option + is to reread from previous set of points. + +2. internal point motion (motionControl subdictionary) + +3. every once in a while add point duplets/triplets to conform to + surfaces and features (surfaceConformation subdictionary) + +4. back to 2 + +5. construct polyMesh. + - filter (polyMeshFiltering subdictionary) + - check (meshQualityControls subdictionary) and undo filtering + + +See also cvControls.H in the conformalVoronoiMesh library + +*/ + + +// Important: +// ---------- +// Any scalar with a name <name>Coeff specifies a value that will be implemented +// as a faction of the local target cell size +// Any scalar with a name <name>Size specifies an absolute size. + + +// Geometry. Definition of all surfaces. All surfaces are of class +// searchableSurface. +// Surfaces need to be (almost) closed - use closedTriSurfaceMesh +// if they are not topologically closed. Surfaces need to be oriented so +// the space to be meshed is always on the inside of all surfaces. Use e.g. +// surfaceOrient. +geometry +{ + // Internal shape + coneAndSphere_clean_orient.obj + { + name coneAndSphere; + type triSurfaceMesh; + } + + // Outside of domain + domain_clean_orient.stl + { + name domain; + type triSurfaceMesh; + } + +} + + +// Controls for conforming to the surfaces. +surfaceConformation +{ + // A point inside surfaces that is inside mesh. + locationInMesh (0 -0.5 0); + + // How far apart are point-duplets generated. Balance this between + // - very low distance: little chance of interference from other + // surfaces + // - largish distance: less non-orthogonality in final cell + // (circumcentre far away from centroid) + pointPairDistanceCoeff 0.1; + + // Mixed feature edges - both inside and outside edges. Recreated + // by inserting triplets of points to recreate a single edge. Done for + // all edges emanating from point. triplets of points get inserted + // mixedFeaturePointPPDistanceCoeff distance away from feature point. + mixedFeaturePointPPDistanceCoeff 5.0; + + // Distance to a feature point within which surface and edge + // conformation points are excluded - fraction of the local target + // cell size + featurePointExclusionDistanceCoeff 0.6; + + // Distance to an existing feature edge conformation location + // within which other edge conformation location are excluded - + // fraction of the local target cell size + featureEdgeExclusionDistanceCoeff 0.6; + + // Optimisation: do not check for surface intersection (of dual edges) + // for points near to surface. + surfaceSearchDistanceCoeff 2.5; + + // Maximum allowable protrusion through the surface before + // conformation points are added - fraction of the local target + // cell size. These small protusions are (hopefully) done by mesh filtering + // instead. + maxSurfaceProtrusionCoeff 0.1; + + // If feature edge with large angle (so more than 125 degrees) introduce + // additional points to create two half angled cells (= mitering). + maxQuadAngle 125; + + // Frequency to redo surface conformation (expensive). + surfaceConformationRebuildFrequency 10; + + // Specialised feature point handling + specialiseFeaturePoints on; + + // Initial and intermediate controls + conformationControls + { + // We've got a point poking through the surface. Don't do any + // surface conformation if near feature edge (since feature edge + // conformation should have priority) + + // distance to search for near feature edges + edgeSearchDistCoeff 2; + + // Proximity to a feature edge where a surface hit is + // not created, only the edge conformation is created + // - fraction of the local target cell size. Coarse + // conformation, initial protrusion tests. + surfacePtReplaceDistCoeff 0.5; + + + surfacePtExclusionDistanceCoeff 0.5; + + // Stop either at maxIterations or if the number of surface pokes + // is very small (iterationToInitialHitRatioLimit * initial number) + // Note: perhaps iterationToInitialHitRatioLimit should be absolute + // count? + maxIterations 15; + + iterationToInitialHitRatioLimit 0.001; + } + + // Geometry to mesh to + geometryToConformTo + { + coneAndSphere + { + featureMethod extendedFeatureEdgeMesh; + extendedFeatureEdgeMesh "coneAndSphere_clean_orient.extendedFeatureEdgeMesh"; + } + + domain + { + featureMethod extendedFeatureEdgeMesh; + extendedFeatureEdgeMesh "domain_clean_orient.extendedFeatureEdgeMesh"; + } + } + + additionalFeatures {} +} + + +// Controls for seeding initial points and general control of the target +// cell size (used everywhere) +initialPoints +{ + // Do not place point closer than minimumSurfaceDistanceCoeff + // to the surface. Is fraction of local target cell size (see below) + minimumSurfaceDistanceCoeff 0.55; + + initialPointsMethod autoDensity; + // initialPointsMethod uniformGrid; + // initialPointsMethod bodyCentredCubic; + // initialPointsMethod pointFile; + + // Take boundbox of all geometry. Samples with this box. If too much + // samples (due to target cell size) in box split box. + autoDensityCoeffs + { + minCellSizeLimit 0.1; + // Initial number of refinement levels. Needs to be enough to pick + // up features due to size ratio. If not enough it will take longer + // to determine point seeding. + minLevels 4; + // Split box if ratio of min to max cell size larger than maxSizeRatio + maxSizeRatio 5.0; + // Per box sample 3x3x3 internally + sampleResolution 3; + // Additionally per face of the box sample 3 + surfaceSampleResolution 3; + } + + uniformGridCoeffs + { + // Absolute cell size. + initialCellSize 0.0015; + randomiseInitialGrid yes; + randomPerturbationCoeff 0.02; + } + + bodyCentredCubicCoeffs + { + initialCellSize 0.0015; + randomiseInitialGrid no; + randomPerturbationCoeff 0.1; + } + + pointFileCoeffs + { + // Reads points from file. Still rejects points that are too + // close to the surface (minimumSurfaceDistanceCoeff) or on the + // wrong side of the surfaces. + pointFile "constant/internalDelaunayVertices"; + } +} + + +// Control size of voronoi cells i.e. distance between points. This +// determines the target cell size which is used everywhere. +// It determines the cell size given a location. It then uses all +// the rules +// - defaultCellSize +// - cellSizeControlGeometry +// to determine target cell size. Rule with highest priority wins. If same +// priority smallest cell size wins. +motionControl +{ + // Absolute cell size of back ground mesh. This is the maximum cell size. + defaultCellSize 0.1; + + shapeControlFunctions + { + coneAndSphere + { + type searchableSurfaceControl; + priority 1; + mode bothSides; + + surfaceCellSizeFunction uniformValue; + uniformValueCoeffs + { + surfaceCellSize 0.075; + } + + cellSizeFunction uniform; + uniformCoeffs + {} + } + + domain + { + type searchableSurfaceControl; + priority 1; + mode bothSides; + + surfaceCellSizeFunction uniformValue; + uniformValueCoeffs + { + surfaceCellSize $defaultCellSize; + } + + cellSizeFunction uniform; + uniformCoeffs + {} + } + } + + cellAspectRatioControl + { + aspectRatio 1.0; + aspectRatioDirection (0 0 0); + } + + // Underrelaxation for point motion. Simulated annealing: starts off at 1 + // and lowers to 0 (at simulation endTime) to converge points. + // adaptiveLinear is preferred choice. + // Points move by e.g. 10% of tet size. + relaxationModel adaptiveLinear; //rampHoldFall + + adaptiveLinearCoeffs + { + relaxationStart 1.0; + relaxationEnd 0.0; + } + + // Output lots and lots of .obj files + objOutput no; + + // Timing and memory usage. + timeChecks no; + + // Number of rays in plane parallel to nearest surface. Used to detect + // next closest surfaces. Used to work out alignment (three vectors) + // to surface. + // Note that only the initial points (from the seeding) calculate this + // information so if these are not fine enough the alignment will + // not be correct. (any points added during the running will lookup + // this information from the nearest initial point since it is + // expensive) + alignmentSearchSpokes 36; + + // For each delaunay edge (between two vertices, becomes + // the Voronoi face normal) snap to the alignment direction if within + // alignmentAcceptanceAngle. Slightly > 45 is a good choice - prevents + // flipping. + alignmentAcceptanceAngle 48; + + // How often to rebuild the alignment info (expensive) + sizeAndAlignmentRebuildFrequency 20; + + // When to insert points. Not advisable change to + // these settings. + pointInsertionCriteria + { + // If edge larger than 1.75 target cell size + // (so tets too large/stretched) insert point + cellCentreDistCoeff 1.75; + // Do not insert point if voronoi face (on edge) very small. + faceAreaRatioCoeff 0.0025; + // Insert point only if edge closely aligned to local alignment + // direction. + acceptanceAngle 21.5; + } + + // Opposite: remove point if mesh too compressed. Do not change these + // settings. + pointRemovalCriteria + { + cellCentreDistCoeff 0.65; + } + + // How to determine the point motion. All edges got some direction. + // Sum all edge contributions to determine point motion. Weigh by + // face area so motion is preferentially determined by large faces + // (or more importantly ignore contribution from small faces). + // Do not change these settings. + faceAreaWeightModel piecewiseLinearRamp; + + piecewiseLinearRampCoeffs + { + lowerAreaFraction 0.5; + upperAreaFraction 1.0; + } +} + + +// After simulation, when converting to polyMesh, filter out small faces/edges. +// Do not change. See cvControls.H +polyMeshFiltering +{ + filterEdges on; + filterFaces on; + writeTetDualMesh false; +} + + +#include "meshQualityDict"; + + +// ************************************************************************* // diff --git a/tutorials/mesh/cvMesh/simpleShapes/system/fvSchemes b/tutorials/mesh/cvMesh/simpleShapes/system/fvSchemes new file mode 100644 index 0000000000000000000000000000000000000000..d8d476c57fee0824977fcf92dc4d484653bd003b --- /dev/null +++ b/tutorials/mesh/cvMesh/simpleShapes/system/fvSchemes @@ -0,0 +1,55 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: dev | +| \\ / A nd | Web: www.OpenFOAM.org | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + location "system"; + object fvSchemes; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +d2dt2Schemes +{ + default steadyState; +} + +gradSchemes +{ + default Gauss cubic; +} + +divSchemes +{ + default Gauss cubic; +} + +laplacianSchemes +{ + default Gauss linear uncorrected; +} + +interpolationSchemes +{ + default cubic; +} + +snGradSchemes +{ + default uncorrected; +} + +fluxRequired +{ + default no; + D ; +} + + +// ************************************************************************* // diff --git a/tutorials/mesh/cvMesh/simpleShapes/system/fvSolution b/tutorials/mesh/cvMesh/simpleShapes/system/fvSolution new file mode 100644 index 0000000000000000000000000000000000000000..8dabfdac0a8192e197f0550d41b1691f1c3b68e6 --- /dev/null +++ b/tutorials/mesh/cvMesh/simpleShapes/system/fvSolution @@ -0,0 +1,41 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: dev | +| \\ / A nd | Web: www.OpenFOAM.org | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + location "system"; + object fvSolution; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +solvers +{ + "(D|Dcorr)" + { + solver GAMG; + tolerance 1e-06; + relTol 0.99; + smoother GaussSeidel; + cacheAgglomeration true; + nCellsInCoarsestLevel 6; + agglomerator faceAreaPair; + mergeLevels 1; + } +} + +stressAnalysis +{ + nCorrectors 1; + D 1e-10; + accelerationFactor 2; +} + + +// ************************************************************************* // diff --git a/tutorials/mesh/cvMesh/simpleShapes/system/meshQualityDict b/tutorials/mesh/cvMesh/simpleShapes/system/meshQualityDict new file mode 100644 index 0000000000000000000000000000000000000000..1b83e2bd87b647e97cf8b39d2dccbb30af267c8e --- /dev/null +++ b/tutorials/mesh/cvMesh/simpleShapes/system/meshQualityDict @@ -0,0 +1,73 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: dev | +| \\ / A nd | Web: www.OpenFOAM.org | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ + +FoamFile +{ + version 2.0; + format ascii; + + root ""; + case ""; + instance ""; + local ""; + + class dictionary; + object meshQualityDict; +} + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +//- Maximum non-orthogonality allowed. Set to 180 to disable. +maxNonOrtho 65; + +//- Max skewness allowed. Set to <0 to disable. +maxBoundarySkewness 50; +maxInternalSkewness 10; + +//- Max concaveness allowed. Is angle (in degrees) below which concavity +// is allowed. 0 is straight face, <0 would be convex face. +// Set to 180 to disable. +maxConcave 80; + +//- Minimum quality of the tet formed by the face-centre +// and variable base point minimum decomposition triangles and +// the cell centre. This has to be a positive number for tracking +// to work. Set to very negative number (e.g. -1E30) to +// disable. +// <0 = inside out tet, +// 0 = flat tet +// 1 = regular tet +minTetQuality 1e-30; + +//- Minimum pyramid volume. Is absolute volume of cell pyramid. +// Set to a sensible fraction of the smallest cell volume expected. +// Set to very negative number (e.g. -1E30) to disable. +minVol 0; + +//- Minimum face area. Set to <0 to disable. +minArea -1; + +//- Minimum face twist. Set to <-1 to disable. dot product of face normal +//- and face centre triangles normal +minTwist 0.001; + +//- minimum normalised cell determinant +//- 1 = hex, <= 0 = folded or flattened illegal cell +minDeterminant 0.001; + +//- minFaceWeight (0 -> 0.5) +minFaceWeight 0.02; + +//- minVolRatio (0 -> 1) +minVolRatio 0.01; + +//must be >0 for Fluent compatibility +minTriangleTwist -1; + + +// ************************************************************************* // diff --git a/tutorials/mesh/cvMesh/simpleShapes/system/surfaceFeatureExtractDict b/tutorials/mesh/cvMesh/simpleShapes/system/surfaceFeatureExtractDict new file mode 100644 index 0000000000000000000000000000000000000000..850a4ea41f48c278271672540d2f1eff0dd60b03 --- /dev/null +++ b/tutorials/mesh/cvMesh/simpleShapes/system/surfaceFeatureExtractDict @@ -0,0 +1,57 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: dev | +| \\ / A nd | Web: www.OpenFOAM.org | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + object surfaceFeatureExtractDict; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +coneAndSphere_clean_orient.obj +{ + extractionMethod extractFromSurface; + + extractFromSurfaceCoeffs + { + // Mark edges whose adjacent surface normals are at an angle less + // than includedAngle as features + // - 0 : selects no edges + // - 180: selects all edges + includedAngle 125; + } + + // Write options + + // Write features to obj format for postprocessing + writeObj no; +} + + +domain_clean_orient.stl +{ + extractionMethod extractFromSurface; + + extractFromSurfaceCoeffs + { + // Mark edges whose adjacent surface normals are at an angle less + // than includedAngle as features + // - 0 : selects no edges + // - 180: selects all edges + includedAngle 125; + } + + // Write options + + // Write features to obj format for postprocessing + writeObj no; +} + + +// ************************************************************************* // diff --git a/tutorials/mesh/cvMesh/simpleShapes/system/topoSetDict b/tutorials/mesh/cvMesh/simpleShapes/system/topoSetDict new file mode 100644 index 0000000000000000000000000000000000000000..363fbd4fc15ac9b64be4c912371670f1c256f1f3 --- /dev/null +++ b/tutorials/mesh/cvMesh/simpleShapes/system/topoSetDict @@ -0,0 +1,148 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: dev | +| \\ / A nd | Web: www.OpenFOAM.org | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + object topoSetDict; +} + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +actions +( + { + name z; + type cellSet; + action new; + source boxToCell; + sourceInfo + { + box (-100 -100 0)(100 100 100); + } + } + + { + name zf; + type faceSet; + action new; + source cellToFace; + sourceInfo + { + set z; + option all; + } + } + + { + name z; + type cellSet; + action invert; + } + + { + name zf; + type faceSet; + action subset; + source cellToFace; + sourceInfo + { + set z; + option all; + } + } + + // ~~~~~~~~~~~~~~~~ // + + { + name y; + type cellSet; + action new; + source boxToCell; + sourceInfo + { + box (-100 0.1 -100)(100 100 100); + } + } + + { + name yf; + type faceSet; + action new; + source cellToFace; + sourceInfo + { + set y; + option all; + } + } + + { + name y; + type cellSet; + action invert; + } + + { + name yf; + type faceSet; + action subset; + source cellToFace; + sourceInfo + { + set y; + option all; + } + } + + // ~~~~~~~~~~~~~~~~ // + + { + name x; + type cellSet; + action new; + source boxToCell; + sourceInfo + { + box (0.3 -100 -100)(100 100 100); + } + } + + { + name xf; + type faceSet; + action new; + source cellToFace; + sourceInfo + { + set x; + option all; + } + } + + { + name x; + type cellSet; + action invert; + } + + { + name xf; + type faceSet; + action subset; + source cellToFace; + sourceInfo + { + set x; + option all; + } + } +); + +// ************************************************************************* //