ngsolve 6.2.2506.post74.dev0__cp314-cp314-macosx_10_15_universal2.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.

Potentially problematic release.


This version of ngsolve might be problematic. Click here for more details.

Files changed (315) hide show
  1. netgen/include/analytic_integrals.hpp +10 -0
  2. netgen/include/arnoldi.hpp +55 -0
  3. netgen/include/bandmatrix.hpp +334 -0
  4. netgen/include/basematrix.hpp +957 -0
  5. netgen/include/basevector.hpp +1268 -0
  6. netgen/include/bdbequations.hpp +2805 -0
  7. netgen/include/bdbintegrator.hpp +1660 -0
  8. netgen/include/bem_diffops.hpp +475 -0
  9. netgen/include/bessel.hpp +1064 -0
  10. netgen/include/bilinearform.hpp +963 -0
  11. netgen/include/bla.hpp +29 -0
  12. netgen/include/blockalloc.hpp +95 -0
  13. netgen/include/blockjacobi.hpp +328 -0
  14. netgen/include/bspline.hpp +116 -0
  15. netgen/include/calcinverse.hpp +141 -0
  16. netgen/include/cg.hpp +368 -0
  17. netgen/include/chebyshev.hpp +44 -0
  18. netgen/include/cholesky.hpp +720 -0
  19. netgen/include/clapack.h +7254 -0
  20. netgen/include/code_generation.hpp +296 -0
  21. netgen/include/coefficient.hpp +2033 -0
  22. netgen/include/coefficient_impl.hpp +19 -0
  23. netgen/include/coefficient_stdmath.hpp +167 -0
  24. netgen/include/commutingAMG.hpp +106 -0
  25. netgen/include/comp.hpp +79 -0
  26. netgen/include/compatibility.hpp +41 -0
  27. netgen/include/complex_wrapper.hpp +73 -0
  28. netgen/include/compressedfespace.hpp +110 -0
  29. netgen/include/contact.hpp +235 -0
  30. netgen/include/diagonalmatrix.hpp +154 -0
  31. netgen/include/differentialoperator.hpp +276 -0
  32. netgen/include/diffop.hpp +1286 -0
  33. netgen/include/diffop_impl.hpp +328 -0
  34. netgen/include/diffopwithfactor.hpp +123 -0
  35. netgen/include/discontinuous.hpp +84 -0
  36. netgen/include/dump.hpp +949 -0
  37. netgen/include/ectypes.hpp +121 -0
  38. netgen/include/eigen.hpp +60 -0
  39. netgen/include/eigensystem.hpp +18 -0
  40. netgen/include/elasticity_equations.hpp +595 -0
  41. netgen/include/elementbyelement.hpp +195 -0
  42. netgen/include/elementtopology.hpp +1760 -0
  43. netgen/include/elementtransformation.hpp +339 -0
  44. netgen/include/evalfunc.hpp +405 -0
  45. netgen/include/expr.hpp +1686 -0
  46. netgen/include/facetfe.hpp +175 -0
  47. netgen/include/facetfespace.hpp +180 -0
  48. netgen/include/facethofe.hpp +111 -0
  49. netgen/include/facetsurffespace.hpp +112 -0
  50. netgen/include/fe_interfaces.hpp +32 -0
  51. netgen/include/fem.hpp +87 -0
  52. netgen/include/fesconvert.hpp +14 -0
  53. netgen/include/fespace.hpp +1449 -0
  54. netgen/include/finiteelement.hpp +286 -0
  55. netgen/include/globalinterfacespace.hpp +77 -0
  56. netgen/include/globalspace.hpp +115 -0
  57. netgen/include/gridfunction.hpp +525 -0
  58. netgen/include/h1amg.hpp +124 -0
  59. netgen/include/h1hofe.hpp +188 -0
  60. netgen/include/h1hofe_impl.hpp +1262 -0
  61. netgen/include/h1hofefo.hpp +148 -0
  62. netgen/include/h1hofefo_impl.hpp +185 -0
  63. netgen/include/h1hofespace.hpp +167 -0
  64. netgen/include/h1lofe.hpp +1240 -0
  65. netgen/include/h1lumping.hpp +41 -0
  66. netgen/include/hcurl_equations.hpp +1381 -0
  67. netgen/include/hcurlcurlfe.hpp +2241 -0
  68. netgen/include/hcurlcurlfespace.hpp +78 -0
  69. netgen/include/hcurlfe.hpp +259 -0
  70. netgen/include/hcurlfe_utils.hpp +107 -0
  71. netgen/include/hcurlhdiv_dshape.hpp +857 -0
  72. netgen/include/hcurlhdivfes.hpp +308 -0
  73. netgen/include/hcurlhofe.hpp +175 -0
  74. netgen/include/hcurlhofe_impl.hpp +1871 -0
  75. netgen/include/hcurlhofespace.hpp +193 -0
  76. netgen/include/hcurllofe.hpp +1146 -0
  77. netgen/include/hdiv_equations.hpp +880 -0
  78. netgen/include/hdivdivfe.hpp +2923 -0
  79. netgen/include/hdivdivsurfacespace.hpp +76 -0
  80. netgen/include/hdivfe.hpp +206 -0
  81. netgen/include/hdivfe_utils.hpp +717 -0
  82. netgen/include/hdivfes.hpp +75 -0
  83. netgen/include/hdivhofe.hpp +447 -0
  84. netgen/include/hdivhofe_impl.hpp +1107 -0
  85. netgen/include/hdivhofefo.hpp +229 -0
  86. netgen/include/hdivhofespace.hpp +177 -0
  87. netgen/include/hdivhosurfacefespace.hpp +106 -0
  88. netgen/include/hdivlofe.hpp +773 -0
  89. netgen/include/hidden.hpp +74 -0
  90. netgen/include/householder.hpp +181 -0
  91. netgen/include/hypre_ams_precond.hpp +123 -0
  92. netgen/include/hypre_precond.hpp +73 -0
  93. netgen/include/integrator.hpp +2012 -0
  94. netgen/include/integratorcf.hpp +253 -0
  95. netgen/include/interpolate.hpp +49 -0
  96. netgen/include/intrule.hpp +2542 -0
  97. netgen/include/intrules_SauterSchwab.hpp +25 -0
  98. netgen/include/irspace.hpp +49 -0
  99. netgen/include/jacobi.hpp +153 -0
  100. netgen/include/kernels.hpp +762 -0
  101. netgen/include/l2hofe.hpp +194 -0
  102. netgen/include/l2hofe_impl.hpp +564 -0
  103. netgen/include/l2hofefo.hpp +542 -0
  104. netgen/include/l2hofespace.hpp +344 -0
  105. netgen/include/la.hpp +38 -0
  106. netgen/include/linearform.hpp +266 -0
  107. netgen/include/matrix.hpp +2140 -0
  108. netgen/include/memusage.hpp +41 -0
  109. netgen/include/meshaccess.hpp +1359 -0
  110. netgen/include/mgpre.hpp +204 -0
  111. netgen/include/mp_coefficient.hpp +145 -0
  112. netgen/include/mptools.hpp +2281 -0
  113. netgen/include/multigrid.hpp +42 -0
  114. netgen/include/multivector.hpp +447 -0
  115. netgen/include/mumpsinverse.hpp +187 -0
  116. netgen/include/mycomplex.hpp +361 -0
  117. netgen/include/ng_lapack.hpp +1661 -0
  118. netgen/include/ngblas.hpp +1232 -0
  119. netgen/include/ngs_defines.hpp +30 -0
  120. netgen/include/ngs_stdcpp_include.hpp +106 -0
  121. netgen/include/ngs_utils.hpp +121 -0
  122. netgen/include/ngsobject.hpp +1019 -0
  123. netgen/include/ngsstream.hpp +113 -0
  124. netgen/include/ngstd.hpp +72 -0
  125. netgen/include/nodalhofe.hpp +96 -0
  126. netgen/include/nodalhofe_impl.hpp +141 -0
  127. netgen/include/normalfacetfe.hpp +223 -0
  128. netgen/include/normalfacetfespace.hpp +98 -0
  129. netgen/include/normalfacetsurfacefespace.hpp +84 -0
  130. netgen/include/order.hpp +251 -0
  131. netgen/include/parallel_matrices.hpp +222 -0
  132. netgen/include/paralleldofs.hpp +340 -0
  133. netgen/include/parallelngs.hpp +23 -0
  134. netgen/include/parallelvector.hpp +269 -0
  135. netgen/include/pardisoinverse.hpp +200 -0
  136. netgen/include/periodic.hpp +129 -0
  137. netgen/include/plateaufespace.hpp +25 -0
  138. netgen/include/pml.hpp +275 -0
  139. netgen/include/pmltrafo.hpp +631 -0
  140. netgen/include/postproc.hpp +142 -0
  141. netgen/include/potentialtools.hpp +22 -0
  142. netgen/include/precomp.hpp +60 -0
  143. netgen/include/preconditioner.hpp +602 -0
  144. netgen/include/prolongation.hpp +377 -0
  145. netgen/include/python_comp.hpp +107 -0
  146. netgen/include/python_fem.hpp +89 -0
  147. netgen/include/python_linalg.hpp +58 -0
  148. netgen/include/python_ngstd.hpp +386 -0
  149. netgen/include/recursive_pol.hpp +4896 -0
  150. netgen/include/recursive_pol_tet.hpp +395 -0
  151. netgen/include/recursive_pol_trig.hpp +492 -0
  152. netgen/include/reorderedfespace.hpp +81 -0
  153. netgen/include/sample_sort.hpp +105 -0
  154. netgen/include/scalarfe.hpp +335 -0
  155. netgen/include/shapefunction_utils.hpp +113 -0
  156. netgen/include/simd_complex.hpp +329 -0
  157. netgen/include/smoother.hpp +253 -0
  158. netgen/include/solve.hpp +89 -0
  159. netgen/include/sparsecholesky.hpp +313 -0
  160. netgen/include/sparsematrix.hpp +1038 -0
  161. netgen/include/sparsematrix_dyn.hpp +90 -0
  162. netgen/include/sparsematrix_impl.hpp +1013 -0
  163. netgen/include/special_matrix.hpp +463 -0
  164. netgen/include/specialelement.hpp +125 -0
  165. netgen/include/statushandler.hpp +33 -0
  166. netgen/include/stringops.hpp +12 -0
  167. netgen/include/superluinverse.hpp +136 -0
  168. netgen/include/symbolicintegrator.hpp +850 -0
  169. netgen/include/symmetricmatrix.hpp +144 -0
  170. netgen/include/tangentialfacetfe.hpp +224 -0
  171. netgen/include/tangentialfacetfespace.hpp +91 -0
  172. netgen/include/tensor.hpp +522 -0
  173. netgen/include/tensorcoefficient.hpp +446 -0
  174. netgen/include/tensorproductintegrator.hpp +113 -0
  175. netgen/include/thcurlfe.hpp +128 -0
  176. netgen/include/thcurlfe_impl.hpp +380 -0
  177. netgen/include/thdivfe.hpp +80 -0
  178. netgen/include/thdivfe_impl.hpp +492 -0
  179. netgen/include/tpdiffop.hpp +461 -0
  180. netgen/include/tpfes.hpp +133 -0
  181. netgen/include/tpintrule.hpp +224 -0
  182. netgen/include/triangular.hpp +465 -0
  183. netgen/include/tscalarfe.hpp +245 -0
  184. netgen/include/tscalarfe_impl.hpp +1029 -0
  185. netgen/include/umfpackinverse.hpp +148 -0
  186. netgen/include/vector.hpp +1273 -0
  187. netgen/include/voxelcoefficientfunction.hpp +41 -0
  188. netgen/include/vtkoutput.hpp +198 -0
  189. netgen/include/vvector.hpp +208 -0
  190. netgen/include/webgui.hpp +92 -0
  191. netgen/libngbla.dylib +0 -0
  192. netgen/libngcomp.dylib +0 -0
  193. netgen/libngfem.dylib +0 -0
  194. netgen/libngla.dylib +0 -0
  195. netgen/libngsbem.dylib +0 -0
  196. netgen/libngsolve.dylib +0 -0
  197. netgen/libngstd.dylib +0 -0
  198. ngsolve/TensorProductTools.py +210 -0
  199. ngsolve/__console.py +94 -0
  200. ngsolve/__expr.py +181 -0
  201. ngsolve/__init__.py +148 -0
  202. ngsolve/__init__.pyi +233 -0
  203. ngsolve/_scikit_build_core_dependencies.py +30 -0
  204. ngsolve/bla.pyi +1153 -0
  205. ngsolve/bvp.py +78 -0
  206. ngsolve/bvp.pyi +32 -0
  207. ngsolve/cmake/NGSolveConfig.cmake +102 -0
  208. ngsolve/cmake/ngsolve-targets-release.cmake +79 -0
  209. ngsolve/cmake/ngsolve-targets.cmake +163 -0
  210. ngsolve/comp/__init__.pyi +5449 -0
  211. ngsolve/comp/pml.pyi +89 -0
  212. ngsolve/config/__init__.py +1 -0
  213. ngsolve/config/__init__.pyi +43 -0
  214. ngsolve/config/__main__.py +4 -0
  215. ngsolve/config/config.py +60 -0
  216. ngsolve/config/config.pyi +45 -0
  217. ngsolve/demos/TensorProduct/__init__.py +0 -0
  218. ngsolve/demos/TensorProduct/tp_dg_1d_1d.py +80 -0
  219. ngsolve/demos/TensorProduct/tp_dg_1d_2d.py +73 -0
  220. ngsolve/demos/TensorProduct/tp_dg_2d_1d.py +72 -0
  221. ngsolve/demos/TensorProduct/tp_dg_2d_2d.py +66 -0
  222. ngsolve/demos/__init__.py +0 -0
  223. ngsolve/demos/howto/__init__.py +0 -0
  224. ngsolve/demos/howto/hhj.py +44 -0
  225. ngsolve/demos/howto/hybrid_dg.py +53 -0
  226. ngsolve/demos/howto/mixed.py +30 -0
  227. ngsolve/demos/howto/nonlin.py +29 -0
  228. ngsolve/demos/howto/pickling.py +26 -0
  229. ngsolve/demos/howto/pml.py +31 -0
  230. ngsolve/demos/howto/taskmanager.py +20 -0
  231. ngsolve/demos/howto/tdnns.py +47 -0
  232. ngsolve/demos/howto/timeDG-skeleton.py +45 -0
  233. ngsolve/demos/howto/timeDG.py +38 -0
  234. ngsolve/demos/howto/timeDGlap.py +42 -0
  235. ngsolve/demos/howto/timeDGwave.py +61 -0
  236. ngsolve/demos/intro/__init__.py +0 -0
  237. ngsolve/demos/intro/adaptive.py +123 -0
  238. ngsolve/demos/intro/cmagnet.py +59 -0
  239. ngsolve/demos/intro/elasticity.py +76 -0
  240. ngsolve/demos/intro/navierstokes.py +74 -0
  241. ngsolve/demos/intro/poisson.ipynb +170 -0
  242. ngsolve/demos/intro/poisson.py +41 -0
  243. ngsolve/demos/mpi/__init__.py +0 -0
  244. ngsolve/demos/mpi/mpi_cmagnet.py +87 -0
  245. ngsolve/demos/mpi/mpi_navierstokes.py +117 -0
  246. ngsolve/demos/mpi/mpi_poisson.py +89 -0
  247. ngsolve/demos/mpi/mpi_timeDG.py +82 -0
  248. ngsolve/directsolvers.py +26 -0
  249. ngsolve/directsolvers.pyi +15 -0
  250. ngsolve/eigenvalues.py +364 -0
  251. ngsolve/eigenvalues.pyi +30 -0
  252. ngsolve/fem.pyi +1647 -0
  253. ngsolve/internal.py +89 -0
  254. ngsolve/krylovspace.py +1013 -0
  255. ngsolve/krylovspace.pyi +298 -0
  256. ngsolve/la.pyi +1230 -0
  257. ngsolve/meshes.py +748 -0
  258. ngsolve/ngs2petsc.py +310 -0
  259. ngsolve/ngscxx.py +42 -0
  260. ngsolve/ngslib.so +0 -0
  261. ngsolve/ngstd.pyi +59 -0
  262. ngsolve/nonlinearsolvers.py +203 -0
  263. ngsolve/nonlinearsolvers.pyi +95 -0
  264. ngsolve/preconditioners.py +11 -0
  265. ngsolve/preconditioners.pyi +7 -0
  266. ngsolve/solve.pyi +109 -0
  267. ngsolve/solve_implementation.py +168 -0
  268. ngsolve/solve_implementation.pyi +42 -0
  269. ngsolve/solvers.py +7 -0
  270. ngsolve/solvers.pyi +14 -0
  271. ngsolve/timestepping.py +185 -0
  272. ngsolve/timestepping.pyi +28 -0
  273. ngsolve/timing.py +108 -0
  274. ngsolve/timing.pyi +54 -0
  275. ngsolve/utils.py +167 -0
  276. ngsolve/utils.pyi +273 -0
  277. ngsolve/webgui.py +670 -0
  278. ngsolve-6.2.2506.post74.dev0.data/data/Netgen.icns +0 -0
  279. ngsolve-6.2.2506.post74.dev0.data/data/bin/ngscxx +17 -0
  280. ngsolve-6.2.2506.post74.dev0.data/data/bin/ngsld +13 -0
  281. ngsolve-6.2.2506.post74.dev0.data/data/bin/ngsolve.tcl +648 -0
  282. ngsolve-6.2.2506.post74.dev0.data/data/bin/ngspy +2 -0
  283. ngsolve-6.2.2506.post74.dev0.data/data/share/ngsolve/beam.geo +17 -0
  284. ngsolve-6.2.2506.post74.dev0.data/data/share/ngsolve/beam.vol +240 -0
  285. ngsolve-6.2.2506.post74.dev0.data/data/share/ngsolve/chip.in2d +41 -0
  286. ngsolve-6.2.2506.post74.dev0.data/data/share/ngsolve/chip.vol +614 -0
  287. ngsolve-6.2.2506.post74.dev0.data/data/share/ngsolve/coil.geo +12 -0
  288. ngsolve-6.2.2506.post74.dev0.data/data/share/ngsolve/coil.vol +2560 -0
  289. ngsolve-6.2.2506.post74.dev0.data/data/share/ngsolve/coilshield.geo +24 -0
  290. ngsolve-6.2.2506.post74.dev0.data/data/share/ngsolve/coilshield.vol +3179 -0
  291. ngsolve-6.2.2506.post74.dev0.data/data/share/ngsolve/cube.geo +19 -0
  292. ngsolve-6.2.2506.post74.dev0.data/data/share/ngsolve/cube.vol +1832 -0
  293. ngsolve-6.2.2506.post74.dev0.data/data/share/ngsolve/d10_DGdoubleglazing.pde +50 -0
  294. ngsolve-6.2.2506.post74.dev0.data/data/share/ngsolve/d11_chip_nitsche.pde +40 -0
  295. ngsolve-6.2.2506.post74.dev0.data/data/share/ngsolve/d1_square.pde +43 -0
  296. ngsolve-6.2.2506.post74.dev0.data/data/share/ngsolve/d2_chip.pde +35 -0
  297. ngsolve-6.2.2506.post74.dev0.data/data/share/ngsolve/d3_helmholtz.pde +22 -0
  298. ngsolve-6.2.2506.post74.dev0.data/data/share/ngsolve/d4_cube.pde +46 -0
  299. ngsolve-6.2.2506.post74.dev0.data/data/share/ngsolve/d5_beam.pde +74 -0
  300. ngsolve-6.2.2506.post74.dev0.data/data/share/ngsolve/d6_shaft.pde +73 -0
  301. ngsolve-6.2.2506.post74.dev0.data/data/share/ngsolve/d7_coil.pde +50 -0
  302. ngsolve-6.2.2506.post74.dev0.data/data/share/ngsolve/d8_coilshield.pde +49 -0
  303. ngsolve-6.2.2506.post74.dev0.data/data/share/ngsolve/d9_hybridDG.pde +72 -0
  304. ngsolve-6.2.2506.post74.dev0.data/data/share/ngsolve/doubleglazing.in2d +27 -0
  305. ngsolve-6.2.2506.post74.dev0.data/data/share/ngsolve/doubleglazing.vol +737 -0
  306. ngsolve-6.2.2506.post74.dev0.data/data/share/ngsolve/piezo2d40round4.vol.gz +0 -0
  307. ngsolve-6.2.2506.post74.dev0.data/data/share/ngsolve/shaft.geo +73 -0
  308. ngsolve-6.2.2506.post74.dev0.data/data/share/ngsolve/shaft.vol +4291 -0
  309. ngsolve-6.2.2506.post74.dev0.data/data/share/ngsolve/square.in2d +17 -0
  310. ngsolve-6.2.2506.post74.dev0.data/data/share/ngsolve/square.vol +149 -0
  311. ngsolve-6.2.2506.post74.dev0.dist-info/METADATA +13 -0
  312. ngsolve-6.2.2506.post74.dev0.dist-info/RECORD +315 -0
  313. ngsolve-6.2.2506.post74.dev0.dist-info/WHEEL +5 -0
  314. ngsolve-6.2.2506.post74.dev0.dist-info/licenses/LICENSE +504 -0
  315. ngsolve-6.2.2506.post74.dev0.dist-info/top_level.txt +2 -0
@@ -0,0 +1,1449 @@
1
+ #ifndef FILE_FESPACE
2
+ #define FILE_FESPACE
3
+
4
+ /*********************************************************************/
5
+ /* File: fespace.hpp */
6
+ /* Author: Joachim Schoeberl */
7
+ /* Date: 25. Mar. 2000 */
8
+ /*********************************************************************/
9
+
10
+ #include <core/register_archive.hpp>
11
+
12
+ #include <finiteelement.hpp>
13
+ #include <diffop.hpp>
14
+ #include <symbolicintegrator.hpp> // for ProxyFunction
15
+
16
+ #include <basevector.hpp>
17
+ #include <basematrix.hpp>
18
+
19
+ // #include <paralleldofs.hpp>
20
+
21
+
22
+ #include "ngsobject.hpp"
23
+
24
+ namespace ngmg
25
+ {
26
+ class Prolongation;
27
+ }
28
+
29
+
30
+ namespace ngcomp
31
+ {
32
+ using namespace ngla;
33
+
34
+ /*
35
+ Finite Element Space
36
+ */
37
+
38
+
39
+ /**
40
+ transformation from local to global orientation
41
+ used for low order Nedelec elements
42
+ */
43
+ enum TRANSFORM_TYPE { TRANSFORM_MAT_LEFT = 1,
44
+ TRANSFORM_MAT_RIGHT = 2,
45
+ TRANSFORM_MAT_LEFT_RIGHT = 3,
46
+ TRANSFORM_RHS = 4,
47
+ TRANSFORM_SOL = 8,
48
+ TRANSFORM_SOL_INVERSE = 16};
49
+ /**
50
+ coupling types: Each degree of freedom is either
51
+ - an unused or hidden dof (invisible)
52
+ - a local degree of freedom
53
+ - an interface degree of freedom
54
+ or
55
+ - a wirebasket degree of freedom
56
+ */
57
+ enum COUPLING_TYPE : uint8_t { UNUSED_DOF = 0,
58
+ HIDDEN_DOF = 1,
59
+ LOCAL_DOF = 2,
60
+ CONDENSABLE_DOF = 3,
61
+ INTERFACE_DOF = 4,
62
+ NONWIREBASKET_DOF = 6,
63
+ WIREBASKET_DOF = 8,
64
+ EXTERNAL_DOF = 12,
65
+ VISIBLE_DOF = 14,
66
+ ANY_DOF = 15
67
+ };
68
+ /*
69
+ Bit encoding:
70
+ UNUSED 0 | 0
71
+ HIDDEN 1 | 1
72
+ LOCAL 1 0 | 2
73
+ CONDENSABLE 1 1 | 3
74
+ INTERFACE 1 0 0 | 4
75
+ NONWIREBASKET 1 1 0 | 6
76
+ WIREBASKET 1 0 0 0 | 8
77
+ EXTERNAL 1 1 0 0 | 12
78
+ VISIBLE 1 1 1 0 | 14
79
+ ANY 1 1 1 1 | 15
80
+ */
81
+
82
+ /**
83
+ constant_order .... one order for everything
84
+ node_type_order ... order for edges, or faces, gradients or curls, but all over the mesh
85
+ variable_order .... a different, anisotropic order for every mesh node
86
+ */
87
+ enum ORDER_POLICY { CONSTANT_ORDER = 0, NODE_TYPE_ORDER = 1, VARIABLE_ORDER = 2, OLDSTYLE_ORDER = 3 };
88
+
89
+
90
+
91
+ NGS_DLL_HEADER ostream & operator<< (ostream & ost, COUPLING_TYPE ct);
92
+
93
+
94
+ class FESpace;
95
+ class BilinearForm;
96
+
97
+ // will be size_t some day
98
+ typedef int DofId;
99
+ enum IRREGULAR_DOF_NR
100
+ {
101
+ NO_DOF_NR = -1, // don't assemble this dof (it has no regular number)
102
+ NO_DOF_NR_CONDENSE = -2 // condense out this dof, don't assemble to global system
103
+ };
104
+ INLINE bool IsRegularDof (DofId dof) { return dof >= 0; } // ATTENTION for size_t
105
+
106
+
107
+ using ngmg::Prolongation;
108
+
109
+
110
+ struct ProxyNode : public shared_ptr<ProxyFunction>
111
+ {
112
+ // shared_ptr<ProxyFunction> proxy;
113
+ std::vector<ProxyNode> list;
114
+
115
+ ProxyNode (shared_ptr<ProxyFunction> _proxy) : shared_ptr<ProxyFunction>(_proxy) { }
116
+ ProxyNode (std::vector<ProxyNode> _list) : list(_list) { }
117
+ auto operator* () const { return shared_ptr<ProxyFunction> (*this); }
118
+ auto operator[] (int i) const { return list[i]; }
119
+
120
+ void SetFESpace (shared_ptr<FESpace> fespace)
121
+ {
122
+ if (*this)
123
+ shared_ptr<ProxyFunction> (*this) -> SetFESpace(fespace);
124
+ else
125
+ for (auto node : list)
126
+ node.SetFESpace(fespace);
127
+ }
128
+ };
129
+
130
+
131
+
132
+
133
+ /**
134
+ Base class for finite element space.
135
+ Provides finite elements, global degrees of freedom,
136
+ and transformations of element-matrices and element-vectors
137
+ */
138
+ class NGS_DLL_HEADER FESpace : public NGS_Object
139
+ {
140
+ protected:
141
+ /// global order of finite elements
142
+ int order;
143
+ /// how many components
144
+ int dimension;
145
+ /// complex space
146
+ bool iscomplex;
147
+
148
+ /// couple (all) neighbouring degrees of freedom (like for jump terms of dg-methods)?
149
+ bool dgjumps;
150
+
151
+ /// whether the space should update itself on changes to the mesh
152
+ bool autoupdate;
153
+
154
+ /// debug output to testout
155
+ bool print;
156
+
157
+ /// prolongation operators between multigrid levels
158
+ shared_ptr<Prolongation> prol;// = NULL;
159
+ /// highest multigrid-level for which Update was called (memory allocation)
160
+ int level_updated;
161
+
162
+ /// on which subdomains is the space defined ?
163
+ Array<bool> definedon[4];
164
+
165
+ /// prototype: what are the Dirichlet boundaries ?
166
+ BitArray dirichlet_constraints[4];
167
+ BitArray & dirichlet_boundaries = dirichlet_constraints[1];
168
+
169
+ /// dofs on Dirichlet boundary
170
+ BitArray dirichlet_dofs;
171
+ shared_ptr<BitArray> free_dofs;
172
+ shared_ptr<BitArray> external_free_dofs;
173
+
174
+
175
+ Array<bool> dirichlet_vertex;
176
+ Array<bool> dirichlet_edge;
177
+ Array<bool> dirichlet_face;
178
+
179
+
180
+ /// Evaluator for visualization (new style)
181
+ shared_ptr<DifferentialOperator> evaluator[4];
182
+ /// Evaluator for flux
183
+ shared_ptr<DifferentialOperator> flux_evaluator[4];
184
+
185
+ SymbolTable<shared_ptr<DifferentialOperator>> additional_evaluators;
186
+
187
+ /// Evaluator for visualization (old style)
188
+ shared_ptr<BilinearFormIntegrator> integrator[4];
189
+
190
+ /// if non-zero, pointer to low order space
191
+ shared_ptr<FESpace> low_order_space;
192
+ shared_ptr<BaseMatrix> low_order_embedding;
193
+
194
+ /// if directsolverclustered[i] is true, then the unknowns of domain i are clustered
195
+ Array<bool> directsolverclustered;
196
+
197
+ Array<string> directsolvermaterials;
198
+
199
+ mutable Array<int> adddirectsolverdofs;
200
+
201
+ Array<int> directvertexclusters;
202
+ Array<int> directedgeclusters;
203
+ Array<int> directfaceclusters;
204
+ Array<int> directelementclusters;
205
+
206
+
207
+ Table<int> element_coloring[4];
208
+ Table<int> facet_coloring; // elements on facet in own colors (DG)
209
+ Array<COUPLING_TYPE> ctofdof;
210
+
211
+ shared_ptr<ParallelDofs> paralleldofs;
212
+
213
+ bool no_low_order_space;
214
+
215
+ int et_bonus_order[30]; // order increase for element-type
216
+
217
+ typedef int8_t TORDER;
218
+
219
+ ORDER_POLICY order_policy = OLDSTYLE_ORDER;
220
+
221
+ // size_t order_timestamp = 0;
222
+ BitArray is_atomic_dof;
223
+
224
+ // only a few spaces (lowest order Nedelec) need the transformation
225
+ // of element vectors
226
+ bool needs_transform_vec = true;
227
+
228
+
229
+ // move ndof and ndof_level to FESpace base class
230
+ size_t ndof;
231
+ Array<size_t> ndof_level;
232
+ protected:
233
+ void SetNDof (size_t _ndof);
234
+
235
+ public:
236
+ string type;
237
+ SimpleSignal updateSignal;
238
+ /**
239
+ Constructor.
240
+ Used flags are: \\
241
+ -order=<int>: finite element order \\
242
+ -dim=<int>: number of components \\
243
+ -complex: complex space \\
244
+ -dirichlet=<int-list>: dirichlet boundaries, 1-based \\
245
+ */
246
+ FESpace (shared_ptr<MeshAccess> ama, const Flags & flags,
247
+ bool checkflags = false);
248
+ FESpace (const FESpace &) = delete;
249
+ /// cleanup
250
+ virtual ~FESpace ();
251
+
252
+ static DocInfo GetDocu ();
253
+
254
+ /// update dof-table
255
+ virtual void Update();
256
+
257
+ virtual void UpdateDofTables() { ; }
258
+ virtual void UpdateCouplingDofArray() { ; }
259
+ virtual void UpdateFreeDofs();
260
+ /// update element coloring
261
+ virtual void FinalizeUpdate();
262
+
263
+ /// highest level where update/finalize was called
264
+ int GetLevelUpdated() const { return level_updated; }
265
+
266
+ const Table<int> & ElementColoring(VorB vb = VOL) const
267
+ { return element_coloring[vb]; }
268
+
269
+ const Table<int> & FacetColoring() const;
270
+
271
+ /// print report to stream
272
+ virtual void PrintReport (ostream & ost) const override;
273
+
274
+ /// Dump/restore fespace
275
+ virtual void DoArchive (Archive & archive);
276
+ std::tuple<Shallow<shared_ptr<MeshAccess>>, Flags> GetCArgs();
277
+
278
+ Array<MemoryUsage> GetMemoryUsage () const override;
279
+
280
+ /// order of finite elements
281
+ int GetOrder () const { return order; }
282
+
283
+ /*
284
+ void SetBonusOrder (ELEMENT_TYPE et, int bonus)
285
+ { et_bonus_order[et] = bonus; }
286
+ */
287
+ void SetOrderPolicy (ORDER_POLICY op)
288
+ {
289
+ order_policy = op;
290
+ }
291
+
292
+ virtual void SetOrder (ELEMENT_TYPE et, TORDER order);
293
+
294
+ virtual void SetOrder (NodeId ni, int order);
295
+ virtual int GetOrder (NodeId ni) const;
296
+
297
+ /// how many components
298
+ int GetDimension () const { return dimension; }
299
+
300
+ /// complex space ?
301
+ bool IsComplex () const { return iscomplex; }
302
+
303
+ virtual int GetSpatialDimension() const { return ma->GetDimension();}
304
+
305
+ /// number of (process-local) dofs
306
+ virtual size_t GetNDof () const { return ndof; }
307
+ /// number of dofs on the level
308
+ virtual size_t GetNDofLevel (int level) const
309
+ { return (level < ndof_level.Size()) ? ndof_level[level] : GetNDof(); }
310
+
311
+ virtual FlatArray<VorB> GetDualShapeNodes (VorB vb) const;
312
+
313
+ class Element : public Ngs_Element
314
+ {
315
+ const FESpace & fes;
316
+ Array<DofId> & temp_dnums;
317
+ LocalHeap & lh;
318
+ mutable bool dofs_set = false;
319
+ public:
320
+ INLINE Element (const FESpace & afes, ElementId id, Array<DofId> & atemp_dnums,
321
+ LocalHeap & alh)
322
+ : Ngs_Element ((*afes.GetMeshAccess())[id] ), fes(afes),
323
+ temp_dnums(atemp_dnums), lh(alh)
324
+ { ; }
325
+
326
+ INLINE Element (const Element & el) = default;
327
+ INLINE Element (Element && el) = default;
328
+ auto & GetFESpace() const { return fes; }
329
+ INLINE FlatArray<DofId> GetDofs() const
330
+ {
331
+ if (!dofs_set)
332
+ fes.GetDofNrs (*this, temp_dnums);
333
+ dofs_set = true;
334
+ return temp_dnums;
335
+ }
336
+
337
+ INLINE const ElementTransformation & GetTrafo() const
338
+ {
339
+ return fes.GetMeshAccess()->GetTrafo (ElementId(*this), lh);
340
+ }
341
+
342
+ INLINE const FiniteElement & GetFE() const
343
+ {
344
+ return fes.GetFE (ElementId(*this), lh);
345
+ }
346
+
347
+ INLINE LocalHeap & GetLH() const
348
+ {
349
+ return lh;
350
+ }
351
+ };
352
+
353
+ class ElementIterator
354
+ {
355
+ const FESpace & fes;
356
+ ElementId ei;
357
+ const FlatArray<bool> defined_on;
358
+ Array<DofId> & temp_dnums;
359
+ LocalHeap & lh;
360
+ void * heappointer;
361
+ public:
362
+ INLINE ElementIterator (const FESpace & afes, ElementId aei,
363
+ const FlatArray<bool> adefined_on,
364
+ Array<DofId> & atemp_dnums, LocalHeap & alh)
365
+ : fes(afes), ei(aei), defined_on(adefined_on),
366
+ temp_dnums(atemp_dnums), lh(alh), heappointer(lh.GetPointer()) { ; }
367
+ INLINE ElementIterator & operator++ ()
368
+ {
369
+ lh.CleanUp(heappointer);
370
+ ++ei;
371
+ while (ei.Nr() < fes.GetMeshAccess()->GetNE(VorB(ei)) &&
372
+ (defined_on.Size() &&
373
+ !defined_on[fes.GetMeshAccess()->GetElIndex(ei)])
374
+ ) ++ei;
375
+ return *this;
376
+ }
377
+ INLINE Element operator*() const { return Element (fes, ei, temp_dnums, lh); }
378
+ INLINE bool operator!=(const ElementIterator & id2) const { return ei != id2.ei; }
379
+ INLINE bool operator==(const ElementIterator & id2) const { return ei == id2.ei; }
380
+ };
381
+
382
+ class ElementRange : public IntRange
383
+ {
384
+ const FESpace & fes;
385
+ Array<bool> definedon;
386
+ const VorB vb;
387
+ mutable Array<DofId> temp_dnums;
388
+ mutable LocalHeap mylh;
389
+ LocalHeap & lh;
390
+ public:
391
+ INLINE ElementRange (const FESpace & afes, VorB avb, IntRange ar, LocalHeap && lh2)
392
+ : IntRange(ar), fes(afes),
393
+ definedon(fes.definedon[avb].Size(),fes.definedon[avb].Addr(0)),
394
+ vb(avb), mylh(std::move(lh2)), lh(mylh)
395
+ { ; }
396
+
397
+ INLINE ElementRange (const FESpace & afes, VorB avb, IntRange ar, LocalHeap & lh2)
398
+ : IntRange(ar), fes(afes),
399
+ definedon(fes.definedon[avb].Size(),fes.definedon[avb].Addr(0)),
400
+ vb(avb), mylh(), lh(lh2)
401
+ { ; }
402
+
403
+ ElementRange (const ElementRange & r2) = delete;
404
+
405
+ INLINE ElementRange (ElementRange && r2)
406
+ : IntRange(r2), fes(r2.fes), definedon(std::move(r2.definedon)), vb(r2.vb),
407
+ temp_dnums(std::move(r2.temp_dnums)), mylh(std::move(r2.mylh)),
408
+ lh( (&r2.mylh == &r2.lh) ? mylh : r2.lh)
409
+ { ; }
410
+
411
+ INLINE ~ElementRange () { ; }
412
+
413
+ ElementRange & operator= (const ElementRange & r2) = delete;
414
+
415
+ INLINE ElementIterator begin () const
416
+ {
417
+ ElementId ei = ElementId(vb,First());
418
+ while ((ei.Nr() < IntRange::end()) &&
419
+ (definedon.Size() && !definedon[fes.GetMeshAccess()->GetElIndex(ei)]))
420
+ ++ei;
421
+ return ElementIterator(fes, ei, definedon, temp_dnums, lh);
422
+ }
423
+
424
+ INLINE ElementIterator end () const
425
+ {
426
+ return ElementIterator(fes, ElementId(vb,Next()), definedon, temp_dnums, lh);
427
+ }
428
+ };
429
+
430
+ ElementRange Elements (VorB vb = VOL, LocalHeap && lh = 10000) const
431
+ {
432
+ // cout << "C++ FESpace::Elements with lh rvalue, name = " << lh.name << endl;
433
+ return ElementRange (*this, vb, IntRange (0, ma->GetNE(vb)), std::move(lh));
434
+ }
435
+
436
+ ElementRange Elements (VorB vb, LocalHeap & lh) const
437
+ {
438
+ return ElementRange (*this, vb, IntRange (0, ma->GetNE(vb)), lh);
439
+ }
440
+
441
+ /// returns finite element.
442
+ virtual FiniteElement & GetFE (ElementId ei, Allocator & lh) const = 0;
443
+
444
+
445
+ /// get dof-nrs of domain or boundary element elnr
446
+ virtual void GetDofNrs (ElementId ei, Array<DofId> & dnums) const = 0;
447
+
448
+ virtual void GetDofNrs (NodeId ni, Array<DofId> & dnums) const;
449
+ BitArray GetDofs (const Region & reg) const;
450
+ Table<int> CreateDofTable (VorB vorb) const;
451
+ virtual void SelectDofs (const string & name, BitArray & dofs) const;
452
+
453
+ /// get coupling types of dofs
454
+ virtual void GetDofCouplingTypes (int elnr, Array<COUPLING_TYPE> & dnums) const;
455
+
456
+ /// get coupling types of dof
457
+ // virtual COUPLING_TYPE GetDofCouplingType (DofId dof) const;
458
+ // make sure we have it, otherwise throw exception
459
+ bool CouplingTypeArrayAvailable() const { return ctofdof.Size() == GetNDof(); }
460
+ COUPLING_TYPE GetDofCouplingType (DofId dof) const
461
+ { return IsRegularDof(dof)
462
+ ? ( (ctofdof.Size()==0) ? WIREBASKET_DOF : ctofdof[dof]) // would like to rely on the ctarray
463
+ : ( (dof == NO_DOF_NR) ? UNUSED_DOF : HIDDEN_DOF ); }
464
+
465
+ virtual void SetDofCouplingType (DofId dof, COUPLING_TYPE ct) const;
466
+ auto & CouplingTypes() { return ctofdof; }
467
+ void CheckCouplingTypes() const;
468
+
469
+ /// get dof-nrs of the element of certain coupling type
470
+ void GetDofNrs (ElementId ei, Array<DofId> & dnums, COUPLING_TYPE ctype) const;
471
+
472
+ /// get dofs (local numbering) of a certain type
473
+ virtual void GetElementDofsOfType (ElementId ei, Array<DofId> & dnums, COUPLING_TYPE ctype) const;
474
+
475
+
476
+
477
+ /// get dofs on vertex vnr
478
+ // [[deprecated("Use GetDofNrs(NODE_TYPE(NT_VERTEX,nr) instead")]]
479
+ virtual void GetVertexDofNrs (int vnr, Array<DofId> & dnums) const;
480
+ /// get dofs on edge enr
481
+ // [[deprecated("Use GetDofNrs(NODE_TYPE(NT_EDGE,nr) instead")]]
482
+ virtual void GetEdgeDofNrs (int ednr, Array<DofId> & dnums) const;
483
+ /// get dofs on face fnr
484
+ virtual void GetFaceDofNrs (int fanr, Array<DofId> & dnums) const;
485
+ /// get dofs on element (=cell) elnr
486
+ virtual void GetInnerDofNrs (int elnr, Array<DofId> & dnums) const;
487
+ /// get dofs that are globally defined
488
+ virtual void GetGlobalDofNrs (int gnr, Array<DofId> & dnums) const;
489
+
490
+ virtual bool UsesDGCoupling () const throw() { return dgjumps; };
491
+
492
+ bool DoesAutoUpdate () const { return autoupdate; };
493
+ void ConnectAutoUpdate();
494
+
495
+
496
+ auto & DefinedOn(VorB vb) const { return definedon[vb]; }
497
+
498
+ bool DefinedOn(VorB vb, int domnr) const
499
+ { return !definedon[vb].Size() || definedon[vb][domnr]; }
500
+
501
+
502
+ bool DefinedOn (ElementId id) const
503
+ {
504
+ if(!definedon[id.VB()].Size()) return true;
505
+ return definedon[id.VB()][ma->GetElement(id).GetIndex()];
506
+ }
507
+
508
+ bool DefinedOn (Ngs_Element el) const
509
+ {
510
+ if(!definedon[el.VB()].Size()) return true;
511
+ return definedon[el.VB()][el.GetIndex()];
512
+ }
513
+
514
+ xbool DefinedOnX (Ngs_Element el) const
515
+ {
516
+ // a temporary workaround,
517
+ // clean solution will be to set definedon[BND] correctly
518
+ if (el.VB() <= BND) return DefinedOn(el);
519
+
520
+ if (!definedon[el.VB()].Size()) return maybe;
521
+ return definedon[el.VB()][el.GetIndex()];
522
+ }
523
+
524
+
525
+ virtual void SetDefinedOn (VorB vb, const BitArray& defon);
526
+ ///
527
+ //[[deprecated("Use SetDefinedOn(VorB, const Bitarray&)")]]
528
+ void SetDefinedOn (const BitArray & defon)
529
+ { SetDefinedOn(VOL,defon); }
530
+ ///
531
+ //[[deprecated("Use SetDefinedOn(VorB, const Bitarray&)")]]
532
+ void SetDefinedOnBoundary (const BitArray & defon)
533
+ { SetDefinedOn(BND,defon); }
534
+
535
+ ///
536
+ void SetDirichletBoundaries (const BitArray & dirbnds);
537
+ /// Get reference element for tet, prism, trig, etc ..
538
+ // const FiniteElement & GetFE (ELEMENT_TYPE type) const;
539
+
540
+ /// according low-order FESpace (if available)
541
+ [[deprecated("Use LowOrderFESpacePtr instead!")]]
542
+ FESpace & LowOrderFESpace () { return *low_order_space; }
543
+ /// according low-order FESpace (if available)
544
+ [[deprecated("Use LowOrderFESpacePtr instead!")]]
545
+ const FESpace & LowOrderFESpace () const { return *low_order_space; }
546
+ shared_ptr<FESpace> LowOrderFESpacePtr () const { return low_order_space; }
547
+ shared_ptr<BaseMatrix> LowOrderEmbedding () const { return low_order_embedding; }
548
+
549
+ /// non Dirichlet dofs
550
+ virtual shared_ptr<BitArray> GetFreeDofs (bool external = false) const;
551
+ bool IsFreeDof (DofId dof, bool external = false) const
552
+ {
553
+ if (external)
554
+ return external_free_dofs->Test(dof);
555
+ else
556
+ return free_dofs->Test(dof);
557
+ }
558
+ ///
559
+ bool IsDirichletDof (int i) const
560
+ { return dirichlet_dofs.Size() && dirichlet_dofs[i]; }
561
+
562
+ bool IsDirichletBoundary (int i) const
563
+ { return dirichlet_boundaries.Size() && dirichlet_boundaries[i]; }
564
+
565
+ /// is vertex on Dirichlet boundary ?
566
+ bool IsDirichletVertex (size_t i) const { return dirichlet_vertex.Size() && dirichlet_vertex[i]; }
567
+ /// is edge on Dirichlet boundary ?
568
+ bool IsDirichletEdge (size_t i) const { return dirichlet_edge.Size() && dirichlet_edge[i]; }
569
+ /// is face on Dirichlet boundary ?
570
+ bool IsDirichletFace (size_t i) const { return dirichlet_face.Size() && dirichlet_face[i]; }
571
+
572
+ void GetFilteredDofs(COUPLING_TYPE doffilter, BitArray & output, bool freedofsonly=true) const;
573
+ ///
574
+ virtual shared_ptr<Table<int>> CreateSmoothingBlocks (const Flags & flags) const;
575
+ /// for anisotropic plane smoothing:
576
+ virtual shared_ptr<Array<int>> CreateDirectSolverClusters (const Flags & flags) const
577
+ { return nullptr; }
578
+
579
+ virtual void AddDirectSolverClusterDof(int dn) const
580
+ { adddirectsolverdofs.Append(dn); }
581
+
582
+ virtual Array<int> & DirectVertexClusters(void)
583
+ { return directvertexclusters; }
584
+ virtual Array<int> & DirectEdgeClusters(void)
585
+ { return directedgeclusters; }
586
+ virtual Array<int> & DirectFaceClusters(void)
587
+ { return directfaceclusters; }
588
+ virtual Array<int> & DirectElementClusters(void)
589
+ { return directelementclusters; }
590
+
591
+ bool IsAtomicDof (size_t nr) const { return (is_atomic_dof.Size() != 0) && is_atomic_dof[nr]; }
592
+ bool HasAtomicDofs () const { return is_atomic_dof.Size() != 0; }
593
+
594
+
595
+ bool NeedsTransformVec() const { return needs_transform_vec; }
596
+
597
+ void TransformMat (ElementId ei,
598
+ SliceMatrix<double> mat, TRANSFORM_TYPE type) const
599
+ {
600
+ if (needs_transform_vec)
601
+ VTransformMR (ei, mat, type);
602
+ }
603
+ void TransformMat (ElementId ei,
604
+ SliceMatrix<Complex> mat, TRANSFORM_TYPE type) const
605
+ {
606
+ if (needs_transform_vec)
607
+ VTransformMC (ei, mat, type);
608
+ }
609
+ void TransformVec (ElementId ei,
610
+ SliceVector<double> vec, TRANSFORM_TYPE type) const
611
+ {
612
+ if (needs_transform_vec)
613
+ VTransformVR (ei, vec, type);
614
+ }
615
+ void TransformVec (ElementId ei,
616
+ SliceVector<Complex> vec, TRANSFORM_TYPE type) const
617
+ {
618
+ if (needs_transform_vec)
619
+ VTransformVC (ei, vec, type);
620
+ }
621
+
622
+ virtual void VTransformMR (ElementId ei,
623
+ const SliceMatrix<double> mat, TRANSFORM_TYPE type) const
624
+ { ; }
625
+ virtual void VTransformMC (ElementId ei,
626
+ const SliceMatrix<Complex> mat, TRANSFORM_TYPE type) const
627
+ { ; }
628
+
629
+
630
+ virtual void VTransformVR (ElementId ei,
631
+ const SliceVector<double> vec, TRANSFORM_TYPE type) const
632
+ { ; }
633
+ virtual void VTransformVC (ElementId ei,
634
+ const SliceVector<Complex> vec, TRANSFORM_TYPE type) const
635
+ { ; }
636
+
637
+
638
+ /// Returns multigrid-prolongation
639
+ virtual shared_ptr<Prolongation> GetProlongation () const;
640
+ // { return prol; }
641
+ /// Set multigrid prolongation
642
+ // void SetProlongation (ngmg::Prolongation * aprol)
643
+ // { prol = aprol; }
644
+ virtual void SetHarmonicProlongation (shared_ptr<BilinearForm> bfa, string inverse);
645
+
646
+ /// returns function-evaluator
647
+ shared_ptr<DifferentialOperator> GetEvaluator (VorB vb = VOL) const
648
+ {
649
+ return evaluator[vb];
650
+ }
651
+
652
+
653
+ shared_ptr<DifferentialOperator> GetFluxEvaluator (VorB vb = VOL) const
654
+ {
655
+ return flux_evaluator[vb];
656
+ }
657
+
658
+
659
+ virtual SymbolTable<shared_ptr<DifferentialOperator>> GetAdditionalEvaluators () const;
660
+ // { return additional_evaluators; }
661
+
662
+
663
+ shared_ptr<BilinearFormIntegrator> GetIntegrator (VorB vb = VOL) const;
664
+ /*
665
+ {
666
+ return integrator[vb];
667
+ }
668
+ */
669
+
670
+ ProxyNode GetProxyFunction(bool testfunction) const;
671
+ virtual ProxyNode MakeProxyFunction (bool testfunction,
672
+ const function<shared_ptr<ProxyFunction>(shared_ptr<ProxyFunction>)> & addblock) const;
673
+
674
+ auto GetTrialFunction() const { return GetProxyFunction(false); }
675
+ auto GetTestFunction() const { return GetProxyFunction(true); }
676
+
677
+
678
+ virtual shared_ptr<BaseMatrix> GetMassOperator (shared_ptr<CoefficientFunction> rho,
679
+ shared_ptr<Region> defon,
680
+ LocalHeap & lh) const;
681
+
682
+
683
+ virtual shared_ptr<BaseMatrix> CreateMassOperator (shared_ptr<CoefficientFunction> rho,
684
+ shared_ptr<Region> defon,
685
+ bool inverse,
686
+ LocalHeap & lh) const;
687
+
688
+ virtual void SolveM(CoefficientFunction * rho, BaseVector & vec, Region * definedon,
689
+ LocalHeap & lh) const;
690
+ virtual void ApplyM(CoefficientFunction * rho, BaseVector & vec, Region * definedon,
691
+ LocalHeap & lh) const;
692
+
693
+ virtual shared_ptr<BaseMatrix> GetTraceOperator (shared_ptr<FESpace> tracespace, bool avg) const;
694
+
695
+ virtual shared_ptr<BaseMatrix> ConvertL2Operator (shared_ptr<FESpace> l2space) const;
696
+
697
+ virtual void GetTrace (const FESpace & tracespace, const BaseVector & in, BaseVector & out, bool avg,
698
+ LocalHeap & lh) const;
699
+
700
+ virtual void GetTraceTrans (const FESpace & tracespace, const BaseVector & in, BaseVector & out, bool avg,
701
+ LocalHeap & lh) const;
702
+
703
+ shared_ptr<ParallelDofs> GetParallelDofs () const { return paralleldofs; }
704
+ virtual void UpdateParallelDofs ();
705
+
706
+ //// is FESpace mpi-distributed ?
707
+ bool IsParallel() const;
708
+
709
+ /// ndof over all mpi-partitions
710
+ size_t GetNDofGlobal() const;
711
+
712
+ virtual int GetRelOrder() const
713
+ {
714
+ return 0;
715
+ }
716
+
717
+ virtual bool VarOrder() const { return 0; }
718
+
719
+ bool timing;
720
+ std::list<std::tuple<std::string,double>> Timing () const;
721
+
722
+
723
+
724
+
725
+ /*
726
+ [[deprecated("Use GetFE with element-id instead of elnr!")]]
727
+ virtual const FiniteElement & GetFE (int elnr, LocalHeap & lh) const final;
728
+ [[deprecated("Use GetFE(ElementId(BND,elnr)) instead!")]]
729
+ virtual const FiniteElement & GetSFE (int elnr, LocalHeap & lh) const final;
730
+ [[deprecated("Use GetFE(ElementId(BBND,elnr)) instead!")]]
731
+ virtual const FiniteElement & GetCD2FE (int cd2elnr, LocalHeap & lh) const final;
732
+ */
733
+ /// get dof-nrs of the element
734
+ [[deprecated("Use GetDofNrs with element-id instead of elnr!")]]
735
+ void GetDofNrs (int elnr, Array<DofId> & dnums) const
736
+ { GetDofNrs(ElementId(VOL,elnr),dnums); }
737
+
738
+ [[deprecated("Use GetDofNrs with element-id instead of elnr!")]]
739
+ void GetDofNrs (int elnr, Array<DofId> & dnums, COUPLING_TYPE ctype) const;
740
+
741
+ /// get dofs on nr'th node of type nt.
742
+ [[deprecated("Use GetDofNrs with NodeId instead of nt/nr")]]
743
+ virtual void GetNodeDofNrs (NODE_TYPE nt, int nr, Array<int> & dnums) const final;
744
+ /// get number of low-order dofs for node of type nt
745
+ // virtual int GetNLowOrderNodeDofs ( NODE_TYPE nt ) const;
746
+ // { return lodofs_per_node[nt]; }
747
+
748
+ /// returns dofs of sourface element
749
+ [[deprecated("Use GetDofNrs(ElementId(BND,elnr)) instead!")]]
750
+ void GetSDofNrs (int selnr, Array<DofId> & dnums) const
751
+ { GetDofNrs(ElementId(BND,selnr),dnums); }
752
+
753
+ /// is the FESpace defined for this sub-domain nr ?
754
+ [[deprecated("Use Definedon(VorB,int) instead")]]
755
+ bool DefinedOn (int domnr) const
756
+ { return !definedon[VOL].Size() || definedon[VOL][domnr]; }
757
+ /// is the FESpace defined for this boundary nr ?
758
+ [[deprecated("Use Definedon(VorB,int) instead")]]
759
+ bool DefinedOnBoundary (int bnr) const
760
+ {return !definedon[BND].Size() || definedon[BND][bnr]; }
761
+
762
+ /// is the FESpace defined for this sub-domain / boundary nr ?
763
+ [[deprecated("Use DefinedOn(VorB, int) instead")]]
764
+ bool DefinedOn (int index, bool bound) const
765
+ {
766
+ if (bound)
767
+ return !definedon[BND].Size() || definedon[BND][index];
768
+ else
769
+ return !definedon[VOL].Size() || definedon[VOL][index];
770
+ }
771
+
772
+ [[deprecated("Use TransformMat with VorB instead of bool")]]
773
+ void TransformMat (int elnr, bool boundary,
774
+ const SliceMatrix<double> & mat, TRANSFORM_TYPE type) const
775
+ {
776
+ TransformMat(ElementId(boundary ? BND : VOL, elnr), mat, type);
777
+ }
778
+
779
+ [[deprecated("Use TransformMat with VorB instead of bool")]]
780
+ void TransformMat (int elnr, bool boundary,
781
+ const SliceMatrix<Complex> & mat, TRANSFORM_TYPE type) const
782
+ {
783
+ TransformMat(ElementId(boundary ? BND : VOL, elnr), mat, type);
784
+ }
785
+
786
+ [[deprecated("Use TransformVec with VorB instead of bool")]]
787
+ void TransformVec (int elnr, bool boundary,
788
+ const FlatVector<double> & vec, TRANSFORM_TYPE type) const
789
+ {
790
+ // VTransformVR (elnr, boundary ? BND : VOL, vec, type);
791
+ VTransformVR (ElementId(boundary ? BND : VOL, elnr), vec, type);
792
+ }
793
+
794
+ [[deprecated("Use TransformVec with VorB instead of bool")]]
795
+ void TransformVec (int elnr, bool boundary,
796
+ const FlatVector<Complex> & vec, TRANSFORM_TYPE type) const
797
+ {
798
+ // VTransformVC (elnr, boundary ? BND : VOL, vec, type);
799
+ VTransformVC (ElementId(boundary ? BND : VOL, elnr), vec, type);
800
+ }
801
+
802
+ [[deprecated("Use TransformMat with VorB instead of bool")]]
803
+ void TransformMat (int elnr, VorB vb,
804
+ const SliceMatrix<double> & mat, TRANSFORM_TYPE type) const
805
+ {
806
+ // VTransformMR (elnr, vb, mat, type);
807
+ VTransformMR (ElementId(vb, elnr), mat, type);
808
+ }
809
+
810
+ [[deprecated("Use TransformMat with VorB instead of bool")]]
811
+ void TransformMat (int elnr, VorB vb,
812
+ const SliceMatrix<Complex> & mat, TRANSFORM_TYPE type) const
813
+ {
814
+ // VTransformMC (elnr, vb, mat, type);
815
+ VTransformMC (ElementId(vb, elnr), mat, type);
816
+ }
817
+
818
+ [[deprecated("Use TransformVec with VorB instead of bool")]]
819
+ void TransformVec (int elnr, VorB vb,
820
+ const FlatVector<double> & vec, TRANSFORM_TYPE type) const
821
+ {
822
+ // VTransformVR (elnr, vb, vec, type);
823
+ VTransformVR (ElementId(vb, elnr), vec, type);
824
+ }
825
+
826
+ [[deprecated("Use TransformVec with VorB instead of bool")]]
827
+ void TransformVec (int elnr, VorB vb,
828
+ const FlatVector<Complex> & vec, TRANSFORM_TYPE type) const
829
+ {
830
+ // VTransformVC (elnr, vb, vec, type);
831
+ VTransformVC (ElementId(vb, elnr), vec, type);
832
+ }
833
+
834
+ [[deprecated("Use GetEvaluator(VorB) instead of GetEvaluator(bool)!")]]
835
+ shared_ptr<DifferentialOperator> GetEvaluator (bool boundary) const
836
+ {
837
+ if(boundary)
838
+ return evaluator[BND];
839
+ else
840
+ return evaluator[VOL];
841
+ }
842
+
843
+ [[deprecated("Use GetFluxEvaluator(VorB) instead of GetFluxEvaluator(bool)!")]]
844
+ shared_ptr<DifferentialOperator> GetFluxEvaluator (bool boundary) const
845
+ {
846
+ if(boundary)
847
+ return flux_evaluator[BND];
848
+ else
849
+ return flux_evaluator[VOL];
850
+ }
851
+
852
+ /// returns function-evaluator
853
+ [[deprecated("Use GetIntegrator(VorB) instead of GetIntegrator(bool)!")]]
854
+ shared_ptr<BilinearFormIntegrator> GetIntegrator (bool vb = VOL) const
855
+ {
856
+ return integrator[vb];
857
+ }
858
+ };
859
+
860
+
861
+
862
+ extern NGS_DLL_HEADER void IterateElements (const FESpace & fes,
863
+ VorB vb,
864
+ LocalHeap & clh,
865
+ const function<void(FESpace::Element,LocalHeap&)> & func);
866
+
867
+
868
+
869
+ /**
870
+ A space of continuous finite elements.
871
+ Supports first and second order finite elements.
872
+ */
873
+ class NGS_DLL_HEADER NodalFESpace : public FESpace
874
+ {
875
+ ///
876
+ // Array<int> ndlevel;
877
+ bool hb_defined;
878
+ Array<bool> used_vertex;
879
+ Array<bool> used_edge;
880
+
881
+ public:
882
+
883
+ ///
884
+ NodalFESpace (shared_ptr<MeshAccess> ama, const Flags & flags, bool parseflags=false);
885
+ ///
886
+ virtual ~NodalFESpace ();
887
+
888
+ ///
889
+ virtual string GetClassName () const override
890
+ {
891
+ return "NodalFESpace";
892
+ }
893
+
894
+ ///
895
+ void Update () override;
896
+ void UpdateCouplingDofArray() override;
897
+
898
+ virtual void DoArchive (Archive & archive) override;
899
+
900
+ virtual FiniteElement & GetFE(ElementId ei, Allocator & lh) const override;
901
+ ///
902
+ // virtual size_t GetNDof () const throw() override;
903
+ ///
904
+ // virtual size_t GetNDofLevel (int level) const override;
905
+ ///
906
+ // using FESpace::GetDofNrs;
907
+ virtual void GetDofNrs (ElementId ei, Array<DofId> & dnums) const override;
908
+ ///
909
+
910
+ virtual void GetVertexDofNrs (int vnr, Array<DofId> & dnums) const override;
911
+ virtual void GetEdgeDofNrs (int ednr, Array<DofId> & dnums) const override;
912
+ virtual void GetFaceDofNrs (int fanr, Array<DofId> & dnums) const override;
913
+ virtual void GetInnerDofNrs (int elnr, Array<DofId> & dnums) const override;
914
+
915
+ virtual shared_ptr<Array<int>> CreateDirectSolverClusters (const Flags & flags) const override;
916
+ };
917
+
918
+
919
+
920
+
921
+
922
+
923
+ ///
924
+ class NGS_DLL_HEADER NonconformingFESpace : public FESpace
925
+ {
926
+ ///
927
+ // Array<int> ndlevel;
928
+
929
+ public:
930
+ NonconformingFESpace (shared_ptr<MeshAccess> ama, const Flags & flags, bool parseflags=false);
931
+ virtual ~NonconformingFESpace ();
932
+
933
+ virtual string GetClassName () const override
934
+ { return "Nonconforming FESpace"; }
935
+
936
+ ///
937
+ void Update() override;
938
+
939
+ virtual FiniteElement & GetFE (ElementId ei, Allocator & lh) const override;
940
+ ///
941
+ // virtual size_t GetNDof () const throw() override;
942
+ ///
943
+ virtual void GetDofNrs (ElementId ei, Array<DofId> & dnums) const override;
944
+ };
945
+
946
+
947
+
948
+ ///
949
+ class NGS_DLL_HEADER NonconformingSurfaceFESpace : public FESpace
950
+ {
951
+ ///
952
+ // Array<int> ndlevel;
953
+
954
+ public:
955
+ NonconformingSurfaceFESpace (shared_ptr<MeshAccess> ama, const Flags & flags, bool parseflags=false);
956
+ virtual ~NonconformingSurfaceFESpace ();
957
+
958
+ virtual string GetClassName () const override
959
+ { return "Nonconforming surface FESpace"; }
960
+
961
+ ///
962
+ void Update() override;
963
+
964
+ virtual FiniteElement & GetFE (ElementId ei, Allocator & lh) const override;
965
+ ///
966
+ // virtual size_t GetNDof () const throw() override;
967
+ ///
968
+ virtual void GetDofNrs (ElementId ei, Array<DofId> & dnums) const override;
969
+ };
970
+
971
+
972
+
973
+
974
+
975
+
976
+
977
+ ///
978
+ class NGS_DLL_HEADER ElementFESpace : public FESpace
979
+ {
980
+ /// Array<int> startelement;
981
+ // Array<int> ndlevel;
982
+ int n_el_dofs;
983
+ public:
984
+ ///
985
+ ElementFESpace (shared_ptr<MeshAccess> ama, const Flags& flags, bool parseflags=false);
986
+
987
+ ///
988
+ ~ElementFESpace ();
989
+
990
+ virtual string GetClassName () const override
991
+ {
992
+ return "ElementFESpace";
993
+ }
994
+
995
+ ///
996
+ void Update() override;
997
+ ///
998
+ virtual void DoArchive (Archive & archive) override;
999
+
1000
+ virtual FiniteElement & GetFE (ElementId ei, Allocator & lh) const override;
1001
+ ///
1002
+ // virtual size_t GetNDof () const throw() override { return ndlevel.Last(); }
1003
+
1004
+ ///
1005
+ virtual void GetDofNrs (ElementId ei, Array<DofId> & dnums) const override;
1006
+
1007
+ ///
1008
+ // virtual size_t GetNDofLevel (int level) const override;
1009
+
1010
+
1011
+ virtual void GetVertexDofNrs (int vnr, Array<DofId> & dnums) const override
1012
+ { dnums.SetSize (0); }
1013
+ virtual void GetEdgeDofNrs (int ednr, Array<DofId> & dnums) const override
1014
+ { dnums.SetSize (0); }
1015
+ virtual void GetFaceDofNrs (int fanr, Array<DofId> & dnums) const override
1016
+ { dnums.SetSize (0); }
1017
+ virtual void GetInnerDofNrs (int elnr, Array<DofId> & dnums) const override
1018
+ { GetDofNrs (elnr, dnums); }
1019
+ };
1020
+
1021
+
1022
+
1023
+
1024
+
1025
+ /// Non-continous fe space on boundary
1026
+ class NGS_DLL_HEADER SurfaceElementFESpace : public FESpace
1027
+ {
1028
+ ///
1029
+ // Array<int> ndlevel;
1030
+ int n_el_dofs;
1031
+ public:
1032
+ ///
1033
+ SurfaceElementFESpace (shared_ptr<MeshAccess> ama, const Flags& flags,
1034
+ bool checkflags = false);
1035
+
1036
+ ///
1037
+ ~SurfaceElementFESpace ();
1038
+
1039
+ ///
1040
+ virtual string GetClassName() const override
1041
+ { return "SurfaceElement"; }
1042
+
1043
+ ///
1044
+ void Update() override;
1045
+
1046
+ ///
1047
+ // virtual size_t GetNDof () const throw() { return ndlevel.Last(); }
1048
+
1049
+ ///
1050
+ virtual FiniteElement & GetFE (ElementId ei, Allocator & lh) const override;
1051
+
1052
+ ///
1053
+ virtual void GetDofNrs (ElementId ei, Array<DofId> & dnums) const override;
1054
+
1055
+ ///
1056
+ // virtual size_t GetNDofLevel (int level) const;
1057
+
1058
+ };
1059
+
1060
+
1061
+
1062
+
1063
+
1064
+
1065
+
1066
+ /// A combination of fe-spaces
1067
+ class NGS_DLL_HEADER CompoundFESpace : public FESpace
1068
+ {
1069
+ protected:
1070
+ /// pointers to components
1071
+ Array<shared_ptr<FESpace>> spaces;
1072
+ /// cummlated number of dofs of components
1073
+ Array<int> cummulative_nd;
1074
+ /// dofs on each multigrid level
1075
+ /// Array<int> ndlevel;
1076
+ bool all_the_same;
1077
+ bool do_subspace_update = true;
1078
+ public:
1079
+ /// generates a compound space.
1080
+ /// components will be added later
1081
+ CompoundFESpace (shared_ptr<MeshAccess> ama,
1082
+ const Flags & flags, bool parseflags = false);
1083
+ /// generates a compound space
1084
+ /// components are provided in aspaces
1085
+ CompoundFESpace (shared_ptr<MeshAccess> ama,
1086
+ const Array<shared_ptr<FESpace>> & aspaces,
1087
+ const Flags & flags, bool parseflags = false);
1088
+
1089
+ /// not much to do.
1090
+ /// components will not be deleted
1091
+ virtual ~CompoundFESpace ();
1092
+
1093
+ /// add an additional component space
1094
+ void AddSpace (shared_ptr<FESpace> fes);
1095
+ auto & Spaces() const { return spaces; }
1096
+
1097
+ ///
1098
+ string GetClassName () const override
1099
+ {
1100
+ return "CompoundFESpace";
1101
+ }
1102
+
1103
+ /// updates also components
1104
+ void Update() override;
1105
+ /// updates also components
1106
+ void FinalizeUpdate() override;
1107
+
1108
+ ProxyNode MakeProxyFunction (bool testfunction,
1109
+ const function<shared_ptr<ProxyFunction>(shared_ptr<ProxyFunction>)> & addblock) const override;
1110
+
1111
+ /// copies dofcoupling from components
1112
+ void UpdateCouplingDofArray() override;
1113
+ virtual void UpdateFreeDofs() override;
1114
+
1115
+ void SetDefinedOn (VorB vb, const BitArray& defon) override;
1116
+
1117
+ DofRange GetRange (int spacenr) const
1118
+ {
1119
+ if (spacenr+1 >= cummulative_nd.Size())
1120
+ throw Exception("spacenr >= cummulative_nd.Size() in CompoundFESpace!");
1121
+
1122
+ return DofRange(IntRange(cummulative_nd[spacenr], cummulative_nd[spacenr+1]),
1123
+ spaces[spacenr]->GetParallelDofs());
1124
+ }
1125
+
1126
+ shared_ptr<BaseMatrix> EmbeddingOperator (int spacenr) const;
1127
+ shared_ptr<BaseMatrix> RestrictionOperator (int spacenr) const;
1128
+
1129
+ /// get component space
1130
+ shared_ptr<FESpace> operator[] (int i) const { return spaces[i]; }
1131
+
1132
+ /// returns a compound finite element
1133
+ FiniteElement & GetFE (ElementId ei, Allocator & lh) const override;
1134
+ ///
1135
+ void GetDofNrs (ElementId ei, Array<DofId> & dnums) const override;
1136
+ void GetDofNrs (NodeId ni, Array<DofId> & dnums) const override;
1137
+ void GetElementDofsOfType (ElementId ei, Array<DofId> & dnums, COUPLING_TYPE ctype) const override;
1138
+ ///
1139
+ [[deprecated("Use GetDofNrs(NODE_TYPE(NT_VERTEX,nr) instead")]]
1140
+ void GetVertexDofNrs (int vnr, Array<DofId> & dnums) const override;
1141
+ [[deprecated("Use GetDofNrs(NODE_TYPE(NT_EDGE,nr) instead")]]
1142
+ void GetEdgeDofNrs (int ednr, Array<DofId> & dnums) const override;
1143
+ void GetFaceDofNrs (int fanr, Array<DofId> & dnums) const override;
1144
+ void GetInnerDofNrs (int elnr, Array<DofId> & dnums) const override;
1145
+ void SelectDofs (const string & name, BitArray & dofs) const override;
1146
+
1147
+ void SolveM(CoefficientFunction * rho, BaseVector & vec, Region * definedon,
1148
+ LocalHeap & lh) const override;
1149
+ void ApplyM(CoefficientFunction * rho, BaseVector & vec, Region * definedon,
1150
+ LocalHeap & lh) const override;
1151
+
1152
+ template <class T> NGS_DLL_HEADER
1153
+ void T_TransformMat (ElementId ei,
1154
+ SliceMatrix<T> mat, TRANSFORM_TYPE tt) const;
1155
+
1156
+ template <class T> NGS_DLL_HEADER
1157
+ void T_TransformVec (ElementId ei,
1158
+ SliceVector<T> vec, TRANSFORM_TYPE tt) const;
1159
+
1160
+ void VTransformMR (ElementId ei,
1161
+ SliceMatrix<double> mat, TRANSFORM_TYPE tt) const override;
1162
+ void VTransformMC (ElementId ei,
1163
+ SliceMatrix<Complex> mat, TRANSFORM_TYPE tt) const override;
1164
+ void VTransformVR (ElementId ei,
1165
+ SliceVector<double> vec, TRANSFORM_TYPE tt) const override;
1166
+ void VTransformVC (ElementId ei,
1167
+ SliceVector<Complex> vec, TRANSFORM_TYPE tt) const override;
1168
+
1169
+ /// number of component spaces
1170
+ inline int GetNSpaces () const { return spaces.Size(); }
1171
+
1172
+ void SetDoSubspaceUpdate(bool _do_subspace_update)
1173
+ { do_subspace_update = _do_subspace_update; }
1174
+ };
1175
+
1176
+
1177
+
1178
+ class NGS_DLL_HEADER CompoundFESpaceAllSame : public CompoundFESpace
1179
+ {
1180
+ bool interleaved;
1181
+ public:
1182
+ CompoundFESpaceAllSame (shared_ptr<FESpace> space, int dim, const Flags & flags,
1183
+ bool checkflags = false);
1184
+ virtual string GetClassName () const override;
1185
+
1186
+ virtual FiniteElement & GetFE (ElementId ei, Allocator & alloc) const override {
1187
+ return *new (alloc) VectorFiniteElement (spaces[0]->GetFE(ei, alloc), spaces.Size());
1188
+ }
1189
+
1190
+ virtual FlatArray<VorB> GetDualShapeNodes (VorB vb) const override
1191
+ {
1192
+ return spaces[0]->GetDualShapeNodes(vb);
1193
+ }
1194
+
1195
+ virtual shared_ptr<BaseMatrix> GetTraceOperator (shared_ptr<FESpace> tracespace, bool avg) const override;
1196
+ };
1197
+
1198
+ class NGS_DLL_HEADER MatrixFESpace : public CompoundFESpace
1199
+ {
1200
+ bool symmetric;
1201
+ bool deviatoric;
1202
+ bool skewsymmetric;
1203
+ int vdim;
1204
+ public:
1205
+ MatrixFESpace (shared_ptr<FESpace> space, int avdim, const Flags & flags,
1206
+ bool checkflags = false);
1207
+ virtual string GetClassName () const override;
1208
+ FiniteElement & GetFE (ElementId ei, Allocator & lh) const override;
1209
+ };
1210
+
1211
+
1212
+
1213
+ template <typename BASESPACE>
1214
+ class VectorFESpace : public CompoundFESpace
1215
+ {
1216
+ public:
1217
+ VectorFESpace (shared_ptr<MeshAccess> ama, const Flags & flags,
1218
+ bool checkflags = false)
1219
+ : CompoundFESpace (ama, flags)
1220
+ {
1221
+ Array<string> dirichlet_comp;
1222
+ string dirnames[] = { "dirichletx", "dirichlety", "dirichletz" };
1223
+ for (int i = 0; i < ma->GetDimension(); i++)
1224
+ {
1225
+ Flags tmpflags = flags;
1226
+ if (flags.StringFlagDefined(dirnames[i]))
1227
+ tmpflags.SetFlag ("dirichlet", flags.GetStringFlag(dirnames[i]));
1228
+ if (flags.StringFlagDefined(dirnames[i]+"_bbnd"))
1229
+ tmpflags.SetFlag ("dirichlet_bbnd", flags.GetStringFlag(dirnames[i]+"_bbnd"));
1230
+ AddSpace (make_shared<BASESPACE> (ama, tmpflags));
1231
+ }
1232
+
1233
+ for (auto vb : { VOL, BND, BBND, BBBND })
1234
+ {
1235
+ if (auto eval = spaces[0] -> GetEvaluator(vb))
1236
+ evaluator[vb] = make_shared<VectorDifferentialOperator> (eval, ma->GetDimension());
1237
+ if (auto fluxeval = spaces[0] -> GetFluxEvaluator(vb))
1238
+ flux_evaluator[vb] = make_shared<VectorDifferentialOperator> (fluxeval, ma->GetDimension());
1239
+ }
1240
+
1241
+ auto additional = spaces[0]->GetAdditionalEvaluators();
1242
+ for (int i = 0; i < additional.Size(); i++)
1243
+ additional_evaluators.Set (additional.GetName(i),
1244
+ make_shared<VectorDifferentialOperator>(additional[i], ma->GetDimension()));
1245
+
1246
+ type = "Vector"+(*this)[0]->type;
1247
+ }
1248
+
1249
+ virtual string GetClassName () const override
1250
+ {
1251
+ return "Vector"+ (*this)[0]->GetClassName();
1252
+ }
1253
+
1254
+ FiniteElement & GetFE (ElementId ei, Allocator & alloc) const override {
1255
+ return *new (alloc) VectorFiniteElement (spaces[0]->GetFE(ei, alloc), spaces.Size());
1256
+ }
1257
+
1258
+ virtual FlatArray<VorB> GetDualShapeNodes (VorB vb) const override
1259
+ {
1260
+ return spaces[0]->GetDualShapeNodes(vb);
1261
+ }
1262
+
1263
+ };
1264
+
1265
+
1266
+
1267
+ class NGS_DLL_HEADER ApplyMass : public BaseMatrix
1268
+ {
1269
+ protected:
1270
+ shared_ptr<FESpace> fes;
1271
+ shared_ptr<CoefficientFunction> rho;
1272
+ bool inverse;
1273
+ shared_ptr<Region> definedon;
1274
+ LocalHeap & lh;
1275
+ public:
1276
+ ///
1277
+ ApplyMass (shared_ptr<FESpace> afes,
1278
+ shared_ptr<CoefficientFunction> arho,
1279
+ bool ainverse,
1280
+ shared_ptr<Region> adefinedon,
1281
+ LocalHeap & alh);
1282
+ virtual ~ApplyMass();
1283
+ virtual shared_ptr<BaseMatrix> InverseMatrix (shared_ptr<BitArray> subset = nullptr) const override;
1284
+
1285
+ virtual bool IsComplex() const override
1286
+ {
1287
+ return fes->IsComplex();
1288
+ }
1289
+
1290
+ shared_ptr<BaseMatrix> CreateDeviceMatrix() const override
1291
+ {
1292
+ return fes->CreateMassOperator(rho, definedon, inverse, lh)->CreateDeviceMatrix();
1293
+ }
1294
+
1295
+
1296
+ virtual void Mult (const BaseVector & v, BaseVector & prod) const override;
1297
+ virtual void MultAdd (double val, const BaseVector & v, BaseVector & prod) const override;
1298
+ virtual void MultAdd (Complex val, const BaseVector & v, BaseVector & prod) const override;
1299
+ virtual void MultTransAdd (double val, const BaseVector & v, BaseVector & prod) const override;
1300
+
1301
+ virtual AutoVector CreateVector () const override;
1302
+ virtual AutoVector CreateRowVector () const override;
1303
+ virtual AutoVector CreateColVector () const override;
1304
+
1305
+ virtual int VHeight() const override
1306
+ {
1307
+ return fes->GetNDof();
1308
+ }
1309
+ ///
1310
+ virtual int VWidth() const override
1311
+ {
1312
+ return fes->GetNDof();
1313
+ }
1314
+ };
1315
+
1316
+
1317
+
1318
+ class NGS_DLL_HEADER ApplyTrace : public BaseMatrix
1319
+ {
1320
+ protected:
1321
+ shared_ptr<FESpace> fes;
1322
+ shared_ptr<FESpace> festrace;
1323
+ bool average;
1324
+ LocalHeap & lh;
1325
+ public:
1326
+ ApplyTrace (shared_ptr<FESpace> afes,
1327
+ shared_ptr<FESpace> afestrace,
1328
+ bool aaverage,
1329
+ LocalHeap & alh);
1330
+ virtual ~ApplyTrace();
1331
+
1332
+ virtual int VHeight() const override { return festrace->GetNDof(); }
1333
+ virtual int VWidth() const override { return fes->GetNDof(); }
1334
+ virtual bool IsComplex() const override { return fes->IsComplex(); }
1335
+
1336
+ virtual void Mult (const BaseVector & v, BaseVector & prod) const override;
1337
+ virtual void MultAdd (double val, const BaseVector & v, BaseVector & prod) const override;
1338
+ virtual void MultAdd (Complex val, const BaseVector & v, BaseVector & prod) const override;
1339
+ virtual void MultTransAdd (double val, const BaseVector & v, BaseVector & prod) const override;
1340
+
1341
+ virtual AutoVector CreateVector () const override;
1342
+ virtual AutoVector CreateRowVector () const override;
1343
+ virtual AutoVector CreateColVector () const override;
1344
+ };
1345
+
1346
+
1347
+
1348
+ /// Registered FESpace classes
1349
+ class NGS_DLL_HEADER FESpaceClasses
1350
+ {
1351
+ public:
1352
+ /// descriptor for register fespaces.
1353
+ /// function pointer to create function.
1354
+ struct FESpaceInfo
1355
+ {
1356
+ /// the name
1357
+ string name;
1358
+ /// function pointer to creator function
1359
+ shared_ptr<FESpace> (*creator)(shared_ptr<MeshAccess> ma, const Flags & flags);
1360
+ /// function pointer to docu function
1361
+ DocInfo (*getdocu)();
1362
+ /// creates a descriptor
1363
+ FESpaceInfo (const string & aname,
1364
+ shared_ptr<FESpace> (*acreator)(shared_ptr<MeshAccess> ma, const Flags & flags),
1365
+ DocInfo (*agetdocu)())
1366
+ : name(aname), creator(acreator), getdocu(agetdocu) {;}
1367
+ };
1368
+ private:
1369
+ Array<shared_ptr<FESpaceInfo>> fesa;
1370
+
1371
+ public:
1372
+ /// initialize
1373
+ FESpaceClasses() { ; }
1374
+ /// cleans up
1375
+ ~FESpaceClasses();
1376
+
1377
+ /// add a descriptor
1378
+ void AddFESpace (const string & aname,
1379
+ shared_ptr<FESpace> (*acreator)(shared_ptr<MeshAccess> ma, const Flags & flags),
1380
+ DocInfo (*getdocu)() = FESpace::GetDocu);
1381
+
1382
+ /// returns all creators
1383
+ const Array<shared_ptr<FESpaceInfo>> & GetFESpaces() { return fesa; }
1384
+
1385
+ /// returns a creator structure
1386
+ const shared_ptr<FESpaceInfo> GetFESpace(const string & name);
1387
+
1388
+ /// print available fespaces to stream
1389
+ void Print (ostream & ost) const;
1390
+ };
1391
+
1392
+ /// returns createion object
1393
+ extern NGS_DLL_HEADER FESpaceClasses & GetFESpaceClasses ();
1394
+
1395
+ /// creates a fespace of that type
1396
+ extern NGS_DLL_HEADER shared_ptr<FESpace> CreateFESpace (const string & type,
1397
+ shared_ptr<MeshAccess> ma,
1398
+ const Flags & flags);
1399
+
1400
+
1401
+ /**
1402
+ template for registration of finite element spaces.
1403
+ provides static Create - function
1404
+ */
1405
+ template <typename FES>
1406
+ class RegisterFESpace
1407
+ {
1408
+ public:
1409
+ RegisterClassForArchive<FES, FESpace> regclass;
1410
+ /// constructor registers fespace
1411
+ RegisterFESpace (string label)
1412
+ {
1413
+ GetFESpaceClasses().AddFESpace (label, Create, FES::GetDocu);
1414
+ // cout << "register fespace '" << label << "'" << endl;
1415
+ }
1416
+
1417
+ /// creates an fespace of type FES
1418
+ static shared_ptr<FESpace> Create (shared_ptr<MeshAccess> ma, const Flags & flags)
1419
+ {
1420
+ return make_shared<FES> (ma, flags);
1421
+ }
1422
+ };
1423
+
1424
+
1425
+ }
1426
+
1427
+
1428
+
1429
+
1430
+
1431
+ namespace ngcore
1432
+ {
1433
+ template<typename T> struct MPI_typetrait;
1434
+
1435
+ template<>
1436
+ struct MPI_typetrait<ngcomp::COUPLING_TYPE>
1437
+ {
1438
+ static auto MPIType ()
1439
+ {
1440
+ static_assert ( (sizeof(ngcomp::COUPLING_TYPE) == sizeof(char)) ||
1441
+ (sizeof(ngcomp::COUPLING_TYPE) == sizeof(int)) );
1442
+ if constexpr (sizeof(ngcomp::COUPLING_TYPE) == sizeof(char)) return MPI_typetrait<char>::MPIType();
1443
+ if constexpr (sizeof(ngcomp::COUPLING_TYPE) == sizeof(int)) return MPI_typetrait<int>::MPIType();
1444
+ }
1445
+ };
1446
+ }
1447
+
1448
+
1449
+ #endif