From ab024c2e6c4d70ae5322f365e2ceed683e4f4ad9 Mon Sep 17 00:00:00 2001 From: Matthias Hochsteger Date: Thu, 24 Oct 2019 18:04:56 +0200 Subject: [PATCH] Sort edges by improvement in SwapImprove2 --- libsrc/meshing/improve3.cpp | 34 +++++++++++++++++++--------------- libsrc/meshing/improve3.hpp | 2 +- tests/pytest/results.json | 12 ++++++------ 3 files changed, 26 insertions(+), 22 deletions(-) diff --git a/libsrc/meshing/improve3.cpp b/libsrc/meshing/improve3.cpp index 83a8be25..c97e0974 100644 --- a/libsrc/meshing/improve3.cpp +++ b/libsrc/meshing/improve3.cpp @@ -3280,7 +3280,7 @@ void MeshOptimize3d :: SwapImproveSurface (Mesh & mesh, OPTIMIZEGOAL goal, 2 -> 3 conversion */ -bool MeshOptimize3d :: SwapImprove2 ( Mesh & mesh, OPTIMIZEGOAL goal, ElementIndex eli1, int face, +double MeshOptimize3d :: SwapImprove2 ( Mesh & mesh, OPTIMIZEGOAL goal, ElementIndex eli1, int face, Table & elementsonnode, TABLE & belementsonnode, bool check_only ) { @@ -3288,9 +3288,10 @@ bool MeshOptimize3d :: SwapImprove2 ( Mesh & mesh, OPTIMIZEGOAL goal, ElementInd Element el21(TET), el22(TET), el31(TET), el32(TET), el33(TET); int j = face; double bad1, bad2; + double d_badness = 0.0; Element & elem = mesh[eli1]; - if (elem.IsDeleted()) return false; + if (elem.IsDeleted()) return 0.0; int mattyp = elem.GetIndex(); @@ -3336,7 +3337,7 @@ bool MeshOptimize3d :: SwapImprove2 ( Mesh & mesh, OPTIMIZEGOAL goal, ElementInd } } - if (bface) return false; + if (bface) return 0.0; FlatArray row = elementsonnode[pi1]; @@ -3406,14 +3407,16 @@ bool MeshOptimize3d :: SwapImprove2 ( Mesh & mesh, OPTIMIZEGOAL goal, ElementInd bad2 += 1e4; - bool do_swap = (bad2 < bad1); + d_badness = bad2 - bad1; if ( ((bad2 < 1e6) || (bad2 < 10 * bad1)) && mesh.BoundaryEdge (pi4, pi5)) - do_swap = 1; + d_badness = -1e4; + if(check_only) + return d_badness; - if (!check_only && do_swap) + if (d_badness<0.0) { el31.flags.illegal_valid = 0; el32.flags.illegal_valid = 0; @@ -3425,12 +3428,11 @@ bool MeshOptimize3d :: SwapImprove2 ( Mesh & mesh, OPTIMIZEGOAL goal, ElementInd mesh.AddVolumeElement (el32); mesh.AddVolumeElement (el33); } - return do_swap; + return d_badness; } } } - - return false; + return d_badness; } /* @@ -3573,8 +3575,8 @@ void MeshOptimize3d :: SwapImprove2 (Mesh & mesh, OPTIMIZEGOAL goal) int num_threads = ngcore::TaskManager::GetNumThreads(); - Array> faces_with_improvement; - Array>> faces_with_improvement_threadlocal(num_threads); + Array> faces_with_improvement; + Array>> faces_with_improvement_threadlocal(num_threads); ParallelForRange( Range(ne), [&]( auto myrange ) { @@ -3601,8 +3603,9 @@ void MeshOptimize3d :: SwapImprove2 (Mesh & mesh, OPTIMIZEGOAL goal) for (int j = 0; j < 4; j++) { - if(SwapImprove2( mesh, goal, eli1, j, elementsonnode, belementsonnode, true)) - my_faces_with_improvement.Append( std::make_tuple(eli1, j) ); + double d_badness = SwapImprove2( mesh, goal, eli1, j, elementsonnode, belementsonnode, true); + if(d_badness<0.0) + my_faces_with_improvement.Append( std::make_tuple(d_badness, eli1, j) ); } } }); @@ -3612,8 +3615,9 @@ void MeshOptimize3d :: SwapImprove2 (Mesh & mesh, OPTIMIZEGOAL goal) QuickSort(faces_with_improvement); - for (auto [eli,j] : faces_with_improvement) - cnt += SwapImprove2( mesh, goal, eli, j, elementsonnode, belementsonnode, false); + for (auto [dummy, eli,j] : faces_with_improvement) + if(SwapImprove2( mesh, goal, eli, j, elementsonnode, belementsonnode, false) < 0.0) + cnt++; PrintMessage (5, cnt, " swaps performed"); diff --git a/libsrc/meshing/improve3.hpp b/libsrc/meshing/improve3.hpp index 0ddcc484..309df47f 100644 --- a/libsrc/meshing/improve3.hpp +++ b/libsrc/meshing/improve3.hpp @@ -35,7 +35,7 @@ public: const NgArray< NgArray* > * idmaps = NULL); void SwapImprove2Sequential (Mesh & mesh, OPTIMIZEGOAL goal = OPT_QUALITY); void SwapImprove2 (Mesh & mesh, OPTIMIZEGOAL goal = OPT_QUALITY); - bool SwapImprove2 ( Mesh & mesh, OPTIMIZEGOAL goal, ElementIndex eli1, int face, Table & elementsonnode, TABLE & belementsonnode, bool check_only=false ); + double SwapImprove2 ( Mesh & mesh, OPTIMIZEGOAL goal, ElementIndex eli1, int face, Table & elementsonnode, TABLE & belementsonnode, bool check_only=false ); double CalcBad (const Mesh::T_POINTS & points, const Element & elem, double h) diff --git a/tests/pytest/results.json b/tests/pytest/results.json index e8d57ab9..e8e49b6b 100644 --- a/tests/pytest/results.json +++ b/tests/pytest/results.json @@ -1391,9 +1391,9 @@ ], "ne1d": 6026, "ne2d": 11450, - "ne3d": 30659, - "quality_histogram": "[3, 4, 8, 18, 26, 57, 158, 291, 798, 1106, 1681, 2709, 3238, 4075, 4533, 4309, 3453, 2498, 1351, 343]", - "total_badness": 45874.630632 + "ne3d": 30654, + "quality_histogram": "[3, 4, 8, 18, 25, 59, 158, 291, 794, 1103, 1677, 2706, 3249, 4083, 4515, 4321, 3450, 2495, 1353, 342]", + "total_badness": 45863.767283 }, { "angles_tet": [ @@ -2460,7 +2460,7 @@ }, { "angles_tet": [ - 4.6838, + 4.7033, 172.82 ], "angles_trig": [ @@ -2470,8 +2470,8 @@ "ne1d": 510, "ne2d": 1004, "ne3d": 1988, - "quality_histogram": "[0, 19, 67, 59, 97, 97, 87, 135, 108, 111, 109, 144, 129, 178, 178, 176, 174, 69, 46, 5]", - "total_badness": 4737.8528785 + "quality_histogram": "[0, 18, 67, 62, 94, 98, 88, 137, 111, 106, 105, 142, 130, 182, 178, 175, 174, 70, 46, 5]", + "total_badness": 4736.9626467 }, { "angles_tet": [