Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package netgen for openSUSE:Factory checked 
in at 2022-10-25 11:20:17
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/netgen (Old)
 and      /work/SRC/openSUSE:Factory/.netgen.new.2275 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "netgen"

Tue Oct 25 11:20:17 2022 rev:9 rq:1030983 version:6.2.2204

Changes:
--------
--- /work/SRC/openSUSE:Factory/netgen/netgen.changes    2022-09-13 
15:11:06.448932875 +0200
+++ /work/SRC/openSUSE:Factory/.netgen.new.2275/netgen.changes  2022-10-25 
11:20:42.254229313 +0200
@@ -1,0 +2,15 @@
+Thu Oct 20 20:07:36 UTC 2022 - Stefan Br??ns <stefan.bru...@rwth-aachen.de>
+
+- Use Catch2 < 3.0. Unfortunately Catch2 3.x is API
+  incompatible with Catch2 2.x.
+- Add 0001-fix-building-with-new-ffmpeg.patch
+
+-------------------------------------------------------------------
+Tue Sep 13 21:47:18 UTC 2022 - Stefan Br??ns <stefan.bru...@rwth-aachen.de>
+
+- update to version 6.2.2204
+  * no changelog provided
+- Split nggui library package, to avoid pulling in otherwise
+  unneeded dependencies.
+
+-------------------------------------------------------------------

Old:
----
  netgen-6.2.2203.tar.gz

New:
----
  0001-fix-building-with-new-ffmpeg.patch
  netgen-6.2.2204.tar.gz

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ netgen.spec ++++++
--- /var/tmp/diff_new_pack.SsKkSm/_old  2022-10-25 11:20:42.866230670 +0200
+++ /var/tmp/diff_new_pack.SsKkSm/_new  2022-10-25 11:20:42.870230679 +0200
@@ -23,7 +23,7 @@
 %bcond_with pytest
 
 Name:           netgen
-Version:        6.2.2203
+Version:        6.2.2204
 Release:        0
 Summary:        Automatic 3D tetrahedral mesh generator
 License:        LGPL-2.1-only
@@ -48,8 +48,11 @@
 Patch10:        0001-Fix-netgen-executable-and-library-RUNPATHs.patch
 # PATCH-FIX-OPENSUSE
 Patch11:        0001-Ignore-invalid-unknown-types-in-pybind11-docstrings.patch
+# PATCH-FIX-UPSTREAM
+Patch12:        0001-fix-building-with-new-ffmpeg.patch
 %if %{with opencascade}
 BuildRequires:  occt-devel
+BuildRequires:  (pkgconfig(catch2) >= 2.13.4 with pkgconfig(catch2) < 3)
 BuildRequires:  pkgconfig(fontconfig)
 BuildRequires:  pkgconfig(xi)
 %endif
@@ -66,7 +69,6 @@
 BuildRequires:  python3-pytest
 BuildRequires:  python3-pytest-check
 %endif
-BuildRequires:  pkgconfig(catch2)
 BuildRequires:  pkgconfig(gl)
 BuildRequires:  pkgconfig(glu)
 BuildRequires:  pkgconfig(icu-uc)
@@ -81,12 +83,10 @@
 BuildRequires:  openmpi-devel
 %endif
 %if %{with ffmpeg}
-# Limit to ffmpeg-4 and older, see upstream issue
-# https://github.com/NGSolve/netgen/issues/112
-BuildRequires:  pkgconfig(libavcodec) <= 58.134.100
-BuildRequires:  pkgconfig(libavformat) <= 58.76.100
-BuildRequires:  pkgconfig(libavutil) <= 56.70.100
-BuildRequires:  pkgconfig(libswscale) <= 5.9.100
+BuildRequires:  pkgconfig(libavcodec)
+BuildRequires:  pkgconfig(libavformat)
+BuildRequires:  pkgconfig(libavutil)
+BuildRequires:  pkgconfig(libswscale)
 %endif
 BuildRequires:  xz
 # x86 (32bit) is no longer supported upstream. Also exclude other 32 bit archs
@@ -110,6 +110,15 @@
 %description -n netgen-libs
 NETGEN mesh generator shared libraries.
 
+%package -n netgen-gui-libs
+Summary:        NETGEN mesher library - GUI part
+Group:          System/Libraries
+Conflicts:      netgen-libs < 6.2.2204
+Provides:       %{name}:%{_libdir}/netgen/libnggui.so
+
+%description -n netgen-gui-libs
+GUI support for NETGEN mesh generator shared libraries.
+
 %package devel
 Summary:        Development files for netgen
 # Should not depend on the netgen binary, but the cmake config is broken
@@ -213,7 +222,11 @@
 
 %files -n netgen-libs
 %dir %{_libdir}/netgen
-%{_libdir}/netgen/*.so
+%{_libdir}/netgen/libngcore.so
+%{_libdir}/netgen/libnglib.so
+
+%files -n netgen-gui-libs
+%{_libdir}/netgen/libnggui.so
 
 %files -n python3-%{name}
 %{python3_sitearch}/netgen

++++++ 0001-fix-building-with-new-ffmpeg.patch ++++++
>From 1cf85fa3e79524cea3bcf7743a95584ae95a3bda Mon Sep 17 00:00:00 2001
From: Christopher Lackner <clack...@cerbsim.com>
Date: Wed, 14 Sep 2022 10:14:08 +0200
Subject: [PATCH] fix building with new ffmpeg

---
 ng/encoding.hpp | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/ng/encoding.hpp b/ng/encoding.hpp
index 66261989..9ea2ffb5 100644
--- a/ng/encoding.hpp
+++ b/ng/encoding.hpp
@@ -5,6 +5,7 @@
 
 extern "C" {
 #include <libavutil/avassert.h>
+#include <libavcodec/avcodec.h>
 #include <libavutil/channel_layout.h>
 #include <libavutil/opt.h>
 #include <libavutil/mathematics.h>
@@ -137,11 +138,11 @@ class Mpeg {
 //         oc->preload= (int)(0.5*AV_TIME_BASE);
         oc->max_delay= (int)(0.7*AV_TIME_BASE);
 
-        fmt = oc->oformat;
+        fmt = (AVOutputFormat*) oc->oformat;
 
         if (fmt->video_codec != AV_CODEC_ID_NONE) {
             /* find the encoder */
-            video_codec = avcodec_find_encoder(fmt->video_codec);
+            video_codec = (AVCodec*) avcodec_find_encoder(fmt->video_codec);
             if (!(video_codec)) {
                 cerr << "Could not find encoder for '" << 
avcodec_get_name(fmt->video_codec) << "'" << endl;
                 return 1;
-- 
2.37.3


++++++ netgen-6.2.2203.tar.gz -> netgen-6.2.2204.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/netgen-6.2.2203/CMakeLists.txt 
new/netgen-6.2.2204/CMakeLists.txt
--- old/netgen-6.2.2203/CMakeLists.txt  2022-05-07 20:40:40.000000000 +0200
+++ new/netgen-6.2.2204/CMakeLists.txt  2022-08-10 09:03:10.000000000 +0200
@@ -248,7 +248,7 @@
 if(USE_GUI)
     target_include_directories(nggui PRIVATE ${ZLIB_INCLUDE_DIRS})
 endif(USE_GUI)
-target_link_libraries(nglib PUBLIC ${ZLIB_LIBRARIES})
+target_link_libraries(nglib PRIVATE ${ZLIB_LIBRARIES})
 
 #######################################################################
 if(WIN32)
@@ -407,9 +407,9 @@
       endif()
     endif()
     message(STATUS "OCC DIRS ${OpenCASCADE_INCLUDE_DIR}")
-    if(WIN32)
+    if(WIN32 AND USE_GUI)
       target_link_libraries(nggui PRIVATE ${OCC_LIBRARIES})
-    endif(WIN32)
+    endif(WIN32 AND USE_GUI)
 endif (USE_OCC)
 
 #######################################################################
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/netgen-6.2.2203/libsrc/core/python_ngcore_export.cpp 
new/netgen-6.2.2204/libsrc/core/python_ngcore_export.cpp
--- old/netgen-6.2.2203/libsrc/core/python_ngcore_export.cpp    2022-05-07 
20:40:40.000000000 +0200
+++ new/netgen-6.2.2204/libsrc/core/python_ngcore_export.cpp    2022-08-10 
09:03:10.000000000 +0200
@@ -240,7 +240,10 @@
   class ParallelContextManager {
       int num_threads;
     public:
-      ParallelContextManager() : num_threads(0) {};
+      ParallelContextManager() : num_threads(0) {
+        TaskManager::SetPajeTrace(0);
+        PajeTrace::SetMaxTracefileSize(0);
+      };
       ParallelContextManager(size_t pajesize) : num_threads(0) {
         TaskManager::SetPajeTrace(pajesize > 0);
         PajeTrace::SetMaxTracefileSize(pajesize);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/netgen-6.2.2203/libsrc/csg/csgeom.cpp 
new/netgen-6.2.2204/libsrc/csg/csgeom.cpp
--- old/netgen-6.2.2203/libsrc/csg/csgeom.cpp   2022-05-07 20:40:40.000000000 
+0200
+++ new/netgen-6.2.2204/libsrc/csg/csgeom.cpp   2022-08-10 09:03:10.000000000 
+0200
@@ -417,7 +417,7 @@
       & identpoints & boundingbox & isidenticto & ideps
       & filename & spline_surfaces & splinecurves2d & splinecurves3d & 
surf2prim;
     if(archive.Input())
-      FindIdenticSurfaces(1e-6);
+      FindIdenticSurfaces(1e-8 * MaxSize());
   }
 
   void CSGeometry :: SaveSurfaces (ostream & out) const
@@ -949,6 +949,7 @@
   {
     int inv;
     int nsurf = GetNSurf();
+    identicsurfaces.DeleteData();
 
 
     isidenticto.SetSize(nsurf);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/netgen-6.2.2203/libsrc/csg/python_csg.cpp 
new/netgen-6.2.2204/libsrc/csg/python_csg.cpp
--- old/netgen-6.2.2203/libsrc/csg/python_csg.cpp       2022-05-07 
20:40:40.000000000 +0200
+++ new/netgen-6.2.2204/libsrc/csg/python_csg.cpp       2022-08-10 
09:03:10.000000000 +0200
@@ -676,7 +676,7 @@
     .def("Draw", FunctionPointer
          ([] (shared_ptr<CSGeometry> self)
           {
-             self->FindIdenticSurfaces(1e-6);
+             self->FindIdenticSurfaces(1e-8 * self->MaxSize());
              self->CalcTriangleApproximation(0.01, 20);
              ng_geometry = self;
           })
@@ -706,8 +706,8 @@
                auto surf = csg_geo->GetSurface(i);
                surfnames.push_back(surf->GetBCName());
              }
-           csg_geo->FindIdenticSurfaces(1e-6);
-           csg_geo->CalcTriangleApproximation(0.01,100);
+           csg_geo->FindIdenticSurfaces(1e-8 * csg_geo->MaxSize());
+           csg_geo->CalcTriangleApproximation(0.01,20);
            auto nto = csg_geo->GetNTopLevelObjects();
            size_t np = 0;
            size_t ntrig = 0;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/netgen-6.2.2203/libsrc/gprim/spline.hpp 
new/netgen-6.2.2204/libsrc/gprim/spline.hpp
--- old/netgen-6.2.2203/libsrc/gprim/spline.hpp 2022-05-07 20:40:40.000000000 
+0200
+++ new/netgen-6.2.2204/libsrc/gprim/spline.hpp 2022-08-10 09:03:10.000000000 
+0200
@@ -188,12 +188,12 @@
     mutable double proj_latest_t;
   public:
     ///
-    SplineSeg3 (const GeomPoint<D> & ap1, 
+    DLL_HEADER SplineSeg3 (const GeomPoint<D> & ap1,
                const GeomPoint<D> & ap2, 
                const GeomPoint<D> & ap3,
                 string bcname="default",
                 double maxh=1e99);
-    SplineSeg3 (const GeomPoint<D> & ap1,
+    DLL_HEADER SplineSeg3 (const GeomPoint<D> & ap1,
                const GeomPoint<D> & ap2,
                const GeomPoint<D> & ap3,
                 double aweight,
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/netgen-6.2.2203/libsrc/meshing/basegeom.cpp 
new/netgen-6.2.2204/libsrc/meshing/basegeom.cpp
--- old/netgen-6.2.2203/libsrc/meshing/basegeom.cpp     2022-05-07 
20:40:40.000000000 +0200
+++ new/netgen-6.2.2204/libsrc/meshing/basegeom.cpp     2022-08-10 
09:03:10.000000000 +0200
@@ -785,6 +785,8 @@
     {
         auto & face = *faces[k];
         FaceDescriptor fd(k+1, face.domin+1, face.domout+1, k+1);
+        if(face.properties.col)
+          fd.SetSurfColour(*face.properties.col);
         mesh.AddFaceDescriptor(fd);
         mesh.SetBCName(k, face.properties.GetName());
         if(face.primary == &face)
@@ -974,6 +976,12 @@
           }
 
     xbool do_invert = maybe;
+    if(dst.identifications[0].type == Identifications::PERIODIC)
+      {
+        auto other = static_cast<GeometryFace*>(dst.primary);
+        if(dst.domin != other->domout && dst.domout != other->domin)
+          do_invert = true;
+      }
 
     // now insert mapped surface elements
     for(auto sei : mesh.SurfaceElements().Range())
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/netgen-6.2.2203/libsrc/meshing/boundarylayer.cpp 
new/netgen-6.2.2204/libsrc/meshing/boundarylayer.cpp
--- old/netgen-6.2.2203/libsrc/meshing/boundarylayer.cpp        2022-05-07 
20:40:40.000000000 +0200
+++ new/netgen-6.2.2204/libsrc/meshing/boundarylayer.cpp        2022-08-10 
09:03:10.000000000 +0200
@@ -194,7 +194,8 @@
 
   ArrayMem<Point<3>, 4> BoundaryLayerTool :: GetMappedFace( 
SurfaceElementIndex sei, int face )
   {
-      if(face == -1) return GetMappedFace(sei);
+      if(face == -1) return GetFace(sei);
+      if(face == -2) return GetMappedFace(sei);
       const auto & sel = mesh[sei];
       auto np = sel.GetNP();
       auto pi0 = sel[face % np];
@@ -210,23 +211,25 @@
   Vec<3> BoundaryLayerTool :: getEdgeTangent(PointIndex pi, int edgenr)
   {
       Vec<3> tangent = 0.0;
+      ArrayMem<PointIndex,2> pts;
       for(auto segi : topo.GetVertexSegments(pi))
       {
           auto & seg = mesh[segi];
-          if(seg.edgenr != edgenr)
+          if(seg.edgenr != edgenr+1)
               continue;
           PointIndex other = seg[0]+seg[1]-pi;
-          tangent += mesh[other] - mesh[pi];
+          if(!pts.Contains(other))
+            pts.Append(other);
       }
+      if(pts.Size() != 2)
+        throw Exception("Something went wrong in getEdgeTangent!");
+      tangent = mesh[pts[1]] - mesh[pts[0]];
       return tangent.Normalize();
   }
 
   void BoundaryLayerTool :: LimitGrowthVectorLengths()
   {
     static Timer tall("BoundaryLayerTool::LimitGrowthVectorLengths"); 
RegionTimer rtall(tall);
-    height = 0.0;
-    for (auto h : params.heights)
-       height += h;
 
     limits.SetSize(np);
     limits = 1.0;
@@ -320,7 +323,7 @@
                 const auto & sel = mesh[sei];
                 if(sel.PNums().Contains(pi))
                     return false;
-                auto face = GetFace(sei);
+                auto face = GetMappedFace(sei, -2);
                 double lam_ = 999;
                 bool is_bl_sel = params.surfid.Contains(sel.GetIndex());
 
@@ -464,6 +467,8 @@
     auto np = mesh.GetNP();
     BitArray is_point_on_bl_surface(np+1);
     is_point_on_bl_surface.Clear();
+    BitArray is_point_on_other_surface(np+1);
+    is_point_on_other_surface.Clear();
     Array<Vec<3>, PointIndex> normals(np);
     for(auto pi : Range(growthvectors))
         normals[pi] = growthvectors[pi];
@@ -474,20 +479,33 @@
           {
             auto facei = mesh[sei].GetIndex();
             if(facei < nfd_old && !params.surfid.Contains(facei))
-                continue;
-            for(auto pi : mesh[sei].PNums())
-                if(mesh[pi].Type() == SURFACEPOINT)
+              {
+                for(auto pi : mesh[sei].PNums())
+                  if(mesh[pi].Type() == SURFACEPOINT)
+                    is_point_on_other_surface.SetBitAtomic(pi);
+              }
+            else
+              {
+                for(auto pi : mesh[sei].PNums())
+                  if(mesh[pi].Type() == SURFACEPOINT)
                     is_point_on_bl_surface.SetBitAtomic(pi);
+              }
           }
       });
 
     Array<PointIndex> points;
     for(PointIndex pi : mesh.Points().Range())
+      {
         if(is_point_on_bl_surface[pi])
         {
             points.Append(pi);
             growthvectors[pi] = 0.0;
         }
+        if(is_point_on_other_surface[pi])
+          {
+            points.Append(pi);
+          }
+      }
 
     // smooth tangential part of growth vectors from edges to surface elements
     RegionTimer rtsmooth(tsmooth);
@@ -511,7 +529,10 @@
                         auto gw_other = growthvectors[pi1];
                         auto normal_other = getNormal(mesh[sei]);
                         auto tangent_part = gw_other - 
(gw_other*normal_other)*normal_other;
-                        new_gw += tangent_part;
+                        if(is_point_on_bl_surface[pi])
+                          new_gw += tangent_part;
+                        else
+                          new_gw += gw_other;
                     }
             }
 
@@ -533,6 +554,10 @@
     //for(auto & seg : mesh.LineSegments())
         //seg.edgenr = seg.epgeominfo[1].edgenr;
 
+    height = 0.0;
+    for (auto h : params.heights)
+      height += h;
+
     max_edge_nr = -1;
     for(const auto& seg : mesh.LineSegments())
       if(seg.edgenr > max_edge_nr)
@@ -777,7 +802,7 @@
     // interpolate tangential component of growth vector along edge
     for(auto edgenr : Range(max_edge_nr))
       {
-        if(!is_edge_moved[edgenr+1]) continue;
+        // if(!is_edge_moved[edgenr+1]) continue;
 
         // build sorted list of edge
         Array<PointIndex> points;
@@ -785,6 +810,9 @@
         double edge_len = 0.;
         auto is_end_point = [&] (PointIndex pi)
         {
+          // if(mesh[pi].Type() == FIXEDPOINT)
+          //   return true;
+          // return false;
             auto segs = topo.GetVertexSegments(pi);
             auto first_edgenr = mesh[segs[0]].edgenr;
             for(auto segi : segs)
@@ -792,17 +820,31 @@
                     return true;
             return false;
         };
+
+        bool any_grows = false;
+        
         for(const auto& seg : segments)
           {
-            if(seg.edgenr-1 == edgenr && is_end_point(seg[0]))
+            if(seg.edgenr-1 == edgenr)
               {
-                points.Append(seg[0]);
-                points.Append(seg[1]);
-                edge_len += (mesh[seg[1]] - mesh[seg[0]]).Length();
-                break;
+                if(growthvectors[seg[0]].Length2() != 0 ||
+                   growthvectors[seg[1]].Length2() != 0)
+                  any_grows = true;
+                if(points.Size() == 0 && is_end_point(seg[0]))
+                  {
+                    points.Append(seg[0]);
+                    points.Append(seg[1]);
+                    edge_len += (mesh[seg[1]] - mesh[seg[0]]).Length();
+                  }
               }
           }
 
+        if(!any_grows)
+          continue;
+
+        if(!points.Size())
+          throw Exception("Could not find startpoint for edge " + 
ToString(edgenr));
+
         while(true)
           {
             bool point_found = false;
@@ -831,17 +873,28 @@
               break;
             if(!point_found)
               {
-                cout << "points = " << points << endl;
                 throw Exception(string("Could not find connected list of line 
segments for edge ") + edgenr);
               }
           }
 
+        if(growthvectors[points[0]].Length2() == 0 &&
+           growthvectors[points.Last()].Length2() == 0)
+          continue;
+
         // tangential part of growth vectors
         auto t1 = (mesh[points[1]]-mesh[points[0]]).Normalize();
         auto gt1 = growthvectors[points[0]] * t1 * t1;
         auto t2 = 
(mesh[points.Last()]-mesh[points[points.Size()-2]]).Normalize();
         auto gt2 = growthvectors[points.Last()] * t2 * t2;
 
+        if(!is_edge_moved[edgenr+1])
+          {
+            if(growthvectors[points[0]] * (mesh[points[1]] - mesh[points[0]]) 
< 0)
+              gt1 = 0.;
+            if(growthvectors[points.Last()] * (mesh[points[points.Size()-2]] - 
mesh[points.Last()]) < 0)
+              gt2 = 0.;
+          }
+
         double len = 0.;
         for(size_t i = 1; i < points.Size()-1; i++)
           {
@@ -1262,7 +1315,9 @@
 
       auto in_surface_direction = ProjectGrowthVectorsOnSurface();
       InterpolateGrowthVectors();
-      LimitGrowthVectorLengths();
+
+      if(params.limit_growth_vectors)
+        LimitGrowthVectorLengths();
       FixVolumeElements();
       InsertNewElements(segmap, in_surface_direction);
       SetDomInOut();
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/netgen-6.2.2203/libsrc/meshing/boundarylayer.hpp 
new/netgen-6.2.2204/libsrc/meshing/boundarylayer.hpp
--- old/netgen-6.2.2203/libsrc/meshing/boundarylayer.hpp        2022-05-07 
20:40:40.000000000 +0200
+++ new/netgen-6.2.2204/libsrc/meshing/boundarylayer.hpp        2022-08-10 
09:03:10.000000000 +0200
@@ -18,6 +18,7 @@
   BitArray domains;
   bool outside = false; // set the boundary layer on the outside
   bool grow_edges = false;
+  bool limit_growth_vectors = true;
   Array<size_t> project_boundaries;
 };
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/netgen-6.2.2203/libsrc/meshing/meshclass.cpp 
new/netgen-6.2.2204/libsrc/meshing/meshclass.cpp
--- old/netgen-6.2.2203/libsrc/meshing/meshclass.cpp    2022-05-07 
20:40:40.000000000 +0200
+++ new/netgen-6.2.2204/libsrc/meshing/meshclass.cpp    2022-08-10 
09:03:10.000000000 +0200
@@ -1660,10 +1660,6 @@
        clusters -> Update();
       }
 
-    auto geo = geometryregister.LoadFromMeshFile (infile);
-    if(geo)
-       geometry = geo;
-
     SetNextMajorTimeStamp();
     //  PrintMemInfo (cout);
   }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/netgen-6.2.2203/libsrc/meshing/meshclass.hpp 
new/netgen-6.2.2204/libsrc/meshing/meshclass.hpp
--- old/netgen-6.2.2203/libsrc/meshing/meshclass.hpp    2022-05-07 
20:40:40.000000000 +0200
+++ new/netgen-6.2.2204/libsrc/meshing/meshclass.hpp    2022-08-10 
09:03:10.000000000 +0200
@@ -384,7 +384,7 @@
     DLL_HEADER int GetNDomains() const;
     ///
     int GetDimension() const { return dimension; }
-    void SetDimension (int dim); //  { dimension = dim; }
+    DLL_HEADER void SetDimension (int dim); //  { dimension = dim; }
 
     /// sets internal tables
     DLL_HEADER void CalcSurfacesOfNode ();
@@ -478,7 +478,7 @@
         return lochfunc[0];
       return lochfunc[layer-1];
     }
-    void SetLocalH(shared_ptr<LocalH> loch, int layer=1);
+    DLL_HEADER void SetLocalH(shared_ptr<LocalH> loch, int layer=1);
 
     ///
     bool LocalHFunctionGenerated(int layer=1) const { return 
(lochfunc[layer-1] != NULL); }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/netgen-6.2.2203/libsrc/meshing/meshfunc.cpp 
new/netgen-6.2.2204/libsrc/meshing/meshfunc.cpp
--- old/netgen-6.2.2203/libsrc/meshing/meshfunc.cpp     2022-05-07 
20:40:40.000000000 +0200
+++ new/netgen-6.2.2204/libsrc/meshing/meshfunc.cpp     2022-08-10 
09:03:10.000000000 +0200
@@ -201,6 +201,7 @@
           return;
 
       NgArray<int, PointIndex::BASE> map;
+      std::set<std::tuple<int,int,int>> hex_faces;
       for(auto identnr : Range(1,nmax+1))
       {
           if(identifications.GetType(identnr) != 
Identifications::CLOSESURFACES)
@@ -211,6 +212,15 @@
 
           for(auto & sel : mesh.OpenElements())
           {
+              // For quads: check if this open element is already closed by a 
hex
+              // this happends when we have identifications in two directions
+              if(sel.GetNP() == 4)
+              {
+                  Element2d face = sel;
+                  face.NormalizeNumbering();
+                  if(hex_faces.count({face[0], face[1], face[2]}))
+                      continue;
+              }
               bool is_mapped = true;
               for(auto pi : sel.PNums())
                   if(!PointIndex(map[pi]).IsValid())
@@ -235,21 +245,26 @@
               if(pis.size() < 2*np)
                   continue;
 
-              bool is_domout = md.domain == 
mesh.GetFaceDescriptor(sel.GetIndex()).DomainOut();
-
               // check if new element is inside current domain
               auto p0 = mesh[sel[0]];
-              Vec<3> n = Cross(mesh[sel[1]] - p0, mesh[sel[2]] - p0 );
-              n = is_domout ? n : -n;
+              Vec<3> n = -Cross(mesh[sel[1]] - p0, mesh[sel[2]] - p0 );
 
               if(n*(mesh[el[np]]-p0) < 0.0)
                   continue;
 
-              if(is_domout)
-                  el.Invert();
-
               el.SetIndex(md.domain);
               mesh.AddVolumeElement(el);
+              if(el.NP()==8)
+              {
+                  // remember all adjacent faces of the new hex (to skip 
corresponding openelements accordingly)
+                  for(auto facei : Range(1,7))
+                  {
+                      Element2d face;
+                      el.GetFace(facei, face);
+                      face.NormalizeNumbering();
+                      hex_faces.insert({face[0], face[1], face[2]});
+                  }
+              }
           }
       }
   }
@@ -571,17 +586,25 @@
 
      auto md = DivideMesh(mesh3d, mp);
 
+     try
+       {
      ParallelFor( md.Range(), [&](int i)
        {
          if (mp.checkoverlappingboundary)
            if (md[i].mesh->CheckOverlappingBoundary())
              throw NgException ("Stop meshing since boundary mesh is 
overlapping");
-         
+
          if(md[i].mesh->GetGeometry()->GetGeomType() == Mesh::GEOM_OCC)
-           FillCloseSurface( md[i] );
+            FillCloseSurface( md[i] );
          CloseOpenQuads( md[i] );
          MeshDomain(md[i]);
        }, md.Size());
+       }
+     catch(...)
+       {
+         MergeMeshes(mesh3d, md);
+         return MESHING3_GIVEUP;
+       }
 
      MergeMeshes(mesh3d, md);
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/netgen-6.2.2203/libsrc/meshing/meshtype.hpp 
new/netgen-6.2.2204/libsrc/meshing/meshtype.hpp
--- old/netgen-6.2.2203/libsrc/meshing/meshtype.hpp     2022-05-07 
20:40:40.000000000 +0200
+++ new/netgen-6.2.2204/libsrc/meshing/meshtype.hpp     2022-08-10 
09:03:10.000000000 +0200
@@ -1172,7 +1172,7 @@
     void SetDomainIn (int di) { domin = di; }
     void SetDomainOut (int dom) { domout = dom; }
     void SetBCProperty (int bc) { bcprop = bc; }
-    void SetBCName (string * bcn); //  { bcname = bcn; }
+    DLL_HEADER void SetBCName (string * bcn); //  { bcname = bcn; }
     void SetBCName (const string & bcn) { bcname = bcn; }    
     // Philippose - 06/07/2009
     // Set the surface colour
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/netgen-6.2.2203/libsrc/meshing/netrule3.cpp 
new/netgen-6.2.2204/libsrc/meshing/netrule3.cpp
--- old/netgen-6.2.2203/libsrc/meshing/netrule3.cpp     2022-05-07 
20:40:40.000000000 +0200
+++ new/netgen-6.2.2204/libsrc/meshing/netrule3.cpp     2022-08-10 
09:03:10.000000000 +0200
@@ -77,6 +77,7 @@
   fzbox.SetPoint (transfreezone.Elem(1));
   for (i = 2; i <= freezone.Size(); i++)
     fzbox.AddPoint (transfreezone.Elem(i));
+  fzbox.IncreaseRel(1e-8);
   
   
   // MARK(setfz3);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/netgen-6.2.2203/libsrc/meshing/python_mesh.cpp 
new/netgen-6.2.2204/libsrc/meshing/python_mesh.cpp
--- old/netgen-6.2.2203/libsrc/meshing/python_mesh.cpp  2022-05-07 
20:40:40.000000000 +0200
+++ new/netgen-6.2.2204/libsrc/meshing/python_mesh.cpp  2022-08-10 
09:03:10.000000000 +0200
@@ -1196,14 +1196,16 @@
                               string material,
                               variant<string, int> domain, bool outside,
                               optional<string> project_boundaries,
-                              bool grow_edges)
+                              bool grow_edges, bool limit_growth_vectors)
            {
              BoundaryLayerParameters blp;
+             BitArray boundaries(self.GetNFD()+1);
+             boundaries.Clear();
              if(int* bc = get_if<int>(&boundary); bc)
                {
                  for (int i = 1; i <= self.GetNFD(); i++)
                    if(self.GetFaceDescriptor(i).BCProperty() == *bc)
-                     blp.surfid.Append (i);
+                     boundaries.SetBit(i);
                }
              else
                {
@@ -1213,19 +1215,29 @@
                      auto& fd = self.GetFaceDescriptor(i);
                      if(regex_match(fd.GetBCName(), pattern))
                        {
+                         boundaries.SetBit(i);
                          auto dom_pattern = get_if<string>(&domain);
                          // only add if adjacent to domain
                          if(dom_pattern)
                            {
                              regex pattern(*dom_pattern);
-                             if((fd.DomainIn() > 0 && 
regex_match(self.GetMaterial(fd.DomainIn()), pattern)) || (fd.DomainOut() > 0 
&& regex_match(self.GetMaterial(fd.DomainOut()), pattern)))
-                               blp.surfid.Append(i);
+                             bool mat1_match = fd.DomainIn() > 0 && 
regex_match(self.GetMaterial(fd.DomainIn()), pattern);
+                             bool mat2_match = fd.DomainOut() > 0 && 
regex_match(self.GetMaterial(fd.DomainOut()), pattern);
+                             // if boundary is inner or outer remove from list
+                             if(mat1_match == mat2_match)
+                               boundaries.Clear(i);
+                             // if((fd.DomainIn() > 0 && 
regex_match(self.GetMaterial(fd.DomainIn()), pattern)) || (fd.DomainOut() > 0 
&& regex_match(self.GetMaterial(fd.DomainOut()), pattern)))
+                             // boundaries.Clear(i);
+                             // blp.surfid.Append(i);
                            }
-                         else
-                           blp.surfid.Append(i);
+                         // else
+                         //   blp.surfid.Append(i);
                        }
                      }
                }
+             for(int i = 1; i<=self.GetNFD(); i++)
+               if(boundaries.Test(i))
+                 blp.surfid.Append(i);
              blp.new_mat = material;
 
              if(project_boundaries.has_value())
@@ -1265,12 +1277,13 @@
 
              blp.outside = outside;
              blp.grow_edges = grow_edges;
+             blp.limit_growth_vectors = limit_growth_vectors;
 
              GenerateBoundaryLayer (self, blp);
              self.UpdateTopology();
            }, py::arg("boundary"), py::arg("thickness"), py::arg("material"),
           py::arg("domains") = ".*", py::arg("outside") = false,
-          py::arg("project_boundaries")=nullopt, py::arg("grow_edges")=true,
+          py::arg("project_boundaries")=nullopt, py::arg("grow_edges")=true, 
py::arg("limit_growth_vectors") = true,
           R"delimiter(
 Add boundary layer to mesh.
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/netgen-6.2.2203/libsrc/occ/occgeom.cpp 
new/netgen-6.2.2204/libsrc/occ/occgeom.cpp
--- old/netgen-6.2.2203/libsrc/occ/occgeom.cpp  2022-05-07 20:40:40.000000000 
+0200
+++ new/netgen-6.2.2204/libsrc/occ/occgeom.cpp  2022-08-10 09:03:10.000000000 
+0200
@@ -1589,7 +1589,11 @@
     if(ar.Output())
       {
         std::stringstream ss;
+#if OCC_VERSION_HEX < 0x070600
         BRepTools::Write(shape, ss);
+#else
+        BRepTools::Write(shape, ss, false, false, 
TopTools_FormatVersion_VERSION_1);
+#endif
         ar << ss.str();
       }
     else
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/netgen-6.2.2203/libsrc/occ/python_occ.cpp 
new/netgen-6.2.2204/libsrc/occ/python_occ.cpp
--- old/netgen-6.2.2203/libsrc/occ/python_occ.cpp       2022-05-07 
20:40:40.000000000 +0200
+++ new/netgen-6.2.2204/libsrc/occ/python_occ.cpp       2022-08-10 
09:03:10.000000000 +0200
@@ -26,6 +26,7 @@
 namespace netgen
 {
   extern std::shared_ptr<NetgenGeometry> ng_geometry;
+  extern std::shared_ptr<Mesh> mesh;
 }
 
 static string occparameter_description = R"delimiter(
@@ -272,7 +273,10 @@
                                SetGlobalMesh(mesh);
                                auto result = geo->GenerateMesh(mesh, mp);
                                if(result != 0)
-                                 throw Exception("Meshing failed!");
+                                 {
+                                   netgen::mesh = mesh;   // keep mesh for 
debugging
+                                   throw Exception("Meshing failed!");
+                                 }
                                ng_geometry = geo;
                                if (comm.Size() > 1)
                                  mesh->Distribute();
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/netgen-6.2.2203/libsrc/occ/python_occ_basic.cpp 
new/netgen-6.2.2204/libsrc/occ/python_occ_basic.cpp
--- old/netgen-6.2.2203/libsrc/occ/python_occ_basic.cpp 2022-05-07 
20:40:40.000000000 +0200
+++ new/netgen-6.2.2204/libsrc/occ/python_occ_basic.cpp 2022-08-10 
09:03:10.000000000 +0200
@@ -76,6 +76,8 @@
     .def_property("x", [](gp_Vec&p) { return p.X(); }, [](gp_Vec&p,double x) { 
p.SetX(x); })
     .def_property("y", [](gp_Vec&p) { return p.Y(); }, [](gp_Vec&p,double y) { 
p.SetY(y); })
     .def_property("z", [](gp_Vec&p) { return p.Z(); }, [](gp_Vec&p,double z) { 
p.SetZ(z); })
+    .def("Norm", [](const gp_Vec& v)
+    { return v.Magnitude(); })
     .def("__str__", [] (const gp_Vec & p) {
         stringstream str;
         str << "(" << p.X() << ", " << p.Y() << ", " << p.Z() << ")";
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/netgen-6.2.2203/libsrc/occ/python_occ_shapes.cpp 
new/netgen-6.2.2204/libsrc/occ/python_occ_shapes.cpp
--- old/netgen-6.2.2203/libsrc/occ/python_occ_shapes.cpp        2022-05-07 
20:40:40.000000000 +0200
+++ new/netgen-6.2.2204/libsrc/occ/python_occ_shapes.cpp        2022-08-10 
09:03:10.000000000 +0200
@@ -769,7 +769,7 @@
            trafo.SetTranslation(v);
            BRepBuilderAPI_Transform builder(shape, trafo, true);
            PropagateProperties(builder, shape, occ2ng(trafo));
-           return builder.Shape();
+           return CastShape(builder.Shape());
            // version 2: change location
            // ...
          }, py::arg("v"), "copy shape, and translate copy by vector 'v'")
@@ -1177,15 +1177,18 @@
 
            std::vector<double> p[3];
            std::vector<double> n[3];
-           py::list names, colors;
+           py::list names, colors, solid_names;
+           std::vector<std::vector<int>> solid_face_map;
 
            int index = 0;
 
            Box<3> box(Box<3>::EMPTY_BOX);
+           TopTools_IndexedMapOfShape fmap;
            for (TopExp_Explorer e(shape, TopAbs_FACE); e.More(); e.Next())
            {
                TopoDS_Face face = TopoDS::Face(e.Current());
                // Handle(TopoDS_Face) face = e.Current();
+               fmap.Add(face);
                ExtractFaceData(face, index, p, n, box);
                auto & props = 
OCCGeometry::global_shape_properties[face.TShape()];
                if(props.col)
@@ -1204,6 +1207,19 @@
                index++;
            }
 
+           for(auto& solid : GetSolids(shape))
+             {
+               std::vector<int> faces;
+               for(auto& face : GetFaces(solid))
+                 faces.push_back(fmap.FindIndex(face)-1);
+               solid_face_map.push_back(move(faces));
+               auto& props = 
OCCGeometry::global_shape_properties[solid.TShape()];
+               if(props.name)
+                 solid_names.append(*props.name);
+               else
+                 solid_names.append("");
+             }
+
            std::vector<double> edge_p[2];
            py::list edge_names, edge_colors;
            index = 0;
@@ -1263,6 +1279,7 @@
            data["autoscale"] = false;
            data["colors"] = colors;
            data["names"] = names;
+           data["solid_names"] = solid_names;
 
            py::list edges;
            edges.append(edge_p[0]);
@@ -1270,6 +1287,7 @@
            data["edges"] = edges;
            data["edge_names"] = edge_names;
            data["edge_colors"] = edge_colors;
+           data["solid_face_map"] = solid_face_map;
            return data;
          })
     ;
@@ -1544,6 +1562,7 @@
   };
   
   py::class_<ListOfShapes> (m, "ListOfShapes")
+    .def(py::init<vector<TopoDS_Shape>>())
     .def("__iter__", [](ListOfShapes &s) {
         return py::make_iterator(ListOfShapesIterator(&*s.begin()),
                                  ListOfShapesIterator(&*s.end()));
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/netgen-6.2.2203/libsrc/stlgeom/meshstlsurface.cpp 
new/netgen-6.2.2204/libsrc/stlgeom/meshstlsurface.cpp
--- old/netgen-6.2.2203/libsrc/stlgeom/meshstlsurface.cpp       2022-05-07 
20:40:40.000000000 +0200
+++ new/netgen-6.2.2204/libsrc/stlgeom/meshstlsurface.cpp       2022-08-10 
09:03:10.000000000 +0200
@@ -106,7 +106,7 @@
                   << ", trig2 = " << trig2
                   << ", trig2b = " << trig2b << endl;
 
-         if (trig1 <= 0 || trig2 <= 0 || trig1b <= 0 || trig2b <= 0)
+         if (trig1 <= 0 || trig2 < 0 || trig1b <= 0 || trig2b < 0)
            {
              cout << "negative trigs, "
                   << ", trig1 = " << trig1
@@ -177,10 +177,13 @@
          mesh.AddSegment (seg);
 
 
+          if(trig2 != 0)
+            {
          Segment seg2;
          seg2[0] = p2 + PointIndex::BASE-1;;
          seg2[1] = p1 + PointIndex::BASE-1;;
          seg2.si = geom.GetTriangle(trig2).GetFaceNum();
+
          seg2.edgenr = i;
 
          seg2.epgeominfo[0].edgenr = i;
@@ -219,8 +222,8 @@
              (*testout) << "Get GeomInfo PROBLEM" << endl;
            }
          */      
-
          mesh.AddSegment (seg2);
+            }
        }
     }
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/netgen-6.2.2203/libsrc/stlgeom/python_stl.cpp 
new/netgen-6.2.2204/libsrc/stlgeom/python_stl.cpp
--- old/netgen-6.2.2203/libsrc/stlgeom/python_stl.cpp   2022-05-07 
20:40:40.000000000 +0200
+++ new/netgen-6.2.2204/libsrc/stlgeom/python_stl.cpp   2022-08-10 
09:03:10.000000000 +0200
@@ -9,7 +9,7 @@
 using namespace netgen;
 namespace netgen
 {
-  //extern shared_ptr<Mesh> mesh;
+  extern shared_ptr<Mesh> mesh;
   extern shared_ptr<NetgenGeometry> ng_geometry;
 }
 
@@ -125,11 +125,12 @@
 {
   py::class_<STLGeometry,shared_ptr<STLGeometry>, NetgenGeometry> 
(m,"STLGeometry")
     .def(py::init<>())
-    .def(py::init<>([](const string& filename)
+    .def(py::init<>([](const string& filename, bool surface)
                     {
                       ifstream ist(filename);
-                      return shared_ptr<STLGeometry>(STLGeometry::Load(ist));
-                    }), py::arg("filename"),
+                      return shared_ptr<STLGeometry>(STLGeometry::Load(ist,
+                                                                       
surface));
+                    }), py::arg("filename"), py::arg("surface")=false,
       py::call_guard<py::gil_scoped_release>())
     .def(NGSPickle<STLGeometry>())
     .def("_visualizationData", [](shared_ptr<STLGeometry> stl_geo)
@@ -203,7 +204,10 @@
                            SetGlobalMesh(mesh);
                            auto result = STLMeshingDummy(geo.get(), mesh, mp, 
stlparam);
                            if(result != 0)
-                             throw Exception("Meshing failed!");
+                             {
+                               netgen::mesh = mesh;
+                               throw Exception("Meshing failed!");
+                             }
 
                            return mesh;
                          }, py::arg("mp") = nullptr,
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/netgen-6.2.2203/libsrc/stlgeom/stlgeom.cpp 
new/netgen-6.2.2204/libsrc/stlgeom/stlgeom.cpp
--- old/netgen-6.2.2203/libsrc/stlgeom/stlgeom.cpp      2022-05-07 
20:40:40.000000000 +0200
+++ new/netgen-6.2.2204/libsrc/stlgeom/stlgeom.cpp      2022-08-10 
09:03:10.000000000 +0200
@@ -2578,7 +2578,7 @@
   for (int i = 1; i <= GetNTE(); i++)
     {
       STLTopEdge & edge = GetTopEdge (i);
-      double cosang = 
+      double cosang = edge.TrigNum(2) == 0 ? 1. :
        GetTriangle(edge.TrigNum(1)).Normal() *
        GetTriangle(edge.TrigNum(2)).Normal();
       edge.SetCosAngle (cosang);
@@ -2611,6 +2611,8 @@
   for (int i = 1; i <= edgedata->Size(); i++)
     {
       STLTopEdge & sed = edgedata->Elem(i);
+      if(sed.TrigNum(2) == 0)
+        sed.SetStatus(ED_CONFIRMED);
       if (sed.GetStatus() == ED_CANDIDATE || 
          sed.GetStatus() == ED_UNDEFINED)
        {
@@ -3187,7 +3189,7 @@
       ng1 = trig.GeomNormal(points);
       ng1 /= (ng1.Length() + 1e-24);
 
-      for (int j = 1; j <= 3; j++)
+      for (int j = 1; j <= NONeighbourTrigs(i); j++)
        { 
          int nbt = NeighbourTrig (i, j);
 
@@ -3261,7 +3263,7 @@
          STLTrigId t = chart.GetChartTrig1(j); 
          const STLTriangle& tt = GetTriangle(t);
 
-         for (int k = 1; k <= 3; k++)
+         for (int k = 1; k <= NONeighbourTrigs(t); k++)
            {
              STLTrigId nt = NeighbourTrig(t,k); 
              if (GetChartNr(nt) != i && !TrigIsInOC(nt,i))
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/netgen-6.2.2203/libsrc/stlgeom/stlgeomchart.cpp 
new/netgen-6.2.2204/libsrc/stlgeom/stlgeomchart.cpp
--- old/netgen-6.2.2203/libsrc/stlgeom/stlgeomchart.cpp 2022-05-07 
20:40:40.000000000 +0200
+++ new/netgen-6.2.2204/libsrc/stlgeom/stlgeomchart.cpp 2022-08-10 
09:03:10.000000000 +0200
@@ -238,7 +238,7 @@
                              */
                              
                              //find overlapping charts exacter (fast, too): 
-                             for (int k = 1; k <= 3; k++) 
+                             for (int k = 1; k <= NONeighbourTrigs(nt); k++)
                                { 
                                  int nnt = NeighbourTrig(nt,k);
                                  if (GetMarker(nnt) != chartnum)
@@ -387,7 +387,7 @@
                       // NgProfiler::StartTimer (timer4a);
                       
                      if (spiralcheckon && !isdirtytrig)
-                       for (int k = 1; k <= 3; k++) 
+                       for (int k = 1; k <= NONeighbourTrigs(nt); k++)
                          {
                             // NgProfiler::StartTimer (timer4b);               
             
                            STLTrigId nnt = NeighbourTrig(nt,k);
@@ -695,7 +695,7 @@
     {
       STLTrigId t = chart.GetChartTrig1(j); 
       const STLTriangle& tt = GetTriangle(t);
-      for (int k = 1; k <= 3; k++)
+      for (int k = 1; k <= NONeighbourTrigs(t); k++)
        {
          STLTrigId nt = NeighbourTrig(t,k); 
          if (GetChartNr(nt) != chartnum)
@@ -756,7 +756,7 @@
       STLTrigId t = chart.GetChartTrig1(j); 
       const STLTriangle& tt = GetTriangle(t);
       
-      for (int k = 1; k <= 3; k++)
+      for (int k = 1; k <= NONeighbourTrigs(t); k++)
        {
          STLTrigId nt = NeighbourTrig(t,k); 
          if (GetChartNr(nt) != chartnum && outercharttrigs[nt] != chartnum)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/netgen-6.2.2203/libsrc/stlgeom/stlgeommesh.cpp 
new/netgen-6.2.2204/libsrc/stlgeom/stlgeommesh.cpp
--- old/netgen-6.2.2203/libsrc/stlgeom/stlgeommesh.cpp  2022-05-07 
20:40:40.000000000 +0200
+++ new/netgen-6.2.2204/libsrc/stlgeom/stlgeommesh.cpp  2022-08-10 
09:03:10.000000000 +0200
@@ -1169,7 +1169,7 @@
     {
       int t = chart.GetChartTrig1(j); 
       tt = GetTriangle(t);
-      for (int k = 1; k <= 3; k++)
+      for (int k = 1; k <= NONeighbourTrigs(t); k++)
        {
          int nt = NeighbourTrig(t,k); 
          if (GetChartNr(nt) != chartnum)
@@ -1495,6 +1495,9 @@
       if (multithread.terminate)
        return 0;
 
+      if(stlgeometry->IsSurfaceSTL())
+        return 0;
+
       if (mparam.perfstepsstart <= MESHCONST_MESHVOLUME && 
          mparam.perfstepsend >= MESHCONST_MESHVOLUME)
        {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/netgen-6.2.2203/libsrc/stlgeom/stltopology.cpp 
new/netgen-6.2.2204/libsrc/stlgeom/stltopology.cpp
--- old/netgen-6.2.2203/libsrc/stlgeom/stltopology.cpp  2022-05-07 
20:40:40.000000000 +0200
+++ new/netgen-6.2.2204/libsrc/stlgeom/stltopology.cpp  2022-08-10 
09:03:10.000000000 +0200
@@ -338,7 +338,7 @@
 }
 
 
-STLGeometry *  STLTopology ::Load (istream & ist)
+STLGeometry *  STLTopology ::Load (istream & ist, bool surface)
 {
   // Check if the file starts with "solid". If not, the file is binary
   {
@@ -457,6 +457,7 @@
       PrintWarning("File has normal vectors which differ extremely from 
geometry->correct with stldoctor!!!");
     }
 
+  geom->surface = surface;
   geom->InitSTLGeometry(readtrigs);
   return geom;
 }
@@ -650,6 +651,7 @@
          }
       }
 
+  if(!surface)
   for (int i = 1; i <= ne; i++)
     {
       const STLTopEdge & edge = GetTopEdge (i);
@@ -668,9 +670,12 @@
          const STLTriangle & t = GetTriangle (i);
          for (int j = 1; j <= 3; j++)
            {
-             const STLTriangle & nbt = GetTriangle (t.NBTrigNum(j));
-             if (!t.IsNeighbourFrom (nbt))
-               orientation_ok = 0;
+              if(t.NBTrigNum(j) != 0)
+                {
+                  const STLTriangle & nbt = GetTriangle (t.NBTrigNum(j));
+                  if (!t.IsNeighbourFrom (nbt))
+                    orientation_ok = 0;
+                }
            }
        }
     }
@@ -801,7 +806,8 @@
       neighbourtrigs.SetSize(GetNT());
       for (int i = 1; i <= GetNT(); i++)
        for (int k = 1; k <= 3; k++)
-         AddNeighbourTrig (i, GetTriangle(i).NBTrigNum(k));
+          if(GetTriangle(i).NBTrigNum(k) != 0)
+            AddNeighbourTrig (i, GetTriangle(i).NBTrigNum(k));
     }
   else
     {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/netgen-6.2.2203/libsrc/stlgeom/stltopology.hpp 
new/netgen-6.2.2204/libsrc/stlgeom/stltopology.hpp
--- old/netgen-6.2.2203/libsrc/stlgeom/stltopology.hpp  2022-05-07 
20:40:40.000000000 +0200
+++ new/netgen-6.2.2204/libsrc/stlgeom/stltopology.hpp  2022-08-10 
09:03:10.000000000 +0200
@@ -120,7 +120,12 @@
 
 
   STLTriangle (const STLPointId * apts);
-  STLTriangle () {pts[0]=0;pts[1]=0;pts[2]=0;}
+  STLTriangle ()
+  {
+    pts[0]=0;pts[1]=0;pts[2]=0;
+    nbtrigs[0][0] = nbtrigs[0][1] = nbtrigs[0][2] = 0.;
+    nbtrigs[1][0] = nbtrigs[1][1] = nbtrigs[1][2] = 0.;
+  }
 
   void DoArchive(Archive& ar)
   {
@@ -282,6 +287,7 @@
   Array<STLTriangle, STLTrigId> trias;
   NgArray<STLTopEdge> topedges;
   Array<Point<3>, STLPointId> points;
+  bool surface = false;
 
   // mapping of sorted pair of points to topedge
   INDEX_2_HASHTABLE<int> * ht_topedges;
@@ -313,13 +319,15 @@
   virtual ~STLTopology();
 
   static STLGeometry * LoadNaomi (istream & ist);
-  static STLGeometry * Load (istream & ist);
+  static STLGeometry * Load (istream & ist, bool surface=false);
   static STLGeometry * LoadBinary (istream & ist);
 
   void Save (const filesystem::path & filename) const;
   void SaveBinary (const filesystem::path & filename, const char* aname) const;
   void SaveSTLE (const filesystem::path & filename) const; // stores trigs and 
edges
 
+  bool IsSurfaceSTL() const { return surface; }
+
   virtual void DoArchive(Archive& ar)
   {
     ar & trias & points & boundingbox & pointtol;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/netgen-6.2.2203/libsrc/visualization/vsfieldlines.cpp 
new/netgen-6.2.2204/libsrc/visualization/vsfieldlines.cpp
--- old/netgen-6.2.2203/libsrc/visualization/vsfieldlines.cpp   2022-05-07 
20:40:40.000000000 +0200
+++ new/netgen-6.2.2204/libsrc/visualization/vsfieldlines.cpp   2022-08-10 
09:03:10.000000000 +0200
@@ -260,7 +260,7 @@
    
     double phaser=1.0;
     double phasei=0.0;
-    std::function eval_func = [&](int elnr, const double * lami, Vec<3> & vec)
+    std::function<bool(int, const double *, Vec<3> &)> eval_func = [&](int 
elnr, const double * lami, Vec<3> & vec)
     {
         double values[6] = {0., 0., 0., 0., 0., 0.};
         bool drawelem;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/netgen-6.2.2203/libsrc/visualization/vssolution.cpp 
new/netgen-6.2.2204/libsrc/visualization/vssolution.cpp
--- old/netgen-6.2.2203/libsrc/visualization/vssolution.cpp     2022-05-07 
20:40:40.000000000 +0200
+++ new/netgen-6.2.2204/libsrc/visualization/vssolution.cpp     2022-08-10 
09:03:10.000000000 +0200
@@ -795,12 +795,24 @@
             static double oldrad = 0;
           
             mesh->GetBox (pmin, pmax, -1);
-            center = Center (pmin, pmax);
+            if(vispar.use_center_coords && zoomall == 2)
+              {
+                center.X() = vispar.centerx;
+                center.Y() = vispar.centery;
+                center.Z() = vispar.centerz;
+              }
+            else if(selpoint >= 1 && zoomall == 2)
+              center = mesh->Point(selpoint);
+            else if(vispar.centerpoint >= 1 && zoomall == 2)
+              center = mesh->Point(vispar.centerpoint);
+            else
+              center = Center (pmin, pmax);
             rad = 0.5 * Dist (pmin, pmax);
+            if(rad == 0) rad = 1e-6;
           
             glEnable (GL_NORMALIZE);
           
-            if (rad > 1.5 * oldrad ||
+            if (rad > 1.2 * oldrad ||
                 mesh->GetMajorTimeStamp() > surfeltimestamp ||
                 zoomall)
               {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/netgen-6.2.2203/ng/occgeom.tcl 
new/netgen-6.2.2204/ng/occgeom.tcl
--- old/netgen-6.2.2203/ng/occgeom.tcl  2022-05-07 20:40:40.000000000 +0200
+++ new/netgen-6.2.2204/ng/occgeom.tcl  2022-08-10 09:03:10.000000000 +0200
@@ -101,7 +101,7 @@
        set nrfaces [expr [llength $faces]]
        if {$nrfaces >= 2} {
            #$hlist add ErrorFaces -itemtype text -text "Faces with surface 
meshing error"
-        $w.tree insert {} -id ErrorFaces -text "Faces with surface meshing 
error"
+        $w.tree insert {} end -id "ErrorFaces" -text "Faces with surface 
meshing error"
            #$w.mtre open ErrorFaces
         $w.tree item ErrorFaces -open true
            set i [expr 0]
@@ -109,12 +109,12 @@
                set entity [lindex $faces [expr $i]]
         set myroot [string range $entity 0 [string last / $entity]-1]
         if { [string length $myroot] == 0 } {
-            set myroot ErrorFaces
-        }
+            set myroot "ErrorFaces"
+                }
                incr i 1
                set entityname [lindex $faces [expr $i]]
                #$hlist add ErrorFaces/$entity -text $entityname -data 
$entityname
-        $w.tree insert {myroot} end -id $entity -text $entityname -value 0
+        $w.tree insert $myroot end -id $entity -text $entityname -value 0
                incr i 1
            }
        }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/netgen-6.2.2203/ng/onetcl.cpp 
new/netgen-6.2.2204/ng/onetcl.cpp
--- old/netgen-6.2.2203/ng/onetcl.cpp   2022-05-07 20:40:40.000000000 +0200
+++ new/netgen-6.2.2204/ng/onetcl.cpp   2022-08-10 09:03:10.000000000 +0200
@@ -3992,18 +3992,18 @@
 ,"set faces [Ng_OCCCommand getunmeshedfaceinfo]\n"
 ,"set nrfaces [expr [llength $faces]]\n"
 ,"if {$nrfaces >= 2} {\n"
-,"$w.tree insert {} -id ErrorFaces -text \"Faces with surface meshing 
error\"\n"
+,"$w.tree insert {} end -id \"ErrorFaces\" -text \"Faces with surface meshing 
error\"\n"
 ,"$w.tree item ErrorFaces -open true\n"
 ,"set i [expr 0]\n"
 ,"while {$i < $nrfaces} {\n"
 ,"set entity [lindex $faces [expr $i]]\n"
 ,"set myroot [string range $entity 0 [string last / $entity]-1]\n"
 ,"if { [string length $myroot] == 0 } {\n"
-,"set myroot ErrorFaces\n"
+,"set myroot \"ErrorFaces\"\n"
 ,"}\n"
 ,"incr i 1\n"
 ,"set entityname [lindex $faces [expr $i]]\n"
-,"$w.tree insert {myroot} end -id $entity -text $entityname -value 0\n"
+,"$w.tree insert $myroot end -id $entity -text $entityname -value 0\n"
 ,"incr i 1\n"
 ,"}\n"
 ,"}\n"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/netgen-6.2.2203/python/__init__.py 
new/netgen-6.2.2204/python/__init__.py
--- old/netgen-6.2.2203/python/__init__.py      2022-05-07 20:40:40.000000000 
+0200
+++ new/netgen-6.2.2204/python/__init__.py      2022-08-10 09:03:10.000000000 
+0200
@@ -6,7 +6,8 @@
 
_netgen_lib_dir=os.path.realpath(os.path.join(os.path.dirname(__file__),'..',config.NETGEN_PYTHON_RPATH))
 
 if sys.platform.startswith('win'):
-    if sys.version >= '3.8':
+    v = sys.version_info
+    if v.major == 3 and v.minor >= 8:
         os.add_dll_directory(_netgen_bin_dir)
     else:
         os.environ['PATH'] += ';'+_netgen_bin_dir
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/netgen-6.2.2203/python/gui.py 
new/netgen-6.2.2204/python/gui.py
--- old/netgen-6.2.2203/python/gui.py   2022-05-07 20:40:40.000000000 +0200
+++ new/netgen-6.2.2204/python/gui.py   2022-08-10 09:03:10.000000000 +0200
@@ -30,6 +30,13 @@
 
     win.tk.eval( netgen.libngpy._meshing._ngscript)
 
+    try:
+        from IPython import get_ipython
+        ipython = get_ipython()
+        ipython.magic('gui tk')
+    except:
+        pass
+
     def _Redraw(*args, **kwargs):
         if libngpy._meshing._Redraw(*args, **kwargs):
             import netgen
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/netgen-6.2.2203/rules/pyramidrules2.rls 
new/netgen-6.2.2204/rules/pyramidrules2.rls
--- old/netgen-6.2.2203/rules/pyramidrules2.rls 2022-05-07 20:40:40.000000000 
+0200
+++ new/netgen-6.2.2204/rules/pyramidrules2.rls 2022-08-10 09:03:10.000000000 
+0200
@@ -163,6 +163,69 @@
 endrule
 
 
+rule "pyramid with one trig, left"
+
+quality 20
+
+mappoints
+(0, 0, 0);
+(1, 0, 0);
+(1, 1, 0);
+(0, 1, 0);
+(0.5, 0.5, -0.5);
+
+mapfaces
+(1, 2, 3, 4) del;
+(3, 2, 5) del;
+
+newpoints
+
+newfaces
+(1, 2, 5);
+(3, 4, 5);
+(4, 1, 5);
+
+elements
+(1, 2, 3, 4, 5);
+
+freezone2
+{ 1 P1 };
+{ 1 P2 };
+{ 1 P3 };
+{ 1 P4 };
+{ 1 P5 };
+{ 0.34 P1, 0.34 P2, 0.34 P5, -0.01 P3 };
+{ 0.34 P3, 0.34 P4, 0.34 P5, -0.02 P1 };
+{ 0.34 P1, 0.34 P4, 0.34 P5, -0.02 P2 };
+
+freezonelimit
+{ 1 P1 };
+{ 1 P2 };
+{ 1 P3 };
+{ 1 P4 };
+{ 1 P5 };
+{ 0.333 P1, 0.333 P2, 0.334 P5, 0 P3 };
+{ 0.333 P3, 0.333 P4, 0.334 P5, 0 P1 };
+{ 0.333 P1, 0.333 P4, 0.334 P5, 0 P2 };
+
+orientations
+(1, 2, 3, 5);
+(1, 3, 4, 5);
+
+
+freeset
+1 2 3 5;
+freeset
+1 3 4 5;
+freeset
+1 2 5 6;
+freeset
+3 4 5 7;
+freeset 
+1 4 5 8;
+endrule
+
+
 
 
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/netgen-6.2.2203/tests/build_pip.sh 
new/netgen-6.2.2204/tests/build_pip.sh
--- old/netgen-6.2.2203/tests/build_pip.sh      2022-05-07 20:40:40.000000000 
+0200
+++ new/netgen-6.2.2204/tests/build_pip.sh      2022-08-10 09:03:10.000000000 
+0200
@@ -14,12 +14,12 @@
     $PYDIR/pip install -U pytest-check numpy wheel scikit-build
 
     rm -rf _skbuild
-    $PYDIR/pip wheel --use-feature=in-tree-build .
+    $PYDIR/pip wheel .
     auditwheel repair netgen_mesher*-cp${pyversion}-*.whl
     rm netgen_mesher-*.whl
 
     rm -rf _skbuild
-    NETGEN_ARCH=avx2 $PYDIR/pip wheel --use-feature=in-tree-build .
+    NETGEN_ARCH=avx2 $PYDIR/pip wheel .
     auditwheel repair netgen_mesher_avx2*-cp${pyversion}-*.whl
     rm netgen_mesher_avx2-*.whl
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/netgen-6.2.2203/tests/pytest/test_boundarylayer.py 
new/netgen-6.2.2204/tests/pytest/test_boundarylayer.py
--- old/netgen-6.2.2203/tests/pytest/test_boundarylayer.py      2022-05-07 
20:40:40.000000000 +0200
+++ new/netgen-6.2.2204/tests/pytest/test_boundarylayer.py      2022-08-10 
09:03:10.000000000 +0200
@@ -124,8 +124,9 @@
     assert ngs.Integrate(1, mesh.Materials("layer")) == pytest.approx(0.0016)
     assert ngs.Integrate(1, mesh.Materials("air")) == pytest.approx(0.9664 if 
outside else 0.968)
 
+# not working yet
 @pytest.mark.parametrize("outside", [True, False])
-def test_with_inner_corner(outside, capfd):
+def _test_with_inner_corner(outside, capfd):
     geo = CSGeometry()
 
     core_thickness = 0.1

Reply via email to