netgen-mesher 6.2.2506.post35.dev0__cp314-cp314-win_amd64.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- netgen/NgOCC.py +7 -0
- netgen/__init__.py +114 -0
- netgen/__init__.pyi +22 -0
- netgen/__main__.py +53 -0
- netgen/cmake/NetgenConfig.cmake +79 -0
- netgen/cmake/netgen-targets-release.cmake +69 -0
- netgen/cmake/netgen-targets.cmake +146 -0
- netgen/config/__init__.py +1 -0
- netgen/config/__init__.pyi +52 -0
- netgen/config/__main__.py +4 -0
- netgen/config/config.py +68 -0
- netgen/config/config.pyi +54 -0
- netgen/csg.py +25 -0
- netgen/geom2d.py +178 -0
- netgen/gui.py +82 -0
- netgen/include/core/archive.hpp +1256 -0
- netgen/include/core/array.hpp +1760 -0
- netgen/include/core/autodiff.hpp +1131 -0
- netgen/include/core/autodiffdiff.hpp +733 -0
- netgen/include/core/bitarray.hpp +240 -0
- netgen/include/core/concurrentqueue.h +3619 -0
- netgen/include/core/exception.hpp +145 -0
- netgen/include/core/flags.hpp +199 -0
- netgen/include/core/hashtable.hpp +1281 -0
- netgen/include/core/localheap.hpp +318 -0
- netgen/include/core/logging.hpp +117 -0
- netgen/include/core/memtracer.hpp +221 -0
- netgen/include/core/mpi4py_pycapi.h +245 -0
- netgen/include/core/mpi_wrapper.hpp +643 -0
- netgen/include/core/ng_mpi.hpp +94 -0
- netgen/include/core/ng_mpi_generated_declarations.hpp +155 -0
- netgen/include/core/ng_mpi_native.hpp +25 -0
- netgen/include/core/ngcore.hpp +32 -0
- netgen/include/core/ngcore_api.hpp +152 -0
- netgen/include/core/ngstream.hpp +115 -0
- netgen/include/core/paje_trace.hpp +279 -0
- netgen/include/core/profiler.hpp +382 -0
- netgen/include/core/python_ngcore.hpp +457 -0
- netgen/include/core/ranges.hpp +109 -0
- netgen/include/core/register_archive.hpp +100 -0
- netgen/include/core/signal.hpp +82 -0
- netgen/include/core/simd.hpp +160 -0
- netgen/include/core/simd_arm64.hpp +407 -0
- netgen/include/core/simd_avx.hpp +394 -0
- netgen/include/core/simd_avx512.hpp +285 -0
- netgen/include/core/simd_generic.hpp +1053 -0
- netgen/include/core/simd_math.hpp +178 -0
- netgen/include/core/simd_sse.hpp +289 -0
- netgen/include/core/statushandler.hpp +37 -0
- netgen/include/core/symboltable.hpp +153 -0
- netgen/include/core/table.hpp +810 -0
- netgen/include/core/taskmanager.hpp +1161 -0
- netgen/include/core/type_traits.hpp +65 -0
- netgen/include/core/utils.hpp +385 -0
- netgen/include/core/version.hpp +102 -0
- netgen/include/core/xbool.hpp +47 -0
- netgen/include/csg/algprim.hpp +563 -0
- netgen/include/csg/brick.hpp +150 -0
- netgen/include/csg/csg.hpp +43 -0
- netgen/include/csg/csgeom.hpp +389 -0
- netgen/include/csg/csgparser.hpp +101 -0
- netgen/include/csg/curve2d.hpp +67 -0
- netgen/include/csg/edgeflw.hpp +112 -0
- netgen/include/csg/explicitcurve2d.hpp +113 -0
- netgen/include/csg/extrusion.hpp +185 -0
- netgen/include/csg/gencyl.hpp +70 -0
- netgen/include/csg/geoml.hpp +16 -0
- netgen/include/csg/identify.hpp +213 -0
- netgen/include/csg/manifold.hpp +29 -0
- netgen/include/csg/meshsurf.hpp +46 -0
- netgen/include/csg/polyhedra.hpp +121 -0
- netgen/include/csg/revolution.hpp +180 -0
- netgen/include/csg/singularref.hpp +84 -0
- netgen/include/csg/solid.hpp +295 -0
- netgen/include/csg/specpoin.hpp +194 -0
- netgen/include/csg/spline3d.hpp +99 -0
- netgen/include/csg/splinesurface.hpp +85 -0
- netgen/include/csg/surface.hpp +394 -0
- netgen/include/csg/triapprox.hpp +63 -0
- netgen/include/csg/vscsg.hpp +34 -0
- netgen/include/general/autodiff.hpp +356 -0
- netgen/include/general/autoptr.hpp +39 -0
- netgen/include/general/gzstream.h +121 -0
- netgen/include/general/hashtabl.hpp +1692 -0
- netgen/include/general/myadt.hpp +48 -0
- netgen/include/general/mystring.hpp +226 -0
- netgen/include/general/netgenout.hpp +205 -0
- netgen/include/general/ngarray.hpp +797 -0
- netgen/include/general/ngbitarray.hpp +149 -0
- netgen/include/general/ngpython.hpp +74 -0
- netgen/include/general/optmem.hpp +44 -0
- netgen/include/general/parthreads.hpp +138 -0
- netgen/include/general/seti.hpp +50 -0
- netgen/include/general/sort.hpp +47 -0
- netgen/include/general/spbita2d.hpp +59 -0
- netgen/include/general/stack.hpp +114 -0
- netgen/include/general/table.hpp +280 -0
- netgen/include/general/template.hpp +509 -0
- netgen/include/geom2d/csg2d.hpp +750 -0
- netgen/include/geom2d/geometry2d.hpp +280 -0
- netgen/include/geom2d/spline2d.hpp +234 -0
- netgen/include/geom2d/vsgeom2d.hpp +28 -0
- netgen/include/gprim/adtree.hpp +1392 -0
- netgen/include/gprim/geom2d.hpp +858 -0
- netgen/include/gprim/geom3d.hpp +749 -0
- netgen/include/gprim/geomfuncs.hpp +212 -0
- netgen/include/gprim/geomobjects.hpp +544 -0
- netgen/include/gprim/geomops.hpp +404 -0
- netgen/include/gprim/geomtest3d.hpp +101 -0
- netgen/include/gprim/gprim.hpp +33 -0
- netgen/include/gprim/spline.hpp +778 -0
- netgen/include/gprim/splinegeometry.hpp +73 -0
- netgen/include/gprim/transform3d.hpp +216 -0
- netgen/include/include/acisgeom.hpp +3 -0
- netgen/include/include/csg.hpp +1 -0
- netgen/include/include/geometry2d.hpp +1 -0
- netgen/include/include/gprim.hpp +1 -0
- netgen/include/include/incopengl.hpp +62 -0
- netgen/include/include/inctcl.hpp +13 -0
- netgen/include/include/incvis.hpp +6 -0
- netgen/include/include/linalg.hpp +1 -0
- netgen/include/include/meshing.hpp +1 -0
- netgen/include/include/myadt.hpp +1 -0
- netgen/include/include/mydefs.hpp +70 -0
- netgen/include/include/mystdlib.h +59 -0
- netgen/include/include/netgen_config.hpp +27 -0
- netgen/include/include/netgen_version.hpp +9 -0
- netgen/include/include/nginterface_v2_impl.hpp +395 -0
- netgen/include/include/ngsimd.hpp +1 -0
- netgen/include/include/occgeom.hpp +1 -0
- netgen/include/include/opti.hpp +1 -0
- netgen/include/include/parallel.hpp +1 -0
- netgen/include/include/stlgeom.hpp +1 -0
- netgen/include/include/visual.hpp +1 -0
- netgen/include/interface/rw_medit.hpp +11 -0
- netgen/include/interface/writeuser.hpp +80 -0
- netgen/include/linalg/densemat.hpp +414 -0
- netgen/include/linalg/linalg.hpp +29 -0
- netgen/include/linalg/opti.hpp +142 -0
- netgen/include/linalg/polynomial.hpp +47 -0
- netgen/include/linalg/vector.hpp +217 -0
- netgen/include/meshing/adfront2.hpp +274 -0
- netgen/include/meshing/adfront3.hpp +332 -0
- netgen/include/meshing/basegeom.hpp +370 -0
- netgen/include/meshing/bcfunctions.hpp +53 -0
- netgen/include/meshing/bisect.hpp +72 -0
- netgen/include/meshing/boundarylayer.hpp +113 -0
- netgen/include/meshing/classifyhpel.hpp +1984 -0
- netgen/include/meshing/clusters.hpp +46 -0
- netgen/include/meshing/curvedelems.hpp +274 -0
- netgen/include/meshing/delaunay2d.hpp +73 -0
- netgen/include/meshing/fieldlines.hpp +103 -0
- netgen/include/meshing/findip.hpp +198 -0
- netgen/include/meshing/findip2.hpp +103 -0
- netgen/include/meshing/geomsearch.hpp +69 -0
- netgen/include/meshing/global.hpp +54 -0
- netgen/include/meshing/hpref_hex.hpp +330 -0
- netgen/include/meshing/hpref_prism.hpp +3405 -0
- netgen/include/meshing/hpref_pyramid.hpp +154 -0
- netgen/include/meshing/hpref_quad.hpp +2082 -0
- netgen/include/meshing/hpref_segm.hpp +122 -0
- netgen/include/meshing/hpref_tet.hpp +4230 -0
- netgen/include/meshing/hpref_trig.hpp +848 -0
- netgen/include/meshing/hprefinement.hpp +366 -0
- netgen/include/meshing/improve2.hpp +178 -0
- netgen/include/meshing/improve3.hpp +151 -0
- netgen/include/meshing/localh.hpp +223 -0
- netgen/include/meshing/meshclass.hpp +1076 -0
- netgen/include/meshing/meshfunc.hpp +47 -0
- netgen/include/meshing/meshing.hpp +63 -0
- netgen/include/meshing/meshing2.hpp +163 -0
- netgen/include/meshing/meshing3.hpp +123 -0
- netgen/include/meshing/meshtool.hpp +90 -0
- netgen/include/meshing/meshtype.hpp +1930 -0
- netgen/include/meshing/msghandler.hpp +62 -0
- netgen/include/meshing/paralleltop.hpp +172 -0
- netgen/include/meshing/python_mesh.hpp +206 -0
- netgen/include/meshing/ruler2.hpp +172 -0
- netgen/include/meshing/ruler3.hpp +211 -0
- netgen/include/meshing/soldata.hpp +141 -0
- netgen/include/meshing/specials.hpp +17 -0
- netgen/include/meshing/surfacegeom.hpp +73 -0
- netgen/include/meshing/topology.hpp +1003 -0
- netgen/include/meshing/validate.hpp +21 -0
- netgen/include/meshing/visual_interface.hpp +71 -0
- netgen/include/mydefs.hpp +70 -0
- netgen/include/nginterface.h +474 -0
- netgen/include/nginterface_v2.hpp +406 -0
- netgen/include/nglib.h +697 -0
- netgen/include/nglib_occ.h +50 -0
- netgen/include/occ/occ_edge.hpp +47 -0
- netgen/include/occ/occ_face.hpp +52 -0
- netgen/include/occ/occ_solid.hpp +23 -0
- netgen/include/occ/occ_utils.hpp +376 -0
- netgen/include/occ/occ_vertex.hpp +30 -0
- netgen/include/occ/occgeom.hpp +659 -0
- netgen/include/occ/occmeshsurf.hpp +168 -0
- netgen/include/occ/vsocc.hpp +33 -0
- netgen/include/pybind11/LICENSE +29 -0
- netgen/include/pybind11/attr.h +722 -0
- netgen/include/pybind11/buffer_info.h +208 -0
- netgen/include/pybind11/cast.h +2361 -0
- netgen/include/pybind11/chrono.h +228 -0
- netgen/include/pybind11/common.h +2 -0
- netgen/include/pybind11/complex.h +74 -0
- netgen/include/pybind11/conduit/README.txt +15 -0
- netgen/include/pybind11/conduit/pybind11_conduit_v1.h +116 -0
- netgen/include/pybind11/conduit/pybind11_platform_abi_id.h +87 -0
- netgen/include/pybind11/conduit/wrap_include_python_h.h +72 -0
- netgen/include/pybind11/critical_section.h +56 -0
- netgen/include/pybind11/detail/class.h +823 -0
- netgen/include/pybind11/detail/common.h +1348 -0
- netgen/include/pybind11/detail/cpp_conduit.h +75 -0
- netgen/include/pybind11/detail/descr.h +226 -0
- netgen/include/pybind11/detail/dynamic_raw_ptr_cast_if_possible.h +39 -0
- netgen/include/pybind11/detail/exception_translation.h +71 -0
- netgen/include/pybind11/detail/function_record_pyobject.h +191 -0
- netgen/include/pybind11/detail/init.h +538 -0
- netgen/include/pybind11/detail/internals.h +799 -0
- netgen/include/pybind11/detail/native_enum_data.h +209 -0
- netgen/include/pybind11/detail/pybind11_namespace_macros.h +82 -0
- netgen/include/pybind11/detail/struct_smart_holder.h +378 -0
- netgen/include/pybind11/detail/type_caster_base.h +1591 -0
- netgen/include/pybind11/detail/typeid.h +65 -0
- netgen/include/pybind11/detail/using_smart_holder.h +22 -0
- netgen/include/pybind11/detail/value_and_holder.h +90 -0
- netgen/include/pybind11/eigen/common.h +9 -0
- netgen/include/pybind11/eigen/matrix.h +723 -0
- netgen/include/pybind11/eigen/tensor.h +521 -0
- netgen/include/pybind11/eigen.h +12 -0
- netgen/include/pybind11/embed.h +320 -0
- netgen/include/pybind11/eval.h +161 -0
- netgen/include/pybind11/functional.h +147 -0
- netgen/include/pybind11/gil.h +199 -0
- netgen/include/pybind11/gil_safe_call_once.h +102 -0
- netgen/include/pybind11/gil_simple.h +37 -0
- netgen/include/pybind11/iostream.h +265 -0
- netgen/include/pybind11/native_enum.h +67 -0
- netgen/include/pybind11/numpy.h +2312 -0
- netgen/include/pybind11/operators.h +202 -0
- netgen/include/pybind11/options.h +92 -0
- netgen/include/pybind11/pybind11.h +3645 -0
- netgen/include/pybind11/pytypes.h +2680 -0
- netgen/include/pybind11/stl/filesystem.h +114 -0
- netgen/include/pybind11/stl.h +666 -0
- netgen/include/pybind11/stl_bind.h +858 -0
- netgen/include/pybind11/subinterpreter.h +299 -0
- netgen/include/pybind11/trampoline_self_life_support.h +65 -0
- netgen/include/pybind11/type_caster_pyobject_ptr.h +61 -0
- netgen/include/pybind11/typing.h +298 -0
- netgen/include/pybind11/warnings.h +75 -0
- netgen/include/stlgeom/meshstlsurface.hpp +67 -0
- netgen/include/stlgeom/stlgeom.hpp +491 -0
- netgen/include/stlgeom/stlline.hpp +193 -0
- netgen/include/stlgeom/stltool.hpp +331 -0
- netgen/include/stlgeom/stltopology.hpp +419 -0
- netgen/include/stlgeom/vsstl.hpp +58 -0
- netgen/include/visualization/meshdoc.hpp +42 -0
- netgen/include/visualization/mvdraw.hpp +325 -0
- netgen/include/visualization/vispar.hpp +128 -0
- netgen/include/visualization/visual.hpp +28 -0
- netgen/include/visualization/visual_api.hpp +10 -0
- netgen/include/visualization/vssolution.hpp +399 -0
- netgen/lib/libnggui.lib +0 -0
- netgen/lib/ngcore.lib +0 -0
- netgen/lib/nglib.lib +0 -0
- netgen/lib/togl.lib +0 -0
- netgen/libnggui.dll +0 -0
- netgen/libngguipy.lib +0 -0
- netgen/libngguipy.pyd +0 -0
- netgen/libngpy/_NgOCC.pyi +1545 -0
- netgen/libngpy/__init__.pyi +7 -0
- netgen/libngpy/_csg.pyi +259 -0
- netgen/libngpy/_geom2d.pyi +323 -0
- netgen/libngpy/_meshing.pyi +1111 -0
- netgen/libngpy/_stl.pyi +131 -0
- netgen/libngpy.lib +0 -0
- netgen/libngpy.pyd +0 -0
- netgen/meshing.py +65 -0
- netgen/ngcore.dll +0 -0
- netgen/nglib.dll +0 -0
- netgen/occ.py +52 -0
- netgen/read_gmsh.py +259 -0
- netgen/read_meshio.py +22 -0
- netgen/stl.py +2 -0
- netgen/togl.dll +0 -0
- netgen/version.py +2 -0
- netgen/webgui.py +529 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/boundarycondition.geo +16 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/boxcyl.geo +32 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/circle_on_cube.geo +27 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/cone.geo +13 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/cube.geo +16 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/cubeandring.geo +55 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/cubeandspheres.geo +21 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/cubemcyl.geo +18 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/cubemsphere.geo +19 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/cylinder.geo +12 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/cylsphere.geo +12 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/doc/ng4.pdf +0 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/ellipsoid.geo +8 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/ellipticcyl.geo +10 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/extrusion.geo +99 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/fichera.geo +24 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/frame.step +11683 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/hinge.stl +8486 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/lshape3d.geo +26 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/manyholes.geo +26 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/manyholes2.geo +26 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/matrix.geo +27 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/ortho.geo +11 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/part1.stl +2662 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/period.geo +33 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/py_tutorials/exportNeutral.py +26 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/py_tutorials/mesh.py +19 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/py_tutorials/shaft.geo +65 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/revolution.geo +18 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/screw.step +1694 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/sculpture.geo +13 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/shaft.geo +65 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/shell.geo +10 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/sphere.geo +8 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/sphereincube.geo +17 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/square.in2d +35 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/squarecircle.in2d +48 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/squarehole.in2d +47 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/torus.geo +8 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/trafo.geo +57 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/twobricks.geo +15 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/twocubes.geo +18 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/twocyl.geo +16 -0
- netgen_mesher-6.2.2506.post35.dev0.dist-info/METADATA +15 -0
- netgen_mesher-6.2.2506.post35.dev0.dist-info/RECORD +340 -0
- netgen_mesher-6.2.2506.post35.dev0.dist-info/WHEEL +5 -0
- netgen_mesher-6.2.2506.post35.dev0.dist-info/entry_points.txt +2 -0
- netgen_mesher-6.2.2506.post35.dev0.dist-info/licenses/AUTHORS +1 -0
- netgen_mesher-6.2.2506.post35.dev0.dist-info/licenses/LICENSE +504 -0
- netgen_mesher-6.2.2506.post35.dev0.dist-info/top_level.txt +2 -0
- pyngcore/__init__.py +1 -0
- pyngcore/pyngcore.cp314-win_amd64.pyd +0 -0
|
@@ -0,0 +1,810 @@
|
|
|
1
|
+
#ifndef NETGEN_CORE_TABLE_HPP
|
|
2
|
+
#define NETGEN_CORE_TABLE_HPP
|
|
3
|
+
|
|
4
|
+
/**************************************************************************/
|
|
5
|
+
/* File: table.hpp */
|
|
6
|
+
/* Author: Joachim Schoeberl */
|
|
7
|
+
/* Date: 25. Mar. 2000 */
|
|
8
|
+
/**************************************************************************/
|
|
9
|
+
|
|
10
|
+
#include <atomic>
|
|
11
|
+
#include <iostream>
|
|
12
|
+
#include <optional>
|
|
13
|
+
|
|
14
|
+
#include "array.hpp"
|
|
15
|
+
#include "bitarray.hpp"
|
|
16
|
+
#include "memtracer.hpp"
|
|
17
|
+
#include "ngcore_api.hpp"
|
|
18
|
+
#include "profiler.hpp"
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
namespace ngcore
|
|
22
|
+
{
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
template <class T, class IndexType = size_t>
|
|
26
|
+
class FlatTable
|
|
27
|
+
{
|
|
28
|
+
protected:
|
|
29
|
+
static constexpr IndexType BASE = IndexBASE<IndexType>();
|
|
30
|
+
/// number of rows
|
|
31
|
+
size_t size;
|
|
32
|
+
/// pointer to first in row
|
|
33
|
+
size_t * index;
|
|
34
|
+
/// array of data
|
|
35
|
+
T * data;
|
|
36
|
+
|
|
37
|
+
public:
|
|
38
|
+
FlatTable() = delete;
|
|
39
|
+
FlatTable (const FlatTable &) = default;
|
|
40
|
+
|
|
41
|
+
NETGEN_INLINE FlatTable(size_t as, size_t * aindex, T * adata)
|
|
42
|
+
: size(as), index(aindex), data(adata) { ; }
|
|
43
|
+
|
|
44
|
+
/// Size of table
|
|
45
|
+
NETGEN_INLINE size_t Size() const { return size; }
|
|
46
|
+
|
|
47
|
+
/// Access entry
|
|
48
|
+
NETGEN_INLINE const FlatArray<T> operator[] (IndexType i) const
|
|
49
|
+
{
|
|
50
|
+
return FlatArray<T> (index[i-BASE+1]-index[i-BASE], data+index[i-BASE]);
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
NETGEN_INLINE T * Data() const { return data; }
|
|
54
|
+
|
|
55
|
+
NETGEN_INLINE FlatArray<T> AsArray() const
|
|
56
|
+
{
|
|
57
|
+
return FlatArray<T> (index[size]-index[0], data+index[0]);
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
NETGEN_INLINE FlatArray<size_t> IndexArray() const
|
|
61
|
+
{
|
|
62
|
+
return FlatArray<size_t, IndexType> (size+1, index);
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/// takes range starting from position start of end-start elements
|
|
66
|
+
NETGEN_INLINE FlatTable<T> Range (size_t start, size_t end) const
|
|
67
|
+
{
|
|
68
|
+
return FlatTable<T> (end-start, index+start-BASE, data);
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
/// takes range starting from position start of end-start elements
|
|
72
|
+
NETGEN_INLINE FlatTable<T> Range (T_Range<size_t> range) const
|
|
73
|
+
{
|
|
74
|
+
return FlatTable<T> (range.Size(), index+range.First()-BASE, data);
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
NETGEN_INLINE T_Range<IndexType> Range () const
|
|
78
|
+
{
|
|
79
|
+
return T_Range<IndexType> (BASE, size+BASE);
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
class Iterator
|
|
83
|
+
{
|
|
84
|
+
const FlatTable & tab;
|
|
85
|
+
size_t row;
|
|
86
|
+
public:
|
|
87
|
+
Iterator (const FlatTable & _tab, size_t _row) : tab(_tab), row(_row) { ; }
|
|
88
|
+
Iterator & operator++ () { ++row; return *this; }
|
|
89
|
+
FlatArray<T> operator* () const { return tab[row]; }
|
|
90
|
+
bool operator!= (const Iterator & it2) { return row != it2.row; }
|
|
91
|
+
};
|
|
92
|
+
|
|
93
|
+
Iterator begin() const { return Iterator(*this, BASE); }
|
|
94
|
+
Iterator end() const { return Iterator(*this, BASE+size); }
|
|
95
|
+
};
|
|
96
|
+
|
|
97
|
+
/*
|
|
98
|
+
NGCORE_API extern size_t * TablePrefixSum32 (FlatArray<unsigned int> entrysize);
|
|
99
|
+
NGCORE_API extern size_t * TablePrefixSum64 (FlatArray<size_t> entrysize);
|
|
100
|
+
|
|
101
|
+
|
|
102
|
+
NETGEN_INLINE size_t * TablePrefixSum (FlatArray<unsigned int> entrysize)
|
|
103
|
+
{ return TablePrefixSum32 (entrysize); }
|
|
104
|
+
NETGEN_INLINE size_t * TablePrefixSum (FlatArray<int> entrysize)
|
|
105
|
+
{ return TablePrefixSum32 (FlatArray<unsigned> (entrysize.Size(), (unsigned int*)(int*)(entrysize.Addr(0)))); }
|
|
106
|
+
NETGEN_INLINE size_t * TablePrefixSum (FlatArray<std::atomic<int>> entrysize)
|
|
107
|
+
{ return TablePrefixSum32 (FlatArray<unsigned> (entrysize.Size(), (unsigned int*)(std::atomic<int>*)entrysize.Addr(0))); }
|
|
108
|
+
NETGEN_INLINE size_t * TablePrefixSum (FlatArray<size_t> entrysize)
|
|
109
|
+
{ return TablePrefixSum64 (entrysize); }
|
|
110
|
+
*/
|
|
111
|
+
|
|
112
|
+
NGCORE_API extern size_t * TablePrefixSum32 (FlatArray<uint32_t> entrysize);
|
|
113
|
+
NGCORE_API extern size_t * TablePrefixSum64 (FlatArray<uint64_t> entrysize);
|
|
114
|
+
|
|
115
|
+
template <typename T> // TODO: enable_if T is integral
|
|
116
|
+
NETGEN_INLINE size_t * TablePrefixSum (FlatArray<T> entrysize)
|
|
117
|
+
{
|
|
118
|
+
if constexpr (sizeof(T) == 4)
|
|
119
|
+
return TablePrefixSum32 ( { entrysize.Size(), (uint32_t*)(void*)entrysize.Addr(0) });
|
|
120
|
+
else
|
|
121
|
+
return TablePrefixSum64 ( { entrysize.Size(), (uint64_t*)(void*)entrysize.Addr(0) });
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
|
|
125
|
+
/**
|
|
126
|
+
A compact Table container.
|
|
127
|
+
A table contains size entries of variable size.
|
|
128
|
+
The entry sizes must be known at construction.
|
|
129
|
+
*/
|
|
130
|
+
template <class T, class IndexType = size_t>
|
|
131
|
+
class Table : public FlatTable<T, IndexType>
|
|
132
|
+
{
|
|
133
|
+
protected:
|
|
134
|
+
|
|
135
|
+
using FlatTable<T,IndexType>::size;
|
|
136
|
+
using FlatTable<T,IndexType>::index;
|
|
137
|
+
using FlatTable<T,IndexType>::data;
|
|
138
|
+
|
|
139
|
+
public:
|
|
140
|
+
///
|
|
141
|
+
NETGEN_INLINE Table () : FlatTable<T,IndexType> (0,nullptr,nullptr) { ; }
|
|
142
|
+
/// Construct table of uniform entrysize
|
|
143
|
+
NETGEN_INLINE Table (size_t asize, size_t entrysize)
|
|
144
|
+
: FlatTable<T,IndexType>( asize, new size_t[asize+1], new T[asize*entrysize] )
|
|
145
|
+
{
|
|
146
|
+
for (size_t i : IntRange(size+1))
|
|
147
|
+
index[i] = i*entrysize;
|
|
148
|
+
mt.Alloc(GetMemUsage());
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
/// Construct table of variable entrysize
|
|
152
|
+
template <typename TI>
|
|
153
|
+
NETGEN_INLINE Table (FlatArray<TI,IndexType> entrysize)
|
|
154
|
+
: FlatTable<T,IndexType> (0, nullptr, nullptr)
|
|
155
|
+
{
|
|
156
|
+
size = entrysize.Size();
|
|
157
|
+
index = TablePrefixSum (FlatArray<TI> (entrysize.Size(), entrysize.Data()));
|
|
158
|
+
size_t cnt = index[size];
|
|
159
|
+
data = new T[cnt];
|
|
160
|
+
mt.Alloc(GetMemUsage());
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
explicit NETGEN_INLINE Table (const FlatTable<T,IndexType> & tab2)
|
|
164
|
+
: FlatTable<T,IndexType>(0, nullptr, nullptr)
|
|
165
|
+
{
|
|
166
|
+
size = tab2.Size();
|
|
167
|
+
if (size == 0) return;
|
|
168
|
+
|
|
169
|
+
index = new size_t[size+1];
|
|
170
|
+
this->IndexArray() = tab2.IndexArray();
|
|
171
|
+
// for (size_t i = 0; i <= size; i++)
|
|
172
|
+
// index[i] = tab2.index[i];
|
|
173
|
+
|
|
174
|
+
size_t cnt = index[size];
|
|
175
|
+
data = new T[cnt];
|
|
176
|
+
this->AsArray() = tab2.AsArray();
|
|
177
|
+
mt.Alloc(GetMemUsage());
|
|
178
|
+
/*
|
|
179
|
+
for (size_t i = 0; i < cnt; i++)
|
|
180
|
+
data[i] = tab2.data[i];
|
|
181
|
+
*/
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
explicit NETGEN_INLINE Table (const Table & tab2)
|
|
185
|
+
: FlatTable<T,IndexType>(0, nullptr, nullptr)
|
|
186
|
+
{
|
|
187
|
+
size = tab2.Size();
|
|
188
|
+
if (size == 0) return;
|
|
189
|
+
|
|
190
|
+
index = new size_t[size+1];
|
|
191
|
+
for (size_t i = 0; i <= size; i++)
|
|
192
|
+
index[i] = tab2.index[i];
|
|
193
|
+
|
|
194
|
+
size_t cnt = index[size];
|
|
195
|
+
data = new T[cnt];
|
|
196
|
+
for (size_t i = 0; i < cnt; i++)
|
|
197
|
+
data[i] = tab2.data[i];
|
|
198
|
+
|
|
199
|
+
mt.Alloc(GetMemUsage());
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
NETGEN_INLINE Table (Table && tab2)
|
|
203
|
+
: FlatTable<T,IndexType>(0, nullptr, nullptr)
|
|
204
|
+
{
|
|
205
|
+
mt = std::move(tab2.mt);
|
|
206
|
+
Swap (size, tab2.size);
|
|
207
|
+
Swap (index, tab2.index);
|
|
208
|
+
Swap (data, tab2.data);
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
template<typename ARCHIVE>
|
|
212
|
+
auto DoArchive(ARCHIVE& ar)
|
|
213
|
+
{
|
|
214
|
+
ar & size;
|
|
215
|
+
if(size == 0)
|
|
216
|
+
return;
|
|
217
|
+
if(ar.Input())
|
|
218
|
+
{
|
|
219
|
+
index = new IndexType[size+1];
|
|
220
|
+
mt.Alloc(sizeof(IndexType) * (size+1));
|
|
221
|
+
}
|
|
222
|
+
ar.Do(index, size+1);
|
|
223
|
+
if(ar.Input())
|
|
224
|
+
{
|
|
225
|
+
data = new T[index[size]];
|
|
226
|
+
mt.Alloc(sizeof(T) * index[size]);
|
|
227
|
+
}
|
|
228
|
+
ar.Do(data, index[size]);
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
NETGEN_INLINE Table & operator= (Table && tab2)
|
|
232
|
+
{
|
|
233
|
+
mt = std::move(tab2.mt);
|
|
234
|
+
Swap (size, tab2.size);
|
|
235
|
+
Swap (index, tab2.index);
|
|
236
|
+
Swap (data, tab2.data);
|
|
237
|
+
return *this;
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
|
|
241
|
+
|
|
242
|
+
/// Delete data
|
|
243
|
+
NETGEN_INLINE ~Table ()
|
|
244
|
+
{
|
|
245
|
+
mt.Free(GetMemUsage());
|
|
246
|
+
delete [] data;
|
|
247
|
+
delete [] index;
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
/// Size of table
|
|
251
|
+
using FlatTable<T,IndexType>::Size;
|
|
252
|
+
|
|
253
|
+
/// number of elements in all rows
|
|
254
|
+
NETGEN_INLINE size_t NElements() const { return index[size]; }
|
|
255
|
+
|
|
256
|
+
using FlatTable<T,IndexType>::operator[];
|
|
257
|
+
|
|
258
|
+
NETGEN_INLINE void StartMemoryTracing (int /* mem_id */)
|
|
259
|
+
{
|
|
260
|
+
mt.Alloc(GetMemUsage());
|
|
261
|
+
}
|
|
262
|
+
const MemoryTracer& GetMemoryTracer() const { return mt; }
|
|
263
|
+
|
|
264
|
+
private:
|
|
265
|
+
size_t GetMemUsage() const { return size == 0 ? 0 : sizeof(T)*index[size] + sizeof(IndexType) * size+1; }
|
|
266
|
+
MemoryTracer mt;
|
|
267
|
+
};
|
|
268
|
+
|
|
269
|
+
|
|
270
|
+
/// Print table
|
|
271
|
+
template <class T, typename IndexType>
|
|
272
|
+
inline ostream & operator<< (ostream & s, const Table<T,IndexType> & table)
|
|
273
|
+
{
|
|
274
|
+
for (auto i : table.Range())
|
|
275
|
+
{
|
|
276
|
+
s << i << ":";
|
|
277
|
+
for (auto el : table[i])
|
|
278
|
+
s << " " << el;
|
|
279
|
+
s << "\n";
|
|
280
|
+
}
|
|
281
|
+
s << std::flush;
|
|
282
|
+
return s;
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
|
|
286
|
+
|
|
287
|
+
|
|
288
|
+
template <class T, typename IndexType=size_t>
|
|
289
|
+
class TableCreator
|
|
290
|
+
{
|
|
291
|
+
protected:
|
|
292
|
+
int mode; // 1 .. cnt, 2 .. cnt entries, 3 .. fill table
|
|
293
|
+
std::atomic<size_t> nd;
|
|
294
|
+
Array<std::atomic<int>,IndexType> cnt;
|
|
295
|
+
Table<T,IndexType> table;
|
|
296
|
+
public:
|
|
297
|
+
TableCreator()
|
|
298
|
+
{ nd = 0; mode = 1; }
|
|
299
|
+
TableCreator (size_t acnt)
|
|
300
|
+
{ nd = acnt; SetMode(2); }
|
|
301
|
+
|
|
302
|
+
Table<T,IndexType> MoveTable()
|
|
303
|
+
{
|
|
304
|
+
return std::move(table);
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
bool Done () { return mode > 3; }
|
|
308
|
+
void operator++(int) { SetMode (mode+1); }
|
|
309
|
+
|
|
310
|
+
int GetMode () const { return mode; }
|
|
311
|
+
void SetMode (int amode)
|
|
312
|
+
{
|
|
313
|
+
mode = amode;
|
|
314
|
+
if (mode == 2)
|
|
315
|
+
{
|
|
316
|
+
// cnt.SetSize(nd); // atomic has no copy
|
|
317
|
+
cnt = Array<std::atomic<int>,IndexType> (nd);
|
|
318
|
+
for (auto & ci : cnt) ci.store (0, std::memory_order_relaxed);
|
|
319
|
+
}
|
|
320
|
+
if (mode == 3)
|
|
321
|
+
{
|
|
322
|
+
table = Table<T,IndexType> (cnt);
|
|
323
|
+
// for (auto & ci : cnt) ci = 0;
|
|
324
|
+
for (auto & ci : cnt) ci.store (0, std::memory_order_relaxed);
|
|
325
|
+
// cnt = 0;
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
|
|
329
|
+
void SetSize (size_t _nd)
|
|
330
|
+
{
|
|
331
|
+
if (mode == 1)
|
|
332
|
+
nd = _nd;
|
|
333
|
+
else
|
|
334
|
+
{
|
|
335
|
+
if (nd != _nd)
|
|
336
|
+
throw Exception ("cannot change size of table-creator");
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
|
|
340
|
+
void Add (IndexType blocknr, const T & data)
|
|
341
|
+
{
|
|
342
|
+
switch (mode)
|
|
343
|
+
{
|
|
344
|
+
case 1:
|
|
345
|
+
{
|
|
346
|
+
size_t oldval = nd;
|
|
347
|
+
while (blocknr-IndexBASE<IndexType>()+1>nd) {
|
|
348
|
+
nd.compare_exchange_weak (oldval, blocknr-IndexBASE<IndexType>()+1);
|
|
349
|
+
oldval = nd;
|
|
350
|
+
}
|
|
351
|
+
break;
|
|
352
|
+
}
|
|
353
|
+
case 2:
|
|
354
|
+
cnt[blocknr]++;
|
|
355
|
+
break;
|
|
356
|
+
case 3:
|
|
357
|
+
int ci = cnt[blocknr]++;
|
|
358
|
+
table[blocknr][ci] = data;
|
|
359
|
+
break;
|
|
360
|
+
}
|
|
361
|
+
}
|
|
362
|
+
|
|
363
|
+
|
|
364
|
+
void Add (IndexType blocknr, IntRange range)
|
|
365
|
+
{
|
|
366
|
+
switch (mode)
|
|
367
|
+
{
|
|
368
|
+
case 1:
|
|
369
|
+
{
|
|
370
|
+
size_t oldval = nd;
|
|
371
|
+
while (blocknr+1>nd) {
|
|
372
|
+
nd.compare_exchange_weak (oldval, blocknr+1);
|
|
373
|
+
oldval = nd;
|
|
374
|
+
}
|
|
375
|
+
break;
|
|
376
|
+
}
|
|
377
|
+
case 2:
|
|
378
|
+
cnt[blocknr] += range.Size();
|
|
379
|
+
break;
|
|
380
|
+
case 3:
|
|
381
|
+
size_t ci = ( cnt[blocknr] += range.Size() ) - range.Size();
|
|
382
|
+
for (size_t j = 0; j < range.Size(); j++)
|
|
383
|
+
table[blocknr][ci+j] = range.First()+j;
|
|
384
|
+
break;
|
|
385
|
+
}
|
|
386
|
+
}
|
|
387
|
+
|
|
388
|
+
void Add (IndexType blocknr, const FlatArray<int> & dofs)
|
|
389
|
+
{
|
|
390
|
+
switch (mode)
|
|
391
|
+
{
|
|
392
|
+
case 1:
|
|
393
|
+
{
|
|
394
|
+
size_t oldval = nd;
|
|
395
|
+
while (blocknr+1>nd) {
|
|
396
|
+
nd.compare_exchange_weak (oldval, blocknr+1);
|
|
397
|
+
oldval = nd;
|
|
398
|
+
}
|
|
399
|
+
break;
|
|
400
|
+
}
|
|
401
|
+
case 2:
|
|
402
|
+
cnt[blocknr] += dofs.Size();
|
|
403
|
+
break;
|
|
404
|
+
case 3:
|
|
405
|
+
size_t ci = ( cnt[blocknr] += dofs.Size() ) - dofs.Size();
|
|
406
|
+
for (size_t j = 0; j < dofs.Size(); j++)
|
|
407
|
+
table[blocknr][ci+j] = dofs[j];
|
|
408
|
+
break;
|
|
409
|
+
}
|
|
410
|
+
}
|
|
411
|
+
};
|
|
412
|
+
|
|
413
|
+
template <typename TEntry, typename TIndex, typename TRange, typename TFunc>
|
|
414
|
+
Table<TEntry, TIndex> CreateTable( const TRange & range, const TFunc & func, std::optional< size_t > cnt )
|
|
415
|
+
{
|
|
416
|
+
static Timer timer("CreateTable");
|
|
417
|
+
RegionTimer rt(timer);
|
|
418
|
+
std::unique_ptr<TableCreator<TEntry, TIndex>> pcreator;
|
|
419
|
+
|
|
420
|
+
if(cnt)
|
|
421
|
+
pcreator = std::make_unique<TableCreator<TEntry, TIndex>>(*cnt);
|
|
422
|
+
else
|
|
423
|
+
pcreator = std::make_unique<TableCreator<TEntry, TIndex>>();
|
|
424
|
+
|
|
425
|
+
auto & creator = *pcreator;
|
|
426
|
+
|
|
427
|
+
for ( ; !creator.Done(); creator++)
|
|
428
|
+
ParallelForRange
|
|
429
|
+
(range, [&] (auto myrange)
|
|
430
|
+
{
|
|
431
|
+
for (auto i : myrange)
|
|
432
|
+
func(creator, i);
|
|
433
|
+
}, TasksPerThread(4)
|
|
434
|
+
);
|
|
435
|
+
|
|
436
|
+
return creator.MoveTable();
|
|
437
|
+
}
|
|
438
|
+
|
|
439
|
+
template <typename TEntry, typename TIndex, typename TRange, typename TFunc>
|
|
440
|
+
Table<TEntry, TIndex> CreateSortedTable( const TRange & range, const TFunc & func, std::optional< size_t > cnt )
|
|
441
|
+
{
|
|
442
|
+
static Timer timer("CreateSortedTable");
|
|
443
|
+
RegionTimer rt(timer);
|
|
444
|
+
Table<TEntry, TIndex> table = CreateTable<TEntry, TIndex>(range, func, cnt);
|
|
445
|
+
ParallelForRange
|
|
446
|
+
(table.Range(), [&] (auto myrange)
|
|
447
|
+
{
|
|
448
|
+
for (auto i : myrange)
|
|
449
|
+
QuickSort(table[i]);
|
|
450
|
+
}, TasksPerThread(4)
|
|
451
|
+
);
|
|
452
|
+
|
|
453
|
+
return table;
|
|
454
|
+
}
|
|
455
|
+
|
|
456
|
+
class NGCORE_API FilteredTableCreator : public TableCreator<int>
|
|
457
|
+
{
|
|
458
|
+
protected:
|
|
459
|
+
const BitArray* takedofs;
|
|
460
|
+
public:
|
|
461
|
+
FilteredTableCreator(const BitArray* atakedofs)
|
|
462
|
+
: TableCreator<int>(), takedofs(atakedofs) { };
|
|
463
|
+
FilteredTableCreator(int acnt, const BitArray* atakedofs)
|
|
464
|
+
: TableCreator<int>(acnt),takedofs(atakedofs) { };
|
|
465
|
+
void SetFilter (const BitArray * atakedofs) { takedofs = atakedofs; }
|
|
466
|
+
void Add (size_t blocknr, int data);
|
|
467
|
+
void Add (size_t blocknr, IntRange range);
|
|
468
|
+
void Add (size_t blocknr, FlatArray<int> dofs);
|
|
469
|
+
};
|
|
470
|
+
|
|
471
|
+
|
|
472
|
+
|
|
473
|
+
|
|
474
|
+
|
|
475
|
+
/**
|
|
476
|
+
A dynamic table class.
|
|
477
|
+
|
|
478
|
+
A DynamicTable contains entries of variable size. Entry sizes can
|
|
479
|
+
be increased dynamically.
|
|
480
|
+
*/
|
|
481
|
+
template <class T, class IndexType = size_t>
|
|
482
|
+
class DynamicTable
|
|
483
|
+
{
|
|
484
|
+
protected:
|
|
485
|
+
static constexpr IndexType BASE = IndexBASE<IndexType>();
|
|
486
|
+
|
|
487
|
+
struct linestruct
|
|
488
|
+
{
|
|
489
|
+
int size;
|
|
490
|
+
int maxsize;
|
|
491
|
+
T * col;
|
|
492
|
+
};
|
|
493
|
+
|
|
494
|
+
Array<linestruct, IndexType> data;
|
|
495
|
+
T * oneblock = nullptr;
|
|
496
|
+
|
|
497
|
+
public:
|
|
498
|
+
/// Creates table of size size
|
|
499
|
+
DynamicTable (int size = 0)
|
|
500
|
+
: data(size)
|
|
501
|
+
{
|
|
502
|
+
for (auto & d : data)
|
|
503
|
+
{
|
|
504
|
+
d.maxsize = 0;
|
|
505
|
+
d.size = 0;
|
|
506
|
+
d.col = nullptr;
|
|
507
|
+
}
|
|
508
|
+
oneblock = nullptr;
|
|
509
|
+
}
|
|
510
|
+
|
|
511
|
+
/// Creates table with a priori fixed entry sizes.
|
|
512
|
+
DynamicTable (const Array<int, IndexType> & entrysizes, bool setentrysize=false)
|
|
513
|
+
: data(entrysizes.Size())
|
|
514
|
+
{
|
|
515
|
+
size_t cnt = 0;
|
|
516
|
+
// size_t n = entrysizes.Size();
|
|
517
|
+
|
|
518
|
+
for (auto es : entrysizes)
|
|
519
|
+
cnt += es;
|
|
520
|
+
oneblock = new T[cnt];
|
|
521
|
+
|
|
522
|
+
cnt = 0;
|
|
523
|
+
for (auto i : data.Range())
|
|
524
|
+
{
|
|
525
|
+
data[i].maxsize = entrysizes[i];
|
|
526
|
+
if (setentrysize)
|
|
527
|
+
data[i].size = entrysizes[i];
|
|
528
|
+
else
|
|
529
|
+
data[i].size = 0;
|
|
530
|
+
data[i].col = &oneblock[cnt];
|
|
531
|
+
cnt += entrysizes[i];
|
|
532
|
+
}
|
|
533
|
+
}
|
|
534
|
+
|
|
535
|
+
DynamicTable (DynamicTable && tab2)
|
|
536
|
+
{
|
|
537
|
+
Swap (data, tab2.data);
|
|
538
|
+
Swap (oneblock, tab2.oneblock);
|
|
539
|
+
}
|
|
540
|
+
|
|
541
|
+
~DynamicTable ()
|
|
542
|
+
{
|
|
543
|
+
if (oneblock)
|
|
544
|
+
delete [] oneblock;
|
|
545
|
+
else
|
|
546
|
+
for (auto & d : data)
|
|
547
|
+
delete [] d.col;
|
|
548
|
+
}
|
|
549
|
+
|
|
550
|
+
DynamicTable & operator= (DynamicTable && tab2)
|
|
551
|
+
{
|
|
552
|
+
Swap (data, tab2.data);
|
|
553
|
+
Swap (oneblock, tab2.oneblock);
|
|
554
|
+
return *this;
|
|
555
|
+
}
|
|
556
|
+
|
|
557
|
+
/// Changes Size of table to size, deletes data
|
|
558
|
+
void SetSize (int size)
|
|
559
|
+
{
|
|
560
|
+
for (auto & d : data)
|
|
561
|
+
delete [] d.col;
|
|
562
|
+
|
|
563
|
+
data.SetSize(size);
|
|
564
|
+
for (auto & d : data)
|
|
565
|
+
{
|
|
566
|
+
d.maxsize = 0;
|
|
567
|
+
d.size = 0;
|
|
568
|
+
d.col = nullptr;
|
|
569
|
+
}
|
|
570
|
+
}
|
|
571
|
+
|
|
572
|
+
void ChangeSize (size_t size)
|
|
573
|
+
{
|
|
574
|
+
if (oneblock)
|
|
575
|
+
throw Exception ("cannot change size of oneblock dynamic table");
|
|
576
|
+
|
|
577
|
+
size_t oldsize = data.Size();
|
|
578
|
+
if (size == oldsize)
|
|
579
|
+
return;
|
|
580
|
+
|
|
581
|
+
if (size < oldsize)
|
|
582
|
+
for (int i = size; i < oldsize; i++)
|
|
583
|
+
delete [] data[i+BASE].col;
|
|
584
|
+
|
|
585
|
+
data.SetSize(size);
|
|
586
|
+
|
|
587
|
+
for (int i = oldsize; i < size; i++)
|
|
588
|
+
{
|
|
589
|
+
data[i+BASE].maxsize = 0;
|
|
590
|
+
data[i+BASE].size = 0;
|
|
591
|
+
data[i+BASE].col = nullptr;
|
|
592
|
+
}
|
|
593
|
+
}
|
|
594
|
+
|
|
595
|
+
|
|
596
|
+
|
|
597
|
+
///
|
|
598
|
+
void IncSize (IndexType i)
|
|
599
|
+
{
|
|
600
|
+
NETGEN_CHECK_RANGE(i,BASE,data.Size()+BASE);
|
|
601
|
+
|
|
602
|
+
linestruct & line = data[i];
|
|
603
|
+
|
|
604
|
+
if (line.size == line.maxsize)
|
|
605
|
+
{
|
|
606
|
+
T * p;
|
|
607
|
+
if constexpr (std::is_default_constructible<T>::value)
|
|
608
|
+
p = new T[(2*line.maxsize+5)];
|
|
609
|
+
else
|
|
610
|
+
p = reinterpret_cast<T*>(new char[(2*line.maxsize+5)*sizeof(T)]);
|
|
611
|
+
for (size_t i = 0; i < line.maxsize; i++)
|
|
612
|
+
p[i] = std::move(line.col[i]);
|
|
613
|
+
// memcpy (p, line.col, line.maxsize * sizeof(T));
|
|
614
|
+
delete [] line.col;
|
|
615
|
+
line.col = p;
|
|
616
|
+
line.maxsize = 2*line.maxsize+5;
|
|
617
|
+
}
|
|
618
|
+
|
|
619
|
+
line.size++;
|
|
620
|
+
}
|
|
621
|
+
|
|
622
|
+
void DecSize (IndexType i)
|
|
623
|
+
{
|
|
624
|
+
NETGEN_CHECK_RANGE(i,BASE,data.Size()+BASE);
|
|
625
|
+
linestruct & line = data[i];
|
|
626
|
+
|
|
627
|
+
#ifdef NETGEN_ENABLE_CHECK_RANGE
|
|
628
|
+
if (line.size == 0)
|
|
629
|
+
throw Exception ("BaseDynamicTable::Dec: EntrySize < 0");
|
|
630
|
+
#endif
|
|
631
|
+
|
|
632
|
+
line.size--;
|
|
633
|
+
}
|
|
634
|
+
|
|
635
|
+
|
|
636
|
+
/// Inserts element acont into row i. Does not test if already used.
|
|
637
|
+
void Add (IndexType i, const T & acont)
|
|
638
|
+
{
|
|
639
|
+
if (data[i].size == data[i].maxsize)
|
|
640
|
+
this->IncSize (i);
|
|
641
|
+
else
|
|
642
|
+
data[i].size++;
|
|
643
|
+
data[i].col[data[i].size-1] = acont;
|
|
644
|
+
}
|
|
645
|
+
|
|
646
|
+
/// Inserts element acont into row i, iff not yet exists.
|
|
647
|
+
void AddUnique (IndexType i, const T & cont)
|
|
648
|
+
{
|
|
649
|
+
int es = EntrySize (i);
|
|
650
|
+
T * line = data[i].col;
|
|
651
|
+
for (int j = 0; j < es; j++)
|
|
652
|
+
if (line[j] == cont)
|
|
653
|
+
return;
|
|
654
|
+
Add (i, cont);
|
|
655
|
+
}
|
|
656
|
+
|
|
657
|
+
|
|
658
|
+
/// Inserts element acont into row i. Does not test if already used.
|
|
659
|
+
void AddEmpty (IndexType i)
|
|
660
|
+
{
|
|
661
|
+
IncSize (i);
|
|
662
|
+
}
|
|
663
|
+
|
|
664
|
+
/** Set the nr-th element in the i-th row to acont.
|
|
665
|
+
Does not check for overflow. */
|
|
666
|
+
void Set (IndexType i, int nr, const T & acont)
|
|
667
|
+
{
|
|
668
|
+
data[i].col[nr] = acont;
|
|
669
|
+
}
|
|
670
|
+
|
|
671
|
+
|
|
672
|
+
/** Returns the nr-th element in the i-th row.
|
|
673
|
+
Does not check for overflow. */
|
|
674
|
+
const T & Get (IndexType i, int nr) const
|
|
675
|
+
{
|
|
676
|
+
return data[i].col[nr];
|
|
677
|
+
}
|
|
678
|
+
|
|
679
|
+
|
|
680
|
+
/** Returns pointer to the first element in row i. */
|
|
681
|
+
const T * GetLine (IndexType i) const
|
|
682
|
+
{
|
|
683
|
+
return data[i].col;
|
|
684
|
+
}
|
|
685
|
+
|
|
686
|
+
/// Returns size of the table.
|
|
687
|
+
size_t Size () const
|
|
688
|
+
{
|
|
689
|
+
return data.Size();
|
|
690
|
+
}
|
|
691
|
+
|
|
692
|
+
auto Range () const
|
|
693
|
+
{
|
|
694
|
+
return data.Range();
|
|
695
|
+
}
|
|
696
|
+
|
|
697
|
+
/// Returns size of the i-th row.
|
|
698
|
+
int EntrySize (IndexType i) const
|
|
699
|
+
{
|
|
700
|
+
return data[i].size;
|
|
701
|
+
}
|
|
702
|
+
|
|
703
|
+
///
|
|
704
|
+
void DecEntrySize (IndexType i)
|
|
705
|
+
{
|
|
706
|
+
DecSize(i);
|
|
707
|
+
}
|
|
708
|
+
|
|
709
|
+
/// Access entry i
|
|
710
|
+
FlatArray<T> operator[] (IndexType i)
|
|
711
|
+
{
|
|
712
|
+
return FlatArray<T> (data[i].size, data[i].col);
|
|
713
|
+
}
|
|
714
|
+
|
|
715
|
+
/*
|
|
716
|
+
typedef const FlatArray<T> ConstFlatArray;
|
|
717
|
+
/// Access entry i
|
|
718
|
+
ConstFlatArray operator[] (int i) const
|
|
719
|
+
{ return FlatArray<T> (data[i].size, static_cast<T*> (data[i].col)); }
|
|
720
|
+
*/
|
|
721
|
+
FlatArray<T> operator[] (IndexType i) const
|
|
722
|
+
{
|
|
723
|
+
return FlatArray<T> (data[i].size, data[i].col);
|
|
724
|
+
}
|
|
725
|
+
};
|
|
726
|
+
|
|
727
|
+
|
|
728
|
+
/// Print table
|
|
729
|
+
template <class T>
|
|
730
|
+
inline ostream & operator<< (ostream & s, const DynamicTable<T> & table)
|
|
731
|
+
{
|
|
732
|
+
for (auto i : Range(table))
|
|
733
|
+
{
|
|
734
|
+
s << i << ":";
|
|
735
|
+
for (int j = 0; j < table[i].Size(); j++)
|
|
736
|
+
s << " " << table[i][j];
|
|
737
|
+
s << "\n";
|
|
738
|
+
}
|
|
739
|
+
s << std::flush;
|
|
740
|
+
return s;
|
|
741
|
+
}
|
|
742
|
+
|
|
743
|
+
|
|
744
|
+
// Helper function to calculate coloring of a set of indices for parallel processing of independent elements/points/etc.
|
|
745
|
+
// Assigns a color to each of colors.Size() elements, such that two elements with the same color don't share a common 'dof',
|
|
746
|
+
// the mapping from element to dofs is provided by the function getDofs(int) -> iterable<int>
|
|
747
|
+
//
|
|
748
|
+
// Returns the number of used colors
|
|
749
|
+
template <typename Tmask>
|
|
750
|
+
int ComputeColoring( FlatArray<int> colors, size_t ndofs, Tmask const & getDofs)
|
|
751
|
+
{
|
|
752
|
+
static Timer timer("ComputeColoring - "+Demangle(typeid(Tmask).name())); RegionTimer rt(timer);
|
|
753
|
+
static_assert(sizeof(unsigned int)==4, "Adapt type of mask array");
|
|
754
|
+
size_t n = colors.Size();
|
|
755
|
+
|
|
756
|
+
Array<unsigned int> mask(ndofs);
|
|
757
|
+
|
|
758
|
+
size_t colored_blocks = 0;
|
|
759
|
+
|
|
760
|
+
// We are coloring with 32 colors at once and use each bit to mask conflicts
|
|
761
|
+
unsigned int check = 0;
|
|
762
|
+
unsigned int checkbit = 0;
|
|
763
|
+
|
|
764
|
+
int current_color = 0;
|
|
765
|
+
colors = -1;
|
|
766
|
+
int maxcolor = 0;
|
|
767
|
+
|
|
768
|
+
while(colored_blocks<n)
|
|
769
|
+
{
|
|
770
|
+
mask = 0;
|
|
771
|
+
for (auto i : Range(n) )
|
|
772
|
+
{
|
|
773
|
+
if(colors[i]>-1) continue;
|
|
774
|
+
check = 0;
|
|
775
|
+
const auto & dofs = getDofs(i);
|
|
776
|
+
|
|
777
|
+
// Check if adjacent dofs are already marked by current color
|
|
778
|
+
for (auto dof : dofs)
|
|
779
|
+
check|=mask[dof];
|
|
780
|
+
|
|
781
|
+
// Did we find a free color?
|
|
782
|
+
if(check != 0xFFFFFFFF)
|
|
783
|
+
{
|
|
784
|
+
checkbit = 1;
|
|
785
|
+
int color = current_color;
|
|
786
|
+
// find the actual color, which is free (out of 32)
|
|
787
|
+
while (check & checkbit)
|
|
788
|
+
{
|
|
789
|
+
color++;
|
|
790
|
+
checkbit *= 2;
|
|
791
|
+
}
|
|
792
|
+
colors[i] = color;
|
|
793
|
+
maxcolor = color > maxcolor ? color : maxcolor;
|
|
794
|
+
colored_blocks++;
|
|
795
|
+
// mask all adjacent dofs with the found color
|
|
796
|
+
for (auto dof : dofs)
|
|
797
|
+
mask[dof] |= checkbit;
|
|
798
|
+
}
|
|
799
|
+
}
|
|
800
|
+
current_color+=32;
|
|
801
|
+
}
|
|
802
|
+
return maxcolor+1;
|
|
803
|
+
}
|
|
804
|
+
|
|
805
|
+
|
|
806
|
+
typedef DynamicTable<int> IntTable;
|
|
807
|
+
|
|
808
|
+
} // namespace ngcore
|
|
809
|
+
|
|
810
|
+
#endif // NETGEN_CORE_TABLE_HPP
|