ngstrefftz 0.3.2607.dev15__tar.gz → 0.3.2607.dev25__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 (91) hide show
  1. {ngstrefftz-0.3.2607.dev15 → ngstrefftz-0.3.2607.dev25}/CMakeLists.txt +36 -7
  2. {ngstrefftz-0.3.2607.dev15 → ngstrefftz-0.3.2607.dev25}/PKG-INFO +4 -3
  3. {ngstrefftz-0.3.2607.dev15 → ngstrefftz-0.3.2607.dev25}/_version.py +3 -3
  4. {ngstrefftz-0.3.2607.dev15 → ngstrefftz-0.3.2607.dev25}/docs/requirements.txt +0 -2
  5. {ngstrefftz-0.3.2607.dev15 → ngstrefftz-0.3.2607.dev25}/pyproject.toml +6 -4
  6. {ngstrefftz-0.3.2607.dev15 → ngstrefftz-0.3.2607.dev25}/src/__init__.py +9 -0
  7. ngstrefftz-0.3.2607.dev25/src/aggregatedl2space.cpp +160 -0
  8. ngstrefftz-0.3.2607.dev25/src/aggregatedl2space.hpp +45 -0
  9. ngstrefftz-0.3.2607.dev25/src/dofpatches.hpp +24 -0
  10. {ngstrefftz-0.3.2607.dev15 → ngstrefftz-0.3.2607.dev25}/src/embtrefftz.cpp +877 -696
  11. {ngstrefftz-0.3.2607.dev15 → ngstrefftz-0.3.2607.dev25}/src/embtrefftz.hpp +43 -12
  12. {ngstrefftz-0.3.2607.dev15 → ngstrefftz-0.3.2607.dev25}/src/mesh1dtents.cpp +14 -12
  13. {ngstrefftz-0.3.2607.dev15 → ngstrefftz-0.3.2607.dev25}/src/monomialfespace.hpp +1 -0
  14. {ngstrefftz-0.3.2607.dev15 → ngstrefftz-0.3.2607.dev25}/src/pufe.hpp +10 -0
  15. {ngstrefftz-0.3.2607.dev15 → ngstrefftz-0.3.2607.dev25}/src/pufespace.cpp +56 -6
  16. {ngstrefftz-0.3.2607.dev15 → ngstrefftz-0.3.2607.dev25}/src/pufespace.hpp +3 -1
  17. {ngstrefftz-0.3.2607.dev15 → ngstrefftz-0.3.2607.dev25}/src/python_trefftz.cpp +20 -0
  18. {ngstrefftz-0.3.2607.dev15 → ngstrefftz-0.3.2607.dev25}/src/tp0fespace.cpp +1 -1
  19. ngstrefftz-0.3.2607.dev25/test/aggregate_embtrefftz.py +61 -0
  20. {ngstrefftz-0.3.2607.dev15 → ngstrefftz-0.3.2607.dev25}/test/conforming_trefftz.py +2 -2
  21. {ngstrefftz-0.3.2607.dev15 → ngstrefftz-0.3.2607.dev25}/test/embt.py +54 -0
  22. {ngstrefftz-0.3.2607.dev15 → ngstrefftz-0.3.2607.dev25}/.clang-format +0 -0
  23. {ngstrefftz-0.3.2607.dev15 → ngstrefftz-0.3.2607.dev25}/.git-blame-ignore-revs +0 -0
  24. {ngstrefftz-0.3.2607.dev15 → ngstrefftz-0.3.2607.dev25}/.github/workflows/build.yml +0 -0
  25. {ngstrefftz-0.3.2607.dev15 → ngstrefftz-0.3.2607.dev25}/.github/workflows/fix_auditwheel_policy.py +0 -0
  26. {ngstrefftz-0.3.2607.dev15 → ngstrefftz-0.3.2607.dev25}/.github/workflows/pyodide/Dockerfile +0 -0
  27. {ngstrefftz-0.3.2607.dev15 → ngstrefftz-0.3.2607.dev25}/.github/workflows/pyodide/build_in_docker.sh +0 -0
  28. {ngstrefftz-0.3.2607.dev15 → ngstrefftz-0.3.2607.dev25}/.github/workflows/pyodide/merge.py +0 -0
  29. {ngstrefftz-0.3.2607.dev15 → ngstrefftz-0.3.2607.dev25}/.github/workflows/pyodide/requirements.txt +0 -0
  30. {ngstrefftz-0.3.2607.dev15 → ngstrefftz-0.3.2607.dev25}/.gitignore +0 -0
  31. {ngstrefftz-0.3.2607.dev15 → ngstrefftz-0.3.2607.dev25}/CONTRIBUTING.md +0 -0
  32. {ngstrefftz-0.3.2607.dev15 → ngstrefftz-0.3.2607.dev25}/Dockerfile +0 -0
  33. {ngstrefftz-0.3.2607.dev15 → ngstrefftz-0.3.2607.dev25}/LICENSE +0 -0
  34. {ngstrefftz-0.3.2607.dev15 → ngstrefftz-0.3.2607.dev25}/README.md +0 -0
  35. {ngstrefftz-0.3.2607.dev15 → ngstrefftz-0.3.2607.dev25}/docs/Doxyfile.in +0 -0
  36. {ngstrefftz-0.3.2607.dev15 → ngstrefftz-0.3.2607.dev25}/docs/_static/breadcrumbs.html +0 -0
  37. {ngstrefftz-0.3.2607.dev15 → ngstrefftz-0.3.2607.dev25}/docs/_static/css/mytheme.css +0 -0
  38. {ngstrefftz-0.3.2607.dev15 → ngstrefftz-0.3.2607.dev25}/docs/conf.py +0 -0
  39. {ngstrefftz-0.3.2607.dev15 → ngstrefftz-0.3.2607.dev25}/docs/contrib.rst +0 -0
  40. {ngstrefftz-0.3.2607.dev15 → ngstrefftz-0.3.2607.dev25}/docs/docu.rst +0 -0
  41. {ngstrefftz-0.3.2607.dev15 → ngstrefftz-0.3.2607.dev25}/docs/index.rst +0 -0
  42. {ngstrefftz-0.3.2607.dev15 → ngstrefftz-0.3.2607.dev25}/docs/intro.rst +0 -0
  43. {ngstrefftz-0.3.2607.dev15 → ngstrefftz-0.3.2607.dev25}/docs/notebooks/embTrefftz-adv.ipynb +0 -0
  44. {ngstrefftz-0.3.2607.dev15 → ngstrefftz-0.3.2607.dev25}/docs/notebooks/embTrefftz-helm.ipynb +0 -0
  45. {ngstrefftz-0.3.2607.dev15 → ngstrefftz-0.3.2607.dev25}/docs/notebooks/embTrefftz-ns.ipynb +0 -0
  46. {ngstrefftz-0.3.2607.dev15 → ngstrefftz-0.3.2607.dev25}/docs/notebooks/embTrefftz-poi.ipynb +0 -0
  47. {ngstrefftz-0.3.2607.dev15 → ngstrefftz-0.3.2607.dev25}/docs/notebooks/embTrefftz-stokes.ipynb +0 -0
  48. {ngstrefftz-0.3.2607.dev15 → ngstrefftz-0.3.2607.dev25}/docs/notebooks/embTrefftz-wave.ipynb +0 -0
  49. {ngstrefftz-0.3.2607.dev15 → ngstrefftz-0.3.2607.dev25}/docs/notebooks/embTrefftz.ipynb +0 -0
  50. {ngstrefftz-0.3.2607.dev15 → ngstrefftz-0.3.2607.dev25}/docs/notebooks/helmholtz.ipynb +0 -0
  51. {ngstrefftz-0.3.2607.dev15 → ngstrefftz-0.3.2607.dev25}/docs/notebooks/index.ipynb +0 -0
  52. {ngstrefftz-0.3.2607.dev15 → ngstrefftz-0.3.2607.dev25}/docs/notebooks/laplace.ipynb +0 -0
  53. {ngstrefftz-0.3.2607.dev15 → ngstrefftz-0.3.2607.dev25}/docs/notebooks/qtelliptic.ipynb +0 -0
  54. {ngstrefftz-0.3.2607.dev15 → ngstrefftz-0.3.2607.dev25}/docs/notebooks/qtwave.ipynb +0 -0
  55. {ngstrefftz-0.3.2607.dev15 → ngstrefftz-0.3.2607.dev25}/docs/notebooks/tunfitted.ipynb +0 -0
  56. {ngstrefftz-0.3.2607.dev15 → ngstrefftz-0.3.2607.dev25}/docs/notebooks/twave.ipynb +0 -0
  57. {ngstrefftz-0.3.2607.dev15 → ngstrefftz-0.3.2607.dev25}/docs/notebooks/twavetents.ipynb +0 -0
  58. {ngstrefftz-0.3.2607.dev15 → ngstrefftz-0.3.2607.dev25}/docs/paper/codemeta.json +0 -0
  59. {ngstrefftz-0.3.2607.dev15 → ngstrefftz-0.3.2607.dev25}/docs/paper/paper.bib +0 -0
  60. {ngstrefftz-0.3.2607.dev15 → ngstrefftz-0.3.2607.dev25}/docs/paper/paper.md +0 -0
  61. {ngstrefftz-0.3.2607.dev15 → ngstrefftz-0.3.2607.dev25}/docs/readme.rst +0 -0
  62. {ngstrefftz-0.3.2607.dev15 → ngstrefftz-0.3.2607.dev25}/src/airy.cpp +0 -0
  63. {ngstrefftz-0.3.2607.dev15 → ngstrefftz-0.3.2607.dev25}/src/boxintegral.cpp +0 -0
  64. {ngstrefftz-0.3.2607.dev15 → ngstrefftz-0.3.2607.dev25}/src/boxintegral.hpp +0 -0
  65. {ngstrefftz-0.3.2607.dev15 → ngstrefftz-0.3.2607.dev25}/src/condensedg.cpp +0 -0
  66. {ngstrefftz-0.3.2607.dev15 → ngstrefftz-0.3.2607.dev25}/src/condensedg.hpp +0 -0
  67. {ngstrefftz-0.3.2607.dev15 → ngstrefftz-0.3.2607.dev25}/src/diffopmapped.hpp +0 -0
  68. {ngstrefftz-0.3.2607.dev15 → ngstrefftz-0.3.2607.dev25}/src/lapack_loader.cpp +0 -0
  69. {ngstrefftz-0.3.2607.dev15 → ngstrefftz-0.3.2607.dev25}/src/lapack_loader.hpp +0 -0
  70. {ngstrefftz-0.3.2607.dev15 → ngstrefftz-0.3.2607.dev25}/src/mesh1dtents.hpp +0 -0
  71. {ngstrefftz-0.3.2607.dev15 → ngstrefftz-0.3.2607.dev25}/src/monomialfespace.cpp +0 -0
  72. {ngstrefftz-0.3.2607.dev15 → ngstrefftz-0.3.2607.dev25}/src/ngsttd.hpp +0 -0
  73. {ngstrefftz-0.3.2607.dev15 → ngstrefftz-0.3.2607.dev25}/src/planewavefe.cpp +0 -0
  74. {ngstrefftz-0.3.2607.dev15 → ngstrefftz-0.3.2607.dev25}/src/planewavefe.hpp +0 -0
  75. {ngstrefftz-0.3.2607.dev15 → ngstrefftz-0.3.2607.dev25}/src/pufe.cpp +0 -0
  76. {ngstrefftz-0.3.2607.dev15 → ngstrefftz-0.3.2607.dev25}/src/scalarmappedfe.cpp +0 -0
  77. {ngstrefftz-0.3.2607.dev15 → ngstrefftz-0.3.2607.dev25}/src/scalarmappedfe.hpp +0 -0
  78. {ngstrefftz-0.3.2607.dev15 → ngstrefftz-0.3.2607.dev25}/src/specialcoefficientfunction.cpp +0 -0
  79. {ngstrefftz-0.3.2607.dev15 → ngstrefftz-0.3.2607.dev25}/src/specialcoefficientfunction.hpp +0 -0
  80. {ngstrefftz-0.3.2607.dev15 → ngstrefftz-0.3.2607.dev25}/src/specialintegrator.cpp +0 -0
  81. {ngstrefftz-0.3.2607.dev15 → ngstrefftz-0.3.2607.dev25}/src/specialintegrator.hpp +0 -0
  82. {ngstrefftz-0.3.2607.dev15 → ngstrefftz-0.3.2607.dev25}/src/tp0fespace.hpp +0 -0
  83. {ngstrefftz-0.3.2607.dev15 → ngstrefftz-0.3.2607.dev25}/src/trefftzfespace.cpp +0 -0
  84. {ngstrefftz-0.3.2607.dev15 → ngstrefftz-0.3.2607.dev25}/src/trefftzfespace.hpp +0 -0
  85. {ngstrefftz-0.3.2607.dev15 → ngstrefftz-0.3.2607.dev25}/src/twavetents.cpp +0 -0
  86. {ngstrefftz-0.3.2607.dev15 → ngstrefftz-0.3.2607.dev25}/src/twavetents.hpp +0 -0
  87. {ngstrefftz-0.3.2607.dev15 → ngstrefftz-0.3.2607.dev25}/test/boxint.py +0 -0
  88. {ngstrefftz-0.3.2607.dev15 → ngstrefftz-0.3.2607.dev25}/test/dg.py +0 -0
  89. {ngstrefftz-0.3.2607.dev15 → ngstrefftz-0.3.2607.dev25}/test/embtrefftz_gtest.cpp +0 -0
  90. {ngstrefftz-0.3.2607.dev15 → ngstrefftz-0.3.2607.dev25}/test/tents.py +0 -0
  91. {ngstrefftz-0.3.2607.dev15 → ngstrefftz-0.3.2607.dev25}/test/trefftz.py +0 -0
@@ -37,6 +37,24 @@ set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${CMAKE_BINARY_DIR}/cmake_modules)
37
37
  set(addon_name ngstrefftz)
38
38
  project(ngstrefftz)
39
39
  include(${CMAKE_BINARY_DIR}/cmake_modules/ngsolve_addon.cmake)
40
+ set(NGSTREFFTZ_USE_XFEM AUTO CACHE STRING "Build with xfem support")
41
+ set_property(CACHE NGSTREFFTZ_USE_XFEM PROPERTY STRINGS AUTO ON OFF)
42
+ if(NOT NGSTREFFTZ_USE_XFEM STREQUAL "OFF")
43
+ if(NOT xfem_DIR)
44
+ execute_process(COMMAND ${Python3_EXECUTABLE} -c
45
+ "import importlib.util; from pathlib import Path; print(Path(importlib.util.find_spec('xfem').origin).parent / 'cmake')"
46
+ OUTPUT_VARIABLE xfem_DIR OUTPUT_STRIP_TRAILING_WHITESPACE ERROR_QUIET)
47
+ endif()
48
+ find_package(xfem CONFIG QUIET)
49
+ if(xfem_FOUND)
50
+ set(NGSTREFFTZ_USE_XFEM ON)
51
+ elseif(NGSTREFFTZ_USE_XFEM STREQUAL "ON")
52
+ message(FATAL_ERROR "NGSTREFFTZ_USE_XFEM=ON but xfem was not found")
53
+ else()
54
+ set(NGSTREFFTZ_USE_XFEM OFF)
55
+ message(WARNING "xfem not found, building without aggregation support")
56
+ endif()
57
+ endif()
40
58
  set(NGSTREFFTZ_USE_NGSTENTS AUTO CACHE STRING "Build with ngstents support")
41
59
  set_property(CACHE NGSTREFFTZ_USE_NGSTENTS PROPERTY STRINGS AUTO ON OFF)
42
60
  if(NOT NGSTREFFTZ_USE_NGSTENTS STREQUAL "OFF")
@@ -73,12 +91,17 @@ add_ngsolve_addon(ngstrefftz
73
91
  #src/airy.cpp #for testing, requires boost
74
92
  )
75
93
  target_compile_definitions(ngstrefftz PRIVATE NGSTREFFTZ_EXPORTS)
94
+ if(NGSTREFFTZ_USE_XFEM)
95
+ target_sources(ngstrefftz PRIVATE src/aggregatedl2space.cpp)
96
+ target_compile_definitions(ngstrefftz PRIVATE NGSTREFFTZ_USE_XFEM)
97
+ target_link_libraries(ngstrefftz PRIVATE xfem::core)
98
+ endif()
76
99
  if(NGSTREFFTZ_USE_NGSTENTS)
77
100
  target_sources(ngstrefftz PRIVATE src/twavetents.cpp src/mesh1dtents.cpp)
78
101
  target_compile_definitions(ngstrefftz PRIVATE NGSTREFFTZ_USE_NGSTENTS)
79
102
  target_link_libraries(ngstrefftz PRIVATE ngstents::core)
80
- ngsolve_addon_set_relative_rpath(ngstrefftz "../ngstents")
81
103
  endif()
104
+ ngsolve_addon_set_relative_rpath(ngstrefftz "../ngstents" "../xfem")
82
105
  # add dynamic loader library to link libraries (on linux)
83
106
  if(CMAKE_DL_LIBS)
84
107
  target_link_libraries(ngstrefftz PRIVATE ${CMAKE_DL_LIBS})
@@ -138,6 +161,7 @@ message("${BoldCyan}
138
161
  Doxygen: ........... ${NGSTREFFTZ_BUILD_DOC}
139
162
  GTest: ............. ${NGSTREFFTZ_USE_GTEST}
140
163
  ngstents: .......... ${NGSTREFFTZ_USE_NGSTENTS}
164
+ xfem: .............. ${NGSTREFFTZ_USE_XFEM}
141
165
 
142
166
  With 'make install' the package will be installed to: ${CMAKE_INSTALL_PREFIX}
143
167
  Make sure to add it to the python path:
@@ -155,16 +179,21 @@ file(COPY
155
179
  ${CMAKE_SOURCE_DIR}/test/tents.py
156
180
  ${CMAKE_SOURCE_DIR}/test/conforming_trefftz.py
157
181
  ${CMAKE_SOURCE_DIR}/test/boxint.py
182
+ ${CMAKE_SOURCE_DIR}/test/aggregate_embtrefftz.py
158
183
  DESTINATION ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/Testing)
159
- add_test(NAME embtrefftz COMMAND python3 -m doctest ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/Testing/embt.py)
160
- add_test(NAME conforming_trefftz COMMAND python3 -m doctest ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/Testing/conforming_trefftz.py)
161
- add_test(NAME trefftz COMMAND python3 -m doctest ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/Testing/trefftz.py)
162
- set(tests_with_pythonpath embtrefftz trefftz)
184
+ add_test(NAME embtrefftz COMMAND ${Python3_EXECUTABLE} -m doctest ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/Testing/embt.py)
185
+ add_test(NAME conforming_trefftz COMMAND ${Python3_EXECUTABLE} -m doctest ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/Testing/conforming_trefftz.py)
186
+ add_test(NAME trefftz COMMAND ${Python3_EXECUTABLE} -m doctest ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/Testing/trefftz.py)
187
+ set(tests_with_pythonpath embtrefftz conforming_trefftz trefftz box)
163
188
  if(NGSTREFFTZ_USE_NGSTENTS)
164
- add_test(NAME tents COMMAND python3 -m doctest ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/Testing/tents.py)
189
+ add_test(NAME tents COMMAND ${Python3_EXECUTABLE} -m doctest ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/Testing/tents.py)
165
190
  list(APPEND tests_with_pythonpath tents)
166
191
  endif()
167
- add_test(NAME box COMMAND python3 -m doctest ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/Testing/boxint.py)
192
+ add_test(NAME box COMMAND ${Python3_EXECUTABLE} -m doctest ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/Testing/boxint.py)
193
+ if(NGSTREFFTZ_USE_XFEM)
194
+ add_test(NAME aggregate_embtrefftz COMMAND ${Python3_EXECUTABLE} ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/Testing/aggregate_embtrefftz.py)
195
+ list(APPEND tests_with_pythonpath aggregate_embtrefftz)
196
+ endif()
168
197
  #WORKING_DIRECTORY ${ CMAKE_CURRENT_SOURCE_DIR }
169
198
  set_tests_properties(${tests_with_pythonpath}
170
199
  PROPERTIES ENVIRONMENT PYTHONPATH=${CMAKE_LIBRARY_OUTPUT_DIRECTORY}:${NGSOLVE_INSTALL_DIR}/${NGSOLVE_INSTALL_DIR_PYTHON}:$ENV{PYTHONPATH})
@@ -1,14 +1,15 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: ngstrefftz
3
- Version: 0.3.2607.dev15
3
+ Version: 0.3.2607.dev25
4
4
  Summary: NGSTrefftz is an add-on to NGSolve for Trefftz methods.
5
5
  Author-Email: Paul Stocker <paul.stocker@univie.ac.at>
6
6
  Classifier: License :: OSI Approved :: GNU Lesser General Public License v3 (LGPLv3)
7
7
  Project-URL: Documentation, https://paulst.github.io/NGSTrefftz
8
8
  Project-URL: Repository, https://github.com/PaulSt/ngstrefftz
9
9
  Requires-Python: >=3.10
10
- Requires-Dist: ngsolve==6.2.2607
11
- Requires-Dist: ngstents==0.1.2607rc1
10
+ Requires-Dist: ngsolve==6.2.2608
11
+ Requires-Dist: ngstents==0.1.2608rc1
12
+ Requires-Dist: xfem==2.1.2608
12
13
  Description-Content-Type: text/markdown
13
14
 
14
15
  # NGSTrefftz
@@ -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 = '0.3.2607.dev15'
22
- __version_tuple__ = version_tuple = (0, 3, 2607, 'dev15')
21
+ __version__ = version = '0.3.2607.dev25'
22
+ __version_tuple__ = version_tuple = (0, 3, 2607, 'dev25')
23
23
 
24
- __commit_id__ = commit_id = 'g67e347b30'
24
+ __commit_id__ = commit_id = 'g2526e1fdf'
@@ -22,5 +22,3 @@ myst_parser>=3.0.1
22
22
  numpy>=2.0.0
23
23
  scipy>=1.13.1
24
24
  webgui-jupyter-widgets>=0.2.35
25
-
26
- # xfem==2.1.2606
@@ -9,8 +9,9 @@ classifiers = [
9
9
  "License :: OSI Approved :: GNU Lesser General Public License v3 (LGPLv3)",
10
10
  ]
11
11
  dependencies = [
12
- "ngsolve==6.2.2607",
13
- "ngstents==0.1.2607rc1",
12
+ "ngsolve==6.2.2608",
13
+ "ngstents==0.1.2608rc1",
14
+ "xfem==2.1.2608",
14
15
  ]
15
16
 
16
17
  [project.urls]
@@ -19,8 +20,9 @@ Repository = "https://github.com/PaulSt/ngstrefftz"
19
20
 
20
21
  [build-system]
21
22
  requires = [
22
- "ngsolve==6.2.2607",
23
- "ngstents==0.1.2607rc1",
23
+ "ngsolve==6.2.2608",
24
+ "ngstents==0.1.2608rc1",
25
+ "xfem==2.1.2608",
24
26
  "scikit-build-core>=0.9.0",
25
27
  "pybind11_stubgen",
26
28
  "setuptools>=45",
@@ -1,4 +1,13 @@
1
1
  import ngsolve
2
+ import sys
3
+
4
+ # xfem registers its DLL directory before loading our extension on Windows.
5
+ if sys.platform == "win32":
6
+ try:
7
+ import xfem as _xfem
8
+ except ModuleNotFoundError as _error:
9
+ if _error.name != "xfem":
10
+ raise
2
11
 
3
12
  try:
4
13
  import ngstents as _ngstents
@@ -0,0 +1,160 @@
1
+ #include "aggregatedl2space.hpp"
2
+
3
+ #include <python_comp.hpp>
4
+
5
+ namespace ngcomp
6
+ {
7
+ AggregatedL2Space::AggregatedL2Space (
8
+ shared_ptr<MeshAccess> ama, const Flags &flags,
9
+ shared_ptr<ElementAggregation> aaggregation)
10
+ : MonomialFESpace (ama, Flags (flags).SetFlag (
11
+ "order", flags.GetNumFlag ("order", 0))),
12
+ aggregation (aaggregation)
13
+ {
14
+ type = "aggregatedl2";
15
+ }
16
+
17
+ void AggregatedL2Space::Update ()
18
+ {
19
+ FESpace::Update ();
20
+
21
+ const size_t ne = ma->GetNE (VOL);
22
+ const size_t npatches = aggregation->GetNPatches (true);
23
+ element_to_patch.SetSize (ne);
24
+ element_to_patch = -1;
25
+ centers2.SetSize (npatches);
26
+ centers3.SetSize (npatches);
27
+ scales.SetSize (npatches);
28
+
29
+ Array<size_t> els;
30
+ for (size_t patch = 0; patch < npatches; patch++)
31
+ {
32
+ aggregation->GetPatch (patch, els);
33
+ for (size_t el : els)
34
+ element_to_patch[el] = patch;
35
+ if (D == 2)
36
+ UpdateGeometry<2> (patch, els);
37
+ else
38
+ UpdateGeometry<3> (patch, els);
39
+ }
40
+
41
+ SetNDof (npatches * local_ndof);
42
+ UpdateCouplingDofArray ();
43
+ }
44
+
45
+ void AggregatedL2Space::UpdateCouplingDofArray ()
46
+ {
47
+ ctofdof.SetSize (GetNDof ());
48
+ ctofdof = UNUSED_DOF;
49
+ for (size_t el : Range (ma->GetNE (VOL)))
50
+ if (element_to_patch[el] >= 0 && DefinedOn (ElementId (VOL, el)))
51
+ for (size_t j : Range (local_ndof))
52
+ ctofdof[element_to_patch[el] * local_ndof + j]
53
+ = aggregation->GetElsInNontrivialPatch ()->Test (el)
54
+ ? WIREBASKET_DOF
55
+ : LOCAL_DOF;
56
+ }
57
+
58
+ void AggregatedL2Space::GetDofNrs (ElementId ei, Array<DofId> &dnums) const
59
+ {
60
+ dnums.SetSize0 ();
61
+ if (ei.VB () != VOL || !DefinedOn (ei) || element_to_patch[ei.Nr ()] < 0)
62
+ return;
63
+ const int first = element_to_patch[ei.Nr ()] * local_ndof;
64
+ for (size_t j : Range (local_ndof))
65
+ dnums.Append (first + j);
66
+ }
67
+
68
+ DofPatches AggregatedL2Space::GetDofPatches () const
69
+ {
70
+ size_t npatches = aggregation->GetNPatches (true);
71
+ TableCreator<size_t> elements (npatches);
72
+ Array<size_t> els;
73
+ for (; !elements.Done (); elements++)
74
+ for (size_t p : Range (npatches))
75
+ {
76
+ aggregation->GetPatch (p, els);
77
+ for (size_t el : els)
78
+ elements.Add (p, el);
79
+ }
80
+ DofPatches patches{ elements.MoveTable (),
81
+ Table<DofId> (npatches, local_ndof) };
82
+ auto dofs = patches.dofs.AsArray ();
83
+ for (size_t d : Range (dofs))
84
+ dofs[d] = d;
85
+ return patches;
86
+ }
87
+
88
+ FiniteElement &
89
+ AggregatedL2Space::GetFE (ElementId ei, Allocator &alloc) const
90
+ {
91
+ if (ei.VB () != VOL)
92
+ return MonomialFESpace::GetFE (ei, alloc);
93
+ const int patch = element_to_patch[ei.Nr ()];
94
+ const ELEMENT_TYPE et = ma->GetElType (ei);
95
+ if (patch < 0 || !DefinedOn (ei))
96
+ return SwitchET<ET_TRIG, ET_QUAD, ET_TET, ET_HEX, ET_PRISM, ET_PYRAMID> (
97
+ et, [&alloc] (auto type) -> FiniteElement & {
98
+ return *new (alloc) DummyFE<type.ElementType ()>;
99
+ });
100
+ if (D == 2)
101
+ return *(new (alloc) ScalarMappedElement<2> (local_ndof, order, basismat,
102
+ et, centers2[patch],
103
+ Vec<2> (scales[patch])));
104
+ return *(new (alloc) ScalarMappedElement<3> (local_ndof, order, basismat,
105
+ et, centers3[patch],
106
+ Vec<3> (scales[patch])));
107
+ }
108
+
109
+ template <int DIM>
110
+ void AggregatedL2Space::UpdateGeometry (size_t patch, FlatArray<size_t> els)
111
+ {
112
+ Vec<DIM> center = 0.0;
113
+ size_t npoints = 0;
114
+ for (size_t el : els)
115
+ for (int vertex : ma->GetElVertices (ElementId (VOL, el)))
116
+ {
117
+ center += ma->GetPoint<DIM> (vertex);
118
+ npoints++;
119
+ }
120
+ center *= 1.0 / npoints;
121
+
122
+ double diameter = 0.0;
123
+ for (size_t el : els)
124
+ for (int vertex : ma->GetElVertices (ElementId (VOL, el)))
125
+ diameter
126
+ = max (diameter, L2Norm (ma->GetPoint<DIM> (vertex) - center));
127
+
128
+ if constexpr (DIM == 2)
129
+ centers2[patch] = center;
130
+ else
131
+ centers3[patch] = center;
132
+ scales[patch] = 1.0 / diameter;
133
+ }
134
+
135
+ template void
136
+ AggregatedL2Space::UpdateGeometry<2> (size_t, FlatArray<size_t>);
137
+ template void
138
+ AggregatedL2Space::UpdateGeometry<3> (size_t, FlatArray<size_t>);
139
+ }
140
+
141
+ #ifdef NGS_PYTHON
142
+ void ExportAggregatedL2Space (py::module m)
143
+ {
144
+ using namespace ngcomp;
145
+ py::class_<AggregatedL2Space, shared_ptr<AggregatedL2Space>, FESpace> (
146
+ m, "AggregatedL2Space")
147
+ .def (py::init ([] (shared_ptr<MeshAccess> ma,
148
+ shared_ptr<ElementAggregation> aggregation,
149
+ py::kwargs kwargs) {
150
+ Flags flags = ngcore::CreateFlagsFromKwArgs (kwargs);
151
+ auto fes
152
+ = make_shared<AggregatedL2Space> (ma, flags, aggregation);
153
+ fes->Update ();
154
+ fes->FinalizeUpdate ();
155
+ fes->ConnectAutoUpdate ();
156
+ return fes;
157
+ }),
158
+ py::arg ("mesh"), py::arg ("aggregation"));
159
+ }
160
+ #endif
@@ -0,0 +1,45 @@
1
+ #ifndef FILE_AGGREGATEDL2SPACE_HPP
2
+ #define FILE_AGGREGATEDL2SPACE_HPP
3
+
4
+ #include "monomialfespace.hpp"
5
+ #include "dofpatches.hpp"
6
+ #include <xfem/aggregates.hpp>
7
+
8
+ namespace ngcomp
9
+ {
10
+ class AggregatedL2Space : public MonomialFESpace, public DofPatchProvider
11
+ {
12
+ shared_ptr<ElementAggregation> aggregation;
13
+ Array<int> element_to_patch;
14
+ Array<Vec<2>> centers2;
15
+ Array<Vec<3>> centers3;
16
+ Array<double> scales;
17
+
18
+ public:
19
+ AggregatedL2Space (shared_ptr<MeshAccess> ama, const Flags &flags,
20
+ shared_ptr<ElementAggregation> aaggregation);
21
+
22
+ void Update () override;
23
+ void UpdateCouplingDofArray () override;
24
+ void GetDofNrs (ElementId ei, Array<DofId> &dnums) const override;
25
+ FiniteElement &GetFE (ElementId ei, Allocator &alloc) const override;
26
+ DofPatches GetDofPatches () const override;
27
+
28
+ string GetClassName () const override { return "AggregatedL2Space"; }
29
+ shared_ptr<ElementAggregation> GetAggregation () const
30
+ {
31
+ return aggregation;
32
+ }
33
+
34
+ private:
35
+ template <int DIM>
36
+ void UpdateGeometry (size_t patch, FlatArray<size_t> els);
37
+ };
38
+ }
39
+
40
+ #ifdef NGS_PYTHON
41
+ #include <python_ngstd.hpp>
42
+ void ExportAggregatedL2Space (py::module m);
43
+ #endif
44
+
45
+ #endif
@@ -0,0 +1,24 @@
1
+ #ifndef FILE_DOFPATCHES_HPP
2
+ #define FILE_DOFPATCHES_HPP
3
+
4
+ #include <comp.hpp>
5
+
6
+ namespace ngcomp
7
+ {
8
+ /// Independent trial DOF groups; their element supports may overlap.
9
+ /// Matching trial/test providers must number corresponding groups alike.
10
+ struct DofPatches
11
+ {
12
+ Table<size_t> elements;
13
+ Table<DofId> dofs;
14
+ };
15
+
16
+ class DofPatchProvider
17
+ {
18
+ public:
19
+ virtual ~DofPatchProvider () = default;
20
+ virtual DofPatches GetDofPatches () const = 0;
21
+ };
22
+ }
23
+
24
+ #endif