From 47641c9b2ca4eb84a0a0a19451142da7298ab723 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joachim=20Sch=C3=B6berl?= Date: Sun, 29 Sep 2019 20:47:41 +0200 Subject: [PATCH 1/2] swapimprove2 with core tables --- libsrc/meshing/improve3.cpp | 48 +++++++++++++++++++++++++++---------- libsrc/meshing/improve3.hpp | 2 +- 2 files changed, 36 insertions(+), 14 deletions(-) diff --git a/libsrc/meshing/improve3.cpp b/libsrc/meshing/improve3.cpp index f96d26c1..ca5c36c9 100644 --- a/libsrc/meshing/improve3.cpp +++ b/libsrc/meshing/improve3.cpp @@ -3432,7 +3432,7 @@ void MeshOptimize3d :: SwapImproveSurface (Mesh & mesh, OPTIMIZEGOAL goal, */ bool MeshOptimize3d :: SwapImprove2 ( Mesh & mesh, OPTIMIZEGOAL goal, ElementIndex eli1, int face, - TABLE & elementsonnode, + Table & elementsonnode, TABLE & belementsonnode, bool check_only ) { PointIndex pi1, pi2, pi3, pi4, pi5; @@ -3490,7 +3490,7 @@ bool MeshOptimize3d :: SwapImprove2 ( Mesh & mesh, OPTIMIZEGOAL goal, ElementInd if (bface) return false; - NgFlatArray row = elementsonnode[pi1]; + FlatArray row = elementsonnode[pi1]; for (int k = 0; k < row.Size(); k++) { ElementIndex eli2 = row[k]; @@ -3576,12 +3576,15 @@ bool MeshOptimize3d :: SwapImprove2 ( Mesh & mesh, OPTIMIZEGOAL goal, ElementInd ElementIndex neli = mesh.AddVolumeElement (el33); + /* + // do we need this ? for (int l = 0; l < 4; l++) { elementsonnode.Add (el31[l], eli1); elementsonnode.Add (el32[l], eli2); elementsonnode.Add (el33[l], neli); } + */ } return do_swap; @@ -3613,7 +3616,7 @@ void MeshOptimize3d :: SwapImprove2Sequential (Mesh & mesh, OPTIMIZEGOAL goal) if (goal == OPT_CONFORM) return; // contains at least all elements at node - TABLE elementsonnode(np); + // TABLE elementsonnode(np); TABLE belementsonnode(np); PrintMessage (3, "SwapImprove2 "); @@ -3639,7 +3642,6 @@ void MeshOptimize3d :: SwapImprove2Sequential (Mesh & mesh, OPTIMIZEGOAL goal) (*testout) << "Total badness = " << bad1 << endl; cout << "tot bad = " << bad1 << endl; - /* // find elements on node TableCreator creator(np); for ( ; !creator.Done(); creator++) @@ -3651,20 +3653,20 @@ void MeshOptimize3d :: SwapImprove2Sequential (Mesh & mesh, OPTIMIZEGOAL goal) creator.Add (pi, ei); }); - auto __elementsonnode = creator.MoveTable(); + auto elementsonnode = creator.MoveTable(); ngcore::ParallelForRange - (__elementsonnode.Range(), [&] (auto myrange) + (elementsonnode.Range(), [&] (auto myrange) { for (PointIndex pi : myrange) - QuickSort(__elementsonnode[pi]); + QuickSort(elementsonnode[pi]); }); - cout << "new elonnode " << __elementsonnode << endl; - */ - + // cout << "new elonnode " << __elementsonnode << endl; + + /* for (ElementIndex ei = 0; ei < ne; ei++) for (PointIndex pi : mesh[ei].PNums()) elementsonnode.Add (pi, ei); - + */ // cout << "old elonnode " << elementsonnode << endl; for (SurfaceElementIndex sei = 0; sei < nse; sei++) @@ -3740,7 +3742,7 @@ void MeshOptimize3d :: SwapImprove2 (Mesh & mesh, OPTIMIZEGOAL goal) if (goal == OPT_CONFORM) return; // contains at least all elements at node - TABLE elementsonnode(np); + // TABLE elementsonnode(np); TABLE belementsonnode(np); PrintMessage (3, "SwapImprove2 "); @@ -3751,10 +3753,30 @@ void MeshOptimize3d :: SwapImprove2 (Mesh & mesh, OPTIMIZEGOAL goal) // find elements on node + + TableCreator creator(np); + for ( ; !creator.Done(); creator++) + ngcore::ParallelForRange + (ElementIndex(ne), [&] (auto myrange) + { + for (ElementIndex ei : myrange) + for (PointIndex pi : mesh[ei].PNums()) + creator.Add (pi, ei); + }); + + auto elementsonnode = creator.MoveTable(); + ngcore::ParallelForRange + (elementsonnode.Range(), [&] (auto myrange) + { + for (PointIndex pi : myrange) + QuickSort(elementsonnode[pi]); + }); + + /* for (ElementIndex ei = 0; ei < ne; ei++) for (int j = 0; j < mesh[ei].GetNP(); j++) elementsonnode.Add (mesh[ei][j], ei); - + */ for (SurfaceElementIndex sei = 0; sei < nse; sei++) for (int j = 0; j < 3; j++) belementsonnode.Add (mesh[sei][j], sei); diff --git a/libsrc/meshing/improve3.hpp b/libsrc/meshing/improve3.hpp index d9a64a71..7bfb2f59 100644 --- a/libsrc/meshing/improve3.hpp +++ b/libsrc/meshing/improve3.hpp @@ -37,7 +37,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 ); + bool 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) From 8874e41aece92860ece5fb129f7f83cc9f83d77f Mon Sep 17 00:00:00 2001 From: Matthias Hochsteger Date: Sun, 29 Sep 2019 21:24:45 +0200 Subject: [PATCH 2/2] SwapImprove2 - delete/add elements instead of replacing them --- libsrc/meshing/improve3.cpp | 35 +++++------------------------------ 1 file changed, 5 insertions(+), 30 deletions(-) diff --git a/libsrc/meshing/improve3.cpp b/libsrc/meshing/improve3.cpp index ca5c36c9..efb9b99e 100644 --- a/libsrc/meshing/improve3.cpp +++ b/libsrc/meshing/improve3.cpp @@ -3570,22 +3570,11 @@ bool MeshOptimize3d :: SwapImprove2 ( Mesh & mesh, OPTIMIZEGOAL goal, ElementInd el32.flags.illegal_valid = 0; el33.flags.illegal_valid = 0; - mesh[eli1] = el31; - mesh[eli2] = el32; - - ElementIndex neli = - mesh.AddVolumeElement (el33); - - /* - // do we need this ? - for (int l = 0; l < 4; l++) - { - elementsonnode.Add (el31[l], eli1); - elementsonnode.Add (el32[l], eli2); - elementsonnode.Add (el33[l], neli); - } - */ - + mesh[eli1].Delete(); + mesh[eli2].Delete(); + mesh.AddVolumeElement (el31); + mesh.AddVolumeElement (el32); + mesh.AddVolumeElement (el33); } return do_swap; } @@ -3660,14 +3649,6 @@ void MeshOptimize3d :: SwapImprove2Sequential (Mesh & mesh, OPTIMIZEGOAL goal) for (PointIndex pi : myrange) QuickSort(elementsonnode[pi]); }); - // cout << "new elonnode " << __elementsonnode << endl; - - /* - for (ElementIndex ei = 0; ei < ne; ei++) - for (PointIndex pi : mesh[ei].PNums()) - elementsonnode.Add (pi, ei); - */ - // cout << "old elonnode " << elementsonnode << endl; for (SurfaceElementIndex sei = 0; sei < nse; sei++) for (int j = 0; j < 3; j++) @@ -3742,7 +3723,6 @@ void MeshOptimize3d :: SwapImprove2 (Mesh & mesh, OPTIMIZEGOAL goal) if (goal == OPT_CONFORM) return; // contains at least all elements at node - // TABLE elementsonnode(np); TABLE belementsonnode(np); PrintMessage (3, "SwapImprove2 "); @@ -3772,11 +3752,6 @@ void MeshOptimize3d :: SwapImprove2 (Mesh & mesh, OPTIMIZEGOAL goal) QuickSort(elementsonnode[pi]); }); - /* - for (ElementIndex ei = 0; ei < ne; ei++) - for (int j = 0; j < mesh[ei].GetNP(); j++) - elementsonnode.Add (mesh[ei][j], ei); - */ for (SurfaceElementIndex sei = 0; sei < nse; sei++) for (int j = 0; j < 3; j++) belementsonnode.Add (mesh[sei][j], sei);