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