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,82 @@
1
+ #ifndef NGCORE_SIGNALS_HPP
2
+ #define NGCORE_SIGNALS_HPP
3
+
4
+ #include <list>
5
+ #include <map>
6
+ #include <functional>
7
+
8
+ namespace ngcore
9
+ {
10
+ template<typename ... ParameterTypes>
11
+ class Signal
12
+ {
13
+ private:
14
+ std::list<std::function<bool(ParameterTypes...)>> funcs;
15
+ bool is_emitting;
16
+ public:
17
+ Signal() : is_emitting(true) {}
18
+
19
+ template<typename Cls, typename FUNC>
20
+ void Connect(Cls* self, FUNC f)
21
+ {
22
+ auto ptr = self->weak_from_this();
23
+ auto func = [ptr, f](ParameterTypes... args)
24
+ {
25
+ if (ptr.expired())
26
+ return false;
27
+ f(args...);
28
+ return true;
29
+ };
30
+ funcs.push_back(func);
31
+ }
32
+
33
+ inline void Emit(ParameterTypes ...args)
34
+ {
35
+ if(is_emitting)
36
+ funcs.remove_if([&](auto& f){ return !f(args...); });
37
+ }
38
+
39
+ inline bool SetEmitting(bool emitting)
40
+ {
41
+ bool was_emitting = is_emitting;
42
+ is_emitting = emitting;
43
+ return was_emitting;
44
+ }
45
+ inline bool GetEmitting() const { return is_emitting; }
46
+ };
47
+
48
+
49
+
50
+
51
+ class SimpleSignal
52
+ {
53
+ private:
54
+ // std::map<void*,std::function<void()>> funcs;
55
+ std::list<std::pair<void*,std::function<void()>>> funcs;
56
+ public:
57
+ SimpleSignal() = default;
58
+
59
+ template<typename FUNC>
60
+ void Connect(void* var, FUNC f)
61
+ {
62
+ // funcs[var] = f;
63
+ funcs.push_back ( { var, f } );
64
+ }
65
+
66
+ void Remove(void* var)
67
+ {
68
+ // funcs.erase(var);
69
+ funcs.remove_if([&] (auto var_f) { return var_f.first==var; });
70
+ }
71
+
72
+ inline void Emit()
73
+ {
74
+ for (auto [key,f] : funcs)
75
+ f();
76
+ }
77
+ };
78
+
79
+
80
+ } // namespace ngcore
81
+
82
+ #endif // NGCORE_SIGNALS_HPP
@@ -0,0 +1,160 @@
1
+ #ifndef NETGEN_CORE_SIMD_HPP
2
+ #define NETGEN_CORE_SIMD_HPP
3
+
4
+ /**************************************************************************/
5
+ /* File: simd.hpp */
6
+ /* Author: Joachim Schoeberl, Matthias Hochsteger */
7
+ /* Date: 25. Mar. 16 */
8
+ /**************************************************************************/
9
+
10
+ #include <array>
11
+ #include <tuple>
12
+ #include "ngcore_api.hpp"
13
+ #include "simd_generic.hpp"
14
+
15
+
16
+ #ifndef __CUDA_ARCH__
17
+
18
+ #ifdef NETGEN_ARCH_AMD64
19
+ #ifndef __SSE__
20
+ #define __SSE__
21
+ #endif
22
+ #include "simd_sse.hpp"
23
+ #endif
24
+
25
+ #ifdef __AVX__
26
+ #include "simd_avx.hpp"
27
+ #endif
28
+
29
+ #ifdef __AVX512F__
30
+ #include "simd_avx512.hpp"
31
+ #endif
32
+
33
+ #ifdef __aarch64__
34
+ #include "simd_arm64.hpp"
35
+ #endif
36
+
37
+ #endif // __CUDA_ARCH__
38
+
39
+ namespace ngcore
40
+ {
41
+ #ifndef __CUDA_ARCH__
42
+ #ifdef NETGEN_ARCH_AMD64
43
+ /*
44
+ NETGEN_INLINE auto HSum (SIMD<double,2> v1, SIMD<double,2> v2, SIMD<double,2> v3, SIMD<double,2> v4)
45
+ {
46
+ SIMD<double,2> hsum1 = my_mm_hadd_pd (v1.Data(), v2.Data());
47
+ SIMD<double,2> hsum2 = my_mm_hadd_pd (v3.Data(), v4.Data());
48
+ return SIMD<double,4> (hsum1, hsum2);
49
+ }
50
+ */
51
+
52
+ NETGEN_INLINE auto GetMaskFromBits( unsigned int i )
53
+ {
54
+ return SIMD<mask64>::GetMaskFromBits(i);
55
+ }
56
+ #endif
57
+ #endif // __CUDA_ARCH__
58
+
59
+ NETGEN_INLINE void SIMDTranspose (SIMD<double,4> a1, SIMD<double,4> a2, SIMD <double,4> a3, SIMD<double,4> a4,
60
+ SIMD<double,4> & b1, SIMD<double,4> & b2, SIMD<double,4> & b3, SIMD<double,4> & b4)
61
+ {
62
+ if constexpr (sizeof(a1.Lo()) == 16)
63
+ {
64
+ auto [h1,h2] = Unpack(a1,a2);
65
+ auto [h3,h4] = Unpack(a3,a4);
66
+ b1 = SIMD<double,4> (h1.Lo(), h3.Lo());
67
+ b2 = SIMD<double,4> (h2.Lo(), h4.Lo());
68
+ b3 = SIMD<double,4> (h1.Hi(), h3.Hi());
69
+ b4 = SIMD<double,4> (h2.Hi(), h4.Hi());
70
+ }
71
+ else
72
+ {
73
+ b1 = SIMD<double,4> (a1[0], a2[0], a3[0], a4[0]);
74
+ b2 = SIMD<double,4> (a1[1], a2[1], a3[1], a4[1]);
75
+ b3 = SIMD<double,4> (a1[2], a2[2], a3[2], a4[2]);
76
+ b4 = SIMD<double,4> (a1[3], a2[3], a3[3], a4[3]);
77
+ }
78
+ }
79
+
80
+ template<int N>
81
+ NETGEN_INLINE auto HSum (SIMD<double,N> s1, SIMD<double,N> s2)
82
+ {
83
+ return SIMD<double,2>(HSum(s1), HSum(s2));
84
+ }
85
+
86
+ template<int N>
87
+ NETGEN_INLINE auto HSum (SIMD<double,N> s1, SIMD<double,N> s2, SIMD<double,N> s3, SIMD<double,N> s4 )
88
+ {
89
+ // return SIMD<double,4>(HSum(s1), HSum(s2), HSum(s3), HSum(s4));
90
+ return SIMD<double,4>(HSum(s1, s2), HSum(s3,s4));
91
+ }
92
+
93
+
94
+
95
+ template <typename T, size_t S> class MakeSimdCl;
96
+
97
+ template <typename T, size_t S>
98
+ auto MakeSimd (std::array<T,S> aa) { return MakeSimdCl(aa).Get(); }
99
+
100
+
101
+ template <typename T, size_t S>
102
+ class MakeSimdCl
103
+ {
104
+ std::array<T,S> a;
105
+ public:
106
+ MakeSimdCl (std::array<T,S> aa) : a(aa) { ; }
107
+ auto Get() const
108
+ {
109
+ SIMD<T,S> sa( [this] (auto i) { return (this->a)[i]; });
110
+ return sa;
111
+ }
112
+ };
113
+
114
+
115
+
116
+
117
+ template <typename Tfirst, size_t S, typename ...Trest>
118
+ class MakeSimdCl<std::tuple<Tfirst,Trest...>,S>
119
+ {
120
+ std::array<std::tuple<Tfirst,Trest...>,S> a;
121
+ public:
122
+ MakeSimdCl (std::array<std::tuple<Tfirst,Trest...>,S> aa) : a(aa) { ; }
123
+ auto Get() const
124
+ {
125
+ std::array<Tfirst,S> a0;
126
+ for (int i = 0; i < S; i++)
127
+ a0[i] = std::get<0> (a[i]);
128
+
129
+ if constexpr (std::tuple_size<std::tuple<Tfirst,Trest...>>::value == 1)
130
+ {
131
+ return std::tuple(MakeSimd(a0));
132
+ }
133
+ else
134
+ {
135
+ std::array<std::tuple<Trest...>,S> arest;
136
+ for (int i = 0; i < S; i++)
137
+ arest[i] = skip_first(a[i]);
138
+
139
+ return std::tuple_cat ( std::tuple (MakeSimd(a0)), MakeSimd(arest) );
140
+ }
141
+ }
142
+
143
+ template <typename... Ts>
144
+ static auto skip_first(const std::tuple<Ts...>& t) {
145
+ return std::apply([](auto first, auto... rest) {
146
+ return std::make_tuple(rest...);
147
+ }, t);
148
+ }
149
+ };
150
+
151
+
152
+
153
+
154
+
155
+ }
156
+
157
+
158
+ #include "simd_math.hpp"
159
+
160
+ #endif // NETGEN_CORE_SIMD_HPP
@@ -0,0 +1,407 @@
1
+ #include "arm_neon.h"
2
+
3
+ namespace ngcore
4
+ {
5
+
6
+ template <>
7
+ class SIMD<mask64,2>
8
+ {
9
+ int64x2_t mask;
10
+ public:
11
+ SIMD (int i)
12
+ {
13
+ mask[0] = i > 0 ? -1 : 0;
14
+ mask[1] = i > 1 ? -1 : 0;
15
+ }
16
+
17
+ SIMD (bool i0, bool i1) { mask[0] = i0 ? -1 : 0; mask[1] = i1 ? -1 : 0; }
18
+ SIMD (SIMD<mask64,1> i0, SIMD<mask64,1> i1) { mask[0] = i0[0]; mask[1] = i1[0]; }
19
+ // SIMD (float64x2_t _data) : mask{_data} { }
20
+ SIMD (int64x2_t _data) : mask{_data} { }
21
+ auto Data() const { return mask; }
22
+ static constexpr int Size() { return 2; }
23
+ // static NETGEN_INLINE SIMD<mask64, 2> GetMaskFromBits (unsigned int i);
24
+ int64_t operator[] (int i) const { return mask[i]; }
25
+
26
+ template <int I>
27
+ int64_t Get() const { return mask[I]; }
28
+
29
+ auto Lo() const { return mask[0]; }
30
+ auto Hi() const { return mask[1]; }
31
+ };
32
+
33
+
34
+ // *************************** int32 ***************************
35
+
36
+
37
+
38
+ template<>
39
+ class SIMD<int32_t,2>
40
+ {
41
+ int32x2_t data;
42
+ public:
43
+ static constexpr int Size() { return 2; }
44
+ SIMD() {}
45
+ SIMD (int32_t val) : data{val,val} {}
46
+ SIMD (int32_t v0, int32_t v1) : data{v0,v1} { }
47
+ SIMD (SIMD<int32_t,1> lo, SIMD<int32_t,1> hi) : data{lo[0], hi[0] } { }
48
+ SIMD (std::array<int32_t, 2> arr) : data{arr[0], arr[1]} { }
49
+
50
+ SIMD (int32x2_t _data) { data = _data; }
51
+
52
+ NETGEN_INLINE auto Data() const { return data; }
53
+ NETGEN_INLINE auto & Data() { return data; }
54
+
55
+ SIMD<int32_t,1> Lo() const { return Get<0>(); }
56
+ SIMD<int32_t,1> Hi() const { return Get<1>(); }
57
+
58
+ int32_t operator[] (int i) const { return data[i]; }
59
+ int32_t & operator[] (int i) { return ((int32_t*)&data)[i]; }
60
+
61
+ template <int I>
62
+ int32_t Get() const { return data[I]; }
63
+ static SIMD FirstInt(int n0=0) { return { n0+0, n0+1 }; }
64
+ };
65
+
66
+
67
+ template<>
68
+ class SIMD<int32_t,4>
69
+ {
70
+ int32x4_t data;
71
+ public:
72
+ static constexpr int Size() { return 4; }
73
+ SIMD() {}
74
+ SIMD (int32_t val) : data{val,val,val,val} {}
75
+ SIMD (int32_t v0, int32_t v1, int32_t v2, int32_t v3) : data{v0,v1,v2,v3} { }
76
+ SIMD (std::array<int32_t, 4> arr) : data{arr[0], arr[1], arr[2], arr[3]} { }
77
+
78
+ SIMD (int32x4_t _data) { data = _data; }
79
+ SIMD (SIMD<int32_t,2> lo, SIMD<int32_t,2> hi) : data{vcombine_s32(lo.Data(), hi.Data())} {}
80
+ SIMD (int32_t * p) : data{vld1q_s32(p)} { }
81
+
82
+ NETGEN_INLINE auto Data() const { return data; }
83
+ NETGEN_INLINE auto & Data() { return data; }
84
+
85
+ SIMD<int32_t,2> Lo() const { return vget_low_s32(data); }
86
+ SIMD<int32_t,2> Hi() const { return vget_high_s32(data); }
87
+
88
+ int32_t operator[] (int i) const { return data[i]; }
89
+ int32_t & operator[] (int i) { return ((int32_t*)&data)[i]; }
90
+
91
+ void Store (int32_t * p) { vst1q_s32(p, data); }
92
+
93
+ template <int I>
94
+ int32_t Get() const { return data[I]; }
95
+ static SIMD FirstInt(int n0=0) { return { n0+0, n0+1, n0+2, n0+3 }; }
96
+ };
97
+
98
+
99
+
100
+ NETGEN_INLINE auto Min (SIMD<int32_t,2> a, SIMD<int32_t,2> b) {
101
+ return SIMD<int32_t,2>(vmin_s32(a.Data(), b.Data()));
102
+ }
103
+
104
+ NETGEN_INLINE auto Max (SIMD<int32_t,2> a, SIMD<int32_t,2> b) {
105
+ return SIMD<int32_t,2>(vmax_s32(a.Data(), b.Data()));
106
+ }
107
+
108
+
109
+ NETGEN_INLINE auto Min (SIMD<int32_t,4> a, SIMD<int32_t,4> b) {
110
+ return SIMD<int32_t,4>(vminq_s32(a.Data(), b.Data()));
111
+ }
112
+
113
+ NETGEN_INLINE auto Max (SIMD<int32_t,4> a, SIMD<int32_t,4> b) {
114
+ return SIMD<int32_t,4>(vmaxq_s32(a.Data(), b.Data()));
115
+ }
116
+
117
+
118
+
119
+
120
+ // *************************** int64 ***************************
121
+
122
+ template<>
123
+ class SIMD<int64_t,2>
124
+ {
125
+ int64x2_t data;
126
+ public:
127
+ static constexpr int Size() { return 2; }
128
+ SIMD() {}
129
+ SIMD (int64_t val) : data{val,val} {}
130
+ SIMD (int64_t v0, int64_t v1) : data{vcombine_s64(int64x1_t{v0}, int64x1_t{v1})} { }
131
+ SIMD (std::array<int64_t, 2> arr) : data{arr[0], arr[1]} { }
132
+
133
+ SIMD (int64x2_t _data) { data = _data; }
134
+
135
+ NETGEN_INLINE auto Data() const { return data; }
136
+ NETGEN_INLINE auto & Data() { return data; }
137
+
138
+ int64_t Lo() const { return Get<0>(); }
139
+ int64_t Hi() const { return Get<1>(); }
140
+
141
+ int64_t operator[] (int i) const { return data[i]; }
142
+ int64_t & operator[] (int i) { return ((int64_t*)&data)[i]; }
143
+
144
+ template <int I>
145
+ int64_t Get() const { return data[I]; }
146
+ static SIMD FirstInt(int n0=0) { return { n0+0, n0+1 }; }
147
+ };
148
+
149
+ NETGEN_INLINE SIMD<int64_t,2> operator& (SIMD<int64_t,2> a, SIMD<int64_t,2> b)
150
+ {
151
+ return vandq_s64(a.Data(), b.Data());
152
+ }
153
+
154
+ NETGEN_INLINE SIMD<int64_t,2> operator+ (SIMD<int64_t,2> a, SIMD<int64_t,2> b)
155
+ {
156
+ return vaddq_s64(a.Data(), b.Data());
157
+ }
158
+
159
+ NETGEN_INLINE SIMD<mask64,2> operator== (SIMD<int64_t> a, SIMD<int64_t> b)
160
+ {
161
+ return vceqq_u64(a.Data(), b.Data());
162
+ }
163
+
164
+ NETGEN_INLINE SIMD<mask64,2> operator> (SIMD<int64_t> a, SIMD<int64_t> b)
165
+ {
166
+ return vcgtq_s64(a.Data(), b.Data());
167
+ }
168
+
169
+
170
+ template <int N>
171
+ SIMD<int64_t,2> operator<< (SIMD<int64_t,2> a, IC<N> n)
172
+ {
173
+ return vshlq_n_s64(a.Data(), N);
174
+ }
175
+
176
+
177
+
178
+ // *************************** double ***************************
179
+
180
+ template<>
181
+ class SIMD<double,2>
182
+ {
183
+ float64x2_t data;
184
+
185
+ public:
186
+ static constexpr int Size() { return 2; }
187
+ SIMD () {}
188
+ SIMD (const SIMD &) = default;
189
+ // SIMD (double v0, double v1) : data{v0,v1} { }
190
+ SIMD (double v0, double v1) : data{vcombine_f64(float64x1_t{v0}, float64x1_t{v1})} { }
191
+ SIMD (SIMD<double,1> v0, SIMD<double,1> v1) : data{vcombine_f64(float64x1_t{v0.Data()}, float64x1_t{v1.Data()})} { }
192
+ SIMD (std::array<double, 2> arr) : data{arr[0], arr[1]} { }
193
+
194
+ SIMD & operator= (const SIMD &) = default;
195
+
196
+ SIMD (double val) : data{val,val} { }
197
+ SIMD (int val) : data{double(val),double(val)} { }
198
+ SIMD (size_t val) : data{double(val),double(val)} { }
199
+
200
+ SIMD (double const * p)
201
+ {
202
+ data = vld1q_f64(p);
203
+ // data[0] = p[0];
204
+ // data[1] = p[1];
205
+ }
206
+
207
+ SIMD (double const * p, SIMD<mask64,2> mask)
208
+ {
209
+ data[0] = mask[0] ? p[0] : 0;
210
+ data[1] = mask[1] ? p[1] : 0;
211
+ }
212
+ SIMD (float64x2_t _data) { data = _data; }
213
+
214
+ template<typename T, typename std::enable_if<std::is_convertible<T, std::function<double(int)>>::value, int>::type = 0>
215
+ SIMD (const T & func)
216
+ {
217
+ data[0] = func(0);
218
+ data[1] = func(1);
219
+ }
220
+
221
+ void Store (double * p)
222
+ {
223
+ vst1q_f64(p, data);
224
+ /*
225
+ p[0] = data[0];
226
+ p[1] = data[1];
227
+ */
228
+ }
229
+
230
+ void Store (double * p, SIMD<mask64,2> mask)
231
+ {
232
+ if (mask[0]) p[0] = data[0];
233
+ if (mask[1]) p[1] = data[1];
234
+ }
235
+
236
+ // NETGEN_INLINE double operator[] (int i) const { return ((double*)(&data))[i]; }
237
+ NETGEN_INLINE double operator[] (int i) const { return data[i]; }
238
+ NETGEN_INLINE double & operator[] (int i) { return ((double*)&data)[i]; }
239
+
240
+ template <int I>
241
+ double Get() const { return data[I]; }
242
+
243
+ NETGEN_INLINE auto Data() const { return data; }
244
+ NETGEN_INLINE auto & Data() { return data; }
245
+
246
+ operator std::tuple<double&,double&> ()
247
+ {
248
+ auto pdata = (double*)&data;
249
+ return std::tuple<double&,double&>(pdata[0], pdata[1]);
250
+ }
251
+
252
+ double Lo() const { return Get<0>(); } // data[0]; }
253
+ double Hi() const { return Get<1>(); } // data[1]; }
254
+ // double Hi() const { return vget_high_f64(data)[0]; }
255
+ };
256
+
257
+
258
+
259
+ NETGEN_INLINE double HSum (SIMD<double,2> sd)
260
+ {
261
+ return sd.Lo()+sd.Hi(); // sd[0]+sd[1];
262
+ }
263
+
264
+ NETGEN_INLINE SIMD<double,2> HSum (SIMD<double,2> a, SIMD<double,2> b)
265
+ {
266
+ // return SIMD<double,2> (a[0]+a[1], b[0]+b[1]);
267
+ return vpaddq_f64(a.Data(), b.Data());
268
+ }
269
+
270
+ NETGEN_INLINE SIMD<double,4> HSum(SIMD<double,2> a, SIMD<double,2> b, SIMD<double,2> c, SIMD<double,2> d)
271
+ {
272
+ return SIMD<double,4> (HSum(a,b), HSum(c,d));
273
+ }
274
+
275
+
276
+ NETGEN_INLINE SIMD<double,2> SwapPairs (SIMD<double,2> a)
277
+ {
278
+ return __builtin_shufflevector(a.Data(), a.Data(), 1, 0);
279
+ }
280
+
281
+
282
+
283
+ // a*b+c
284
+ NETGEN_INLINE SIMD<double,2> FMA (SIMD<double,2> a, SIMD<double,2> b, SIMD<double,2> c)
285
+ {
286
+ return vmlaq_f64(c.Data(), a.Data(), b.Data());
287
+ }
288
+ NETGEN_INLINE SIMD<double,2> FMA (const double & a, SIMD<double,2> b, SIMD<double,2> c)
289
+ {
290
+ return FMA(SIMD<double,2> (a), b, c);
291
+ }
292
+ // -a*b+c
293
+ NETGEN_INLINE SIMD<double,2> FNMA (SIMD<double,2> a, SIMD<double,2> b, SIMD<double,2> c)
294
+ {
295
+ return vmlsq_f64(c.Data(), a.Data(), b.Data());
296
+ // return c-a*b;
297
+ }
298
+ NETGEN_INLINE SIMD<double,2> FNMA (const double & a, SIMD<double,2> b, SIMD<double,2> c)
299
+ {
300
+ return FNMA(SIMD<double,2> (a), b, c);
301
+ }
302
+
303
+ // ARM complex mult:
304
+ // https://arxiv.org/pdf/1901.07294.pdf
305
+ // c += a*b (a0re, a0im, a1re, a1im, ...),
306
+ NETGEN_INLINE void FMAComplex (SIMD<double,2> a, SIMD<double,2> b, SIMD<double,2> & c)
307
+ {
308
+ auto tmp = vcmlaq_f64(c.Data(), a.Data(), b.Data()); // are * b
309
+ c = vcmlaq_rot90_f64(tmp, a.Data(), b.Data()); // += i*aim * b
310
+ }
311
+
312
+ NETGEN_INLINE void FMAComplex (SIMD<double,4> a, SIMD<double,4> b, SIMD<double,4> & c)
313
+ {
314
+ SIMD<double,2> clo = c.Lo();
315
+ SIMD<double,2> chi = c.Hi();
316
+ FMAComplex (a.Lo(), b.Lo(), clo);
317
+ FMAComplex (a.Hi(), b.Hi(), chi);
318
+ c = SIMD<double,4> (clo, chi);
319
+ }
320
+
321
+
322
+
323
+ NETGEN_INLINE SIMD<double,2> operator+ (SIMD<double,2> a, SIMD<double,2> b)
324
+ { return a.Data()+b.Data(); }
325
+
326
+ NETGEN_INLINE SIMD<double,2> operator- (SIMD<double,2> a, SIMD<double,2> b)
327
+ { return a.Data()-b.Data(); }
328
+ NETGEN_INLINE SIMD<double,2> operator- (SIMD<double,2> a)
329
+ { return -a.Data(); }
330
+
331
+ NETGEN_INLINE SIMD<double,2> operator* (SIMD<double,2> a, SIMD<double,2> b)
332
+ { return a.Data()*b.Data(); }
333
+
334
+ NETGEN_INLINE SIMD<double,2> operator/ (SIMD<double,2> a, SIMD<double,2> b)
335
+ { return a.Data()/b.Data(); }
336
+
337
+ NETGEN_INLINE SIMD<double,2> sqrt (SIMD<double,2> x)
338
+ { return vsqrtq_f64(x.Data()); }
339
+
340
+
341
+ NETGEN_INLINE SIMD<double,2> round (SIMD<double,2> x)
342
+ {
343
+ return vrndnq_f64(x.Data());
344
+ }
345
+
346
+ NETGEN_INLINE SIMD<int64_t,2> lround (SIMD<double,2> x)
347
+ {
348
+ return vcvtq_s64_f64(x.Data());
349
+ }
350
+
351
+
352
+
353
+ NETGEN_INLINE SIMD<double,2> rsqrt (SIMD<double,2> x)
354
+ {
355
+ return 1.0 / sqrt(x);
356
+
357
+ // SIMD<double,2> y = vrsqrteq_f64(x.Data());
358
+
359
+ /*
360
+ y = y * vrsqrtsq_f64( (x*y).Data(), y.Data());
361
+ y = y * vrsqrtsq_f64( (x*y).Data(), y.Data());
362
+ y = y * vrsqrtsq_f64( (x*y).Data(), y.Data());
363
+ */
364
+
365
+ /*
366
+ auto x_half = 0.5*x;
367
+ y = y * (1.5 - (x_half * y * y));
368
+ y = y * (1.5 - (x_half * y * y));
369
+ y = y * (1.5 - (x_half * y * y));
370
+
371
+ return y;
372
+ */
373
+ }
374
+
375
+
376
+
377
+
378
+ template <>
379
+ NETGEN_INLINE SIMD<double,2> Reinterpret (SIMD<int64_t,2> a)
380
+ {
381
+ return vreinterpretq_f64_s64(a.Data());
382
+ }
383
+
384
+
385
+ NETGEN_INLINE SIMD<double,2> If (SIMD<mask64,2> a, SIMD<double,2> b, SIMD<double,2> c)
386
+ {
387
+ // return { a[0] ? b[0] : c[0], a[1] ? b[1] : c[1] };
388
+ uint64x2_t mask = vreinterpretq_u64_s64(a.Data());
389
+ return vbslq_f64(mask, b.Data(), c.Data());
390
+ }
391
+ NETGEN_INLINE SIMD<int64_t,2> If (SIMD<mask64,2> a, SIMD<int64_t,2> b, SIMD<int64_t,2> c)
392
+ {
393
+ // return SIMD<int64_t,2> (a[0] ? b[0] : c[0], a[1] ? b[1] : c[1]);
394
+ uint64x2_t mask = vreinterpretq_u64_s64(a.Data());
395
+ return vbslq_s64(mask, b.Data(), c.Data());
396
+ }
397
+
398
+ NETGEN_INLINE SIMD<mask64,2> operator&& (SIMD<mask64,2> a, SIMD<mask64,2> b)
399
+ {
400
+ uint64x2_t m1 = vreinterpretq_u64_s64(a.Data());
401
+ uint64x2_t m2 = vreinterpretq_u64_s64(b.Data());
402
+ uint64x2_t res = vandq_u64 (m1, m2);
403
+ return vreinterpretq_s64_u64(res);
404
+ }
405
+
406
+ }
407
+