diff --git a/libsrc/general/CMakeLists.txt b/libsrc/general/CMakeLists.txt index 3bd0aba1..2b0562a6 100644 --- a/libsrc/general/CMakeLists.txt +++ b/libsrc/general/CMakeLists.txt @@ -2,7 +2,6 @@ target_sources(nglib PRIVATE gzstream.cpp hashtabl.cpp mystring.cpp - ngarray.cpp ngbitarray.cpp optmem.cpp parthreads.cpp diff --git a/libsrc/general/ngarray.cpp b/libsrc/general/ngarray.cpp deleted file mode 100644 index 37a8e118..00000000 --- a/libsrc/general/ngarray.cpp +++ /dev/null @@ -1,75 +0,0 @@ -#ifndef FILE_NGSTD_NgArrayCPP -#define FILE_NGSTD_NgArrayCPP -// necessary for SGI ???? - -/**************************************************************************/ -/* File: array.cpp */ -/* Author: Joachim Schoeberl */ -/* Date: 01. Jun. 95 */ -/**************************************************************************/ - -/* - Abstract data type NgArray -*/ - -#include -#include -#include - - -namespace netgen -{ - //using namespace netgen; - -#ifdef NONE - void BASE_Array :: ReSize (int minsize, int elementsize) - { - cout << "resize, minsize = " << minsize << endl; - - if (inc == -1) - throw Exception ("Try to resize fixed size array"); - - - void * p; - int nsize = (inc) ? allocsize + inc : 2 * allocsize; - if (nsize < minsize) nsize = minsize; - - if (data) - { - p = new char [nsize * elementsize]; - - int mins = (nsize < actsize) ? nsize : actsize; - memcpy (p, data, mins * elementsize); - - delete [] static_cast (data); - data = p; - } - else - { - data = new char[nsize * elementsize]; - } - - allocsize = nsize; - cout << "resize done" << endl; - } - - - - void BASE_Array :: RangeCheck (int i) const - { - if (i < 0 || i >= actsize) - throw ArrayRangeException (); - } - - void BASE_Array :: CheckNonEmpty () const - { - if (!actsize) - { - throw Exception ("NgArray should not be empty"); - // cerr << "NgArray shouldn't be empty"; - } - } -#endif -} -#endif // FILE_NGSTD_NgArrayCPP - diff --git a/libsrc/general/ngarray.hpp b/libsrc/general/ngarray.hpp index e84d9838..ca5bbdd7 100644 --- a/libsrc/general/ngarray.hpp +++ b/libsrc/general/ngarray.hpp @@ -11,6 +11,7 @@ namespace netgen { + using namespace ngcore; // template class IndirectArray; template class NgIndirectArray; @@ -111,11 +112,7 @@ namespace netgen /// Access array. BASE-based T & operator[] (TIND i) const { -#ifdef DEBUG - if (i-BASE < 0 || i-BASE >= size) - cout << "array<" << typeid(T).name() << "> out of range, i = " << i << ", s = " << size << endl; -#endif - + NETGEN_CHECK_RANGE(i,BASE,size+BASE); return data[i-BASE]; } @@ -130,13 +127,7 @@ namespace netgen /// Access array, one-based (old fashioned) T & Elem (int i) { -#ifdef DEBUG - if (i < 1 || i > size) - cout << "NgArray<" << typeid(T).name() - << ">::Elem out of range, i = " << i - << ", s = " << size << endl; -#endif - + NETGEN_CHECK_RANGE(i,1,size+1); return ((T*)data)[i-1]; } @@ -144,30 +135,21 @@ namespace netgen // [[deprecated("Use operator[] instead")]] const T & Get (int i) const { -#ifdef DEBUG - if (i < 1 || i > size) - cout << "NgArray<" << typeid(T).name() << ">::Get out of range, i = " << i - << ", s = " << size << endl; -#endif - + NETGEN_CHECK_RANGE(i,1,size+1); return ((const T*)data)[i-1]; } /// Access array, one-based (old fashioned) void Set (int i, const T & el) { -#ifdef DEBUG - if (i < 1 || i > size) - cout << "NgArray<" << typeid(T).name() << ">::Set out of range, i = " << i - << ", s = " << size << endl; -#endif - + NETGEN_CHECK_RANGE(i,1,size+1); ((T*)data)[i-1] = el; } /// access first element T & First () const { + NETGEN_CHECK_RANGE(0,0,size); return data[0]; } @@ -175,6 +157,7 @@ namespace netgen /// access last element. check by macro CHECK_RANGE T & Last () const { + NETGEN_CHECK_RANGE(size-1,0,size); return data[size-1]; } @@ -345,10 +328,7 @@ namespace netgen /// Delete element i (0-based). Move last element to position i. void Delete (TIND i) { -#ifdef CHECK_Array_RANGE - RangeCheck (i+1); -#endif - + NETGEN_CHECK_RANGE(i,0,size); data[i] = std::move(data[size-1]); size--; // DeleteElement (i+1); @@ -358,10 +338,7 @@ namespace netgen /// Delete element i (1-based). Move last element to position i. void DeleteElement (TIND i) { -#ifdef CHECK_Array_RANGE - RangeCheck (i); -#endif - + NETGEN_CHECK_RANGE(i,1,size+1); data[i-1] = std::move(data[size-1]); size--; } diff --git a/libsrc/general/table.hpp b/libsrc/general/table.hpp index 54f5be31..3c25c2b0 100644 --- a/libsrc/general/table.hpp +++ b/libsrc/general/table.hpp @@ -120,7 +120,7 @@ public: /// Creates fixed maximal element size table inline TABLE (const NgFlatArray & entrysizes) - : BASE_TABLE (NgFlatArray (entrysizes.Size(), const_cast(&entrysizes[BASE])), + : BASE_TABLE (NgFlatArray (entrysizes.Size(), entrysizes.Size() ? const_cast(&entrysizes[BASE]) : nullptr), sizeof(T)) { ; } diff --git a/libsrc/meshing/basegeom.cpp b/libsrc/meshing/basegeom.cpp index bcc85153..38c793e9 100644 --- a/libsrc/meshing/basegeom.cpp +++ b/libsrc/meshing/basegeom.cpp @@ -1245,8 +1245,7 @@ namespace netgen void NetgenGeometry :: FinalizeMesh(Mesh& mesh) const { - if(solids.Size()) - for (int i = 0; i < mesh.GetNDomains(); i++) + for (int i = 0; i < std::min(solids.Size(), (size_t)mesh.GetNDomains()); i++) if (auto name = solids[i]->properties.name) mesh.SetMaterial (i+1, *name); diff --git a/libsrc/meshing/python_mesh.cpp b/libsrc/meshing/python_mesh.cpp index 65bf7b1a..6937c905 100644 --- a/libsrc/meshing/python_mesh.cpp +++ b/libsrc/meshing/python_mesh.cpp @@ -1783,6 +1783,18 @@ project_boundaries : Optional[str] = None layer-ending should be projected to that boundary. )delimiter") + .def(py::init([]( const py::dict & d ) { + try { + // Call other constructor with named arguments by unpacking the dictionary + py::object cls = py::type::of(); + return cls(**d).cast(); + } + catch (py::error_already_set & e) { + cerr << "Error creating BoundaryLayerParameters from dict:" << endl; + cerr << e.what() << endl; + throw; + } + })) .def_readwrite("boundary", &BoundaryLayerParameters::boundary) .def_readwrite("thickness", &BoundaryLayerParameters::thickness) .def_readwrite("new_material", &BoundaryLayerParameters::new_material) @@ -1795,6 +1807,7 @@ project_boundaries : Optional[str] = None .def_readwrite("keep_surfaceindex", &BoundaryLayerParameters::keep_surfaceindex) .def_readwrite("limit_safety", &BoundaryLayerParameters::limit_safety) ; + py::implicitly_convertible(); #ifdef NG_CGNS m.def("ReadCGNSFile", &ReadCGNSFile, py::arg("filename"), py::arg("base")=1, "Read mesh and solution vectors from CGNS file"); diff --git a/libsrc/meshing/smoothing3.cpp b/libsrc/meshing/smoothing3.cpp index 2041e276..4af0128a 100644 --- a/libsrc/meshing/smoothing3.cpp +++ b/libsrc/meshing/smoothing3.cpp @@ -335,8 +335,8 @@ namespace netgen { static Timer tim("PointFunction - build elementsonpoint table"); RegionTimer reg(tim); - Array bad_point(points.Size()); - bad_point = false; + Array non_tet_points(points.Size()); + non_tet_points = false; // Don't optimize if point is adjacent to a non-tet element ParallelForRange(elements.Range(), [&] (auto myrange) { @@ -345,7 +345,7 @@ namespace netgen const auto & el = elements[ei]; if(el.NP()!=4) for(auto pi : el.PNums()) - bad_point[pi] = true; + non_tet_points[pi] = true; } }); @@ -358,7 +358,7 @@ namespace netgen return; for (PointIndex pi : el.PNums()) - if(!bad_point[pi]) + if(!non_tet_points[pi]) table.Add (pi, ei); }, points.Size()); }