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.
Files changed (340) hide show
  1. netgen/NgOCC.py +7 -0
  2. netgen/__init__.py +114 -0
  3. netgen/__init__.pyi +22 -0
  4. netgen/__main__.py +53 -0
  5. netgen/cmake/NetgenConfig.cmake +79 -0
  6. netgen/cmake/netgen-targets-release.cmake +69 -0
  7. netgen/cmake/netgen-targets.cmake +146 -0
  8. netgen/config/__init__.py +1 -0
  9. netgen/config/__init__.pyi +52 -0
  10. netgen/config/__main__.py +4 -0
  11. netgen/config/config.py +68 -0
  12. netgen/config/config.pyi +54 -0
  13. netgen/csg.py +25 -0
  14. netgen/geom2d.py +178 -0
  15. netgen/gui.py +82 -0
  16. netgen/include/core/archive.hpp +1256 -0
  17. netgen/include/core/array.hpp +1760 -0
  18. netgen/include/core/autodiff.hpp +1131 -0
  19. netgen/include/core/autodiffdiff.hpp +733 -0
  20. netgen/include/core/bitarray.hpp +240 -0
  21. netgen/include/core/concurrentqueue.h +3619 -0
  22. netgen/include/core/exception.hpp +145 -0
  23. netgen/include/core/flags.hpp +199 -0
  24. netgen/include/core/hashtable.hpp +1281 -0
  25. netgen/include/core/localheap.hpp +318 -0
  26. netgen/include/core/logging.hpp +117 -0
  27. netgen/include/core/memtracer.hpp +221 -0
  28. netgen/include/core/mpi4py_pycapi.h +245 -0
  29. netgen/include/core/mpi_wrapper.hpp +643 -0
  30. netgen/include/core/ng_mpi.hpp +94 -0
  31. netgen/include/core/ng_mpi_generated_declarations.hpp +155 -0
  32. netgen/include/core/ng_mpi_native.hpp +25 -0
  33. netgen/include/core/ngcore.hpp +32 -0
  34. netgen/include/core/ngcore_api.hpp +152 -0
  35. netgen/include/core/ngstream.hpp +115 -0
  36. netgen/include/core/paje_trace.hpp +279 -0
  37. netgen/include/core/profiler.hpp +382 -0
  38. netgen/include/core/python_ngcore.hpp +457 -0
  39. netgen/include/core/ranges.hpp +109 -0
  40. netgen/include/core/register_archive.hpp +100 -0
  41. netgen/include/core/signal.hpp +82 -0
  42. netgen/include/core/simd.hpp +160 -0
  43. netgen/include/core/simd_arm64.hpp +407 -0
  44. netgen/include/core/simd_avx.hpp +394 -0
  45. netgen/include/core/simd_avx512.hpp +285 -0
  46. netgen/include/core/simd_generic.hpp +1053 -0
  47. netgen/include/core/simd_math.hpp +178 -0
  48. netgen/include/core/simd_sse.hpp +289 -0
  49. netgen/include/core/statushandler.hpp +37 -0
  50. netgen/include/core/symboltable.hpp +153 -0
  51. netgen/include/core/table.hpp +810 -0
  52. netgen/include/core/taskmanager.hpp +1161 -0
  53. netgen/include/core/type_traits.hpp +65 -0
  54. netgen/include/core/utils.hpp +385 -0
  55. netgen/include/core/version.hpp +102 -0
  56. netgen/include/core/xbool.hpp +47 -0
  57. netgen/include/csg/algprim.hpp +563 -0
  58. netgen/include/csg/brick.hpp +150 -0
  59. netgen/include/csg/csg.hpp +43 -0
  60. netgen/include/csg/csgeom.hpp +389 -0
  61. netgen/include/csg/csgparser.hpp +101 -0
  62. netgen/include/csg/curve2d.hpp +67 -0
  63. netgen/include/csg/edgeflw.hpp +112 -0
  64. netgen/include/csg/explicitcurve2d.hpp +113 -0
  65. netgen/include/csg/extrusion.hpp +185 -0
  66. netgen/include/csg/gencyl.hpp +70 -0
  67. netgen/include/csg/geoml.hpp +16 -0
  68. netgen/include/csg/identify.hpp +213 -0
  69. netgen/include/csg/manifold.hpp +29 -0
  70. netgen/include/csg/meshsurf.hpp +46 -0
  71. netgen/include/csg/polyhedra.hpp +121 -0
  72. netgen/include/csg/revolution.hpp +180 -0
  73. netgen/include/csg/singularref.hpp +84 -0
  74. netgen/include/csg/solid.hpp +295 -0
  75. netgen/include/csg/specpoin.hpp +194 -0
  76. netgen/include/csg/spline3d.hpp +99 -0
  77. netgen/include/csg/splinesurface.hpp +85 -0
  78. netgen/include/csg/surface.hpp +394 -0
  79. netgen/include/csg/triapprox.hpp +63 -0
  80. netgen/include/csg/vscsg.hpp +34 -0
  81. netgen/include/general/autodiff.hpp +356 -0
  82. netgen/include/general/autoptr.hpp +39 -0
  83. netgen/include/general/gzstream.h +121 -0
  84. netgen/include/general/hashtabl.hpp +1692 -0
  85. netgen/include/general/myadt.hpp +48 -0
  86. netgen/include/general/mystring.hpp +226 -0
  87. netgen/include/general/netgenout.hpp +205 -0
  88. netgen/include/general/ngarray.hpp +797 -0
  89. netgen/include/general/ngbitarray.hpp +149 -0
  90. netgen/include/general/ngpython.hpp +74 -0
  91. netgen/include/general/optmem.hpp +44 -0
  92. netgen/include/general/parthreads.hpp +138 -0
  93. netgen/include/general/seti.hpp +50 -0
  94. netgen/include/general/sort.hpp +47 -0
  95. netgen/include/general/spbita2d.hpp +59 -0
  96. netgen/include/general/stack.hpp +114 -0
  97. netgen/include/general/table.hpp +280 -0
  98. netgen/include/general/template.hpp +509 -0
  99. netgen/include/geom2d/csg2d.hpp +750 -0
  100. netgen/include/geom2d/geometry2d.hpp +280 -0
  101. netgen/include/geom2d/spline2d.hpp +234 -0
  102. netgen/include/geom2d/vsgeom2d.hpp +28 -0
  103. netgen/include/gprim/adtree.hpp +1392 -0
  104. netgen/include/gprim/geom2d.hpp +858 -0
  105. netgen/include/gprim/geom3d.hpp +749 -0
  106. netgen/include/gprim/geomfuncs.hpp +212 -0
  107. netgen/include/gprim/geomobjects.hpp +544 -0
  108. netgen/include/gprim/geomops.hpp +404 -0
  109. netgen/include/gprim/geomtest3d.hpp +101 -0
  110. netgen/include/gprim/gprim.hpp +33 -0
  111. netgen/include/gprim/spline.hpp +778 -0
  112. netgen/include/gprim/splinegeometry.hpp +73 -0
  113. netgen/include/gprim/transform3d.hpp +216 -0
  114. netgen/include/include/acisgeom.hpp +3 -0
  115. netgen/include/include/csg.hpp +1 -0
  116. netgen/include/include/geometry2d.hpp +1 -0
  117. netgen/include/include/gprim.hpp +1 -0
  118. netgen/include/include/incopengl.hpp +62 -0
  119. netgen/include/include/inctcl.hpp +13 -0
  120. netgen/include/include/incvis.hpp +6 -0
  121. netgen/include/include/linalg.hpp +1 -0
  122. netgen/include/include/meshing.hpp +1 -0
  123. netgen/include/include/myadt.hpp +1 -0
  124. netgen/include/include/mydefs.hpp +70 -0
  125. netgen/include/include/mystdlib.h +59 -0
  126. netgen/include/include/netgen_config.hpp +27 -0
  127. netgen/include/include/netgen_version.hpp +9 -0
  128. netgen/include/include/nginterface_v2_impl.hpp +395 -0
  129. netgen/include/include/ngsimd.hpp +1 -0
  130. netgen/include/include/occgeom.hpp +1 -0
  131. netgen/include/include/opti.hpp +1 -0
  132. netgen/include/include/parallel.hpp +1 -0
  133. netgen/include/include/stlgeom.hpp +1 -0
  134. netgen/include/include/visual.hpp +1 -0
  135. netgen/include/interface/rw_medit.hpp +11 -0
  136. netgen/include/interface/writeuser.hpp +80 -0
  137. netgen/include/linalg/densemat.hpp +414 -0
  138. netgen/include/linalg/linalg.hpp +29 -0
  139. netgen/include/linalg/opti.hpp +142 -0
  140. netgen/include/linalg/polynomial.hpp +47 -0
  141. netgen/include/linalg/vector.hpp +217 -0
  142. netgen/include/meshing/adfront2.hpp +274 -0
  143. netgen/include/meshing/adfront3.hpp +332 -0
  144. netgen/include/meshing/basegeom.hpp +370 -0
  145. netgen/include/meshing/bcfunctions.hpp +53 -0
  146. netgen/include/meshing/bisect.hpp +72 -0
  147. netgen/include/meshing/boundarylayer.hpp +113 -0
  148. netgen/include/meshing/classifyhpel.hpp +1984 -0
  149. netgen/include/meshing/clusters.hpp +46 -0
  150. netgen/include/meshing/curvedelems.hpp +274 -0
  151. netgen/include/meshing/delaunay2d.hpp +73 -0
  152. netgen/include/meshing/fieldlines.hpp +103 -0
  153. netgen/include/meshing/findip.hpp +198 -0
  154. netgen/include/meshing/findip2.hpp +103 -0
  155. netgen/include/meshing/geomsearch.hpp +69 -0
  156. netgen/include/meshing/global.hpp +54 -0
  157. netgen/include/meshing/hpref_hex.hpp +330 -0
  158. netgen/include/meshing/hpref_prism.hpp +3405 -0
  159. netgen/include/meshing/hpref_pyramid.hpp +154 -0
  160. netgen/include/meshing/hpref_quad.hpp +2082 -0
  161. netgen/include/meshing/hpref_segm.hpp +122 -0
  162. netgen/include/meshing/hpref_tet.hpp +4230 -0
  163. netgen/include/meshing/hpref_trig.hpp +848 -0
  164. netgen/include/meshing/hprefinement.hpp +366 -0
  165. netgen/include/meshing/improve2.hpp +178 -0
  166. netgen/include/meshing/improve3.hpp +151 -0
  167. netgen/include/meshing/localh.hpp +223 -0
  168. netgen/include/meshing/meshclass.hpp +1076 -0
  169. netgen/include/meshing/meshfunc.hpp +47 -0
  170. netgen/include/meshing/meshing.hpp +63 -0
  171. netgen/include/meshing/meshing2.hpp +163 -0
  172. netgen/include/meshing/meshing3.hpp +123 -0
  173. netgen/include/meshing/meshtool.hpp +90 -0
  174. netgen/include/meshing/meshtype.hpp +1930 -0
  175. netgen/include/meshing/msghandler.hpp +62 -0
  176. netgen/include/meshing/paralleltop.hpp +172 -0
  177. netgen/include/meshing/python_mesh.hpp +206 -0
  178. netgen/include/meshing/ruler2.hpp +172 -0
  179. netgen/include/meshing/ruler3.hpp +211 -0
  180. netgen/include/meshing/soldata.hpp +141 -0
  181. netgen/include/meshing/specials.hpp +17 -0
  182. netgen/include/meshing/surfacegeom.hpp +73 -0
  183. netgen/include/meshing/topology.hpp +1003 -0
  184. netgen/include/meshing/validate.hpp +21 -0
  185. netgen/include/meshing/visual_interface.hpp +71 -0
  186. netgen/include/mydefs.hpp +70 -0
  187. netgen/include/nginterface.h +474 -0
  188. netgen/include/nginterface_v2.hpp +406 -0
  189. netgen/include/nglib.h +697 -0
  190. netgen/include/nglib_occ.h +50 -0
  191. netgen/include/occ/occ_edge.hpp +47 -0
  192. netgen/include/occ/occ_face.hpp +52 -0
  193. netgen/include/occ/occ_solid.hpp +23 -0
  194. netgen/include/occ/occ_utils.hpp +376 -0
  195. netgen/include/occ/occ_vertex.hpp +30 -0
  196. netgen/include/occ/occgeom.hpp +659 -0
  197. netgen/include/occ/occmeshsurf.hpp +168 -0
  198. netgen/include/occ/vsocc.hpp +33 -0
  199. netgen/include/pybind11/LICENSE +29 -0
  200. netgen/include/pybind11/attr.h +722 -0
  201. netgen/include/pybind11/buffer_info.h +208 -0
  202. netgen/include/pybind11/cast.h +2361 -0
  203. netgen/include/pybind11/chrono.h +228 -0
  204. netgen/include/pybind11/common.h +2 -0
  205. netgen/include/pybind11/complex.h +74 -0
  206. netgen/include/pybind11/conduit/README.txt +15 -0
  207. netgen/include/pybind11/conduit/pybind11_conduit_v1.h +116 -0
  208. netgen/include/pybind11/conduit/pybind11_platform_abi_id.h +87 -0
  209. netgen/include/pybind11/conduit/wrap_include_python_h.h +72 -0
  210. netgen/include/pybind11/critical_section.h +56 -0
  211. netgen/include/pybind11/detail/class.h +823 -0
  212. netgen/include/pybind11/detail/common.h +1348 -0
  213. netgen/include/pybind11/detail/cpp_conduit.h +75 -0
  214. netgen/include/pybind11/detail/descr.h +226 -0
  215. netgen/include/pybind11/detail/dynamic_raw_ptr_cast_if_possible.h +39 -0
  216. netgen/include/pybind11/detail/exception_translation.h +71 -0
  217. netgen/include/pybind11/detail/function_record_pyobject.h +191 -0
  218. netgen/include/pybind11/detail/init.h +538 -0
  219. netgen/include/pybind11/detail/internals.h +799 -0
  220. netgen/include/pybind11/detail/native_enum_data.h +209 -0
  221. netgen/include/pybind11/detail/pybind11_namespace_macros.h +82 -0
  222. netgen/include/pybind11/detail/struct_smart_holder.h +378 -0
  223. netgen/include/pybind11/detail/type_caster_base.h +1591 -0
  224. netgen/include/pybind11/detail/typeid.h +65 -0
  225. netgen/include/pybind11/detail/using_smart_holder.h +22 -0
  226. netgen/include/pybind11/detail/value_and_holder.h +90 -0
  227. netgen/include/pybind11/eigen/common.h +9 -0
  228. netgen/include/pybind11/eigen/matrix.h +723 -0
  229. netgen/include/pybind11/eigen/tensor.h +521 -0
  230. netgen/include/pybind11/eigen.h +12 -0
  231. netgen/include/pybind11/embed.h +320 -0
  232. netgen/include/pybind11/eval.h +161 -0
  233. netgen/include/pybind11/functional.h +147 -0
  234. netgen/include/pybind11/gil.h +199 -0
  235. netgen/include/pybind11/gil_safe_call_once.h +102 -0
  236. netgen/include/pybind11/gil_simple.h +37 -0
  237. netgen/include/pybind11/iostream.h +265 -0
  238. netgen/include/pybind11/native_enum.h +67 -0
  239. netgen/include/pybind11/numpy.h +2312 -0
  240. netgen/include/pybind11/operators.h +202 -0
  241. netgen/include/pybind11/options.h +92 -0
  242. netgen/include/pybind11/pybind11.h +3645 -0
  243. netgen/include/pybind11/pytypes.h +2680 -0
  244. netgen/include/pybind11/stl/filesystem.h +114 -0
  245. netgen/include/pybind11/stl.h +666 -0
  246. netgen/include/pybind11/stl_bind.h +858 -0
  247. netgen/include/pybind11/subinterpreter.h +299 -0
  248. netgen/include/pybind11/trampoline_self_life_support.h +65 -0
  249. netgen/include/pybind11/type_caster_pyobject_ptr.h +61 -0
  250. netgen/include/pybind11/typing.h +298 -0
  251. netgen/include/pybind11/warnings.h +75 -0
  252. netgen/include/stlgeom/meshstlsurface.hpp +67 -0
  253. netgen/include/stlgeom/stlgeom.hpp +491 -0
  254. netgen/include/stlgeom/stlline.hpp +193 -0
  255. netgen/include/stlgeom/stltool.hpp +331 -0
  256. netgen/include/stlgeom/stltopology.hpp +419 -0
  257. netgen/include/stlgeom/vsstl.hpp +58 -0
  258. netgen/include/visualization/meshdoc.hpp +42 -0
  259. netgen/include/visualization/mvdraw.hpp +325 -0
  260. netgen/include/visualization/vispar.hpp +128 -0
  261. netgen/include/visualization/visual.hpp +28 -0
  262. netgen/include/visualization/visual_api.hpp +10 -0
  263. netgen/include/visualization/vssolution.hpp +399 -0
  264. netgen/lib/libnggui.lib +0 -0
  265. netgen/lib/ngcore.lib +0 -0
  266. netgen/lib/nglib.lib +0 -0
  267. netgen/lib/togl.lib +0 -0
  268. netgen/libnggui.dll +0 -0
  269. netgen/libngguipy.lib +0 -0
  270. netgen/libngguipy.pyd +0 -0
  271. netgen/libngpy/_NgOCC.pyi +1545 -0
  272. netgen/libngpy/__init__.pyi +7 -0
  273. netgen/libngpy/_csg.pyi +259 -0
  274. netgen/libngpy/_geom2d.pyi +323 -0
  275. netgen/libngpy/_meshing.pyi +1111 -0
  276. netgen/libngpy/_stl.pyi +131 -0
  277. netgen/libngpy.lib +0 -0
  278. netgen/libngpy.pyd +0 -0
  279. netgen/meshing.py +65 -0
  280. netgen/ngcore.dll +0 -0
  281. netgen/nglib.dll +0 -0
  282. netgen/occ.py +52 -0
  283. netgen/read_gmsh.py +259 -0
  284. netgen/read_meshio.py +22 -0
  285. netgen/stl.py +2 -0
  286. netgen/togl.dll +0 -0
  287. netgen/version.py +2 -0
  288. netgen/webgui.py +529 -0
  289. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/boundarycondition.geo +16 -0
  290. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/boxcyl.geo +32 -0
  291. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/circle_on_cube.geo +27 -0
  292. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/cone.geo +13 -0
  293. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/cube.geo +16 -0
  294. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/cubeandring.geo +55 -0
  295. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/cubeandspheres.geo +21 -0
  296. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/cubemcyl.geo +18 -0
  297. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/cubemsphere.geo +19 -0
  298. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/cylinder.geo +12 -0
  299. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/cylsphere.geo +12 -0
  300. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/doc/ng4.pdf +0 -0
  301. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/ellipsoid.geo +8 -0
  302. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/ellipticcyl.geo +10 -0
  303. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/extrusion.geo +99 -0
  304. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/fichera.geo +24 -0
  305. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/frame.step +11683 -0
  306. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/hinge.stl +8486 -0
  307. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/lshape3d.geo +26 -0
  308. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/manyholes.geo +26 -0
  309. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/manyholes2.geo +26 -0
  310. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/matrix.geo +27 -0
  311. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/ortho.geo +11 -0
  312. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/part1.stl +2662 -0
  313. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/period.geo +33 -0
  314. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/py_tutorials/exportNeutral.py +26 -0
  315. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/py_tutorials/mesh.py +19 -0
  316. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/py_tutorials/shaft.geo +65 -0
  317. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/revolution.geo +18 -0
  318. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/screw.step +1694 -0
  319. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/sculpture.geo +13 -0
  320. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/shaft.geo +65 -0
  321. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/shell.geo +10 -0
  322. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/sphere.geo +8 -0
  323. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/sphereincube.geo +17 -0
  324. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/square.in2d +35 -0
  325. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/squarecircle.in2d +48 -0
  326. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/squarehole.in2d +47 -0
  327. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/torus.geo +8 -0
  328. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/trafo.geo +57 -0
  329. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/twobricks.geo +15 -0
  330. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/twocubes.geo +18 -0
  331. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/twocyl.geo +16 -0
  332. netgen_mesher-6.2.2506.post35.dev0.dist-info/METADATA +15 -0
  333. netgen_mesher-6.2.2506.post35.dev0.dist-info/RECORD +340 -0
  334. netgen_mesher-6.2.2506.post35.dev0.dist-info/WHEEL +5 -0
  335. netgen_mesher-6.2.2506.post35.dev0.dist-info/entry_points.txt +2 -0
  336. netgen_mesher-6.2.2506.post35.dev0.dist-info/licenses/AUTHORS +1 -0
  337. netgen_mesher-6.2.2506.post35.dev0.dist-info/licenses/LICENSE +504 -0
  338. netgen_mesher-6.2.2506.post35.dev0.dist-info/top_level.txt +2 -0
  339. pyngcore/__init__.py +1 -0
  340. 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