diff --git a/libsrc/meshing/basegeom.cpp b/libsrc/meshing/basegeom.cpp index ca1b7651..9241e5e3 100644 --- a/libsrc/meshing/basegeom.cpp +++ b/libsrc/meshing/basegeom.cpp @@ -982,11 +982,10 @@ namespace netgen static Timer timer_opt2d("Optimization 2D"); RegionTimer reg(timer_opt2d); auto meshopt = MeshOptimize2d(mesh); + meshopt.SetFaceIndex(0); for(auto i : Range(mparam.optsteps2d)) - for(auto k : Range(mesh.GetNFD())) { PrintMessage(3, "Optimization step ", i); - meshopt.SetFaceIndex(k+1); int innerstep = 0; for(auto optstep : mparam.optimize2d) { diff --git a/libsrc/meshing/improve2.cpp b/libsrc/meshing/improve2.cpp index 2503d4eb..817c6c21 100644 --- a/libsrc/meshing/improve2.cpp +++ b/libsrc/meshing/improve2.cpp @@ -18,6 +18,27 @@ namespace netgen { tnr = atnr; sidenr = asidenr; } }; + // check if element is quad with at least one surface point -> relevant for optimization + // (quads with 4 edge points are not optimized and can be ignored) + bool checkMixedElement(const Mesh & mesh, FlatArray seia) + { + bool mixed = false; + ParallelForRange( Range(seia), [&] (auto myrange) NETGEN_LAMBDA_INLINE + { + for (SurfaceElementIndex i : myrange) + { + const auto & sel = mesh[i]; + + if(sel.GetNP() == 3) + continue; + + for(auto i : Range(sel.GetNP())) + if(mesh[sel[i]].Type() == SURFACEPOINT) + mixed = true; + } + }); + return mixed; + } bool MeshOptimize2d :: EdgeSwapping (const int usemetric, Array &neighbors, @@ -181,35 +202,14 @@ namespace netgen timerstart.Start(); Array seia; - bool mixed = false; + mesh.GetSurfaceElementsOfFace (faceindex, seia); - if(faceindex==0) - { - seia.SetSize(mesh.GetNSE()); - ParallelFor( Range(seia), [&] (auto i) NETGEN_LAMBDA_INLINE - { - SurfaceElementIndex sei(i); - seia[i] = sei; - if (mesh[sei].GetNP() != 3) - { - const auto & sel = mesh[sei]; - for(auto i : Range(sel.GetNP())) - if(mesh[sel[i]].Type() == INNERPOINT) - mixed = true; - } - }); - } - else - { - mesh.GetSurfaceElementsOfFace (faceindex, seia); - for (SurfaceElementIndex sei : seia) - if (mesh[sei].GetNP() != 3) - mixed = true; - } - - if(mixed) + if(checkMixedElement(mesh, seia)) + { + timerstart.Stop(); return GenericImprove(); - + } + Array neighbors(mesh.GetNSE()); auto elements_on_node = mesh.CreatePoint2SurfaceElementTable(faceindex); @@ -595,25 +595,14 @@ namespace netgen Array seia; + mesh.GetSurfaceElementsOfFace (faceindex, seia); - if(faceindex) - mesh.GetSurfaceElementsOfFace (faceindex, seia); - else - { - seia.SetSize(mesh.GetNSE()); - ParallelFor( IntRange(mesh.GetNSE()), [&seia] (auto i) NETGEN_LAMBDA_INLINE - { seia[i] = i; }); - } - - bool mixed = false; - ParallelFor( Range(seia), [&] (auto i) NETGEN_LAMBDA_INLINE - { - if (mesh[seia[i]].GetNP() != 3) - mixed = true; - }); - - if(mixed) + if(checkMixedElement(mesh, seia)) + { + timerstart1.Stop(); + timerstart.Stop(); return; + } int np = mesh.GetNP(); @@ -625,18 +614,8 @@ namespace netgen BuildEdgeList( mesh, elementsonnode, edges ); Array fixed(np); - ParallelFor( fixed.Range(), [&fixed] (auto i) NETGEN_LAMBDA_INLINE - { fixed[i] = false; }); - - ParallelFor( edges.Range(), [&] (auto i) NETGEN_LAMBDA_INLINE - { - auto [pi0, pi1] = edges[i]; - if (mesh.IsSegment (pi0, pi1)) - { - fixed[pi0] = true; - fixed[pi1] = true; - } - }); + ParallelFor( fixed.Range(), [&] (auto i) NETGEN_LAMBDA_INLINE + { fixed[i] = mesh[i].Type() != SURFACEPOINT; }); timerstart1.Stop(); diff --git a/libsrc/meshing/meshclass.cpp b/libsrc/meshing/meshclass.cpp index b381f760..c3f85386 100644 --- a/libsrc/meshing/meshclass.cpp +++ b/libsrc/meshing/meshclass.cpp @@ -6412,25 +6412,17 @@ namespace netgen static int timer = NgProfiler::CreateTimer ("GetSurfaceElementsOfFace"); NgProfiler::RegionTimer reg (timer); - /* - sei.SetSize (0); - for (SurfaceElementIndex i = 0; i < GetNSE(); i++) - { - if ( (*this)[i].GetIndex () == facenr && (*this)[i][0] >= PointIndex::BASE && - !(*this)[i].IsDeleted() ) - { - sei.Append (i); - } - } - */ + if(facenr==0) + { + sei.SetSize(GetNSE()); + ParallelForRange( IntRange(GetNSE()), [&sei] (auto myrange) + { + for(auto i : myrange) + sei[i] = i; + }); + return; + } - /* Philippose - 01/10/2009 - Commented out the following lines, and activated the originally - commented out lines above because of a bug which causes corruption - of the variable "facedecoding" when a mesh is converted to second order - */ - - // int size1 = sei.Size(); sei.SetSize(0); SurfaceElementIndex si = facedecoding[facenr-1].firstelement; @@ -6444,16 +6436,6 @@ namespace netgen si = (*this)[si].next; } - - /* - // *testout << "with list = " << endl << sei << endl; - - if (size1 != sei.Size()) - { - cout << "size mismatch" << endl; - exit(1); - } - */ }