diff --git a/libsrc/core/exception.cpp b/libsrc/core/exception.cpp index 3727412a..93e0e7e9 100644 --- a/libsrc/core/exception.cpp +++ b/libsrc/core/exception.cpp @@ -167,6 +167,11 @@ namespace ngcore static void ngcore_signal_handler(int sig) { + static bool first_call = true; + if(!first_call) + exit(1); // avoid endless recursions if signals are caused by this handler + first_call = false; + switch(sig) { case SIGABRT: diff --git a/libsrc/core/logging.cpp b/libsrc/core/logging.cpp index cedc99c4..b5056406 100644 --- a/libsrc/core/logging.cpp +++ b/libsrc/core/logging.cpp @@ -15,7 +15,7 @@ namespace ngcore { std::ostream* testout = new std::ostream(nullptr); // NOLINT - level::level_enum Logger::global_level; + level::level_enum Logger::global_level = level::warn; void Logger::log(level::level_enum level, std::string && s) { diff --git a/libsrc/core/taskmanager.hpp b/libsrc/core/taskmanager.hpp index e5a7313b..6710ee11 100644 --- a/libsrc/core/taskmanager.hpp +++ b/libsrc/core/taskmanager.hpp @@ -15,6 +15,7 @@ #include "array.hpp" #include "paje_trace.hpp" +#include "profiler.hpp" namespace ngcore { @@ -1059,6 +1060,7 @@ public: template int ComputeColoring( FlatArray colors, size_t ndofs, Tmask const & getDofs) { + static Timer timer("ComputeColoring - "+Demangle(typeid(Tmask).name())); RegionTimer rt(timer); static_assert(sizeof(unsigned int)==4, "Adapt type of mask array"); auto n = colors.Size(); diff --git a/libsrc/core/utils.cpp b/libsrc/core/utils.cpp index 4033a6eb..bf355bc1 100644 --- a/libsrc/core/utils.cpp +++ b/libsrc/core/utils.cpp @@ -15,10 +15,22 @@ namespace ngcore // windows does demangling in typeid(T).name() NGCORE_API std::string Demangle(const char* typeinfo) { return typeinfo; } #else - NGCORE_API std::string Demangle(const char* typeinfo) { int status; return abi::__cxa_demangle(typeinfo, - nullptr, - nullptr, - &status); } + NGCORE_API std::string Demangle(const char* typeinfo) + { + int status=0; + try + { + char *s = abi::__cxa_demangle(typeinfo, nullptr, nullptr, &status); + std::string result{s}; + free(s); + return result; + } + catch( const std::exception & e ) + { + GetLogger("utils")->warn("{}:{} cannot demangle {}, status: {}, error:{}", __FILE__, __LINE__, typeinfo, status, e.what()); + } + return typeinfo; + } #endif double seconds_per_tick = [] () noexcept diff --git a/libsrc/general/parthreads.hpp b/libsrc/general/parthreads.hpp index 05521df1..2e242484 100644 --- a/libsrc/general/parthreads.hpp +++ b/libsrc/general/parthreads.hpp @@ -96,12 +96,6 @@ void ParallelFor( int first, int next, const TFunc & f ) - template - inline atomic & AsAtomic (T & d) - { - return reinterpret_cast&> (d); - } - typedef void (*TaskManager)(std::function); typedef void (*Tracer)(string, bool); // false .. start, true .. stop diff --git a/libsrc/meshing/delaunay.cpp b/libsrc/meshing/delaunay.cpp index 67c455d2..a152b762 100644 --- a/libsrc/meshing/delaunay.cpp +++ b/libsrc/meshing/delaunay.cpp @@ -1,9 +1,289 @@ #include #include "meshing.hpp" - namespace netgen { + template + class DelaunayTree + { + public: + // Number of entries per leaf + static constexpr int N = 100; + + struct Node; + + struct Leaf + { + Point<2*dim, TSCAL> p[N]; + T index[N]; + int n_elements; + int nr; + + Leaf() : n_elements(0) + { } + + + void Add( Array &leaves, Array &leaf_index, const Point<2*dim> &ap, T aindex ) + { + p[n_elements] = ap; + index[n_elements] = aindex; + n_elements++; + if(leaf_index.Size() leaves; + Array leaf_index; + + Point global_min, global_max; + double tol; + size_t n_leaves; + size_t n_nodes; + BlockAllocator ball_nodes; + BlockAllocator ball_leaves; + + public: + + DelaunayTree (const Point & pmin, const Point & pmax) + : global_min(pmin), global_max(pmax), n_leaves(1), n_nodes(1), ball_nodes(sizeof(Node)), ball_leaves(sizeof(Leaf)) + { + root.leaf = (Leaf*) ball_leaves.Alloc(); new (root.leaf) Leaf(); + root.leaf->nr = 0; + leaves.Append(root.leaf); + root.level = 0; + tol = 1e-7 * Dist(pmax, pmin); + } + + DelaunayTree (const Box & box) + : DelaunayTree(box.PMin(), box.PMax()) + { } + + size_t GetNLeaves() + { + return n_leaves; + } + + size_t GetNNodes() + { + return n_nodes; + } + + template + void GetFirstIntersecting (const Point & pmin, const Point & pmax, + TFunc func=[](auto pi){return false;}) const + { + // static Timer timer("DelaunayTree::GetIntersecting"); RegionTimer rt(timer); + // static Timer timer1("DelaunayTree::GetIntersecting-LinearSearch"); + ArrayMem stack; + ArrayMem dir_stack; + + + Point<2*dim> tpmin, tpmax; + + for (size_t i : IntRange(dim)) + { + tpmin(i) = global_min(i); + tpmax(i) = pmax(i)+tol; + + tpmin(i+dim) = pmin(i)-tol; + tpmax(i+dim) = global_max(i); + } + + stack.SetSize(0); + stack.Append(&root); + dir_stack.SetSize(0); + dir_stack.Append(0); + + while(stack.Size()) + { + const Node *node = stack.Last(); + stack.DeleteLast(); + + int dir = dir_stack.Last(); + dir_stack.DeleteLast(); + + if(Leaf *leaf = node->GetLeaf()) + { + // RegionTimer rt1(timer1); + for (auto i : IntRange(leaf->n_elements)) + { + bool intersect = true; + const auto p = leaf->p[i]; + + for (int d = 0; d < dim; d++) + if (p[d] > tpmax[d]) + intersect = false; + for (int d = dim; d < 2*dim; d++) + if (p[d] < tpmin[d]) + intersect = false; + if(intersect) + if(func(leaf->index[i])) return; + } + } + else + { + int newdir = dir+1; + if(newdir==2*dim) newdir = 0; + if (tpmin[dir] <= node->sep) + { + stack.Append(node->children[0]); + dir_stack.Append(newdir); + } + if (tpmax[dir] >= node->sep) + { + stack.Append(node->children[1]); + dir_stack.Append(newdir); + } + } + } + } + + void GetIntersecting (const Point & pmin, const Point & pmax, + NgArray & pis) const + { + pis.SetSize(0); + GetFirstIntersecting(pmin, pmax, [&pis](auto pi) { pis.Append(pi); return false;}); + } + + void Insert (const Box & box, T pi) + { + Insert (box.PMin(), box.PMax(), pi); + } + + void Insert (const Point & pmin, const Point & pmax, T pi) + { + // static Timer timer("DelaunayTree::Insert"); RegionTimer rt(timer); + int dir = 0; + Point<2*dim> p; + for (auto i : IntRange(dim)) + { + p(i) = pmin[i]; + p(i+dim) = pmax[i]; + } + + Node * node = &root; + Leaf * leaf = node->GetLeaf(); + + // search correct leaf to add point + while(!leaf) + { + node = p[dir] < node->sep ? node->children[0] : node->children[1]; + dir++; + if(dir==2*dim) dir = 0; + leaf = node->GetLeaf(); + } + + // add point to leaf + if(leaf->n_elements < N) + leaf->Add(leaves, leaf_index, p,pi); + else // assume leaf->n_elements == N + { + // add two new nodes and one new leaf + int n_elements = leaf->n_elements; + ArrayMem coords(n_elements); + ArrayMem order(n_elements); + + // separate points in two halves, first sort all coordinates in direction dir + for (auto i : IntRange(n_elements)) + { + order[i] = i; + coords[i] = leaf->p[i][dir]; + } + + QuickSortI(coords, order); + int isplit = N/2; + Leaf *leaf1 = (Leaf*) ball_leaves.Alloc(); new (leaf1) Leaf(); + Leaf *leaf2 = (Leaf*) ball_leaves.Alloc(); new (leaf2) Leaf(); + + leaf1->nr = leaf->nr; + leaf2->nr = leaves.Size(); + leaves.Append(leaf2); + leaves[leaf1->nr] = leaf1; + + for (auto i : order.Range(isplit)) + leaf1->Add(leaves, leaf_index, leaf->p[i], leaf->index[i] ); + for (auto i : order.Range(isplit, N)) + leaf2->Add(leaves, leaf_index, leaf->p[i], leaf->index[i] ); + + Node *node1 = (Node*) ball_nodes.Alloc(); new (node1) Node(); + node1->leaf = leaf1; + node1->level = node->level+1; + + Node *node2 = (Node*) ball_nodes.Alloc(); new (node2) Node(); + node2->leaf = leaf2; + node2->level = node->level+1; + + node->children[0] = node1; + node->children[1] = node2; + node->sep = 0.5 * (leaf->p[order[isplit-1]][dir] + leaf->p[order[isplit]][dir]); + + // add new point to one of the new leaves + if (p[dir] < node->sep) + leaf1->Add( leaves, leaf_index, p, pi ); + else + leaf2->Add( leaves, leaf_index, p, pi ); + + ball_leaves.Free(leaf); + n_leaves++; + n_nodes+=2; + } + } + + void DeleteElement (T pi) + { + // static Timer timer("DelaunayTree::DeleteElement"); RegionTimer rt(timer); + Leaf *leaf = leaves[leaf_index[pi]]; + leaf_index[pi] = -1; + auto & n_elements = leaf->n_elements; + auto & index = leaf->index; + auto & p = leaf->p; + + for (auto i : IntRange(n_elements)) + { + if(index[i] == pi) + { + n_elements--; + if(i!=n_elements) + { + index[i] = index[n_elements]; + p[i] = p[n_elements]; + } + return; + } + } + } + }; + + // typedef BoxTree<3> DTREE; + typedef DelaunayTree<3> DTREE; static const int deltetfaces[][3] = { { 1, 2, 3 }, @@ -227,14 +507,14 @@ namespace netgen void AddDelaunayPoint (PointIndex newpi, const Point3d & newp, NgArray & tempels, Mesh & mesh, - BoxTree<3> & tettree, + DTREE & tettree, MeshNB & meshnb, NgArray > & centers, NgArray & radi2, NgArray & connected, NgArray & treesearch, NgArray & freelist, SphereList & list, IndexSet & insphere, IndexSet & closesphere) { - static Timer t("Meshing3::AddDelaunayPoint"); RegionTimer reg(t); + static Timer t("Meshing3::AddDelaunayPoint");// RegionTimer reg(t); // static Timer tsearch("addpoint, search"); // static Timer tinsert("addpoint, insert"); @@ -635,7 +915,7 @@ namespace netgen pmin2 = pmin2 + 0.1 * (pmin2 - pmax2); pmax2 = pmax2 + 0.1 * (pmax2 - pmin2); - BoxTree<3> tettree(pmin2, pmax2); + DTREE tettree(pmin2, pmax2); tempels.Append (startel); @@ -798,6 +1078,7 @@ namespace netgen tempmesh.AddVolumeElement (el); } + tempels.DeleteAll(); MeshQuality3d (tempmesh); @@ -852,6 +1133,7 @@ namespace netgen MeshQuality3d (tempmesh); + tempels.SetSize(tempmesh.GetNE()); tempels.SetSize(0); for (auto & el : tempmesh.VolumeElements()) tempels.Append (el); diff --git a/libsrc/meshing/improve2.cpp b/libsrc/meshing/improve2.cpp index 7e3f5953..524ba239 100644 --- a/libsrc/meshing/improve2.cpp +++ b/libsrc/meshing/improve2.cpp @@ -7,24 +7,6 @@ namespace netgen { - class Neighbour - { - int nr[3]; - int orient[3]; - - public: - Neighbour () { ; } - - void SetNr (int side, int anr) { nr[side] = anr; } - int GetNr (int side) { return nr[side]; } - - void SetOrientation (int side, int aorient) { orient[side] = aorient; } - int GetOrientation (int side) { return orient[side]; } - }; - - - - class trionedge { public: @@ -37,381 +19,331 @@ namespace netgen }; + bool MeshOptimize2d :: EdgeSwapping (const int usemetric, + Array &neighbors, + Array &swapped, + const SurfaceElementIndex t1, const int o1, + const int t, + Array &pdef, + const bool check_only) + { + bool should; + bool do_swap = false; + + SurfaceElementIndex t2 = neighbors[t1].GetNr (o1); + int o2 = neighbors[t1].GetOrientation (o1); + + if (t2 == -1) return false; + if (swapped[t1] || swapped[t2]) return false; + + const int faceindex = mesh[t1].GetIndex(); + const int surfnr = mesh.GetFaceDescriptor (faceindex).SurfNr(); + + PointIndex pi1 = mesh[t1].PNumMod(o1+1+1); + PointIndex pi2 = mesh[t1].PNumMod(o1+1+2); + PointIndex pi3 = mesh[t1].PNumMod(o1+1); + PointIndex pi4 = mesh[t2].PNumMod(o2+1); + + PointGeomInfo gi1 = mesh[t1].GeomInfoPiMod(o1+1+1); + PointGeomInfo gi2 = mesh[t1].GeomInfoPiMod(o1+1+2); + PointGeomInfo gi3 = mesh[t1].GeomInfoPiMod(o1+1); + PointGeomInfo gi4 = mesh[t2].GeomInfoPiMod(o2+1); + + bool allowswap = true; + + Vec<3> auxvec1 = mesh[pi3]-mesh[pi4]; + Vec<3> auxvec2 = mesh[pi1]-mesh[pi4]; + + allowswap = allowswap && fabs(1.-(auxvec1*auxvec2)/(auxvec1.Length()*auxvec2.Length())) > 1e-4; + + if(!allowswap) + return false; + + // normal of new + Vec<3> nv1 = Cross (auxvec1, auxvec2); + + auxvec1 = mesh.Point(pi4)-mesh.Point(pi3); + auxvec2 = mesh.Point(pi2)-mesh.Point(pi3); + allowswap = allowswap && fabs(1.-(auxvec1*auxvec2)/(auxvec1.Length()*auxvec2.Length())) > 1e-4; + + + if(!allowswap) + return false; + + Vec<3> nv2 = Cross (auxvec1, auxvec2); + + + // normals of original + Vec<3> nv3 = Cross (mesh[pi1]-mesh[pi4], mesh[pi2]-mesh[pi4]); + Vec<3> nv4 = Cross (mesh[pi2]-mesh[pi3], mesh[pi1]-mesh[pi3]); + + nv3 *= -1; + nv4 *= -1; + nv3.Normalize(); + nv4.Normalize(); + + nv1.Normalize(); + nv2.Normalize(); + + auto nvp3 = geo.GetNormal (surfnr, mesh.Point(pi3), gi3); + + nvp3.Normalize(); + + auto nvp4 = geo.GetNormal (surfnr, mesh.Point(pi4), gi4); + + nvp4.Normalize(); + + + + double critval = cos (M_PI / 6); // 30 degree + allowswap = allowswap && + (nv1 * nvp3 > critval) && + (nv1 * nvp4 > critval) && + (nv2 * nvp3 > critval) && + (nv2 * nvp4 > critval) && + (nvp3 * nv3 > critval) && + (nvp4 * nv4 > critval); + + + double horder = Dist (mesh[pi1], mesh[pi2]); + + if ( // nv1 * nv2 >= 0 && + nv1.Length() > 1e-3 * horder * horder && + nv2.Length() > 1e-3 * horder * horder && + allowswap ) + { + if (!usemetric) + { + int e = pdef[pi1] + pdef[pi2] - pdef[pi3] - pdef[pi4]; + double d = + Dist2 (mesh[pi1], mesh[pi2]) - + Dist2 (mesh[pi3], mesh[pi4]); + + should = e >= t && (e > 2 || d > 0); + } + else + { + double loch = mesh.GetH(mesh[pi1]); + should = + CalcTriangleBadness (mesh[pi4], mesh[pi3], mesh[pi1], metricweight, loch) + + CalcTriangleBadness (mesh[pi3], mesh[pi4], mesh[pi2], metricweight, loch) < + CalcTriangleBadness (mesh[pi1], mesh[pi2], mesh[pi3], metricweight, loch) + + CalcTriangleBadness (mesh[pi2], mesh[pi1], mesh[pi4], metricweight, loch); + } + + if (allowswap) + { + Element2d sw1 (pi4, pi3, pi1); + Element2d sw2 (pi3, pi4, pi2); + + int legal1 = + mesh.LegalTrig (mesh[t1]) + + mesh.LegalTrig (mesh[t2]); + int legal2 = + mesh.LegalTrig (sw1) + mesh.LegalTrig (sw2); + + if (legal1 < legal2) should = true; + if (legal2 < legal1) should = false; + } + + do_swap = should; + if (should && !check_only) + { + // do swapping ! + + mesh[t1] = { { pi1, gi1 }, { pi4, gi4 }, { pi3, gi3 } }; + mesh[t2] = { { pi2, gi2 }, { pi3, gi3 }, { pi4, gi4 } }; + + pdef[pi1]--; + pdef[pi2]--; + pdef[pi3]++; + pdef[pi4]++; + + swapped[t1] = true; + swapped[t2] = true; + } + } + return do_swap; + } void MeshOptimize2d :: EdgeSwapping (int usemetric) { static Timer timer("EdgeSwapping (2D)"); RegionTimer reg(timer); - if (!faceindex) - { - if (usemetric) - PrintMessage (3, "Edgeswapping, metric"); - else - PrintMessage (3, "Edgeswapping, topological"); - - for (faceindex = 1; faceindex <= mesh.GetNFD(); faceindex++) - { - EdgeSwapping (usemetric); - - if (multithread.terminate) - throw NgException ("Meshing stopped"); - } - - faceindex = 0; - mesh.CalcSurfacesOfNode(); - return; - } - - - static int timerstart = NgProfiler::CreateTimer ("EdgeSwapping 2D start"); - NgProfiler::StartTimer (timerstart); + static Timer timer_nb("EdgeSwapping-Find neighbors"); + if (usemetric) + PrintMessage (3, "Edgeswapping, metric"); + else + PrintMessage (3, "Edgeswapping, topological"); + static Timer timerstart("EdgeSwapping 2D start"); + timerstart.Start(); Array seia; - mesh.GetSurfaceElementsOfFace (faceindex, seia); + bool mixed = false; - /* - for (int i = 0; i < seia.Size(); i++) - if (mesh[seia[i]].GetNP() != 3) - { - GenericImprove (mesh); - return; - } - */ - for (SurfaceElementIndex sei : seia) - if (mesh[sei].GetNP() != 3) - { - GenericImprove(); - return; - } + if(faceindex==0) + { + seia.SetSize(mesh.GetNSE()); + ParallelFor( Range(seia), [&] (auto i) NETGEN_LAMBDA_INLINE + { + SurfaceElementIndex sei(i); + seia[i] = sei; + if (mesh[sei].GetNP() != 3) + mixed = true; + }); + } + else + { + mesh.GetSurfaceElementsOfFace (faceindex, seia); + for (SurfaceElementIndex sei : seia) + if (mesh[sei].GetNP() != 3) + mixed = true; + } + + if(mixed) + return GenericImprove(); - int surfnr = mesh.GetFaceDescriptor (faceindex).SurfNr(); - Array neighbors(mesh.GetNSE()); - INDEX_2_HASHTABLE other(2*seia.Size() + 2); - + auto elements_on_node = mesh.CreatePoint2SurfaceElementTable(faceindex); Array swapped(mesh.GetNSE()); - NgArray pdef(mesh.GetNP()); - NgArray pangle(mesh.GetNP()); + Array pdef(mesh.GetNP()); + Array pangle(mesh.GetNP()); - - // int e; - // double d; - // Vec3d nv1, nv2; - - // double loch(-1); static const double minangle[] = { 0, 1.481, 2.565, 3.627, 4.683, 5.736, 7, 9 }; - for (int i = 0; i < seia.Size(); i++) + if(faceindex == 0) { - const Element2d & sel = mesh[seia[i]]; - for (int j = 0; j < 3; j++) - pangle[sel[j]] = 0.0; + ParallelFor( Range(pangle), [&] (auto i) NETGEN_LAMBDA_INLINE + { + pangle[i] = 0.0; + }); } - // pangle = 0; - - for (int i = 0; i < seia.Size(); i++) + else { - const Element2d & sel = mesh[seia[i]]; - for (int j = 0; j < 3; j++) - { - POINTTYPE typ = mesh[sel[j]].Type(); - if (typ == FIXEDPOINT || typ == EDGEPOINT) - { - pangle[sel[j]] += - Angle (mesh[sel[(j+1)%3]] - mesh[sel[j]], - mesh[sel[(j+2)%3]] - mesh[sel[j]]); - } - } + ParallelFor( Range(seia), [&] (auto i) NETGEN_LAMBDA_INLINE + { + const Element2d & sel = mesh[seia[i]]; + for (int j = 0; j < 3; j++) + pangle[sel[j]] = 0.0; + }); } - // for (PointIndex pi = PointIndex::BASE; - // pi < mesh.GetNP()+PointIndex::BASE; pi++) - - // pdef = 0; - for (int i = 0; i < seia.Size(); i++) - { - const Element2d & sel = mesh[seia[i]]; - for (int j = 0; j < 3; j++) - { - PointIndex pi = sel[j]; - if (mesh[pi].Type() == INNERPOINT || mesh[pi].Type() == SURFACEPOINT) - pdef[pi] = -6; - else - for (int j = 0; j < 8; j++) - if (pangle[pi] >= minangle[j]) - pdef[pi] = -1-j; - } - } - - /* - for (int i = 0; i < seia.Size(); i++) - { - const Element2d & sel = mesh[seia[i]]; - for (int j = 0; j < 3; j++) - pdef[sel[j]]++; - } - */ - for (SurfaceElementIndex sei : seia) - for (PointIndex pi : mesh[sei].PNums<3>()) - pdef[pi]++; - - // for (int i = 0; i < seia.Size(); i++) - for (SurfaceElementIndex sei : seia) - for (int j = 0; j < 3; j++) + ParallelFor( Range(seia), [&] (auto i) NETGEN_LAMBDA_INLINE { - neighbors[sei].SetNr (j, -1); - neighbors[sei].SetOrientation (j, 0); - } + const Element2d & sel = mesh[seia[i]]; + for (int j = 0; j < 3; j++) + { + POINTTYPE typ = mesh[sel[j]].Type(); + if (typ == FIXEDPOINT || typ == EDGEPOINT) + { + AtomicAdd(pangle[sel[j]], + Angle (mesh[sel[(j+1)%3]] - mesh[sel[j]], + mesh[sel[(j+2)%3]] - mesh[sel[j]])); + } + } + }); - /* - NgArray normals(mesh.GetNP()); - for (i = 1; i <= mesh.GetNSE(); i++) - { - Element2d & hel = mesh.SurfaceElement(i); - if (hel.GetIndex() == faceindex) - for (k = 1; k <= 3; k++) - { - int pi = hel.PNum(k); - SelectSurfaceOfPoint (mesh.Point(pi), hel.GeomInfoPi(k)); - int surfi = mesh.GetFaceDescriptor(faceindex).SurfNr(); - GetNormalVector (surfi, mesh.Point(pi), normals.Elem(pi)); - normals.Elem(pi) /= normals.Elem(pi).Length(); - } - } - */ + ParallelFor( Range(seia), [&] (auto i) NETGEN_LAMBDA_INLINE + { + const Element2d & sel = mesh[seia[i]]; + for (int j = 0; j < 3; j++) + { + PointIndex pi = sel[j]; + if (mesh[pi].Type() == INNERPOINT || mesh[pi].Type() == SURFACEPOINT) + pdef[pi] = -6; + else + for (int j = 0; j < 8; j++) + if (pangle[pi] >= minangle[j]) + pdef[pi] = -1-j; + } + }); - /* - for (int i = 0; i < seia.Size(); i++) - { - const Element2d & sel = mesh[seia[i]]; - */ + ParallelFor( Range(seia), [this, &pdef, &neighbors, &seia, &elements_on_node] (auto i) NETGEN_LAMBDA_INLINE + { + auto sei = seia[i]; + for (PointIndex pi : mesh[sei].template PNums<3>()) + AsAtomic(pdef[pi])++; + for (int j = 0; j < 3; j++) + { + neighbors[sei].SetNr (j, -1); + neighbors[sei].SetOrientation (j, 0); + } - for (SurfaceElementIndex sei : seia) - { - const Element2d & sel = mesh[sei]; - - for (int j = 0; j < 3; j++) - { - PointIndex pi1 = sel.PNumMod(j+2); - PointIndex pi2 = sel.PNumMod(j+3); - - // double loch = mesh.GetH(mesh[pi1]); - - // INDEX_2 edge(pi1, pi2); - // edge.Sort(); - - if (mesh.IsSegment (pi1, pi2)) - continue; - - /* - if (segments.Used (edge)) - continue; - */ - INDEX_2 ii2 (pi1, pi2); - if (other.Used (ii2)) - { - // INDEX_2 i2s(ii2); - // i2s.Sort(); + const auto sel = mesh[sei]; + for (int j = 0; j < 3; j++) + { + PointIndex pi1 = sel.PNumMod(j+2); + PointIndex pi2 = sel.PNumMod(j+3); + + for (auto sei_other : elements_on_node[pi1]) + { + if(sei_other==sei) continue; + const auto & other = mesh[sei_other]; + int pi1_other = -1; + int pi2_other = -1; + bool common_edge = false; + for (int k = 0; k < 3; k++) + { + if(other[k] == pi1) + pi1_other = k; + if(other[k] == pi2) + { + pi2_other = k; + common_edge = true; + } + } + + if(common_edge) + { + neighbors[sei].SetNr (j, sei_other); + neighbors[sei].SetOrientation (j, 3-pi1_other-pi2_other); + } + } + } + }); - /* - int i2 = other.Get(ii2).tnr; - int j2 = other.Get(ii2).sidenr; - */ - auto othertrig = other.Get(ii2); - SurfaceElementIndex i2 = othertrig.tnr; - int j2 = othertrig.sidenr; - - neighbors[sei].SetNr (j, i2); - neighbors[sei].SetOrientation (j, j2); - neighbors[i2].SetNr (j2, sei); - neighbors[i2].SetOrientation (j2, j); - } - else - { - other.Set (INDEX_2 (pi2, pi1), trionedge (sei, j)); - } - } - } for (SurfaceElementIndex sei : seia) swapped[sei] = false; - NgProfiler::StopTimer (timerstart); + timerstart.Stop(); + Array> improvement_candidates(3*seia.Size()); + atomic cnt(0); + int t = 4; bool done = false; while (!done && t >= 2) { - for (int i = 0; i < seia.Size(); i++) - { - SurfaceElementIndex t1 = seia[i]; + cnt = 0; + ParallelFor( Range(seia), [&] (auto i) NETGEN_LAMBDA_INLINE + { + SurfaceElementIndex t1 = seia[i]; - if (mesh[t1].IsDeleted()) - continue; + if (mesh[t1].IsDeleted()) + return; - if (mesh[t1].GetIndex() != faceindex) - continue; + if (mesh[t1].GetIndex() != faceindex) + return; - if (multithread.terminate) - throw NgException ("Meshing stopped"); + if (multithread.terminate) + throw NgException ("Meshing stopped"); - for (int o1 = 0; o1 < 3; o1++) - { - bool should; + for (int o1 = 0; o1 < 3; o1++) + if(EdgeSwapping(usemetric, neighbors, swapped, t1, o1, t, pdef, true)) + improvement_candidates[cnt++]= std::make_pair(t1,o1); + }); - SurfaceElementIndex t2 = neighbors[t1].GetNr (o1); - int o2 = neighbors[t1].GetOrientation (o1); + auto elements_with_improvement = improvement_candidates.Range(cnt.load()); + QuickSort(elements_with_improvement); - if (t2 == -1) continue; - if (swapped[t1] || swapped[t2]) continue; - - - PointIndex pi1 = mesh[t1].PNumMod(o1+1+1); - PointIndex pi2 = mesh[t1].PNumMod(o1+1+2); - PointIndex pi3 = mesh[t1].PNumMod(o1+1); - PointIndex pi4 = mesh[t2].PNumMod(o2+1); - - PointGeomInfo gi1 = mesh[t1].GeomInfoPiMod(o1+1+1); - PointGeomInfo gi2 = mesh[t1].GeomInfoPiMod(o1+1+2); - PointGeomInfo gi3 = mesh[t1].GeomInfoPiMod(o1+1); - PointGeomInfo gi4 = mesh[t2].GeomInfoPiMod(o2+1); - - bool allowswap = true; - - Vec<3> auxvec1 = mesh[pi3]-mesh[pi4]; - Vec<3> auxvec2 = mesh[pi1]-mesh[pi4]; - - allowswap = allowswap && fabs(1.-(auxvec1*auxvec2)/(auxvec1.Length()*auxvec2.Length())) > 1e-4; - - if(!allowswap) - continue; - - // normal of new - Vec<3> nv1 = Cross (auxvec1, auxvec2); - - auxvec1 = mesh.Point(pi4)-mesh.Point(pi3); - auxvec2 = mesh.Point(pi2)-mesh.Point(pi3); - allowswap = allowswap && fabs(1.-(auxvec1*auxvec2)/(auxvec1.Length()*auxvec2.Length())) > 1e-4; - - - if(!allowswap) - continue; - - Vec<3> nv2 = Cross (auxvec1, auxvec2); - - - // normals of original - Vec<3> nv3 = Cross (mesh[pi1]-mesh[pi4], mesh[pi2]-mesh[pi4]); - Vec<3> nv4 = Cross (mesh[pi2]-mesh[pi3], mesh[pi1]-mesh[pi3]); - - nv3 *= -1; - nv4 *= -1; - nv3.Normalize(); - nv4.Normalize(); - - nv1.Normalize(); - nv2.Normalize(); - - // SelectSurfaceOfPoint (mesh.Point(pi3), gi3); - auto nvp3 = geo.GetNormal(surfnr, mesh.Point(pi3), gi3); - - nvp3.Normalize(); - - // SelectSurfaceOfPoint (mesh.Point(pi4), gi4); - auto nvp4 = geo.GetNormal(surfnr, mesh.Point(pi4), gi4); - - nvp4.Normalize(); - - - - double critval = cos (M_PI / 6); // 30 degree - allowswap = allowswap && - (nv1 * nvp3 > critval) && - (nv1 * nvp4 > critval) && - (nv2 * nvp3 > critval) && - (nv2 * nvp4 > critval) && - (nvp3 * nv3 > critval) && - (nvp4 * nv4 > critval); - - - double horder = Dist (mesh[pi1], mesh[pi2]); - - if ( // nv1 * nv2 >= 0 && - nv1.Length() > 1e-3 * horder * horder && - nv2.Length() > 1e-3 * horder * horder && - allowswap ) - { - if (!usemetric) - { - int e = pdef[pi1] + pdef[pi2] - pdef[pi3] - pdef[pi4]; - double d = - Dist2 (mesh[pi1], mesh[pi2]) - - Dist2 (mesh[pi3], mesh[pi4]); - - should = e >= t && (e > 2 || d > 0); - } - else - { - double loch = mesh.GetH(mesh[pi1]); - should = - CalcTriangleBadness (mesh[pi4], mesh[pi3], mesh[pi1], metricweight, loch) + - CalcTriangleBadness (mesh[pi3], mesh[pi4], mesh[pi2], metricweight, loch) < - CalcTriangleBadness (mesh[pi1], mesh[pi2], mesh[pi3], metricweight, loch) + - CalcTriangleBadness (mesh[pi2], mesh[pi1], mesh[pi4], metricweight, loch); - } - - if (allowswap) - { - Element2d sw1 (pi4, pi3, pi1); - Element2d sw2 (pi3, pi4, pi2); - - int legal1 = - mesh.LegalTrig (mesh[t1]) + - mesh.LegalTrig (mesh[t2]); - int legal2 = - mesh.LegalTrig (sw1) + mesh.LegalTrig (sw2); - - if (legal1 < legal2) should = true; - if (legal2 < legal1) should = false; - } - - if (should) - { - // do swapping ! - - done = true; - - /* - mesh[t1] = { pi1, pi4, pi3 }; - mesh[t2] = { pi2, pi3, pi4 }; - - mesh[t1].GeomInfoPi(1) = gi1; - mesh[t1].GeomInfoPi(2) = gi4; - mesh[t1].GeomInfoPi(3) = gi3; - - mesh[t2].GeomInfoPi(1) = gi2; - mesh[t2].GeomInfoPi(2) = gi3; - mesh[t2].GeomInfoPi(3) = gi4; - */ - mesh[t1] = { { pi1, gi1 }, { pi4, gi4 }, { pi3, gi3 } }; - mesh[t2] = { { pi2, gi2 }, { pi3, gi3 }, { pi4, gi4 } }; - - pdef[pi1]--; - pdef[pi2]--; - pdef[pi3]++; - pdef[pi4]++; - - swapped[t1] = true; - swapped[t2] = true; - } - } - } - } + for (auto [t1,o1] : elements_with_improvement) + done |= EdgeSwapping(usemetric, neighbors, swapped, t1, o1, t, pdef, false); t--; } @@ -421,372 +353,328 @@ namespace netgen - - - - - void MeshOptimize2d :: CombineImprove() + double CombineImproveEdge( Mesh & mesh, + const Table & elementsonnode, + Array, PointIndex> & normals, + Array & fixed, + PointIndex pi1, PointIndex pi2, + bool check_only = true) { - if (!faceindex) + Vec<3> nv; + ArrayMem hasonepi, hasbothpi; + + if (!pi1.IsValid() || !pi2.IsValid()) + return 0.0; + + bool debugflag = 0; + + if (debugflag) { - SplitImprove(); - PrintMessage (3, "Combine improve"); - - for (faceindex = 1; faceindex <= mesh.GetNFD(); faceindex++) - { - CombineImprove(); - - if (multithread.terminate) - throw NgException ("Meshing stopped"); - } - faceindex = 0; - return; + (*testout) << "Combineimprove " + << "pi1 = " << pi1 << " pi2 = " << pi2 << endl; } + /* + // save version: + if (fixed.Get(pi1) || fixed.Get(pi2)) + return 0.0; + if (pi2 < pi1) swap (pi1, pi2); + */ - static int timer = NgProfiler::CreateTimer ("Combineimprove 2D"); - NgProfiler::RegionTimer reg (timer); + // more general + if (fixed[pi2]) + Swap (pi1, pi2); - static int timerstart = NgProfiler::CreateTimer ("Combineimprove 2D start"); - NgProfiler::StartTimer (timerstart); + if (fixed[pi2]) + return 0.0; + + double loch = mesh.GetH (mesh[pi1]); + + for (SurfaceElementIndex sei2 : elementsonnode[pi1]) + { + const Element2d & el2 = mesh[sei2]; + + if (el2.IsDeleted()) continue; + + if (el2[0] == pi2 || el2[1] == pi2 || el2[2] == pi2) + { + hasbothpi.Append (sei2); + nv = Cross (Vec3d (mesh[el2[0]], mesh[el2[1]]), + Vec3d (mesh[el2[0]], mesh[el2[2]])); + } + else + { + hasonepi.Append (sei2); + } + } + + if(hasbothpi.Size()==0) + return 0.0; - static int timerstart1 = NgProfiler::CreateTimer ("Combineimprove 2D start1"); - NgProfiler::StartTimer (timerstart1); + nv = normals[pi1]; + + + for (SurfaceElementIndex sei2 : elementsonnode[pi2]) + { + const Element2d & el2 = mesh[sei2]; + if (el2.IsDeleted()) continue; + if (!el2.PNums<3>().Contains (pi1)) + hasonepi.Append (sei2); + } + + double bad1 = 0; + int illegal1 = 0, illegal2 = 0; + /* + for (SurfaceElementIndex sei : hasonepi) + { + const Element2d & el = mesh[sei]; + bad1 += CalcTriangleBadness (mesh[el[0]], mesh[el[1]], mesh[el[2]], + nv, -1, loch); + illegal1 += 1-mesh.LegalTrig(el); + } + */ + for (const Element2d & el : mesh.SurfaceElements()[hasonepi]) + { + bad1 += CalcTriangleBadness (mesh[el[0]], mesh[el[1]], mesh[el[2]], + nv, -1, loch); + illegal1 += 1-mesh.LegalTrig(el); + } + + for (int k = 0; k < hasbothpi.Size(); k++) + { + const Element2d & el = mesh[hasbothpi[k]]; + bad1 += CalcTriangleBadness (mesh[el[0]], mesh[el[1]], mesh[el[2]], + nv, -1, loch); + illegal1 += 1-mesh.LegalTrig(el); + } + bad1 /= (hasonepi.Size()+hasbothpi.Size()); + + double bad2 = 0; + for (int k = 0; k < hasonepi.Size(); k++) + { + Element2d el = mesh[hasonepi[k]]; + for (auto i : Range(3)) + if(el[i]==pi2) + el[i] = pi1; + + double err = + CalcTriangleBadness (mesh[el[0]], mesh[el[1]], mesh[el[2]], + nv, -1, loch); + bad2 += err; + + Vec<3> hnv = Cross (Vec3d (mesh[el[0]], + mesh[el[1]]), + Vec3d (mesh[el[0]], + mesh[el[2]])); + if (hnv * nv < 0) + bad2 += 1e10; + + for (int l = 0; l < 3; l++) + { + if ( (normals[el[l]] * nv) < 0.5) + bad2 += 1e10; + } + + illegal2 += 1-mesh.LegalTrig(el); + } + bad2 /= hasonepi.Size(); + + if (debugflag) + { + (*testout) << "bad1 = " << bad1 << ", bad2 = " << bad2 << endl; + } + + bool should = (illegal2<=illegal1 && bad2 < bad1 && bad2 < 1e4); + if(illegal2 < illegal1) + { + should = true; + bad1 += 1e4; + } + + double d_badness = should * (bad2-bad1); + + if(check_only) + return d_badness; + + if (should) + { + /* + (*testout) << "combine !" << endl; + (*testout) << "bad1 = " << bad1 << ", bad2 = " << bad2 << endl; + (*testout) << "illegal1 = " << illegal1 << ", illegal2 = " << illegal2 << endl; + (*testout) << "loch = " << loch << endl; + */ + + PointGeomInfo gi; + // bool gi_set(false); + + /* + Element2d *el1p(NULL); + int l = 0; + while(mesh[elementsonnode[pi1][l]].IsDeleted() && lGetNP(); l++) + if ((*el1p)[l] == pi1) + { + gi = el1p->GeomInfoPi (l+1); + // gi_set = true; + } + */ + for (SurfaceElementIndex sei : elementsonnode[pi1]) + { + const Element2d & el1p = mesh[sei]; + if (el1p.IsDeleted()) continue; + + for (int l = 0; l < el1p.GetNP(); l++) + if (el1p[l] == pi1) + // gi = el1p.GeomInfoPi (l+1); + gi = el1p.GeomInfo()[l]; + break; + } + + + // (*testout) << "Connect point " << pi2 << " to " << pi1 << "\n"; + // for (int k = 0; k < elementsonnode[pi2].Size(); k++) + for (SurfaceElementIndex sei2 : elementsonnode[pi2]) + { + Element2d & el = mesh[sei2]; + if (el.IsDeleted()) continue; + if (el.PNums().Contains(pi1)) continue; + + for (auto l : Range(el.GetNP())) + { + if (el[l] == pi2) + { + el[l] = pi1; + el.GeomInfo()[l] = gi; + } + + fixed[el[l]] = true; + } + } + + for (auto sei : hasbothpi) + mesh[sei].Delete(); + + } + return d_badness; + } + + void MeshOptimize2d :: CombineImprove () + { + SplitImprove(); + PrintMessage (3, "Combine improve"); + + if (multithread.terminate) + throw NgException ("Meshing stopped"); + + static Timer timer ("Combineimprove 2D"); + RegionTimer reg (timer); + + static Timer timerstart ("Combineimprove 2D start"); + timerstart.Start(); + + + static Timer timerstart1 ("Combineimprove 2D start1"); + timerstart1.Start(); Array seia; - mesh.GetSurfaceElementsOfFace (faceindex, seia); + if(faceindex) + mesh.GetSurfaceElementsOfFace (faceindex, seia); + else + { + seia.SetSize(mesh.GetNSE()); + ParallelFor( IntRange(mesh.GetNSE()), [&seia] (auto i) NETGEN_LAMBDA_INLINE + { seia[i] = i; }); + } - for (SurfaceElementIndex sei : seia) - if (mesh[sei].GetNP() != 3) - return; + bool mixed = false; + ParallelFor( Range(seia), [&] (auto i) NETGEN_LAMBDA_INLINE + { + if (mesh[seia[i]].GetNP() != 3) + mixed = true; + }); - - int surfnr = 0; - if (faceindex) - surfnr = mesh.GetFaceDescriptor (faceindex).SurfNr(); - - - Vec<3> nv; + if(mixed) + return; int np = mesh.GetNP(); - TABLE elementsonnode(np); - Array hasonepi, hasbothpi; + auto elementsonnode = mesh.CreatePoint2SurfaceElementTable(faceindex); - for (SurfaceElementIndex sei : seia) - for (PointIndex pi : mesh[sei].PNums<3>()) - elementsonnode.Add (pi, sei); + int ntasks = ngcore::TaskManager::GetMaxThreads(); + Array> edges; + + BuildEdgeList( mesh, elementsonnode, edges ); Array fixed(np); - fixed = false; + ParallelFor( fixed.Range(), [&fixed] (auto i) NETGEN_LAMBDA_INLINE + { fixed[i] = false; }); - NgProfiler::StopTimer (timerstart1); + ParallelFor( edges.Range(), [&] (auto i) NETGEN_LAMBDA_INLINE + { + auto [pi0, pi1] = edges[i]; + if (mesh.IsSegment (pi0, pi1)) + { + fixed[pi0] = true; + fixed[pi1] = true; + } + }); - /* - for (SegmentIndex si = 0; si < mesh.GetNSeg(); si++) - { - INDEX_2 i2(mesh[si][0], mesh[si][1]); - fixed[i2.I1()] = true; - fixed[i2.I2()] = true; - } - */ + timerstart1.Stop(); - for (SurfaceElementIndex sei : seia) - { - Element2d & sel = mesh[sei]; - for (int j = 0; j < sel.GetNP(); j++) - { - PointIndex pi1 = sel.PNumMod(j+2); - PointIndex pi2 = sel.PNumMod(j+3); - if (mesh.IsSegment (pi1, pi2)) - { - fixed[pi1] = true; - fixed[pi2] = true; - } - } - } - - - /* - for(int i = 0; i < mesh.LockedPoints().Size(); i++) - fixed[mesh.LockedPoints()[i]] = true; - */ - for (PointIndex pi : mesh.LockedPoints()) - fixed[pi] = true; + ParallelFor( mesh.LockedPoints().Range(), [&] (auto i) NETGEN_LAMBDA_INLINE + { + fixed[mesh.LockedPoints()[i]] = true; + }); Array,PointIndex> normals(np); - // for (PointIndex pi = mesh.Points().Begin(); pi < mesh.Points().End(); pi++) - for (PointIndex pi : mesh.Points().Range()) - { - if (elementsonnode[pi].Size()) - { - Element2d & hel = mesh[elementsonnode[pi][0]]; - for (int k = 0; k < 3; k++) - if (hel[k] == pi) - { - // SelectSurfaceOfPoint (mesh[pi], hel.GeomInfoPi(k+1)); - normals[pi] = geo.GetNormal(surfnr, mesh[pi], hel.GeomInfoPi(k+1)); - break; - } - } - } - - NgProfiler::StopTimer (timerstart); - - for (int i = 0; i < seia.Size(); i++) - { - SurfaceElementIndex sei = seia[i]; - Element2d & elem = mesh[sei]; - - for (int j = 0; j < 3; j++) - { - if (elem.IsDeleted()) continue; - PointIndex pi1 = elem[j]; - PointIndex pi2 = elem[(j+1) % 3]; - - /* - if (pi1 < PointIndex::BASE || - pi2 < PointIndex::BASE) - continue; - */ - if (!pi1.IsValid() || !pi2.IsValid()) - continue; - /* - INDEX_2 i2(pi1, pi2); - i2.Sort(); - if (segmentht.Used(i2)) - continue; - */ - - bool debugflag = 0; - - if (debugflag) - { - (*testout) << "Combineimprove, face = " << faceindex - << "pi1 = " << pi1 << " pi2 = " << pi2 << endl; - } - - /* - // save version: - if (fixed.Get(pi1) || fixed.Get(pi2)) - continue; - if (pi2 < pi1) swap (pi1, pi2); - */ - - // more general - if (fixed[pi2]) - Swap (pi1, pi2); - - if (fixed[pi2]) - continue; - - double loch = mesh.GetH (mesh[pi1]); - - // INDEX_2 si2 (pi1, pi2); - // si2.Sort(); - - /* - if (edgetested.Used (si2)) - continue; - edgetested.Set (si2, 1); - */ - - hasonepi.SetSize(0); - hasbothpi.SetSize(0); - - // for (int k = 0; k < elementsonnode[pi1].Size(); k++) - for (SurfaceElementIndex sei2 : elementsonnode[pi1]) - { - const Element2d & el2 = mesh[sei2]; - - if (el2.IsDeleted()) continue; - - if (el2[0] == pi2 || el2[1] == pi2 || el2[2] == pi2) - { - hasbothpi.Append (sei2); - nv = Cross (Vec3d (mesh[el2[0]], mesh[el2[1]]), - Vec3d (mesh[el2[0]], mesh[el2[2]])); - } - else - { - hasonepi.Append (sei2); - } - } - - - Element2d & hel = mesh[hasbothpi[0]]; - for (int k = 0; k < 3; k++) - if (hel[k] == pi1) - { - // SelectSurfaceOfPoint (mesh[pi1], - // hel.GeomInfoPi(k+1)); - nv = geo.GetNormal(surfnr, mesh[pi1], hel.GeomInfoPi(k+1)); - break; - } - - // nv = normals.Get(pi1); - - - for (SurfaceElementIndex sei2 : elementsonnode[pi2]) - { - const Element2d & el2 = mesh[sei2]; - if (el2.IsDeleted()) continue; - if (!el2.PNums<3>().Contains (pi1)) - hasonepi.Append (sei2); - } - - double bad1 = 0; - int illegal1 = 0, illegal2 = 0; - /* - for (SurfaceElementIndex sei : hasonepi) + ParallelFor( mesh.Points().Range(), [&] (auto pi) NETGEN_LAMBDA_INLINE + { + if (elementsonnode[pi].Size()) { - const Element2d & el = mesh[sei]; - bad1 += CalcTriangleBadness (mesh[el[0]], mesh[el[1]], mesh[el[2]], - nv, -1, loch); - illegal1 += 1-mesh.LegalTrig(el); - } - */ - for (const Element2d & el : mesh.SurfaceElements()[hasonepi]) - { - bad1 += CalcTriangleBadness (mesh[el[0]], mesh[el[1]], mesh[el[2]], - nv, -1, loch); - illegal1 += 1-mesh.LegalTrig(el); - } + Element2d & hel = mesh[elementsonnode[pi][0]]; + for (int k = 0; k < 3; k++) + if (hel[k] == pi) + { + const int faceindex = hel.GetIndex(); + const int surfnr = mesh.GetFaceDescriptor (faceindex).SurfNr(); + normals[pi] = geo.GetNormal (surfnr, mesh[pi], hel.GeomInfoPi(k+1)); + break; + } + } + }, TasksPerThread(4)); - for (int k = 0; k < hasbothpi.Size(); k++) - { - const Element2d & el = mesh[hasbothpi[k]]; - bad1 += CalcTriangleBadness (mesh[el[0]], mesh[el[1]], mesh[el[2]], - nv, -1, loch); - illegal1 += 1-mesh.LegalTrig(el); - } - bad1 /= (hasonepi.Size()+hasbothpi.Size()); + timerstart.Stop(); - MeshPoint p1 = mesh[pi1]; - MeshPoint p2 = mesh[pi2]; + // Find edges with improvement + Array> candidate_edges(edges.Size()); + std::atomic improvement_counter(0); - MeshPoint pnew = p1; - mesh[pi1] = pnew; - mesh[pi2] = pnew; + ParallelFor( Range(edges), [&] (auto i) NETGEN_LAMBDA_INLINE + { + auto [pi1, pi2] = edges[i]; + double d_badness = CombineImproveEdge(mesh, elementsonnode, normals, fixed, pi1, pi2, true); + if(d_badness < 0.0) + candidate_edges[improvement_counter++] = make_tuple(d_badness, i); + }, TasksPerThread(4)); - double bad2 = 0; - for (int k = 0; k < hasonepi.Size(); k++) - { - Element2d & el = mesh[hasonepi[k]]; - double err = - CalcTriangleBadness (mesh[el[0]], mesh[el[1]], mesh[el[2]], - nv, -1, loch); - bad2 += err; + auto edges_with_improvement = candidate_edges.Part(0, improvement_counter.load()); + QuickSort(edges_with_improvement); - Vec<3> hnv = Cross (Vec3d (mesh[el[0]], - mesh[el[1]]), - Vec3d (mesh[el[0]], - mesh[el[2]])); - if (hnv * nv < 0) - bad2 += 1e10; - - for (int l = 0; l < 3; l++) - if ( (normals[el[l]] * nv) < 0.5) - bad2 += 1e10; - - Element2d el1 = el; - for (auto i : Range(3)) - if(el1[i]==pi2) - el1[i] = pi1; - illegal2 += 1-mesh.LegalTrig(el1); - } - bad2 /= hasonepi.Size(); - - mesh[pi1] = p1; - mesh[pi2] = p2; - - if (debugflag) - { - (*testout) << "bad1 = " << bad1 << ", bad2 = " << bad2 << endl; - } - - bool should = (bad2 < bad1 && bad2 < 1e4); - if (bad2 < 1e4) - { - if (illegal1 > illegal2) should = true; - if (illegal2 > illegal1) should = false; - } - - - if (should) - { - /* - (*testout) << "combine !" << endl; - (*testout) << "bad1 = " << bad1 << ", bad2 = " << bad2 << endl; - (*testout) << "illegal1 = " << illegal1 << ", illegal2 = " << illegal2 << endl; - (*testout) << "loch = " << loch << endl; - */ - - mesh[pi1] = pnew; - PointGeomInfo gi; - // bool gi_set(false); - - /* - Element2d *el1p(NULL); - int l = 0; - while(mesh[elementsonnode[pi1][l]].IsDeleted() && lGetNP(); l++) - if ((*el1p)[l] == pi1) - { - gi = el1p->GeomInfoPi (l+1); - // gi_set = true; - } - */ - for (SurfaceElementIndex sei : elementsonnode[pi1]) - { - const Element2d & el1p = mesh[sei]; - if (el1p.IsDeleted()) continue; - - for (int l = 0; l < el1p.GetNP(); l++) - if (el1p[l] == pi1) - // gi = el1p.GeomInfoPi (l+1); - gi = el1p.GeomInfo()[l]; - break; - } - - - - // (*testout) << "Connect point " << pi2 << " to " << pi1 << "\n"; - // for (int k = 0; k < elementsonnode[pi2].Size(); k++) - for (SurfaceElementIndex sei2 : elementsonnode[pi2]) - { - Element2d & el = mesh[sei2]; - if (el.IsDeleted()) continue; - if (el.PNums().Contains(pi1)) continue; - - elementsonnode.Add (pi1, sei2); - - for (auto l : Range(el.GetNP())) - { - if (el[l] == pi2) - { - el[l] = pi1; - el.GeomInfo()[l] = gi; - } - - fixed[el[l]] = true; - } - } - - for (auto sei : hasbothpi) - mesh[sei].Delete(); - } - } + for(auto [d_badness, ei] : edges_with_improvement) + { + auto [pi1, pi2] = edges[ei]; + CombineImproveEdge(mesh, elementsonnode, normals, fixed, pi1, pi2, false); } // mesh.Compress(); diff --git a/libsrc/meshing/improve2.hpp b/libsrc/meshing/improve2.hpp index b93d4091..08172818 100644 --- a/libsrc/meshing/improve2.hpp +++ b/libsrc/meshing/improve2.hpp @@ -1,7 +1,76 @@ #ifndef FILE_IMPROVE2 #define FILE_IMPROVE2 +template +void BuildEdgeList( const Mesh & mesh, const Table & elementsonnode, Array> & edges ) +{ + static Timer tbuild_edges("Build edges"); RegionTimer reg(tbuild_edges); + static constexpr int tetedges[6][2] = + { { 0, 1 }, { 0, 2 }, { 0, 3 }, + { 1, 2 }, { 1, 3 }, { 2, 3 } }; + + int ntasks = 2*ngcore::TaskManager::GetMaxThreads(); + Array>> task_edges(ntasks); + + ParallelFor(IntRange(ntasks), [&] (int ti) + { + auto myrange = mesh.Points().Range().Split(ti, ntasks); + ArrayMem, 100> local_edges; + for (auto pi : myrange) + { + local_edges.SetSize(0); + + for(auto ei : elementsonnode[pi]) + { + const auto & elem = mesh[ei]; + if (elem.IsDeleted()) continue; + + for (int j = 0; j < 6; j++) + { + PointIndex pi0 = elem[tetedges[j][0]]; + PointIndex pi1 = elem[tetedges[j][1]]; + if (pi1 < pi0) Swap(pi0, pi1); + if(pi0==pi) + local_edges.Append(std::make_tuple(pi0, pi1)); + } + } + QuickSort(local_edges); + + auto edge_prev = std::make_tuple(-1,-1); + + for(auto edge : local_edges) + if(edge != edge_prev) + { + task_edges[ti].Append(edge); + edge_prev = edge; + } + } + }, ntasks); + + int num_edges = 0; + for (auto & edg : task_edges) + num_edges += edg.Size(); + edges.SetAllocSize(num_edges); + for (auto & edg : task_edges) + edges.Append(edg); +} + + +class Neighbour +{ + int nr[3]; + int orient[3]; + +public: + Neighbour () { ; } + + void SetNr (int side, int anr) { nr[side] = anr; } + int GetNr (int side) { return nr[side]; } + + void SetOrientation (int side, int aorient) { orient[side] = aorient; } + int GetOrientation (int side) { return orient[side]; } +}; /// class MeshOptimize2d @@ -24,6 +93,8 @@ public: void ProjectBoundaryPoints(NgArray & surfaceindex, const NgArray* > & from, NgArray* > & dest); + bool EdgeSwapping (const int usemetric, Array &neighbors, Array &swapped, + const SurfaceElementIndex t1, const int edge, const int t, Array &pdef, const bool check_only=false); void EdgeSwapping (int usemetric); void CombineImprove (); void SplitImprove (); diff --git a/libsrc/meshing/improve2gen.cpp b/libsrc/meshing/improve2gen.cpp index 4df98e75..1d4ebbc9 100644 --- a/libsrc/meshing/improve2gen.cpp +++ b/libsrc/meshing/improve2gen.cpp @@ -21,6 +21,7 @@ namespace netgen void MeshOptimize2d :: GenericImprove () { + static Timer timer("MeshOptimize2d::GenericImprove"); RegionTimer reg(timer); if (!faceindex) { if (writestatus) diff --git a/libsrc/meshing/improve3.cpp b/libsrc/meshing/improve3.cpp index e5ee4e03..8400e541 100644 --- a/libsrc/meshing/improve3.cpp +++ b/libsrc/meshing/improve3.cpp @@ -409,60 +409,6 @@ void MeshOptimize3d :: CombineImproveSequential (Mesh & mesh, multithread.task = savetask; } -void MeshOptimize3d :: BuildEdgeList( const Mesh & mesh, const Table & elementsonnode, Array> & edges ) -{ - static Timer tbuild_edges("Build edges"); RegionTimer reg(tbuild_edges); - - static constexpr int tetedges[6][2] = - { { 0, 1 }, { 0, 2 }, { 0, 3 }, - { 1, 2 }, { 1, 3 }, { 2, 3 } }; - - int ntasks = 2*ngcore::TaskManager::GetMaxThreads(); - Array>> task_edges(ntasks); - - ParallelFor(IntRange(ntasks), [&] (int ti) - { - auto myrange = mesh.Points().Range().Split(ti, ntasks); - ArrayMem, 100> local_edges; - for (auto pi : myrange) - { - local_edges.SetSize(0); - - for(auto ei : elementsonnode[pi]) - { - const Element & elem = mesh[ei]; - if (elem.IsDeleted()) continue; - - for (int j = 0; j < 6; j++) - { - PointIndex pi0 = elem[tetedges[j][0]]; - PointIndex pi1 = elem[tetedges[j][1]]; - if (pi1 < pi0) Swap(pi0, pi1); - if(pi0==pi) - local_edges.Append(std::make_tuple(pi0, pi1)); - } - } - QuickSort(local_edges); - - auto edge_prev = std::make_tuple(-1,-1); - - for(auto edge : local_edges) - if(edge != edge_prev) - { - task_edges[ti].Append(edge); - edge_prev = edge; - } - } - }, ntasks); - - int num_edges = 0; - for (auto & edg : task_edges) - num_edges += edg.Size(); - edges.SetAllocSize(num_edges); - for (auto & edg : task_edges) - edges.Append(edg); -} - void MeshOptimize3d :: CombineImprove (Mesh & mesh, OPTIMIZEGOAL goal) { diff --git a/libsrc/meshing/improve3.hpp b/libsrc/meshing/improve3.hpp index 7507b64a..21fdcce6 100644 --- a/libsrc/meshing/improve3.hpp +++ b/libsrc/meshing/improve3.hpp @@ -12,8 +12,6 @@ class MeshOptimize3d { const MeshingParameters & mp; - void BuildEdgeList( const Mesh & mesh, const Table & elementsonnode, Array> & edges ); - public: MeshOptimize3d (const MeshingParameters & amp) : mp(amp) { ; } diff --git a/libsrc/meshing/meshclass.cpp b/libsrc/meshing/meshclass.cpp index 25b60e88..e6067a5f 100644 --- a/libsrc/meshing/meshclass.cpp +++ b/libsrc/meshing/meshclass.cpp @@ -6205,22 +6205,41 @@ namespace netgen { for (PointIndex pi : myrange) QuickSort(elementsonnode[pi]); - }); + }, ngcore::TasksPerThread(4)); return move(elementsonnode); } - Table Mesh :: CreatePoint2SurfaceElementTable() const + Table Mesh :: CreatePoint2SurfaceElementTable( int faceindex ) const { + static Timer timer("Mesh::CreatePoint2SurfaceElementTable"); RegionTimer rt(timer); + TableCreator creator(GetNP()); - for ( ; !creator.Done(); creator++) - ngcore::ParallelForRange - (Range(surfelements), [&] (auto myrange) - { - for (SurfaceElementIndex ei : myrange) - for (PointIndex pi : (*this)[ei].PNums()) - creator.Add (pi, ei); - }); + + if(faceindex==0) + { + for ( ; !creator.Done(); creator++) + ngcore::ParallelForRange + (Range(surfelements), [&] (auto myrange) + { + for (SurfaceElementIndex ei : myrange) + for (PointIndex pi : (*this)[ei].PNums()) + creator.Add (pi, ei); + }, ngcore::TasksPerThread(4)); + } + else + { + Array face_els; + GetSurfaceElementsOfFace(faceindex, face_els); + for ( ; !creator.Done(); creator++) + ngcore::ParallelForRange + (Range(face_els), [&] (auto myrange) + { + for (auto i : myrange) + for (PointIndex pi : (*this)[face_els[i]].PNums()) + creator.Add (pi, face_els[i]); + }, ngcore::TasksPerThread(4)); + } auto elementsonnode = creator.MoveTable(); ngcore::ParallelForRange diff --git a/libsrc/meshing/meshclass.hpp b/libsrc/meshing/meshclass.hpp index db9c96c3..fab9a13f 100644 --- a/libsrc/meshing/meshclass.hpp +++ b/libsrc/meshing/meshclass.hpp @@ -762,7 +762,7 @@ namespace netgen Table CreatePoint2ElementTable() const; - Table CreatePoint2SurfaceElementTable() const; + Table CreatePoint2SurfaceElementTable( int faceindex=0 ) const; DLL_HEADER bool PureTrigMesh (int faceindex = 0) const; DLL_HEADER bool PureTetMesh () const; diff --git a/libsrc/meshing/msghandler.cpp b/libsrc/meshing/msghandler.cpp index 191384f5..d4da2c60 100644 --- a/libsrc/meshing/msghandler.cpp +++ b/libsrc/meshing/msghandler.cpp @@ -3,7 +3,7 @@ namespace netgen { -int printmessage_importance = 5; +int printmessage_importance = 3; int printwarnings = 1; int printerrors = 1; int printdots = 1; diff --git a/libsrc/meshing/smoothing2.cpp b/libsrc/meshing/smoothing2.cpp index a59bcba9..a3ebd88c 100644 --- a/libsrc/meshing/smoothing2.cpp +++ b/libsrc/meshing/smoothing2.cpp @@ -690,119 +690,95 @@ namespace netgen void MeshOptimize2d :: ImproveMesh (const MeshingParameters & mp) { - if (!faceindex) - { - PrintMessage (3, "Smoothing"); + static Timer timer("MeshSmoothing 2D"); RegionTimer reg (timer); - for (faceindex = 1; faceindex <= mesh.GetNFD(); faceindex++) - { - ImproveMesh (mp); - if (multithread.terminate) - throw NgException ("Meshing stopped"); - } - faceindex = 0; - return; - } - - static Timer timer("MeshSmoothing 2D"); - // static int timer1 = NgProfiler::CreateTimer ("MeshSmoothing 2D start"); - // static int timer2 = NgProfiler::CreateTimer ("MeshSmoothing 2D - BFGS"); - - RegionTimer reg (timer); - // NgProfiler::StartTimer (timer1); + PrintMessage (3, "Smoothing"); CheckMeshApproximation (mesh); - Opti2dLocalData ld; - - - Array seia; - mesh.GetSurfaceElementsOfFace (faceindex, seia); - bool mixed = 0; - for (auto sei : seia) - if (mesh[sei].GetNP() != 3) - { - mixed = true; - break; - } - - Vector x(2); - + int ncolors; + Array colors; + bool mixed = false; + auto elementsonpoint = mesh.CreatePoint2SurfaceElementTable( faceindex ); NgArray savepoints(mesh.GetNP()); - ld.uselocalh = mp.uselocalh; + Table color_table; + if(faceindex) + { + Array seia; + mesh.GetSurfaceElementsOfFace (faceindex, seia); + for (auto sei : seia) + if (mesh[sei].GetNP() != 3) + { + mixed = true; + break; + } - NgArray compress(mesh.GetNP()); - NgArray icompress; - for (int i = 0; i < seia.Size(); i++) - { - const Element2d & el = mesh[seia[i]]; - for (int j = 0; j < el.GetNP(); j++) - compress[el[j]] = -1; - } - for (int i = 0; i < seia.Size(); i++) - { - const Element2d & el = mesh[seia[i]]; - for (int j = 0; j < el.GetNP(); j++) - if (compress[el[j]] == -1) - { - compress[el[j]] = icompress.Size(); - icompress.Append(el[j]); - } - } - NgArray cnta(icompress.Size()); - cnta = 0; - for (int i = 0; i < seia.Size(); i++) - { - const Element2d & el = mesh[seia[i]]; - for (int j = 0; j < el.GetNP(); j++) - cnta[compress[el[j]]]++; - } - TABLE elementsonpoint(cnta); - for (int i = 0; i < seia.Size(); i++) - { - const Element2d & el = mesh[seia[i]]; - for (int j = 0; j < el.GetNP(); j++) - elementsonpoint.Add (compress[el[j]], seia[i]); - } + Array compress(mesh.GetNP()); + NgArray icompress; + for (int i = 0; i < seia.Size(); i++) + { + const Element2d & el = mesh[seia[i]]; + for (int j = 0; j < el.GetNP(); j++) + compress[el[j]] = -1; + } + for (int i = 0; i < seia.Size(); i++) + { + const Element2d & el = mesh[seia[i]]; + for (int j = 0; j < el.GetNP(); j++) + if (compress[el[j]] == -1) + { + compress[el[j]] = icompress.Size(); + icompress.Append(el[j]); + } + } + const auto & getDofs = [&] (int i) + { + return elementsonpoint[icompress[i]]; + }; + + colors.SetSize(icompress.Size()); + + ncolors = ngcore::ComputeColoring( colors, mesh.GetNSE(), getDofs ); + + TableCreator creator(ncolors); + for ( ; !creator.Done(); creator++) + ParallelForRange( Range(colors), [&](auto myrange) + { + for(auto i : myrange) + creator.Add(colors[i], icompress[i]); + }); + + color_table = creator.MoveTable(); + } + else + { + for (auto & se : mesh.SurfaceElements()) + if (se.GetNP() != 3) + { + mixed = true; + break; + } + const auto & getDofs = [&] (int i) + { + return elementsonpoint[i+PointIndex::BASE]; + }; + + colors.SetSize(mesh.GetNP()); + ncolors = ngcore::ComputeColoring( colors, mesh.GetNSE(), getDofs ); + + TableCreator creator(ncolors); + for ( ; !creator.Done(); creator++) + ParallelForRange( Range(colors), [&](auto myrange) + { + for(auto i : myrange) + creator.Add(colors[i], PointIndex(i+PointIndex::BASE)); + }); + + color_table = creator.MoveTable(); + } - /* - NgArray nelementsonpoint(mesh.GetNP()); - nelementsonpoint = 0; - for (int i = 0; i < seia.Size(); i++) - { - const Element2d & el = mesh[seia[i]]; - for (int j = 0; j < el.GetNP(); j++) - nelementsonpoint[el[j]]++; - } - - TABLE elementsonpoint(nelementsonpoint); - - for (int i = 0; i < seia.Size(); i++) - { - const Element2d & el = mesh[seia[i]]; - for (int j = 0; j < el.GetNP(); j++) - elementsonpoint.Add (el[j], seia[i]); - } - */ - - - - ld.loch = mp.maxh; - ld.locmetricweight = metricweight; - ld.meshthis = this; - - - - Opti2SurfaceMinFunction surfminf(mesh, ld); - Opti2EdgeMinFunction edgeminf(mesh, ld); - Opti2SurfaceMinFunctionJacobian surfminfj(mesh, ld); - - OptiParameters par; - par.maxit_linsearch = 8; - par.maxit_bfgs = 5; - /* int i, j, k; Vector xedge(1); @@ -872,27 +848,6 @@ namespace netgen */ - bool printeddot = 0; - char plotchar = '.'; - int modplot = 1; - if (mesh.GetNP() > 1000) - { - plotchar = '+'; - modplot = 100; - } - if (mesh.GetNP() > 10000) - { - plotchar = 'o'; - modplot = 1000; - } - if (mesh.GetNP() > 100000) - { - plotchar = 'O'; - modplot = 10000; - } - int cnt = 0; - - // NgProfiler::StopTimer (timer1); /* @@ -902,28 +857,39 @@ namespace netgen static Timer tloop("MeshSmooting 2D - loop"); tloop.Start(); - for (int hi = 0; hi < icompress.Size(); hi++) - { - PointIndex pi = icompress[hi]; + for (auto icolor : Range(color_table)) + { + if (multithread.terminate) + break; + ParallelForRange( Range(color_table[icolor].Size()), [&](auto myrange) + { + Opti2dLocalData ld; + ld.uselocalh = mp.uselocalh; + ld.loch = mp.maxh; + ld.locmetricweight = metricweight; + ld.meshthis = this; + + Opti2SurfaceMinFunction surfminf(mesh, ld); + Opti2SurfaceMinFunctionJacobian surfminfj(mesh, ld); + + MinFunction & minfunc = mixed ? static_cast(surfminfj) : surfminf; + + OptiParameters par; + par.maxit_linsearch = 8; + par.maxit_bfgs = 5; + for (auto i : myrange) + { + PointIndex pi = color_table[icolor][i]; if (mesh[pi].Type() == SURFACEPOINT) { if (multithread.terminate) - throw NgException ("Meshing stopped"); + return; - cnt++; - if (cnt % modplot == 0 && writestatus) - { - printeddot = 1; - PrintDot (plotchar); - } - - // if (elementsonpoint[pi].Size() == 0) continue; - if (elementsonpoint[hi].Size() == 0) continue; + if (elementsonpoint[pi].Size() == 0) continue; ld.sp1 = mesh[pi]; - // Element2d & hel = mesh[elementsonpoint[pi][0]]; - Element2d & hel = mesh[elementsonpoint[hi][0]]; + Element2d & hel = mesh[elementsonpoint[pi][0]]; int hpi = 0; for (int j = 1; j <= hel.GetNP(); j++) @@ -942,9 +908,9 @@ namespace netgen ld.loc_pnts2.SetSize (0); ld.loc_pnts3.SetSize (0); - for (int j = 0; j < elementsonpoint[hi].Size(); j++) + for (int j = 0; j < elementsonpoint[pi].Size(); j++) { - SurfaceElementIndex sei = elementsonpoint[hi][j]; + SurfaceElementIndex sei = elementsonpoint[pi][j]; const Element2d & bel = mesh[sei]; ld.surfi = mesh.GetFaceDescriptor(bel.GetIndex()).SurfNr(); @@ -971,38 +937,35 @@ namespace netgen ld.t1 = ld.normal.GetNormal (); ld.t2 = Cross (ld.normal, ld.t1); - // save points, and project to tangential plane - for (int j = 0; j < ld.locelements.Size(); j++) - { - const Element2d & el = mesh[ld.locelements[j]]; - for (int k = 0; k < el.GetNP(); k++) - savepoints[el[k]] = mesh[el[k]]; - } + if(mixed) + { + // save points, and project to tangential plane (only for optimization with Opti2SurfaceMinFunctionJacobian in mixed element meshes) + for (int j = 0; j < ld.locelements.Size(); j++) + { + const Element2d & el = mesh[ld.locelements[j]]; + for (int k = 0; k < el.GetNP(); k++) + savepoints[el[k]] = mesh[el[k]]; + } - for (int j = 0; j < ld.locelements.Size(); j++) - { - const Element2d & el = mesh[ld.locelements[j]]; - for (int k = 0; k < el.GetNP(); k++) - { - PointIndex hhpi = el[k]; - double lam = ld.normal * (mesh[hhpi] - ld.sp1); - mesh[hhpi] -= lam * ld.normal; - } - } + for (int j = 0; j < ld.locelements.Size(); j++) + { + const Element2d & el = mesh[ld.locelements[j]]; + for (int k = 0; k < el.GetNP(); k++) + { + PointIndex hhpi = el[k]; + double lam = ld.normal * (mesh[hhpi] - ld.sp1); + mesh[hhpi] -= lam * ld.normal; + } + } + } + Vector x(2); x = 0; par.typx = 0.3*ld.lochs[0]; // NgProfiler::StartTimer (timer2); - if (mixed) - { - BFGS (x, surfminfj, par, 1e-6); - } - else - { - BFGS (x, surfminf, par, 1e-6); - } + BFGS (x, minfunc, par, 1e-6); // NgProfiler::StopTimer (timer2); @@ -1011,16 +974,19 @@ namespace netgen double fact = 1; int moveisok = 0; - // restore other points - for (int j = 0; j < ld.locelements.Size(); j++) - { - const Element2d & el = mesh[ld.locelements[j]]; - for (int k = 0; k < el.GetNP(); k++) - { - PointIndex hhpi = el[k]; - if (hhpi != pi) mesh[hhpi] = savepoints[hhpi]; - } - } + if(mixed) + { + // restore other points + for (int j = 0; j < ld.locelements.Size(); j++) + { + const Element2d & el = mesh[ld.locelements[j]]; + for (int k = 0; k < el.GetNP(); k++) + { + PointIndex hhpi = el[k]; + if (hhpi != pi) mesh[hhpi] = savepoints[hhpi]; + } + } + } //optimizer loop (if whole distance is not possible, move only a bit!!!!) @@ -1059,13 +1025,12 @@ namespace netgen } } - } - } + } + } + }, mixed ? 1 : ngcore::TasksPerThread(4)); // mixed element smoothing not parallel yet + } tloop.Stop(); - if (printeddot) - PrintDot ('\n'); - CheckMeshApproximation (mesh); mesh.SetNextTimeStamp(); } diff --git a/libsrc/occ/occmeshsurf.cpp b/libsrc/occ/occmeshsurf.cpp index 4a4f2d20..847907b1 100644 --- a/libsrc/occ/occmeshsurf.cpp +++ b/libsrc/occ/occmeshsurf.cpp @@ -371,6 +371,7 @@ namespace netgen void OCCSurface :: Project (Point<3> & ap, PointGeomInfo & gi) { static Timer t("OccSurface::Project"); RegionTimer reg(t); + static Timer t2("OccSurface::Project actural"); // try Newton's method ... @@ -475,7 +476,10 @@ namespace netgen Handle( ShapeAnalysis_Surface ) su = new ShapeAnalysis_Surface( occface ); auto toltool = BRep_Tool::Tolerance( topods_face ); - gp_Pnt2d suval = su->ValueOfUV ( pnt, toltool); + // gp_Pnt2d suval = su->ValueOfUV ( pnt, toltool); + t2.Start(); + gp_Pnt2d suval = su->NextValueOfUV (gp_Pnt2d(u,v), pnt, toltool); + t2.Stop(); suval.Coord( u, v); pnt = occface->Value( u, v ); diff --git a/libsrc/stlgeom/meshstlsurface.cpp b/libsrc/stlgeom/meshstlsurface.cpp index 8a1830e5..9259aba6 100644 --- a/libsrc/stlgeom/meshstlsurface.cpp +++ b/libsrc/stlgeom/meshstlsurface.cpp @@ -305,9 +305,8 @@ int STLSurfaceMeshing (STLGeometry & geom, class Mesh & mesh, const MeshingParam optmesh.SetMetricWeight (0); mesh.CalcSurfacesOfNode(); - optmesh.EdgeSwapping(0); - mesh.CalcSurfacesOfNode(); - optmesh.ImproveMesh(mparam); + optmesh.EdgeSwapping (0); + optmesh.ImproveMesh (mparam); } mesh.Compress(); diff --git a/libsrc/visualization/vsmesh.cpp b/libsrc/visualization/vsmesh.cpp index 2e0ff9a7..d7b1059b 100644 --- a/libsrc/visualization/vsmesh.cpp +++ b/libsrc/visualization/vsmesh.cpp @@ -1029,8 +1029,11 @@ namespace netgen else glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, matcol); + static Point<3> xa[129]; + static Vec<3> na[129]; - + + for (int hi = 0; hi < seia.Size(); hi++) { SurfaceElementIndex sei = seia[hi]; @@ -1058,8 +1061,6 @@ namespace netgen if (curv.IsHighOrder()) // && curv.IsSurfaceElementCurved(sei)) { if (hoplotn > 128) hoplotn = 128; - Point<3> xa[129]; - Vec<3> na[129]; for (int i = 0; i < hoplotn; i++) { diff --git a/libsrc/visualization/vssolution.cpp b/libsrc/visualization/vssolution.cpp index eb0bb8a1..2a61662b 100644 --- a/libsrc/visualization/vssolution.cpp +++ b/libsrc/visualization/vssolution.cpp @@ -29,6 +29,11 @@ namespace netgen // vssolution.AddUserVisualizationObject (vis); GetVSSolution().AddUserVisualizationObject (vis); } + void DeleteUserVisualizationObject (UserVisualizationObject * vis) + { + // vssolution.AddUserVisualizationObject (vis); + GetVSSolution().DeleteUserVisualizationObject (vis); + } VisualSceneSolution :: SolData :: SolData () diff --git a/libsrc/visualization/vssolution.hpp b/libsrc/visualization/vssolution.hpp index 1fa815f8..e10c8762 100644 --- a/libsrc/visualization/vssolution.hpp +++ b/libsrc/visualization/vssolution.hpp @@ -233,7 +233,12 @@ public: { user_vis.Append (vis); } - + void DeleteUserVisualizationObject (UserVisualizationObject * vis) + { + int pos = user_vis.Pos(vis); + if (pos >= 0) + user_vis.Delete(pos); + } private: void GetClippingPlaneTrigs (NgArray & trigs, NgArray & pts); diff --git a/tests/pytest/results.json b/tests/pytest/results.json index 30c3544e..da57b936 100644 --- a/tests/pytest/results.json +++ b/tests/pytest/results.json @@ -3,9 +3,9 @@ { "ne1d": 74, "ne2d": 54, - "ne3d": 49, - "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 3, 4, 6, 13, 2, 12, 4, 0, 1, 2]", - "total_badness": 71.991209508 + "ne3d": 40, + "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 7, 16, 1, 5, 2, 0, 0, 0]", + "total_badness": 61.085020204 }, { "ne1d": 59, @@ -24,155 +24,155 @@ { "ne1d": 74, "ne2d": 54, - "ne3d": 49, - "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 3, 4, 6, 13, 2, 12, 4, 0, 1, 2]", - "total_badness": 71.991205092 + "ne3d": 40, + "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 7, 16, 1, 5, 2, 0, 0, 0]", + "total_badness": 61.085020204 }, { "ne1d": 118, - "ne2d": 128, - "ne3d": 146, - "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 1, 5, 4, 11, 10, 20, 23, 30, 14, 6, 8, 10, 4]", - "total_badness": 218.29947525 + "ne2d": 140, + "ne3d": 165, + "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 9, 13, 23, 20, 31, 25, 21, 14, 6, 1]", + "total_badness": 233.73328932 }, { "ne1d": 181, - "ne2d": 293, - "ne3d": 453, - "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 0, 3, 4, 9, 23, 32, 41, 67, 91, 85, 55, 37, 6]", - "total_badness": 605.80122988 + "ne2d": 325, + "ne3d": 528, + "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 6, 19, 38, 53, 74, 80, 99, 85, 63, 9]", + "total_badness": 687.31675405 } ], "boxcyl.geo": [ { "ne1d": 190, - "ne2d": 452, - "ne3d": 841, - "quality_histogram": "[0, 0, 0, 0, 0, 0, 1, 3, 3, 23, 119, 77, 90, 116, 110, 79, 85, 77, 45, 13]", - "total_badness": 1250.1700248 + "ne2d": 468, + "ne3d": 846, + "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 0, 3, 31, 93, 78, 103, 80, 92, 103, 102, 84, 56, 21]", + "total_badness": 1229.0231928 }, { "ne1d": 94, "ne2d": 114, - "ne3d": 156, - "quality_histogram": "[0, 0, 0, 0, 0, 2, 6, 9, 10, 8, 12, 9, 13, 7, 20, 15, 15, 22, 5, 3]", - "total_badness": 257.95680767 + "ne3d": 157, + "quality_histogram": "[0, 0, 0, 0, 0, 1, 3, 8, 13, 13, 15, 7, 12, 11, 19, 14, 12, 21, 5, 3]", + "total_badness": 260.17372209 }, { "ne1d": 136, - "ne2d": 218, - "ne3d": 378, - "quality_histogram": "[0, 0, 0, 1, 1, 1, 1, 3, 14, 20, 20, 34, 45, 51, 41, 52, 56, 18, 19, 1]", - "total_badness": 576.7536717 + "ne2d": 222, + "ne3d": 386, + "quality_histogram": "[0, 0, 0, 1, 2, 3, 2, 7, 8, 15, 16, 36, 36, 59, 53, 55, 58, 19, 15, 1]", + "total_badness": 590.51625062 }, { "ne1d": 190, - "ne2d": 452, - "ne3d": 830, - "quality_histogram": "[0, 0, 0, 0, 0, 0, 1, 2, 1, 21, 116, 81, 89, 105, 110, 79, 92, 75, 47, 11]", - "total_badness": 1226.878881 + "ne2d": 468, + "ne3d": 833, + "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 0, 1, 32, 89, 78, 83, 86, 83, 106, 103, 89, 62, 21]", + "total_badness": 1200.9010008 }, { "ne1d": 284, - "ne2d": 908, - "ne3d": 3647, - "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 1, 4, 13, 36, 80, 158, 279, 473, 606, 716, 669, 474, 138]", - "total_badness": 4634.0005088 + "ne2d": 938, + "ne3d": 3742, + "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 25, 55, 131, 247, 484, 640, 754, 710, 529, 161]", + "total_badness": 4685.7832014 }, { "ne1d": 456, - "ne2d": 2444, - "ne3d": 18525, - "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 3, 3, 25, 53, 178, 437, 946, 1780, 2925, 3860, 4149, 3103, 1063]", - "total_badness": 22663.686748 + "ne2d": 2496, + "ne3d": 18713, + "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 0, 1, 10, 39, 127, 338, 795, 1684, 2888, 4053, 4409, 3223, 1146]", + "total_badness": 22695.778021 } ], "circle_on_cube.geo": [ { "ne1d": 94, - "ne2d": 154, - "ne3d": 604, - "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 0, 3, 2, 14, 39, 50, 68, 83, 109, 102, 80, 45, 9]", - "total_badness": 815.17294986 + "ne2d": 170, + "ne3d": 637, + "quality_histogram": "[0, 0, 0, 0, 0, 0, 1, 0, 4, 5, 18, 38, 54, 74, 84, 109, 110, 73, 55, 12]", + "total_badness": 863.74076861 }, { "ne1d": 40, "ne2d": 38, - "ne3d": 53, - "quality_histogram": "[0, 0, 0, 0, 1, 3, 1, 4, 6, 12, 4, 9, 2, 2, 4, 3, 0, 2, 0, 0]", - "total_badness": 109.70868385 + "ne3d": 46, + "quality_histogram": "[0, 0, 0, 0, 0, 2, 2, 4, 8, 8, 6, 7, 5, 1, 2, 1, 0, 0, 0, 0]", + "total_badness": 97.323158335 }, { "ne1d": 62, - "ne2d": 86, - "ne3d": 169, - "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 1, 1, 7, 8, 18, 23, 25, 18, 25, 22, 14, 7, 0]", - "total_badness": 247.43773483 + "ne2d": 96, + "ne3d": 196, + "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 0, 2, 6, 8, 8, 27, 34, 42, 33, 20, 9, 6, 1]", + "total_badness": 282.75693303 }, { "ne1d": 94, - "ne2d": 154, - "ne3d": 592, - "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 0, 2, 4, 12, 34, 35, 57, 92, 97, 118, 80, 45, 16]", - "total_badness": 787.43887104 + "ne2d": 170, + "ne3d": 622, + "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 0, 3, 2, 12, 26, 39, 80, 70, 113, 112, 93, 62, 10]", + "total_badness": 821.68699443 }, { "ne1d": 138, - "ne2d": 370, - "ne3d": 1924, - "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 12, 26, 68, 115, 226, 338, 390, 380, 293, 74]", - "total_badness": 2398.6322242 + "ne2d": 384, + "ne3d": 2028, + "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 9, 28, 67, 157, 250, 347, 419, 398, 261, 88]", + "total_badness": 2540.7133216 }, { "ne1d": 224, - "ne2d": 906, - "ne3d": 11615, - "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 0, 5, 12, 31, 93, 235, 611, 1173, 1864, 2424, 2590, 1985, 592]", - "total_badness": 14210.918388 + "ne2d": 944, + "ne3d": 11860, + "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 0, 4, 8, 29, 85, 211, 518, 1135, 1851, 2527, 2686, 2118, 688]", + "total_badness": 14411.259826 } ], "cone.geo": [ { "ne1d": 64, - "ne2d": 714, - "ne3d": 1198, - "quality_histogram": "[0, 0, 0, 0, 1, 4, 18, 24, 50, 78, 87, 135, 129, 149, 140, 140, 105, 89, 38, 11]", - "total_badness": 1899.21263 + "ne2d": 722, + "ne3d": 1263, + "quality_histogram": "[0, 0, 0, 0, 0, 3, 4, 14, 48, 62, 95, 129, 141, 162, 163, 145, 107, 112, 61, 17]", + "total_badness": 1927.4650748 }, { "ne1d": 32, "ne2d": 220, - "ne3d": 737, - "quality_histogram": "[0, 0, 16, 46, 43, 51, 72, 61, 53, 51, 52, 46, 68, 44, 31, 27, 41, 18, 13, 4]", - "total_badness": 1894.7838255 + "ne3d": 700, + "quality_histogram": "[0, 0, 13, 49, 51, 51, 51, 46, 63, 42, 38, 49, 53, 50, 42, 33, 27, 21, 18, 3]", + "total_badness": 1807.5903418 }, { "ne1d": 48, - "ne2d": 418, - "ne3d": 694, - "quality_histogram": "[0, 7, 25, 28, 25, 14, 32, 29, 62, 97, 65, 64, 56, 54, 45, 32, 32, 19, 5, 3]", - "total_badness": 1708.6126829 + "ne2d": 428, + "ne3d": 930, + "quality_histogram": "[6, 33, 75, 70, 53, 52, 44, 63, 73, 77, 65, 88, 62, 37, 46, 30, 20, 21, 15, 0]", + "total_badness": 3263.5820874 }, { "ne1d": 64, - "ne2d": 714, - "ne3d": 1174, - "quality_histogram": "[0, 0, 0, 0, 1, 1, 13, 19, 46, 52, 80, 116, 129, 141, 160, 150, 120, 86, 45, 15]", - "total_badness": 1805.767771 + "ne2d": 722, + "ne3d": 1244, + "quality_histogram": "[0, 0, 0, 0, 0, 1, 2, 10, 25, 61, 77, 117, 140, 158, 172, 138, 144, 118, 66, 15]", + "total_badness": 1843.7405821 }, { "ne1d": 96, - "ne2d": 1656, - "ne3d": 4332, - "quality_histogram": "[0, 0, 0, 0, 0, 1, 1, 0, 16, 44, 89, 184, 339, 462, 611, 739, 730, 584, 406, 126]", - "total_badness": 5771.741417 + "ne2d": 1660, + "ne3d": 4395, + "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 2, 14, 39, 86, 147, 270, 427, 584, 724, 725, 723, 492, 162]", + "total_badness": 5745.9242938 }, { "ne1d": 160, - "ne2d": 4722, - "ne3d": 27116, - "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 3, 16, 43, 146, 382, 845, 1736, 2853, 4482, 5619, 5559, 4124, 1308]", - "total_badness": 33667.780696 + "ne2d": 4748, + "ne3d": 27365, + "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 0, 8, 35, 121, 352, 715, 1535, 2882, 4456, 5703, 5878, 4303, 1377]", + "total_badness": 33766.111622 } ], "cube.geo": [ @@ -213,54 +213,54 @@ }, { "ne1d": 72, - "ne2d": 110, - "ne3d": 174, - "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 0, 2, 3, 6, 10, 18, 17, 22, 27, 30, 23, 12, 4]", - "total_badness": 238.68878057 + "ne2d": 116, + "ne3d": 167, + "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 1, 4, 2, 5, 5, 16, 8, 18, 30, 31, 29, 11, 7]", + "total_badness": 224.7322738 } ], "cubeandring.geo": [ { "ne1d": 262, - "ne2d": 682, - "ne3d": 2118, - "quality_histogram": "[1, 8, 18, 31, 57, 110, 98, 76, 102, 82, 96, 110, 169, 194, 245, 237, 206, 156, 99, 23]", - "total_badness": 4154.4021114 + "ne2d": 726, + "ne3d": 2225, + "quality_histogram": "[0, 10, 19, 36, 98, 105, 126, 110, 98, 59, 71, 87, 153, 186, 272, 275, 223, 160, 109, 28]", + "total_badness": 4466.5881396 }, { "ne1d": 134, - "ne2d": 156, - "ne3d": 263, - "quality_histogram": "[0, 0, 0, 0, 0, 0, 1, 4, 2, 2, 16, 17, 40, 47, 38, 38, 27, 21, 8, 2]", - "total_badness": 384.77338498 + "ne2d": 164, + "ne3d": 250, + "quality_histogram": "[0, 0, 0, 0, 0, 1, 0, 4, 4, 6, 13, 24, 28, 43, 40, 34, 25, 19, 7, 2]", + "total_badness": 372.39445714 }, { "ne1d": 190, - "ne2d": 276, - "ne3d": 576, - "quality_histogram": "[0, 0, 0, 1, 1, 0, 2, 4, 7, 25, 52, 52, 74, 94, 92, 57, 60, 35, 17, 3]", - "total_badness": 877.04655513 + "ne2d": 300, + "ne3d": 646, + "quality_histogram": "[0, 0, 0, 1, 2, 0, 0, 2, 10, 27, 58, 69, 66, 107, 87, 91, 60, 44, 20, 2]", + "total_badness": 978.54289744 }, { "ne1d": 262, - "ne2d": 682, - "ne3d": 2014, - "quality_histogram": "[0, 0, 2, 21, 42, 92, 89, 58, 93, 59, 79, 94, 133, 179, 225, 269, 231, 218, 103, 27]", - "total_badness": 3541.9483795 + "ne2d": 726, + "ne3d": 2087, + "quality_histogram": "[0, 2, 12, 18, 54, 90, 113, 95, 88, 55, 41, 59, 111, 196, 254, 299, 260, 193, 114, 33]", + "total_badness": 3774.9667473 }, { "ne1d": 378, - "ne2d": 1314, - "ne3d": 7313, - "quality_histogram": "[0, 0, 0, 0, 0, 0, 3, 10, 20, 59, 105, 195, 346, 584, 898, 1274, 1343, 1375, 890, 211]", - "total_badness": 9422.7875587 + "ne2d": 1412, + "ne3d": 7741, + "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 1, 11, 17, 64, 139, 294, 516, 862, 1328, 1545, 1486, 1147, 331]", + "total_badness": 9711.521562 }, { "ne1d": 624, - "ne2d": 3792, - "ne3d": 37404, - "quality_histogram": "[0, 0, 0, 0, 0, 0, 2, 10, 16, 49, 139, 345, 895, 2097, 4029, 6066, 7901, 8036, 5989, 1830]", - "total_badness": 46060.601796 + "ne2d": 3944, + "ne3d": 38347, + "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 2, 18, 40, 131, 351, 853, 2070, 3906, 6037, 7925, 8484, 6438, 2092]", + "total_badness": 47000.212862 } ], "cubeandspheres.geo": [ @@ -268,360 +268,353 @@ "ne1d": 144, "ne2d": 148, "ne3d": 98, - "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 0, 3, 6, 3, 14, 14, 14, 18, 14, 6, 6, 0, 0]", - "total_badness": 149.18816997 + "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 0, 3, 6, 3, 4, 18, 19, 13, 20, 2, 9, 1, 0]", + "total_badness": 145.83375079 + }, + { + "ne1d": 144, + "ne2d": 150, + "ne3d": 100, + "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 7, 10, 16, 18, 15, 17, 6, 5, 4, 0]", + "total_badness": 146.6468601 }, { "ne1d": 144, "ne2d": 148, "ne3d": 98, - "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 11, 11, 17, 13, 16, 18, 3, 6, 0, 0]", - "total_badness": 148.56830588 + "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 6, 6, 19, 21, 12, 18, 5, 4, 4, 0]", + "total_badness": 145.14580879 }, { "ne1d": 144, "ne2d": 148, "ne3d": 98, - "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 0, 3, 1, 8, 12, 14, 22, 10, 18, 4, 6, 0, 0]", - "total_badness": 148.71179128 - }, - { - "ne1d": 144, - "ne2d": 148, - "ne3d": 98, - "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 0, 3, 6, 3, 14, 14, 14, 18, 14, 6, 6, 0, 0]", - "total_badness": 149.18816997 + "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 0, 3, 6, 3, 4, 18, 19, 13, 20, 2, 9, 1, 0]", + "total_badness": 145.83375079 }, { "ne1d": 264, - "ne2d": 352, - "ne3d": 323, - "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 2, 17, 30, 42, 35, 42, 44, 22, 38, 30, 16, 5, 0]", - "total_badness": 519.87992051 + "ne2d": 390, + "ne3d": 369, + "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 4, 5, 19, 26, 42, 46, 49, 41, 53, 45, 27, 10, 2]", + "total_badness": 554.2809713 }, { "ne1d": 428, - "ne2d": 896, - "ne3d": 1041, - "quality_histogram": "[0, 0, 0, 0, 1, 0, 22, 65, 52, 55, 108, 133, 116, 87, 121, 117, 71, 50, 35, 8]", - "total_badness": 1741.9077189 + "ne2d": 926, + "ne3d": 1074, + "quality_histogram": "[0, 0, 0, 0, 0, 1, 2, 23, 50, 36, 109, 137, 96, 117, 160, 162, 67, 60, 32, 22]", + "total_badness": 1675.8711911 } ], "cubemcyl.geo": [ { "ne1d": 142, - "ne2d": 2446, - "ne3d": 20325, - "quality_histogram": "[0, 0, 0, 0, 0, 0, 20, 92, 231, 460, 766, 1183, 1905, 2410, 2914, 3288, 2936, 2375, 1346, 399]", - "total_badness": 28342.436807 + "ne2d": 2488, + "ne3d": 20783, + "quality_histogram": "[0, 0, 0, 0, 0, 2, 26, 94, 208, 408, 708, 1158, 1848, 2485, 3200, 3251, 3127, 2474, 1418, 376]", + "total_badness": 28813.276387 }, { "ne1d": 64, - "ne2d": 614, - "ne3d": 3139, - "quality_histogram": "[0, 0, 0, 0, 0, 1, 17, 29, 33, 83, 171, 248, 355, 443, 490, 441, 384, 266, 139, 39]", - "total_badness": 4570.602164 + "ne2d": 642, + "ne3d": 3214, + "quality_histogram": "[0, 0, 0, 0, 0, 2, 7, 13, 34, 74, 140, 230, 351, 455, 533, 531, 378, 284, 151, 31]", + "total_badness": 4592.7629352 }, { "ne1d": 102, - "ne2d": 1368, - "ne3d": 7908, - "quality_histogram": "[0, 0, 0, 0, 0, 3, 9, 26, 74, 155, 343, 583, 878, 1123, 1166, 1167, 1068, 757, 405, 151]", - "total_badness": 11199.979147 + "ne2d": 1402, + "ne3d": 8234, + "quality_histogram": "[0, 0, 0, 0, 0, 2, 12, 30, 67, 143, 309, 586, 856, 1050, 1271, 1291, 1179, 825, 462, 151]", + "total_badness": 11552.618825 }, { "ne1d": 142, - "ne2d": 2446, - "ne3d": 18974, - "quality_histogram": "[0, 0, 0, 0, 0, 0, 1, 8, 46, 130, 283, 637, 1146, 1993, 2808, 3265, 3451, 2949, 1780, 477]", - "total_badness": 24882.179707 + "ne2d": 2488, + "ne3d": 19499, + "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 5, 27, 106, 226, 529, 1209, 2008, 2862, 3440, 3576, 3083, 1921, 507]", + "total_badness": 25390.546576 }, { "ne1d": 210, - "ne2d": 5442, - "ne3d": 88762, - "quality_histogram": "[0, 0, 0, 0, 0, 1, 8, 10, 46, 139, 446, 1122, 2673, 5668, 10362, 14952, 18108, 18162, 13099, 3966]", - "total_badness": 110409.45349 + "ne2d": 5508, + "ne3d": 88767, + "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 2, 26, 120, 352, 982, 2386, 5436, 9851, 14528, 18286, 19003, 13703, 4092]", + "total_badness": 109764.47526 }, { "ne1d": 362, - "ne2d": 14990, - "ne3d": 521283, - "quality_histogram": "[0, 0, 0, 0, 0, 0, 2, 31, 105, 442, 1248, 3487, 9538, 24363, 50655, 81983, 109930, 118710, 92196, 28593]", - "total_badness": 634417.38261 + "ne2d": 15122, + "ne3d": 524413, + "quality_histogram": "[0, 0, 0, 0, 0, 0, 3, 23, 86, 347, 1131, 3167, 9094, 23844, 49271, 81498, 111440, 122044, 93488, 28977]", + "total_badness": 636787.56071 } ], "cubemsphere.geo": [ { "ne1d": 90, - "ne2d": 634, - "ne3d": 4703, - "quality_histogram": "[0, 0, 0, 0, 0, 1, 4, 26, 50, 102, 180, 271, 448, 602, 711, 733, 681, 539, 268, 87]", - "total_badness": 6582.1722514 + "ne2d": 702, + "ne3d": 4867, + "quality_histogram": "[0, 0, 0, 0, 0, 0, 5, 17, 43, 80, 172, 274, 422, 600, 765, 725, 748, 588, 317, 111]", + "total_badness": 6717.4363413 }, { "ne1d": 44, - "ne2d": 220, - "ne3d": 592, - "quality_histogram": "[0, 0, 0, 0, 0, 3, 11, 24, 38, 55, 74, 77, 81, 69, 58, 49, 30, 20, 3, 0]", - "total_badness": 1025.6506383 + "ne2d": 274, + "ne3d": 768, + "quality_histogram": "[0, 0, 0, 0, 1, 5, 9, 11, 26, 62, 72, 78, 114, 95, 91, 78, 74, 24, 22, 6]", + "total_badness": 1237.8358347 }, { "ne1d": 68, - "ne2d": 376, - "ne3d": 1507, - "quality_histogram": "[0, 0, 0, 1, 0, 0, 1, 8, 27, 33, 82, 130, 185, 226, 255, 212, 182, 90, 63, 12]", - "total_badness": 2204.9089212 + "ne2d": 402, + "ne3d": 1600, + "quality_histogram": "[0, 0, 0, 0, 0, 0, 1, 1, 4, 26, 61, 119, 170, 232, 277, 269, 214, 148, 71, 7]", + "total_badness": 2248.6479915 }, { "ne1d": 90, - "ne2d": 634, - "ne3d": 4404, - "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 1, 9, 24, 77, 158, 268, 476, 650, 823, 776, 659, 379, 104]", - "total_badness": 5795.3747481 + "ne2d": 702, + "ne3d": 4618, + "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 2, 4, 24, 53, 140, 293, 465, 706, 805, 841, 747, 418, 120]", + "total_badness": 6022.3952178 }, { "ne1d": 146, - "ne2d": 1378, - "ne3d": 17460, - "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 2, 6, 39, 98, 248, 602, 1147, 1971, 2860, 3607, 3614, 2512, 754]", - "total_badness": 21776.503681 + "ne2d": 1492, + "ne3d": 17800, + "quality_histogram": "[0, 0, 0, 0, 0, 0, 1, 1, 7, 23, 89, 208, 524, 1085, 1942, 2969, 3729, 3811, 2675, 736]", + "total_badness": 22074.204803 }, { "ne1d": 248, - "ne2d": 4172, - "ne3d": 112451, - "quality_histogram": "[0, 0, 0, 0, 0, 0, 2, 12, 36, 142, 362, 921, 2362, 5754, 11538, 18135, 23443, 25137, 18809, 5798]", - "total_badness": 137714.88539 + "ne2d": 4354, + "ne3d": 113716, + "quality_histogram": "[0, 0, 0, 0, 0, 0, 5, 12, 43, 136, 381, 909, 2353, 5720, 11280, 18112, 23886, 25957, 19090, 5832]", + "total_badness": 139103.15382 } ], "cylinder.geo": [ { "ne1d": 52, "ne2d": 288, - "ne3d": 373, - "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 0, 6, 17, 48, 41, 57, 46, 46, 40, 40, 21, 10, 1]", - "total_badness": 570.55070099 + "ne3d": 410, + "quality_histogram": "[0, 0, 0, 0, 0, 0, 1, 0, 2, 8, 14, 31, 47, 57, 67, 64, 53, 44, 13, 9]", + "total_badness": 577.74781759 }, { "ne1d": 24, "ne2d": 66, - "ne3d": 113, - "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 3, 5, 11, 14, 21, 20, 26, 5, 7]", - "total_badness": 144.11768709 + "ne3d": 124, + "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 7, 9, 12, 16, 23, 39, 12, 5]", + "total_badness": 153.9684245 }, { "ne1d": 36, "ne2d": 152, - "ne3d": 350, - "quality_histogram": "[7, 11, 19, 25, 33, 33, 23, 20, 37, 19, 9, 14, 28, 12, 12, 4, 32, 4, 6, 2]", - "total_badness": 1478.5840853 + "ne3d": 376, + "quality_histogram": "[0, 0, 0, 8, 18, 19, 17, 43, 35, 17, 29, 16, 18, 42, 20, 21, 38, 16, 12, 7]", + "total_badness": 793.09247202 }, { "ne1d": 52, "ne2d": 288, - "ne3d": 373, - "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 0, 6, 17, 48, 40, 56, 45, 48, 40, 40, 22, 10, 1]", - "total_badness": 570.48747936 + "ne3d": 404, + "quality_histogram": "[0, 0, 0, 0, 0, 0, 1, 0, 2, 4, 15, 25, 38, 68, 66, 55, 55, 52, 15, 8]", + "total_badness": 562.71987918 }, { "ne1d": 76, "ne2d": 636, - "ne3d": 1137, - "quality_histogram": "[0, 0, 0, 0, 0, 0, 1, 1, 7, 27, 48, 71, 98, 132, 182, 156, 180, 136, 79, 19]", - "total_badness": 1578.5996937 + "ne3d": 1146, + "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 0, 3, 12, 34, 57, 101, 121, 179, 190, 199, 137, 96, 17]", + "total_badness": 1547.7672308 }, { "ne1d": 124, - "ne2d": 1666, - "ne3d": 8088, - "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 1, 1, 8, 24, 76, 190, 400, 860, 1346, 1715, 1707, 1320, 440]", - "total_badness": 9920.5591087 + "ne2d": 1672, + "ne3d": 8039, + "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 16, 52, 160, 405, 772, 1246, 1710, 1808, 1421, 444]", + "total_badness": 9788.5339464 } ], "cylsphere.geo": [ { "ne1d": 104, "ne2d": 496, - "ne3d": 769, - "quality_histogram": "[0, 0, 0, 0, 1, 1, 8, 10, 20, 31, 64, 104, 111, 105, 113, 63, 69, 47, 18, 4]", - "total_badness": 1205.3563502 + "ne3d": 711, + "quality_histogram": "[0, 0, 0, 0, 0, 0, 4, 9, 15, 36, 63, 90, 107, 103, 99, 56, 60, 50, 17, 2]", + "total_badness": 1105.8880942 }, { "ne1d": 48, - "ne2d": 134, - "ne3d": 238, - "quality_histogram": "[0, 0, 0, 12, 19, 26, 14, 10, 19, 14, 10, 13, 23, 9, 9, 9, 16, 29, 6, 0]", - "total_badness": 566.26384849 - }, - { - "ne1d": 72, - "ne2d": 320, - "ne3d": 543, - "quality_histogram": "[0, 0, 0, 1, 6, 18, 30, 55, 48, 44, 51, 46, 50, 26, 42, 37, 44, 17, 22, 6]", - "total_badness": 1046.4044454 + "ne2d": 142, + "ne3d": 242, + "quality_histogram": "[0, 0, 0, 16, 20, 29, 22, 22, 6, 8, 6, 14, 5, 13, 14, 25, 18, 13, 11, 0]", + "total_badness": 604.89450225 }, { "ne1d": 104, "ne2d": 496, - "ne3d": 763, - "quality_histogram": "[0, 0, 0, 0, 1, 1, 6, 8, 15, 24, 53, 92, 109, 105, 114, 87, 71, 48, 28, 1]", - "total_badness": 1166.824818 + "ne3d": 709, + "quality_histogram": "[0, 0, 0, 0, 0, 0, 4, 5, 15, 29, 63, 86, 110, 109, 89, 69, 66, 45, 15, 4]", + "total_badness": 1092.3394563 }, { "ne1d": 152, "ne2d": 1084, - "ne3d": 2754, - "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 0, 5, 18, 57, 104, 179, 269, 338, 409, 497, 462, 330, 86]", - "total_badness": 3593.8604452 + "ne3d": 2798, + "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 1, 5, 19, 44, 91, 162, 267, 345, 422, 507, 505, 322, 108]", + "total_badness": 3620.8176099 }, { "ne1d": 248, - "ne2d": 2796, - "ne3d": 17632, - "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 1, 4, 14, 65, 169, 393, 961, 1708, 2855, 3774, 3844, 2922, 922]", - "total_badness": 21617.406219 + "ne2d": 2820, + "ne3d": 17745, + "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 2, 2, 20, 57, 142, 331, 880, 1771, 2788, 3668, 3998, 3037, 1049]", + "total_badness": 21647.214644 } ], "ellipsoid.geo": [ { "ne1d": 0, - "ne2d": 680, - "ne3d": 1253, - "quality_histogram": "[0, 0, 0, 0, 0, 2, 11, 20, 53, 100, 111, 111, 155, 149, 154, 148, 135, 63, 34, 7]", - "total_badness": 1985.7030805 + "ne2d": 704, + "ne3d": 1297, + "quality_histogram": "[0, 0, 0, 0, 0, 0, 7, 14, 42, 76, 119, 157, 154, 160, 158, 142, 111, 89, 54, 14]", + "total_badness": 2009.8527353 }, { "ne1d": 0, - "ne2d": 178, - "ne3d": 868, - "quality_histogram": "[4, 98, 135, 97, 109, 65, 50, 59, 43, 52, 38, 31, 31, 17, 17, 9, 6, 4, 3, 0]", - "total_badness": 4464.8470583 + "ne2d": 192, + "ne3d": 915, + "quality_histogram": "[24, 146, 135, 112, 105, 65, 62, 41, 46, 43, 32, 26, 19, 24, 15, 10, 6, 1, 3, 0]", + "total_badness": 5760.7267346 }, { "ne1d": 0, - "ne2d": 382, - "ne3d": 580, - "quality_histogram": "[0, 0, 0, 0, 0, 0, 4, 4, 14, 25, 55, 78, 93, 94, 67, 62, 37, 33, 12, 2]", - "total_badness": 904.85287903 + "ne2d": 394, + "ne3d": 592, + "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 5, 9, 21, 38, 80, 86, 90, 99, 53, 48, 29, 22, 12]", + "total_badness": 893.18441542 }, { "ne1d": 0, - "ne2d": 680, - "ne3d": 1247, - "quality_histogram": "[0, 0, 0, 0, 0, 0, 4, 12, 46, 72, 103, 109, 149, 167, 171, 151, 126, 86, 36, 15]", - "total_badness": 1912.2663825 + "ne2d": 704, + "ne3d": 1282, + "quality_histogram": "[0, 0, 0, 0, 0, 0, 2, 10, 33, 59, 108, 136, 158, 156, 163, 153, 115, 97, 69, 23]", + "total_badness": 1929.3894181 }, { "ne1d": 0, - "ne2d": 1598, - "ne3d": 5187, - "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 2, 12, 30, 120, 186, 330, 487, 671, 818, 900, 916, 552, 163]", - "total_badness": 6777.2750162 + "ne2d": 1618, + "ne3d": 5569, + "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 1, 4, 23, 73, 130, 303, 511, 700, 922, 1025, 989, 693, 195]", + "total_badness": 7142.2540344 }, { "ne1d": 0, - "ne2d": 4194, - "ne3d": 37326, - "quality_histogram": "[0, 0, 0, 0, 0, 1, 4, 4, 15, 38, 101, 309, 805, 1892, 3619, 5837, 7850, 8414, 6510, 1927]", - "total_badness": 45621.246486 + "ne2d": 4236, + "ne3d": 37387, + "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 1, 3, 17, 75, 239, 644, 1587, 3545, 5826, 7874, 8638, 6846, 2092]", + "total_badness": 45341.992565 } ], "ellipticcone.geo": [ { "ne1d": 174, - "ne2d": 1514, - "ne3d": 5133, - "quality_histogram": "[0, 0, 0, 0, 0, 0, 2, 14, 23, 82, 130, 251, 424, 603, 797, 868, 844, 647, 341, 107]", - "total_badness": 6981.6197599 + "ne2d": 1562, + "ne3d": 5180, + "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 3, 18, 65, 115, 211, 361, 589, 766, 881, 904, 732, 405, 130]", + "total_badness": 6920.4601657 }, { "ne1d": 86, - "ne2d": 368, - "ne3d": 589, - "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 14, 16, 25, 60, 55, 55, 68, 70, 73, 70, 48, 30, 5]", - "total_badness": 894.91658405 + "ne2d": 380, + "ne3d": 585, + "quality_histogram": "[0, 0, 0, 0, 0, 1, 1, 5, 13, 17, 32, 57, 64, 73, 84, 89, 68, 47, 22, 12]", + "total_badness": 860.61770269 }, { "ne1d": 130, - "ne2d": 834, - "ne3d": 1605, - "quality_histogram": "[0, 0, 0, 0, 0, 0, 3, 6, 24, 40, 69, 119, 192, 205, 235, 242, 200, 161, 86, 23]", - "total_badness": 2293.3504808 + "ne2d": 864, + "ne3d": 1734, + "quality_histogram": "[0, 0, 0, 0, 0, 7, 9, 28, 37, 57, 85, 135, 132, 216, 225, 256, 238, 177, 100, 32]", + "total_badness": 2535.8367438 }, { "ne1d": 174, - "ne2d": 1514, - "ne3d": 4920, - "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 1, 1, 24, 68, 142, 286, 532, 774, 876, 900, 747, 441, 128]", - "total_badness": 6425.5732257 + "ne2d": 1562, + "ne3d": 4943, + "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 1, 4, 15, 49, 116, 255, 456, 635, 917, 1005, 806, 517, 167]", + "total_badness": 6347.4280983 }, { "ne1d": 258, - "ne2d": 3350, - "ne3d": 13033, - "quality_histogram": "[0, 0, 0, 0, 0, 0, 4, 7, 35, 106, 181, 363, 681, 1120, 1738, 2146, 2478, 2187, 1501, 486]", - "total_badness": 16847.718951 + "ne2d": 3468, + "ne3d": 13314, + "quality_histogram": "[0, 0, 0, 0, 0, 0, 1, 4, 33, 103, 197, 351, 652, 1077, 1619, 2280, 2518, 2361, 1583, 535]", + "total_badness": 17113.967555 }, { "ne1d": 432, - "ne2d": 9278, - "ne3d": 69660, - "quality_histogram": "[0, 0, 0, 0, 3, 5, 9, 30, 75, 155, 423, 954, 2071, 4217, 7619, 11353, 14206, 14652, 10674, 3214]", - "total_badness": 86601.731893 + "ne2d": 9544, + "ne3d": 69891, + "quality_histogram": "[0, 0, 0, 0, 0, 0, 1, 9, 37, 119, 313, 839, 1927, 4086, 7715, 11454, 14338, 14977, 10816, 3260]", + "total_badness": 86472.194086 } ], "ellipticcyl.geo": [ { "ne1d": 156, - "ne2d": 962, - "ne3d": 2143, - "quality_histogram": "[0, 0, 0, 0, 1, 3, 4, 22, 46, 68, 111, 155, 207, 300, 298, 285, 264, 221, 121, 37]", - "total_badness": 3112.7584751 + "ne2d": 996, + "ne3d": 2299, + "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 12, 15, 55, 86, 117, 235, 272, 372, 360, 358, 240, 144, 33]", + "total_badness": 3202.1380209 }, { "ne1d": 76, - "ne2d": 234, + "ne2d": 238, "ne3d": 325, - "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 16, 23, 20, 48, 68, 50, 40, 32, 17, 5]", - "total_badness": 453.9976362 + "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 0, 1, 5, 18, 28, 26, 38, 68, 55, 45, 28, 11, 2]", + "total_badness": 459.61476239 }, { "ne1d": 116, - "ne2d": 588, - "ne3d": 1087, - "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 2, 5, 12, 24, 58, 102, 152, 175, 168, 178, 116, 75, 20]", - "total_badness": 1485.3521875 + "ne2d": 596, + "ne3d": 1129, + "quality_histogram": "[0, 0, 0, 0, 0, 0, 1, 0, 2, 10, 28, 38, 75, 130, 159, 208, 199, 162, 100, 17]", + "total_badness": 1500.1384781 }, { "ne1d": 156, - "ne2d": 962, - "ne3d": 2073, - "quality_histogram": "[0, 0, 0, 0, 0, 3, 3, 12, 21, 57, 74, 130, 165, 270, 319, 299, 291, 238, 155, 36]", - "total_badness": 2905.3559173 + "ne2d": 996, + "ne3d": 2214, + "quality_histogram": "[0, 0, 0, 0, 0, 0, 1, 1, 4, 40, 47, 89, 182, 262, 324, 362, 381, 279, 196, 46]", + "total_badness": 2974.3073079 }, { "ne1d": 232, - "ne2d": 2134, - "ne3d": 8123, - "quality_histogram": "[0, 0, 0, 0, 0, 0, 1, 1, 14, 25, 66, 136, 318, 644, 1021, 1431, 1662, 1489, 1001, 314]", - "total_badness": 10284.60484 + "ne2d": 2212, + "ne3d": 8313, + "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 0, 4, 15, 37, 113, 263, 626, 1005, 1387, 1743, 1660, 1133, 327]", + "total_badness": 10392.004794 }, { "ne1d": 388, - "ne2d": 5968, - "ne3d": 55441, - "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 6, 13, 49, 145, 382, 944, 2547, 5198, 8766, 11807, 12906, 9584, 3094]", - "total_badness": 67425.887286 + "ne2d": 6142, + "ne3d": 54975, + "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 2, 12, 45, 127, 329, 844, 2554, 5100, 8469, 11479, 12855, 9876, 3283]", + "total_badness": 66669.096677 } ], "fichera.geo": [ { "ne1d": 50, "ne2d": 38, - "ne3d": 35, - "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 3, 3, 0, 14, 6, 4, 3, 0, 0, 0]", - "total_badness": 52.723984269 + "ne3d": 40, + "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 2, 1, 3, 2, 4, 3, 5, 7, 8, 2, 1, 0, 2]", + "total_badness": 62.361996939 }, { "ne1d": 42, @@ -640,90 +633,90 @@ { "ne1d": 50, "ne2d": 38, - "ne3d": 35, - "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 3, 3, 0, 14, 6, 4, 3, 0, 0, 0]", - "total_badness": 52.723984269 + "ne3d": 40, + "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 2, 1, 3, 2, 4, 3, 5, 7, 8, 2, 1, 0, 2]", + "total_badness": 62.361996939 }, { "ne1d": 96, - "ne2d": 106, - "ne3d": 179, - "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 6, 10, 20, 26, 30, 24, 23, 20, 12, 6]", - "total_badness": 245.27475687 + "ne2d": 120, + "ne3d": 211, + "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 6, 14, 22, 26, 38, 37, 41, 14, 9]", + "total_badness": 273.06134659 }, { "ne1d": 144, - "ne2d": 254, - "ne3d": 517, - "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 0, 2, 4, 5, 18, 36, 63, 77, 102, 79, 72, 50, 9]", - "total_badness": 684.87955167 + "ne2d": 274, + "ne3d": 510, + "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 8, 16, 34, 67, 79, 99, 78, 66, 48, 12]", + "total_badness": 673.19970182 } ], "frame.step": [ { "ne1d": 12694, - "ne2d": 38314, - "ne3d": 212505, - "quality_histogram": "[8, 17, 39, 82, 157, 311, 699, 1584, 2930, 5028, 8196, 12501, 18612, 25602, 30126, 32912, 30427, 24165, 14877, 4232]", - "total_badness": 300743.24149 + "ne2d": 40530, + "ne3d": 221097, + "quality_histogram": "[3, 7, 7, 7, 8, 40, 245, 708, 1672, 3552, 6310, 10581, 17667, 25348, 32001, 36224, 35008, 29057, 18076, 4576]", + "total_badness": 301373.46714 }, { "ne1d": 6026, - "ne2d": 10908, - "ne3d": 29168, - "quality_histogram": "[5, 17, 30, 54, 113, 234, 303, 636, 1004, 1450, 1997, 2754, 3211, 3473, 3849, 3740, 2873, 2006, 1087, 332]", - "total_badness": 46555.75668 + "ne2d": 11334, + "ne3d": 30593, + "quality_histogram": "[4, 5, 3, 10, 18, 39, 99, 258, 685, 1029, 1688, 2632, 3417, 4292, 4551, 4273, 3404, 2499, 1366, 321]", + "total_badness": 45414.634083 }, { "ne1d": 9704, - "ne2d": 23136, - "ne3d": 81782, - "quality_histogram": "[5, 26, 39, 74, 110, 192, 375, 607, 1135, 2087, 3287, 5720, 8327, 11033, 11795, 12158, 10560, 8207, 4838, 1207]", - "total_badness": 118661.78058 + "ne2d": 24442, + "ne3d": 85741, + "quality_histogram": "[1, 6, 6, 9, 8, 30, 83, 164, 483, 1017, 2377, 4530, 7838, 10925, 13440, 14326, 13095, 10227, 5737, 1439]", + "total_badness": 117664.34461 } ], "hinge.stl": [ { "ne1d": 456, - "ne2d": 1230, - "ne3d": 1982, - "quality_histogram": "[0, 0, 0, 1, 2, 1, 4, 8, 22, 45, 68, 119, 169, 255, 300, 273, 286, 241, 147, 41]", - "total_badness": 2769.400459 + "ne2d": 1218, + "ne3d": 2007, + "quality_histogram": "[0, 0, 0, 0, 0, 2, 7, 22, 35, 43, 69, 124, 175, 266, 301, 273, 272, 226, 144, 48]", + "total_badness": 2839.693559 }, { "ne1d": 298, - "ne2d": 614, - "ne3d": 778, - "quality_histogram": "[0, 0, 0, 0, 12, 11, 21, 18, 43, 53, 58, 71, 88, 85, 92, 93, 60, 44, 22, 7]", - "total_badness": 1321.0009733 + "ne2d": 606, + "ne3d": 782, + "quality_histogram": "[0, 0, 1, 9, 6, 5, 18, 17, 33, 53, 60, 95, 99, 112, 83, 73, 47, 49, 20, 2]", + "total_badness": 1342.4305041 }, { "ne1d": 370, - "ne2d": 856, - "ne3d": 1137, - "quality_histogram": "[0, 0, 0, 0, 2, 7, 12, 20, 30, 43, 62, 114, 125, 155, 157, 182, 105, 64, 44, 15]", - "total_badness": 1746.193159 + "ne2d": 854, + "ne3d": 1136, + "quality_histogram": "[0, 0, 0, 1, 3, 9, 21, 24, 34, 44, 70, 113, 151, 137, 158, 154, 97, 68, 43, 9]", + "total_badness": 1798.68351 }, { "ne1d": 516, - "ne2d": 1584, - "ne3d": 2541, - "quality_histogram": "[0, 0, 0, 0, 0, 0, 7, 7, 22, 58, 110, 180, 233, 292, 361, 381, 338, 309, 196, 47]", - "total_badness": 3554.0634047 + "ne2d": 1574, + "ne3d": 2551, + "quality_histogram": "[0, 0, 0, 0, 0, 2, 4, 9, 22, 56, 91, 150, 262, 288, 378, 368, 350, 304, 214, 53]", + "total_badness": 3546.3587224 }, { "ne1d": 722, - "ne2d": 2888, - "ne3d": 6849, - "quality_histogram": "[0, 0, 0, 0, 0, 1, 0, 2, 18, 24, 66, 167, 352, 617, 884, 1136, 1241, 1156, 907, 278]", - "total_badness": 8770.1231664 + "ne2d": 2872, + "ne3d": 6679, + "quality_histogram": "[0, 0, 0, 0, 0, 0, 1, 4, 22, 38, 58, 158, 368, 659, 826, 1064, 1147, 1157, 900, 277]", + "total_badness": 8576.0981512 }, { "ne1d": 1862, - "ne2d": 19516, - "ne3d": 138101, - "quality_histogram": "[0, 0, 0, 0, 0, 1, 1, 7, 31, 129, 400, 1163, 2873, 7052, 13502, 21822, 29035, 31031, 23540, 7514]", - "total_badness": 168731.72877 + "ne2d": 19494, + "ne3d": 137231, + "quality_histogram": "[0, 0, 0, 0, 0, 0, 1, 7, 48, 161, 424, 1135, 2966, 6918, 13385, 21373, 28847, 31139, 23298, 7529]", + "total_badness": 167698.91174 } ], "lshape3d.geo": [ @@ -731,8 +724,8 @@ "ne1d": 44, "ne2d": 28, "ne3d": 18, - "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 12, 0, 3, 0, 0, 0, 0]", - "total_badness": 27.289065401 + "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 16, 0, 1, 0, 0, 0, 0]", + "total_badness": 27.266612058 }, { "ne1d": 36, @@ -752,98 +745,98 @@ "ne1d": 44, "ne2d": 28, "ne3d": 18, - "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 12, 0, 3, 0, 0, 0, 0]", - "total_badness": 27.289065401 + "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 16, 0, 1, 0, 0, 0, 0]", + "total_badness": 27.266612058 }, { "ne1d": 80, - "ne2d": 66, - "ne3d": 73, - "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 9, 9, 9, 17, 14, 2, 3, 6]", - "total_badness": 97.371969345 + "ne2d": 76, + "ne3d": 88, + "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 10, 9, 21, 23, 7, 6, 1, 4]", + "total_badness": 121.1271847 }, { "ne1d": 122, - "ne2d": 190, - "ne3d": 304, - "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 0, 5, 6, 6, 8, 20, 38, 34, 59, 55, 27, 37, 9]", - "total_badness": 408.34610106 + "ne2d": 204, + "ne3d": 326, + "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 11, 17, 43, 51, 53, 55, 51, 33, 6]", + "total_badness": 427.73309234 } ], "manyholes.geo": [ { "ne1d": 5886, - "ne2d": 46994, - "ne3d": 178258, - "quality_histogram": "[0, 0, 0, 0, 8, 50, 338, 268, 1001, 1782, 4230, 9114, 12778, 22138, 26582, 30068, 28574, 22323, 12911, 6093]", - "total_badness": 241077.60229 + "ne2d": 48052, + "ne3d": 179262, + "quality_histogram": "[0, 0, 0, 0, 7, 34, 52, 190, 559, 1394, 3332, 7622, 12534, 20021, 27619, 30066, 29961, 25045, 16810, 4016]", + "total_badness": 238415.32571 }, { "ne1d": 2746, - "ne2d": 13378, - "ne3d": 29015, - "quality_histogram": "[0, 0, 0, 0, 11, 36, 101, 261, 569, 928, 1565, 2421, 3036, 3930, 4729, 4059, 2750, 2077, 1180, 1362]", - "total_badness": 42502.70594 + "ne2d": 13866, + "ne3d": 29255, + "quality_histogram": "[0, 0, 0, 0, 12, 22, 36, 163, 382, 903, 1510, 2377, 3268, 4375, 4191, 3761, 3120, 2567, 1846, 722]", + "total_badness": 42256.964101 }, { "ne1d": 4106, - "ne2d": 27348, - "ne3d": 69176, - "quality_histogram": "[0, 0, 0, 3, 31, 109, 199, 524, 999, 1835, 3521, 5175, 7195, 10701, 9247, 9303, 8279, 6175, 3449, 2431]", - "total_badness": 99864.410415 + "ne2d": 27994, + "ne3d": 70558, + "quality_histogram": "[0, 0, 0, 2, 32, 84, 194, 406, 841, 1669, 2783, 4416, 6997, 9372, 10151, 10346, 9564, 7474, 4487, 1740]", + "total_badness": 99764.452235 } ], "manyholes2.geo": [ { "ne1d": 10202, - "ne2d": 53486, - "ne3d": 139190, - "quality_histogram": "[0, 1, 168, 441, 975, 1689, 2691, 3289, 4667, 5762, 8158, 11621, 13472, 16651, 21820, 18509, 12164, 7790, 3882, 5440]", - "total_badness": 223824.49195 + "ne2d": 55380, + "ne3d": 127866, + "quality_histogram": "[0, 0, 0, 0, 5, 32, 101, 306, 842, 2081, 4519, 7983, 11838, 17786, 18634, 18254, 16922, 14537, 10444, 3582]", + "total_badness": 176665.61274 } ], "matrix.geo": [ { "ne1d": 174, - "ne2d": 1084, - "ne3d": 4699, - "quality_histogram": "[0, 0, 13, 73, 49, 72, 104, 195, 232, 324, 348, 450, 518, 514, 513, 418, 364, 308, 157, 47]", - "total_badness": 8342.3218051 + "ne2d": 1198, + "ne3d": 5246, + "quality_histogram": "[0, 0, 39, 136, 119, 93, 134, 174, 148, 224, 329, 399, 532, 581, 603, 563, 474, 398, 241, 59]", + "total_badness": 9567.4544817 }, { "ne1d": 106, - "ne2d": 566, - "ne3d": 1890, - "quality_histogram": "[0, 6, 46, 100, 165, 157, 187, 195, 175, 172, 157, 126, 113, 91, 67, 50, 34, 20, 19, 10]", - "total_badness": 5257.1128921 + "ne2d": 610, + "ne3d": 1936, + "quality_histogram": "[0, 1, 11, 66, 104, 143, 140, 142, 192, 179, 201, 199, 161, 135, 74, 57, 51, 46, 29, 5]", + "total_badness": 4606.0709672 }, { "ne1d": 132, - "ne2d": 760, - "ne3d": 2545, - "quality_histogram": "[0, 0, 12, 35, 55, 94, 105, 187, 268, 293, 293, 266, 233, 187, 152, 115, 121, 65, 49, 15]", - "total_badness": 5261.0373333 + "ne2d": 830, + "ne3d": 2751, + "quality_histogram": "[0, 0, 4, 57, 63, 116, 124, 163, 226, 230, 333, 307, 270, 240, 206, 164, 105, 82, 43, 18]", + "total_badness": 5616.8677502 }, { "ne1d": 174, - "ne2d": 1084, - "ne3d": 4585, - "quality_histogram": "[0, 0, 11, 44, 38, 56, 90, 162, 223, 280, 328, 417, 462, 526, 487, 490, 431, 301, 185, 54]", - "total_badness": 7814.6531832 + "ne2d": 1198, + "ne3d": 5176, + "quality_histogram": "[0, 0, 31, 113, 115, 69, 111, 172, 123, 209, 285, 339, 485, 597, 595, 628, 503, 468, 254, 79]", + "total_badness": 9086.4626755 }, { "ne1d": 248, - "ne2d": 2214, - "ne3d": 15658, - "quality_histogram": "[0, 0, 0, 2, 2, 20, 40, 101, 153, 301, 415, 740, 1135, 1544, 1997, 2392, 2499, 2362, 1552, 403]", - "total_badness": 21309.771439 + "ne2d": 2324, + "ne3d": 16341, + "quality_histogram": "[0, 0, 0, 0, 0, 7, 23, 64, 122, 219, 336, 666, 982, 1584, 2204, 2586, 2786, 2581, 1637, 544]", + "total_badness": 21749.164857 }, { "ne1d": 418, - "ne2d": 5826, - "ne3d": 100044, - "quality_histogram": "[0, 0, 0, 1, 3, 12, 22, 40, 112, 259, 681, 1477, 3255, 6325, 10800, 16144, 20094, 20986, 15199, 4634]", - "total_badness": 124683.88481 + "ne2d": 5968, + "ne3d": 100573, + "quality_histogram": "[0, 0, 0, 0, 0, 0, 6, 18, 78, 192, 438, 1216, 2786, 6112, 10628, 15970, 20785, 21682, 15766, 4896]", + "total_badness": 124376.56219 } ], "ortho.geo": [ @@ -884,473 +877,466 @@ }, { "ne1d": 72, - "ne2d": 110, - "ne3d": 172, - "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 10, 15, 17, 30, 27, 25, 30, 7, 5]", - "total_badness": 232.48733688 + "ne2d": 116, + "ne3d": 180, + "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 11, 12, 24, 35, 36, 29, 16, 9]", + "total_badness": 231.52239849 } ], "part1.stl": [ { "ne1d": 170, - "ne2d": 452, - "ne3d": 1221, - "quality_histogram": "[0, 0, 0, 0, 0, 2, 9, 15, 14, 42, 45, 91, 129, 124, 150, 175, 182, 137, 87, 19]", - "total_badness": 1752.7121974 - }, - { - "ne1d": 112, - "ne2d": 210, - "ne3d": 331, - "quality_histogram": "[0, 0, 1, 0, 6, 6, 9, 13, 20, 24, 35, 36, 36, 42, 35, 26, 25, 9, 7, 1]", - "total_badness": 593.98191451 + "ne2d": 448, + "ne3d": 1242, + "quality_histogram": "[0, 0, 0, 0, 0, 2, 3, 9, 14, 27, 62, 80, 118, 165, 171, 191, 160, 126, 91, 23]", + "total_badness": 1762.3248217 }, { "ne1d": 134, - "ne2d": 286, - "ne3d": 519, - "quality_histogram": "[0, 0, 0, 0, 1, 3, 4, 5, 11, 9, 28, 39, 66, 73, 64, 71, 65, 46, 28, 6]", - "total_badness": 768.26259551 + "ne2d": 288, + "ne3d": 521, + "quality_histogram": "[0, 0, 1, 2, 5, 7, 6, 10, 18, 23, 40, 41, 47, 59, 72, 76, 56, 37, 18, 3]", + "total_badness": 839.17126404 }, { "ne1d": 194, - "ne2d": 592, - "ne3d": 1740, - "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 0, 3, 8, 29, 68, 110, 201, 256, 293, 262, 269, 195, 46]", - "total_badness": 2286.299101 + "ne2d": 594, + "ne3d": 1666, + "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 2, 5, 16, 23, 59, 118, 160, 264, 288, 282, 255, 167, 27]", + "total_badness": 2197.5763632 }, { "ne1d": 266, - "ne2d": 990, - "ne3d": 4048, - "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 0, 7, 14, 39, 67, 175, 322, 533, 730, 789, 739, 499, 134]", - "total_badness": 5148.0493548 + "ne2d": 986, + "ne3d": 4090, + "quality_histogram": "[0, 0, 0, 0, 0, 0, 1, 0, 2, 11, 35, 59, 152, 324, 579, 738, 770, 768, 506, 145]", + "total_badness": 5178.06234 }, { "ne1d": 674, - "ne2d": 6870, - "ne3d": 84183, - "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 3, 21, 60, 225, 579, 1748, 4156, 8065, 12832, 17827, 19301, 14804, 4562]", - "total_badness": 102573.89785 + "ne2d": 6856, + "ne3d": 82761, + "quality_histogram": "[0, 0, 0, 0, 0, 0, 1, 3, 10, 84, 220, 616, 1785, 4044, 8183, 13189, 17574, 18506, 14181, 4365]", + "total_badness": 101090.57562 } ], "period.geo": [ { "ne1d": 344, - "ne2d": 1084, - "ne3d": 3278, - "quality_histogram": "[0, 5, 14, 14, 23, 25, 47, 84, 110, 154, 256, 310, 348, 386, 396, 354, 307, 234, 155, 56]", - "total_badness": 5432.5002888 + "ne2d": 1136, + "ne3d": 3291, + "quality_histogram": "[0, 0, 0, 0, 1, 6, 24, 38, 73, 142, 237, 280, 363, 430, 473, 394, 337, 293, 163, 37]", + "total_badness": 4941.6426523 }, { "ne1d": 160, - "ne2d": 266, - "ne3d": 587, - "quality_histogram": "[0, 0, 1, 6, 17, 26, 27, 41, 51, 52, 39, 54, 43, 44, 41, 44, 24, 47, 20, 10]", - "total_badness": 1164.3298304 + "ne2d": 286, + "ne3d": 642, + "quality_histogram": "[0, 0, 4, 7, 11, 22, 28, 28, 40, 61, 66, 58, 59, 55, 53, 53, 40, 36, 16, 5]", + "total_badness": 1235.2259283 }, { "ne1d": 232, - "ne2d": 542, - "ne3d": 1307, - "quality_histogram": "[0, 0, 2, 8, 20, 50, 54, 71, 94, 89, 105, 157, 139, 116, 109, 84, 104, 51, 33, 21]", - "total_badness": 2452.0445067 + "ne2d": 598, + "ne3d": 1654, + "quality_histogram": "[5, 18, 43, 57, 47, 59, 62, 79, 117, 120, 126, 148, 134, 159, 134, 113, 117, 66, 39, 11]", + "total_badness": 3928.2006441 }, { "ne1d": 344, - "ne2d": 1084, - "ne3d": 3191, - "quality_histogram": "[0, 1, 5, 6, 22, 12, 27, 55, 85, 133, 225, 274, 317, 391, 403, 388, 344, 252, 180, 71]", - "total_badness": 4959.2612367 + "ne2d": 1136, + "ne3d": 3221, + "quality_histogram": "[0, 0, 0, 0, 0, 3, 20, 24, 54, 111, 178, 268, 317, 453, 436, 450, 365, 311, 187, 44]", + "total_badness": 4704.9518805 }, { "ne1d": 480, - "ne2d": 2170, - "ne3d": 11358, - "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 8, 32, 78, 156, 319, 661, 1069, 1444, 1903, 2141, 1909, 1239, 399]", - "total_badness": 14721.191349 + "ne2d": 2256, + "ne3d": 11709, + "quality_histogram": "[0, 0, 0, 0, 0, 1, 2, 9, 15, 51, 115, 243, 547, 966, 1489, 2032, 2273, 2081, 1459, 426]", + "total_badness": 14941.96653 }, { "ne1d": 820, - "ne2d": 6080, - "ne3d": 67352, - "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 4, 28, 98, 306, 824, 1965, 4113, 7215, 11082, 13763, 14092, 10512, 3350]", - "total_badness": 83350.921624 + "ne2d": 6226, + "ne3d": 68532, + "quality_histogram": "[0, 0, 0, 0, 0, 0, 1, 4, 18, 76, 261, 684, 1675, 3888, 7222, 11072, 14234, 14852, 11076, 3469]", + "total_badness": 84325.408672 } ], "plane.stl": [ { "ne1d": 890, - "ne2d": 2642, - "ne3d": 8595, - "quality_histogram": "[4, 13, 28, 37, 47, 45, 46, 76, 119, 205, 339, 501, 686, 989, 1187, 1277, 1290, 971, 584, 151]", - "total_badness": 12988.842256 + "ne2d": 2620, + "ne3d": 8323, + "quality_histogram": "[5, 21, 28, 32, 53, 48, 47, 80, 151, 239, 321, 490, 681, 901, 1189, 1198, 1208, 892, 597, 142]", + "total_badness": 12887.967725 }, { "ne1d": 572, - "ne2d": 1226, - "ne3d": 1904, - "quality_histogram": "[2, 15, 45, 48, 51, 64, 68, 85, 111, 137, 157, 178, 181, 193, 185, 151, 109, 79, 35, 10]", - "total_badness": 4266.5881394 + "ne2d": 1196, + "ne3d": 1793, + "quality_histogram": "[11, 31, 38, 55, 69, 104, 109, 132, 143, 150, 154, 158, 135, 136, 121, 82, 79, 51, 30, 5]", + "total_badness": 4800.1708991 }, { "ne1d": 724, - "ne2d": 1748, - "ne3d": 3263, - "quality_histogram": "[5, 21, 30, 43, 40, 47, 39, 66, 96, 148, 182, 302, 323, 393, 459, 390, 329, 197, 124, 29]", - "total_badness": 5975.2670543 + "ne2d": 1726, + "ne3d": 3259, + "quality_histogram": "[5, 19, 38, 39, 48, 38, 53, 68, 126, 153, 210, 276, 357, 394, 388, 356, 323, 218, 123, 27]", + "total_badness": 6069.660571 }, { "ne1d": 956, - "ne2d": 2882, - "ne3d": 8446, - "quality_histogram": "[4, 12, 23, 50, 42, 48, 44, 59, 82, 157, 207, 360, 560, 882, 1225, 1335, 1352, 1160, 663, 181]", - "total_badness": 12444.826653 + "ne2d": 2820, + "ne3d": 8391, + "quality_histogram": "[3, 12, 32, 49, 46, 54, 59, 63, 86, 144, 250, 389, 575, 816, 1238, 1375, 1331, 1047, 665, 157]", + "total_badness": 12510.073302 }, { "ne1d": 1554, - "ne2d": 6466, - "ne3d": 32031, - "quality_histogram": "[5, 6, 8, 8, 23, 53, 54, 80, 112, 196, 405, 711, 1412, 2584, 3934, 5449, 6160, 5835, 3889, 1107]", - "total_badness": 41668.344524 + "ne2d": 6388, + "ne3d": 31455, + "quality_histogram": "[3, 7, 11, 8, 27, 51, 59, 79, 108, 196, 350, 697, 1388, 2535, 4050, 5292, 6175, 5518, 3822, 1079]", + "total_badness": 40980.318629 }, { "ne1d": 2992, - "ne2d": 23396, - "ne3d": 278063, - "quality_histogram": "[5, 7, 10, 7, 10, 24, 35, 101, 221, 488, 1182, 2740, 6870, 15308, 29180, 44805, 57832, 60855, 44767, 13616]", - "total_badness": 343096.47286 + "ne2d": 23328, + "ne3d": 276363, + "quality_histogram": "[4, 10, 12, 10, 7, 20, 37, 80, 203, 470, 1122, 2731, 6675, 14971, 28708, 44685, 57676, 60478, 45018, 13446]", + "total_badness": 340678.17837 } ], "revolution.geo": [ { "ne1d": 320, - "ne2d": 2954, - "ne3d": 8130, - "quality_histogram": "[0, 0, 0, 0, 0, 2, 15, 66, 164, 321, 511, 753, 963, 1055, 1091, 997, 911, 712, 457, 112]", - "total_badness": 11989.408099 + "ne2d": 3110, + "ne3d": 8443, + "quality_histogram": "[0, 0, 0, 0, 0, 1, 12, 45, 144, 318, 519, 804, 967, 1078, 1145, 1112, 987, 738, 454, 119]", + "total_badness": 12356.528396 }, { "ne1d": 160, - "ne2d": 796, - "ne3d": 1285, - "quality_histogram": "[0, 2, 3, 11, 14, 24, 57, 98, 126, 126, 148, 122, 112, 120, 86, 87, 69, 48, 29, 3]", - "total_badness": 2509.4805977 + "ne2d": 822, + "ne3d": 1279, + "quality_histogram": "[0, 0, 0, 0, 2, 14, 52, 81, 100, 116, 148, 146, 167, 114, 92, 74, 92, 44, 25, 12]", + "total_badness": 2305.3064983 }, { "ne1d": 240, - "ne2d": 1760, - "ne3d": 3853, - "quality_histogram": "[0, 0, 0, 0, 0, 0, 15, 29, 96, 198, 280, 418, 475, 513, 491, 435, 388, 290, 178, 47]", - "total_badness": 5821.5572222 + "ne2d": 1830, + "ne3d": 3870, + "quality_histogram": "[0, 0, 0, 0, 0, 2, 5, 29, 108, 195, 310, 445, 521, 478, 473, 425, 351, 292, 195, 41]", + "total_badness": 5884.7598106 }, { "ne1d": 320, - "ne2d": 2954, - "ne3d": 7952, - "quality_histogram": "[0, 0, 0, 0, 0, 1, 5, 37, 90, 213, 416, 639, 885, 1020, 1079, 1061, 987, 837, 540, 142]", - "total_badness": 11344.409226 + "ne2d": 3110, + "ne3d": 8269, + "quality_histogram": "[0, 0, 0, 0, 0, 1, 0, 24, 69, 199, 438, 654, 876, 1057, 1127, 1199, 1061, 888, 548, 128]", + "total_badness": 11704.49421 }, { "ne1d": 480, - "ne2d": 6588, - "ne3d": 32800, - "quality_histogram": "[0, 0, 0, 0, 0, 0, 1, 4, 36, 118, 313, 732, 1437, 2573, 4093, 5522, 6343, 6179, 4242, 1207]", - "total_badness": 41659.895413 + "ne2d": 6864, + "ne3d": 33003, + "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 5, 20, 80, 243, 674, 1446, 2651, 4133, 5647, 6385, 6118, 4423, 1178]", + "total_badness": 41802.827145 }, { "ne1d": 800, - "ne2d": 17344, - "ne3d": 200087, - "quality_histogram": "[0, 0, 0, 0, 0, 0, 2, 11, 50, 218, 615, 1690, 4420, 10233, 19967, 31844, 41733, 45345, 33688, 10271]", - "total_badness": 244872.84796 + "ne2d": 17934, + "ne3d": 201498, + "quality_histogram": "[0, 0, 0, 0, 0, 0, 1, 2, 44, 148, 603, 1656, 4364, 10078, 19992, 31915, 42284, 45543, 34094, 10774]", + "total_badness": 246262.93603 } ], "screw.step": [ { "ne1d": 400, - "ne2d": 1480, - "ne3d": 2653, - "quality_histogram": "[0, 0, 2, 0, 7, 16, 49, 76, 113, 180, 195, 247, 283, 319, 333, 301, 238, 173, 98, 23]", - "total_badness": 4292.3386321 + "ne2d": 1434, + "ne3d": 2427, + "quality_histogram": "[0, 0, 0, 0, 0, 1, 14, 92, 79, 162, 203, 243, 285, 278, 277, 276, 216, 178, 97, 26]", + "total_badness": 3828.4168327 }, { "ne1d": 530, - "ne2d": 2746, - "ne3d": 7958, - "quality_histogram": "[0, 2, 3, 3, 10, 18, 32, 54, 96, 165, 275, 406, 652, 829, 1094, 1281, 1241, 972, 658, 167]", - "total_badness": 11151.647682 + "ne2d": 2702, + "ne3d": 7966, + "quality_histogram": "[0, 0, 0, 0, 0, 0, 4, 8, 30, 75, 152, 297, 462, 754, 1064, 1384, 1434, 1253, 807, 242]", + "total_badness": 10467.778337 }, { "ne1d": 668, - "ne2d": 5056, - "ne3d": 31637, - "quality_histogram": "[0, 0, 0, 0, 3, 8, 7, 29, 45, 116, 211, 472, 962, 2036, 3514, 5090, 6534, 6520, 4661, 1429]", - "total_badness": 39550.048437 + "ne2d": 5008, + "ne3d": 31630, + "quality_histogram": "[0, 0, 0, 0, 0, 0, 2, 5, 20, 43, 129, 317, 796, 1773, 3387, 5061, 6627, 6931, 5011, 1528]", + "total_badness": 38978.120895 } ], "sculpture.geo": [ { "ne1d": 192, - "ne2d": 396, - "ne3d": 456, - "quality_histogram": "[0, 0, 0, 0, 0, 1, 1, 2, 10, 22, 37, 41, 52, 70, 77, 75, 41, 17, 9, 1]", - "total_badness": 693.76412329 + "ne2d": 414, + "ne3d": 475, + "quality_histogram": "[0, 0, 0, 0, 0, 0, 1, 2, 5, 17, 18, 32, 62, 64, 97, 98, 41, 25, 11, 2]", + "total_badness": 692.44104062 }, { "ne1d": 102, - "ne2d": 142, - "ne3d": 135, - "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 3, 3, 10, 14, 14, 18, 29, 21, 18, 3]", - "total_badness": 176.12964862 + "ne2d": 146, + "ne3d": 141, + "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 5, 11, 19, 19, 36, 29, 17, 2]", + "total_badness": 178.07603683 }, { "ne1d": 144, - "ne2d": 234, - "ne3d": 234, - "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 0, 1, 4, 8, 12, 11, 19, 36, 50, 41, 30, 20, 2]", - "total_badness": 314.37494393 + "ne2d": 250, + "ne3d": 263, + "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 0, 1, 3, 6, 7, 14, 24, 29, 53, 46, 49, 24, 7]", + "total_badness": 343.8094424 }, { "ne1d": 192, - "ne2d": 396, - "ne3d": 456, - "quality_histogram": "[0, 0, 0, 0, 0, 1, 1, 2, 10, 22, 37, 41, 52, 70, 77, 75, 41, 17, 9, 1]", - "total_badness": 693.76413573 + "ne2d": 414, + "ne3d": 475, + "quality_histogram": "[0, 0, 0, 0, 0, 0, 1, 2, 5, 17, 18, 32, 62, 64, 97, 98, 41, 25, 11, 2]", + "total_badness": 692.44104062 }, { "ne1d": 288, - "ne2d": 928, - "ne3d": 1247, - "quality_histogram": "[0, 0, 0, 0, 1, 2, 14, 34, 68, 68, 133, 144, 132, 125, 140, 135, 109, 67, 53, 22]", - "total_badness": 2003.8623066 + "ne2d": 962, + "ne3d": 1326, + "quality_histogram": "[0, 0, 0, 0, 0, 2, 6, 24, 53, 87, 122, 149, 125, 142, 117, 141, 144, 119, 80, 15]", + "total_badness": 2054.7475159 }, { "ne1d": 480, - "ne2d": 2310, - "ne3d": 6419, - "quality_histogram": "[0, 0, 0, 3, 6, 11, 18, 14, 20, 60, 89, 176, 293, 543, 879, 1085, 1182, 1071, 702, 267]", - "total_badness": 8393.0036926 + "ne2d": 2394, + "ne3d": 6791, + "quality_histogram": "[0, 0, 0, 0, 2, 3, 12, 10, 30, 33, 80, 135, 286, 503, 747, 1080, 1312, 1266, 984, 308]", + "total_badness": 8649.5978251 } ], "shaft.geo": [ { "ne1d": 708, - "ne2d": 1668, - "ne3d": 2420, - "quality_histogram": "[0, 0, 2, 0, 2, 5, 18, 35, 71, 156, 392, 338, 271, 271, 204, 255, 201, 106, 73, 20]", - "total_badness": 3933.8460804 + "ne2d": 1722, + "ne3d": 2757, + "quality_histogram": "[22, 11, 27, 30, 41, 40, 46, 62, 79, 140, 264, 373, 303, 274, 231, 291, 233, 179, 86, 25]", + "total_badness": 6328.6329226 }, { "ne1d": 410, - "ne2d": 580, - "ne3d": 841, - "quality_histogram": "[0, 0, 0, 0, 1, 3, 5, 14, 21, 34, 49, 54, 80, 99, 105, 104, 112, 100, 39, 21]", - "total_badness": 1241.4009871 + "ne2d": 606, + "ne3d": 933, + "quality_histogram": "[0, 0, 0, 0, 0, 1, 4, 1, 17, 25, 47, 58, 90, 116, 155, 146, 124, 96, 36, 17]", + "total_badness": 1336.5110795 }, { "ne1d": 510, - "ne2d": 968, - "ne3d": 1643, - "quality_histogram": "[0, 0, 4, 26, 41, 57, 73, 68, 102, 118, 144, 145, 167, 173, 158, 140, 125, 53, 36, 13]", - "total_badness": 3172.6008055 + "ne2d": 1004, + "ne3d": 2048, + "quality_histogram": "[11, 74, 88, 69, 81, 94, 99, 125, 99, 122, 96, 133, 133, 165, 190, 186, 163, 67, 45, 8]", + "total_badness": 5937.4200337 }, { "ne1d": 708, - "ne2d": 1668, - "ne3d": 2413, - "quality_histogram": "[0, 0, 0, 0, 0, 6, 12, 25, 57, 154, 394, 335, 291, 260, 206, 271, 199, 113, 72, 18]", - "total_badness": 3870.1528345 + "ne2d": 1722, + "ne3d": 2733, + "quality_histogram": "[6, 8, 10, 17, 29, 39, 34, 40, 80, 132, 254, 397, 302, 295, 238, 297, 250, 192, 88, 25]", + "total_badness": 4814.5951096 }, { "ne1d": 1138, - "ne2d": 4046, - "ne3d": 10795, - "quality_histogram": "[0, 0, 0, 0, 0, 1, 4, 17, 52, 135, 270, 441, 682, 1028, 1431, 1789, 1884, 1646, 1064, 351]", - "total_badness": 14312.868281 + "ne2d": 4220, + "ne3d": 11242, + "quality_histogram": "[0, 0, 0, 0, 0, 0, 2, 1, 27, 78, 178, 382, 607, 934, 1459, 1772, 2147, 1927, 1325, 403]", + "total_badness": 14539.392197 }, { "ne1d": 1792, - "ne2d": 10340, - "ne3d": 61826, - "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 4, 21, 94, 245, 701, 1655, 3629, 6683, 10068, 12847, 13004, 9674, 3201]", - "total_badness": 76334.81853 + "ne2d": 10600, + "ne3d": 63895, + "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 2, 18, 53, 198, 529, 1486, 3387, 6482, 10124, 13426, 13922, 10754, 3514]", + "total_badness": 78232.724768 } ], "sphere.geo": [ { "ne1d": 0, - "ne2d": 104, - "ne3d": 104, - "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 0, 3, 25, 41, 7, 6, 8, 2, 6, 3, 3, 0, 0]", - "total_badness": 189.21001627 + "ne2d": 126, + "ne3d": 126, + "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 0, 6, 25, 47, 33, 12, 1, 2, 0, 0, 0, 0, 0]", + "total_badness": 237.42979301 }, { "ne1d": 0, - "ne2d": 50, - "ne3d": 50, - "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 4, 12, 14, 14, 3, 0]", - "total_badness": 61.628499364 + "ne2d": 56, + "ne3d": 56, + "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 18, 19, 15, 0, 0]", + "total_badness": 68.826138928 }, { "ne1d": 0, - "ne2d": 66, - "ne3d": 66, - "quality_histogram": "[0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 2, 5, 12, 21, 5, 6, 7, 3, 0, 4]", - "total_badness": 96.358043846 + "ne2d": 72, + "ne3d": 72, + "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 14, 27, 22, 7, 0, 0, 0]", + "total_badness": 97.572347502 }, { "ne1d": 0, - "ne2d": 104, - "ne3d": 104, - "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 0, 3, 25, 41, 7, 6, 8, 2, 6, 3, 3, 0, 0]", - "total_badness": 189.21001627 + "ne2d": 126, + "ne3d": 126, + "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 0, 6, 25, 47, 33, 12, 1, 2, 0, 0, 0, 0, 0]", + "total_badness": 237.42979301 }, { "ne1d": 0, - "ne2d": 254, - "ne3d": 350, - "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 2, 8, 28, 47, 48, 43, 51, 47, 20, 20, 20, 10, 6]", - "total_badness": 555.65023551 + "ne2d": 258, + "ne3d": 366, + "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 1, 6, 22, 32, 55, 47, 62, 28, 39, 31, 22, 15, 6]", + "total_badness": 562.00749621 }, { "ne1d": 0, - "ne2d": 656, - "ne3d": 2286, - "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 0, 2, 1, 15, 37, 92, 152, 276, 397, 471, 429, 303, 111]", - "total_badness": 2868.3272967 + "ne2d": 660, + "ne3d": 2329, + "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 0, 1, 6, 10, 28, 76, 158, 282, 415, 502, 433, 327, 91]", + "total_badness": 2913.3426209 } ], "sphereincube.geo": [ { "ne1d": 46, - "ne2d": 182, - "ne3d": 452, - "quality_histogram": "[0, 0, 11, 60, 38, 40, 63, 53, 49, 26, 30, 21, 11, 11, 14, 14, 5, 2, 4, 0]", - "total_badness": 1421.7705054 + "ne2d": 202, + "ne3d": 490, + "quality_histogram": "[0, 0, 8, 59, 42, 29, 53, 45, 55, 46, 33, 14, 16, 11, 15, 12, 12, 24, 11, 5]", + "total_badness": 1429.7083119 }, { "ne1d": 24, "ne2d": 60, - "ne3d": 167, - "quality_histogram": "[0, 0, 8, 15, 17, 13, 17, 7, 5, 4, 5, 6, 9, 7, 12, 11, 11, 9, 11, 0]", - "total_badness": 475.36379061 + "ne3d": 166, + "quality_histogram": "[0, 0, 5, 12, 14, 15, 31, 10, 2, 1, 3, 2, 7, 9, 13, 13, 15, 9, 4, 1]", + "total_badness": 454.94795255 }, { "ne1d": 30, - "ne2d": 98, - "ne3d": 271, - "quality_histogram": "[0, 2, 11, 18, 20, 32, 35, 31, 21, 28, 19, 13, 9, 10, 14, 2, 4, 1, 1, 0]", - "total_badness": 830.84203375 + "ne2d": 116, + "ne3d": 345, + "quality_histogram": "[0, 0, 5, 24, 43, 41, 26, 26, 38, 32, 20, 18, 24, 14, 8, 9, 5, 7, 4, 1]", + "total_badness": 988.81847916 }, { "ne1d": 46, - "ne2d": 182, - "ne3d": 453, - "quality_histogram": "[0, 0, 10, 45, 33, 33, 50, 45, 60, 34, 36, 36, 15, 15, 14, 15, 6, 2, 4, 0]", - "total_badness": 1318.0366276 + "ne2d": 202, + "ne3d": 498, + "quality_histogram": "[0, 0, 8, 41, 27, 29, 50, 44, 55, 58, 44, 25, 20, 15, 14, 15, 13, 24, 11, 5]", + "total_badness": 1326.92489 }, { "ne1d": 74, - "ne2d": 390, - "ne3d": 1611, - "quality_histogram": "[0, 0, 0, 0, 1, 8, 12, 13, 26, 44, 101, 132, 188, 206, 230, 237, 187, 121, 73, 32]", - "total_badness": 2385.1746327 + "ne2d": 418, + "ne3d": 1788, + "quality_histogram": "[0, 0, 0, 0, 0, 6, 6, 21, 28, 38, 73, 98, 167, 213, 251, 273, 258, 200, 112, 44]", + "total_badness": 2540.547751 }, { "ne1d": 122, - "ne2d": 1042, - "ne3d": 13375, - "quality_histogram": "[0, 0, 0, 0, 0, 0, 4, 5, 25, 58, 132, 275, 532, 955, 1526, 2092, 2698, 2651, 1866, 556]", - "total_badness": 16888.449659 + "ne2d": 1082, + "ne3d": 14039, + "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 1, 5, 31, 105, 218, 465, 893, 1497, 2202, 2857, 2912, 2179, 674]", + "total_badness": 17464.78638 } ], "torus.geo": [ { "ne1d": 0, - "ne2d": 2508, - "ne3d": 5657, - "quality_histogram": "[0, 0, 0, 0, 2, 10, 32, 78, 156, 274, 498, 598, 770, 767, 731, 613, 526, 367, 172, 63]", - "total_badness": 8749.7305986 + "ne2d": 2534, + "ne3d": 5745, + "quality_histogram": "[0, 0, 0, 0, 0, 4, 19, 59, 148, 286, 440, 581, 679, 796, 742, 668, 583, 418, 238, 84]", + "total_badness": 8709.4458795 }, { "ne1d": 0, - "ne2d": 660, - "ne3d": 2886, - "quality_histogram": "[117, 543, 423, 314, 289, 218, 194, 135, 146, 121, 112, 70, 62, 41, 40, 25, 12, 12, 11, 1]", - "total_badness": 19763.210938 + "ne2d": 692, + "ne3d": 3181, + "quality_histogram": "[166, 714, 477, 367, 312, 232, 199, 167, 108, 100, 92, 66, 48, 39, 30, 27, 18, 13, 6, 0]", + "total_badness": 24641.250872 }, { "ne1d": 0, - "ne2d": 1424, - "ne3d": 2673, - "quality_histogram": "[0, 0, 0, 0, 0, 0, 3, 6, 32, 92, 182, 315, 348, 414, 365, 343, 262, 166, 117, 28]", - "total_badness": 3963.6416021 + "ne2d": 1446, + "ne3d": 2743, + "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 3, 14, 62, 135, 247, 356, 403, 430, 384, 298, 200, 152, 59]", + "total_badness": 3928.1549928 }, { "ne1d": 0, - "ne2d": 2508, - "ne3d": 5476, - "quality_histogram": "[0, 0, 0, 0, 0, 0, 9, 34, 74, 197, 375, 566, 685, 791, 755, 684, 546, 453, 238, 69]", - "total_badness": 8099.109234 + "ne2d": 2534, + "ne3d": 5584, + "quality_histogram": "[0, 0, 0, 0, 0, 0, 1, 27, 78, 171, 346, 509, 649, 760, 771, 771, 646, 472, 283, 100]", + "total_badness": 8111.5941443 }, { "ne1d": 0, - "ne2d": 5842, - "ne3d": 24278, - "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 6, 22, 74, 224, 573, 1134, 1971, 3110, 4129, 4763, 4456, 2976, 840]", - "total_badness": 30936.500907 + "ne2d": 5894, + "ne3d": 25294, + "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 1, 9, 32, 149, 417, 947, 1723, 2990, 4145, 5146, 5002, 3604, 1129]", + "total_badness": 31642.969488 }, { "ne1d": 0, - "ne2d": 16146, - "ne3d": 174106, - "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 3, 39, 156, 448, 1266, 3517, 8397, 16897, 27428, 36623, 40129, 29926, 9277]", - "total_badness": 212310.14221 + "ne2d": 16296, + "ne3d": 175351, + "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 7, 36, 115, 401, 1106, 3230, 8059, 16480, 27460, 37219, 40628, 30958, 9652]", + "total_badness": 213157.95506 } ], "trafo.geo": [ { "ne1d": 690, - "ne2d": 1646, - "ne3d": 5126, - "quality_histogram": "[1, 4, 2, 3, 5, 29, 53, 90, 147, 211, 320, 377, 471, 594, 643, 655, 546, 442, 421, 112]", - "total_badness": 7799.7835055 + "ne2d": 1684, + "ne3d": 5231, + "quality_histogram": "[0, 2, 2, 2, 8, 24, 37, 50, 114, 203, 267, 363, 472, 583, 649, 706, 623, 527, 462, 137]", + "total_badness": 7683.599832 }, { "ne1d": 390, - "ne2d": 520, - "ne3d": 1346, - "quality_histogram": "[0, 0, 7, 14, 33, 25, 63, 120, 124, 153, 167, 155, 137, 114, 92, 67, 31, 21, 22, 1]", - "total_badness": 2774.32686 + "ne2d": 522, + "ne3d": 1353, + "quality_histogram": "[0, 0, 3, 17, 15, 42, 75, 123, 130, 146, 161, 124, 147, 105, 84, 88, 47, 33, 11, 2]", + "total_badness": 2768.022266 }, { "ne1d": 512, - "ne2d": 860, - "ne3d": 2371, - "quality_histogram": "[0, 0, 1, 3, 11, 26, 63, 72, 159, 180, 212, 248, 278, 290, 285, 262, 140, 47, 57, 37]", - "total_badness": 4066.6122044 + "ne2d": 874, + "ne3d": 2397, + "quality_histogram": "[0, 0, 1, 3, 9, 23, 41, 72, 132, 142, 188, 204, 304, 389, 343, 237, 138, 97, 48, 26]", + "total_badness": 3983.5650135 }, { "ne1d": 690, - "ne2d": 1646, - "ne3d": 5032, - "quality_histogram": "[0, 0, 1, 1, 3, 24, 33, 83, 142, 202, 307, 347, 451, 584, 623, 688, 546, 455, 430, 112]", - "total_badness": 7479.98992 + "ne2d": 1684, + "ne3d": 5147, + "quality_histogram": "[0, 0, 0, 1, 3, 12, 26, 40, 106, 188, 272, 357, 422, 561, 671, 714, 608, 558, 474, 134]", + "total_badness": 7408.6135626 }, { "ne1d": 1050, - "ne2d": 3712, - "ne3d": 17405, - "quality_histogram": "[0, 0, 0, 0, 1, 0, 8, 32, 53, 107, 255, 624, 1664, 2121, 2356, 2568, 2554, 2462, 1933, 667]", - "total_badness": 23080.231635 + "ne2d": 3812, + "ne3d": 18010, + "quality_histogram": "[0, 0, 0, 0, 0, 0, 4, 29, 42, 57, 198, 540, 1405, 2251, 2392, 2790, 2784, 2612, 2242, 664]", + "total_badness": 23560.24016 }, { "ne1d": 1722, - "ne2d": 9850, - "ne3d": 83872, - "quality_histogram": "[0, 0, 0, 1, 3, 7, 107, 1446, 645, 540, 977, 1757, 3237, 6101, 9524, 13281, 15629, 15661, 11299, 3657]", - "total_badness": 109051.31473 + "ne2d": 10042, + "ne3d": 84690, + "quality_histogram": "[0, 0, 0, 0, 2, 3, 54, 1424, 754, 408, 795, 1316, 2637, 5766, 9155, 13453, 16224, 16583, 12169, 3947]", + "total_badness": 108937.41902 } ], "twobricks.geo": [ @@ -1384,17 +1370,17 @@ }, { "ne1d": 116, - "ne2d": 124, - "ne3d": 159, - "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 5, 14, 26, 22, 29, 20, 18, 9, 9, 5]", - "total_badness": 225.25116924 + "ne2d": 134, + "ne3d": 177, + "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 12, 10, 18, 38, 22, 27, 22, 18, 7]", + "total_badness": 234.47359 }, { "ne1d": 186, - "ne2d": 308, - "ne3d": 526, - "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 0, 1, 4, 12, 26, 59, 56, 79, 97, 76, 65, 43, 8]", - "total_badness": 709.96091399 + "ne2d": 346, + "ne3d": 603, + "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 10, 25, 42, 66, 89, 101, 110, 93, 56, 10]", + "total_badness": 792.88605666 } ], "twocubes.geo": [ @@ -1428,61 +1414,61 @@ }, { "ne1d": 116, - "ne2d": 124, - "ne3d": 159, - "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 5, 14, 26, 22, 29, 20, 18, 9, 9, 5]", - "total_badness": 225.25116924 + "ne2d": 134, + "ne3d": 177, + "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 12, 10, 18, 38, 22, 27, 22, 18, 7]", + "total_badness": 234.47359 }, { "ne1d": 186, - "ne2d": 308, - "ne3d": 526, - "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 0, 1, 4, 12, 26, 59, 56, 79, 97, 76, 65, 43, 8]", - "total_badness": 709.96091399 + "ne2d": 346, + "ne3d": 603, + "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 10, 25, 42, 66, 89, 101, 110, 93, 56, 10]", + "total_badness": 792.88605666 } ], "twocyl.geo": [ { "ne1d": 144, - "ne2d": 402, - "ne3d": 535, - "quality_histogram": "[0, 0, 0, 0, 0, 1, 5, 11, 23, 31, 51, 49, 74, 70, 65, 60, 43, 39, 11, 2]", - "total_badness": 848.77250581 + "ne2d": 408, + "ne3d": 576, + "quality_histogram": "[0, 0, 0, 0, 0, 2, 12, 19, 19, 17, 36, 50, 59, 82, 90, 73, 69, 34, 13, 1]", + "total_badness": 901.75131743 }, { "ne1d": 68, "ne2d": 100, - "ne3d": 188, - "quality_histogram": "[0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 6, 14, 23, 27, 28, 25, 22, 28, 8, 0]", - "total_badness": 267.41201716 + "ne3d": 209, + "quality_histogram": "[0, 0, 0, 1, 3, 6, 11, 2, 8, 5, 15, 18, 12, 28, 28, 27, 24, 17, 3, 1]", + "total_badness": 357.15447323 }, { "ne1d": 102, - "ne2d": 234, - "ne3d": 540, - "quality_histogram": "[0, 14, 30, 32, 40, 40, 55, 59, 43, 38, 24, 29, 26, 16, 25, 15, 39, 4, 11, 0]", - "total_badness": 1706.6298917 + "ne2d": 238, + "ne3d": 548, + "quality_histogram": "[5, 24, 23, 35, 33, 46, 49, 52, 63, 39, 19, 20, 19, 22, 19, 24, 40, 14, 2, 0]", + "total_badness": 1932.6124156 }, { "ne1d": 144, - "ne2d": 402, - "ne3d": 534, - "quality_histogram": "[0, 0, 0, 0, 0, 2, 4, 10, 19, 26, 44, 53, 82, 67, 66, 64, 41, 40, 13, 3]", - "total_badness": 838.16101585 + "ne2d": 408, + "ne3d": 576, + "quality_histogram": "[0, 0, 0, 0, 0, 0, 4, 12, 10, 12, 24, 41, 69, 88, 108, 88, 65, 40, 13, 2]", + "total_badness": 853.37034747 }, { "ne1d": 214, - "ne2d": 900, - "ne3d": 1820, - "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 0, 3, 15, 43, 103, 172, 235, 307, 303, 304, 187, 120, 28]", - "total_badness": 2474.9963091 + "ne2d": 910, + "ne3d": 1921, + "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 0, 1, 9, 33, 75, 117, 230, 320, 358, 348, 243, 159, 28]", + "total_badness": 2544.8927759 }, { "ne1d": 350, - "ne2d": 2336, - "ne3d": 13150, - "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 0, 2, 10, 38, 121, 325, 712, 1379, 2153, 2848, 2841, 2058, 663]", - "total_badness": 16159.006532 + "ne2d": 2374, + "ne3d": 13509, + "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 0, 2, 11, 29, 98, 286, 655, 1353, 2161, 2913, 3068, 2220, 713]", + "total_badness": 16499.785789 } ] } \ No newline at end of file diff --git a/tests/pytest/test_tutorials.py b/tests/pytest/test_tutorials.py index bb3be546..32d53d50 100644 --- a/tests/pytest/test_tutorials.py +++ b/tests/pytest/test_tutorials.py @@ -58,6 +58,10 @@ def getMeshingparameters(filename): return standard[:3] # this gets too big for finer meshsizes if filename == "screw.step": return standard[3:] # coarser meshes don't work here + if filename == "cylsphere.geo": + return standard[0:2] + standard[3:] # coarse gives inconsistent reults (other mesh on MacOS) + if filename == "part1.stl": + return standard[0:1] + standard[2:] # very coarse does not work return standard _geofiles = [f for f in getFiles(".geo")] + [f for f in getFiles(".stl")]