diff --git a/libsrc/core/python_ngcore.hpp b/libsrc/core/python_ngcore.hpp index bf78fe59..79c91885 100644 --- a/libsrc/core/python_ngcore.hpp +++ b/libsrc/core/python_ngcore.hpp @@ -156,165 +156,7 @@ namespace ngcore { return std::string("sp_")+GetPyName(); } }; - template - Array makeCArray(const py::object& obj) - { - Array arr; - if(py::isinstance(obj)) - for(auto& val : py::cast(obj)) - arr.Append(py::cast(val)); - else if(py::isinstance(obj)) - for(auto& val : py::cast(obj)) - arr.Append(py::cast(val)); - else - throw py::type_error("Cannot convert Python object to C Array"); - return arr; - } - - template ::index_type> - void ExportArray (py::module &m) - { - using TFlat = FlatArray; - using TArray = Array; - std::string suffix = GetPyName() + "_" + - GetPyName(); - std::string fname = std::string("FlatArray_") + suffix; - auto flatarray_class = py::class_(m, fname.c_str(), - py::buffer_protocol()) - .def ("__len__", [] ( TFlat &self ) { return self.Size(); } ) - .def ("__getitem__", - [](TFlat & self, TIND i) -> T& - { - static constexpr int base = IndexBASE(); - if (i < base || i >= self.Size()+base) - throw py::index_error(); - return self[i]; - }, - py::return_value_policy::reference) - .def ("__setitem__", - [](TFlat & self, TIND i, T val) -> T& - { - static constexpr int base = IndexBASE(); - if (i < base || i >= self.Size()+base) - throw py::index_error(); - self[i] = val; - return self[i]; - }, - py::return_value_policy::reference) - - .def ("__setitem__", - [](TFlat & self, py::slice slice, T val) - { - size_t start, stop, step, slicelength; - if (!slice.compute(self.Size(), &start, &stop, &step, &slicelength)) - throw py::error_already_set(); - static constexpr int base = IndexBASE(); - if (start < base || start+(slicelength-1)*step >= self.Size()+base) - throw py::index_error(); - for (size_t i = 0; i < slicelength; i++, start+=step) - self[start] = val; - }) - - .def("__iter__", [] ( TFlat & self) { - return py::make_iterator (self.begin(),self.end()); - }, py::keep_alive<0,1>()) // keep array alive while iterator is used - - .def("__str__", [](TFlat& self) - { - return ToString(self); - }) - ; - - if constexpr (detail::HasPyFormat::value) - { - if(ngcore_have_numpy && !py::detail::npy_format_descriptor::dtype().is_none()) - { - flatarray_class - .def_buffer([](TFlat& self) - { - return py::buffer_info( - self.Addr(0), - sizeof(T), - py::format_descriptor::format(), - 1, - { self.Size() }, - { sizeof(T) * (self.Addr(1) - self.Addr(0)) }); - }) - .def("NumPy", [](py::object self) - { - return py::module::import("numpy") - .attr("frombuffer")(self, py::detail::npy_format_descriptor::dtype()); - }) - ; - } - } - - std::string aname = std::string("Array_") + suffix; - py::class_(m, aname.c_str()) - .def(py::init([] (size_t n) { return new TArray(n); }),py::arg("n"), "Makes array of given length") - .def(py::init([] (std::vector const & x) - { - size_t s = x.size(); - TArray tmp(s); - for (size_t i : Range(tmp)) - tmp[TIND(i)] = x[i]; - return tmp; - }), py::arg("vec"), "Makes array with given list of elements") - - ; - py::implicitly_convertible, TArray>(); - } - - template - void ExportTable (py::module &m) - { - py::class_, std::shared_ptr>> (m, ("Table_"+GetPyName()).c_str()) - .def(py::init([] (py::list blocks) - { - size_t size = py::len(blocks); - Array cnt(size); - size_t i = 0; - for (auto block : blocks) - cnt[i++] = py::len(block); - - i = 0; - Table blocktable(cnt); - for (auto block : blocks) - { - auto row = blocktable[i++]; - size_t j = 0; - for (auto val : block) - row[j++] = val.cast(); - } - // cout << "blocktable = " << *blocktable << endl; - return blocktable; - - }), py::arg("blocks"), "a list of lists") - - .def ("__len__", [] (Table &self ) { return self.Size(); } ) - .def ("__getitem__", - [](Table & self, size_t i) -> FlatArray - { - if (i >= self.Size()) - throw py::index_error(); - return self[i]; - }) - .def("__str__", [](Table & self) - { - return ToString(self); - }) - ; - } - - - void NGCORE_API SetFlag(Flags &flags, std::string s, py::object value); - // Parse python kwargs to flags - Flags NGCORE_API CreateFlagsFromKwArgs(const py::kwargs& kwargs, py::object pyclass = py::none(), - py::list info = py::list()); - // Create python dict from kwargs - py::dict NGCORE_API CreateDictFromFlags(const Flags& flags); - - // *************** Archiving functionality ************** + // *************** Archiving functionality ************** template Archive& Archive :: Shallow(T& val) @@ -429,6 +271,165 @@ namespace ngcore }); } + template + Array makeCArray(const py::object& obj) + { + Array arr; + if(py::isinstance(obj)) + for(auto& val : py::cast(obj)) + arr.Append(py::cast(val)); + else if(py::isinstance(obj)) + for(auto& val : py::cast(obj)) + arr.Append(py::cast(val)); + else + throw py::type_error("Cannot convert Python object to C Array"); + return arr; + } + + template ::index_type> + void ExportArray (py::module &m) + { + using TFlat = FlatArray; + using TArray = Array; + std::string suffix = GetPyName() + "_" + + GetPyName(); + std::string fname = std::string("FlatArray_") + suffix; + auto flatarray_class = py::class_(m, fname.c_str(), + py::buffer_protocol()) + .def ("__len__", [] ( TFlat &self ) { return self.Size(); } ) + .def ("__getitem__", + [](TFlat & self, TIND i) -> T& + { + static constexpr int base = IndexBASE(); + if (i < base || i >= self.Size()+base) + throw py::index_error(); + return self[i]; + }, + py::return_value_policy::reference) + .def ("__setitem__", + [](TFlat & self, TIND i, T val) -> T& + { + static constexpr int base = IndexBASE(); + if (i < base || i >= self.Size()+base) + throw py::index_error(); + self[i] = val; + return self[i]; + }, + py::return_value_policy::reference) + + .def ("__setitem__", + [](TFlat & self, py::slice slice, T val) + { + size_t start, stop, step, slicelength; + if (!slice.compute(self.Size(), &start, &stop, &step, &slicelength)) + throw py::error_already_set(); + static constexpr int base = IndexBASE(); + if (start < base || start+(slicelength-1)*step >= self.Size()+base) + throw py::index_error(); + for (size_t i = 0; i < slicelength; i++, start+=step) + self[start] = val; + }) + + .def("__iter__", [] ( TFlat & self) { + return py::make_iterator (self.begin(),self.end()); + }, py::keep_alive<0,1>()) // keep array alive while iterator is used + + .def("__str__", [](TFlat& self) + { + return ToString(self); + }) + ; + + if constexpr (detail::HasPyFormat::value) + { + if(ngcore_have_numpy && !py::detail::npy_format_descriptor::dtype().is_none()) + { + flatarray_class + .def_buffer([](TFlat& self) + { + return py::buffer_info( + self.Addr(0), + sizeof(T), + py::format_descriptor::format(), + 1, + { self.Size() }, + { sizeof(T) * (self.Addr(1) - self.Addr(0)) }); + }) + .def("NumPy", [](py::object self) + { + return py::module::import("numpy") + .attr("frombuffer")(self, py::detail::npy_format_descriptor::dtype()); + }) + ; + } + } + + std::string aname = std::string("Array_") + suffix; + auto arr = py::class_ (m, aname.c_str()) + .def(py::init([] (size_t n) { return new TArray(n); }),py::arg("n"), "Makes array of given length") + .def(py::init([] (std::vector const & x) + { + size_t s = x.size(); + TArray tmp(s); + for (size_t i : Range(tmp)) + tmp[TIND(i)] = x[i]; + return tmp; + }), py::arg("vec"), "Makes array with given list of elements") + ; + if constexpr(is_archivable) + arr.def(NGSPickle()); + py::implicitly_convertible, TArray>(); + } + + template + void ExportTable (py::module &m) + { + py::class_, std::shared_ptr>> (m, ("Table_"+GetPyName()).c_str()) + .def(py::init([] (py::list blocks) + { + size_t size = py::len(blocks); + Array cnt(size); + size_t i = 0; + for (auto block : blocks) + cnt[i++] = py::len(block); + + i = 0; + Table blocktable(cnt); + for (auto block : blocks) + { + auto row = blocktable[i++]; + size_t j = 0; + for (auto val : block) + row[j++] = val.cast(); + } + // cout << "blocktable = " << *blocktable << endl; + return blocktable; + + }), py::arg("blocks"), "a list of lists") + + .def ("__len__", [] (Table &self ) { return self.Size(); } ) + .def ("__getitem__", + [](Table & self, size_t i) -> FlatArray + { + if (i >= self.Size()) + throw py::index_error(); + return self[i]; + }) + .def("__str__", [](Table & self) + { + return ToString(self); + }) + ; + } + + + void NGCORE_API SetFlag(Flags &flags, std::string s, py::object value); + // Parse python kwargs to flags + Flags NGCORE_API CreateFlagsFromKwArgs(const py::kwargs& kwargs, py::object pyclass = py::none(), + py::list info = py::list()); + // Create python dict from kwargs + py::dict NGCORE_API CreateDictFromFlags(const Flags& flags); + } // namespace ngcore diff --git a/libsrc/core/simd_arm64.hpp b/libsrc/core/simd_arm64.hpp index 13f57b14..9b22c36a 100644 --- a/libsrc/core/simd_arm64.hpp +++ b/libsrc/core/simd_arm64.hpp @@ -42,6 +42,7 @@ namespace ngcore SIMD (const SIMD &) = default; // SIMD (double v0, double v1) : data{v0,v1} { } SIMD (double v0, double v1) : data{vcombine_f64(float64x1_t{v0}, float64x1_t{v1})} { } + SIMD (SIMD v0, SIMD v1) : data{vcombine_f64(float64x1_t{v0.Data()}, float64x1_t{v1.Data()})} { } SIMD (std::array arr) : data{arr[0], arr[1]} { } SIMD & operator= (const SIMD &) = default; diff --git a/libsrc/core/simd_avx.hpp b/libsrc/core/simd_avx.hpp index c34c15aa..047c020a 100644 --- a/libsrc/core/simd_avx.hpp +++ b/libsrc/core/simd_avx.hpp @@ -143,8 +143,6 @@ namespace ngcore NETGEN_INLINE double & operator[] (int i) { return ((double*)(&data))[i]; } // [[deprecated("don't write to individual elements of SIMD")]] // NETGEN_INLINE double & operator[] (int i) { return ((double*)(&data))[i]; } - template - double Get() const { return ((double*)(&data))[I]; } NETGEN_INLINE __m256d Data() const { return data; } NETGEN_INLINE __m256d & Data() { return data; } @@ -153,6 +151,13 @@ namespace ngcore operator std::tuple () { return std::tuple((*this)[0], (*this)[1], (*this)[2], (*this)[3]); } + + template + double Get() const + { + static_assert(I>=0 && I<4, "Index out of range"); + return (*this)[I]; + } }; NETGEN_INLINE auto Unpack (SIMD a, SIMD b) diff --git a/libsrc/core/simd_avx512.hpp b/libsrc/core/simd_avx512.hpp index bf57f4e1..8db24cd7 100644 --- a/libsrc/core/simd_avx512.hpp +++ b/libsrc/core/simd_avx512.hpp @@ -92,6 +92,12 @@ namespace ngcore SIMD (double const * p, SIMD mask) { data = _mm512_mask_loadu_pd(_mm512_setzero_pd(), mask.Data(), p); } SIMD (__m512d _data) { data = _data; } + SIMD (SIMD v0, SIMD v1) + : data(_mm512_set_pd(v1[3], v1[2], v1[1], v1[0], v0[3], v0[2], v0[1], v0[0])) + {} + SIMD (SIMD v0, SIMD v1) + : data(_mm512_set_pd(v1[1], v1[0], v0[5], v0[4], v0[3], v0[2], v0[1], v0[0])) + {} template>::value, int>::type = 0> SIMD (const T & func) @@ -129,6 +135,12 @@ namespace ngcore NETGEN_INLINE __m512d Data() const { return data; } NETGEN_INLINE __m512d & Data() { return data; } + template + double Get() const + { + static_assert(I>=0 && I<8, "Index out of range"); + return (*this)[I]; + } }; NETGEN_INLINE SIMD operator- (SIMD a) { return -a.Data(); } diff --git a/libsrc/core/simd_generic.hpp b/libsrc/core/simd_generic.hpp index c9cdcc59..5b3870b7 100644 --- a/libsrc/core/simd_generic.hpp +++ b/libsrc/core/simd_generic.hpp @@ -28,6 +28,28 @@ namespace ngcore #endif } + constexpr bool IsNativeSIMDSize(int n) { + if(n==1) return true; +#if defined NETGEN_ARCH_AMD64 || defined __SSE__ || defined __aarch64__ + if(n==2) return true; +#endif +#if defined __AVX__ + if(n==4) return true; +#endif +#if defined __AVX512F__ + if(n==8) return true; +#endif + return false; + } + + // split n = k+l such that k is the largest natively supported simd size < n + constexpr int GetLargestNativeSIMDPart(int n) { + int k = n-1; + while(!IsNativeSIMDSize(k)) + k--; + return k; + } + template class SIMD; @@ -67,9 +89,9 @@ namespace ngcore template - class alignas(GetDefaultSIMDSize()*sizeof(int64_t)) SIMD + class alignas(GetLargestNativeSIMDPart(N)*sizeof(int64_t)) SIMD { - static constexpr int N1 = std::min(GetDefaultSIMDSize(), N/2); + static constexpr int N1 = GetLargestNativeSIMDPart(N); static constexpr int N2 = N-N1; SIMD lo; @@ -123,9 +145,9 @@ namespace ngcore }; template - class alignas(GetDefaultSIMDSize()*sizeof(int64_t)) SIMD + class alignas(GetLargestNativeSIMDPart(N)*sizeof(int64_t)) SIMD { - static constexpr int N1 = std::min(GetDefaultSIMDSize(), N/2); + static constexpr int N1 = GetLargestNativeSIMDPart(N); static constexpr int N2 = N-N1; SIMD lo; @@ -240,9 +262,9 @@ namespace ngcore template - class alignas(GetDefaultSIMDSize()*sizeof(double)) SIMD + class alignas(GetLargestNativeSIMDPart(N)*sizeof(double)) SIMD { - static constexpr int N1 = std::min(GetDefaultSIMDSize(), N/2); + static constexpr int N1 = GetLargestNativeSIMDPart(N); static constexpr int N2 = N-N1; SIMD lo; @@ -543,7 +565,7 @@ namespace ngcore template - T get(SIMD a) { return a[i]; } + T get(SIMD a) { return a.template Get(); } template NETGEN_INLINE void Iterate2 (FUNC f) diff --git a/libsrc/core/simd_sse.hpp b/libsrc/core/simd_sse.hpp index b6f9c61e..a7060290 100644 --- a/libsrc/core/simd_sse.hpp +++ b/libsrc/core/simd_sse.hpp @@ -86,6 +86,9 @@ NETGEN_INLINE SIMD operator- (SIMD a, SIMD b) { SIMD () {} SIMD (const SIMD &) = default; SIMD (double v0, double v1) { data = _mm_set_pd(v1,v0); } + SIMD (SIMD v0, SIMD v1) + : data{_mm_set_pd(v0.Data(), v1.Data())} + { } SIMD (std::array arr) : data{_mm_set_pd(arr[1], arr[0])} {} @@ -137,6 +140,13 @@ NETGEN_INLINE SIMD operator- (SIMD a, SIMD b) { NETGEN_INLINE __m128d Data() const { return data; } NETGEN_INLINE __m128d & Data() { return data; } + template + double Get() + { + static_assert(I>=0 && I<2, "Index out of range"); + return (*this)[I]; + } + operator std::tuple () { auto pdata = (double*)&data; diff --git a/libsrc/meshing/boundarylayer.cpp b/libsrc/meshing/boundarylayer.cpp index d552bc24..449585f8 100644 --- a/libsrc/meshing/boundarylayer.cpp +++ b/libsrc/meshing/boundarylayer.cpp @@ -696,8 +696,6 @@ namespace netgen else if(const auto& fd = mesh.GetFaceDescriptor(segj.si); !domains.Test(fd.DomainIn()) && !domains.Test(fd.DomainOut())) { type = 3; - if(fd.DomainIn() == 0 || fd.DomainOut() == 0) - is_boundary_projected.SetBit(segj.si); is_boundary_moved.SetBit(segj.si); } else @@ -742,6 +740,8 @@ namespace netgen else continue; + if(!params.project_boundaries.Contains(sel.GetIndex())) + continue; auto& g = growthvectors[pi]; auto ng = n * g; auto gg = g * g; @@ -818,11 +818,22 @@ namespace netgen point_found = true; break; } + else if(seg[1] == points.Last() && + points[points.Size()-2] != seg[0]) + { + edge_len += (mesh[points.Last()] - mesh[seg[0]]).Length(); + points.Append(seg[0]); + point_found = true; + break; + } } if(is_end_point(points.Last())) break; if(!point_found) - throw Exception(string("Could not find connected list of line segments for edge ") + edgenr); + { + cout << "points = " << points << endl; + throw Exception(string("Could not find connected list of line segments for edge ") + edgenr); + } } // tangential part of growth vectors diff --git a/libsrc/meshing/improve2.cpp b/libsrc/meshing/improve2.cpp index c0431746..b215bfd7 100644 --- a/libsrc/meshing/improve2.cpp +++ b/libsrc/meshing/improve2.cpp @@ -145,7 +145,7 @@ namespace netgen } else { - double loch = mesh.GetH(mesh[pi1]); + double loch = 0.25*(mesh.GetH(pi1) + mesh.GetH(pi2) + mesh.GetH(pi3) + mesh.GetH(pi4)); should = CalcTriangleBadness (mesh[pi4], mesh[pi3], mesh[pi1], metricweight, loch) + CalcTriangleBadness (mesh[pi3], mesh[pi4], mesh[pi2], metricweight, loch) < @@ -383,21 +383,10 @@ namespace netgen << "pi1 = " << pi1 << " pi2 = " << pi2 << endl; } - /* - // save version: - if (fixed.Get(pi1) || fixed.Get(pi2)) - return 0.0; - if (pi2 < pi1) swap (pi1, pi2); - */ - - // more general - if (fixed[pi2]) - Swap (pi1, pi2); - if (fixed[pi2]) return 0.0; - double loch = mesh.GetH (mesh[pi1]); + double loch = 0.5*(mesh.GetH(pi1) + mesh.GetH(pi2)); int faceindex = -1; for (SurfaceElementIndex sei2 : elementsonnode[pi1]) @@ -655,6 +644,9 @@ namespace netgen double d_badness = CombineImproveEdge(mesh, elementsonnode, normals, fixed, pi1, pi2, metricweight, true); if(d_badness < 0.0) candidate_edges[improvement_counter++] = make_tuple(d_badness, i); + d_badness = CombineImproveEdge(mesh, elementsonnode, normals, fixed, pi2, pi1, metricweight, true); + if(d_badness < 0.0) + candidate_edges[improvement_counter++] = make_tuple(d_badness, -i); }, TasksPerThread(4)); auto edges_with_improvement = candidate_edges.Part(0, improvement_counter.load()); @@ -662,7 +654,9 @@ namespace netgen for(auto [d_badness, ei] : edges_with_improvement) { - auto [pi1, pi2] = edges[ei]; + auto [pi1, pi2] = edges[ei < 0 ? -ei : ei]; + if(ei<0) + Swap(pi1,pi2); CombineImproveEdge(mesh, elementsonnode, normals, fixed, pi1, pi2, metricweight, false); } diff --git a/libsrc/meshing/improve3.cpp b/libsrc/meshing/improve3.cpp index 80e60545..9ae4bbb7 100644 --- a/libsrc/meshing/improve3.cpp +++ b/libsrc/meshing/improve3.cpp @@ -273,251 +273,6 @@ double MeshOptimize3d :: CombineImproveEdge (Mesh & mesh, return d_badness; } -void MeshOptimize3d :: CombineImproveSequential (Mesh & mesh, - OPTIMIZEGOAL goal) -{ - static Timer t("MeshOptimize3d::CombineImprove"); RegionTimer reg(t); - - int np = mesh.GetNP(); - int ne = mesh.GetNE(); - - TABLE elementsonnode(np); - NgArray hasonepi, hasbothpi; - - NgArray oneperr; - NgArray elerrs (ne); - - PrintMessage (3, "CombineImprove"); - (*testout) << "Start CombineImprove" << "\n"; - - // mesh.CalcSurfacesOfNode (); - const char * savetask = multithread.task; - multithread.task = "Optimize Volume: Combine Improve"; - - - double totalbad = 0; - for (ElementIndex ei = 0; ei < ne; ei++) - { - if(mesh.GetDimension()==3 && mp.only3D_domain_nr && mp.only3D_domain_nr != mesh[ei].GetIndex()) - continue; - double elerr = CalcBad (mesh.Points(), mesh[ei], 0); - totalbad += elerr; - elerrs[ei] = elerr; - } - - if (goal == OPT_QUALITY) - { - totalbad = mesh.CalcTotalBad (mp); - (*testout) << "Total badness = " << totalbad << endl; - PrintMessage (5, "Total badness = ", totalbad); - } - - for (ElementIndex ei = 0; ei < ne; ei++) - if (!mesh[ei].IsDeleted()) - for (int j = 0; j < mesh[ei].GetNP(); j++) - elementsonnode.Add (mesh[ei][j], ei); - - INDEX_2_HASHTABLE edgetested (np+1); - - int cnt = 0; - - for (ElementIndex ei = 0; ei < ne; ei++) - { - if(mesh.GetDimension()==3 && mp.only3D_domain_nr && mp.only3D_domain_nr != mesh.VolumeElement(ei).GetIndex()) - continue; - if (multithread.terminate) - break; - - multithread.percent = 100.0 * (ei+1) / ne; - - if (mesh.ElementType(ei) == FIXEDELEMENT) - continue; - - for (int j = 0; j < 6; j++) - { - Element & elemi = mesh[ei]; - if (elemi.IsDeleted()) continue; - - static const int tetedges[6][2] = - { { 0, 1 }, { 0, 2 }, { 0, 3 }, - { 1, 2 }, { 1, 3 }, { 2, 3 } }; - - PointIndex pi1 = elemi[tetedges[j][0]]; - PointIndex pi2 = elemi[tetedges[j][1]]; - - if (pi2 < pi1) Swap (pi1, pi2); - - INDEX_2 si2 (pi1, pi2); - si2.Sort(); - - if (edgetested.Used (si2)) continue; - edgetested.Set (si2, 1); - - - // hasonepoint.SetSize(0); - // hasbothpoints.SetSize(0); - hasonepi.SetSize(0); - hasbothpi.SetSize(0); - - NgFlatArray row1 = elementsonnode[pi1]; - for (int k = 0; k < row1.Size(); k++) - { - Element & elem = mesh[row1[k]]; - if (elem.IsDeleted()) continue; - - if (elem[0] == pi2 || elem[1] == pi2 || - elem[2] == pi2 || elem[3] == pi2) - { - hasbothpi.Append (row1[k]); - } - else - { - hasonepi.Append (row1[k]); - } - } - - NgFlatArray row2 = elementsonnode[pi2]; - for (int k = 0; k < row2.Size(); k++) - { - Element & elem = mesh[row2[k]]; - if (elem.IsDeleted()) continue; - - if (elem[0] == pi1 || elem[1] == pi1 || - elem[2] == pi1 || elem[3] == pi1) - ; - else - { - hasonepi.Append (row2[k]); - } - } - - double bad1 = 0; - for (int k = 0; k < hasonepi.Size(); k++) - bad1 += elerrs[hasonepi[k]]; - for (int k = 0; k < hasbothpi.Size(); k++) - bad1 += elerrs[hasbothpi[k]]; - - MeshPoint p1 = mesh[pi1]; - MeshPoint p2 = mesh[pi2]; - - - // if (mesh.PointType(pi2) != INNERPOINT) - if (p2.Type() != INNERPOINT) - continue; - - MeshPoint pnew; - // if (mesh.PointType(pi1) != INNERPOINT) - if (p1.Type() != INNERPOINT) - pnew = p1; - else - pnew = Center (p1, p2); - - mesh[pi1] = pnew; - mesh[pi2] = pnew; - - oneperr.SetSize (hasonepi.Size()); - - double bad2 = 0; - for (int k = 0; k < hasonepi.Size(); k++) - { - const Element & elem = mesh[hasonepi[k]]; - double err = CalcBad (mesh.Points(), elem, 0); - // CalcTetBadness (mesh[elem[0]], mesh[elem[1]], - // mesh[elem[2]], mesh[elem[3]], 0, mparam); - bad2 += err; - oneperr[k] = err; - } - - mesh[pi1] = p1; - mesh[pi2] = p2; - - // if (mesh.PointType(pi1) != INNERPOINT) - if (p1.Type() != INNERPOINT) - { - for (int k = 0; k < hasonepi.Size(); k++) - { - Element & elem = mesh[hasonepi[k]]; - int l; - for (l = 0; l < 4; l++) - if (elem[l] == pi2) - { - elem[l] = pi1; - break; - } - - elem.flags.illegal_valid = 0; - if (!mesh.LegalTet(elem)) - bad2 += 1e4; - - if (l < 4) - { - elem.flags.illegal_valid = 0; - elem[l] = pi2; - } - } - } - - if (bad2 / hasonepi.Size() < - bad1 / (hasonepi.Size()+hasbothpi.Size())) - { - mesh[pi1] = pnew; - cnt++; - - NgFlatArray row = elementsonnode[pi2]; - for (int k = 0; k < row.Size(); k++) - { - Element & elem = mesh[row[k]]; - if (elem.IsDeleted()) continue; - - elementsonnode.Add (pi1, row[k]); - for (int l = 0; l < elem.GetNP(); l++) - if (elem[l] == pi2) - elem[l] = pi1; - - elem.flags.illegal_valid = 0; - if (!mesh.LegalTet (elem)) - (*testout) << "illegal tet " << elementsonnode[pi2][k] << endl; - } - - for (int k = 0; k < hasonepi.Size(); k++) - elerrs[hasonepi[k]] = oneperr[k]; - - for (int k = 0; k < hasbothpi.Size(); k++) - { - mesh[hasbothpi[k]].flags.illegal_valid = 0; - mesh[hasbothpi[k]].Delete(); - } - } - } - } - - mesh.Compress(); - mesh.MarkIllegalElements(); - - PrintMessage (5, cnt, " elements combined"); - (*testout) << "CombineImprove done" << "\n"; - - totalbad = 0; - for (ElementIndex ei = 0; ei < mesh.GetNE(); ei++) - if(!(mesh.GetDimension()==3 && mp.only3D_domain_nr && mp.only3D_domain_nr != mesh.VolumeElement(ei).GetIndex())) - totalbad += CalcBad (mesh.Points(), mesh[ei], 0); - - if (goal == OPT_QUALITY) - { - totalbad = mesh.CalcTotalBad (mp); - (*testout) << "Total badness = " << totalbad << endl; - - int cntill = 0; - for (ElementIndex ei = 0; ei < ne; ei++) - if(!(mesh.GetDimension()==3 && mp.only3D_domain_nr && mp.only3D_domain_nr != mesh.VolumeElement(ei).GetIndex())) - if (!mesh.LegalTet (mesh[ei])) - cntill++; - - PrintMessage (5, cntill, " illegal tets"); - } - multithread.task = savetask; -} - void MeshOptimize3d :: CombineImprove (Mesh & mesh, OPTIMIZEGOAL goal) { @@ -527,8 +282,6 @@ void MeshOptimize3d :: CombineImprove (Mesh & mesh, static Timer tbuild_elements_table("Build elements table"); static Timer tbad("CalcBad"); - // return CombineImproveSequential(mesh, goal); - mesh.BuildBoundaryEdges(false); int np = mesh.GetNP(); @@ -809,8 +562,6 @@ void MeshOptimize3d :: SplitImprove (Mesh & mesh, static Timer topt("Optimize"); static Timer tsearch("Search"); - // return SplitImproveSequential(mesh, goal); - int np = mesh.GetNP(); int ne = mesh.GetNE(); double bad = 0.0; @@ -907,1171 +658,6 @@ void MeshOptimize3d :: SplitImprove (Mesh & mesh, } -/* - Mesh improvement by edge splitting. - If mesh quality is improved by inserting a node into an inner edge, - the edge is split into two parts. -*/ -void MeshOptimize3d :: SplitImproveSequential (Mesh & mesh, - OPTIMIZEGOAL goal) -{ - static Timer t("MeshOptimize3d::SplitImprove"); RegionTimer reg(t); - static Timer tloop("MeshOptimize3d::SplitImprove loop"); - - double bad1, bad2, badmax, badlimit; - int cnt = 0; - int np = mesh.GetNP(); - int ne = mesh.GetNE(); - - auto elementsonnode = mesh.CreatePoint2ElementTable(); - - NgArray hasbothpoints; - - NgBitArray origpoint(np+1), boundp(np+1); // big enough for 0 and 1-based - origpoint.Set(); - - NgArray elerrs(ne); - NgBitArray illegaltet(ne); - illegaltet.Clear(); - - const char * savetask = multithread.task; - multithread.task = "Optimize Volume: Split Improve"; - - PrintMessage (3, "SplitImprove"); - (*testout) << "start SplitImprove" << "\n"; - - NgArray locfaces; - - INDEX_2_HASHTABLE edgetested (np); - - bad1 = 0; - badmax = 0; - for (ElementIndex ei = 0; ei < ne; ei++) - { - if(mp.only3D_domain_nr && mp.only3D_domain_nr != mesh.VolumeElement(ei).GetIndex()) - continue; - - elerrs[ei] = CalcBad (mesh.Points(), mesh[ei], 0); - bad1 += elerrs[ei]; - if (elerrs[ei] > badmax) badmax = elerrs[ei]; - } - - PrintMessage (5, "badmax = ", badmax); - badlimit = 0.5 * badmax; - - boundp.Clear(); - for (auto & el : mesh.SurfaceElements()) - for (PointIndex pi : el.PNums()) - boundp.Set (pi); - - if (goal == OPT_QUALITY) - { - bad1 = mesh.CalcTotalBad (mp); - (*testout) << "Total badness = " << bad1 << endl; - } - - mesh.MarkIllegalElements(); - if (goal == OPT_QUALITY || goal == OPT_LEGAL) - { - int cntill = 0; - for (ElementIndex ei = 0; ei < ne; ei++) - { - // if (!LegalTet (volelements.Get(i))) - if (mesh[ei].flags.illegal) - { - cntill++; - illegaltet.Set (ei); - } - } - } - - tloop.Start(); - for (ElementIndex ei : mesh.VolumeElements().Range()) - { - Element & elem = mesh[ei]; - - if(mp.only3D_domain_nr && mp.only3D_domain_nr != elem.GetIndex()) - continue; - if (multithread.terminate) - break; - - multithread.percent = 100.0 * (ei+1) / ne; - - bool ltestmode = 0; - - if (elerrs[ei] < badlimit && !illegaltet.Test(ei)) continue; - - if ((goal == OPT_LEGAL) && - !illegaltet.Test(ei) && - CalcBad (mesh.Points(), elem, 0) < 1e3) - continue; - - if (ltestmode) - { - (*testout) << "test el " << ei << endl; - for (int j = 0; j < 4; j++) - (*testout) << elem[j] << " "; - (*testout) << endl; - } - - for (int j = 0; j < 6; j++) - { - static const int tetedges[6][2] = - { { 0, 1 }, { 0, 2 }, { 0, 3 }, - { 1, 2 }, { 1, 3 }, { 2, 3 } }; - - PointIndex pi1 = elem[tetedges[j][0]]; - PointIndex pi2 = elem[tetedges[j][1]]; - - if (pi2 < pi1) Swap (pi1, pi2); - if (pi2 >= elementsonnode.Size()+PointIndex::BASE) continue; // old number of points - - if (!origpoint.Test(pi1) || !origpoint.Test(pi2)) - continue; - - INDEX_2 i2(pi1, pi2); - i2.Sort(); - - if (mesh.BoundaryEdge (pi1, pi2)) continue; - - if (edgetested.Used (i2) && !illegaltet.Test(ei)) continue; - edgetested.Set (i2, 1); - - hasbothpoints.SetSize (0); - /* - for (int k = 1; k <= elementsonnode.EntrySize(pi1); k++) - { - ElementIndex elnr = elementsonnode.Get(pi1, k); - */ - for (ElementIndex ei : elementsonnode[pi1]) - { - Element & el = mesh[ei]; - bool has1 = el.PNums().Contains(pi1); - bool has2 = el.PNums().Contains(pi2); - - if (has1 && has2) - if (!hasbothpoints.Contains (ei)) - hasbothpoints.Append (ei); - } - - bad1 = 0; - - for (ElementIndex ei : hasbothpoints) - bad1 += CalcBad (mesh.Points(), mesh[ei], 0); - - bool puretet = 1; - for (ElementIndex ei : hasbothpoints) - if (mesh[ei].GetType() != TET) - puretet = 0; - if (!puretet) continue; - - Point3d p1 = mesh[pi1]; - Point3d p2 = mesh[pi2]; - - /* - pnew = Center (p1, p2); - - points.Elem(pi1) = pnew; - bad2 = 0; - for (k = 1; k <= hasbothpoints.Size(); k++) - bad2 += CalcBad (points, - volelements.Get(hasbothpoints.Get(k)), 0); - - points.Elem(pi1) = p1; - points.Elem(pi2) = pnew; - - for (k = 1; k <= hasbothpoints.Size(); k++) - bad2 += CalcBad (points, - volelements.Get(hasbothpoints.Get(k)), 0); - points.Elem(pi2) = p2; - */ - - locfaces.SetSize (0); - for (ElementIndex ei : hasbothpoints) - { - const Element & el = mesh[ei]; - - for (int l = 0; l < 4; l++) - if (el[l] == pi1 || el[l] == pi2) - { - INDEX_3 i3; - Element2d face(TRIG); - el.GetFace (l+1, face); - for (int kk = 1; kk <= 3; kk++) - i3.I(kk) = face.PNum(kk); - locfaces.Append (i3); - } - } - - PointFunction1 pf (mesh.Points(), locfaces, mp, -1); - OptiParameters par; - par.maxit_linsearch = 50; - par.maxit_bfgs = 20; - - Point3d pnew = Center (p1, p2); - Vector px(3); - px(0) = pnew.X(); - px(1) = pnew.Y(); - px(2) = pnew.Z(); - - if (elerrs[ei] > 0.1 * badmax) - BFGS (px, pf, par); - - bad2 = pf.Func (px); - - pnew.X() = px(0); - pnew.Y() = px(1); - pnew.Z() = px(2); - - PointIndex hpinew = mesh.AddPoint (pnew); - // ptyps.Append (INNERPOINT); - - for (int k = 0; k < hasbothpoints.Size(); k++) - { - Element & oldel = mesh[hasbothpoints[k]]; - Element newel1 = oldel; - Element newel2 = oldel; - - oldel.flags.illegal_valid = 0; - newel1.flags.illegal_valid = 0; - newel2.flags.illegal_valid = 0; - - for (int l = 0; l < 4; l++) - { - if (newel1[l] == pi2) newel1[l] = hpinew; - if (newel2[l] == pi1) newel2[l] = hpinew; - } - - if (!mesh.LegalTet (oldel)) bad1 += 1e6; - if (!mesh.LegalTet (newel1)) bad2 += 1e6; - if (!mesh.LegalTet (newel2)) bad2 += 1e6; - } - - // mesh.PointTypes().DeleteLast(); - mesh.Points().DeleteLast(); - - if (bad2 < bad1) - /* (bad1 > 1e4 && boundp.Test(pi1) && boundp.Test(pi2)) */ - { - cnt++; - - PointIndex pinew = mesh.AddPoint (pnew); - - for (ElementIndex ei : hasbothpoints) - { - Element & oldel = mesh[ei]; - Element newel = oldel; - - newel.flags.illegal_valid = 0; - oldel.flags.illegal_valid = 0; - - for (int l = 0; l < 4; l++) - { - origpoint.Clear (oldel[l]); - - if (oldel[l] == pi2) oldel[l] = pinew; - if (newel[l] == pi1) newel[l] = pinew; - } - mesh.AddVolumeElement (newel); - } - - j = 10; // end j-loop - } - } - } - tloop.Stop(); - - mesh.Compress(); - PrintMessage (5, cnt, " splits performed"); - - (*testout) << "Splitt - Improve done" << "\n"; - - if (goal == OPT_QUALITY) - { - bad1 = mesh.CalcTotalBad (mp); - (*testout) << "Total badness = " << bad1 << endl; - - int cntill = 0; - ne = mesh.GetNE(); - for (ElementIndex ei = 0; ei < ne; ei++) - if (!mesh.LegalTet (mesh[ei])) - cntill++; - // cout << cntill << " illegal tets" << endl; - } - - multithread.task = savetask; -} - -void MeshOptimize3d :: SwapImproveSequential (Mesh & mesh, OPTIMIZEGOAL goal, - const NgBitArray * working_elements) -{ - static Timer t("MeshOptimize3d::SwapImprove"); RegionTimer reg(t); - static Timer tloop("MeshOptimize3d::SwapImprove loop"); - - PointIndex pi3(PointIndex::INVALID), pi4(PointIndex::INVALID), - pi5(PointIndex::INVALID), pi6(PointIndex::INVALID); - int cnt = 0; - - Element el21(TET), el22(TET), el31(TET), el32(TET), el33(TET); - Element el1(TET), el2(TET), el3(TET), el4(TET); - Element el1b(TET), el2b(TET), el3b(TET), el4b(TET); - - double bad1, bad2, bad3; - - int np = mesh.GetNP(); - int ne = mesh.GetNE(); - - // contains at least all elements at node - TABLE elementsonnode(np); - - NgArray hasbothpoints; - - PrintMessage (3, "SwapImprove "); - (*testout) << "\n" << "Start SwapImprove" << endl; - - const char * savetask = multithread.task; - multithread.task = "Optimize Volume: Swap Improve"; - - // mesh.CalcSurfacesOfNode (); - - INDEX_3_HASHTABLE faces(mesh.GetNOpenElements()/3 + 2); - if (goal == OPT_CONFORM) - { - for (int i = 1; i <= mesh.GetNOpenElements(); i++) - { - const Element2d & hel = mesh.OpenElement(i); - INDEX_3 face(hel[0], hel[1], hel[2]); - face.Sort(); - faces.Set (face, 1); - } - } - - // Calculate total badness - if (goal == OPT_QUALITY) - { - bad1 = mesh.CalcTotalBad (mp); - (*testout) << "Total badness = " << bad1 << endl; - } - - // find elements on node - for (ElementIndex ei = 0; ei < ne; ei++) - for (PointIndex pi : mesh[ei].PNums()) - elementsonnode.Add (pi, ei); - /* - for (int j = 0; j < mesh[ei].GetNP(); j++) - elementsonnode.Add (mesh[ei][j], ei); - */ - - - // INDEX_2_HASHTABLE edgeused(2 * ne + 5); - INDEX_2_CLOSED_HASHTABLE edgeused(12 * ne + 5); - - tloop.Start(); - for (ElementIndex ei = 0; ei < ne; ei++) - { - if (multithread.terminate) - break; - - if (mp.only3D_domain_nr && mp.only3D_domain_nr != mesh.VolumeElement(ei).GetIndex()) - continue; - - multithread.percent = 100.0 * (ei+1) / ne; - - if ((mesh.ElementType(ei)) == FIXEDELEMENT) - continue; - - if(working_elements && - ei < working_elements->Size() && - !working_elements->Test(ei)) - continue; - - if (mesh[ei].IsDeleted()) - continue; - - if ((goal == OPT_LEGAL) && - mesh.LegalTet (mesh[ei]) && - CalcBad (mesh.Points(), mesh[ei], 0) < 1e3) - continue; - - // int onlybedges = 1; - - for (int j = 0; j < 6; j++) - { - // loop over edges - - const Element & elemi = mesh[ei]; - if (elemi.IsDeleted()) continue; - - int mattyp = elemi.GetIndex(); - - static const int tetedges[6][2] = - { { 0, 1 }, { 0, 2 }, { 0, 3 }, - { 1, 2 }, { 1, 3 }, { 2, 3 } }; - - PointIndex pi1 = elemi[tetedges[j][0]]; - PointIndex pi2 = elemi[tetedges[j][1]]; - - if (pi2 < pi1) Swap (pi1, pi2); - - if (mesh.BoundaryEdge (pi1, pi2)) continue; - - - INDEX_2 i2 (pi1, pi2); - i2.Sort(); - if (edgeused.Used(i2)) continue; - edgeused.Set (i2, 1); - - hasbothpoints.SetSize (0); - for (int k = 0; k < elementsonnode[pi1].Size(); k++) - { - bool has1 = 0, has2 = 0; - ElementIndex elnr = elementsonnode[pi1][k]; - const Element & elem = mesh[elnr]; - - if (elem.IsDeleted()) continue; - - for (int l = 0; l < elem.GetNP(); l++) - { - if (elem[l] == pi1) has1 = 1; - if (elem[l] == pi2) has2 = 1; - } - - if (has1 && has2) - { // only once - if (hasbothpoints.Contains (elnr)) - has1 = false; - - if (has1) - { - hasbothpoints.Append (elnr); - } - } - } - - bool puretet = true; - for (ElementIndex ei : hasbothpoints) - if (mesh[ei].GetType () != TET) - puretet = false; - - if (!puretet) continue; - - int nsuround = hasbothpoints.Size(); - - if ( nsuround == 3 ) - { - Element & elem = mesh[hasbothpoints[0]]; - for (int l = 0; l < 4; l++) - if (elem[l] != pi1 && elem[l] != pi2) - { - pi4 = pi3; - pi3 = elem[l]; - } - - el31[0] = pi1; - el31[1] = pi2; - el31[2] = pi3; - el31[3] = pi4; - el31.SetIndex (mattyp); - - if (WrongOrientation (mesh.Points(), el31)) - { - Swap (pi3, pi4); - el31[2] = pi3; - el31[3] = pi4; - } - - pi5.Invalidate(); - for (int k = 0; k < 3; k++) // JS, 201212 - { - const Element & elemk = mesh[hasbothpoints[k]]; - bool has1 = false; - for (int l = 0; l < 4; l++) - if (elemk[l] == pi4) - has1 = true; - if (has1) - { - for (int l = 0; l < 4; l++) - if (elemk[l] != pi1 && elemk[l] != pi2 && elemk[l] != pi4) - pi5 = elemk[l]; - } - } - - if (!pi5.IsValid()) - throw NgException("Illegal state observed in SwapImprove"); - - - el32[0] = pi1; - el32[1] = pi2; - el32[2] = pi4; - el32[3] = pi5; - el32.SetIndex (mattyp); - - el33[0] = pi1; - el33[1] = pi2; - el33[2] = pi5; - el33[3] = pi3; - el33.SetIndex (mattyp); - - elementsonnode.Add (pi4, hasbothpoints[1]); - elementsonnode.Add (pi3, hasbothpoints[2]); - - bad1 = CalcBad (mesh.Points(), el31, 0) + - CalcBad (mesh.Points(), el32, 0) + - CalcBad (mesh.Points(), el33, 0); - - el31.flags.illegal_valid = 0; - el32.flags.illegal_valid = 0; - el33.flags.illegal_valid = 0; - - if (!mesh.LegalTet(el31) || - !mesh.LegalTet(el32) || - !mesh.LegalTet(el33)) - bad1 += 1e4; - - el21[0] = pi3; - el21[1] = pi4; - el21[2] = pi5; - el21[3] = pi2; - el21.SetIndex (mattyp); - - el22[0] = pi5; - el22[1] = pi4; - el22[2] = pi3; - el22[3] = pi1; - el22.SetIndex (mattyp); - - bad2 = CalcBad (mesh.Points(), el21, 0) + - CalcBad (mesh.Points(), el22, 0); - - el21.flags.illegal_valid = 0; - el22.flags.illegal_valid = 0; - - if (!mesh.LegalTet(el21) || - !mesh.LegalTet(el22)) - bad2 += 1e4; - - - if (goal == OPT_CONFORM && bad2 < 1e4) - { - INDEX_3 face(pi3, pi4, pi5); - face.Sort(); - if (faces.Used(face)) - { - // (*testout) << "3->2 swap, could improve conformity, bad1 = " << bad1 - // << ", bad2 = " << bad2 << endl; - if (bad2 < 1e4) - bad1 = 2 * bad2; - } - /* - else - { - INDEX_2 hi1(pi3, pi4); - hi1.Sort(); - INDEX_2 hi2(pi3, pi5); - hi2.Sort(); - INDEX_2 hi3(pi4, pi5); - hi3.Sort(); - - if (boundaryedges->Used (hi1) || - boundaryedges->Used (hi2) || - boundaryedges->Used (hi3) ) - bad1 = 2 * bad2; - } - */ - } - - if (bad2 < bad1) - { - // (*mycout) << "3->2 " << flush; - // (*testout) << "3->2 conversion" << endl; - cnt++; - - - /* - (*testout) << "3->2 swap, old els = " << endl - << mesh[hasbothpoints[0]] << endl - << mesh[hasbothpoints[1]] << endl - << mesh[hasbothpoints[2]] << endl - << "new els = " << endl - << el21 << endl - << el22 << endl; - */ - - el21.flags.illegal_valid = 0; - el22.flags.illegal_valid = 0; - mesh[hasbothpoints[0]] = el21; - mesh[hasbothpoints[1]] = el22; - for (int l = 0; l < 4; l++) - mesh[hasbothpoints[2]][l].Invalidate(); - mesh[hasbothpoints[2]].Delete(); - - for (int k = 0; k < 2; k++) - for (int l = 0; l < 4; l++) - elementsonnode.Add (mesh[hasbothpoints[k]][l], hasbothpoints[k]); - } - } - - if (nsuround == 4) - { - const Element & elem1 = mesh[hasbothpoints[0]]; - for (int l = 0; l < 4; l++) - if (elem1[l] != pi1 && elem1[l] != pi2) - { - pi4 = pi3; - pi3 = elem1[l]; - } - - el1[0] = pi1; el1[1] = pi2; - el1[2] = pi3; el1[3] = pi4; - el1.SetIndex (mattyp); - - if (WrongOrientation (mesh.Points(), el1)) - { - Swap (pi3, pi4); - el1[2] = pi3; - el1[3] = pi4; - } - - pi5.Invalidate(); - for (int k = 0; k < 4; k++) - { - const Element & elem = mesh[hasbothpoints[k]]; - bool has1 = elem.PNums().Contains(pi4); - if (has1) - { - for (int l = 0; l < 4; l++) - if (elem[l] != pi1 && elem[l] != pi2 && elem[l] != pi4) - pi5 = elem[l]; - } - } - - pi6.Invalidate(); - for (int k = 0; k < 4; k++) - { - const Element & elem = mesh[hasbothpoints[k]]; - bool has1 = elem.PNums().Contains(pi3); - if (has1) - { - for (int l = 0; l < 4; l++) - if (elem[l] != pi1 && elem[l] != pi2 && elem[l] != pi3) - pi6 = elem[l]; - } - } - - - /* - INDEX_2 i22(pi3, pi5); - i22.Sort(); - INDEX_2 i23(pi4, pi6); - i23.Sort(); - */ - - el1[0] = pi1; el1[1] = pi2; - el1[2] = pi3; el1[3] = pi4; - el1.SetIndex (mattyp); - - el2[0] = pi1; el2[1] = pi2; - el2[2] = pi4; el2[3] = pi5; - el2.SetIndex (mattyp); - - el3[0] = pi1; el3[1] = pi2; - el3[2] = pi5; el3[3] = pi6; - el3.SetIndex (mattyp); - - el4[0] = pi1; el4[1] = pi2; - el4[2] = pi6; el4[3] = pi3; - el4.SetIndex (mattyp); - - // elementsonnode.Add (pi4, hasbothpoints.Elem(2)); - // elementsonnode.Add (pi3, hasbothpoints.Elem(3)); - - bad1 = CalcBad (mesh.Points(), el1, 0) + - CalcBad (mesh.Points(), el2, 0) + - CalcBad (mesh.Points(), el3, 0) + - CalcBad (mesh.Points(), el4, 0); - - - el1.flags.illegal_valid = 0; - el2.flags.illegal_valid = 0; - el3.flags.illegal_valid = 0; - el4.flags.illegal_valid = 0; - - - if (goal != OPT_CONFORM) - { - if (!mesh.LegalTet(el1) || - !mesh.LegalTet(el2) || - !mesh.LegalTet(el3) || - !mesh.LegalTet(el4)) - bad1 += 1e4; - } - - el1[0] = pi3; el1[1] = pi5; - el1[2] = pi2; el1[3] = pi4; - el1.SetIndex (mattyp); - - el2[0] = pi3; el2[1] = pi5; - el2[2] = pi4; el2[3] = pi1; - el2.SetIndex (mattyp); - - el3[0] = pi3; el3[1] = pi5; - el3[2] = pi1; el3[3] = pi6; - el3.SetIndex (mattyp); - - el4[0] = pi3; el4[1] = pi5; - el4[2] = pi6; el4[3] = pi2; - el4.SetIndex (mattyp); - - bad2 = CalcBad (mesh.Points(), el1, 0) + - CalcBad (mesh.Points(), el2, 0) + - CalcBad (mesh.Points(), el3, 0) + - CalcBad (mesh.Points(), el4, 0); - - el1.flags.illegal_valid = 0; - el2.flags.illegal_valid = 0; - el3.flags.illegal_valid = 0; - el4.flags.illegal_valid = 0; - - if (goal != OPT_CONFORM) - { - if (!mesh.LegalTet(el1) || - !mesh.LegalTet(el2) || - !mesh.LegalTet(el3) || - !mesh.LegalTet(el4)) - bad2 += 1e4; - } - - - el1b[0] = pi4; el1b[1] = pi6; - el1b[2] = pi3; el1b[3] = pi2; - el1b.SetIndex (mattyp); - - el2b[0] = pi4; el2b[1] = pi6; - el2b[2] = pi2; el2b[3] = pi5; - el2b.SetIndex (mattyp); - - el3b[0] = pi4; el3b[1] = pi6; - el3b[2] = pi5; el3b[3] = pi1; - el3b.SetIndex (mattyp); - - el4b[0] = pi4; el4b[1] = pi6; - el4b[2] = pi1; el4b[3] = pi3; - el4b.SetIndex (mattyp); - - bad3 = CalcBad (mesh.Points(), el1b, 0) + - CalcBad (mesh.Points(), el2b, 0) + - CalcBad (mesh.Points(), el3b, 0) + - CalcBad (mesh.Points(), el4b, 0); - - el1b.flags.illegal_valid = 0; - el2b.flags.illegal_valid = 0; - el3b.flags.illegal_valid = 0; - el4b.flags.illegal_valid = 0; - - if (goal != OPT_CONFORM) - { - if (!mesh.LegalTet(el1b) || - !mesh.LegalTet(el2b) || - !mesh.LegalTet(el3b) || - !mesh.LegalTet(el4b)) - bad3 += 1e4; - } - - - /* - int swap2 = (bad2 < bad1) && (bad2 < bad3); - int swap3 = !swap2 && (bad3 < bad1); - - if ( ((bad2 < 10 * bad1) || - (bad2 < 1e6)) && mesh.BoundaryEdge (pi3, pi5)) - swap2 = 1; - else if ( ((bad3 < 10 * bad1) || - (bad3 < 1e6)) && mesh.BoundaryEdge (pi4, pi6)) - { - swap3 = 1; - swap2 = 0; - } - */ - bool swap2, swap3; - - if (goal != OPT_CONFORM) - { - swap2 = (bad2 < bad1) && (bad2 < bad3); - swap3 = !swap2 && (bad3 < bad1); - } - else - { - if (mesh.BoundaryEdge (pi3, pi5)) bad2 /= 1e6; - if (mesh.BoundaryEdge (pi4, pi6)) bad3 /= 1e6; - - swap2 = (bad2 < bad1) && (bad2 < bad3); - swap3 = !swap2 && (bad3 < bad1); - } - - - if (swap2 || swap3) - { - // (*mycout) << "4->4 " << flush; - cnt++; - // (*testout) << "4->4 conversion" << "\n"; - /* - (*testout) << "bad1 = " << bad1 - << " bad2 = " << bad2 - << " bad3 = " << bad3 << "\n"; - - (*testout) << "Points: " << pi1 << " " << pi2 << " " << pi3 - << " " << pi4 << " " << pi5 << " " << pi6 << "\n"; - (*testout) << "Elements: " - << hasbothpoints.Get(1) << " " - << hasbothpoints.Get(2) << " " - << hasbothpoints.Get(3) << " " - << hasbothpoints.Get(4) << " " << "\n"; - */ - - /* - { - int i1, j1; - for (i1 = 1; i1 <= 4; i1++) - { - for (j1 = 1; j1 <= 4; j1++) - (*testout) << volelements.Get(hasbothpoints.Get(i1)).PNum(j1) - << " "; - (*testout) << "\n"; - } - } - */ - } - - - if (swap2) - { - // (*mycout) << "bad1 = " << bad1 << " bad2 = " << bad2 << "\n"; - - - /* - (*testout) << "4->4 swap A, old els = " << endl - << mesh[hasbothpoints[0]] << endl - << mesh[hasbothpoints[1]] << endl - << mesh[hasbothpoints[2]] << endl - << mesh[hasbothpoints[3]] << endl - << "new els = " << endl - << el1 << endl - << el2 << endl - << el3 << endl - << el4 << endl; - */ - - - - el1.flags.illegal_valid = 0; - el2.flags.illegal_valid = 0; - el3.flags.illegal_valid = 0; - el4.flags.illegal_valid = 0; - - mesh[hasbothpoints[0]] = el1; - mesh[hasbothpoints[1]] = el2; - mesh[hasbothpoints[2]] = el3; - mesh[hasbothpoints[3]] = el4; - - for (int k = 0; k < 4; k++) - for (int l = 0; l < 4; l++) - elementsonnode.Add (mesh[hasbothpoints[k]][l], hasbothpoints[k]); - } - else if (swap3) - { - // (*mycout) << "bad1 = " << bad1 << " bad3 = " << bad3 << "\n"; - el1b.flags.illegal_valid = 0; - el2b.flags.illegal_valid = 0; - el3b.flags.illegal_valid = 0; - el4b.flags.illegal_valid = 0; - - - /* - (*testout) << "4->4 swap A, old els = " << endl - << mesh[hasbothpoints[0]] << endl - << mesh[hasbothpoints[1]] << endl - << mesh[hasbothpoints[2]] << endl - << mesh[hasbothpoints[3]] << endl - << "new els = " << endl - << el1b << endl - << el2b << endl - << el3b << endl - << el4b << endl; - */ - - - mesh[hasbothpoints[0]] = el1b; - mesh[hasbothpoints[1]] = el2b; - mesh[hasbothpoints[2]] = el3b; - mesh[hasbothpoints[3]] = el4b; - - for (int k = 0; k < 4; k++) - for (int l = 0; l < 4; l++) - elementsonnode.Add (mesh[hasbothpoints[k]][l], hasbothpoints[k]); - } - } - - // if (goal == OPT_QUALITY) - if (nsuround >= 5) - { - Element hel(TET); - - NgArrayMem suroundpts(nsuround); - NgArrayMem tetused(nsuround); - - Element & elem = mesh[hasbothpoints[0]]; - - for (int l = 0; l < 4; l++) - if (elem[l] != pi1 && elem[l] != pi2) - { - pi4 = pi3; - pi3 = elem[l]; - } - - hel[0] = pi1; - hel[1] = pi2; - hel[2] = pi3; - hel[3] = pi4; - hel.SetIndex (mattyp); - - if (WrongOrientation (mesh.Points(), hel)) - { - Swap (pi3, pi4); - hel[2] = pi3; - hel[3] = pi4; - } - - - // suroundpts.SetSize (nsuround); - suroundpts = PointIndex::INVALID; - suroundpts[0] = pi3; - suroundpts[1] = pi4; - - tetused = false; - tetused[0] = true; - - for (int l = 2; l < nsuround; l++) - { - PointIndex oldpi = suroundpts[l-1]; - PointIndex newpi; - newpi.Invalidate(); - - for (int k = 0; k < nsuround && !newpi.IsValid(); k++) - if (!tetused[k]) - { - const Element & nel = mesh[hasbothpoints[k]]; - for (int k2 = 0; k2 < 4 && !newpi.IsValid(); k2++) - if (nel[k2] == oldpi) - { - newpi = - nel[0] + nel[1] + nel[2] + nel[3] - - pi1 - pi2 - oldpi; - - tetused[k] = true; - suroundpts[l] = newpi; - } - } - } - - - bad1 = 0; - for (int k = 0; k < nsuround; k++) - { - hel[0] = pi1; - hel[1] = pi2; - hel[2] = suroundpts[k]; - hel[3] = suroundpts[(k+1) % nsuround]; - hel.SetIndex (mattyp); - - bad1 += CalcBad (mesh.Points(), hel, 0); - } - - // (*testout) << "nsuround = " << nsuround << " bad1 = " << bad1 << endl; - - - int bestl = -1; - int confface = -1; - int confedge = -1; - double badopt = bad1; - - for (int l = 0; l < nsuround; l++) - { - bad2 = 0; - - for (int k = l+1; k <= nsuround + l - 2; k++) - { - hel[0] = suroundpts[l]; - hel[1] = suroundpts[k % nsuround]; - hel[2] = suroundpts[(k+1) % nsuround]; - hel[3] = pi2; - - bad2 += CalcBad (mesh.Points(), hel, 0); - hel.flags.illegal_valid = 0; - if (!mesh.LegalTet(hel)) bad2 += 1e4; - - hel[2] = suroundpts[k % nsuround]; - hel[1] = suroundpts[(k+1) % nsuround]; - hel[3] = pi1; - - bad2 += CalcBad (mesh.Points(), hel, 0); - - hel.flags.illegal_valid = 0; - if (!mesh.LegalTet(hel)) bad2 += 1e4; - } - // (*testout) << "bad2," << l << " = " << bad2 << endl; - - if ( bad2 < badopt ) - { - bestl = l; - badopt = bad2; - } - - - if (goal == OPT_CONFORM) - { - bool nottoobad = NotTooBad(bad1, bad2); - - for (int k = l+1; k <= nsuround + l - 2; k++) - { - INDEX_3 hi3(suroundpts[l], - suroundpts[k % nsuround], - suroundpts[(k+1) % nsuround]); - hi3.Sort(); - if (faces.Used(hi3)) - { - // (*testout) << "could improve face conformity, bad1 = " << bad1 - // << ", bad 2 = " << bad2 << ", nottoobad = " << nottoobad << endl; - if (nottoobad) - confface = l; - } - } - - for (int k = l+2; k <= nsuround+l-2; k++) - { - if (mesh.BoundaryEdge (suroundpts[l], - suroundpts[k % nsuround])) - { - /* - *testout << "could improve edge conformity, bad1 = " << bad1 - << ", bad 2 = " << bad2 << ", nottoobad = " << nottoobad << endl; - */ - if (nottoobad) - confedge = l; - } - } - } - } - - if (confedge != -1) - bestl = confedge; - if (confface != -1) - bestl = confface; - - if (bestl != -1) - { - // (*mycout) << nsuround << "->" << 2 * (nsuround-2) << " " << flush; - cnt++; - - for (int k = bestl+1; k <= nsuround + bestl - 2; k++) - { - int k1; - - hel[0] = suroundpts[bestl]; - hel[1] = suroundpts[k % nsuround]; - hel[2] = suroundpts[(k+1) % nsuround]; - hel[3] = pi2; - hel.flags.illegal_valid = 0; - - /* - (*testout) << nsuround << "-swap, new el,top = " - << hel << endl; - */ - mesh.AddVolumeElement (hel); - - for (k1 = 0; k1 < 4; k1++) - elementsonnode.Add (hel[k1], mesh.GetNE()-1); - - - hel[2] = suroundpts[k % nsuround]; - hel[1] = suroundpts[(k+1) % nsuround]; - hel[3] = pi1; - - /* - (*testout) << nsuround << "-swap, new el,bot = " - << hel << endl; - */ - - mesh.AddVolumeElement (hel); - - for (k1 = 0; k1 < 4; k1++) - elementsonnode.Add (hel[k1], mesh.GetNE()-1); - } - - for (int k = 0; k < nsuround; k++) - { - Element & rel = mesh[hasbothpoints[k]]; - /* - (*testout) << nsuround << "-swap, old el = " - << rel << endl; - */ - rel.Delete(); - for (int k1 = 0; k1 < 4; k1++) - rel[k1].Invalidate(); - } - } - } - } - - /* - if (onlybedges) - { - (*testout) << "bad tet: " - << volelements.Get(i)[0] - << volelements.Get(i)[1] - << volelements.Get(i)[2] - << volelements.Get(i)[3] << "\n"; - - if (!mesh.LegalTet (volelements.Get(i))) - cerr << "Illegal tet" << "\n"; - } - */ - } - // (*mycout) << endl; - tloop.Stop(); - /* - cout << "edgeused: "; - edgeused.PrintMemInfo(cout); - */ - PrintMessage (5, cnt, " swaps performed"); - - - - - - mesh.Compress (); - - /* - if (goal == OPT_QUALITY) - { - bad1 = CalcTotalBad (mesh.Points(), mesh.VolumeElements()); - // (*testout) << "Total badness = " << bad1 << endl; - } - */ - - /* - for (i = 1; i <= GetNE(); i++) - if (volelements.Get(i)[0]) - if (!mesh.LegalTet (volelements.Get(i))) - { - cout << "detected illegal tet, 2" << endl; - (*testout) << "detected illegal tet1: " << i << endl; - } - */ - - multithread.task = savetask; -} - - double MeshOptimize3d :: SwapImproveEdge (Mesh & mesh, OPTIMIZEGOAL goal, const NgBitArray * working_elements, Table & elementsonnode, @@ -2709,8 +1295,6 @@ void MeshOptimize3d :: SwapImprove (Mesh & mesh, OPTIMIZEGOAL goal, static Timer t("MeshOptimize3d::SwapImprove"); RegionTimer reg(t); static Timer tloop("MeshOptimize3d::SwapImprove loop"); - // return SwapImproveSequential(mesh, goal, working_elements); - int cnt = 0; int np = mesh.GetNP(); @@ -3870,112 +2454,11 @@ double MeshOptimize3d :: SwapImprove2 ( Mesh & mesh, OPTIMIZEGOAL goal, ElementI 2 -> 3 conversion */ -void MeshOptimize3d :: SwapImprove2Sequential (Mesh & mesh, OPTIMIZEGOAL goal) -{ - static Timer t("MeshOptimize3d::SwapImprove2"); RegionTimer reg(t); - - PointIndex pi1, pi2, pi3, pi4, pi5; - Element el21(TET), el22(TET), el31(TET), el32(TET), el33(TET); - - int cnt = 0; - double bad1, bad2; - - int np = mesh.GetNP(); - int ne = mesh.GetNE(); - int nse = mesh.GetNSE(); - - if (goal == OPT_CONFORM) return; - - // contains at least all elements at node - // TABLE elementsonnode(np); - TABLE belementsonnode(np); - - PrintMessage (3, "SwapImprove2 "); - (*testout) << "\n" << "Start SwapImprove2" << "\n"; - // TestOk(); - - - /* - CalcSurfacesOfNode (); - for (i = 1; i <= GetNE(); i++) - if (volelements.Get(i)[0]) - if (!mesh.LegalTet (volelements.Get(i))) - { - cout << "detected illegal tet, 1" << endl; - (*testout) << "detected illegal tet1: " << i << endl; - } - */ - - - // Calculate total badness - - bad1 = mesh.CalcTotalBad (mp); - (*testout) << "Total badness = " << bad1 << endl; - cout << "tot bad = " << bad1 << endl; - - auto elementsonnode = mesh.CreatePoint2ElementTable(); - - for (SurfaceElementIndex sei = 0; sei < nse; sei++) - for (int j = 0; j < 3; j++) - belementsonnode.Add (mesh[sei][j], sei); - - for (ElementIndex eli1 = 0; eli1 < ne; eli1++) - { - if (multithread.terminate) - break; - - if (mesh.ElementType (eli1) == FIXEDELEMENT) - continue; - - if (mesh[eli1].GetType() != TET) - continue; - - if ((goal == OPT_LEGAL) && - mesh.LegalTet (mesh[eli1]) && - CalcBad (mesh.Points(), mesh[eli1], 0) < 1e3) - continue; - - if(mesh.GetDimension()==3 && mp.only3D_domain_nr && mp.only3D_domain_nr != mesh.VolumeElement(eli1).GetIndex()) - continue; - - // cout << "eli = " << eli1 << endl; - // (*testout) << "swapimp2, eli = " << eli1 << "; el = " << mesh[eli1] << endl; - - for (int j = 0; j < 4; j++) - { - cnt += SwapImprove2( mesh, goal, eli1, j, elementsonnode, belementsonnode, false); - } - } - - - PrintMessage (5, cnt, " swaps performed"); - - - - /* - CalcSurfacesOfNode (); - for (i = 1; i <= GetNE(); i++) - if (volelements.Get(i).PNum(1)) - if (!LegalTet (volelements.Get(i))) - { - cout << "detected illegal tet, 2" << endl; - (*testout) << "detected illegal tet2: " << i << endl; - } - */ - - - mesh.Compress(); - bad1 = mesh.CalcTotalBad (mp); - (*testout) << "Total badness = " << bad1 << endl; - (*testout) << "swapimprove2 done" << "\n"; - // (*mycout) << "Vol = " << CalcVolume (points, volelements) << "\n"; -} - void MeshOptimize3d :: SwapImprove2 (Mesh & mesh, OPTIMIZEGOAL goal) { static Timer t("MeshOptimize3d::SwapImprove2"); RegionTimer reg(t); - // return SwapImprove2Sequential(mesh, goal); + if (goal == OPT_CONFORM) return; mesh.BuildBoundaryEdges(false); @@ -3986,8 +2469,6 @@ void MeshOptimize3d :: SwapImprove2 (Mesh & mesh, OPTIMIZEGOAL goal) int ne = mesh.GetNE(); int nse = mesh.GetNSE(); - if (goal == OPT_CONFORM) return; - // contains at least all elements at node TABLE belementsonnode(np); diff --git a/libsrc/meshing/improve3.hpp b/libsrc/meshing/improve3.hpp index 3caa2a57..605c523c 100644 --- a/libsrc/meshing/improve3.hpp +++ b/libsrc/meshing/improve3.hpp @@ -21,10 +21,8 @@ public: FlatArray is_point_removed, bool check_only=false); void CombineImprove (Mesh & mesh, OPTIMIZEGOAL goal = OPT_QUALITY); - void CombineImproveSequential (Mesh & mesh, OPTIMIZEGOAL goal = OPT_QUALITY); void SplitImprove (Mesh & mesh, OPTIMIZEGOAL goal = OPT_QUALITY); - void SplitImproveSequential (Mesh & mesh, OPTIMIZEGOAL goal = OPT_QUALITY); double SplitImproveEdge (Mesh & mesh, OPTIMIZEGOAL goal, Table & elementsonnode, Array &elerrs, NgArray &locfaces, double badmax, PointIndex pi1, PointIndex pi2, PointIndex ptmp, bool check_only=false); void SplitImprove2 (Mesh & mesh); @@ -34,12 +32,9 @@ public: double SwapImproveEdge (Mesh & mesh, OPTIMIZEGOAL goal, const NgBitArray * working_elements, Table & elementsonnode, INDEX_3_HASHTABLE & faces, PointIndex pi1, PointIndex pi2, bool check_only=false); void SwapImprove (Mesh & mesh, OPTIMIZEGOAL goal = OPT_QUALITY, const NgBitArray * working_elements = NULL); - void SwapImproveSequential (Mesh & mesh, OPTIMIZEGOAL goal = OPT_QUALITY, - const NgBitArray * working_elements = NULL); void SwapImproveSurface (Mesh & mesh, OPTIMIZEGOAL goal = OPT_QUALITY, const NgBitArray * working_elements = NULL, const NgArray< NgArray* > * idmaps = NULL); - void SwapImprove2Sequential (Mesh & mesh, OPTIMIZEGOAL goal = OPT_QUALITY); void SwapImprove2 (Mesh & mesh, OPTIMIZEGOAL goal = OPT_QUALITY); double SwapImprove2 ( Mesh & mesh, OPTIMIZEGOAL goal, ElementIndex eli1, int face, Table & elementsonnode, TABLE & belementsonnode, bool check_only=false ); diff --git a/libsrc/meshing/meshclass.cpp b/libsrc/meshing/meshclass.cpp index ff0bd2d4..ef06dc38 100644 --- a/libsrc/meshing/meshclass.cpp +++ b/libsrc/meshing/meshclass.cpp @@ -6407,6 +6407,7 @@ namespace netgen } Compress(); + SetNextMajorTimeStamp(); } void Mesh :: RebuildSurfaceElementLists () diff --git a/libsrc/meshing/meshclass.hpp b/libsrc/meshing/meshclass.hpp index 6a990e25..c842a35c 100644 --- a/libsrc/meshing/meshclass.hpp +++ b/libsrc/meshing/meshclass.hpp @@ -566,7 +566,6 @@ namespace netgen DLL_HEADER void DoArchive (Archive & archive); /// DLL_HEADER void ImproveMesh (const MeshingParameters & mp, OPTIMIZEGOAL goal = OPT_QUALITY); - DLL_HEADER void ImproveMeshSequential (const MeshingParameters & mp, OPTIMIZEGOAL goal = OPT_QUALITY); /// void ImproveMeshJacobian (const MeshingParameters & mp, OPTIMIZEGOAL goal = OPT_QUALITY, const NgBitArray * usepoint = NULL); diff --git a/libsrc/meshing/meshfunc.cpp b/libsrc/meshing/meshfunc.cpp index 553a1422..54debb84 100644 --- a/libsrc/meshing/meshfunc.cpp +++ b/libsrc/meshing/meshfunc.cpp @@ -451,6 +451,7 @@ namespace netgen const char * optstr = "mcmstmcmstmcmstmcm"; for (size_t j = 1; j <= strlen(optstr); j++) { + mesh.FindOpenElements(); mesh.CalcSurfacesOfNode(); mesh.FreeOpenElementsEnvironment(2); mesh.CalcSurfacesOfNode(); @@ -466,12 +467,10 @@ namespace netgen } - mesh.FindOpenElements(); + mesh.FindOpenElements(domain); PrintMessage (3, "Call remove problem"); - // mesh.Save("before_remove.vol"); RemoveProblem (mesh, domain); - // mesh.Save("after_remove.vol"); - mesh.FindOpenElements(); + mesh.FindOpenElements(domain); } else { @@ -581,7 +580,7 @@ namespace netgen FillCloseSurface( md[i] ); CloseOpenQuads( md[i] ); MeshDomain(md[i]); - }); + }, md.Size()); MergeMeshes(mesh3d, md); diff --git a/libsrc/meshing/python_mesh.cpp b/libsrc/meshing/python_mesh.cpp index 216119f3..91b14bd3 100644 --- a/libsrc/meshing/python_mesh.cpp +++ b/libsrc/meshing/python_mesh.cpp @@ -854,6 +854,17 @@ DLL_HEADER void ExportNetgenMeshing(py::module &m) static_cast (&Mesh::Points), py::return_value_policy::reference) + .def("Coordinates", [](Mesh & self) { + return py::array + ( + py::memoryview::from_buffer + (&self.Points()[PointIndex::BASE](0), sizeof(double), + py::format_descriptor::value, + { self.Points().Size(), size_t(self.GetDimension()) }, + { sizeof(self.Points()[PointIndex::BASE]), sizeof(double) } ) + ); + }) + .def("FaceDescriptor", static_cast (&Mesh::GetFaceDescriptor), py::return_value_policy::reference) .def("GetNFaceDescriptors", &Mesh::GetNFD) diff --git a/libsrc/meshing/smoothing3.cpp b/libsrc/meshing/smoothing3.cpp index b30b8156..617d5de7 100644 --- a/libsrc/meshing/smoothing3.cpp +++ b/libsrc/meshing/smoothing3.cpp @@ -1331,127 +1331,6 @@ void Mesh :: ImproveMesh (const CSG eometry & geometry, OPTIMIZEGOAL goal) -void Mesh :: ImproveMeshSequential (const MeshingParameters & mp, OPTIMIZEGOAL goal) -{ - static Timer t("Mesh::ImproveMesh"); RegionTimer reg(t); - - (*testout) << "Improve Mesh" << "\n"; - PrintMessage (3, "ImproveMesh"); - - int np = GetNP(); - int ne = GetNE(); - - - if (goal == OPT_QUALITY) - { - double bad1 = CalcTotalBad (mp); - (*testout) << "Total badness = " << bad1 << endl; - PrintMessage (5, "Total badness = ", bad1); - } - - Vector x(3); - - (*testout) << setprecision(8); - - //int uselocalh = mparam.uselocalh; - - - PointFunction pf(points, volelements, mp); - - Opti3FreeMinFunction freeminf(pf); - - OptiParameters par; - par.maxit_linsearch = 20; - par.maxit_bfgs = 20; - - NgArray pointh (points.Size()); - - if(HasLocalHFunction()) - { - for (PointIndex pi : points.Range()) - pointh[pi] = GetH(pi); - } - else - { - pointh = 0; - for (Element & el : VolumeElements()) - { - double h = pow(el.Volume(points),1./3.); - for (PointIndex pi : el.PNums()) - if (h > pointh[pi]) - pointh[pi] = h; - } - } - - - int printmod = 1; - char printdot = '.'; - if (points.Size() > 1000) - { - printmod = 10; - printdot = '+'; - } - if (points.Size() > 10000) - { - printmod = 100; - printdot = '*'; - } - - - const char * savetask = multithread.task; - multithread.task = "Optimize Volume: Smooth Mesh"; - - for (PointIndex pi : points.Range()) - if ( (*this)[pi].Type() == INNERPOINT ) - { - if (multithread.terminate) - throw NgException ("Meshing stopped"); - - multithread.percent = 100.0 * (pi+1-PointIndex::BASE) / points.Size(); - - if ( (pi+1-PointIndex::BASE) % printmod == 0) PrintDot (printdot); - - double lh = pointh[pi]; - pf.SetLocalH (lh); - par.typx = lh; - - freeminf.SetPoint (points[pi]); - pf.SetPointIndex (pi); - - x = 0; - int pok; - pok = freeminf.Func (x) < 1e10; - - if (!pok) - { - pok = pf.MovePointToInner (); - - freeminf.SetPoint (points[pi]); - pf.SetPointIndex (pi); - } - - if (pok) - { - //*testout << "start BFGS, pok" << endl; - BFGS (x, freeminf, par); - //*testout << "BFGS complete, pok" << endl; - points[pi](0) += x(0); - points[pi](1) += x(1); - points[pi](2) += x(2); - } - } - PrintDot ('\n'); - - multithread.task = savetask; - - if (goal == OPT_QUALITY) - { - double bad1 = CalcTotalBad (mp); - (*testout) << "Total badness = " << bad1 << endl; - PrintMessage (5, "Total badness = ", bad1); - } -} - void Mesh :: ImproveMesh (const MeshingParameters & mp, OPTIMIZEGOAL goal) { static Timer t("Mesh::ImproveMesh"); RegionTimer reg(t); @@ -1461,7 +1340,6 @@ void Mesh :: ImproveMesh (const MeshingParameters & mp, OPTIMIZEGOAL goal) static Timer trange("range"); static Timer tloch("loch"); - // return ImproveMeshSequential(mp, goal); BuildBoundaryEdges(false); (*testout) << "Improve Mesh" << "\n"; diff --git a/libsrc/visualization/CMakeLists.txt b/libsrc/visualization/CMakeLists.txt index 2a83c0e0..ace884ce 100644 --- a/libsrc/visualization/CMakeLists.txt +++ b/libsrc/visualization/CMakeLists.txt @@ -14,6 +14,6 @@ install( TARGETS visual ${NG_INSTALL_DIR}) install(FILES meshdoc.hpp mvdraw.hpp - vispar.hpp visual.hpp vssolution.hpp + vispar.hpp visual.hpp vssolution.hpp vsfieldlines.hpp DESTINATION ${NG_INSTALL_DIR_INCLUDE}/visualization COMPONENT netgen_devel ) diff --git a/libsrc/visualization/vsfieldlines.cpp b/libsrc/visualization/vsfieldlines.cpp index def0b5f9..ad997504 100644 --- a/libsrc/visualization/vsfieldlines.cpp +++ b/libsrc/visualization/vsfieldlines.cpp @@ -71,7 +71,7 @@ namespace netgen K.SetSize(steps); } - void RKStepper :: StartNextValCalc(const Point3d & astartval, const double astartt, const double ah, const bool aadaptive) + void RKStepper :: StartNextValCalc(const Point<3> & astartval, const double astartt, const double ah, const bool aadaptive) { //cout << "Starting RK-Step with h=" << ah << endl; @@ -83,12 +83,9 @@ namespace netgen adrun = 0; } - bool RKStepper :: GetNextData(Point3d & val, double & t, double & ah) + bool RKStepper :: GetNextData(Point<3> & val, double & t, double & ah) { - bool finished(false); - - - //cout << "stepcount " << stepcount << endl; + bool finished = false; if(stepcount <= steps) { @@ -125,9 +122,9 @@ namespace netgen } else if (adrun == 2) { - Point3d valh2 = val; + Point<3> valh2 = val; val = valh2 + 1./(pow(2.,order)-1.) * (valh2 - valh); - Vec3d errvec = val - valh; + auto errvec = val - valh; double err = errvec.Length(); @@ -172,7 +169,7 @@ namespace netgen } - bool RKStepper :: FeedNextF(const Vec3d & f) + bool RKStepper :: FeedNextF(const Vec<3> & f) { K[stepcount] = f; stepcount++; @@ -181,19 +178,17 @@ namespace netgen - void FieldLineCalc :: GenerateFieldLines(NgArray & potential_startpoints, const int numlines, const int gllist, - const double minval, const double maxval, const int logscale, double phaser, double phasei) + void FieldLineCalc :: GenerateFieldLines(Array> & potential_startpoints, const int numlines) { - NgArray points; - NgArray values; - NgArray drawelems; - NgArray dirstart; - - - if(vsol -> iscomplex) - SetPhase(phaser,phasei); + Array> line_points; + Array line_values; + Array drawelems; + Array dirstart; + pstart.SetSize0(); + pend.SetSize0(); + values.SetSize0(); double crit = 1.0; @@ -201,8 +196,7 @@ namespace netgen { double sum = 0; double lami[3]; - double values[6]; - Vec3d v; + Vec<3> v; for(int i=0; iiscomplex, phaser, phasei); - - sum += v.Length(); + func(elnr, lami, v); + sum += v.Length(); } crit = sum/double(numlines); @@ -232,8 +219,6 @@ namespace netgen cout << endl; - - for(int i=0; i= numlines) break; - Calc(potential_startpoints[i],points,values,drawelems,dirstart); + Calc(potential_startpoints[i],line_points,line_values,drawelems,dirstart); bool usable = false; @@ -253,16 +238,9 @@ namespace netgen if(!drawelems[k] || !drawelems[k+1]) continue; usable = true; - - // vss.SetOpenGlColor (0.5*(values[k]+values[k+1]), minval, maxval, logscale); - - /* - if (vss.usetexture == 1) - glTexCoord1f ( 0.5*(values[k]+values[k+1]) ); - else - */ - vss.SetOpenGlColor (0.5*(values[k]+values[k+1]) ); - vss.DrawCylinder (points[k], points[k+1], thickness); + pstart.Append(line_points[k]); + pend.Append(line_points[k+1]); + values.Append( 0.5*(line_values[k]+line_values[k+1]) ); } if(usable) calculated++; @@ -273,10 +251,10 @@ namespace netgen - FieldLineCalc :: FieldLineCalc(const Mesh & amesh, VisualSceneSolution & avss, const VisualSceneSolution::SolData * solution, + FieldLineCalc :: FieldLineCalc(const Mesh & amesh, const VectorFunction & afunc, const double rel_length, const int amaxpoints, const double rel_thickness, const double rel_tolerance, const int rk_type, const int adirection) : - mesh(amesh), vss(avss), vsol(solution), stepper(rk_type) + mesh(amesh), func(afunc), stepper(rk_type) { mesh.GetBox (pmin, pmax); rad = 0.5 * Dist (pmin, pmax); @@ -305,9 +283,6 @@ namespace netgen } - phaser = 1; - phasei = 0; - critical_value = -1; randomized = false; @@ -317,24 +292,10 @@ namespace netgen - void FieldLineCalc :: Calc(const Point3d & startpoint, NgArray & points, NgArray & vals, NgArray & drawelems, NgArray & dirstart) + void FieldLineCalc :: Calc(const Point<3> & startpoint, Array> & points, Array & vals, Array & drawelems, Array & dirstart) { - double lami[3], startlami[3]; - double values[6]; - double dummyt(0); - Vec3d v; - Vec3d startv; - Point3d newp; - double h; - - double startval; - bool startdraw; - bool drawelem = false; - int elnr; - - for (int i=0; i<6; i++) values[i]=0.0; - for (int i=0; i<3; i++) lami[i]=0.0; - for (int i=0; i<3; i++) startlami[i]=0.0; + Vec<3> v = 0.0; + double startlami[3] = {0.0, 0.0, 0.0}; points.SetSize(0); vals.SetSize(0); @@ -351,14 +312,10 @@ namespace netgen mesh.SetPointSearchStartElement(startelnr); - if (mesh.GetDimension()==3) - startdraw = vss.GetValues ( vsol, startelnr, startlami[0], startlami[1], startlami[2], values); - else - startdraw = vss.GetSurfValues ( vsol, startelnr, -1, startlami[0], startlami[1], values); + Vec<3> startv; + bool startdraw = func(startelnr, startlami, startv); - VisualSceneSolution::RealVec3d ( values, startv, vsol->iscomplex, phaser, phasei); - - startval = startv.Length(); + double startval = startv.Length(); if(critical_value > 0 && fabs(startval) < critical_value) return; @@ -375,13 +332,13 @@ namespace netgen vals.Append(startval); drawelems.Append(startdraw); - h = 0.001*rad/startval; // otherwise no nice lines; should be made accessible from outside + double h = 0.001*rad/startval; // otherwise no nice lines; should be made accessible from outside v = startv; if(dir == -1) v *= -1.; - elnr = startelnr; - lami[0] = startlami[0]; lami[1] = startlami[1]; lami[2] = startlami[2]; + int elnr = startelnr; + double lami[3] = { startlami[0], startlami[1], startlami[2]}; for(double length = 0; length < maxlength; length += h*vals.Last()) @@ -392,21 +349,19 @@ namespace netgen break; } + double dummyt; stepper.StartNextValCalc(points.Last(),dummyt,h,true); stepper.FeedNextF(v); + bool drawelem = false; + Point<3> newp; while(!stepper.GetNextData(newp,dummyt,h) && elnr != -1) { elnr = mesh.GetElementOfPoint(newp,lami,true) - 1; if(elnr != -1) { mesh.SetPointSearchStartElement(elnr); - if (mesh.GetDimension()==3) - drawelem = vss.GetValues (vsol, elnr, lami[0], lami[1], lami[2], values); - else - drawelem = vss.GetSurfValues (vsol, elnr, -1, lami[0], lami[1], values); - - VisualSceneSolution::RealVec3d (values, v, vsol->iscomplex, phaser, phasei); + drawelem = func(elnr, lami, v); if(dir == -1) v *= -1.; stepper.FeedNextF(v); } @@ -440,7 +395,7 @@ namespace netgen - void VisualSceneSolution :: BuildFieldLinesFromBox(NgArray & startpoints) + void VisualSceneSolution :: BuildFieldLinesFromBox(Array> & startpoints) { shared_ptr mesh = GetMesh(); if (!mesh) return; @@ -462,7 +417,7 @@ namespace netgen for (int i = 1; i <= startpoints.Size(); i++) { - Point3d p (fieldlines_startarea_parameter[0] + double (rand()) / RAND_MAX * (fieldlines_startarea_parameter[3]-fieldlines_startarea_parameter[0]), + Point<3> p (fieldlines_startarea_parameter[0] + double (rand()) / RAND_MAX * (fieldlines_startarea_parameter[3]-fieldlines_startarea_parameter[0]), fieldlines_startarea_parameter[1] + double (rand()) / RAND_MAX * (fieldlines_startarea_parameter[4]-fieldlines_startarea_parameter[1]), fieldlines_startarea_parameter[2] + double (rand()) / RAND_MAX * (fieldlines_startarea_parameter[5]-fieldlines_startarea_parameter[2])); @@ -470,7 +425,7 @@ namespace netgen } } - void VisualSceneSolution :: BuildFieldLinesFromLine(NgArray & startpoints) + void VisualSceneSolution :: BuildFieldLinesFromLine(Array> & startpoints) { shared_ptr mesh = GetMesh(); if (!mesh) return; @@ -480,7 +435,7 @@ namespace netgen { double s = double (rand()) / RAND_MAX; - Point3d p (fieldlines_startarea_parameter[0] + s * (fieldlines_startarea_parameter[3]-fieldlines_startarea_parameter[0]), + Point<3> p (fieldlines_startarea_parameter[0] + s * (fieldlines_startarea_parameter[3]-fieldlines_startarea_parameter[0]), fieldlines_startarea_parameter[1] + s * (fieldlines_startarea_parameter[4]-fieldlines_startarea_parameter[1]), fieldlines_startarea_parameter[2] + s * (fieldlines_startarea_parameter[5]-fieldlines_startarea_parameter[2])); @@ -489,7 +444,7 @@ namespace netgen } - void VisualSceneSolution :: BuildFieldLinesFromFile(NgArray & startpoints) + void VisualSceneSolution :: BuildFieldLinesFromFile(Array> & startpoints) { shared_ptr mesh = GetMesh(); if (!mesh) return; @@ -538,7 +493,9 @@ namespace netgen if (keyword == "point") { - (*infile) >> startpoints[numpoints].X(); (*infile) >> startpoints[numpoints].Y(); (*infile) >> startpoints[numpoints].Z(); + (*infile) >> startpoints[numpoints][0]; + (*infile) >> startpoints[numpoints][1]; + (*infile) >> startpoints[numpoints][2]; numpoints++; } else if (keyword == "line" || keyword == "box") @@ -546,7 +503,7 @@ namespace netgen for(int i=0; i<6; i++) (*infile) >> fieldlines_startarea_parameter[i]; (*infile) >> iparam; - NgArray auxpoints(iparam); + Array> auxpoints(iparam); if (keyword == "box") BuildFieldLinesFromBox(auxpoints); @@ -571,7 +528,7 @@ namespace netgen } - void VisualSceneSolution :: BuildFieldLinesFromFace(NgArray & startpoints) + void VisualSceneSolution :: BuildFieldLinesFromFace(Array> & startpoints) { shared_ptr mesh = GetMesh(); if (!mesh) return; @@ -678,8 +635,25 @@ namespace netgen num_fieldlineslists = (vsol -> iscomplex && !fieldlines_fixedphase) ? 100 : 1; + double phaser=1.0; + double phasei=0.0; + std::function eval_func = [&](int elnr, const double * lami, Vec<3> & vec) + { + double values[6] = {0., 0., 0., 0., 0., 0.}; + bool drawelem; + auto mesh = GetMesh(); + if (mesh->GetDimension()==3) + drawelem = GetValues (vsol, elnr, lami[0], lami[1], lami[2], values); + else + drawelem = GetSurfValues (vsol, elnr, -1, lami[0], lami[1], values); - FieldLineCalc linecalc(*mesh,*this,vsol, + Vec3d v; + RealVec3d (values, v, vsol->iscomplex, phaser, phasei); + vec = v; + return drawelem; + }; + + FieldLineCalc linecalc(*mesh, eval_func, fieldlines_rellength,fieldlines_maxpoints,fieldlines_relthickness,fieldlines_reltolerance,fieldlines_rktype); if(fieldlines_randomstart) @@ -694,7 +668,7 @@ namespace netgen num_startpoints *= 10; - NgArray startpoints(num_startpoints); + Array> startpoints(num_startpoints); for (int ln = 0; ln < num_fieldlineslists; ln++) @@ -722,17 +696,27 @@ namespace netgen cout << "phi = " << phi << endl; - double phaser = cos(phi), phasei = sin(phi); + phaser = cos(phi); + phasei = sin(phi); + linecalc.GenerateFieldLines(startpoints,num_fieldlines / num_fieldlineslists+1); + + auto & pstart = linecalc.GetPStart(); + auto & pend = linecalc.GetPEnd(); + auto & values = linecalc.GetValues(); + auto nlines = values.Size(); + glNewList(fieldlineslist+ln, GL_COMPILE); - SetTextureMode (usetexture); - linecalc.GenerateFieldLines(startpoints,num_fieldlines / num_fieldlineslists+1, - fieldlineslist+ln,minval,maxval,logscale,phaser,phasei); + + for(auto i : Range(nlines)) + { + SetOpenGlColor (values[i]); + DrawCylinder (pstart[i], pend[i], fieldlines_relthickness); + } glEndList (); - } } diff --git a/libsrc/visualization/vsfieldlines.hpp b/libsrc/visualization/vsfieldlines.hpp new file mode 100644 index 00000000..d4dfacdf --- /dev/null +++ b/libsrc/visualization/vsfieldlines.hpp @@ -0,0 +1,101 @@ +#ifndef VSFIELDLINES_HPP_INCLUDED +#define VSFIELDLINES_HPP_INCLUDED + +namespace netgen +{ + +class RKStepper +{ +private: + Array c,b; + TABLE *a; + int steps; + int order; + + double tolerance; + + Array> K; + + int stepcount; + + double h; + double startt; + double startt_bak; + Point<3> startval; + Point<3> startval_bak; + + bool adaptive; + int adrun; + Point<3> valh; + + int notrestarted; + +public: + + ~RKStepper(); + + RKStepper(int type = 0); + + void SetTolerance(const double tol){tolerance = tol;} + + void StartNextValCalc(const Point<3> & astartval, const double astartt, const double ah, const bool aadaptive = false); + + bool GetNextData(Point<3> & val, double & t, double & ah); + + bool FeedNextF(const Vec<3> & f); +}; + + + + +class FieldLineCalc +{ +private: + const Mesh & mesh; + + typedef std::function &)> VectorFunction; + + const VectorFunction & func; + RKStepper stepper; + + Array values; + Array> pstart, pend; + + double maxlength; + + int maxpoints; + + int direction; + + Point3d pmin, pmax; + double rad; + + double critical_value; + + bool randomized; + + double thickness; + +public: + FieldLineCalc(const Mesh & amesh, const VectorFunction & afunc, + const double rel_length, const int amaxpoints = -1, + const double rel_thickness = -1, const double rel_tolerance = -1, const int rk_type = 0, const int adirection = 0); + + void SetCriticalValue(const double val) { critical_value = val; } + + void Randomized(void) { randomized = true; } + void NotRandomized(void) { randomized = false; } + + void Calc(const Point<3> & startpoint, Array> & points, Array & vals, Array & drawelems, Array & dirstart); + + void GenerateFieldLines(Array> & potential_startpoints, const int numlines); + + const auto & GetPStart() const { return pstart; } + const auto & GetPEnd() const { return pend; } + const auto & GetValues() const { return values; } + const auto GetThickness() const { return thickness; } +}; + +} // namespace netgen + +#endif // VSFIELDLINES_HPP_INCLUDED diff --git a/libsrc/visualization/vssolution.hpp b/libsrc/visualization/vssolution.hpp index e10c8762..36c52467 100644 --- a/libsrc/visualization/vssolution.hpp +++ b/libsrc/visualization/vssolution.hpp @@ -1,6 +1,7 @@ #ifndef FILE_VSSOLUTION #define FILE_VSSOLUTION +#include "vsfieldlines.hpp" typedef void * ClientData; struct Tcl_Interp; @@ -12,8 +13,6 @@ namespace netgen DLL_HEADER extern void ImportSolution (const char * filename); -class FieldLineCalc; - extern int Ng_Vis_Set (ClientData clientData, Tcl_Interp * interp, int argc, const char *argv[]); @@ -183,10 +182,10 @@ public: bool imag_part; private: - void BuildFieldLinesFromFile(NgArray & startpoints); - void BuildFieldLinesFromFace(NgArray & startpoints); - void BuildFieldLinesFromBox(NgArray & startpoints); - void BuildFieldLinesFromLine(NgArray & startpoints); + void BuildFieldLinesFromFile(Array> & startpoints); + void BuildFieldLinesFromFace(Array> & startpoints); + void BuildFieldLinesFromBox(Array> & startpoints); + void BuildFieldLinesFromLine(Array> & startpoints); // weak_ptr wp_mesh; public: VisualSceneSolution (); @@ -359,95 +358,6 @@ public: -class RKStepper -{ -private: - NgArray c,b; - TABLE *a; - int steps; - int order; - - double tolerance; - - NgArray K; - - int stepcount; - - double h; - double startt; - double startt_bak; - Point3d startval; - Point3d startval_bak; - - bool adaptive; - int adrun; - Point3d valh; - - int notrestarted; - -public: - - ~RKStepper(); - - RKStepper(int type = 0); - - void SetTolerance(const double tol){tolerance = tol;} - - void StartNextValCalc(const Point3d & astartval, const double astartt, const double ah, const bool aadaptive = false); - - bool GetNextData(Point3d & val, double & t, double & ah); - - bool FeedNextF(const Vec3d & f); -}; - - - - - -class FieldLineCalc -{ -private: - const Mesh & mesh; - - VisualSceneSolution & vss; - - const VisualSceneSolution::SolData * vsol; - - RKStepper stepper; - - double maxlength; - - int maxpoints; - - int direction; - - Point3d pmin, pmax; - double rad; - double phaser, phasei; - - double critical_value; - - bool randomized; - - double thickness; - -public: - FieldLineCalc(const Mesh & amesh, VisualSceneSolution & avss, const VisualSceneSolution::SolData * solution, - const double rel_length, const int amaxpoints = -1, - const double rel_thickness = -1, const double rel_tolerance = -1, const int rk_type = 0, const int adirection = 0); - - void SetPhase(const double real, const double imag) { phaser = real; phasei = imag; } - - void SetCriticalValue(const double val) { critical_value = val; } - - void Randomized(void) { randomized = true; } - void NotRandomized(void) { randomized = false; } - - void Calc(const Point3d & startpoint, NgArray & points, NgArray & vals, NgArray & drawelems, NgArray & dirstart); - - void GenerateFieldLines(NgArray & potential_startpoints, const int numlines, const int gllist, - const double minval, const double maxval, const int logscale, double phaser, double phasei); -}; diff --git a/tests/pytest/compare_results.py b/tests/pytest/compare_results.py index 7f5b6b2b..1015be34 100644 --- a/tests/pytest/compare_results.py +++ b/tests/pytest/compare_results.py @@ -66,19 +66,27 @@ data2 = readData(s2, filenames) assert(len(data) == len(data2)) +w = 90 +GREEN = '\033[92m' +RED = '\033[91m' +RESET = '\033[0m' + for bad1,bad2, f1, f2 in zip(data['badness'], data2['badness'], data['file'], data2['file']): assert f1==f2 - if bad2>0 and bad2>1.1*bad1: - print(f"file {f1} got worse: {bad1} -> {bad2}") - if bad2>0 and bad2<0.9*bad1: - print(f"file {f1} got better: {bad1} -> {bad2}") + + diff = f"{100*(bad2-bad1)/bad1:+.2f}%" + if bad2>0 and bad2>1.2*bad1: + print(f"{RED}badness {f1} got worse: {bad1} -> {bad2}".ljust(w) + diff + RESET) + if bad2>0 and bad2<0.8*bad1: + print(f"{GREEN}badness {f1} got better: {bad1} -> {bad2}".ljust(w) + diff + RESET) for bad1,bad2, f1, f2 in zip(data['#trigs'], data2['#trigs'], data['file'], data2['file']): assert f1==f2 - if bad2>0 and bad2>1.1*bad1: - print(f"file {f1} got worse: {bad1} -> {bad2}") - if bad2>0 and bad2<0.9*bad1: - print(f"file {f1} got better: {bad1} -> {bad2}") + diff = f"{100*(bad2-bad1)/bad1:+.2f}%" + if bad2>0 and bad2>1.2*bad1: + print(f"{RED}ntrigs {f1} got worse: {bad1} -> {bad2}".ljust(w) + diff + RESET) + if bad2>0 and bad2<0.8*bad1: + print(f"{GREEN}ntrigs {f1} got better: {bad1} -> {bad2}".ljust(w) + diff + RESET) n = len(data)+1 fig,ax = plt.subplots(figsize=(10,7)) diff --git a/tests/pytest/results.json b/tests/pytest/results.json index ca20af3c..3cdc607c 100644 --- a/tests/pytest/results.json +++ b/tests/pytest/results.json @@ -62,142 +62,142 @@ }, { "angles_tet": [ - 25.177, - 132.08 + 27.415, + 131.66 ], "angles_trig": [ 26.455, 111.47 ], "ne1d": 118, - "ne2d": 134, - "ne3d": 152, - "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 1, 8, 17, 20, 37, 19, 27, 11, 7, 3]", - "total_badness": 207.64114313 + "ne2d": 126, + "ne3d": 141, + "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 3, 18, 11, 17, 30, 19, 19, 14, 7, 2]", + "total_badness": 196.01215512 }, { "angles_tet": [ - 26.85, - 134.36 + 26.405, + 131.02 ], "angles_trig": [ - 23.792, - 110.87 + 24.196, + 110.45 ], "ne1d": 181, - "ne2d": 303, - "ne3d": 483, - "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 6, 15, 24, 36, 46, 75, 98, 98, 67, 17]", - "total_badness": 612.2683156 + "ne2d": 291, + "ne3d": 459, + "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 9, 18, 30, 44, 69, 111, 100, 54, 18]", + "total_badness": 575.46697618 } ], "boxcyl.geo": [ { "angles_tet": [ - 22.381, - 137.43 + 21.213, + 142.56 ], "angles_trig": [ - 22.549, + 22.379, 121.98 ], "ne1d": 190, - "ne2d": 442, + "ne2d": 450, "ne3d": 834, - "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 0, 3, 31, 89, 69, 81, 84, 102, 103, 104, 89, 53, 26]", - "total_badness": 1200.7237412 + "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 0, 3, 24, 93, 74, 76, 85, 110, 106, 100, 99, 45, 19]", + "total_badness": 1200.3294639 }, { "angles_tet": [ - 14.314, - 146.41 + 19.341, + 145.29 ], "angles_trig": [ - 17.399, - 123.82 + 22.325, + 120.0 ], "ne1d": 94, - "ne2d": 106, - "ne3d": 114, - "quality_histogram": "[0, 0, 0, 0, 0, 2, 5, 4, 15, 15, 6, 14, 9, 9, 6, 8, 3, 15, 3, 0]", - "total_badness": 207.59021435 + "ne2d": 108, + "ne3d": 112, + "quality_histogram": "[0, 0, 0, 0, 0, 1, 4, 5, 15, 14, 6, 14, 6, 10, 7, 10, 3, 15, 2, 0]", + "total_badness": 200.73145455 }, { "angles_tet": [ - 14.935, + 14.751, 158.04 ], "angles_trig": [ - 14.903, - 149.51 + 19.228, + 140.0 ], "ne1d": 136, - "ne2d": 200, - "ne3d": 367, - "quality_histogram": "[0, 0, 0, 0, 1, 8, 10, 9, 20, 22, 35, 29, 34, 42, 45, 44, 34, 23, 9, 2]", - "total_badness": 613.62493724 + "ne2d": 204, + "ne3d": 326, + "quality_histogram": "[0, 0, 0, 2, 2, 7, 8, 10, 14, 12, 12, 22, 26, 34, 50, 43, 45, 26, 10, 3]", + "total_badness": 530.84214658 }, { "angles_tet": [ - 22.382, - 137.22 + 21.211, + 138.67 ], "angles_trig": [ - 22.55, + 22.376, 121.98 ], "ne1d": 190, - "ne2d": 442, - "ne3d": 828, - "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 0, 3, 31, 88, 71, 77, 88, 92, 102, 105, 95, 51, 25]", - "total_badness": 1191.1752803 + "ne2d": 450, + "ne3d": 833, + "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 0, 1, 24, 86, 78, 71, 79, 124, 107, 92, 99, 51, 21]", + "total_badness": 1192.8552253 }, { "angles_tet": [ - 25.193, - 142.93 + 26.153, + 141.36 ], "angles_trig": [ - 23.036, - 111.44 + 25.575, + 114.94 ], "ne1d": 284, - "ne2d": 910, - "ne3d": 3801, - "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 0, 1, 7, 14, 65, 129, 255, 519, 647, 784, 725, 498, 157]", - "total_badness": 4770.764698 + "ne2d": 922, + "ne3d": 3853, + "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 0, 1, 3, 15, 42, 118, 219, 455, 671, 787, 798, 574, 170]", + "total_badness": 4779.2253231 }, { "angles_tet": [ - 25.686, - 137.76 + 25.158, + 143.56 ], "angles_trig": [ - 26.198, - 119.03 + 26.346, + 116.86 ], "ne1d": 456, "ne2d": 2480, - "ne3d": 18778, - "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 39, 96, 314, 816, 1655, 2806, 3971, 4416, 3479, 1182]", - "total_badness": 22691.610278 + "ne3d": 18633, + "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 0, 2, 3, 17, 93, 295, 810, 1622, 2827, 3994, 4471, 3391, 1108]", + "total_badness": 22509.04709 } ], "circle_on_cube.geo": [ { "angles_tet": [ - 25.579, - 136.39 + 25.073, + 134.64 ], "angles_trig": [ - 20.15, - 111.56 + 20.125, + 122.26 ], "ne1d": 94, - "ne2d": 150, - "ne3d": 578, - "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 0, 1, 6, 9, 23, 43, 59, 74, 99, 117, 84, 48, 15]", - "total_badness": 762.64237113 + "ne2d": 162, + "ne3d": 616, + "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 0, 4, 13, 15, 36, 61, 59, 78, 112, 98, 85, 43, 12]", + "total_badness": 838.94349075 }, { "angles_tet": [ @@ -216,155 +216,155 @@ }, { "angles_tet": [ - 18.766, - 146.83 + 20.678, + 133.74 ], "angles_trig": [ - 14.126, - 128.64 + 23.119, + 112.86 ], "ne1d": 62, - "ne2d": 58, - "ne3d": 94, - "quality_histogram": "[0, 0, 0, 0, 0, 2, 3, 4, 14, 10, 10, 12, 10, 7, 8, 5, 5, 2, 2, 0]", - "total_badness": 175.55221243 + "ne2d": 76, + "ne3d": 155, + "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 9, 16, 26, 34, 29, 13, 10, 8, 0]", + "total_badness": 220.46268417 }, { "angles_tet": [ - 26.166, - 136.2 + 25.158, + 131.6 ], "angles_trig": [ - 20.063, - 110.55 + 23.161, + 113.1 ], "ne1d": 94, - "ne2d": 150, - "ne3d": 564, - "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 0, 1, 7, 5, 22, 38, 45, 75, 86, 114, 101, 52, 18]", - "total_badness": 734.30333869 + "ne2d": 162, + "ne3d": 587, + "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 8, 22, 44, 62, 62, 114, 104, 94, 57, 15]", + "total_badness": 769.56121713 }, { "angles_tet": [ - 18.947, - 141.98 + 22.472, + 138.67 ], "angles_trig": [ - 24.603, - 112.92 + 26.461, + 115.01 ], "ne1d": 138, - "ne2d": 362, - "ne3d": 1978, - "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 8, 16, 57, 136, 226, 331, 423, 399, 305, 76]", - "total_badness": 2453.3111469 + "ne2d": 370, + "ne3d": 2009, + "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 13, 21, 56, 130, 220, 339, 438, 428, 295, 67]", + "total_badness": 2495.8001047 }, { "angles_tet": [ - 24.914, - 138.54 + 25.429, + 141.91 ], "angles_trig": [ - 27.403, - 115.74 + 26.66, + 115.7 ], "ne1d": 224, - "ne2d": 918, - "ne3d": 12171, - "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 19, 65, 192, 544, 1196, 1933, 2623, 2776, 2143, 678]", - "total_badness": 14771.191214 + "ne2d": 922, + "ne3d": 12168, + "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 0, 1, 8, 17, 52, 227, 553, 1180, 1901, 2590, 2911, 2091, 637]", + "total_badness": 14779.532725 } ], "cone.geo": [ { "angles_tet": [ - 13.959, - 145.17 + 14.938, + 141.57 ], "angles_trig": [ - 17.709, - 122.83 + 16.548, + 122.02 ], "ne1d": 64, - "ne2d": 716, - "ne3d": 1193, - "quality_histogram": "[0, 0, 0, 0, 0, 1, 8, 21, 36, 65, 91, 114, 136, 138, 147, 138, 138, 94, 49, 17]", - "total_badness": 1825.3796644 + "ne2d": 718, + "ne3d": 1191, + "quality_histogram": "[0, 0, 0, 0, 0, 1, 2, 18, 41, 51, 83, 122, 133, 145, 163, 130, 138, 89, 60, 15]", + "total_badness": 1802.9323748 }, { "angles_tet": [ - 14.349, - 156.46 + 8.3849, + 167.59 ], "angles_trig": [ - 18.7, - 131.31 + 10.826, + 151.58 ], "ne1d": 32, - "ne2d": 196, - "ne3d": 442, - "quality_histogram": "[0, 0, 0, 0, 1, 5, 7, 8, 16, 28, 37, 40, 32, 57, 54, 45, 39, 45, 24, 4]", - "total_badness": 699.53524897 + "ne2d": 208, + "ne3d": 486, + "quality_histogram": "[0, 0, 1, 4, 5, 16, 34, 28, 32, 34, 49, 35, 37, 42, 39, 42, 26, 28, 26, 8]", + "total_badness": 915.87761832 }, { "angles_tet": [ - 16.242, - 140.12 + 7.5064, + 168.59 ], "angles_trig": [ - 21.367, - 116.46 + 9.0552, + 153.87 ], "ne1d": 48, - "ne2d": 408, - "ne3d": 497, - "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 8, 29, 55, 62, 89, 69, 52, 63, 26, 23, 14, 7, 0]", - "total_badness": 837.19746456 + "ne2d": 420, + "ne3d": 618, + "quality_histogram": "[0, 0, 4, 11, 7, 17, 9, 23, 39, 60, 71, 85, 85, 55, 56, 27, 42, 19, 8, 0]", + "total_badness": 1183.5702625 }, { "angles_tet": [ - 12.917, - 147.02 + 17.166, + 143.86 ], "angles_trig": [ - 17.53, - 122.49 + 19.54, + 120.27 ], "ne1d": 64, - "ne2d": 716, - "ne3d": 1190, - "quality_histogram": "[0, 0, 0, 0, 0, 2, 7, 16, 26, 57, 80, 117, 132, 150, 151, 132, 156, 85, 58, 21]", - "total_badness": 1789.662354 + "ne2d": 718, + "ne3d": 1186, + "quality_histogram": "[0, 0, 0, 0, 0, 0, 2, 8, 22, 42, 92, 106, 123, 168, 148, 166, 127, 103, 62, 17]", + "total_badness": 1745.7492969 }, { "angles_tet": [ - 20.152, - 140.59 + 25.516, + 138.4 ], "angles_trig": [ - 19.793, - 121.13 + 25.119, + 121.58 ], "ne1d": 96, - "ne2d": 1656, - "ne3d": 4481, - "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 2, 9, 28, 67, 134, 261, 426, 543, 744, 815, 762, 515, 175]", - "total_badness": 5797.2847197 + "ne2d": 1648, + "ne3d": 4372, + "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 0, 2, 16, 60, 127, 237, 407, 551, 707, 802, 764, 543, 156]", + "total_badness": 5622.2033105 }, { "angles_tet": [ - 23.13, - 141.34 + 20.726, + 143.6 ], "angles_trig": [ - 25.609, - 124.08 + 23.171, + 123.6 ], "ne1d": 160, - "ne2d": 4734, - "ne3d": 27310, - "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 0, 5, 22, 79, 236, 612, 1361, 2821, 4232, 5748, 6024, 4643, 1527]", - "total_badness": 33398.694667 + "ne2d": 4738, + "ne3d": 27128, + "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 1, 6, 18, 86, 216, 621, 1451, 2693, 4334, 5762, 5891, 4576, 1473]", + "total_badness": 33206.092666 } ], "cube.geo": [ @@ -445,18 +445,18 @@ }, { "angles_tet": [ - 29.991, - 134.06 + 31.709, + 132.62 ], "angles_trig": [ - 26.35, - 105.96 + 28.796, + 108.23 ], "ne1d": 72, - "ne2d": 104, - "ne3d": 162, - "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 6, 14, 12, 13, 41, 27, 20, 18, 8]", - "total_badness": 210.80585887 + "ne2d": 92, + "ne3d": 138, + "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 4, 11, 8, 8, 25, 23, 30, 17, 10]", + "total_badness": 173.92559042 } ], "cubeandring.geo": [ @@ -466,14 +466,14 @@ 170.37 ], "angles_trig": [ - 11.709, + 11.614, 156.34 ], "ne1d": 262, - "ne2d": 646, - "ne3d": 2049, - "quality_histogram": "[0, 4, 6, 20, 51, 101, 103, 102, 88, 54, 56, 95, 154, 187, 216, 229, 256, 199, 102, 26]", - "total_badness": 3765.2699547 + "ne2d": 652, + "ne3d": 2038, + "quality_histogram": "[0, 2, 7, 27, 57, 102, 101, 108, 81, 61, 60, 83, 136, 187, 241, 238, 234, 170, 107, 36]", + "total_badness": 3798.8151666 }, { "angles_tet": [ @@ -481,14 +481,14 @@ 155.18 ], "angles_trig": [ - 21.268, - 106.69 + 22.715, + 110.61 ], "ne1d": 134, "ne2d": 142, - "ne3d": 226, - "quality_histogram": "[0, 0, 0, 0, 0, 1, 0, 1, 0, 3, 5, 22, 32, 32, 36, 39, 32, 16, 6, 1]", - "total_badness": 323.42914868 + "ne3d": 205, + "quality_histogram": "[0, 0, 0, 0, 0, 1, 0, 1, 0, 3, 7, 17, 26, 37, 30, 28, 34, 15, 2, 4]", + "total_badness": 293.89415407 }, { "angles_tet": [ @@ -496,14 +496,14 @@ 159.84 ], "angles_trig": [ - 9.8283, + 20.057, 131.52 ], "ne1d": 190, "ne2d": 242, - "ne3d": 525, - "quality_histogram": "[0, 0, 0, 0, 3, 0, 0, 5, 1, 21, 42, 42, 44, 83, 89, 62, 56, 51, 18, 8]", - "total_badness": 777.16688578 + "ne3d": 501, + "quality_histogram": "[0, 0, 0, 0, 2, 0, 0, 5, 4, 14, 39, 54, 41, 82, 64, 82, 54, 37, 23, 0]", + "total_badness": 745.18627676 }, { "angles_tet": [ @@ -515,40 +515,40 @@ 156.34 ], "ne1d": 262, - "ne2d": 646, - "ne3d": 1941, - "quality_histogram": "[0, 1, 5, 15, 44, 77, 97, 97, 81, 32, 36, 59, 100, 185, 215, 266, 272, 218, 111, 30]", - "total_badness": 3393.5254327 + "ne2d": 652, + "ne3d": 1894, + "quality_histogram": "[0, 2, 5, 20, 38, 79, 95, 106, 70, 32, 41, 60, 94, 145, 217, 266, 250, 198, 121, 55]", + "total_badness": 3344.7627877 }, { "angles_tet": [ - 22.827, - 143.72 + 21.707, + 139.77 ], "angles_trig": [ - 22.59, - 116.33 + 23.443, + 118.77 ], "ne1d": 378, - "ne2d": 1348, - "ne3d": 7579, - "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 0, 2, 5, 40, 96, 247, 468, 894, 1291, 1522, 1590, 1095, 329]", - "total_badness": 9427.827601 + "ne2d": 1360, + "ne3d": 7586, + "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 0, 1, 9, 46, 126, 290, 603, 925, 1250, 1521, 1436, 1062, 317]", + "total_badness": 9530.8442156 }, { "angles_tet": [ - 22.517, - 144.9 + 23.791, + 144.45 ], "angles_trig": [ - 23.415, - 116.36 + 26.716, + 123.99 ], "ne1d": 624, - "ne2d": 3856, - "ne3d": 38126, - "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 1, 2, 16, 60, 220, 657, 1697, 3679, 5714, 8157, 8715, 6874, 2334]", - "total_badness": 46204.878514 + "ne2d": 3860, + "ne3d": 38096, + "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 1, 2, 26, 61, 218, 722, 1809, 3652, 6020, 8063, 8757, 6666, 2099]", + "total_badness": 46320.985555 } ], "cubeandspheres.geo": [ @@ -564,8 +564,8 @@ "ne1d": 144, "ne2d": 144, "ne3d": 92, - "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 0, 3, 6, 3, 2, 16, 17, 14, 18, 5, 5, 3, 0]", - "total_badness": 136.87889813 + "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 0, 3, 6, 3, 2, 17, 19, 12, 18, 4, 6, 2, 0]", + "total_badness": 137.495802 }, { "angles_tet": [ @@ -573,14 +573,14 @@ 137.5 ], "angles_trig": [ - 31.01, - 105.82 + 30.884, + 106.1 ], "ne1d": 144, - "ne2d": 142, - "ne3d": 89, - "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 7, 5, 18, 17, 16, 14, 4, 4, 2, 0]", - "total_badness": 131.78651922 + "ne2d": 138, + "ne3d": 83, + "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 7, 5, 24, 16, 11, 15, 1, 1, 1, 0]", + "total_badness": 126.26836349 }, { "angles_tet": [ @@ -588,14 +588,14 @@ 137.32 ], "angles_trig": [ - 29.702, - 106.44 + 31.068, + 105.7 ], "ne1d": 144, - "ne2d": 140, - "ne3d": 86, - "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 6, 6, 21, 17, 10, 18, 1, 3, 1, 0]", - "total_badness": 130.72052443 + "ne2d": 138, + "ne3d": 83, + "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 6, 5, 23, 16, 8, 19, 0, 3, 0, 0]", + "total_badness": 126.93839932 }, { "angles_tet": [ @@ -609,222 +609,222 @@ "ne1d": 144, "ne2d": 144, "ne3d": 92, - "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 0, 3, 6, 3, 2, 16, 17, 14, 18, 5, 5, 3, 0]", - "total_badness": 136.87889813 + "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 0, 3, 6, 3, 2, 17, 19, 12, 18, 4, 6, 2, 0]", + "total_badness": 137.495802 }, { "angles_tet": [ - 20.486, - 141.03 + 26.936, + 139.31 ], "angles_trig": [ - 23.901, - 126.55 + 22.269, + 127.24 ], "ne1d": 264, - "ne2d": 354, - "ne3d": 317, - "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 1, 4, 18, 22, 46, 43, 38, 25, 33, 49, 21, 17, 0]", - "total_badness": 475.11096062 + "ne2d": 344, + "ne3d": 304, + "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 0, 1, 20, 20, 42, 39, 43, 18, 34, 42, 30, 14, 1]", + "total_badness": 450.93390985 }, { "angles_tet": [ - 11.414, - 155.58 + 15.335, + 146.31 ], "angles_trig": [ 18.471, 128.1 ], "ne1d": 428, - "ne2d": 910, - "ne3d": 1058, - "quality_histogram": "[0, 0, 0, 0, 1, 1, 3, 22, 52, 37, 105, 115, 103, 113, 164, 165, 69, 60, 31, 17]", - "total_badness": 1653.0030832 + "ne2d": 906, + "ne3d": 1041, + "quality_histogram": "[0, 0, 0, 0, 0, 0, 4, 24, 50, 35, 98, 106, 102, 105, 178, 167, 69, 59, 26, 18]", + "total_badness": 1617.9736122 } ], "cubemcyl.geo": [ { "angles_tet": [ - 18.29, - 151.61 + 17.552, + 149.02 ], "angles_trig": [ - 18.858, - 126.71 + 19.505, + 129.13 ], "ne1d": 142, "ne2d": 2400, - "ne3d": 20080, - "quality_histogram": "[0, 0, 0, 0, 0, 0, 2, 13, 46, 165, 396, 855, 1516, 2355, 3110, 3353, 3421, 2770, 1658, 420]", - "total_badness": 26787.208427 + "ne3d": 20169, + "quality_histogram": "[0, 0, 0, 0, 0, 0, 5, 25, 79, 231, 483, 876, 1588, 2360, 2911, 3368, 3435, 2711, 1628, 469]", + "total_badness": 27089.560986 }, { "angles_tet": [ - 12.424, - 149.77 + 15.294, + 163.36 ], "angles_trig": [ - 5.6553, - 137.12 + 13.852, + 128.58 ], "ne1d": 64, "ne2d": 556, - "ne3d": 2899, - "quality_histogram": "[0, 0, 5, 6, 5, 23, 21, 35, 55, 100, 154, 193, 311, 394, 437, 411, 351, 229, 146, 23]", - "total_badness": 4384.1637893 + "ne3d": 3011, + "quality_histogram": "[0, 0, 0, 1, 3, 1, 14, 25, 40, 85, 116, 209, 333, 406, 462, 445, 441, 279, 120, 31]", + "total_badness": 4347.4002113 }, { "angles_tet": [ - 4.4955, - 147.48 + 17.198, + 146.78 ], "angles_trig": [ - 2.2524, - 145.77 + 19.119, + 125.8 ], "ne1d": 102, - "ne2d": 1302, - "ne3d": 7665, - "quality_histogram": "[0, 3, 5, 7, 15, 22, 24, 38, 71, 114, 212, 415, 663, 962, 1253, 1231, 1179, 864, 462, 125]", - "total_badness": 10830.485107 + "ne2d": 1280, + "ne3d": 8063, + "quality_histogram": "[0, 0, 0, 0, 0, 0, 2, 5, 27, 79, 200, 404, 723, 1075, 1303, 1418, 1197, 941, 556, 133]", + "total_badness": 10967.392706 }, { "angles_tet": [ - 22.268, - 143.56 + 19.398, + 141.79 ], "angles_trig": [ - 20.687, - 124.28 + 21.638, + 126.55 ], "ne1d": 142, "ne2d": 2400, - "ne3d": 19128, - "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 1, 6, 48, 146, 456, 977, 1822, 2671, 3359, 3790, 3213, 2054, 585]", - "total_badness": 24548.283098 + "ne3d": 19151, + "quality_histogram": "[0, 0, 0, 0, 0, 0, 1, 3, 14, 55, 170, 418, 1024, 1805, 2657, 3451, 3664, 3317, 2042, 530]", + "total_badness": 24613.208269 }, { "angles_tet": [ - 22.278, - 146.21 + 21.795, + 146.06 ], "angles_trig": [ - 21.432, - 126.27 + 22.867, + 125.23 ], "ne1d": 210, - "ne2d": 5448, - "ne3d": 88393, - "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 1, 9, 61, 264, 707, 2132, 4989, 9346, 14340, 18449, 19786, 13902, 4407]", - "total_badness": 108570.05743 + "ne2d": 5460, + "ne3d": 88820, + "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 1, 11, 51, 248, 703, 2183, 5117, 9583, 14386, 18836, 19401, 14091, 4209]", + "total_badness": 109216.91549 }, { "angles_tet": [ - 21.755, - 142.17 + 23.058, + 143.66 ], "angles_trig": [ - 25.335, - 124.04 + 23.971, + 124.25 ], "ne1d": 362, - "ne2d": 15076, - "ne3d": 519486, - "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 0, 10, 78, 534, 2092, 7171, 20542, 46844, 80091, 110045, 123840, 97302, 30937]", - "total_badness": 626360.0765 + "ne2d": 15082, + "ne3d": 520159, + "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 0, 9, 85, 499, 2149, 7346, 21113, 47200, 79734, 110083, 123828, 97201, 30912]", + "total_badness": 627466.22084 } ], "cubemsphere.geo": [ { "angles_tet": [ - 15.908, - 149.99 + 22.156, + 150.39 ], "angles_trig": [ - 18.075, - 128.12 + 20.064, + 125.29 ], "ne1d": 90, - "ne2d": 578, - "ne3d": 4517, - "quality_histogram": "[0, 0, 0, 0, 0, 0, 2, 2, 12, 31, 103, 192, 372, 548, 749, 776, 686, 582, 361, 101]", - "total_badness": 6066.8898916 + "ne2d": 570, + "ne3d": 4523, + "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 2, 9, 41, 75, 170, 331, 494, 702, 821, 761, 645, 383, 89]", + "total_badness": 6000.2419679 }, { "angles_tet": [ - 4.2935, - 162.9 + 10.055, + 158.35 ], "angles_trig": [ - 2.6079, - 162.43 + 7.7708, + 147.23 ], "ne1d": 44, - "ne2d": 160, - "ne3d": 378, - "quality_histogram": "[2, 7, 19, 22, 27, 28, 41, 51, 36, 35, 26, 19, 14, 17, 12, 8, 5, 5, 4, 0]", - "total_badness": 1229.9289128 + "ne2d": 142, + "ne3d": 313, + "quality_histogram": "[0, 0, 1, 2, 9, 23, 31, 23, 34, 37, 31, 32, 22, 30, 18, 10, 4, 3, 1, 2]", + "total_badness": 701.96510542 }, { "angles_tet": [ - 3.4817, - 165.76 + 13.22, + 146.51 ], "angles_trig": [ - 4.1545, - 158.54 + 16.161, + 132.51 ], "ne1d": 68, - "ne2d": 282, - "ne3d": 720, - "quality_histogram": "[0, 13, 13, 34, 36, 57, 42, 48, 59, 60, 69, 63, 64, 39, 52, 31, 19, 14, 6, 1]", - "total_badness": 1926.778943 + "ne2d": 272, + "ne3d": 1429, + "quality_histogram": "[0, 0, 0, 0, 0, 1, 0, 2, 7, 15, 38, 92, 155, 214, 253, 241, 169, 143, 76, 23]", + "total_badness": 1985.519867 }, { "angles_tet": [ - 24.843, - 135.95 + 24.16, + 139.58 ], "angles_trig": [ - 22.595, - 120.95 + 20.668, + 120.71 ], "ne1d": 90, - "ne2d": 578, + "ne2d": 570, "ne3d": 4315, - "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 0, 2, 8, 35, 97, 243, 435, 664, 818, 762, 661, 453, 137]", - "total_badness": 5570.2655329 + "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 0, 1, 12, 36, 65, 214, 404, 593, 811, 842, 765, 470, 102]", + "total_badness": 5519.2080716 }, { "angles_tet": [ - 26.45, - 137.76 + 25.558, + 139.27 ], "angles_trig": [ - 25.112, - 123.32 + 21.95, + 123.73 ], "ne1d": 146, - "ne2d": 1352, - "ne3d": 17421, - "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 0, 1, 8, 22, 131, 414, 971, 1882, 2873, 3689, 3870, 2743, 817]", - "total_badness": 21385.297282 + "ne2d": 1366, + "ne3d": 17357, + "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 0, 1, 8, 45, 131, 383, 1002, 1818, 2868, 3691, 3818, 2778, 814]", + "total_badness": 21308.513568 }, { "angles_tet": [ - 24.832, - 145.86 + 24.327, + 140.29 ], "angles_trig": [ - 24.621, - 125.42 + 25.758, + 120.76 ], "ne1d": 248, - "ne2d": 4264, - "ne3d": 113972, - "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 0, 1, 23, 112, 508, 1803, 5010, 10737, 17621, 24583, 27166, 20300, 6108]", - "total_badness": 138019.12707 + "ne2d": 4248, + "ne3d": 112960, + "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 0, 2, 17, 100, 493, 1726, 4923, 10719, 17771, 23842, 26353, 20492, 6522]", + "total_badness": 136671.30101 } ], "cylinder.geo": [ @@ -840,23 +840,23 @@ "ne1d": 52, "ne2d": 286, "ne3d": 407, - "quality_histogram": "[0, 0, 0, 0, 0, 0, 1, 1, 2, 4, 10, 32, 49, 50, 80, 56, 51, 43, 14, 14]", - "total_badness": 567.6529731 + "quality_histogram": "[0, 0, 0, 0, 0, 0, 1, 1, 2, 4, 10, 32, 48, 50, 81, 56, 52, 42, 14, 14]", + "total_badness": 567.546292 }, { "angles_tet": [ - 19.585, - 151.92 + 24.676, + 151.98 ], "angles_trig": [ - 25.265, - 119.9 + 24.811, + 126.7 ], "ne1d": 24, - "ne2d": 54, - "ne3d": 64, - "quality_histogram": "[0, 0, 0, 0, 0, 0, 2, 1, 3, 5, 4, 2, 6, 2, 6, 5, 10, 14, 4, 0]", - "total_badness": 96.748068941 + "ne2d": 66, + "ne3d": 70, + "quality_histogram": "[0, 0, 0, 0, 0, 0, 1, 0, 6, 5, 5, 2, 6, 5, 3, 5, 14, 17, 1, 0]", + "total_badness": 105.64076027 }, { "angles_tet": [ @@ -865,13 +865,13 @@ ], "angles_trig": [ 20.122, - 125.66 + 127.45 ], "ne1d": 36, - "ne2d": 150, - "ne3d": 375, - "quality_histogram": "[0, 0, 1, 0, 0, 3, 3, 10, 17, 29, 24, 29, 26, 37, 44, 40, 56, 31, 19, 6]", - "total_badness": 590.20528303 + "ne2d": 152, + "ne3d": 358, + "quality_histogram": "[0, 0, 1, 0, 0, 2, 5, 11, 21, 19, 22, 22, 31, 29, 35, 39, 57, 37, 17, 10]", + "total_badness": 559.67848726 }, { "angles_tet": [ @@ -885,8 +885,8 @@ "ne1d": 52, "ne2d": 286, "ne3d": 407, - "quality_histogram": "[0, 0, 0, 0, 0, 0, 1, 1, 0, 3, 10, 31, 45, 56, 71, 62, 52, 47, 15, 13]", - "total_badness": 563.99888545 + "quality_histogram": "[0, 0, 0, 0, 0, 0, 1, 1, 0, 3, 10, 31, 45, 55, 73, 61, 53, 46, 15, 13]", + "total_badness": 563.90833945 }, { "angles_tet": [ @@ -905,55 +905,55 @@ }, { "angles_tet": [ - 24.738, - 141.03 + 27.151, + 138.19 ], "angles_trig": [ - 29.601, - 116.9 + 27.89, + 120.16 ], "ne1d": 124, - "ne2d": 1670, - "ne3d": 7991, - "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 21, 49, 169, 377, 767, 1189, 1736, 1812, 1396, 466]", - "total_badness": 9722.1060014 + "ne2d": 1666, + "ne3d": 7963, + "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 21, 55, 143, 336, 696, 1178, 1725, 1848, 1439, 521]", + "total_badness": 9633.6668545 } ], "cylsphere.geo": [ { "angles_tet": [ - 12.833, - 149.94 + 16.89, + 146.66 ], "angles_trig": [ 17.583, - 117.14 + 116.74 ], "ne1d": 104, "ne2d": 494, - "ne3d": 708, - "quality_histogram": "[0, 0, 0, 0, 0, 4, 5, 8, 19, 33, 56, 95, 109, 91, 100, 53, 69, 48, 15, 3]", - "total_badness": 1110.0194213 + "ne3d": 707, + "quality_histogram": "[0, 0, 0, 0, 0, 2, 5, 7, 19, 31, 60, 96, 109, 89, 101, 53, 69, 48, 15, 3]", + "total_badness": 1103.8873525 }, { "angles_tet": [ - 8.1842, - 167.4 + 11.146, + 163.27 ], "angles_trig": [ - 14.489, - 145.26 + 14.484, + 148.23 ], "ne1d": 48, - "ne2d": 108, - "ne3d": 113, - "quality_histogram": "[0, 0, 1, 0, 6, 9, 10, 13, 11, 4, 4, 8, 5, 2, 5, 10, 10, 10, 5, 0]", - "total_badness": 249.06754614 + "ne2d": 100, + "ne3d": 104, + "quality_histogram": "[0, 0, 0, 2, 1, 4, 13, 15, 9, 10, 14, 5, 5, 2, 6, 10, 8, 0, 0, 0]", + "total_badness": 228.55775864 }, { "angles_tet": [ 16.975, - 147.18 + 146.47 ], "angles_trig": [ 17.533, @@ -962,397 +962,397 @@ "ne1d": 104, "ne2d": 494, "ne3d": 706, - "quality_histogram": "[0, 0, 0, 0, 0, 2, 5, 6, 17, 29, 60, 98, 99, 98, 95, 68, 65, 45, 16, 3]", - "total_badness": 1096.9488814 + "quality_histogram": "[0, 0, 0, 0, 0, 2, 5, 6, 17, 30, 59, 98, 99, 97, 96, 68, 65, 45, 16, 3]", + "total_badness": 1096.9819246 }, { "angles_tet": [ - 19.241, - 140.25 + 19.739, + 142.01 ], "angles_trig": [ - 21.138, - 116.58 + 21.005, + 119.84 ], "ne1d": 152, "ne2d": 1082, - "ne3d": 2884, - "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 2, 6, 15, 56, 85, 176, 244, 375, 456, 547, 506, 328, 88]", - "total_badness": 3740.005695 + "ne3d": 2842, + "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 2, 5, 22, 43, 84, 156, 233, 309, 459, 535, 529, 378, 87]", + "total_badness": 3653.5906442 }, { "angles_tet": [ - 22.945, - 145.74 + 25.231, + 139.3 ], "angles_trig": [ - 27.12, - 115.87 + 25.146, + 122.8 ], "ne1d": 248, "ne2d": 2810, - "ne3d": 17919, - "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 1, 3, 10, 45, 96, 317, 861, 1686, 2949, 3898, 4052, 3047, 954]", - "total_badness": 21819.656496 + "ne3d": 17714, + "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 0, 1, 14, 29, 100, 280, 741, 1663, 2724, 3885, 4147, 3098, 1032]", + "total_badness": 21466.883949 } ], "ellipsoid.geo": [ { "angles_tet": [ - 15.534, - 146.31 + 18.985, + 146.67 ], "angles_trig": [ - 18.095, - 122.96 + 18.356, + 122.93 ], "ne1d": 0, "ne2d": 694, - "ne3d": 1255, - "quality_histogram": "[0, 0, 0, 0, 0, 0, 3, 13, 33, 59, 117, 135, 173, 157, 162, 126, 100, 99, 65, 13]", - "total_badness": 1914.4248586 + "ne3d": 1271, + "quality_histogram": "[0, 0, 0, 0, 0, 0, 2, 7, 34, 67, 108, 149, 145, 161, 175, 147, 107, 92, 59, 18]", + "total_badness": 1927.202371 }, { "angles_tet": [ - 4.2267, - 171.15 + 4.4724, + 169.99 ], "angles_trig": [ - 7.2421, - 153.5 + 9.3765, + 160.0 ], "ne1d": 0, - "ne2d": 152, - "ne3d": 544, - "quality_histogram": "[0, 4, 19, 30, 52, 49, 59, 42, 45, 45, 33, 29, 26, 26, 26, 22, 17, 9, 11, 0]", - "total_badness": 1572.666847 + "ne2d": 156, + "ne3d": 536, + "quality_histogram": "[0, 13, 28, 52, 60, 66, 49, 44, 44, 37, 27, 35, 22, 18, 13, 9, 7, 6, 6, 0]", + "total_badness": 1855.3951762 }, { "angles_tet": [ - 23.039, - 130.7 + 20.08, + 138.43 ], "angles_trig": [ - 23.681, - 117.91 + 19.842, + 116.21 ], "ne1d": 0, - "ne2d": 374, - "ne3d": 590, - "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 35, 73, 89, 83, 75, 92, 58, 43, 20, 7]", - "total_badness": 859.8231142 + "ne2d": 384, + "ne3d": 588, + "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 1, 7, 17, 40, 68, 74, 90, 109, 64, 52, 37, 22, 7]", + "total_badness": 870.44417377 }, { "angles_tet": [ - 19.029, - 140.1 + 22.423, + 143.66 ], "angles_trig": [ - 18.243, - 121.41 + 19.734, + 119.91 ], "ne1d": 0, "ne2d": 694, - "ne3d": 1231, - "quality_histogram": "[0, 0, 0, 0, 0, 0, 2, 7, 24, 51, 110, 119, 139, 188, 153, 128, 119, 99, 71, 21]", - "total_badness": 1836.0628191 + "ne3d": 1259, + "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 3, 20, 61, 90, 124, 145, 171, 157, 147, 147, 103, 75, 16]", + "total_badness": 1857.1598634 }, { "angles_tet": [ - 18.959, - 144.3 + 21.995, + 138.77 ], "angles_trig": [ - 21.676, - 119.81 + 25.46, + 115.64 ], "ne1d": 0, - "ne2d": 1584, - "ne3d": 5536, - "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 1, 2, 15, 57, 106, 294, 443, 669, 924, 1061, 1040, 720, 204]", - "total_badness": 7035.9855374 + "ne2d": 1578, + "ne3d": 5402, + "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 1, 2, 7, 41, 142, 273, 437, 588, 900, 1031, 1032, 733, 215]", + "total_badness": 6841.327071 }, { "angles_tet": [ - 23.314, - 140.61 + 21.744, + 144.6 ], "angles_trig": [ - 27.98, - 116.52 + 26.751, + 121.56 ], "ne1d": 0, - "ne2d": 4210, - "ne3d": 37163, - "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 0, 1, 7, 43, 152, 524, 1386, 3208, 5692, 7906, 8976, 6922, 2346]", - "total_badness": 44746.329323 + "ne2d": 4212, + "ne3d": 37347, + "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 0, 2, 9, 52, 185, 546, 1522, 3262, 5723, 7899, 8903, 6950, 2294]", + "total_badness": 45064.497844 } ], "ellipticcone.geo": [ { "angles_tet": [ - 20.13, - 143.9 + 23.263, + 146.25 ], "angles_trig": [ - 22.554, - 122.87 + 22.188, + 124.34 ], "ne1d": 174, - "ne2d": 1482, - "ne3d": 4886, - "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 2, 8, 31, 77, 177, 336, 475, 670, 833, 898, 744, 485, 150]", - "total_badness": 6402.0549846 + "ne2d": 1492, + "ne3d": 4957, + "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 0, 8, 34, 88, 187, 310, 511, 694, 881, 895, 745, 469, 135]", + "total_badness": 6507.6297349 }, { "angles_tet": [ - 15.435, - 140.13 + 20.274, + 150.89 ], "angles_trig": [ - 17.051, - 131.76 + 22.128, + 124.89 ], "ne1d": 86, - "ne2d": 328, - "ne3d": 459, - "quality_histogram": "[0, 0, 0, 0, 0, 0, 2, 8, 18, 32, 31, 44, 63, 59, 45, 50, 55, 38, 9, 5]", - "total_badness": 712.02439518 + "ne2d": 336, + "ne3d": 469, + "quality_histogram": "[0, 0, 0, 0, 0, 0, 1, 0, 6, 20, 36, 44, 66, 67, 67, 47, 50, 44, 16, 5]", + "total_badness": 695.59119444 }, { "angles_tet": [ - 16.365, - 153.35 + 16.545, + 153.27 ], "angles_trig": [ - 18.888, + 16.861, 134.96 ], "ne1d": 130, - "ne2d": 802, - "ne3d": 1501, - "quality_histogram": "[0, 0, 0, 0, 2, 1, 10, 29, 47, 47, 72, 80, 121, 174, 205, 211, 209, 164, 112, 17]", - "total_badness": 2190.1238513 + "ne2d": 794, + "ne3d": 1476, + "quality_histogram": "[0, 0, 0, 0, 1, 0, 19, 28, 50, 58, 53, 90, 145, 165, 181, 203, 199, 155, 101, 28]", + "total_badness": 2177.7084872 }, { "angles_tet": [ - 22.809, - 141.25 + 24.549, + 137.43 ], "angles_trig": [ - 24.235, - 122.87 + 22.188, + 117.33 ], "ne1d": 174, - "ne2d": 1482, - "ne3d": 4714, - "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 0, 3, 6, 37, 94, 239, 418, 606, 818, 906, 853, 546, 188]", - "total_badness": 6001.1768245 + "ne2d": 1492, + "ne3d": 4748, + "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 0, 3, 7, 32, 96, 200, 389, 599, 887, 945, 888, 521, 181]", + "total_badness": 6023.4146593 }, { "angles_tet": [ - 20.241, - 147.32 + 19.964, + 146.92 ], "angles_trig": [ - 21.48, - 127.48 + 22.162, + 126.99 ], "ne1d": 258, "ne2d": 3318, - "ne3d": 13172, - "quality_histogram": "[0, 0, 0, 0, 0, 0, 1, 2, 14, 51, 146, 270, 514, 923, 1539, 2100, 2652, 2569, 1820, 571]", - "total_badness": 16613.613562 + "ne3d": 13093, + "quality_histogram": "[0, 0, 0, 0, 0, 0, 1, 1, 13, 35, 131, 267, 525, 918, 1525, 2178, 2534, 2516, 1864, 585]", + "total_badness": 16495.184175 }, { "angles_tet": [ - 21.537, - 144.33 + 20.933, + 146.0 ], "angles_trig": [ - 21.861, - 124.59 + 22.947, + 128.99 ], "ne1d": 432, - "ne2d": 9248, - "ne3d": 69039, - "quality_histogram": "[0, 0, 0, 0, 0, 0, 1, 4, 14, 51, 224, 568, 1484, 3485, 6816, 10810, 14390, 15444, 12001, 3747]", - "total_badness": 84333.780072 + "ne2d": 9184, + "ne3d": 68625, + "quality_histogram": "[0, 0, 0, 0, 0, 0, 2, 8, 20, 51, 215, 569, 1425, 3426, 6873, 10848, 14353, 15147, 11893, 3795]", + "total_badness": 83844.770837 } ], "ellipticcyl.geo": [ { "angles_tet": [ - 20.436, - 145.36 + 20.908, + 145.52 ], "angles_trig": [ - 21.766, - 126.68 + 21.34, + 121.52 ], "ne1d": 156, - "ne2d": 948, - "ne3d": 2191, - "quality_histogram": "[0, 0, 0, 0, 0, 0, 1, 1, 10, 30, 73, 124, 175, 255, 335, 390, 327, 266, 153, 51]", - "total_badness": 2987.4418653 + "ne2d": 942, + "ne3d": 2141, + "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 3, 8, 29, 62, 101, 159, 256, 306, 360, 377, 282, 155, 43]", + "total_badness": 2890.2110231 }, { "angles_tet": [ - 21.008, - 136.06 + 16.477, + 144.27 ], "angles_trig": [ - 21.133, - 116.2 + 21.842, + 119.59 ], "ne1d": 76, - "ne2d": 206, - "ne3d": 265, - "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 0, 5, 12, 18, 30, 33, 42, 31, 38, 35, 13, 6, 2]", - "total_badness": 396.17130576 + "ne2d": 200, + "ne3d": 241, + "quality_histogram": "[0, 0, 0, 0, 0, 0, 2, 2, 11, 23, 16, 32, 31, 40, 30, 30, 14, 6, 4, 0]", + "total_badness": 387.30490812 }, { "angles_tet": [ - 23.38, - 141.53 + 24.683, + 136.88 ], "angles_trig": [ - 18.404, - 123.99 + 24.591, + 114.49 ], "ne1d": 116, - "ne2d": 564, - "ne3d": 1085, - "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 1, 2, 12, 17, 35, 60, 118, 183, 179, 180, 162, 105, 31]", - "total_badness": 1428.1024597 + "ne2d": 542, + "ne3d": 1031, + "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 0, 1, 3, 16, 45, 82, 99, 163, 195, 190, 115, 99, 23]", + "total_badness": 1364.8877139 }, { "angles_tet": [ - 21.472, - 136.96 + 21.397, + 134.44 ], "angles_trig": [ - 22.803, - 121.62 + 21.803, + 118.55 ], "ne1d": 156, - "ne2d": 948, - "ne3d": 2148, - "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 0, 3, 22, 39, 102, 159, 246, 340, 357, 364, 293, 174, 49]", - "total_badness": 2866.0060749 + "ne2d": 942, + "ne3d": 2091, + "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 0, 2, 15, 36, 73, 126, 232, 306, 377, 391, 305, 180, 48]", + "total_badness": 2749.9153281 }, { "angles_tet": [ - 26.968, - 138.73 + 21.299, + 145.92 ], "angles_trig": [ - 25.168, - 119.16 + 22.971, + 123.45 ], "ne1d": 232, - "ne2d": 2112, - "ne3d": 8096, - "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 0, 1, 5, 30, 81, 244, 519, 930, 1348, 1711, 1664, 1198, 365]", - "total_badness": 10036.018919 + "ne2d": 2102, + "ne3d": 7936, + "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 1, 2, 7, 36, 102, 243, 506, 936, 1318, 1618, 1632, 1161, 374]", + "total_badness": 9862.7920315 }, { "angles_tet": [ - 25.027, - 140.15 + 24.388, + 140.11 ], "angles_trig": [ - 26.044, - 122.75 + 24.731, + 114.31 ], "ne1d": 388, - "ne2d": 5926, - "ne3d": 54807, - "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 48, 204, 686, 2083, 4737, 8407, 11597, 13328, 10437, 3264]", - "total_badness": 65935.129361 + "ne2d": 5914, + "ne3d": 54280, + "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 57, 235, 715, 1972, 4653, 8290, 11507, 13163, 10250, 3423]", + "total_badness": 65288.837508 } ], "extrusion.geo": [ { "angles_tet": [ - 6.6964, - 171.51 + 6.6753, + 171.52 ], "angles_trig": [ - 10.774, - 152.07 + 11.356, + 151.93 ], "ne1d": 172, - "ne2d": 282, - "ne3d": 237, - "quality_histogram": "[0, 0, 2, 56, 40, 20, 2, 0, 0, 0, 2, 0, 5, 18, 18, 29, 21, 10, 9, 5]", - "total_badness": 741.49288863 + "ne2d": 284, + "ne3d": 239, + "quality_histogram": "[0, 0, 4, 51, 44, 23, 0, 0, 0, 0, 2, 0, 5, 18, 18, 29, 21, 10, 9, 5]", + "total_badness": 756.94679757 }, { "angles_tet": [ - 11.279, - 163.98 + 11.453, + 162.3 ], "angles_trig": [ - 15.327, - 147.24 + 14.644, + 140.86 ], "ne1d": 104, - "ne2d": 128, - "ne3d": 101, - "quality_histogram": "[0, 0, 0, 3, 5, 18, 18, 8, 9, 13, 7, 4, 5, 1, 3, 2, 3, 2, 0, 0]", - "total_badness": 271.97432779 + "ne2d": 126, + "ne3d": 99, + "quality_histogram": "[0, 0, 0, 1, 7, 18, 15, 11, 11, 10, 5, 5, 5, 1, 3, 2, 3, 2, 0, 0]", + "total_badness": 262.54448973 }, { "angles_tet": [ - 5.6224, - 170.69 + 14.092, + 161.67 ], "angles_trig": [ - 16.124, - 147.67 + 16.092, + 147.39 ], "ne1d": 134, - "ne2d": 172, - "ne3d": 143, - "quality_histogram": "[0, 0, 1, 0, 2, 4, 14, 25, 12, 24, 11, 9, 10, 11, 7, 3, 5, 3, 1, 1]", - "total_badness": 314.00919173 + "ne2d": 176, + "ne3d": 147, + "quality_histogram": "[0, 0, 0, 0, 2, 10, 15, 24, 11, 24, 11, 9, 10, 11, 7, 3, 5, 3, 1, 1]", + "total_badness": 324.38705634 }, { "angles_tet": [ - 6.6964, - 171.51 + 6.6753, + 171.52 ], "angles_trig": [ - 10.774, - 152.07 + 11.356, + 151.93 ], "ne1d": 172, - "ne2d": 282, - "ne3d": 237, - "quality_histogram": "[0, 0, 2, 56, 40, 20, 2, 0, 0, 0, 2, 0, 5, 18, 18, 29, 21, 10, 9, 5]", - "total_badness": 741.49288863 + "ne2d": 284, + "ne3d": 239, + "quality_histogram": "[0, 0, 4, 51, 44, 23, 0, 0, 0, 0, 2, 0, 5, 18, 18, 29, 21, 10, 9, 5]", + "total_badness": 756.94679757 }, { "angles_tet": [ - 19.062, - 139.4 + 13.66, + 140.84 ], "angles_trig": [ - 18.296, + 16.325, 118.98 ], "ne1d": 276, - "ne2d": 532, - "ne3d": 618, - "quality_histogram": "[0, 0, 0, 0, 0, 0, 1, 1, 16, 27, 43, 48, 89, 68, 79, 78, 87, 57, 21, 3]", - "total_badness": 913.4392763 + "ne2d": 544, + "ne3d": 623, + "quality_histogram": "[0, 0, 0, 0, 0, 0, 4, 11, 18, 30, 47, 70, 73, 69, 81, 73, 75, 52, 17, 3]", + "total_badness": 953.76990304 } ], "fichera.geo": [ { "angles_tet": [ - 30.672, + 31.625, 128.51 ], "angles_trig": [ @@ -1360,10 +1360,10 @@ 92.7 ], "ne1d": 50, - "ne2d": 32, - "ne3d": 26, - "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 8, 2, 6, 4, 3, 2, 0, 0, 0]", - "total_badness": 39.911011491 + "ne2d": 36, + "ne3d": 32, + "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 7, 2, 8, 8, 5, 0, 0, 0, 0]", + "total_badness": 48.255148991 }, { "angles_tet": [ @@ -1397,7 +1397,7 @@ }, { "angles_tet": [ - 30.672, + 31.625, 128.51 ], "angles_trig": [ @@ -1405,132 +1405,132 @@ 92.7 ], "ne1d": 50, - "ne2d": 32, - "ne3d": 26, - "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 8, 2, 6, 4, 3, 2, 0, 0, 0]", - "total_badness": 39.911011491 + "ne2d": 36, + "ne3d": 32, + "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 7, 2, 8, 8, 5, 0, 0, 0, 0]", + "total_badness": 48.255148991 }, { "angles_tet": [ - 26.062, - 133.14 + 28.158, + 128.52 ], "angles_trig": [ - 29.251, - 114.69 + 28.353, + 114.07 ], "ne1d": 96, - "ne2d": 110, - "ne3d": 190, - "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 6, 16, 25, 22, 28, 29, 27, 24, 9]", - "total_badness": 248.57894039 + "ne2d": 108, + "ne3d": 194, + "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 6, 12, 26, 25, 34, 34, 35, 12, 7]", + "total_badness": 254.28246256 }, { "angles_tet": [ - 27.419, - 130.74 + 28.713, + 135.86 ], "angles_trig": [ - 26.71, - 108.33 + 27.552, + 105.69 ], "ne1d": 144, - "ne2d": 262, - "ne3d": 487, - "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 15, 22, 50, 73, 111, 76, 70, 50, 17]", - "total_badness": 627.82591961 + "ne2d": 264, + "ne3d": 484, + "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 12, 23, 37, 65, 105, 72, 87, 59, 23]", + "total_badness": 613.06762292 } ], "hinge.stl": [ { "angles_tet": [ - 18.205, - 146.81 + 15.803, + 152.56 ], "angles_trig": [ - 17.917, - 127.07 + 19.22, + 131.45 ], "ne1d": 456, - "ne2d": 1076, - "ne3d": 1729, - "quality_histogram": "[0, 0, 0, 0, 0, 1, 5, 12, 33, 38, 60, 130, 183, 220, 235, 261, 226, 199, 91, 35]", - "total_badness": 2463.5649709 + "ne2d": 1066, + "ne3d": 1694, + "quality_histogram": "[0, 0, 0, 0, 0, 1, 6, 9, 23, 41, 74, 105, 136, 200, 243, 292, 219, 204, 110, 31]", + "total_badness": 2383.0874819 }, { "angles_tet": [ - 7.3139, - 161.2 + 4.8415, + 163.34 ], "angles_trig": [ - 9.6143, - 153.5 + 8.9881, + 149.17 ], "ne1d": 298, - "ne2d": 490, - "ne3d": 574, - "quality_histogram": "[0, 0, 2, 6, 11, 13, 27, 33, 56, 58, 57, 47, 44, 59, 33, 50, 36, 21, 18, 3]", - "total_badness": 1114.4411603 + "ne2d": 502, + "ne3d": 610, + "quality_histogram": "[0, 0, 3, 5, 10, 16, 27, 39, 43, 38, 55, 65, 64, 51, 49, 62, 38, 24, 16, 5]", + "total_badness": 1160.8468965 }, { "angles_tet": [ - 12.786, - 159.73 + 12.929, + 152.0 ], "angles_trig": [ - 12.778, - 139.91 + 10.914, + 145.17 ], "ne1d": 370, - "ne2d": 732, - "ne3d": 935, - "quality_histogram": "[0, 0, 0, 0, 5, 10, 16, 30, 32, 53, 58, 60, 90, 109, 134, 133, 78, 65, 52, 10]", - "total_badness": 1488.4734128 + "ne2d": 758, + "ne3d": 982, + "quality_histogram": "[0, 0, 0, 0, 0, 7, 6, 25, 33, 29, 47, 79, 112, 128, 147, 142, 96, 68, 50, 13]", + "total_badness": 1492.3556478 }, { "angles_tet": [ - 19.356, - 146.51 + 17.097, + 147.54 ], "angles_trig": [ - 18.992, - 125.77 + 18.124, + 131.28 ], "ne1d": 516, - "ne2d": 1472, - "ne3d": 2365, - "quality_histogram": "[0, 0, 0, 0, 0, 0, 5, 10, 22, 60, 73, 145, 202, 283, 350, 372, 317, 307, 177, 42]", - "total_badness": 3283.8687957 + "ne2d": 1454, + "ne3d": 2329, + "quality_histogram": "[0, 0, 0, 0, 0, 2, 2, 13, 22, 39, 68, 145, 210, 272, 358, 330, 328, 308, 185, 47]", + "total_badness": 3218.2251987 }, { "angles_tet": [ - 19.432, - 142.98 + 10.908, + 160.75 ], "angles_trig": [ - 21.947, - 119.25 + 24.909, + 127.95 ], "ne1d": 722, - "ne2d": 2746, - "ne3d": 6379, - "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 1, 8, 21, 61, 130, 283, 547, 828, 1011, 1102, 1176, 902, 309]", - "total_badness": 8087.035414 + "ne2d": 2768, + "ne3d": 6516, + "quality_histogram": "[0, 0, 0, 0, 1, 0, 0, 3, 16, 30, 61, 162, 306, 578, 835, 999, 1088, 1188, 967, 282]", + "total_badness": 8307.9517383 }, { "angles_tet": [ - 15.838, - 146.92 + 19.776, + 144.38 ], "angles_trig": [ - 20.0, - 130.52 + 22.289, + 122.14 ], "ne1d": 1862, - "ne2d": 18268, - "ne3d": 120103, - "quality_histogram": "[0, 0, 0, 0, 0, 1, 0, 10, 24, 98, 392, 1061, 2676, 6252, 12025, 18808, 25081, 26832, 20336, 6507]", - "total_badness": 146965.34247 + "ne2d": 18540, + "ne3d": 125397, + "quality_histogram": "[0, 0, 0, 0, 0, 0, 1, 4, 21, 93, 374, 1009, 2638, 6483, 12401, 19519, 26284, 28157, 21536, 6877]", + "total_badness": 153172.81544 } ], "lense.in2d": [ @@ -1559,7 +1559,7 @@ 0.0 ], "ne1d": 86, - "ne2d": 342, + "ne2d": 308, "ne3d": 0, "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]", "total_badness": 0.0 @@ -1574,7 +1574,7 @@ 0.0 ], "ne1d": 86, - "ne2d": 368, + "ne2d": 360, "ne3d": 0, "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]", "total_badness": 0.0 @@ -1604,7 +1604,7 @@ 0.0 ], "ne1d": 83, - "ne2d": 417, + "ne2d": 429, "ne3d": 0, "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]", "total_badness": 0.0 @@ -1619,7 +1619,7 @@ 0.0 ], "ne1d": 84, - "ne2d": 458, + "ne2d": 462, "ne3d": 0, "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]", "total_badness": 0.0 @@ -1703,174 +1703,174 @@ }, { "angles_tet": [ - 25.888, - 134.12 + 25.594, + 129.87 ], "angles_trig": [ - 26.482, - 106.78 + 24.835, + 109.77 ], "ne1d": 122, - "ne2d": 198, - "ne3d": 319, - "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 4, 14, 16, 39, 37, 59, 55, 55, 28, 10]", - "total_badness": 416.28374076 + "ne2d": 192, + "ne3d": 302, + "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 10, 16, 35, 31, 45, 51, 66, 34, 10]", + "total_badness": 388.25333392 } ], "manyholes.geo": [ { "angles_tet": [ - 15.191, - 155.8 + 17.962, + 147.8 ], "angles_trig": [ - 14.411, - 137.71 + 17.912, + 139.33 ], "ne1d": 5886, - "ne2d": 46416, - "ne3d": 175630, - "quality_histogram": "[0, 0, 0, 0, 0, 4, 12, 69, 242, 720, 2007, 5743, 10672, 18589, 26656, 29941, 31326, 26742, 18330, 4577]", - "total_badness": 229108.57703 + "ne2d": 45882, + "ne3d": 174631, + "quality_histogram": "[0, 0, 0, 0, 0, 1, 7, 64, 229, 668, 1859, 5592, 10791, 18495, 26482, 29904, 31051, 26889, 18192, 4407]", + "total_badness": 227663.03541 }, { "angles_tet": [ - 13.166, - 150.43 + 13.226, + 153.55 ], "angles_trig": [ - 11.4, - 135.07 + 14.377, + 130.91 ], "ne1d": 2746, - "ne2d": 10832, - "ne3d": 24107, - "quality_histogram": "[0, 0, 0, 1, 5, 13, 32, 121, 304, 583, 1177, 1811, 2617, 3207, 3349, 3174, 2993, 2559, 1730, 431]", - "total_badness": 34321.11295 + "ne2d": 10428, + "ne3d": 23614, + "quality_histogram": "[0, 0, 0, 1, 2, 8, 39, 141, 333, 732, 1350, 2122, 2750, 3219, 3149, 3069, 2743, 2192, 1438, 326]", + "total_badness": 34314.343654 }, { "angles_tet": [ - 12.302, - 154.38 + 12.344, + 154.1 ], "angles_trig": [ - 11.199, - 137.73 + 12.439, + 133.91 ], "ne1d": 4106, - "ne2d": 24994, - "ne3d": 65979, - "quality_histogram": "[0, 0, 0, 4, 34, 86, 168, 315, 597, 1188, 2193, 3715, 6023, 8222, 9723, 10165, 9734, 7638, 4706, 1468]", - "total_badness": 91826.638973 + "ne2d": 23238, + "ne3d": 63123, + "quality_histogram": "[0, 0, 0, 0, 31, 60, 174, 310, 596, 1169, 2077, 3620, 5748, 7925, 9100, 9947, 9228, 7455, 4552, 1131]", + "total_badness": 87899.222784 } ], "manyholes2.geo": [ { "angles_tet": [ - 13.955, - 151.14 + 10.467, + 152.55 ], "angles_trig": [ - 11.333, - 134.69 + 16.373, + 136.58 ], "ne1d": 10202, - "ne2d": 43304, - "ne3d": 107501, - "quality_histogram": "[0, 0, 0, 0, 4, 15, 77, 225, 555, 1362, 3013, 5640, 9191, 12539, 14439, 16029, 16376, 14961, 10288, 2787]", - "total_badness": 145364.86115 + "ne2d": 41054, + "ne3d": 104058, + "quality_histogram": "[0, 0, 0, 0, 2, 14, 88, 229, 686, 1719, 3645, 6682, 9826, 12717, 14060, 15164, 15249, 13389, 8410, 2178]", + "total_badness": 143298.73232 } ], "matrix.geo": [ { "angles_tet": [ - 9.6163, - 168.19 + 8.9391, + 167.45 ], "angles_trig": [ - 9.8098, - 159.08 + 9.9849, + 158.68 ], "ne1d": 174, - "ne2d": 1078, - "ne3d": 4695, - "quality_histogram": "[0, 0, 10, 104, 153, 76, 41, 64, 117, 157, 270, 340, 478, 535, 610, 559, 522, 393, 216, 50]", - "total_badness": 8124.2070403 + "ne2d": 1070, + "ne3d": 4599, + "quality_histogram": "[0, 0, 10, 93, 172, 67, 25, 59, 126, 165, 272, 371, 440, 515, 548, 537, 528, 411, 204, 56]", + "total_badness": 7959.8830096 }, { "angles_tet": [ - 3.5402, - 171.79 + 6.4945, + 166.83 ], "angles_trig": [ - 6.7343, - 161.8 + 8.2716, + 155.6 ], "ne1d": 106, - "ne2d": 320, - "ne3d": 886, - "quality_histogram": "[1, 5, 23, 43, 55, 66, 80, 82, 94, 94, 69, 62, 51, 59, 46, 24, 15, 13, 4, 0]", - "total_badness": 2437.7373267 + "ne2d": 314, + "ne3d": 872, + "quality_histogram": "[0, 0, 4, 34, 45, 54, 80, 72, 92, 87, 91, 73, 67, 53, 44, 32, 21, 20, 3, 0]", + "total_badness": 2091.3790714 }, { "angles_tet": [ - 6.0199, - 170.72 + 6.3225, + 170.81 ], "angles_trig": [ - 10.143, - 158.65 + 10.133, + 155.67 ], "ne1d": 132, - "ne2d": 568, - "ne3d": 1750, - "quality_histogram": "[0, 0, 4, 13, 27, 66, 96, 121, 125, 111, 142, 151, 187, 181, 172, 128, 102, 68, 46, 10]", - "total_badness": 3379.926803 + "ne2d": 588, + "ne3d": 1799, + "quality_histogram": "[0, 0, 2, 17, 33, 76, 152, 120, 84, 98, 127, 150, 170, 203, 187, 133, 118, 64, 55, 10]", + "total_badness": 3522.631959 }, { "angles_tet": [ - 9.6163, - 168.19 + 8.9391, + 167.45 ], "angles_trig": [ - 9.8098, - 159.08 + 9.9849, + 158.68 ], "ne1d": 174, - "ne2d": 1078, - "ne3d": 4601, - "quality_histogram": "[0, 0, 9, 104, 154, 75, 29, 65, 96, 153, 250, 283, 439, 534, 578, 558, 521, 446, 245, 62]", - "total_badness": 7880.7572168 + "ne2d": 1070, + "ne3d": 4497, + "quality_histogram": "[0, 0, 10, 93, 172, 65, 16, 60, 101, 137, 258, 314, 387, 500, 529, 561, 555, 411, 252, 76]", + "total_badness": 7683.1109366 }, { "angles_tet": [ - 13.692, - 145.38 + 13.101, + 145.56 ], "angles_trig": [ - 16.593, - 142.97 + 15.887, + 143.02 ], "ne1d": 248, - "ne2d": 2246, - "ne3d": 16087, - "quality_histogram": "[0, 0, 0, 0, 0, 4, 13, 58, 96, 163, 311, 538, 1011, 1464, 2091, 2489, 2808, 2647, 1846, 548]", - "total_badness": 21166.364348 + "ne2d": 2256, + "ne3d": 16133, + "quality_histogram": "[0, 0, 0, 0, 0, 7, 22, 55, 90, 186, 318, 576, 969, 1526, 2057, 2534, 2791, 2579, 1841, 582]", + "total_badness": 21280.729551 }, { "angles_tet": [ - 18.109, - 145.2 + 18.113, + 145.19 ], "angles_trig": [ - 17.842, + 17.821, 130.51 ], "ne1d": 418, - "ne2d": 5912, - "ne3d": 101337, - "quality_histogram": "[0, 0, 0, 0, 0, 1, 4, 8, 37, 112, 357, 998, 2349, 5491, 10326, 16109, 20892, 22119, 17216, 5318]", - "total_badness": 124316.62509 + "ne2d": 5914, + "ne3d": 101287, + "quality_histogram": "[0, 0, 0, 0, 0, 1, 6, 8, 42, 111, 349, 979, 2418, 5321, 10105, 15903, 20923, 22509, 17204, 5408]", + "total_badness": 124144.15591 } ], "ortho.geo": [ @@ -1951,739 +1951,739 @@ }, { "angles_tet": [ - 29.982, - 133.45 + 27.731, + 134.89 ], "angles_trig": [ 28.064, - 105.92 + 104.8 ], "ne1d": 72, "ne2d": 104, - "ne3d": 163, - "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 14, 17, 23, 25, 30, 23, 15, 8]", - "total_badness": 212.66114236 + "ne3d": 157, + "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 7, 9, 22, 17, 29, 25, 28, 10, 6]", + "total_badness": 206.30371107 } ], "part1.stl": [ { "angles_tet": [ - 15.243, - 146.68 + 22.083, + 138.04 ], "angles_trig": [ - 14.592, - 123.48 + 24.223, + 119.8 ], "ne1d": 170, - "ne2d": 364, - "ne3d": 889, - "quality_histogram": "[0, 0, 0, 0, 0, 0, 7, 4, 17, 22, 43, 55, 84, 109, 146, 122, 125, 86, 53, 16]", - "total_badness": 1272.7851809 + "ne2d": 400, + "ne3d": 1023, + "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 0, 2, 5, 16, 55, 75, 124, 152, 176, 176, 136, 86, 20]", + "total_badness": 1363.6686182 }, { "angles_tet": [ - 7.0578, - 170.03 + 10.722, + 160.47 ], "angles_trig": [ - 10.871, - 128.06 + 13.01, + 146.61 ], "ne1d": 134, - "ne2d": 234, - "ne3d": 448, - "quality_histogram": "[0, 0, 3, 3, 3, 5, 11, 10, 15, 28, 31, 57, 52, 51, 49, 43, 32, 30, 21, 4]", - "total_badness": 765.80892251 + "ne2d": 254, + "ne3d": 457, + "quality_histogram": "[0, 0, 0, 4, 1, 3, 9, 7, 11, 19, 29, 44, 53, 56, 60, 63, 43, 31, 20, 4]", + "total_badness": 726.0384133 }, { "angles_tet": [ - 19.616, - 140.51 + 20.846, + 134.73 ], "angles_trig": [ - 18.949, - 117.92 + 22.401, + 115.69 ], "ne1d": 194, - "ne2d": 530, - "ne3d": 1516, - "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 3, 9, 10, 28, 79, 112, 169, 220, 242, 240, 216, 155, 33]", - "total_badness": 2024.9790398 + "ne2d": 554, + "ne3d": 1600, + "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 0, 3, 4, 17, 63, 93, 166, 229, 275, 308, 246, 159, 37]", + "total_badness": 2088.862264 }, { "angles_tet": [ - 20.826, - 140.35 + 21.368, + 141.27 ], "angles_trig": [ - 25.675, - 116.28 + 26.65, + 112.07 ], "ne1d": 266, - "ne2d": 942, - "ne3d": 4074, - "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 1, 2, 6, 14, 64, 134, 274, 479, 760, 849, 793, 532, 166]", - "total_badness": 5097.0023223 + "ne2d": 958, + "ne3d": 4158, + "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 0, 5, 9, 19, 53, 126, 298, 501, 705, 822, 870, 591, 159]", + "total_badness": 5194.9903517 }, { "angles_tet": [ - 21.891, - 143.85 + 24.374, + 139.79 ], "angles_trig": [ - 26.118, - 123.16 + 25.767, + 121.5 ], "ne1d": 674, - "ne2d": 6326, - "ne3d": 71270, - "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 1, 1, 26, 120, 392, 1186, 3098, 6634, 10919, 15301, 16500, 13104, 3988]", - "total_badness": 86328.189175 + "ne2d": 6330, + "ne3d": 73017, + "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 0, 3, 15, 118, 382, 1197, 3223, 6772, 11399, 15438, 17121, 13196, 4153]", + "total_badness": 88445.46456 } ], "period.geo": [ { "angles_tet": [ - 13.037, - 153.97 + 14.172, + 145.15 ], "angles_trig": [ - 12.086, - 144.66 + 17.555, + 130.0 ], "ne1d": 344, - "ne2d": 1048, - "ne3d": 3044, - "quality_histogram": "[0, 0, 0, 2, 3, 8, 23, 33, 67, 91, 149, 251, 314, 378, 410, 409, 393, 347, 128, 38]", - "total_badness": 4485.4929434 + "ne2d": 1040, + "ne3d": 3043, + "quality_histogram": "[0, 0, 0, 0, 0, 6, 18, 25, 51, 71, 144, 251, 302, 421, 423, 407, 390, 306, 179, 49]", + "total_badness": 4402.5390324 }, { "angles_tet": [ - 10.189, - 159.51 + 7.025, + 170.6 ], "angles_trig": [ - 10.043, - 137.27 + 11.507, + 140.67 ], "ne1d": 160, - "ne2d": 228, - "ne3d": 382, - "quality_histogram": "[0, 0, 0, 10, 13, 15, 16, 19, 22, 32, 40, 42, 40, 30, 35, 29, 22, 15, 2, 0]", - "total_badness": 774.13188593 + "ne2d": 234, + "ne3d": 417, + "quality_histogram": "[0, 0, 2, 4, 4, 12, 17, 17, 26, 32, 44, 44, 48, 39, 27, 37, 33, 20, 8, 3]", + "total_badness": 780.76742775 }, { "angles_tet": [ - 7.9669, - 168.85 + 9.6632, + 163.12 ], "angles_trig": [ - 6.6001, - 154.69 + 13.809, + 147.97 ], "ne1d": 232, - "ne2d": 488, - "ne3d": 1311, - "quality_histogram": "[0, 2, 9, 19, 40, 58, 59, 67, 86, 84, 110, 122, 101, 129, 112, 95, 107, 67, 32, 12]", - "total_badness": 2635.2974753 + "ne2d": 494, + "ne3d": 1159, + "quality_histogram": "[0, 0, 1, 5, 14, 20, 42, 39, 60, 72, 87, 117, 127, 158, 104, 117, 72, 73, 42, 9]", + "total_badness": 2023.1948662 }, { "angles_tet": [ - 13.037, - 153.97 + 14.172, + 145.15 ], "angles_trig": [ - 12.086, - 144.66 + 17.555, + 130.0 ], "ne1d": 344, - "ne2d": 1048, - "ne3d": 3009, - "quality_histogram": "[0, 0, 0, 2, 3, 8, 20, 24, 54, 78, 137, 221, 281, 353, 432, 436, 403, 361, 150, 46]", - "total_badness": 4355.9512084 + "ne2d": 1040, + "ne3d": 3001, + "quality_histogram": "[0, 0, 0, 0, 0, 6, 17, 24, 42, 58, 124, 222, 276, 398, 439, 428, 393, 327, 202, 45]", + "total_badness": 4283.328223 }, { "angles_tet": [ - 21.381, - 140.97 + 20.132, + 145.06 ], "angles_trig": [ - 21.898, - 122.93 + 23.036, + 125.82 ], "ne1d": 480, - "ne2d": 2192, - "ne3d": 11691, - "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 0, 6, 27, 98, 225, 499, 960, 1476, 1957, 2269, 2123, 1641, 410]", - "total_badness": 14800.457844 + "ne2d": 2200, + "ne3d": 11579, + "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 5, 6, 37, 79, 241, 508, 972, 1450, 2025, 2203, 2142, 1482, 429]", + "total_badness": 14696.222297 }, { "angles_tet": [ - 21.788, - 143.41 + 20.751, + 144.48 ], "angles_trig": [ - 19.617, - 127.01 + 20.259, + 128.89 ], "ne1d": 820, - "ne2d": 6170, - "ne3d": 68102, - "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 1, 16, 53, 144, 519, 1466, 3437, 6911, 10914, 14262, 15100, 11595, 3684]", - "total_badness": 83215.021814 + "ne2d": 6174, + "ne3d": 68319, + "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 4, 13, 57, 176, 519, 1477, 3598, 7004, 10873, 14367, 15055, 11494, 3682]", + "total_badness": 83579.590629 } ], "plane.stl": [ { "angles_tet": [ - 1.3775, - 170.65 + 1.2146, + 170.22 ], "angles_trig": [ - 1.9032, - 160.04 + 1.8906, + 147.74 ], "ne1d": 892, - "ne2d": 2120, - "ne3d": 6950, - "quality_histogram": "[2, 13, 39, 26, 46, 56, 55, 69, 97, 129, 223, 378, 555, 762, 985, 1098, 971, 861, 485, 100]", - "total_badness": 10625.56863 + "ne2d": 2226, + "ne3d": 7016, + "quality_histogram": "[3, 12, 31, 39, 43, 61, 53, 62, 97, 110, 236, 389, 555, 829, 983, 1053, 1003, 852, 486, 119]", + "total_badness": 10717.291909 }, { "angles_tet": [ - 1.1426, - 172.36 + 1.6463, + 171.19 ], "angles_trig": [ - 0.77944, - 170.54 + 1.7241, + 168.81 ], "ne1d": 572, - "ne2d": 708, - "ne3d": 972, - "quality_histogram": "[9, 53, 62, 81, 83, 81, 64, 75, 63, 68, 65, 46, 64, 44, 43, 29, 18, 16, 6, 2]", - "total_badness": 3838.0802617 + "ne2d": 748, + "ne3d": 932, + "quality_histogram": "[2, 29, 56, 54, 80, 83, 65, 78, 62, 79, 75, 65, 56, 52, 34, 28, 18, 10, 4, 2]", + "total_badness": 3148.0282985 }, { "angles_tet": [ - 1.0985, - 172.19 + 1.1094, + 171.74 ], "angles_trig": [ - 3.728, - 163.66 + 3.1957, + 172.05 ], "ne1d": 724, - "ne2d": 1160, - "ne3d": 1799, - "quality_histogram": "[2, 14, 31, 71, 59, 58, 68, 74, 108, 149, 156, 196, 161, 185, 164, 122, 92, 55, 29, 5]", - "total_badness": 4120.8775515 + "ne2d": 1340, + "ne3d": 2375, + "quality_histogram": "[2, 17, 32, 56, 42, 52, 55, 65, 90, 131, 177, 192, 236, 274, 291, 265, 213, 124, 54, 7]", + "total_badness": 4744.9473584 }, { "angles_tet": [ - 1.2028, - 164.16 + 1.2337, + 165.93 ], "angles_trig": [ - 2.1239, - 164.34 + 1.932, + 150.35 ], "ne1d": 956, - "ne2d": 2230, - "ne3d": 7550, - "quality_histogram": "[3, 12, 39, 36, 48, 58, 58, 54, 80, 84, 163, 248, 481, 727, 1039, 1319, 1238, 1046, 635, 182]", - "total_badness": 11161.32041 + "ne2d": 2328, + "ne3d": 7371, + "quality_histogram": "[3, 8, 27, 48, 50, 50, 51, 60, 73, 92, 154, 275, 478, 757, 1051, 1198, 1207, 995, 647, 147]", + "total_badness": 10885.708005 }, { "angles_tet": [ - 1.1622, - 167.24 + 1.1634, + 165.93 ], "angles_trig": [ - 3.9448, - 143.04 + 4.1049, + 148.28 ], "ne1d": 1554, - "ne2d": 5530, - "ne3d": 29511, - "quality_histogram": "[2, 6, 12, 5, 20, 52, 52, 56, 85, 141, 254, 536, 1021, 2012, 3536, 4929, 5924, 5742, 3922, 1204]", - "total_badness": 37843.843561 + "ne2d": 5646, + "ne3d": 29373, + "quality_histogram": "[2, 6, 10, 11, 20, 49, 62, 47, 81, 131, 233, 473, 1030, 2096, 3516, 4912, 6007, 5650, 3941, 1096]", + "total_badness": 37671.804771 }, { "angles_tet": [ - 1.2299, - 164.14 + 1.2313, + 163.56 ], "angles_trig": [ - 0.95986, - 142.12 + 1.2728, + 155.0 ], "ne1d": 2992, - "ne2d": 22612, - "ne3d": 273940, - "quality_histogram": "[4, 9, 9, 12, 7, 26, 21, 55, 72, 211, 642, 1853, 5348, 13483, 27306, 43343, 58264, 62002, 47025, 14248]", - "total_badness": 334730.20594 + "ne2d": 22730, + "ne3d": 271701, + "quality_histogram": "[4, 8, 13, 10, 12, 24, 23, 53, 88, 211, 645, 1879, 5291, 12837, 26732, 43337, 57290, 61716, 46823, 14705]", + "total_badness": 331770.62487 } ], "revolution.geo": [ { "angles_tet": [ - 17.417, - 147.08 + 18.192, + 146.62 ], "angles_trig": [ - 19.287, - 132.54 + 16.784, + 125.93 ], "ne1d": 320, - "ne2d": 2830, - "ne3d": 7822, - "quality_histogram": "[0, 0, 0, 0, 0, 0, 3, 18, 82, 197, 366, 618, 807, 958, 1053, 1116, 1056, 879, 514, 155]", - "total_badness": 11034.916261 + "ne2d": 2790, + "ne3d": 7801, + "quality_histogram": "[0, 0, 0, 0, 0, 0, 1, 19, 85, 222, 383, 609, 790, 928, 1072, 1122, 1033, 869, 535, 133]", + "total_badness": 11028.386222 }, { "angles_tet": [ - 16.89, - 146.36 + 15.884, + 148.19 ], "angles_trig": [ - 16.936, - 130.6 + 16.462, + 128.75 ], "ne1d": 160, - "ne2d": 696, - "ne3d": 1055, - "quality_histogram": "[0, 0, 0, 0, 0, 2, 7, 50, 70, 83, 128, 151, 143, 116, 88, 66, 62, 53, 28, 8]", - "total_badness": 1787.5224982 + "ne2d": 658, + "ne3d": 1014, + "quality_histogram": "[0, 0, 0, 0, 0, 1, 10, 39, 45, 86, 105, 135, 148, 143, 94, 77, 55, 39, 27, 10]", + "total_badness": 1687.852505 }, { "angles_tet": [ - 18.231, - 142.91 + 19.465, + 143.15 ], "angles_trig": [ - 19.996, - 126.61 + 21.41, + 127.26 ], "ne1d": 240, - "ne2d": 1648, - "ne3d": 3539, - "quality_histogram": "[0, 0, 0, 0, 0, 0, 1, 12, 44, 111, 230, 367, 465, 510, 473, 442, 360, 293, 174, 57]", - "total_badness": 5186.0687028 + "ne2d": 1584, + "ne3d": 3587, + "quality_histogram": "[0, 0, 0, 0, 0, 0, 1, 6, 53, 114, 213, 346, 472, 525, 493, 421, 409, 290, 188, 56]", + "total_badness": 5235.8043244 }, { "angles_tet": [ - 17.818, - 143.63 + 16.533, + 145.17 ], "angles_trig": [ - 20.489, - 132.3 + 16.65, + 126.12 ], "ne1d": 320, - "ne2d": 2830, - "ne3d": 7694, - "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 15, 45, 137, 266, 535, 697, 878, 1006, 1200, 1103, 1006, 627, 179]", - "total_badness": 10571.217387 + "ne2d": 2790, + "ne3d": 7588, + "quality_histogram": "[0, 0, 0, 0, 0, 0, 3, 3, 53, 130, 283, 474, 732, 845, 1029, 1136, 1138, 955, 650, 157]", + "total_badness": 10417.772443 }, { "angles_tet": [ - 21.488, - 140.48 + 19.966, + 146.33 ], "angles_trig": [ - 23.466, - 124.25 + 22.508, + 127.48 ], "ne1d": 480, - "ne2d": 6370, - "ne3d": 31990, - "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 0, 6, 31, 189, 541, 1113, 2289, 3886, 5286, 6444, 6416, 4529, 1260]", - "total_badness": 40051.848883 + "ne2d": 6314, + "ne3d": 31852, + "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 4, 10, 39, 160, 534, 1078, 2215, 3774, 5529, 6417, 6291, 4543, 1258]", + "total_badness": 39852.048962 }, { "angles_tet": [ - 21.847, - 141.8 + 24.204, + 141.06 ], "angles_trig": [ - 25.08, - 124.42 + 25.313, + 123.86 ], "ne1d": 800, - "ne2d": 17010, - "ne3d": 199835, - "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 0, 7, 73, 285, 1121, 3420, 8778, 18429, 30521, 42186, 47371, 36350, 11294]", - "total_badness": 242045.49017 + "ne2d": 16950, + "ne3d": 198677, + "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 0, 5, 71, 314, 1001, 3314, 8614, 18130, 30449, 42143, 46676, 36551, 11409]", + "total_badness": 240440.79682 } ], "sculpture.geo": [ { "angles_tet": [ - 20.74, - 140.66 + 17.893, + 145.39 ], "angles_trig": [ - 23.955, - 110.79 + 26.076, + 107.8 ], "ne1d": 192, - "ne2d": 370, - "ne3d": 415, - "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 3, 4, 8, 17, 32, 52, 60, 80, 81, 43, 25, 9, 1]", - "total_badness": 599.2271355 + "ne2d": 358, + "ne3d": 399, + "quality_histogram": "[0, 0, 0, 0, 0, 0, 1, 2, 5, 7, 20, 31, 46, 60, 68, 73, 56, 20, 8, 2]", + "total_badness": 577.70426627 }, { "angles_tet": [ - 22.35, - 140.55 + 26.065, + 137.71 ], "angles_trig": [ 29.005, 98.684 ], "ne1d": 102, - "ne2d": 130, - "ne3d": 117, - "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 2, 3, 4, 11, 20, 23, 21, 19, 10, 1]", - "total_badness": 155.01490013 + "ne2d": 126, + "ne3d": 110, + "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 4, 13, 17, 25, 18, 13, 13, 0]", + "total_badness": 145.42684912 }, { "angles_tet": [ - 17.944, - 147.88 + 23.253, + 133.46 ], "angles_trig": [ - 26.336, - 103.83 + 31.14, + 92.518 ], "ne1d": 144, - "ne2d": 216, - "ne3d": 207, - "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 3, 7, 8, 16, 21, 39, 40, 44, 21, 5]", - "total_badness": 267.38352368 + "ne2d": 202, + "ne3d": 188, + "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 5, 16, 19, 34, 43, 47, 19, 1]", + "total_badness": 236.63013908 }, { "angles_tet": [ - 20.74, - 140.66 + 17.893, + 145.39 ], "angles_trig": [ - 23.955, - 110.79 + 26.076, + 107.8 ], "ne1d": 192, - "ne2d": 370, - "ne3d": 415, - "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 3, 4, 8, 17, 32, 52, 60, 80, 81, 43, 25, 9, 1]", - "total_badness": 599.22713545 + "ne2d": 358, + "ne3d": 399, + "quality_histogram": "[0, 0, 0, 0, 0, 0, 1, 2, 5, 7, 20, 31, 46, 60, 68, 73, 56, 20, 8, 2]", + "total_badness": 577.70426673 }, { "angles_tet": [ - 15.141, - 145.8 + 14.571, + 148.55 ], "angles_trig": [ - 20.524, - 131.55 + 20.892, + 127.8 ], "ne1d": 288, - "ne2d": 910, - "ne3d": 1239, - "quality_histogram": "[0, 0, 0, 0, 1, 1, 10, 22, 41, 62, 107, 115, 120, 152, 130, 129, 137, 113, 84, 15]", - "total_badness": 1891.8931592 + "ne2d": 912, + "ne3d": 1234, + "quality_histogram": "[0, 0, 0, 0, 2, 2, 10, 23, 35, 68, 98, 124, 108, 127, 127, 127, 154, 133, 80, 16]", + "total_badness": 1875.8247719 }, { "angles_tet": [ - 16.101, - 141.52 + 16.0, + 149.5 ], "angles_trig": [ - 16.97, - 119.59 + 17.232, + 118.94 ], "ne1d": 480, - "ne2d": 2308, - "ne3d": 6598, - "quality_histogram": "[0, 0, 0, 0, 2, 3, 6, 8, 12, 32, 58, 112, 246, 420, 715, 1057, 1328, 1289, 989, 321]", - "total_badness": 8306.4574162 + "ne2d": 2314, + "ne3d": 6590, + "quality_histogram": "[0, 0, 0, 0, 2, 3, 11, 9, 20, 24, 53, 89, 214, 406, 753, 1055, 1353, 1311, 962, 325]", + "total_badness": 8284.1518654 } ], "shaft.geo": [ { "angles_tet": [ - 9.1209, + 8.1571, 162.65 ], "angles_trig": [ - 8.2976, - 151.83 + 9.7076, + 147.95 ], "ne1d": 708, - "ne2d": 1660, - "ne3d": 2641, - "quality_histogram": "[0, 0, 2, 3, 9, 25, 31, 53, 95, 154, 269, 396, 315, 256, 226, 286, 232, 188, 79, 22]", - "total_badness": 4315.58959 + "ne2d": 1656, + "ne3d": 2629, + "quality_histogram": "[0, 0, 2, 4, 12, 13, 24, 56, 76, 149, 278, 365, 333, 240, 233, 285, 255, 188, 94, 22]", + "total_badness": 4239.9806978 }, { "angles_tet": [ - 16.079, - 156.95 + 8.5237, + 165.9 ], "angles_trig": [ - 13.243, - 124.54 + 10.094, + 128.25 ], "ne1d": 410, - "ne2d": 522, - "ne3d": 664, - "quality_histogram": "[0, 0, 0, 0, 0, 9, 10, 7, 27, 35, 46, 54, 75, 82, 64, 63, 65, 83, 34, 10]", - "total_badness": 1031.8889104 + "ne2d": 542, + "ne3d": 688, + "quality_histogram": "[0, 0, 0, 2, 1, 4, 6, 11, 18, 32, 41, 56, 73, 85, 81, 83, 66, 73, 43, 13]", + "total_badness": 1047.4282101 }, { "angles_tet": [ - 10.226, - 163.0 + 9.2737, + 159.17 ], "angles_trig": [ - 12.654, - 140.0 + 13.813, + 149.46 ], "ne1d": 510, - "ne2d": 914, - "ne3d": 1689, - "quality_histogram": "[0, 0, 0, 1, 2, 23, 32, 52, 64, 92, 109, 160, 171, 187, 216, 206, 191, 90, 74, 19]", - "total_badness": 2709.6681369 + "ne2d": 912, + "ne3d": 1645, + "quality_histogram": "[0, 0, 0, 3, 5, 17, 16, 48, 65, 87, 108, 139, 179, 177, 238, 195, 186, 104, 53, 25]", + "total_badness": 2610.9306806 }, { "angles_tet": [ - 13.376, + 13.139, 162.65 ], "angles_trig": [ - 17.889, - 131.6 + 15.194, + 147.25 ], "ne1d": 708, - "ne2d": 1660, - "ne3d": 2601, - "quality_histogram": "[0, 0, 0, 0, 2, 5, 11, 26, 52, 131, 252, 378, 315, 291, 244, 316, 248, 212, 88, 30]", - "total_badness": 4014.0087462 + "ne2d": 1656, + "ne3d": 2585, + "quality_histogram": "[0, 0, 0, 1, 4, 4, 10, 22, 43, 120, 259, 375, 332, 266, 243, 291, 287, 189, 115, 24]", + "total_badness": 3972.0391087 }, { "angles_tet": [ - 18.732, - 146.69 + 15.284, + 147.53 ], "angles_trig": [ - 20.201, - 129.94 + 20.193, + 122.49 ], "ne1d": 1138, - "ne2d": 4040, - "ne3d": 10847, - "quality_histogram": "[0, 0, 0, 0, 0, 0, 1, 10, 27, 81, 165, 353, 571, 903, 1296, 1812, 2059, 1851, 1288, 430]", - "total_badness": 14005.983646 + "ne2d": 4104, + "ne3d": 10879, + "quality_histogram": "[0, 0, 0, 0, 0, 0, 1, 2, 22, 68, 162, 312, 550, 917, 1327, 1807, 2027, 1905, 1346, 433]", + "total_badness": 13982.205496 }, { "angles_tet": [ - 20.63, - 143.21 + 23.051, + 146.15 ], "angles_trig": [ - 22.145, - 126.25 + 26.463, + 118.44 ], "ne1d": 1792, - "ne2d": 10482, - "ne3d": 63318, - "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 1, 6, 27, 126, 413, 1332, 3033, 5974, 9908, 13280, 14471, 11021, 3726]", - "total_badness": 77019.706495 + "ne2d": 10502, + "ne3d": 63623, + "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 2, 3, 36, 112, 441, 1261, 3055, 6105, 9988, 13378, 14460, 11103, 3679]", + "total_badness": 77412.92414 } ], "sphere.geo": [ { "angles_tet": [ - 33.396, - 102.8 + 41.444, + 94.535 ], "angles_trig": [ - 21.34, - 79.33 + 23.218, + 78.391 ], "ne1d": 0, - "ne2d": 110, - "ne3d": 110, - "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 0, 2, 8, 39, 31, 17, 6, 4, 3, 0, 0, 0, 0]", - "total_badness": 195.15838968 + "ne2d": 108, + "ne3d": 108, + "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 26, 39, 19, 11, 4, 2, 0, 0, 0, 0]", + "total_badness": 187.15399646 }, { "angles_tet": [ - 30.625, - 145.17 + 27.382, + 145.2 ], "angles_trig": [ - 35.813, - 108.37 + 37.429, + 87.848 ], "ne1d": 0, - "ne2d": 18, - "ne3d": 18, - "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 2, 1, 1, 0, 2, 4, 5, 1]", - "total_badness": 23.686506761 + "ne2d": 28, + "ne3d": 28, + "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 1, 3, 1, 1, 2, 6, 4, 8]", + "total_badness": 35.610383187 }, { "angles_tet": [ - 47.338, - 93.625 + 46.477, + 88.039 ], "angles_trig": [ 30.095, 74.952 ], "ne1d": 0, - "ne2d": 60, - "ne3d": 60, - "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 33, 14, 6, 1, 0]", - "total_badness": 75.661186254 + "ne2d": 64, + "ne3d": 64, + "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 15, 32, 10, 4, 1, 0]", + "total_badness": 82.818407116 }, { "angles_tet": [ - 33.396, - 102.8 + 41.444, + 94.535 ], "angles_trig": [ - 21.34, - 79.33 + 23.218, + 78.391 ], "ne1d": 0, - "ne2d": 110, - "ne3d": 110, - "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 0, 2, 8, 39, 31, 17, 6, 4, 3, 0, 0, 0, 0]", - "total_badness": 195.15838968 + "ne2d": 108, + "ne3d": 108, + "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 26, 39, 19, 11, 4, 2, 0, 0, 0, 0]", + "total_badness": 187.15399646 }, { "angles_tet": [ - 20.446, - 128.71 + 22.983, + 128.09 ], "angles_trig": [ - 21.003, - 110.73 + 22.196, + 111.76 ], "ne1d": 0, - "ne2d": 246, - "ne3d": 334, - "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 2, 6, 24, 40, 44, 54, 41, 33, 32, 31, 11, 12, 4]", - "total_badness": 521.82397235 + "ne2d": 256, + "ne3d": 363, + "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 0, 2, 19, 33, 58, 54, 54, 32, 38, 31, 24, 12, 6]", + "total_badness": 551.13017475 }, { "angles_tet": [ - 25.189, - 137.55 + 30.456, + 130.64 ], "angles_trig": [ - 26.695, - 119.02 + 29.846, + 110.98 ], "ne1d": 0, - "ne2d": 654, - "ne3d": 2311, - "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 3, 17, 50, 118, 248, 387, 500, 499, 387, 101]", - "total_badness": 2830.8213954 + "ne2d": 658, + "ne3d": 2272, + "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 24, 67, 135, 263, 417, 457, 440, 354, 113]", + "total_badness": 2808.9045443 } ], "sphereincube.geo": [ { "angles_tet": [ - 12.259, - 165.91 + 9.8889, + 167.24 ], "angles_trig": [ - 12.205, - 154.14 + 12.223, + 153.03 ], "ne1d": 46, - "ne2d": 166, - "ne3d": 346, - "quality_histogram": "[0, 0, 1, 11, 69, 56, 25, 25, 26, 31, 20, 17, 22, 11, 2, 13, 4, 7, 5, 1]", - "total_badness": 1006.2045255 + "ne2d": 170, + "ne3d": 349, + "quality_histogram": "[0, 0, 0, 8, 48, 42, 29, 16, 30, 20, 25, 24, 22, 20, 6, 13, 16, 20, 7, 3]", + "total_badness": 882.88818519 }, { "angles_tet": [ - 1.1221, - 166.83 + 7.3975, + 162.99 ], "angles_trig": [ - 0.86367, - 153.64 + 4.6299, + 163.28 ], "ne1d": 24, - "ne2d": 32, - "ne3d": 86, - "quality_histogram": "[6, 4, 3, 4, 4, 7, 14, 12, 6, 5, 6, 5, 5, 1, 1, 2, 1, 0, 0, 0]", - "total_badness": 545.94849089 + "ne2d": 34, + "ne3d": 79, + "quality_histogram": "[0, 0, 2, 2, 10, 6, 15, 12, 9, 9, 5, 5, 1, 1, 0, 0, 2, 0, 0, 0]", + "total_badness": 239.01564453 }, { "angles_tet": [ - 8.143, - 167.53 + 6.4483, + 169.86 ], "angles_trig": [ - 8.0251, - 145.85 + 9.6618, + 150.58 ], "ne1d": 30, - "ne2d": 74, - "ne3d": 162, - "quality_histogram": "[0, 2, 4, 20, 27, 17, 42, 20, 15, 12, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0]", - "total_badness": 597.32604164 + "ne2d": 100, + "ne3d": 242, + "quality_histogram": "[0, 0, 6, 15, 20, 43, 45, 12, 21, 10, 21, 8, 12, 4, 4, 6, 4, 7, 3, 1]", + "total_badness": 732.39744465 }, { "angles_tet": [ - 12.259, - 165.91 + 9.8889, + 167.24 ], "angles_trig": [ - 12.205, - 154.14 + 12.223, + 153.03 ], "ne1d": 46, - "ne2d": 166, - "ne3d": 346, - "quality_histogram": "[0, 0, 1, 11, 69, 56, 25, 24, 26, 31, 21, 18, 22, 12, 1, 12, 4, 7, 5, 1]", - "total_badness": 1006.1546388 + "ne2d": 170, + "ne3d": 349, + "quality_histogram": "[0, 0, 0, 8, 48, 42, 29, 16, 30, 20, 25, 24, 22, 20, 6, 13, 16, 20, 7, 3]", + "total_badness": 882.88818519 }, { "angles_tet": [ - 17.721, - 143.0 + 14.198, + 139.87 ], "angles_trig": [ - 16.868, - 125.45 + 16.51, + 128.49 ], "ne1d": 74, - "ne2d": 400, - "ne3d": 1674, - "quality_histogram": "[0, 0, 0, 0, 0, 4, 4, 16, 19, 43, 64, 117, 132, 204, 254, 218, 236, 201, 126, 36]", - "total_badness": 2362.8140555 + "ne2d": 412, + "ne3d": 1683, + "quality_histogram": "[0, 0, 0, 0, 0, 5, 3, 12, 21, 29, 71, 92, 153, 214, 236, 260, 224, 186, 131, 46]", + "total_badness": 2358.043084 }, { "angles_tet": [ - 24.328, - 139.11 + 24.367, + 140.35 ], "angles_trig": [ - 21.781, - 129.35 + 22.231, + 124.31 ], "ne1d": 122, - "ne2d": 1064, - "ne3d": 13795, - "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 1, 3, 26, 65, 189, 411, 792, 1470, 2178, 2848, 2983, 2153, 676]", - "total_badness": 17067.425958 + "ne2d": 1066, + "ne3d": 13989, + "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 1, 7, 23, 83, 256, 466, 907, 1562, 2200, 2835, 2874, 2099, 676]", + "total_badness": 17429.478381 } ], "square.in2d": [ @@ -2697,7 +2697,7 @@ 0.0 ], "ne1d": 27, - "ne2d": 81, + "ne2d": 79, "ne3d": 0, "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]", "total_badness": 0.0 @@ -2727,7 +2727,7 @@ 0.0 ], "ne1d": 26, - "ne2d": 62, + "ne2d": 70, "ne3d": 0, "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]", "total_badness": 0.0 @@ -2742,7 +2742,7 @@ 0.0 ], "ne1d": 27, - "ne2d": 81, + "ne2d": 79, "ne3d": 0, "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]", "total_badness": 0.0 @@ -2757,7 +2757,7 @@ 0.0 ], "ne1d": 36, - "ne2d": 134, + "ne2d": 128, "ne3d": 0, "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]", "total_badness": 0.0 @@ -2789,22 +2789,7 @@ 0.0 ], "ne1d": 32, - "ne2d": 126, - "ne3d": 0, - "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]", - "total_badness": 0.0 - }, - { - "angles_tet": [ - 0.0, - 0.0 - ], - "angles_trig": [ - 0.0, - 0.0 - ], - "ne1d": 32, - "ne2d": 104, + "ne2d": 144, "ne3d": 0, "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]", "total_badness": 0.0 @@ -2834,7 +2819,22 @@ 0.0 ], "ne1d": 32, - "ne2d": 126, + "ne2d": 134, + "ne3d": 0, + "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]", + "total_badness": 0.0 + }, + { + "angles_tet": [ + 0.0, + 0.0 + ], + "angles_trig": [ + 0.0, + 0.0 + ], + "ne1d": 32, + "ne2d": 144, "ne3d": 0, "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]", "total_badness": 0.0 @@ -2849,7 +2849,7 @@ 0.0 ], "ne1d": 42, - "ne2d": 292, + "ne2d": 308, "ne3d": 0, "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]", "total_badness": 0.0 @@ -2864,7 +2864,7 @@ 0.0 ], "ne1d": 76, - "ne2d": 807, + "ne2d": 809, "ne3d": 0, "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]", "total_badness": 0.0 @@ -2881,7 +2881,7 @@ 0.0 ], "ne1d": 32, - "ne2d": 102, + "ne2d": 120, "ne3d": 0, "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]", "total_badness": 0.0 @@ -2896,7 +2896,7 @@ 0.0 ], "ne1d": 32, - "ne2d": 80, + "ne2d": 82, "ne3d": 0, "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]", "total_badness": 0.0 @@ -2911,7 +2911,7 @@ 0.0 ], "ne1d": 32, - "ne2d": 90, + "ne2d": 108, "ne3d": 0, "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]", "total_badness": 0.0 @@ -2926,7 +2926,7 @@ 0.0 ], "ne1d": 32, - "ne2d": 102, + "ne2d": 120, "ne3d": 0, "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]", "total_badness": 0.0 @@ -2941,7 +2941,7 @@ 0.0 ], "ne1d": 42, - "ne2d": 238, + "ne2d": 258, "ne3d": 0, "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]", "total_badness": 0.0 @@ -2956,7 +2956,7 @@ 0.0 ], "ne1d": 76, - "ne2d": 670, + "ne2d": 674, "ne3d": 0, "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]", "total_badness": 0.0 @@ -2965,93 +2965,93 @@ "torus.geo": [ { "angles_tet": [ - 18.491, - 148.74 + 19.194, + 148.12 ], "angles_trig": [ - 18.359, - 132.17 + 19.92, + 127.08 ], "ne1d": 0, - "ne2d": 2518, - "ne3d": 5622, - "quality_histogram": "[0, 0, 0, 0, 0, 0, 4, 21, 69, 211, 409, 534, 659, 747, 745, 739, 659, 466, 270, 89]", - "total_badness": 8234.8643125 + "ne2d": 2526, + "ne3d": 5587, + "quality_histogram": "[0, 0, 0, 0, 0, 0, 2, 9, 75, 208, 373, 547, 678, 782, 752, 738, 585, 470, 285, 83]", + "total_badness": 8168.6605532 }, { "angles_tet": [ - 2.4774, - 173.64 + 2.7079, + 172.97 ], "angles_trig": [ - 3.8579, - 165.59 + 4.6723, + 166.19 ], "ne1d": 0, - "ne2d": 624, - "ne3d": 2759, - "quality_histogram": "[2, 119, 272, 344, 371, 345, 290, 207, 185, 129, 106, 89, 78, 56, 44, 40, 33, 22, 20, 7]", - "total_badness": 11545.109004 + "ne2d": 648, + "ne3d": 3007, + "quality_histogram": "[8, 144, 319, 360, 402, 367, 276, 245, 184, 169, 139, 98, 83, 58, 46, 41, 31, 22, 10, 5]", + "total_badness": 12976.808797 }, { "angles_tet": [ - 18.51, - 144.39 + 17.153, + 145.79 ], "angles_trig": [ - 22.396, - 117.81 + 21.25, + 118.2 ], "ne1d": 0, - "ne2d": 1428, - "ne3d": 2782, - "quality_histogram": "[0, 0, 0, 0, 0, 0, 1, 1, 7, 46, 121, 237, 323, 374, 435, 423, 371, 233, 159, 51]", - "total_badness": 3915.7715277 + "ne2d": 1430, + "ne3d": 2733, + "quality_histogram": "[0, 0, 0, 0, 0, 0, 1, 4, 11, 39, 130, 214, 321, 436, 454, 400, 279, 240, 155, 49]", + "total_badness": 3874.9869154 }, { "angles_tet": [ - 18.726, - 151.19 + 21.147, + 145.15 ], "angles_trig": [ - 18.677, - 126.94 + 20.446, + 123.07 ], "ne1d": 0, - "ne2d": 2518, - "ne3d": 5517, - "quality_histogram": "[0, 0, 0, 0, 0, 0, 1, 6, 34, 122, 285, 479, 608, 683, 820, 797, 694, 562, 333, 93]", - "total_badness": 7812.578359 + "ne2d": 2526, + "ne3d": 5473, + "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 2, 34, 119, 265, 466, 597, 763, 810, 767, 682, 534, 342, 92]", + "total_badness": 7745.4881518 }, { "angles_tet": [ - 23.41, - 142.45 + 21.754, + 144.45 ], "angles_trig": [ - 23.571, - 124.23 + 23.239, + 124.02 ], "ne1d": 0, "ne2d": 5824, - "ne3d": 25380, - "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 0, 9, 29, 124, 378, 832, 1565, 2815, 4265, 5238, 5140, 3812, 1173]", - "total_badness": 31550.191234 + "ne3d": 25317, + "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 1, 9, 41, 114, 347, 765, 1598, 2782, 4135, 5379, 5234, 3786, 1126]", + "total_badness": 31434.764854 }, { "angles_tet": [ - 23.98, - 142.51 + 21.699, + 145.02 ], "angles_trig": [ - 21.729, - 124.87 + 23.154, + 120.78 ], "ne1d": 0, - "ne2d": 16196, - "ne3d": 175263, - "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 0, 5, 62, 248, 801, 2678, 7200, 15859, 27039, 37091, 41475, 32446, 10359]", - "total_badness": 211708.00337 + "ne2d": 16198, + "ne3d": 174686, + "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 1, 4, 58, 234, 858, 2518, 6918, 15184, 26272, 37074, 41964, 33110, 10491]", + "total_badness": 210586.77039 } ], "trafo.geo": [ @@ -3062,28 +3062,28 @@ ], "angles_trig": [ 14.916, - 132.77 + 132.02 ], "ne1d": 690, - "ne2d": 1640, - "ne3d": 5052, - "quality_histogram": "[0, 0, 1, 0, 1, 14, 25, 38, 114, 198, 290, 374, 443, 571, 659, 690, 559, 498, 449, 128]", - "total_badness": 7348.6172397 + "ne2d": 1662, + "ne3d": 5132, + "quality_histogram": "[0, 0, 1, 0, 2, 12, 24, 42, 108, 200, 269, 367, 431, 571, 685, 733, 586, 527, 446, 128]", + "total_badness": 7423.4819931 }, { "angles_tet": [ - 4.8001, - 171.68 + 2.8238, + 174.1 ], "angles_trig": [ 7.7605, 156.22 ], "ne1d": 390, - "ne2d": 492, - "ne3d": 1313, - "quality_histogram": "[0, 1, 9, 21, 33, 43, 84, 133, 130, 137, 152, 127, 122, 105, 81, 62, 37, 26, 7, 3]", - "total_badness": 2851.533474 + "ne2d": 516, + "ne3d": 1342, + "quality_histogram": "[0, 1, 5, 13, 16, 44, 80, 117, 122, 153, 159, 135, 123, 113, 85, 80, 54, 28, 11, 3]", + "total_badness": 2768.1650274 }, { "angles_tet": [ @@ -3092,13 +3092,13 @@ ], "angles_trig": [ 14.15, - 144.73 + 148.05 ], "ne1d": 512, - "ne2d": 862, - "ne3d": 2354, - "quality_histogram": "[0, 0, 0, 5, 7, 17, 43, 56, 122, 148, 186, 207, 319, 389, 331, 239, 128, 91, 45, 21]", - "total_badness": 3893.1348247 + "ne2d": 864, + "ne3d": 2363, + "quality_histogram": "[0, 0, 0, 3, 9, 11, 42, 63, 119, 151, 184, 204, 316, 393, 341, 237, 138, 87, 42, 23]", + "total_badness": 3893.8304292 }, { "angles_tet": [ @@ -3107,43 +3107,43 @@ ], "angles_trig": [ 14.916, - 132.51 + 132.02 ], "ne1d": 690, - "ne2d": 1640, - "ne3d": 5030, - "quality_histogram": "[0, 0, 1, 0, 1, 10, 18, 39, 112, 196, 282, 361, 439, 578, 652, 701, 573, 493, 452, 122]", - "total_badness": 7284.2642829 + "ne2d": 1662, + "ne3d": 5067, + "quality_histogram": "[0, 0, 1, 0, 1, 8, 17, 35, 109, 188, 260, 357, 413, 536, 678, 734, 604, 538, 451, 137]", + "total_badness": 7266.2053478 }, { "angles_tet": [ - 18.135, - 144.83 + 18.048, + 145.94 ], "angles_trig": [ - 17.636, - 126.66 + 17.539, + 126.69 ], "ne1d": 1050, - "ne2d": 3636, - "ne3d": 17520, - "quality_histogram": "[0, 0, 0, 0, 0, 0, 3, 12, 30, 65, 185, 501, 1446, 2050, 2203, 2588, 2573, 2726, 2445, 693]", - "total_badness": 22780.274742 + "ne2d": 3670, + "ne3d": 17479, + "quality_histogram": "[0, 0, 0, 0, 0, 0, 2, 13, 27, 55, 173, 512, 1412, 2098, 2269, 2479, 2612, 2725, 2398, 704]", + "total_badness": 22725.68654 }, { "angles_tet": [ - 14.338, - 149.53 + 13.821, + 149.28 ], "angles_trig": [ 19.234, - 127.75 + 128.69 ], "ne1d": 1722, - "ne2d": 9968, - "ne3d": 84576, - "quality_histogram": "[0, 0, 0, 0, 0, 3, 47, 1418, 731, 403, 638, 1213, 2324, 5251, 8690, 13237, 16371, 17078, 12966, 4206]", - "total_badness": 108041.85872 + "ne2d": 9990, + "ne3d": 84843, + "quality_histogram": "[0, 0, 0, 0, 1, 3, 47, 1412, 705, 384, 688, 1183, 2414, 5544, 8737, 13008, 16461, 17017, 12962, 4277]", + "total_badness": 108418.01981 } ], "twobricks.geo": [ @@ -3183,14 +3183,14 @@ 125.92 ], "angles_trig": [ - 29.606, + 29.602, 120.18 ], "ne1d": 56, "ne2d": 34, "ne3d": 22, "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 2, 4, 0, 0, 8, 0, 0, 0, 0]", - "total_badness": 35.041320265 + "total_badness": 35.041320435 }, { "angles_tet": [ @@ -3209,33 +3209,33 @@ }, { "angles_tet": [ - 24.085, - 131.06 + 23.292, + 131.34 ], "angles_trig": [ 27.682, - 109.51 + 108.04 ], "ne1d": 116, - "ne2d": 134, - "ne3d": 176, - "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 3, 11, 13, 17, 37, 23, 30, 17, 17, 7]", - "total_badness": 234.86129157 + "ne2d": 132, + "ne3d": 174, + "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 4, 10, 12, 17, 36, 23, 30, 18, 15, 8]", + "total_badness": 232.20307583 }, { "angles_tet": [ - 25.669, - 137.84 + 28.202, + 131.83 ], "angles_trig": [ - 27.418, - 109.66 + 27.743, + 109.15 ], "ne1d": 186, - "ne2d": 328, - "ne3d": 565, - "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 6, 19, 40, 49, 80, 89, 100, 113, 55, 11]", - "total_badness": 732.45330193 + "ne2d": 330, + "ne3d": 561, + "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 3, 22, 35, 52, 81, 98, 100, 102, 55, 12]", + "total_badness": 726.84401009 } ], "twocubes.geo": [ @@ -3275,14 +3275,14 @@ 125.92 ], "angles_trig": [ - 29.606, + 29.602, 120.18 ], "ne1d": 56, "ne2d": 34, "ne3d": 22, "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 2, 4, 0, 0, 8, 0, 0, 0, 0]", - "total_badness": 35.041320265 + "total_badness": 35.041320435 }, { "angles_tet": [ @@ -3301,33 +3301,33 @@ }, { "angles_tet": [ - 24.085, - 131.06 + 23.292, + 131.34 ], "angles_trig": [ 27.682, - 109.51 + 108.04 ], "ne1d": 116, - "ne2d": 134, - "ne3d": 176, - "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 3, 11, 13, 17, 37, 23, 30, 17, 17, 7]", - "total_badness": 234.86129157 + "ne2d": 132, + "ne3d": 174, + "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 4, 10, 12, 17, 36, 23, 30, 18, 15, 8]", + "total_badness": 232.20307583 }, { "angles_tet": [ - 25.669, - 137.84 + 28.202, + 131.83 ], "angles_trig": [ - 27.418, - 109.66 + 27.743, + 109.15 ], "ne1d": 186, - "ne2d": 328, - "ne3d": 565, - "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 6, 19, 40, 49, 80, 89, 100, 113, 55, 11]", - "total_badness": 732.45330193 + "ne2d": 330, + "ne3d": 561, + "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 3, 22, 35, 52, 81, 98, 100, 102, 55, 12]", + "total_badness": 726.84401009 } ], "twocyl.geo": [ @@ -3348,33 +3348,33 @@ }, { "angles_tet": [ - 18.638, - 145.25 + 19.604, + 153.38 ], "angles_trig": [ - 26.239, - 123.32 + 25.599, + 115.69 ], "ne1d": 68, - "ne2d": 92, - "ne3d": 112, - "quality_histogram": "[0, 0, 0, 0, 0, 1, 0, 5, 5, 10, 4, 9, 13, 13, 12, 10, 19, 7, 3, 1]", - "total_badness": 178.24672344 + "ne2d": 98, + "ne3d": 138, + "quality_histogram": "[0, 0, 0, 0, 0, 0, 1, 0, 3, 2, 6, 8, 8, 17, 22, 22, 25, 15, 7, 2]", + "total_badness": 193.53502944 }, { "angles_tet": [ - 13.47, - 159.13 + 12.305, + 161.08 ], "angles_trig": [ - 15.655, - 144.15 + 11.495, + 149.57 ], "ne1d": 102, - "ne2d": 224, - "ne3d": 459, - "quality_histogram": "[0, 0, 0, 1, 15, 14, 23, 40, 47, 50, 32, 33, 28, 30, 28, 37, 49, 21, 5, 6]", - "total_badness": 905.28047296 + "ne2d": 234, + "ne3d": 412, + "quality_histogram": "[0, 0, 0, 1, 7, 7, 15, 28, 44, 24, 19, 33, 36, 36, 36, 28, 56, 26, 12, 4]", + "total_badness": 744.59871397 }, { "angles_tet": [ @@ -3393,33 +3393,33 @@ }, { "angles_tet": [ - 22.985, - 137.58 + 20.993, + 137.7 ], "angles_trig": [ - 21.899, - 111.76 + 22.158, + 117.49 ], "ne1d": 214, "ne2d": 904, - "ne3d": 1908, - "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 0, 2, 9, 28, 87, 124, 219, 311, 347, 341, 261, 146, 33]", - "total_badness": 2531.1498191 + "ne3d": 1847, + "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 0, 1, 8, 28, 77, 127, 199, 270, 350, 335, 247, 164, 41]", + "total_badness": 2434.6179175 }, { "angles_tet": [ - 24.904, - 142.69 + 21.528, + 142.94 ], "angles_trig": [ - 27.866, - 120.64 + 26.329, + 116.56 ], "ne1d": 350, - "ne2d": 2364, - "ne3d": 13566, - "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 0, 1, 5, 39, 83, 264, 644, 1329, 2198, 2959, 3084, 2278, 682]", - "total_badness": 16548.46826 + "ne2d": 2358, + "ne3d": 13357, + "quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 0, 1, 5, 23, 78, 239, 564, 1230, 2137, 2846, 3149, 2364, 721]", + "total_badness": 16204.662169 } ] } \ No newline at end of file