xfem 2.1.2605.dev2__tar.gz → 2.1.2605.dev10__tar.gz

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 (252) hide show
  1. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/.github/workflows/pypi.yml +1 -1
  2. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/PKG-INFO +1 -1
  3. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/cutint/straightcutrule.cpp +14 -2
  4. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/cutint/xdecompose.hpp +2 -1
  5. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/cutint/xintegration.cpp +2 -1
  6. xfem-2.1.2605.dev10/lsetcurving/shiftedevaluate.cpp +381 -0
  7. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/lsetcurving/shiftedevaluate.hpp +28 -2
  8. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/python/_version.py +3 -3
  9. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/tests/CMakeLists.txt +3 -0
  10. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/tests/pytests/test_bndcut.py +55 -0
  11. xfem-2.1.2605.dev10/tests/pytests/test_shifteval_simd.py +125 -0
  12. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/utils/p1interpol.cpp +2 -1
  13. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/utils/xprolongation.cpp +10 -10
  14. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/xfem/symboliccutbfi.cpp +10 -12
  15. xfem-2.1.2605.dev2/lsetcurving/shiftedevaluate.cpp +0 -288
  16. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/.ci/build_pip.sh +0 -0
  17. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/.ci/build_pip_mac.sh +0 -0
  18. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/.ci/ci_ctests.sh +0 -0
  19. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/.ci/fix_auditwheel_policy.py +0 -0
  20. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/.github/workflows/extras-workflow.yml +0 -0
  21. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/.github/workflows/paper-workflow.yml +0 -0
  22. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/.gitignore +0 -0
  23. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/.gitlab-ci.yml +0 -0
  24. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/.gitmodules +0 -0
  25. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/CMakeLists.txt +0 -0
  26. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/Dockerfile +0 -0
  27. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/INSTALLATION.md +0 -0
  28. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/LICENSE +0 -0
  29. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/MANIFEST.in +0 -0
  30. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/README.md +0 -0
  31. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/_ngsolve_deps_provider.py +0 -0
  32. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/cmake_modules/check_submodules.cmake +0 -0
  33. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/cmake_modules/cmake_uninstall.cmake.in +0 -0
  34. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/config.h.cmake +0 -0
  35. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/cutint/CMakeLists.txt +0 -0
  36. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/cutint/cutintegral.cpp +0 -0
  37. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/cutint/cutintegral.hpp +0 -0
  38. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/cutint/fieldeval.cpp +0 -0
  39. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/cutint/fieldeval.hpp +0 -0
  40. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/cutint/lsetintdomain.cpp +0 -0
  41. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/cutint/lsetintdomain.hpp +0 -0
  42. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/cutint/mlsetintegration.cpp +0 -0
  43. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/cutint/mlsetintegration.hpp +0 -0
  44. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/cutint/python_cutint.cpp +0 -0
  45. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/cutint/spacetimecutrule.cpp +0 -0
  46. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/cutint/spacetimecutrule.hpp +0 -0
  47. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/cutint/straightcutrule.hpp +0 -0
  48. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/cutint/xdecompose.cpp +0 -0
  49. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/cutint/xintegration.hpp +0 -0
  50. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/demos/CMakeLists.txt +0 -0
  51. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/demos/README.md +0 -0
  52. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/demos/aggregates/aggfem_shapetester.py +0 -0
  53. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/demos/aggregates/fictdom_aggfem.py +0 -0
  54. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/demos/aggregates/fictdom_dg_aggfem.py +0 -0
  55. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/demos/fictdom.py +0 -0
  56. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/demos/fictdom_dg.py +0 -0
  57. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/demos/fictdom_mlset.py +0 -0
  58. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/demos/graveyard/compp1prolong-playground.py +0 -0
  59. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/demos/graveyard/cutint/area_of_a_circle_quads.py +0 -0
  60. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/demos/graveyard/cutint/integrate_one_big_quad2D.py +0 -0
  61. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/demos/graveyard/cutint/integrate_one_big_quad3D.py +0 -0
  62. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/demos/graveyard/fictdom_dg3d.py +0 -0
  63. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/demos/graveyard/lsetcurving/integrate.py +0 -0
  64. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/demos/graveyard/make_uniform3D_grid.py +0 -0
  65. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/demos/graveyard/mg_cut_poisson_p1.py +0 -0
  66. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/demos/graveyard/mg_cut_poisson_p1p2_skinny.py +0 -0
  67. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/demos/graveyard/mg_cut_poisson_p2.py +0 -0
  68. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/demos/graveyard/mg_cut_poisson_p2_skinny.py +0 -0
  69. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/demos/graveyard/mg_p1_working.py +0 -0
  70. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/demos/graveyard/mlset/cube.py +0 -0
  71. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/demos/graveyard/mlset/cube2.py +0 -0
  72. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/demos/graveyard/mlset/cube_codim2_test.py +0 -0
  73. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/demos/graveyard/mlset/even_simpler.py +0 -0
  74. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/demos/graveyard/mlset/multiple_triangles.py +0 -0
  75. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/demos/graveyard/mlset/simple.py +0 -0
  76. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/demos/graveyard/mlset/simple_mlcutinfo.py +0 -0
  77. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/demos/graveyard/mlset/simple_with_convinience.py +0 -0
  78. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/demos/graveyard/mlset/square.py +0 -0
  79. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/demos/graveyard/mlset/tensor_functions.py +0 -0
  80. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/demos/graveyard/mlset/test_GetOuterBoundary.py +0 -0
  81. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/demos/graveyard/mlset/test_draw.py +0 -0
  82. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/demos/graveyard/mlset/triangle.py +0 -0
  83. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/demos/graveyard/mlset/zalesak_disk.py +0 -0
  84. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/demos/graveyard/mlset/zalesak_sphere.py +0 -0
  85. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/demos/graveyard/p1prolong-playground.py +0 -0
  86. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/demos/graveyard/p2prolong-playground.py +0 -0
  87. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/demos/graveyard/stokesxfem.py +0 -0
  88. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/demos/linelasticity.py +0 -0
  89. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/demos/lsetgeoms.py +0 -0
  90. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/demos/moving_domain.py +0 -0
  91. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/demos/mpi/mpi_nxfem.py +0 -0
  92. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/demos/spacetime/graveyard/IF_circle.py +0 -0
  93. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/demos/spacetime/graveyard/IF_marking.py +0 -0
  94. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/demos/spacetime/graveyard/IF_periodic.py +0 -0
  95. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/demos/spacetime/graveyard/area_of_a_hypersphere_ST.py +0 -0
  96. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/demos/spacetime/graveyard/area_of_a_hypersphere_ST_conv.py +0 -0
  97. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/demos/spacetime/graveyard/area_of_a_hypersphere_ST_conv_higher_order.py +0 -0
  98. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/demos/spacetime/graveyard/area_of_a_sphere_ST.py +0 -0
  99. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/demos/spacetime/graveyard/area_of_a_sphere_ST_conv.py +0 -0
  100. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/demos/spacetime/graveyard/area_of_a_sphere_ST_conv_higher_order.py +0 -0
  101. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/demos/spacetime/graveyard/fictdomain_Neumann_quad_testing.py +0 -0
  102. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/demos/spacetime/graveyard/kite3D_in_sympy.py +0 -0
  103. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/demos/spacetime/graveyard/kite_in_sympy.py +0 -0
  104. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/demos/spacetime/graveyard/spaceP1_timeDGP1_3D.py +0 -0
  105. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/demos/spacetime/graveyard/spaceP1_timeDGP1_3D_static.py +0 -0
  106. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/demos/spacetime/graveyard/spaceP1_timeDGP1_kite.py +0 -0
  107. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/demos/spacetime/graveyard/spaceP1_timeDGP1_kite3D.py +0 -0
  108. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/demos/spacetime/graveyard/spaceP2_timeDGP1.py +0 -0
  109. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/demos/spacetime/graveyard/spaceP2_timeDGP1_new.py +0 -0
  110. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/demos/spacetime/graveyard/spacePX_timeDGP1_kite.py +0 -0
  111. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/demos/spacetime/spaceDGtimeDG_unfitted.py +0 -0
  112. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/demos/spacetime/spaceDGtimeDG_unfitted_3D.py +0 -0
  113. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/demos/spacetime/spacetimeCG_unfitted.py +0 -0
  114. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/demos/spacetime/spacetimeDG_fitted.py +0 -0
  115. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/demos/spacetime/spacetimeDG_fitted_Nitsche.py +0 -0
  116. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/demos/spacetime/spacetimeDG_unfitted.py +0 -0
  117. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/demos/spacetime/spacetime_geom_error.py +0 -0
  118. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/demos/spacetime/spacetime_vtk.py +0 -0
  119. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/demos/spdes/surfstokestracefem.py +0 -0
  120. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/demos/stokescutfem.py +0 -0
  121. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/demos/tracefem.py +0 -0
  122. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/demos/unf_interf_prob.py +0 -0
  123. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/doc/feature-details.md +0 -0
  124. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/doc/graphics/bubble-coarse.pdf +0 -0
  125. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/doc/graphics/cuttet-quadrature.png +0 -0
  126. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/doc/graphics/graveyard/cut_quadrature.png +0 -0
  127. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/doc/graphics/graveyard/cut_quadrature_mlset.png +0 -0
  128. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/doc/graphics/graveyard/cuttet.jpg +0 -0
  129. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/doc/graphics/graveyard/intpoints.jpg +0 -0
  130. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/doc/graphics/graveyard/spacetime1.png +0 -0
  131. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/doc/graphics/graveyard/spacetime2.png +0 -0
  132. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/doc/graphics/graveyard/zdisc-cut-elements.png +0 -0
  133. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/doc/graphics/lsetcurv.jpg +0 -0
  134. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/doc/graphics/mlset.png +0 -0
  135. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/doc/graphics/patches.png +0 -0
  136. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/doc/graphics/spacetime.png +0 -0
  137. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/doc/graphics/twophase.pdf +0 -0
  138. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/doc/graphics/unfittedmesh.jpg +0 -0
  139. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/doc/graphics/xfem.jpg +0 -0
  140. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/doc/graphics/xfes.png +0 -0
  141. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/doc/latex.template +0 -0
  142. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/doc/lit-ngsxfem.bib +0 -0
  143. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/doc/literature.md +0 -0
  144. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/doc/sphinx/_static/custom.css +0 -0
  145. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/doc/sphinx/bullets.css +0 -0
  146. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/doc/sphinx/conf.py +0 -0
  147. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/doc/sphinx/contents.rst +0 -0
  148. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/doc/sphinx/index.rst +0 -0
  149. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/doc/sphinx/jupyter/index.rst +0 -0
  150. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/doc/sphinx/requirements.txt +0 -0
  151. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/doc/sphinx/xfem_misc/demos.rst +0 -0
  152. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/doc/sphinx/xfem_misc/feature-details.rst +0 -0
  153. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/doc/sphinx/xfem_misc/installation.rst +0 -0
  154. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/doc/sphinx/xfem_misc/literature.rst +0 -0
  155. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/lsetcurving/CMakeLists.txt +0 -0
  156. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/lsetcurving/calcpointshift.cpp +0 -0
  157. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/lsetcurving/calcpointshift.hpp +0 -0
  158. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/lsetcurving/lsetrefine.cpp +0 -0
  159. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/lsetcurving/lsetrefine.hpp +0 -0
  160. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/lsetcurving/projshift.cpp +0 -0
  161. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/lsetcurving/projshift.hpp +0 -0
  162. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/lsetcurving/python_lsetcurving.cpp +0 -0
  163. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/lsetcurving/shiftintegrators.cpp +0 -0
  164. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/lsetcurving/shiftintegrators.hpp +0 -0
  165. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/ngsolve_addon.cmake +0 -0
  166. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/pyproject.toml +0 -0
  167. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/python/CMakeLists.txt +0 -0
  168. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/python/__init__.py +0 -0
  169. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/python/cutmg.py +0 -0
  170. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/python/lset_smoothblend.py +0 -0
  171. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/python/lset_spacetime.py +0 -0
  172. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/python/lsetcurv.py +0 -0
  173. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/python/mlset.py +0 -0
  174. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/python/ngs_check.py +0 -0
  175. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/python/python_ngsxfem.cpp +0 -0
  176. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/python/utils.py +0 -0
  177. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/spacetime/CMakeLists.txt +0 -0
  178. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/spacetime/SpaceTimeFE.cpp +0 -0
  179. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/spacetime/SpaceTimeFE.hpp +0 -0
  180. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/spacetime/SpaceTimeFESpace.cpp +0 -0
  181. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/spacetime/SpaceTimeFESpace.hpp +0 -0
  182. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/spacetime/diffopDt.cpp +0 -0
  183. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/spacetime/diffopDt.hpp +0 -0
  184. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/spacetime/diffopFixt.cpp +0 -0
  185. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/spacetime/diffopFixt.hpp +0 -0
  186. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/spacetime/python_spacetime.cpp +0 -0
  187. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/spacetime/spacetime_vtk.cpp +0 -0
  188. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/spacetime/spacetime_vtk.hpp +0 -0
  189. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/spacetime/timecf.cpp +0 -0
  190. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/spacetime/timecf.hpp +0 -0
  191. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/tests/ngsxfem_report.py +0 -0
  192. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/tests/pytests/test_aggregates.py +0 -0
  193. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/tests/pytests/test_backuprule.py +0 -0
  194. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/tests/pytests/test_calc_linearized.py +0 -0
  195. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/tests/pytests/test_differential_symbol.py +0 -0
  196. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/tests/pytests/test_elementlayers.py +0 -0
  197. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/tests/pytests/test_intcurved.py +0 -0
  198. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/tests/pytests/test_local_solve.py +0 -0
  199. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/tests/pytests/test_localgeom.py +0 -0
  200. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/tests/pytests/test_memory_usage.py +0 -0
  201. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/tests/pytests/test_mlset_integration.py +0 -0
  202. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/tests/pytests/test_mlset_module_functionality.py +0 -0
  203. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/tests/pytests/test_mlset_poisson.py +0 -0
  204. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/tests/pytests/test_navier_stokes_2d1.py +0 -0
  205. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/tests/pytests/test_ngsolve_version.py +0 -0
  206. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/tests/pytests/test_nonlin.py +0 -0
  207. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/tests/pytests/test_num_nxfem.py +0 -0
  208. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/tests/pytests/test_nxfem.py +0 -0
  209. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/tests/pytests/test_quadchallenges.py +0 -0
  210. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/tests/pytests/test_shifteval.py +0 -0
  211. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/tests/pytests/test_simd_cutint.py +0 -0
  212. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/tests/pytests/test_simd_lf_blf.py +0 -0
  213. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/tests/pytests/test_spacetime_lsetcurv.py +0 -0
  214. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/tests/pytests/test_spacetime_set.py +0 -0
  215. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/tests/pytests/test_spacetime_vecH1.py +0 -0
  216. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/tests/pytests/test_spacetime_vtk.py +0 -0
  217. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/tests/pytests/test_spacetimecutrule.py +0 -0
  218. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/tests/pytests/test_straightcutrule.py +0 -0
  219. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/tests/pytests/test_utils.py +0 -0
  220. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/tests/pytests/test_xfes_ndof.py +0 -0
  221. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/utils/CMakeLists.txt +0 -0
  222. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/utils/bitarraycf.cpp +0 -0
  223. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/utils/bitarraycf.hpp +0 -0
  224. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/utils/ngsxstd.cpp +0 -0
  225. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/utils/ngsxstd.hpp +0 -0
  226. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/utils/p1interpol.hpp +0 -0
  227. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/utils/python_utils.cpp +0 -0
  228. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/utils/restrictedblf.cpp +0 -0
  229. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/utils/restrictedblf.hpp +0 -0
  230. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/utils/restrictedfespace.cpp +0 -0
  231. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/utils/restrictedfespace.hpp +0 -0
  232. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/utils/spacetimechecks.hpp +0 -0
  233. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/utils/xprolongation.hpp +0 -0
  234. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/xfem/CMakeLists.txt +0 -0
  235. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/xfem/aggregates.cpp +0 -0
  236. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/xfem/aggregates.hpp +0 -0
  237. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/xfem/cutinfo.cpp +0 -0
  238. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/xfem/cutinfo.hpp +0 -0
  239. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/xfem/ghostpenalty.cpp +0 -0
  240. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/xfem/ghostpenalty.hpp +0 -0
  241. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/xfem/python_xfem.cpp +0 -0
  242. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/xfem/sFESpace.cpp +0 -0
  243. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/xfem/sFESpace.hpp +0 -0
  244. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/xfem/symboliccutbfi.hpp +0 -0
  245. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/xfem/symboliccutlfi.cpp +0 -0
  246. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/xfem/symboliccutlfi.hpp +0 -0
  247. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/xfem/xFESpace.cpp +0 -0
  248. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/xfem/xFESpace.hpp +0 -0
  249. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/xfem/xfemdiffops.cpp +0 -0
  250. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/xfem/xfemdiffops.hpp +0 -0
  251. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/xfem/xfiniteelement.cpp +0 -0
  252. {xfem-2.1.2605.dev2 → xfem-2.1.2605.dev10}/xfem/xfiniteelement.hpp +0 -0
@@ -52,7 +52,7 @@ jobs:
52
52
  fetch-depth: 0
53
53
 
54
54
  - name: Build sdist
55
- run: pipx run build --sdist
55
+ run: pipx run --spec build pyproject-build --sdist
56
56
 
57
57
  - uses: actions/upload-artifact@v4
58
58
  with:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: xfem
3
- Version: 2.1.2605.dev2
3
+ Version: 2.1.2605.dev10
4
4
  Summary: (ngs)xfem is an Add-on library to Netgen/NGSolve for unfitted/cut FEM.
5
5
  Author-Email: Christoph Lehrenfeld <lehrenfeld@math.uni-goettingen.de>
6
6
  Classifier: License :: OSI Approved :: GNU Lesser General Public License v3 (LGPLv3)
@@ -643,7 +643,18 @@ namespace xintegration
643
643
  if (dt == IF)
644
644
  {
645
645
  auto ir_interface = new (lh) IntegrationRule(quad_untrafo.Size(),lh);
646
- if (DIM == 1) TransformQuadUntrafoToIRInterface<1>(quad_untrafo, trafo, lset, ir_interface, spacetime_mode, tval);
646
+ if (et == ET_SEGM && DIM == 2)
647
+ {
648
+ // BND segment in a 2D mesh: the interface (IF) is a co-dim-2 point.
649
+ // Use point measure: weight = 1/GetMeasure() so that mip.GetMeasure()*weight = 1.
650
+ for (int i = 0; i < quad_untrafo.Size(); i++)
651
+ {
652
+ MappedIntegrationPoint<1,2> mip(quad_untrafo[i], trafo);
653
+ (*ir_interface)[i] = IntegrationPoint(quad_untrafo[i].Point(),
654
+ quad_untrafo[i].Weight() / mip.GetMeasure());
655
+ }
656
+ }
657
+ else if (DIM == 1) TransformQuadUntrafoToIRInterface<1>(quad_untrafo, trafo, lset, ir_interface, spacetime_mode, tval);
647
658
  else if (DIM == 2) TransformQuadUntrafoToIRInterface<2>(quad_untrafo, trafo, lset, ir_interface, spacetime_mode, tval);
648
659
  else TransformQuadUntrafoToIRInterface<3>(quad_untrafo, trafo, lset, ir_interface, spacetime_mode, tval);
649
660
  ir = ir_interface;
@@ -807,7 +818,8 @@ namespace xintegration
807
818
  SWAP_DIMENSIONS_POLICY quad_dir_policy,
808
819
  LocalHeap & lh)
809
820
  {
810
- static int timer = NgProfiler::CreateTimer ("StraightCutIntegrationRuleUntransformed"); NgProfiler::RegionTimer reg (timer);
821
+ static Timer timer("StraightCutIntegrationRuleUntransformed");
822
+ RegionTimer reg (timer);
811
823
  // static Timer timercutgeom ("NewStraightCutIntegrationRule::CheckIfCutFast");
812
824
  // static Timer timermakequadrule("NewStraightCutIntegrationRule::MakeQuadRule");
813
825
 
@@ -132,7 +132,8 @@ namespace xintegration
132
132
  PointContainer<SD> & pc,
133
133
  LocalHeap & lh)
134
134
  {
135
- static int timer = NgProfiler::CreateTimer ("DecomposePrismIntoSimplices"); NgProfiler::RegionTimer reg (timer);
135
+ static Timer timer ("DecomposePrismIntoSimplices");
136
+ RegionTimer reg (timer);
136
137
 
137
138
  ret.SetSize(SD);
138
139
  Array< const Vec<SD> * > tet(SD+1);
@@ -1630,7 +1630,8 @@ namespace xintegration
1630
1630
  int subdivlvl,
1631
1631
  LocalHeap & lh)
1632
1632
  {
1633
- static int timer = NgProfiler::CreateTimer ("OldCutIntegrationRule"); NgProfiler::RegionTimer reg (timer);
1633
+ static Timer timer("OldCutIntegrationRule");
1634
+ RegionTimer reg (timer);
1634
1635
 
1635
1636
  int DIM = trafo.SpaceDim();
1636
1637
  auto lset_eval
@@ -0,0 +1,381 @@
1
+ #define FILE_SHIFTEDEVALUATE_CPP
2
+ #include "shiftedevaluate.hpp"
3
+ #include <diffop_impl.hpp>
4
+ #include "../utils/ngsxstd.hpp"
5
+
6
+ namespace ngfem
7
+ {
8
+
9
+ namespace
10
+ {
11
+ // Element-local data of a deformation grid function (back/forth), fetched
12
+ // once per element (independent of the integration point).
13
+ template <int SpaceD>
14
+ struct DeformationData
15
+ {
16
+ bool valid = false;
17
+ const ScalarFiniteElement<SpaceD> * scafe = nullptr;
18
+ FlatMatrixFixWidth<SpaceD> vector {0, (double*)nullptr};
19
+ };
20
+
21
+ template <int SpaceD>
22
+ DeformationData<SpaceD>
23
+ GetDeformationData (const GridFunction * gf, ElementId elid, LocalHeap & lh)
24
+ {
25
+ DeformationData<SpaceD> data;
26
+ if (!gf) return data;
27
+ Array<int> dnums;
28
+ gf->GetFESpace()->GetDofNrs(elid, dnums);
29
+ FlatVector<> values(dnums.Size()*SpaceD, lh);
30
+ gf->GetVector().GetIndirect(dnums, values);
31
+ data.vector.Assign(FlatMatrixFixWidth<SpaceD> (dnums.Size(), &values(0)));
32
+ FiniteElement & fe = gf->GetFESpace()->GetFE(elid, lh);
33
+ data.scafe = &dynamic_cast<const ScalarFiniteElement<SpaceD> &> (fe);
34
+ data.valid = true;
35
+ return data;
36
+ }
37
+
38
+ // Solve Theta(Phi(x)) = z (with z = Phi_forth(ip)) for the reference point
39
+ // ipx via the fixed point iteration. This is shared between the scalar and
40
+ // the SIMD CalcMatrix/Apply/AddTrans so that both produce identical points.
41
+ template <int SpaceD>
42
+ IntegrationPoint
43
+ SolveShiftedRefPoint (const MappedIntegrationPoint<SpaceD,SpaceD> & mip,
44
+ const DeformationData<SpaceD> & back,
45
+ const DeformationData<SpaceD> & forth,
46
+ LocalHeap & lh)
47
+ {
48
+ HeapReset hr(lh);
49
+ IntegrationPoint ip(mip.IP());
50
+
51
+ Vec<SpaceD> z = mip.GetPoint();
52
+
53
+ if (forth.valid)
54
+ {
55
+ FlatVector<> shape_forth(forth.vector.Height(), lh);
56
+ forth.scafe->CalcShape(ip, shape_forth);
57
+ z += Trans(forth.vector) * shape_forth;
58
+ }
59
+
60
+ // Solve the problem Theta(Phi(x)) = z
61
+
62
+ const double h = pow(abs(mip.GetJacobiDet()), 1./SpaceD);
63
+ Vec<SpaceD> diff;
64
+ IntegrationPoint ipx(ip);
65
+ IntegrationPoint ipx0(0,0,0);
66
+ MappedIntegrationPoint<SpaceD,SpaceD> mip_x0(ipx0, mip.GetTransformation());
67
+ Vec<SpaceD> zdiff = z - mip_x0.GetPoint();
68
+ int its = 0;
69
+
70
+ if (back.valid)
71
+ {
72
+ FlatVector<> shape_back(back.vector.Height(), lh);
73
+ Vec<SpaceD> dvec_back;
74
+
75
+ Vec<SpaceD> ipx_best_so_far;
76
+ double diff_best_so_far;
77
+ bool first = true; int idx_best = 0;
78
+
79
+ // Fixed point iteration
80
+ while (its < globxvar.FIXED_POINT_ITER_TRESHOLD)
81
+ {
82
+ back.scafe->CalcShape(ipx, shape_back);
83
+ dvec_back = Trans(back.vector) * shape_back;
84
+
85
+ FlatVector<double> fv(SpaceD, &(ipx.Point())(0));
86
+
87
+ diff = zdiff - dvec_back - mip.GetJacobian() * fv;
88
+ if(first) {
89
+ diff_best_so_far = L2Norm(diff);
90
+ ipx_best_so_far = ipx.Point();
91
+ idx_best = its;
92
+ first = false;
93
+ }
94
+ else {
95
+ if (L2Norm(diff) < diff_best_so_far){
96
+ diff_best_so_far = L2Norm(diff);
97
+ ipx_best_so_far = ipx.Point();
98
+ idx_best = its;
99
+ }
100
+ }
101
+ if ( L2Norm(diff) < globxvar.EPS_SHIFTED_EVAL*h ) break;
102
+ ipx.Point() = mip.GetJacobianInverse() * (zdiff - dvec_back);
103
+
104
+ its++;
105
+ }
106
+ if (its == globxvar.FIXED_POINT_ITER_TRESHOLD){
107
+ if(diff_best_so_far < 1e0) {
108
+ cout << IM(globxvar.NON_CONV_WARN_MSG_LVL) << "In Shifted_eval: Not converged, but the "+to_string(idx_best)+"th iteration seems a reasonable candidate" << endl;
109
+ ipx.Point() = ipx_best_so_far;
110
+ }
111
+ else {
112
+ cout << "Last diff: " << diff << endl;
113
+ cout << "Best diff: " << diff_best_so_far << endl;
114
+ throw Exception(" shifted eval took FIXED_POINT_ITER_TRESHOLD = "+to_string(globxvar.FIXED_POINT_ITER_TRESHOLD)+" iterations and didn't (yet?) converge! In addition, the best interation step is no good fallback candidate.");
115
+ }
116
+ }
117
+ }
118
+ else
119
+ {
120
+ // Fixed point iteration
121
+ while (its < globxvar.FIXED_POINT_ITER_TRESHOLD)
122
+ {
123
+ FlatVector<double> fv(SpaceD, &(ipx.Point())(0));
124
+ diff = zdiff - mip.GetJacobian() * fv;
125
+ if ( L2Norm(diff) < globxvar.EPS_SHIFTED_EVAL*h ) break;
126
+ ipx.Point() = mip.GetJacobianInverse() * zdiff;
127
+ its++;
128
+ }
129
+ if (its == globxvar.FIXED_POINT_ITER_TRESHOLD)
130
+ throw Exception(" shifted eval took FIXED_POINT_ITER_TRESHOLD iterations and didn't (yet?) converge! ");
131
+ }
132
+
133
+ return ipx;
134
+ }
135
+
136
+ // SIMD version of the fixed point iteration: solves for the shifted
137
+ // reference coordinates of a whole SIMD<IntegrationPoint> group (all lanes
138
+ // at once), mathematically equivalent to the scalar SolveShiftedRefPoint.
139
+ //
140
+ // Like the scalar version, the geometry Jacobian (jac/jacinv) is FROZEN at
141
+ // the original integration point; only the back-deformation displacement
142
+ // dvec_back is recomputed at the current iterate. Lanes converge
143
+ // independently via a frozen-mask (incl. best-so-far fallback / throw).
144
+ template <int D>
145
+ Vec<D,SIMD<double>>
146
+ SolveShiftedRefPointSIMD (const SIMD<IntegrationPoint> & sip, // original ip group
147
+ const Vec<D,SIMD<double>> & point0, // Phi(ip0)
148
+ const Mat<D,D,SIMD<double>> & jac,
149
+ const Mat<D,D,SIMD<double>> & jacinv,
150
+ SIMD<double> jacdet,
151
+ const Vec<D,SIMD<double>> & phi0, // Phi(0)
152
+ const DeformationData<D> & back,
153
+ const DeformationData<D> & forth,
154
+ SIMD<double> done_init, // 1.0 for padding lanes
155
+ LocalHeap & lh)
156
+ {
157
+ constexpr size_t W = SIMD<double>::Size();
158
+ Vec<D,SIMD<double>> ip0ref = sip;
159
+
160
+ // evaluate a deformation (back/forth) at reference coords -> displacement
161
+ auto eval_dvec = [&] (const Vec<D,SIMD<double>> & ref,
162
+ const DeformationData<D> & dat) -> Vec<D,SIMD<double>>
163
+ {
164
+ HeapReset hr(lh);
165
+ SIMD<IntegrationPoint> cur = sip;
166
+ for (int d = 0; d < D; d++) cur(d) = ref(d);
167
+ SIMD_IntegrationRule ir1(1, &cur);
168
+ FlatMatrix<SIMD<double>> shape(dat.scafe->GetNDof(), 1, lh);
169
+ dat.scafe->CalcShape(ir1, shape);
170
+ Vec<D,SIMD<double>> dvec(SIMD<double>(0.0));
171
+ for (size_t k = 0; k < dat.vector.Height(); k++)
172
+ for (int d = 0; d < D; d++)
173
+ dvec(d) += dat.vector(k,d) * shape(k,0);
174
+ return dvec;
175
+ };
176
+
177
+ Vec<D,SIMD<double>> z = point0;
178
+ if (forth.valid) z += eval_dvec(ip0ref, forth);
179
+ Vec<D,SIMD<double>> zdiff = z - phi0;
180
+
181
+ const SIMD<double> h = pow(fabs(jacdet), 1.0/D);
182
+ const SIMD<double> eps_h = globxvar.EPS_SHIFTED_EVAL * h;
183
+ const SIMD<double> eh2 = eps_h * eps_h;
184
+
185
+ Vec<D,SIMD<double>> ipx = ip0ref;
186
+ SIMD<double> done = done_init; // 1.0 => lane frozen
187
+ SIMD<double> best_nrm2 (1e99);
188
+ Vec<D,SIMD<double>> best_ipx = ipx;
189
+ int its = 0;
190
+
191
+ while (its < globxvar.FIXED_POINT_ITER_TRESHOLD)
192
+ {
193
+ Vec<D,SIMD<double>> dvec_back (SIMD<double>(0.0));
194
+ if (back.valid) dvec_back = eval_dvec(ipx, back);
195
+
196
+ Vec<D,SIMD<double>> rhs = zdiff - dvec_back;
197
+ Vec<D,SIMD<double>> diff = rhs - jac*ipx;
198
+ SIMD<double> nrm2 = diff(0)*diff(0);
199
+ for (int d = 1; d < D; d++) nrm2 += diff(d)*diff(d);
200
+
201
+ // best-so-far (used as fallback in the back-case)
202
+ SIMD<mask64> better = nrm2 < best_nrm2;
203
+ best_nrm2 = If(better, nrm2, best_nrm2);
204
+ for (int d = 0; d < D; d++) best_ipx(d) = If(better, ipx(d), best_ipx(d));
205
+
206
+ done = If(nrm2 < eh2, SIMD<double>(1.0), done);
207
+ if (HSum(done) >= double(W) - 0.5) break; // all lanes done
208
+
209
+ Vec<D,SIMD<double>> ipx_upd = jacinv * rhs;
210
+ SIMD<mask64> frozen = SIMD<double>(0.5) < done;
211
+ for (int d = 0; d < D; d++) ipx(d) = If(frozen, ipx(d), ipx_upd(d));
212
+ its++;
213
+ }
214
+
215
+ SIMD<mask64> notdone = done < SIMD<double>(0.5);
216
+ if (HSum(If(notdone, SIMD<double>(1.0), SIMD<double>(0.0))) > 0.5)
217
+ {
218
+ if (back.valid)
219
+ {
220
+ // bad lane: not converged and best iterate is no good candidate (L2 >= 1)
221
+ SIMD<mask64> bad = notdone && (SIMD<double>(1.0) <= best_nrm2);
222
+ if (HSum(If(bad, SIMD<double>(1.0), SIMD<double>(0.0))) > 0.5)
223
+ throw Exception(" shifted eval took FIXED_POINT_ITER_TRESHOLD = "+to_string(globxvar.FIXED_POINT_ITER_TRESHOLD)+" iterations and didn't (yet?) converge! In addition, the best interation step is no good fallback candidate.");
224
+ cout << IM(globxvar.NON_CONV_WARN_MSG_LVL) << "In Shifted_eval (SIMD): Not converged, using best iterate as fallback candidate." << endl;
225
+ for (int d = 0; d < D; d++) ipx(d) = If(notdone, best_ipx(d), ipx(d));
226
+ }
227
+ else
228
+ throw Exception(" shifted eval took FIXED_POINT_ITER_TRESHOLD iterations and didn't (yet?) converge! ");
229
+ }
230
+
231
+ return ipx;
232
+ }
233
+ }
234
+
235
+ template <int SpaceD>
236
+ void DiffOpShiftedEval<SpaceD> ::
237
+ CalcMatrix (const FiniteElement & bfel,
238
+ const BaseMappedIntegrationPoint & bmip,
239
+ BareSliceMatrix<double,ColMajor> mat,
240
+ LocalHeap & lh) const
241
+ {
242
+ const MappedIntegrationPoint<SpaceD,SpaceD> & mip =
243
+ static_cast<const MappedIntegrationPoint<SpaceD,SpaceD>&> (bmip);
244
+
245
+ auto elid = mip.GetTransformation().GetElementId();
246
+ auto data_back = GetDeformationData<SpaceD> (back.get(), elid, lh);
247
+ auto data_forth = GetDeformationData<SpaceD> (forth.get(), elid, lh);
248
+
249
+ IntegrationPoint ipx = SolveShiftedRefPoint<SpaceD> (mip, data_back, data_forth, lh);
250
+
251
+ MappedIntegrationPoint<SpaceD, SpaceD> mipx(ipx, mip.GetTransformation());
252
+ evaluator->CalcMatrix(bfel, mipx, mat, lh);
253
+ }
254
+
255
+ template <int SpaceD>
256
+ SIMD_BaseMappedIntegrationRule &
257
+ DiffOpShiftedEval<SpaceD> ::
258
+ CreateShiftedMIR (const SIMD_BaseMappedIntegrationRule & bmir,
259
+ LocalHeap & lh) const
260
+ {
261
+ const ElementTransformation & trafo = bmir.GetTransformation();
262
+ auto elid = trafo.GetElementId();
263
+ auto data_back = GetDeformationData<SpaceD> (back.get(), elid, lh);
264
+ auto data_forth = GetDeformationData<SpaceD> (forth.get(), elid, lh);
265
+
266
+ const SIMD_IntegrationRule & ir = bmir.IR();
267
+ const size_t n = ir.Size();
268
+ const size_t nip = ir.GetNIP();
269
+ constexpr size_t W = SIMD<IntegrationPoint>::Size();
270
+
271
+ // Phi(0): physical image of the reference origin (same for all lanes).
272
+ IntegrationPoint ip0(0,0,0);
273
+ MappedIntegrationPoint<SpaceD,SpaceD> mip0(ip0, trafo);
274
+ Vec<SpaceD,SIMD<double>> phi0;
275
+ for (int d = 0; d < SpaceD; d++) phi0(d) = SIMD<double>(mip0.GetPoint()(d));
276
+
277
+ const SIMD<double> lanes ([] (int l) { return double(l); });
278
+
279
+ SIMD<IntegrationPoint> * mem = new (lh) SIMD<IntegrationPoint>[n];
280
+
281
+ for (size_t i = 0; i < n; i++)
282
+ {
283
+ const SIMD<IntegrationPoint> & sip = ir[i];
284
+ const auto & smip =
285
+ static_cast<const SIMD<MappedIntegrationPoint<SpaceD,SpaceD>>&> (bmir[i]);
286
+
287
+ // padding lanes (index >= nip) are marked done so they neither block the
288
+ // iteration nor trigger spurious non-convergence.
289
+ const size_t remain = (i*W < nip) ? min(W, nip - i*W) : size_t(0);
290
+ SIMD<double> done_init = If(SIMD<double>(double(remain)) <= lanes,
291
+ SIMD<double>(1.0), SIMD<double>(0.0));
292
+
293
+ Vec<SpaceD,SIMD<double>> ipx =
294
+ SolveShiftedRefPointSIMD<SpaceD> (sip, smip.GetPoint(), smip.GetJacobian(),
295
+ smip.GetJacobianInverse(), smip.GetJacobiDet(),
296
+ phi0, data_back, data_forth, done_init, lh);
297
+
298
+ SIMD<IntegrationPoint> res = sip; // keep weight / facetnr / unused coord
299
+ for (int d = 0; d < SpaceD; d++) res(d) = ipx(d);
300
+ mem[i] = res;
301
+ }
302
+
303
+ SIMD_IntegrationRule shifted_ir(n, mem);
304
+ shifted_ir.SetNIP(nip);
305
+ return trafo(shifted_ir, lh);
306
+ }
307
+
308
+ template <int SpaceD>
309
+ void DiffOpShiftedEval<SpaceD> ::
310
+ CalcMatrix (const FiniteElement & bfel,
311
+ const SIMD_BaseMappedIntegrationRule & bmir,
312
+ BareSliceMatrix<SIMD<double>> mat) const
313
+ {
314
+ static thread_local LocalHeap lh(10*1000*1000, "shiftedeval_simd_calcmatrix", true);
315
+ HeapReset hr(lh);
316
+ auto & smir = CreateShiftedMIR(bmir, lh);
317
+ evaluator->CalcMatrix(bfel, smir, mat);
318
+ }
319
+
320
+
321
+ template <int SpaceD>
322
+ void DiffOpShiftedEval<SpaceD> ::
323
+ Apply (const FiniteElement & fel,
324
+ const BaseMappedIntegrationPoint & mip,
325
+ BareSliceVector<double> x,
326
+ FlatVector<double> flux,
327
+ LocalHeap & lh) const
328
+ {
329
+ HeapReset hr(lh);
330
+ FlatMatrix<double,ColMajor> mat(Dim(), fel.GetNDof()*BlockDim(), lh);
331
+ CalcMatrix (fel, mip, mat, lh);
332
+ flux = mat * x;
333
+ }
334
+
335
+ template <int SpaceD>
336
+ void DiffOpShiftedEval<SpaceD> ::
337
+ Apply (const FiniteElement & bfel,
338
+ const SIMD_BaseMappedIntegrationRule & bmir,
339
+ BareSliceVector<double> x,
340
+ BareSliceMatrix<SIMD<double>> flux) const
341
+ {
342
+ static thread_local LocalHeap lh(10*1000*1000, "shiftedeval_simd_apply", true);
343
+ HeapReset hr(lh);
344
+ auto & smir = CreateShiftedMIR(bmir, lh);
345
+ evaluator->Apply(bfel, smir, x, flux);
346
+ }
347
+
348
+ template <int SpaceD>
349
+ void DiffOpShiftedEval<SpaceD> ::
350
+ ApplyTrans (const FiniteElement & fel,
351
+ const BaseMappedIntegrationPoint & mip,
352
+ FlatVector<double> flux,
353
+ BareSliceVector<double> x,
354
+ LocalHeap & lh) const
355
+ {
356
+ HeapReset hr(lh);
357
+ FlatMatrix<double,ColMajor> mat(Dim(), fel.GetNDof()*BlockDim(), lh);
358
+ CalcMatrix (fel, mip, mat, lh);
359
+ x.Range(0,fel.GetNDof()) = Trans(mat) * flux;
360
+ }
361
+
362
+ template <int SpaceD>
363
+ void DiffOpShiftedEval<SpaceD> ::
364
+ AddTrans (const FiniteElement & bfel,
365
+ const SIMD_BaseMappedIntegrationRule & bmir,
366
+ BareSliceMatrix<SIMD<double>> flux,
367
+ BareSliceVector<double> x) const
368
+ {
369
+ static thread_local LocalHeap lh(10*1000*1000, "shiftedeval_simd_addtrans", true);
370
+ HeapReset hr(lh);
371
+ auto & smir = CreateShiftedMIR(bmir, lh);
372
+ evaluator->AddTrans(bfel, smir, flux, x);
373
+ }
374
+
375
+ template class DiffOpShiftedEval<1>;
376
+ template class DiffOpShiftedEval<2>;
377
+ template class DiffOpShiftedEval<3>;
378
+
379
+ }
380
+
381
+
@@ -49,14 +49,27 @@ private:
49
49
  BareSliceMatrix<double,ColMajor> mat,
50
50
  LocalHeap & lh) const;
51
51
 
52
+ // SIMD variant: evaluate the (inner) evaluator at the shifted integration
53
+ // rule. Removes the need for the non-SIMD fallback (and its warnings).
54
+ virtual void
55
+ CalcMatrix (const FiniteElement & bfel,
56
+ const SIMD_BaseMappedIntegrationRule & bmir,
57
+ BareSliceMatrix<SIMD<double>> mat) const;
58
+
52
59
 
53
60
  virtual void
54
61
  Apply (const FiniteElement & fel,
55
62
  const BaseMappedIntegrationPoint & mip,
56
- BareSliceVector<double> x,
63
+ BareSliceVector<double> x,
57
64
  FlatVector<double> flux,
58
65
  LocalHeap & lh) const;
59
-
66
+
67
+ virtual void
68
+ Apply (const FiniteElement & bfel,
69
+ const SIMD_BaseMappedIntegrationRule & bmir,
70
+ BareSliceVector<double> x,
71
+ BareSliceMatrix<SIMD<double>> flux) const;
72
+
60
73
  virtual void
61
74
  ApplyTrans (const FiniteElement & fel,
62
75
  const BaseMappedIntegrationPoint & mip,
@@ -64,6 +77,19 @@ private:
64
77
  BareSliceVector<double> x,
65
78
  LocalHeap & lh) const;
66
79
 
80
+ virtual void
81
+ AddTrans (const FiniteElement & bfel,
82
+ const SIMD_BaseMappedIntegrationRule & bmir,
83
+ BareSliceMatrix<SIMD<double>> flux,
84
+ BareSliceVector<double> x) const;
85
+
86
+ private:
87
+ // Build the shifted SIMD integration rule (the inner evaluator is then
88
+ // evaluated on this rule). Allocated on lh.
89
+ SIMD_BaseMappedIntegrationRule &
90
+ CreateShiftedMIR (const SIMD_BaseMappedIntegrationRule & bmir,
91
+ LocalHeap & lh) const;
92
+
67
93
  };
68
94
 
69
95
 
@@ -18,7 +18,7 @@ version_tuple: tuple[int | str, ...]
18
18
  commit_id: str | None
19
19
  __commit_id__: str | None
20
20
 
21
- __version__ = version = '2.1.2605.dev2'
22
- __version_tuple__ = version_tuple = (2, 1, 2605, 'dev2')
21
+ __version__ = version = '2.1.2605.dev10'
22
+ __version_tuple__ = version_tuple = (2, 1, 2605, 'dev10')
23
23
 
24
- __commit_id__ = commit_id = 'g8d6a9079d'
24
+ __commit_id__ = commit_id = 'gf00f0f705'
@@ -71,6 +71,9 @@ add_test(NAME pytests_nxfem COMMAND ${NETGEN_PYTHON_EXECUTABLE} -m pytest
71
71
  add_test(NAME pytests_shifteval COMMAND ${NETGEN_PYTHON_EXECUTABLE} -m pytest
72
72
  "${PROJECT_SOURCE_DIR}/tests/pytests/test_shifteval.py" WORKING_DIRECTORY "${PROJECT_SOURCE_DIR}/tests")
73
73
 
74
+ add_test(NAME pytests_shifteval_simd COMMAND ${NETGEN_PYTHON_EXECUTABLE} -m pytest
75
+ "${PROJECT_SOURCE_DIR}/tests/pytests/test_shifteval_simd.py" WORKING_DIRECTORY "${PROJECT_SOURCE_DIR}/tests")
76
+
74
77
  add_test(NAME pytests_quadchallenges COMMAND ${NETGEN_PYTHON_EXECUTABLE} -m pytest
75
78
  "${PROJECT_SOURCE_DIR}/tests/pytests/test_quadchallenges.py" WORKING_DIRECTORY "${PROJECT_SOURCE_DIR}/tests")
76
79
 
@@ -162,6 +162,61 @@ def test_bfi_assembly_2d_partial():
162
162
  assert abs(val - cut) < 1e-2, f"Expected ~{cut}, got {val}"
163
163
 
164
164
 
165
+ # ---------------------------------------------------------------------------
166
+ # IF+BND (co-dimension-2) tests
167
+ # ---------------------------------------------------------------------------
168
+
169
+ @pytest.mark.parametrize("cut", [0.3, 0.5, 0.7])
170
+ def test_integrate_if_bnd_2d_count(cut):
171
+ """Integrate(1 * dCut(lset, IF, vb=BND)) counts boundary–interface intersections.
172
+
173
+ With lset = x - cut the interface {lset=0} is the vertical line x=cut.
174
+ It intersects the boundary of the unit square in exactly 2 points:
175
+ (cut, 0) on the bottom edge and (cut, 1) on the top edge.
176
+ The point measure of 2 discrete points is 2.
177
+ """
178
+ mesh = make_2d_mesh()
179
+ lset = GridFunction(H1(mesh, order=1))
180
+ InterpolateToP1(x - cut, lset)
181
+
182
+ val = Integrate(CoefficientFunction(1) * dCut(lset, IF, vb=BND), mesh)
183
+ assert abs(val - 2.0) < 1e-10, f"Expected 2.0 (2 intersection points), got {val}"
184
+
185
+
186
+ def test_integrate_if_bnd_2d_function():
187
+ """Integrating a function over IF+BND evaluates it at the intersection points.
188
+
189
+ lset = x - 0.5 → intersections at (0.5, 0) and (0.5, 1).
190
+ ∫ x dσ₀ = 0.5 + 0.5 = 1.0
191
+ ∫ y dσ₀ = 0.0 + 1.0 = 1.0
192
+ """
193
+ mesh = make_2d_mesh()
194
+ lset = GridFunction(H1(mesh, order=1))
195
+ InterpolateToP1(x - 0.5, lset)
196
+
197
+ val_x = Integrate(x * dCut(lset, IF, vb=BND), mesh)
198
+ val_y = Integrate(y * dCut(lset, IF, vb=BND), mesh)
199
+ assert abs(val_x - 1.0) < 1e-10, f"∫x dσ₀ expected 1.0, got {val_x}"
200
+ assert abs(val_y - 1.0) < 1e-10, f"∫y dσ₀ expected 1.0, got {val_y}"
201
+
202
+
203
+ def test_integrate_if_bnd_2d_definedon():
204
+ """definedon restricts IF+BND to a single boundary edge."""
205
+ mesh = make_2d_mesh()
206
+ lset = GridFunction(H1(mesh, order=1))
207
+ InterpolateToP1(x - 0.5, lset)
208
+
209
+ # Only the bottom edge should have one intersection point at (0.5, 0)
210
+ val_bot = Integrate(CoefficientFunction(1) * dCut(lset, IF, vb=BND,
211
+ definedon=mesh.Boundaries("bottom")), mesh)
212
+ assert abs(val_bot - 1.0) < 1e-10, f"Expected 1 intersection on bottom, got {val_bot}"
213
+
214
+ # Only the left edge (x=0) has no intersection with x=0.5
215
+ val_left = Integrate(CoefficientFunction(1) * dCut(lset, IF, vb=BND,
216
+ definedon=mesh.Boundaries("left")), mesh)
217
+ assert abs(val_left - 0.0) < 1e-10, f"Expected 0 intersections on left, got {val_left}"
218
+
219
+
165
220
  def test_bfi_definedon_bitarray():
166
221
  """definedon can be supplied as a BitArray of boundary elements."""
167
222
  cut = 0.4