Merge branch 'splitimprove2' into 'master'

Splitimprove2

See merge request jschoeberl/netgen!330
This commit is contained in:
Joachim Schöberl 2020-07-27 17:27:00 +00:00
commit 31a64cd728
7 changed files with 570 additions and 214 deletions

View File

@ -1035,6 +1035,39 @@ double MinDistLP2 (const Point3d & lp1, const Point3d & lp2, const Point3d & p)
}
double MinDistLP2 (const Point3d & lp1, const Point3d & lp2, const Point3d & p, double & lam)
{
Vec3d v(lp1, lp2);
Vec3d vlp(lp1, p);
// dist(lam) = \| vlp \|^2 - 2 lam (v1p, v) + lam^2 \| v \|^2
// lam = (v * vlp) / (v * v);
// if (lam < 0) lam = 0;
// if (lam > 1) lam = 1;
double num = v*vlp;
double den = v*v;
if (num <= 0)
{
lam = 0.0;
return Dist2 (lp1, p);
}
if (num >= den)
{
lam = 1.0;
return Dist2 (lp2, p);
}
lam = num/den;
if (den > 0)
return vlp.Length2() - num * num /den;
else
return vlp.Length2();
}
double MinDistTP2 (const Point3d & tp1, const Point3d & tp2,
const Point3d & tp3, const Point3d & p)
@ -1102,7 +1135,7 @@ double MinDistTP2 (const Point3d & tp1, const Point3d & tp2,
// 0 checks !!!
double MinDistLL2 (const Point3d & l1p1, const Point3d & l1p2,
const Point3d & l2p1, const Point3d & l2p2)
const Point3d & l2p1, const Point3d & l2p2, double & lam1, double & lam2 )
{
// dist(lam1,lam2) = \| l2p1+lam2v2 - (l1p1+lam1 v1) \|
// min !
@ -1112,7 +1145,7 @@ double MinDistLL2 (const Point3d & l1p1, const Point3d & l1p2,
Vec3d v2 (l2p1, l2p2);
double a11, a12, a22, rs1, rs2;
double lam1, lam2, det;
double det;
a11 = v1*v1;
a12 = -(v1*v2);
@ -1138,14 +1171,27 @@ double MinDistLL2 (const Point3d & l1p1, const Point3d & l1p2,
}
double minv, hv;
minv = MinDistLP2 (l1p1, l1p2, l2p1);
hv = MinDistLP2 (l1p1, l1p2, l2p2);
if (hv < minv) minv = hv;
minv = MinDistLP2 (l1p1, l1p2, l2p1, lam1);
lam2 = 0.;
hv = MinDistLP2 (l1p1, l1p2, l2p2, lam1);
if (hv < minv)
{
lam2 = 1.;
minv = hv;
}
hv = MinDistLP2 (l2p1, l2p2, l1p1);
if (hv < minv) minv = hv;
hv = MinDistLP2 (l2p1, l2p2, l1p2);
if (hv < minv) minv = hv;
hv = MinDistLP2 (l2p1, l2p2, l1p1, lam2);
if (hv < minv)
{
lam1 = 0.;
minv = hv;
}
hv = MinDistLP2 (l2p1, l2p2, l1p2, lam2);
if (hv < minv)
{
lam1 = 1.;
minv = hv;
}
return minv;
}

View File

@ -91,6 +91,9 @@ extern double MinDistTP2 (const Point3d & tp1, const Point3d & tp2,
extern double MinDistLL2 (const Point3d & l1p1, const Point3d & l1p2,
const Point3d & l2p1, const Point3d & l2p2);
extern double MinDistLL2 (const Point3d & l1p1, const Point3d & l1p2,
const Point3d & l2p1, const Point3d & l2p2, double & lam1, double & lam2 );
}
#endif

View File

@ -28,6 +28,106 @@ double CalcBadReplacePoints (const Mesh::T_POINTS & points, const MeshingParamet
return CalcTetBadness (*p[0], *p[1], *p[2], *p[3], h, mp);
}
static ArrayMem<Element, 3> SplitElement (Element old, PointIndex pi0, PointIndex pi1, PointIndex pinew)
{
ArrayMem<Element, 3> new_elements;
// split element by cutting edge pi0,pi1 at pinew
auto np = old.GetNP();
old.flags.illegal_valid = 0;
if(np == 4)
{
// Split tet into two tets
Element newel0 = old;
Element newel1 = old;
for (int i : Range(4))
{
if(newel0[i] == pi0) newel0[i] = pinew;
if(newel1[i] == pi1) newel1[i] = pinew;
}
new_elements.Append(newel0);
new_elements.Append(newel1);
}
else if (np == 5)
{
// split pyramid into pyramid and two tets
Element new_pyramid = old;
new_pyramid[4] = pinew;
new_elements.Append(new_pyramid);
auto pibase = (pi0==old[4]) ? pi1 : pi0;
auto pitop = (pi0==old[4]) ? pi0 : pi1;
Element new_tet0 = old;
Element new_tet1 = old;
new_tet0.SetType(TET);
new_tet1.SetType(TET);
size_t pibase_index=0;
for(auto i : Range(4))
if(old[i]==pibase)
pibase_index = i;
new_tet0[0] = old[(pibase_index+1)%4];
new_tet0[1] = old[(pibase_index+2)%4];
new_tet0[2] = pinew;
new_tet0[3] = pitop;
new_elements.Append(new_tet0);
new_tet1[0] = old[(pibase_index+2)%4];
new_tet1[1] = old[(pibase_index+3)%4];
new_tet1[2] = pinew;
new_tet1[3] = pitop;
new_elements.Append(new_tet1);
}
return new_elements;
};
static double SplitElementBadness (const Mesh::T_POINTS & points, const MeshingParameters & mp, Element old, PointIndex pi0, PointIndex pi1, MeshPoint & pnew)
{
double badness = 0;
auto np = old.GetNP();
PointIndex dummy{-1};
if(np == 4)
{
// Split tet into two tets
badness += CalcBadReplacePoints ( points, mp, old, 0, pi0, dummy, pnew );
badness += CalcBadReplacePoints ( points, mp, old, 0, pi1, dummy, pnew );
}
else if (np == 5)
{
// split pyramid into pyramid and two tets
auto pibase = (pi0==old[4]) ? pi1 : pi0;
auto pitop = (pi0==old[4]) ? pi0 : pi1;
badness += CalcBadReplacePoints ( points, mp, old, 0, pitop, dummy, pnew );
Element tet = old;
tet.SetType(TET);
size_t pibase_index=0;
for(auto i : Range(4))
if(old[i]==pibase)
pibase_index = i;
MeshPoint p[4];
p[0] = points[old[(pibase_index+1)%4]];
p[1] = points[old[(pibase_index+2)%4]];
p[2] = pnew;
p[3] = points[pitop];
badness += CalcTetBadness (p[0], p[1], p[2], p[3], 0, mp);
p[0] = points[old[(pibase_index+2)%4]];
p[1] = points[old[(pibase_index+3)%4]];
p[2] = pnew;
p[3] = points[pitop];
badness += CalcTetBadness (p[0], p[1], p[2], p[3], 0, mp);
}
return badness;
};
/*
Combine two points to one.
Set new point into the center, if both are
@ -59,6 +159,7 @@ double MeshOptimize3d :: CombineImproveEdge (Mesh & mesh,
{
Element & elem = mesh[ei];
if (elem.IsDeleted()) return false;
if(elem.GetType() != TET) return false; // TODO: implement case where pi0 or pi1 is top of a pyramid
if (elem[0] == pi1 || elem[1] == pi1 || elem[2] == pi1 || elem[3] == pi1)
{
@ -3902,6 +4003,207 @@ void MeshOptimize3d :: SwapImprove2 (Mesh & mesh, OPTIMIZEGOAL goal)
(*testout) << "swapimprove2 done" << "\n";
}
double MeshOptimize3d :: SplitImprove2Element (Mesh & mesh,
ElementIndex ei,
const Table<ElementIndex, PointIndex> & elements_of_point,
const Array<double> & el_badness,
bool check_only)
{
auto & el = mesh[ei];
if(el.GetType() != TET)
return false;
// Optimize only bad elements
if(el_badness[ei] < 100)
return false;
// search for very flat tets, with two disjoint edges nearly crossing, like a rectangle with diagonals
static constexpr int tetedges[6][2] =
{ { 0, 1 }, { 0, 2 }, { 0, 3 },
{ 1, 2 }, { 1, 3 }, { 2, 3 } };
int minedge = -1;
double mindist = 1e99;
double minlam0, minlam1;
for (int i : Range(3))
{
auto pi0 = el[tetedges[i][0]];
auto pi1 = el[tetedges[i][1]];
auto pi2 = el[tetedges[5-i][0]];
auto pi3 = el[tetedges[5-i][1]];
double lam0, lam1;
double dist = MinDistLL2(mesh[pi0], mesh[pi1], mesh[pi2], mesh[pi3], lam0, lam1 );
if(dist<mindist)
{
mindist = dist;
minedge = i;
minlam0 = lam0;
minlam1 = lam1;
}
}
if(minedge==-1)
return false;
auto pi0 = el[tetedges[minedge][0]];
auto pi1 = el[tetedges[minedge][1]];
auto pi2 = el[tetedges[5-minedge][0]];
auto pi3 = el[tetedges[5-minedge][1]];
// we cannot split edges on the boundary
if(mesh.BoundaryEdge (pi0,pi1) || mesh.BoundaryEdge(pi2, pi3))
return false;
ArrayMem<ElementIndex, 50> has_both_points0;
ArrayMem<ElementIndex, 50> has_both_points1;
Point3d p[4] = { mesh[el[0]], mesh[el[1]], mesh[el[2]], mesh[el[3]] };
auto center = Center(p[0]+minlam0*(p[1]-p[0]), p[2]+minlam1*(p[3]-p[2]));
MeshPoint pnew;
pnew(0) = center.X();
pnew(1) = center.Y();
pnew(2) = center.Z();
// find all tets with edge (pi0,pi1) or (pi2,pi3)
for (auto ei0 : elements_of_point[pi0] )
{
Element & elem = mesh[ei0];
if (elem.IsDeleted()) return false;
if (ei0 == ei) continue;
if (elem[0] == pi1 || elem[1] == pi1 || elem[2] == pi1 || elem[3] == pi1 || (elem.GetNP()==5 && elem[4]==pi1) )
if(!has_both_points0.Contains(ei0))
has_both_points0.Append (ei0);
}
for (auto ei1 : elements_of_point[pi2] )
{
Element & elem = mesh[ei1];
if (elem.IsDeleted()) return false;
if (ei1 == ei) continue;
if (elem[0] == pi3 || elem[1] == pi3 || elem[2] == pi3 || elem[3] == pi3 || (elem.GetNP()==5 && elem[4]==pi3))
if(!has_both_points1.Contains(ei1))
has_both_points1.Append (ei1);
}
double badness_before = el_badness[ei];
double badness_after = 0.0;
for (auto ei0 : has_both_points0)
{
if(mesh[ei0].GetType()!=TET)
return false;
badness_before += el_badness[ei0];
badness_after += SplitElementBadness (mesh.Points(), mp, mesh[ei0], pi0, pi1, pnew);
}
for (auto ei1 : has_both_points1)
{
if(mesh[ei1].GetType()!=TET)
return false;
badness_before += el_badness[ei1];
badness_after += SplitElementBadness (mesh.Points(), mp, mesh[ei1], pi2, pi3, pnew);
}
if(check_only)
return badness_after-badness_before;
if(badness_after<badness_before)
{
PointIndex pinew = mesh.AddPoint (center);
el.flags.illegal_valid = 0;
el.Delete();
for (auto ei1 : has_both_points0)
{
auto new_els = SplitElement(mesh[ei1], pi0, pi1, pinew);
for(const auto & el : new_els)
mesh.AddVolumeElement(el);
mesh[ei1].Delete();
}
for (auto ei1 : has_both_points1)
{
auto new_els = SplitElement(mesh[ei1], pi2, pi3, pinew);
for(const auto & el : new_els)
mesh.AddVolumeElement(el);
mesh[ei1].Delete();
}
}
return badness_after-badness_before;
}
// Split two opposite edges of very flat tet and let all 4 new segments have one common vertex
// Imagine a square with 2 diagonals -> new point where diagonals cross, remove the flat tet
void MeshOptimize3d :: SplitImprove2 (Mesh & mesh)
{
static Timer t("MeshOptimize3d::SplitImprove2"); RegionTimer reg(t);
static Timer tsearch("Search");
static Timer topt("Optimize");
int ne = mesh.GetNE();
auto elements_of_point = mesh.CreatePoint2ElementTable();
int ntasks = 4*ngcore::TaskManager::GetNumThreads();
const char * savetask = multithread.task;
multithread.task = "Optimize Volume: Split Improve 2";
Array<double> el_badness (ne);
ParallelForRange(Range(ne), [&] (auto myrange)
{
for (ElementIndex ei : myrange)
{
if(mp.only3D_domain_nr && mp.only3D_domain_nr != mesh[ei].GetIndex())
continue;
el_badness[ei] = CalcBad (mesh.Points(), mesh[ei], 0);
}
});
mesh.BoundaryEdge (1,2); // ensure the boundary-elements table is built
Array<std::tuple<double, ElementIndex>> split_candidates(ne);
std::atomic<int> improvement_counter(0);
tsearch.Start();
ParallelForRange(Range(ne), [&] (auto myrange)
{
for(ElementIndex ei : myrange)
{
if(mp.only3D_domain_nr && mp.only3D_domain_nr != mesh[ei].GetIndex())
continue;
double d_badness = SplitImprove2Element(mesh, ei, elements_of_point, el_badness, true);
if(d_badness<0.0)
{
int index = improvement_counter++;
split_candidates[index] = make_tuple(d_badness, ei);
}
}
}, ntasks);
tsearch.Stop();
auto elements_with_improvement = split_candidates.Part(0, improvement_counter.load());
QuickSort(elements_with_improvement);
size_t cnt = 0;
topt.Start();
for(auto [d_badness, ei] : elements_with_improvement)
{
if( SplitImprove2Element(mesh, ei, elements_of_point, el_badness, false) < 0.0)
cnt++;
}
topt.Stop();
PrintMessage (5, cnt, " elements split");
(*testout) << "SplitImprove2 done" << "\n";
if(cnt>0)
mesh.Compress();
multithread.task = savetask;
}
/*
void Mesh :: SwapImprove2 (OPTIMIZEGOAL goal)

View File

@ -26,6 +26,9 @@ public:
void SplitImprove (Mesh & mesh, OPTIMIZEGOAL goal = OPT_QUALITY);
void SplitImproveSequential (Mesh & mesh, OPTIMIZEGOAL goal = OPT_QUALITY);
double SplitImproveEdge (Mesh & mesh, OPTIMIZEGOAL goal, Table<ElementIndex,PointIndex> & elementsonnode, Array<double> &elerrs, NgArray<INDEX_3> &locfaces, double badmax, PointIndex pi1, PointIndex pi2, PointIndex ptmp, bool check_only=false);
void SplitImprove2 (Mesh & mesh);
double SplitImprove2Element (Mesh & mesh, ElementIndex ei, const Table<ElementIndex, PointIndex> & elements_of_point, const Array<double> & elerrs, bool check_only);
double SwapImproveEdge (Mesh & mesh, OPTIMIZEGOAL goal, const NgBitArray * working_elements, Table<ElementIndex,PointIndex> & elementsonnode, INDEX_3_HASHTABLE<int> & faces, PointIndex pi1, PointIndex pi2, bool check_only=false);

View File

@ -684,6 +684,7 @@ namespace netgen
{
case 'c': optmesh.CombineImprove(mesh3d, OPT_REST); break;
case 'd': optmesh.SplitImprove(mesh3d); break;
case 'D': optmesh.SplitImprove2(mesh3d); break;
case 's': optmesh.SwapImprove(mesh3d); break;
// case 'u': optmesh.SwapImproveSurface(mesh3d); break;
case 't': optmesh.SwapImprove2(mesh3d); break;

View File

@ -1198,12 +1198,13 @@ namespace netgen
// s .. swap faces
// c .. combine elements
// d .. divide elements
// D .. divide and join opposite edges, remove element
// p .. plot, no pause
// P .. plot, Pause
// h .. Histogramm, no pause
// H .. Histogramm, pause
*/
string optimize3d = "cmdmustm";
string optimize3d = "cmdDmustm";
/// number of 3d optimization steps
int optsteps3d = 3;
/**

View File

@ -124,8 +124,8 @@
},
{
"angles_tet": [
16.335,
152.61
15.88,
154.64
],
"angles_trig": [
20.0,
@ -133,9 +133,9 @@
],
"ne1d": 136,
"ne2d": 222,
"ne3d": 348,
"quality_histogram": "[0, 0, 0, 0, 0, 4, 3, 5, 4, 9, 18, 23, 27, 46, 55, 62, 55, 20, 16, 1]",
"total_badness": 514.05343802
"ne3d": 352,
"quality_histogram": "[0, 0, 0, 0, 0, 5, 5, 7, 4, 7, 14, 26, 24, 54, 64, 61, 47, 18, 14, 2]",
"total_badness": 527.329265
},
{
"angles_tet": [
@ -293,33 +293,33 @@
},
{
"angles_tet": [
13.26,
163.45
14.466,
161.38
],
"angles_trig": [
11.907,
152.58
13.564,
150.65
],
"ne1d": 32,
"ne2d": 220,
"ne3d": 556,
"quality_histogram": "[0, 0, 0, 4, 7, 14, 27, 33, 41, 29, 37, 47, 34, 50, 41, 51, 63, 38, 30, 10]",
"total_badness": 997.95710204
"ne3d": 563,
"quality_histogram": "[0, 0, 0, 3, 3, 7, 24, 22, 35, 34, 40, 43, 45, 60, 61, 53, 58, 41, 27, 7]",
"total_badness": 960.07699692
},
{
"angles_tet": [
2.8811,
172.75
5.6575,
169.44
],
"angles_trig": [
9.0948,
156.22
7.092,
155.41
],
"ne1d": 48,
"ne2d": 428,
"ne3d": 770,
"quality_histogram": "[2, 11, 24, 35, 27, 40, 36, 49, 76, 95, 61, 81, 68, 31, 52, 32, 17, 19, 12, 2]",
"total_badness": 2061.8554811
"ne3d": 763,
"quality_histogram": "[0, 1, 12, 30, 35, 44, 39, 49, 82, 100, 68, 81, 55, 44, 49, 23, 22, 19, 8, 2]",
"total_badness": 1832.2349397
},
{
"angles_tet": [
@ -471,9 +471,9 @@
],
"ne1d": 262,
"ne2d": 726,
"ne3d": 2153,
"quality_histogram": "[0, 5, 20, 35, 79, 117, 112, 108, 75, 47, 53, 85, 111, 177, 250, 290, 240, 204, 118, 27]",
"total_badness": 4183.5255584
"ne3d": 2167,
"quality_histogram": "[0, 4, 17, 35, 75, 117, 114, 112, 77, 51, 58, 86, 115, 177, 248, 293, 239, 204, 118, 27]",
"total_badness": 4176.9278168
},
{
"angles_tet": [
@ -507,18 +507,18 @@
},
{
"angles_tet": [
5.4026,
168.34
5.9887,
161.33
],
"angles_trig": [
13.552,
13.133,
150.46
],
"ne1d": 262,
"ne2d": 726,
"ne3d": 2048,
"quality_histogram": "[0, 2, 10, 18, 56, 101, 108, 97, 63, 36, 41, 60, 100, 164, 255, 284, 287, 195, 135, 36]",
"total_badness": 3675.3946288
"ne3d": 2060,
"quality_histogram": "[0, 2, 5, 15, 46, 103, 106, 104, 71, 36, 48, 67, 99, 165, 253, 287, 287, 195, 136, 35]",
"total_badness": 3642.1604728
},
{
"angles_tet": [
@ -633,14 +633,14 @@
154.37
],
"angles_trig": [
19.374,
19.317,
128.1
],
"ne1d": 428,
"ne2d": 926,
"ne3d": 1071,
"quality_histogram": "[0, 0, 0, 0, 0, 1, 3, 22, 48, 36, 110, 131, 98, 115, 161, 162, 68, 66, 30, 20]",
"total_badness": 1667.9770545
"ne3d": 1086,
"quality_histogram": "[0, 0, 0, 0, 0, 1, 3, 22, 44, 37, 108, 133, 101, 117, 167, 161, 67, 71, 33, 21]",
"total_badness": 1684.0903817
}
],
"cubemcyl.geo": [
@ -860,18 +860,18 @@
},
{
"angles_tet": [
15.925,
16.061,
157.39
],
"angles_trig": [
17.814,
16.851,
127.45
],
"ne1d": 36,
"ne2d": 152,
"ne3d": 381,
"quality_histogram": "[0, 0, 0, 0, 0, 9, 13, 18, 26, 25, 30, 29, 42, 32, 39, 28, 41, 21, 22, 6]",
"total_badness": 648.79536841
"ne3d": 385,
"quality_histogram": "[0, 0, 0, 0, 0, 10, 8, 21, 24, 22, 29, 37, 42, 28, 43, 24, 38, 22, 25, 12]",
"total_badness": 647.21940974
},
{
"angles_tet": [
@ -1014,18 +1014,18 @@
},
{
"angles_tet": [
5.1577,
170.71
5.7043,
170.47
],
"angles_trig": [
8.073,
161.81
8.0227,
160.66
],
"ne1d": 0,
"ne2d": 192,
"ne3d": 748,
"quality_histogram": "[0, 5, 41, 63, 100, 92, 74, 71, 54, 49, 43, 43, 23, 20, 20, 20, 10, 5, 12, 3]",
"total_badness": 2470.4393077
"ne3d": 749,
"quality_histogram": "[0, 2, 30, 63, 86, 89, 71, 68, 67, 54, 50, 43, 27, 28, 17, 23, 13, 9, 7, 2]",
"total_badness": 2339.9827516
},
{
"angles_tet": [
@ -1166,18 +1166,18 @@
},
{
"angles_tet": [
20.184,
19.932,
144.83
],
"angles_trig": [
21.582,
21.622,
126.14
],
"ne1d": 432,
"ne2d": 9544,
"ne3d": 69863,
"quality_histogram": "[0, 0, 0, 0, 0, 0, 1, 7, 30, 69, 222, 646, 1562, 3675, 7035, 11242, 14646, 15515, 11810, 3403]",
"total_badness": 85648.446235
"ne3d": 69846,
"quality_histogram": "[0, 0, 0, 0, 0, 0, 1, 7, 30, 71, 221, 652, 1560, 3667, 7028, 11234, 14630, 15524, 11810, 3411]",
"total_badness": 85625.275421
}
],
"ellipticcyl.geo": [
@ -1376,9 +1376,9 @@
],
"ne1d": 10108,
"ne2d": 30160,
"ne3d": 152987,
"quality_histogram": "[0, 3, 1, 3, 6, 20, 57, 149, 535, 1257, 2919, 5827, 10443, 16376, 21793, 26060, 26579, 22897, 14346, 3716]",
"total_badness": 202618.94822
"ne3d": 153012,
"quality_histogram": "[0, 3, 1, 3, 6, 20, 57, 149, 536, 1257, 2919, 5836, 10439, 16388, 21788, 26067, 26565, 22916, 14350, 3712]",
"total_badness": 202656.25887
},
{
"angles_tet": [
@ -1391,9 +1391,9 @@
],
"ne1d": 5988,
"ne2d": 11102,
"ne3d": 29317,
"quality_histogram": "[3, 4, 5, 8, 16, 44, 120, 246, 699, 1024, 1561, 2491, 3110, 3894, 4329, 4296, 3374, 2408, 1353, 332]",
"total_badness": 43465.268618
"ne3d": 29343,
"quality_histogram": "[3, 4, 5, 8, 14, 42, 121, 248, 691, 1040, 1542, 2504, 3118, 3920, 4331, 4281, 3366, 2421, 1367, 317]",
"total_badness": 43497.876838
},
{
"angles_tet": [
@ -1406,9 +1406,9 @@
],
"ne1d": 9622,
"ne2d": 23964,
"ne3d": 80994,
"quality_histogram": "[2, 14, 4, 20, 18, 40, 94, 224, 488, 1114, 2412, 4540, 7490, 10250, 12758, 13185, 12021, 9204, 5660, 1456]",
"total_badness": 111934.48598
"ne3d": 80995,
"quality_histogram": "[2, 14, 4, 20, 18, 40, 94, 225, 485, 1115, 2415, 4537, 7493, 10248, 12753, 13190, 12020, 9207, 5660, 1455]",
"total_badness": 111934.52308
}
],
"hinge.stl": [
@ -1490,17 +1490,17 @@
{
"angles_tet": [
20.701,
140.94
144.6
],
"angles_trig": [
22.443,
122.89
122.07
],
"ne1d": 1862,
"ne2d": 19474,
"ne3d": 136555,
"quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 1, 12, 59, 278, 860, 2542, 6422, 13021, 21252, 29142, 31120, 24008, 7838]",
"total_badness": 165971.00359
"ne3d": 136546,
"quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 1, 12, 59, 281, 864, 2538, 6435, 13014, 21236, 29154, 31109, 24006, 7837]",
"total_badness": 165965.29798
}
],
"lense.in2d": [
@ -1690,18 +1690,18 @@
"manyholes.geo": [
{
"angles_tet": [
14.385,
14.551,
155.18
],
"angles_trig": [
13.429,
16.38,
141.4
],
"ne1d": 5886,
"ne2d": 48052,
"ne3d": 178770,
"quality_histogram": "[0, 0, 0, 0, 0, 5, 15, 82, 303, 822, 2352, 6216, 10998, 19000, 27368, 30676, 31225, 26902, 18298, 4508]",
"total_badness": 233986.23978
"ne3d": 178844,
"quality_histogram": "[0, 0, 0, 0, 0, 5, 11, 71, 288, 829, 2312, 6198, 10948, 18856, 27414, 30640, 31333, 26927, 18474, 4538]",
"total_badness": 233920.54177
},
{
"angles_tet": [
@ -1715,8 +1715,8 @@
"ne1d": 2746,
"ne2d": 13866,
"ne3d": 29391,
"quality_histogram": "[0, 0, 0, 0, 13, 14, 37, 138, 377, 848, 1450, 2328, 3278, 4286, 4195, 3745, 3323, 2685, 1964, 710]",
"total_badness": 42208.591965
"quality_histogram": "[0, 0, 0, 0, 13, 14, 37, 136, 380, 846, 1453, 2331, 3276, 4281, 4196, 3749, 3317, 2686, 1967, 709]",
"total_badness": 42208.382479
},
{
"angles_tet": [
@ -1729,9 +1729,9 @@
],
"ne1d": 4106,
"ne2d": 27994,
"ne3d": 70783,
"quality_histogram": "[0, 0, 0, 1, 30, 72, 170, 340, 660, 1449, 2616, 4104, 6681, 9272, 10482, 10764, 9861, 7627, 4870, 1784]",
"total_badness": 99055.647638
"ne3d": 70797,
"quality_histogram": "[0, 0, 0, 1, 30, 72, 170, 340, 665, 1450, 2605, 4080, 6678, 9294, 10482, 10758, 9889, 7627, 4870, 1786]",
"total_badness": 99064.519397
}
],
"manyholes2.geo": [
@ -1746,9 +1746,9 @@
],
"ne1d": 10202,
"ne2d": 55380,
"ne3d": 128240,
"quality_histogram": "[0, 0, 0, 0, 4, 29, 79, 237, 725, 1935, 4437, 7722, 11695, 17431, 18582, 18325, 17276, 15158, 10938, 3667]",
"total_badness": 176228.44994
"ne3d": 128239,
"quality_histogram": "[0, 0, 0, 0, 4, 29, 79, 237, 724, 1933, 4439, 7719, 11694, 17428, 18585, 18328, 17275, 15160, 10938, 3667]",
"total_badness": 176224.09669
}
],
"matrix.geo": [
@ -1763,14 +1763,14 @@
],
"ne1d": 174,
"ne2d": 1198,
"ne3d": 5066,
"quality_histogram": "[0, 0, 11, 118, 169, 57, 61, 111, 95, 184, 293, 368, 508, 651, 617, 577, 496, 429, 246, 75]",
"total_badness": 8799.2034431
"ne3d": 5070,
"quality_histogram": "[0, 0, 11, 117, 166, 59, 60, 113, 98, 185, 297, 374, 498, 658, 620, 577, 494, 424, 240, 79]",
"total_badness": 8804.2621534
},
{
"angles_tet": [
7.9601,
167.83
9.3063,
165.3
],
"angles_trig": [
7.9174,
@ -1778,9 +1778,9 @@
],
"ne1d": 106,
"ne2d": 610,
"ne3d": 1654,
"quality_histogram": "[0, 1, 12, 50, 83, 156, 195, 155, 160, 124, 137, 141, 133, 102, 67, 34, 32, 43, 24, 5]",
"total_badness": 4104.7339693
"ne3d": 1659,
"quality_histogram": "[0, 1, 13, 49, 81, 155, 190, 149, 159, 132, 135, 145, 137, 107, 66, 37, 33, 40, 26, 4]",
"total_badness": 4094.4605262
},
{
"angles_tet": [
@ -1808,9 +1808,9 @@
],
"ne1d": 174,
"ne2d": 1198,
"ne3d": 5005,
"quality_histogram": "[0, 0, 7, 100, 165, 53, 56, 108, 103, 165, 278, 336, 503, 574, 623, 631, 520, 438, 264, 81]",
"total_badness": 8524.8161998
"ne3d": 5012,
"quality_histogram": "[0, 0, 7, 101, 161, 60, 53, 107, 93, 172, 281, 320, 519, 570, 616, 653, 509, 445, 260, 85]",
"total_badness": 8527.4907589
},
{
"angles_tet": [
@ -1830,7 +1830,7 @@
{
"angles_tet": [
18.203,
145.26
145.38
],
"angles_trig": [
17.821,
@ -1838,9 +1838,9 @@
],
"ne1d": 418,
"ne2d": 5968,
"ne3d": 101047,
"quality_histogram": "[0, 0, 0, 0, 0, 1, 5, 8, 52, 104, 356, 989, 2551, 5548, 10164, 16045, 20725, 22251, 16920, 5328]",
"total_badness": 124081.88321
"ne3d": 101113,
"quality_histogram": "[0, 0, 0, 0, 0, 0, 4, 7, 51, 102, 349, 993, 2550, 5563, 10196, 16090, 20698, 22258, 16911, 5341]",
"total_badness": 124155.81178
}
],
"ortho.geo": [
@ -2034,29 +2034,29 @@
162.28
],
"angles_trig": [
14.582,
14.714,
141.01
],
"ne1d": 160,
"ne2d": 286,
"ne3d": 590,
"quality_histogram": "[0, 0, 0, 0, 6, 10, 15, 24, 40, 62, 65, 67, 64, 47, 50, 45, 38, 42, 12, 3]",
"total_badness": 1045.1530377
"ne3d": 598,
"quality_histogram": "[0, 0, 0, 0, 3, 2, 13, 17, 35, 62, 59, 74, 66, 57, 56, 49, 39, 43, 19, 4]",
"total_badness": 1009.5773389
},
{
"angles_tet": [
12.731,
162.52
11.213,
163.54
],
"angles_trig": [
15.335,
148.34
13.446,
152.87
],
"ne1d": 232,
"ne2d": 598,
"ne3d": 1383,
"quality_histogram": "[0, 0, 0, 1, 13, 17, 35, 53, 69, 92, 121, 143, 146, 153, 154, 121, 115, 84, 52, 14]",
"total_badness": 2341.0219936
"ne3d": 1380,
"quality_histogram": "[0, 0, 0, 2, 10, 15, 36, 48, 63, 92, 116, 131, 160, 158, 151, 113, 125, 91, 56, 13]",
"total_badness": 2309.6335564
},
{
"angles_tet": [
@ -2116,9 +2116,9 @@
],
"ne1d": 886,
"ne2d": 2592,
"ne3d": 8268,
"quality_histogram": "[4, 9, 33, 42, 41, 54, 43, 47, 100, 142, 258, 402, 641, 938, 1253, 1305, 1193, 1022, 588, 153]",
"total_badness": 12309.108485
"ne3d": 8269,
"quality_histogram": "[4, 9, 33, 44, 40, 53, 44, 46, 101, 142, 258, 402, 641, 938, 1253, 1304, 1193, 1022, 589, 153]",
"total_badness": 12315.265721
},
{
"angles_tet": [
@ -2131,9 +2131,9 @@
],
"ne1d": 570,
"ne2d": 1202,
"ne3d": 1823,
"quality_histogram": "[2, 22, 36, 57, 66, 78, 105, 136, 163, 183, 187, 160, 150, 143, 114, 76, 69, 47, 25, 4]",
"total_badness": 4525.5906501
"ne3d": 1839,
"quality_histogram": "[2, 21, 37, 57, 67, 78, 110, 136, 161, 177, 190, 158, 155, 149, 115, 78, 69, 51, 24, 4]",
"total_badness": 4553.9697099
},
{
"angles_tet": [
@ -2162,8 +2162,8 @@
"ne1d": 956,
"ne2d": 2828,
"ne3d": 8577,
"quality_histogram": "[3, 9, 37, 48, 48, 52, 58, 60, 87, 127, 205, 328, 507, 805, 1199, 1394, 1476, 1215, 736, 183]",
"total_badness": 12579.939101
"quality_histogram": "[3, 9, 37, 48, 48, 52, 57, 61, 87, 129, 205, 326, 507, 804, 1200, 1394, 1476, 1215, 736, 183]",
"total_badness": 12580.561684
},
{
"angles_tet": [
@ -2176,9 +2176,9 @@
],
"ne1d": 1554,
"ne2d": 6372,
"ne3d": 31588,
"quality_histogram": "[2, 7, 14, 6, 25, 55, 52, 67, 91, 190, 307, 635, 1249, 2307, 3892, 5308, 6146, 5974, 4098, 1163]",
"total_badness": 40793.027008
"ne3d": 31607,
"quality_histogram": "[2, 7, 14, 7, 26, 53, 50, 67, 90, 188, 312, 638, 1249, 2301, 3886, 5314, 6167, 5965, 4114, 1157]",
"total_badness": 40813.948339
},
{
"angles_tet": [
@ -2191,9 +2191,9 @@
],
"ne1d": 2992,
"ne2d": 23322,
"ne3d": 281957,
"quality_histogram": "[4, 9, 10, 11, 11, 21, 33, 65, 96, 260, 755, 2146, 5563, 13605, 27734, 44577, 59933, 63963, 48268, 14893]",
"total_badness": 344644.09939
"ne3d": 281896,
"quality_histogram": "[4, 10, 12, 10, 9, 21, 29, 61, 95, 246, 747, 2146, 5540, 13546, 27675, 44558, 59947, 64037, 48291, 14912]",
"total_badness": 344508.9779
}
],
"revolution.geo": [
@ -2417,31 +2417,31 @@
147.57
],
"angles_trig": [
16.998,
17.184,
119.06
],
"ne1d": 480,
"ne2d": 2394,
"ne3d": 6711,
"quality_histogram": "[0, 0, 0, 0, 1, 2, 5, 9, 18, 27, 60, 127, 255, 455, 730, 1074, 1345, 1332, 952, 319]",
"total_badness": 8467.8828851
"quality_histogram": "[0, 0, 0, 0, 2, 2, 7, 8, 21, 26, 61, 123, 262, 462, 722, 1073, 1348, 1317, 960, 317]",
"total_badness": 8476.8430085
}
],
"shaft.geo": [
{
"angles_tet": [
9.1003,
164.73
8.3002,
162.65
],
"angles_trig": [
9.2165,
146.85
9.3888,
147.77
],
"ne1d": 708,
"ne2d": 1722,
"ne3d": 2725,
"quality_histogram": "[0, 0, 3, 6, 15, 19, 28, 47, 87, 138, 286, 386, 316, 291, 250, 298, 242, 178, 104, 31]",
"total_badness": 4420.5345142
"ne3d": 2740,
"quality_histogram": "[0, 0, 1, 5, 8, 15, 31, 39, 87, 146, 294, 392, 329, 286, 245, 291, 247, 185, 108, 31]",
"total_badness": 4403.8888129
},
{
"angles_tet": [
@ -2460,18 +2460,18 @@
},
{
"angles_tet": [
7.5703,
165.31
12.907,
159.86
],
"angles_trig": [
12.063,
152.34
11.963,
148.8
],
"ne1d": 510,
"ne2d": 1004,
"ne3d": 1832,
"quality_histogram": "[0, 0, 2, 8, 9, 35, 44, 79, 84, 110, 107, 164, 159, 194, 235, 212, 202, 104, 66, 18]",
"total_badness": 3083.8429043
"ne3d": 1838,
"quality_histogram": "[0, 0, 0, 4, 9, 30, 35, 80, 75, 109, 121, 152, 156, 200, 242, 206, 210, 105, 80, 24]",
"total_badness": 3018.9734455
},
{
"angles_tet": [
@ -2479,14 +2479,14 @@
162.65
],
"angles_trig": [
14.459,
150.06
15.525,
147.01
],
"ne1d": 708,
"ne2d": 1722,
"ne3d": 2703,
"quality_histogram": "[0, 0, 0, 0, 2, 3, 11, 17, 48, 118, 246, 396, 350, 292, 274, 307, 281, 221, 102, 35]",
"total_badness": 4122.3827179
"ne3d": 2713,
"quality_histogram": "[0, 0, 0, 1, 3, 1, 11, 22, 49, 109, 260, 408, 344, 300, 273, 303, 272, 215, 106, 36]",
"total_badness": 4151.3073463
},
{
"angles_tet": [
@ -2644,18 +2644,18 @@
},
{
"angles_tet": [
8.1657,
165.53
9.1579,
165.65
],
"angles_trig": [
9.2408,
143.87
8.211,
143.3
],
"ne1d": 30,
"ne2d": 116,
"ne3d": 262,
"quality_histogram": "[0, 0, 4, 26, 30, 52, 33, 16, 22, 13, 11, 12, 11, 8, 6, 7, 6, 3, 2, 0]",
"total_badness": 832.73325512
"ne3d": 264,
"quality_histogram": "[0, 0, 7, 21, 33, 55, 37, 14, 20, 15, 10, 6, 13, 10, 6, 7, 5, 3, 2, 0]",
"total_badness": 850.25370446
},
{
"angles_tet": [
@ -2997,18 +2997,18 @@
},
{
"angles_tet": [
1.7223,
174.81
1.6657,
174.24
],
"angles_trig": [
4.9314,
166.92
4.1081,
164.43
],
"ne1d": 0,
"ne2d": 692,
"ne3d": 2691,
"quality_histogram": "[26, 258, 398, 331, 349, 264, 205, 192, 123, 145, 87, 67, 74, 48, 30, 33, 29, 20, 11, 1]",
"total_badness": 14056.890733
"ne3d": 2737,
"quality_histogram": "[17, 200, 365, 335, 363, 301, 234, 187, 154, 143, 106, 84, 56, 48, 38, 45, 27, 19, 12, 3]",
"total_badness": 13234.755766
},
{
"angles_tet": [
@ -3083,14 +3083,14 @@
],
"ne1d": 690,
"ne2d": 1684,
"ne3d": 5193,
"quality_histogram": "[0, 0, 1, 1, 1, 11, 32, 47, 111, 196, 275, 365, 465, 566, 668, 699, 617, 545, 452, 141]",
"total_badness": 7518.4794095
"ne3d": 5177,
"quality_histogram": "[0, 0, 1, 0, 1, 8, 27, 37, 108, 191, 285, 369, 461, 565, 670, 690, 621, 536, 462, 145]",
"total_badness": 7461.1502455
},
{
"angles_tet": [
8.1301,
160.14
8.0938,
167.14
],
"angles_trig": [
7.7605,
@ -3098,9 +3098,9 @@
],
"ne1d": 390,
"ne2d": 522,
"ne3d": 1353,
"quality_histogram": "[0, 0, 3, 13, 12, 38, 80, 115, 128, 149, 170, 126, 139, 107, 87, 85, 54, 34, 11, 2]",
"total_badness": 2731.8393348
"ne3d": 1349,
"quality_histogram": "[0, 0, 4, 13, 12, 41, 78, 115, 124, 147, 169, 127, 141, 104, 86, 86, 55, 34, 11, 2]",
"total_badness": 2729.6156372
},
{
"angles_tet": [
@ -3114,8 +3114,8 @@
"ne1d": 512,
"ne2d": 874,
"ne3d": 2381,
"quality_histogram": "[0, 0, 0, 3, 9, 15, 42, 68, 122, 139, 198, 209, 307, 380, 349, 235, 137, 97, 46, 25]",
"total_badness": 3929.5802554
"quality_histogram": "[0, 0, 0, 3, 9, 13, 41, 68, 124, 140, 196, 214, 302, 390, 345, 237, 128, 98, 47, 26]",
"total_badness": 3927.0434195
},
{
"angles_tet": [
@ -3128,14 +3128,14 @@
],
"ne1d": 690,
"ne2d": 1684,
"ne3d": 5099,
"quality_histogram": "[0, 0, 1, 1, 0, 3, 23, 37, 102, 189, 265, 343, 430, 564, 673, 707, 612, 543, 465, 141]",
"total_badness": 7304.8063731
"ne3d": 5095,
"quality_histogram": "[0, 0, 1, 0, 0, 4, 19, 34, 101, 181, 263, 354, 439, 548, 689, 696, 611, 547, 467, 141]",
"total_badness": 7282.7477612
},
{
"angles_tet": [
6.8825,
166.88
16.895,
145.94
],
"angles_trig": [
17.568,
@ -3143,13 +3143,13 @@
],
"ne1d": 1050,
"ne2d": 3812,
"ne3d": 17990,
"quality_histogram": "[0, 0, 1, 0, 0, 0, 3, 15, 34, 64, 183, 570, 1424, 2206, 2299, 2682, 2720, 2713, 2367, 709]",
"total_badness": 23464.671179
"ne3d": 18003,
"quality_histogram": "[0, 0, 0, 0, 0, 0, 3, 15, 34, 61, 181, 573, 1428, 2189, 2298, 2700, 2707, 2735, 2389, 690]",
"total_badness": 23471.146878
},
{
"angles_tet": [
14.338,
15.34,
149.41
],
"angles_trig": [
@ -3158,26 +3158,26 @@
],
"ne1d": 1722,
"ne2d": 10042,
"ne3d": 84837,
"quality_histogram": "[0, 0, 0, 0, 0, 3, 55, 1435, 719, 373, 691, 1186, 2492, 5459, 8935, 13171, 16437, 16966, 12825, 4090]",
"total_badness": 108583.90765
"ne3d": 84812,
"quality_histogram": "[0, 0, 0, 0, 0, 2, 49, 1423, 720, 374, 704, 1174, 2454, 5477, 8890, 13211, 16429, 16935, 12870, 4100]",
"total_badness": 108503.84867
}
],
"twobricks.geo": [
{
"angles_tet": [
22.934,
142.89
29.453,
134.56
],
"angles_trig": [
18.806,
142.29
26.574,
91.538
],
"ne1d": 72,
"ne2d": 50,
"ne3d": 41,
"quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 8, 2, 16, 3, 4, 0, 0, 0, 0]",
"total_badness": 68.897088924
"ne3d": 36,
"quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 8, 2, 18, 2, 4, 0, 0, 0, 0]",
"total_badness": 55.618194358
},
{
"angles_tet": [
@ -3211,18 +3211,18 @@
},
{
"angles_tet": [
22.934,
142.89
29.453,
134.56
],
"angles_trig": [
18.806,
142.29
26.574,
91.538
],
"ne1d": 72,
"ne2d": 50,
"ne3d": 41,
"quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 8, 2, 16, 3, 4, 0, 0, 0, 0]",
"total_badness": 68.897088924
"ne3d": 36,
"quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 8, 2, 18, 2, 4, 0, 0, 0, 0]",
"total_badness": 55.618194358
},
{
"angles_tet": [
@ -3252,24 +3252,24 @@
"ne2d": 346,
"ne3d": 595,
"quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 23, 40, 55, 95, 101, 105, 99, 60, 8]",
"total_badness": 777.63275563
"total_badness": 777.63275434
}
],
"twocubes.geo": [
{
"angles_tet": [
22.934,
142.89
29.453,
134.56
],
"angles_trig": [
18.806,
142.29
26.574,
91.538
],
"ne1d": 72,
"ne2d": 50,
"ne3d": 41,
"quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 8, 2, 16, 3, 4, 0, 0, 0, 0]",
"total_badness": 68.897088924
"ne3d": 36,
"quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 8, 2, 18, 2, 4, 0, 0, 0, 0]",
"total_badness": 55.618194358
},
{
"angles_tet": [
@ -3303,18 +3303,18 @@
},
{
"angles_tet": [
22.934,
142.89
29.453,
134.56
],
"angles_trig": [
18.806,
142.29
26.574,
91.538
],
"ne1d": 72,
"ne2d": 50,
"ne3d": 41,
"quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 8, 2, 16, 3, 4, 0, 0, 0, 0]",
"total_badness": 68.897088924
"ne3d": 36,
"quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 8, 2, 18, 2, 4, 0, 0, 0, 0]",
"total_badness": 55.618194358
},
{
"angles_tet": [
@ -3344,7 +3344,7 @@
"ne2d": 346,
"ne3d": 595,
"quality_histogram": "[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 23, 40, 55, 95, 101, 105, 99, 60, 8]",
"total_badness": 777.63275563
"total_badness": 777.63275434
}
],
"twocyl.geo": [