ngsolve 6.2.2506.post216.dev0__cp314-cp314-manylinux_2_28_x86_64.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (306) hide show
  1. ngsolve-6.2.2506.post216.dev0.data/data/bin/ngs_nvcc +22 -0
  2. ngsolve-6.2.2506.post216.dev0.data/data/bin/ngs_nvlink +17 -0
  3. ngsolve-6.2.2506.post216.dev0.data/data/bin/ngscxx +15 -0
  4. ngsolve-6.2.2506.post216.dev0.data/data/bin/ngsld +11 -0
  5. ngsolve-6.2.2506.post216.dev0.data/data/bin/ngsolve.tcl +648 -0
  6. ngsolve-6.2.2506.post216.dev0.data/data/bin/ngspy +2 -0
  7. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/analytic_integrals.hpp +10 -0
  8. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/arnoldi.hpp +55 -0
  9. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/bandmatrix.hpp +334 -0
  10. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/basematrix.hpp +963 -0
  11. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/basevector.hpp +1268 -0
  12. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/bdbequations.hpp +2807 -0
  13. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/bdbintegrator.hpp +1660 -0
  14. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/bem_diffops.hpp +475 -0
  15. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/bessel.hpp +1064 -0
  16. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/bilinearform.hpp +966 -0
  17. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/bla.hpp +29 -0
  18. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/blockalloc.hpp +95 -0
  19. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/blockjacobi.hpp +328 -0
  20. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/bspline.hpp +116 -0
  21. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/calcinverse.hpp +141 -0
  22. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/cg.hpp +368 -0
  23. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/chebyshev.hpp +44 -0
  24. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/cholesky.hpp +720 -0
  25. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/clapack.h +7254 -0
  26. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/code_generation.hpp +296 -0
  27. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/coefficient.hpp +2033 -0
  28. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/coefficient_impl.hpp +19 -0
  29. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/coefficient_stdmath.hpp +167 -0
  30. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/commutingAMG.hpp +106 -0
  31. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/comp.hpp +79 -0
  32. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/compatibility.hpp +41 -0
  33. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/complex_wrapper.hpp +101 -0
  34. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/compressedfespace.hpp +110 -0
  35. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/contact.hpp +239 -0
  36. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/cuda_core.hpp +216 -0
  37. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/cuda_linalg.hpp +185 -0
  38. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/cuda_ngbla.hpp +317 -0
  39. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/cuda_ngstd.hpp +414 -0
  40. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/cuda_profiler.hpp +240 -0
  41. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/diagonalmatrix.hpp +160 -0
  42. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/differentialoperator.hpp +276 -0
  43. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/diffop.hpp +1286 -0
  44. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/diffop_impl.hpp +328 -0
  45. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/diffopwithfactor.hpp +123 -0
  46. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/discontinuous.hpp +84 -0
  47. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/dump.hpp +949 -0
  48. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/ectypes.hpp +121 -0
  49. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/eigen.hpp +60 -0
  50. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/eigensystem.hpp +18 -0
  51. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/elasticity_equations.hpp +595 -0
  52. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/elementbyelement.hpp +201 -0
  53. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/elementtopology.hpp +1760 -0
  54. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/elementtransformation.hpp +339 -0
  55. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/evalfunc.hpp +405 -0
  56. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/expr.hpp +1693 -0
  57. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/facetfe.hpp +175 -0
  58. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/facetfespace.hpp +180 -0
  59. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/facethofe.hpp +111 -0
  60. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/facetsurffespace.hpp +112 -0
  61. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/fe_interfaces.hpp +32 -0
  62. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/fem.hpp +87 -0
  63. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/fesconvert.hpp +14 -0
  64. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/fespace.hpp +1454 -0
  65. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/finiteelement.hpp +286 -0
  66. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/globalinterfacespace.hpp +77 -0
  67. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/globalspace.hpp +115 -0
  68. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/gridfunction.hpp +525 -0
  69. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/h1amg.hpp +124 -0
  70. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/h1hofe.hpp +188 -0
  71. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/h1hofe_impl.hpp +1262 -0
  72. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/h1hofefo.hpp +148 -0
  73. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/h1hofefo_impl.hpp +185 -0
  74. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/h1hofespace.hpp +167 -0
  75. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/h1lofe.hpp +1240 -0
  76. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/h1lumping.hpp +41 -0
  77. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/hcurl_equations.hpp +1381 -0
  78. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/hcurlcurlfe.hpp +2241 -0
  79. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/hcurlcurlfespace.hpp +78 -0
  80. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/hcurlfe.hpp +259 -0
  81. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/hcurlfe_utils.hpp +107 -0
  82. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/hcurlhdiv_dshape.hpp +857 -0
  83. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/hcurlhdivfes.hpp +308 -0
  84. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/hcurlhofe.hpp +175 -0
  85. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/hcurlhofe_impl.hpp +1871 -0
  86. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/hcurlhofespace.hpp +193 -0
  87. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/hcurllofe.hpp +1146 -0
  88. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/hdiv_equations.hpp +880 -0
  89. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/hdivdivfe.hpp +2923 -0
  90. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/hdivdivsurfacespace.hpp +76 -0
  91. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/hdivfe.hpp +206 -0
  92. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/hdivfe_utils.hpp +717 -0
  93. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/hdivfes.hpp +75 -0
  94. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/hdivhofe.hpp +447 -0
  95. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/hdivhofe_impl.hpp +1107 -0
  96. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/hdivhofefo.hpp +229 -0
  97. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/hdivhofespace.hpp +177 -0
  98. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/hdivhosurfacefespace.hpp +106 -0
  99. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/hdivlofe.hpp +773 -0
  100. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/hidden.hpp +74 -0
  101. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/householder.hpp +181 -0
  102. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/hypre_ams_precond.hpp +123 -0
  103. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/hypre_precond.hpp +73 -0
  104. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/integrator.hpp +2012 -0
  105. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/integratorcf.hpp +253 -0
  106. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/interpolate.hpp +49 -0
  107. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/intrule.hpp +2542 -0
  108. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/intrules_SauterSchwab.hpp +25 -0
  109. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/irspace.hpp +49 -0
  110. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/jacobi.hpp +153 -0
  111. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/kernels.hpp +724 -0
  112. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/l2hofe.hpp +194 -0
  113. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/l2hofe_impl.hpp +564 -0
  114. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/l2hofefo.hpp +542 -0
  115. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/l2hofespace.hpp +344 -0
  116. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/la.hpp +38 -0
  117. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/linalg_kernels.hpp +70 -0
  118. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/linearform.hpp +266 -0
  119. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/matrix.hpp +2145 -0
  120. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/memusage.hpp +41 -0
  121. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/meshaccess.hpp +1359 -0
  122. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/mgpre.hpp +204 -0
  123. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/mp_coefficient.hpp +145 -0
  124. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/mptools.hpp +2281 -0
  125. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/multigrid.hpp +42 -0
  126. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/multivector.hpp +447 -0
  127. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/mumpsinverse.hpp +187 -0
  128. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/mycomplex.hpp +361 -0
  129. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/ng_lapack.hpp +1661 -0
  130. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/ngblas.hpp +1232 -0
  131. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/ngs_defines.hpp +30 -0
  132. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/ngs_stdcpp_include.hpp +106 -0
  133. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/ngs_utils.hpp +121 -0
  134. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/ngsobject.hpp +1019 -0
  135. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/ngsstream.hpp +113 -0
  136. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/ngstd.hpp +72 -0
  137. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/nodalhofe.hpp +96 -0
  138. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/nodalhofe_impl.hpp +141 -0
  139. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/normalfacetfe.hpp +223 -0
  140. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/normalfacetfespace.hpp +98 -0
  141. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/normalfacetsurfacefespace.hpp +84 -0
  142. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/order.hpp +251 -0
  143. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/parallel_matrices.hpp +222 -0
  144. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/paralleldofs.hpp +340 -0
  145. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/parallelngs.hpp +23 -0
  146. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/parallelvector.hpp +269 -0
  147. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/pardisoinverse.hpp +200 -0
  148. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/periodic.hpp +129 -0
  149. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/plateaufespace.hpp +25 -0
  150. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/pml.hpp +275 -0
  151. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/pmltrafo.hpp +631 -0
  152. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/postproc.hpp +142 -0
  153. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/potentialtools.hpp +22 -0
  154. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/precomp.hpp +60 -0
  155. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/preconditioner.hpp +602 -0
  156. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/prolongation.hpp +380 -0
  157. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/python_comp.hpp +107 -0
  158. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/python_fem.hpp +89 -0
  159. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/python_linalg.hpp +58 -0
  160. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/python_ngstd.hpp +386 -0
  161. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/recursive_pol.hpp +4896 -0
  162. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/recursive_pol_tet.hpp +395 -0
  163. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/recursive_pol_trig.hpp +492 -0
  164. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/reorderedfespace.hpp +81 -0
  165. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/sample_sort.hpp +105 -0
  166. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/scalarfe.hpp +335 -0
  167. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/shapefunction_utils.hpp +113 -0
  168. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/simd_complex.hpp +329 -0
  169. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/smoother.hpp +253 -0
  170. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/solve.hpp +89 -0
  171. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/sparsecholesky.hpp +317 -0
  172. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/sparsefactorization_interface.hpp +159 -0
  173. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/sparsematrix.hpp +1052 -0
  174. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/sparsematrix_dyn.hpp +90 -0
  175. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/sparsematrix_impl.hpp +1055 -0
  176. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/special_matrix.hpp +463 -0
  177. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/specialelement.hpp +125 -0
  178. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/statushandler.hpp +33 -0
  179. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/stringops.hpp +12 -0
  180. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/superluinverse.hpp +136 -0
  181. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/symbolicintegrator.hpp +850 -0
  182. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/symmetricmatrix.hpp +144 -0
  183. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/tangentialfacetfe.hpp +224 -0
  184. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/tangentialfacetfespace.hpp +91 -0
  185. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/tensor.hpp +522 -0
  186. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/tensorcoefficient.hpp +446 -0
  187. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/tensorproductintegrator.hpp +113 -0
  188. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/thcurlfe.hpp +128 -0
  189. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/thcurlfe_impl.hpp +380 -0
  190. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/thdivfe.hpp +80 -0
  191. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/thdivfe_impl.hpp +492 -0
  192. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/tpdiffop.hpp +461 -0
  193. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/tpfes.hpp +133 -0
  194. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/tpintrule.hpp +224 -0
  195. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/triangular.hpp +465 -0
  196. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/tscalarfe.hpp +245 -0
  197. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/tscalarfe_impl.hpp +1029 -0
  198. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/umfpackinverse.hpp +148 -0
  199. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/unifiedvector.hpp +103 -0
  200. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/vector.hpp +1452 -0
  201. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/voxelcoefficientfunction.hpp +41 -0
  202. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/vtkoutput.hpp +198 -0
  203. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/vvector.hpp +208 -0
  204. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/webgui.hpp +92 -0
  205. ngsolve-6.2.2506.post216.dev0.data/data/lib/cmake/ngsolve/NGSolveConfig.cmake +102 -0
  206. ngsolve-6.2.2506.post216.dev0.data/data/lib/cmake/ngsolve/ngsolve-targets-release.cmake +89 -0
  207. ngsolve-6.2.2506.post216.dev0.data/data/lib/cmake/ngsolve/ngsolve-targets.cmake +180 -0
  208. ngsolve-6.2.2506.post216.dev0.data/data/lib/python3.14/site-packages/netgen_mesher.libs/libngbla.so +0 -0
  209. ngsolve-6.2.2506.post216.dev0.data/data/lib/python3.14/site-packages/netgen_mesher.libs/libngcomp.so +0 -0
  210. ngsolve-6.2.2506.post216.dev0.data/data/lib/python3.14/site-packages/netgen_mesher.libs/libngfem.so +0 -0
  211. ngsolve-6.2.2506.post216.dev0.data/data/lib/python3.14/site-packages/netgen_mesher.libs/libngla.so +0 -0
  212. ngsolve-6.2.2506.post216.dev0.data/data/lib/python3.14/site-packages/netgen_mesher.libs/libngsbem.so +0 -0
  213. ngsolve-6.2.2506.post216.dev0.data/data/lib/python3.14/site-packages/netgen_mesher.libs/libngscudalib.so +0 -0
  214. ngsolve-6.2.2506.post216.dev0.data/data/lib/python3.14/site-packages/netgen_mesher.libs/libngsolve.so +0 -0
  215. ngsolve-6.2.2506.post216.dev0.data/data/lib/python3.14/site-packages/netgen_mesher.libs/libngstd.so +0 -0
  216. ngsolve-6.2.2506.post216.dev0.data/data/lib/python3.14/site-packages/ngsolve/TensorProductTools.py +210 -0
  217. ngsolve-6.2.2506.post216.dev0.data/data/lib/python3.14/site-packages/ngsolve/__console.py +94 -0
  218. ngsolve-6.2.2506.post216.dev0.data/data/lib/python3.14/site-packages/ngsolve/__expr.py +181 -0
  219. ngsolve-6.2.2506.post216.dev0.data/data/lib/python3.14/site-packages/ngsolve/__init__.py +148 -0
  220. ngsolve-6.2.2506.post216.dev0.data/data/lib/python3.14/site-packages/ngsolve/_scikit_build_core_dependencies.py +30 -0
  221. ngsolve-6.2.2506.post216.dev0.data/data/lib/python3.14/site-packages/ngsolve/bvp.py +78 -0
  222. ngsolve-6.2.2506.post216.dev0.data/data/lib/python3.14/site-packages/ngsolve/config/__init__.py +1 -0
  223. ngsolve-6.2.2506.post216.dev0.data/data/lib/python3.14/site-packages/ngsolve/config/__main__.py +4 -0
  224. ngsolve-6.2.2506.post216.dev0.data/data/lib/python3.14/site-packages/ngsolve/config/config.py +60 -0
  225. ngsolve-6.2.2506.post216.dev0.data/data/lib/python3.14/site-packages/ngsolve/demos/TensorProduct/__init__.py +0 -0
  226. ngsolve-6.2.2506.post216.dev0.data/data/lib/python3.14/site-packages/ngsolve/demos/TensorProduct/tp_dg_1d_1d.py +80 -0
  227. ngsolve-6.2.2506.post216.dev0.data/data/lib/python3.14/site-packages/ngsolve/demos/TensorProduct/tp_dg_1d_2d.py +73 -0
  228. ngsolve-6.2.2506.post216.dev0.data/data/lib/python3.14/site-packages/ngsolve/demos/TensorProduct/tp_dg_2d_1d.py +72 -0
  229. ngsolve-6.2.2506.post216.dev0.data/data/lib/python3.14/site-packages/ngsolve/demos/TensorProduct/tp_dg_2d_2d.py +66 -0
  230. ngsolve-6.2.2506.post216.dev0.data/data/lib/python3.14/site-packages/ngsolve/demos/__init__.py +0 -0
  231. ngsolve-6.2.2506.post216.dev0.data/data/lib/python3.14/site-packages/ngsolve/demos/howto/__init__.py +0 -0
  232. ngsolve-6.2.2506.post216.dev0.data/data/lib/python3.14/site-packages/ngsolve/demos/howto/hhj.py +44 -0
  233. ngsolve-6.2.2506.post216.dev0.data/data/lib/python3.14/site-packages/ngsolve/demos/howto/hybrid_dg.py +53 -0
  234. ngsolve-6.2.2506.post216.dev0.data/data/lib/python3.14/site-packages/ngsolve/demos/howto/mixed.py +30 -0
  235. ngsolve-6.2.2506.post216.dev0.data/data/lib/python3.14/site-packages/ngsolve/demos/howto/nonlin.py +29 -0
  236. ngsolve-6.2.2506.post216.dev0.data/data/lib/python3.14/site-packages/ngsolve/demos/howto/pickling.py +26 -0
  237. ngsolve-6.2.2506.post216.dev0.data/data/lib/python3.14/site-packages/ngsolve/demos/howto/pml.py +31 -0
  238. ngsolve-6.2.2506.post216.dev0.data/data/lib/python3.14/site-packages/ngsolve/demos/howto/taskmanager.py +20 -0
  239. ngsolve-6.2.2506.post216.dev0.data/data/lib/python3.14/site-packages/ngsolve/demos/howto/tdnns.py +47 -0
  240. ngsolve-6.2.2506.post216.dev0.data/data/lib/python3.14/site-packages/ngsolve/demos/howto/timeDG-skeleton.py +45 -0
  241. ngsolve-6.2.2506.post216.dev0.data/data/lib/python3.14/site-packages/ngsolve/demos/howto/timeDG.py +38 -0
  242. ngsolve-6.2.2506.post216.dev0.data/data/lib/python3.14/site-packages/ngsolve/demos/howto/timeDGlap.py +42 -0
  243. ngsolve-6.2.2506.post216.dev0.data/data/lib/python3.14/site-packages/ngsolve/demos/howto/timeDGwave.py +61 -0
  244. ngsolve-6.2.2506.post216.dev0.data/data/lib/python3.14/site-packages/ngsolve/demos/intro/__init__.py +0 -0
  245. ngsolve-6.2.2506.post216.dev0.data/data/lib/python3.14/site-packages/ngsolve/demos/intro/adaptive.py +123 -0
  246. ngsolve-6.2.2506.post216.dev0.data/data/lib/python3.14/site-packages/ngsolve/demos/intro/cmagnet.py +59 -0
  247. ngsolve-6.2.2506.post216.dev0.data/data/lib/python3.14/site-packages/ngsolve/demos/intro/elasticity.py +76 -0
  248. ngsolve-6.2.2506.post216.dev0.data/data/lib/python3.14/site-packages/ngsolve/demos/intro/navierstokes.py +74 -0
  249. ngsolve-6.2.2506.post216.dev0.data/data/lib/python3.14/site-packages/ngsolve/demos/intro/poisson.ipynb +170 -0
  250. ngsolve-6.2.2506.post216.dev0.data/data/lib/python3.14/site-packages/ngsolve/demos/intro/poisson.py +41 -0
  251. ngsolve-6.2.2506.post216.dev0.data/data/lib/python3.14/site-packages/ngsolve/demos/mpi/__init__.py +0 -0
  252. ngsolve-6.2.2506.post216.dev0.data/data/lib/python3.14/site-packages/ngsolve/demos/mpi/mpi_cmagnet.py +87 -0
  253. ngsolve-6.2.2506.post216.dev0.data/data/lib/python3.14/site-packages/ngsolve/demos/mpi/mpi_navierstokes.py +117 -0
  254. ngsolve-6.2.2506.post216.dev0.data/data/lib/python3.14/site-packages/ngsolve/demos/mpi/mpi_poisson.py +89 -0
  255. ngsolve-6.2.2506.post216.dev0.data/data/lib/python3.14/site-packages/ngsolve/demos/mpi/mpi_timeDG.py +82 -0
  256. ngsolve-6.2.2506.post216.dev0.data/data/lib/python3.14/site-packages/ngsolve/directsolvers.py +14 -0
  257. ngsolve-6.2.2506.post216.dev0.data/data/lib/python3.14/site-packages/ngsolve/eigenvalues.py +364 -0
  258. ngsolve-6.2.2506.post216.dev0.data/data/lib/python3.14/site-packages/ngsolve/internal.py +89 -0
  259. ngsolve-6.2.2506.post216.dev0.data/data/lib/python3.14/site-packages/ngsolve/krylovspace.py +1182 -0
  260. ngsolve-6.2.2506.post216.dev0.data/data/lib/python3.14/site-packages/ngsolve/meshes.py +748 -0
  261. ngsolve-6.2.2506.post216.dev0.data/data/lib/python3.14/site-packages/ngsolve/ngs2petsc.py +310 -0
  262. ngsolve-6.2.2506.post216.dev0.data/data/lib/python3.14/site-packages/ngsolve/ngscuda.so +0 -0
  263. ngsolve-6.2.2506.post216.dev0.data/data/lib/python3.14/site-packages/ngsolve/ngscxx.py +42 -0
  264. ngsolve-6.2.2506.post216.dev0.data/data/lib/python3.14/site-packages/ngsolve/ngslib.so +0 -0
  265. ngsolve-6.2.2506.post216.dev0.data/data/lib/python3.14/site-packages/ngsolve/nonlinearsolvers.py +203 -0
  266. ngsolve-6.2.2506.post216.dev0.data/data/lib/python3.14/site-packages/ngsolve/preconditioners.py +11 -0
  267. ngsolve-6.2.2506.post216.dev0.data/data/lib/python3.14/site-packages/ngsolve/solve_implementation.py +168 -0
  268. ngsolve-6.2.2506.post216.dev0.data/data/lib/python3.14/site-packages/ngsolve/solvers/__init__.py +7 -0
  269. ngsolve-6.2.2506.post216.dev0.data/data/lib/python3.14/site-packages/ngsolve/solvers/cudss.py +112 -0
  270. ngsolve-6.2.2506.post216.dev0.data/data/lib/python3.14/site-packages/ngsolve/timestepping.py +185 -0
  271. ngsolve-6.2.2506.post216.dev0.data/data/lib/python3.14/site-packages/ngsolve/timing.py +108 -0
  272. ngsolve-6.2.2506.post216.dev0.data/data/lib/python3.14/site-packages/ngsolve/utils.py +167 -0
  273. ngsolve-6.2.2506.post216.dev0.data/data/lib/python3.14/site-packages/ngsolve/webgui.py +671 -0
  274. ngsolve-6.2.2506.post216.dev0.data/data/share/ngsolve/beam.geo +17 -0
  275. ngsolve-6.2.2506.post216.dev0.data/data/share/ngsolve/beam.vol +240 -0
  276. ngsolve-6.2.2506.post216.dev0.data/data/share/ngsolve/chip.in2d +41 -0
  277. ngsolve-6.2.2506.post216.dev0.data/data/share/ngsolve/chip.vol +614 -0
  278. ngsolve-6.2.2506.post216.dev0.data/data/share/ngsolve/coil.geo +12 -0
  279. ngsolve-6.2.2506.post216.dev0.data/data/share/ngsolve/coil.vol +2560 -0
  280. ngsolve-6.2.2506.post216.dev0.data/data/share/ngsolve/coilshield.geo +24 -0
  281. ngsolve-6.2.2506.post216.dev0.data/data/share/ngsolve/coilshield.vol +3179 -0
  282. ngsolve-6.2.2506.post216.dev0.data/data/share/ngsolve/cube.geo +19 -0
  283. ngsolve-6.2.2506.post216.dev0.data/data/share/ngsolve/cube.vol +1832 -0
  284. ngsolve-6.2.2506.post216.dev0.data/data/share/ngsolve/d10_DGdoubleglazing.pde +50 -0
  285. ngsolve-6.2.2506.post216.dev0.data/data/share/ngsolve/d11_chip_nitsche.pde +40 -0
  286. ngsolve-6.2.2506.post216.dev0.data/data/share/ngsolve/d1_square.pde +43 -0
  287. ngsolve-6.2.2506.post216.dev0.data/data/share/ngsolve/d2_chip.pde +35 -0
  288. ngsolve-6.2.2506.post216.dev0.data/data/share/ngsolve/d3_helmholtz.pde +22 -0
  289. ngsolve-6.2.2506.post216.dev0.data/data/share/ngsolve/d4_cube.pde +46 -0
  290. ngsolve-6.2.2506.post216.dev0.data/data/share/ngsolve/d5_beam.pde +74 -0
  291. ngsolve-6.2.2506.post216.dev0.data/data/share/ngsolve/d6_shaft.pde +73 -0
  292. ngsolve-6.2.2506.post216.dev0.data/data/share/ngsolve/d7_coil.pde +50 -0
  293. ngsolve-6.2.2506.post216.dev0.data/data/share/ngsolve/d8_coilshield.pde +49 -0
  294. ngsolve-6.2.2506.post216.dev0.data/data/share/ngsolve/d9_hybridDG.pde +72 -0
  295. ngsolve-6.2.2506.post216.dev0.data/data/share/ngsolve/doubleglazing.in2d +27 -0
  296. ngsolve-6.2.2506.post216.dev0.data/data/share/ngsolve/doubleglazing.vol +737 -0
  297. ngsolve-6.2.2506.post216.dev0.data/data/share/ngsolve/piezo2d40round4.vol.gz +0 -0
  298. ngsolve-6.2.2506.post216.dev0.data/data/share/ngsolve/shaft.geo +73 -0
  299. ngsolve-6.2.2506.post216.dev0.data/data/share/ngsolve/shaft.vol +4291 -0
  300. ngsolve-6.2.2506.post216.dev0.data/data/share/ngsolve/square.in2d +17 -0
  301. ngsolve-6.2.2506.post216.dev0.data/data/share/ngsolve/square.vol +149 -0
  302. ngsolve-6.2.2506.post216.dev0.dist-info/METADATA +14 -0
  303. ngsolve-6.2.2506.post216.dev0.dist-info/RECORD +306 -0
  304. ngsolve-6.2.2506.post216.dev0.dist-info/WHEEL +5 -0
  305. ngsolve-6.2.2506.post216.dev0.dist-info/licenses/LICENSE +504 -0
  306. ngsolve-6.2.2506.post216.dev0.dist-info/top_level.txt +1 -0
@@ -0,0 +1,1454 @@
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
+ const Array<bool> & GetDefinedOn (VorB vb) const { return definedon[vb]; }
536
+
537
+ ///
538
+ void SetDirichletBoundaries (const BitArray & dirbnds);
539
+ const BitArray & GetDirichletBoundaries (VorB vb) const { return dirichlet_constraints[vb]; }
540
+
541
+
542
+ /// Get reference element for tet, prism, trig, etc ..
543
+ // const FiniteElement & GetFE (ELEMENT_TYPE type) const;
544
+
545
+ /// according low-order FESpace (if available)
546
+ [[deprecated("Use LowOrderFESpacePtr instead!")]]
547
+ FESpace & LowOrderFESpace () { return *low_order_space; }
548
+ /// according low-order FESpace (if available)
549
+ [[deprecated("Use LowOrderFESpacePtr instead!")]]
550
+ const FESpace & LowOrderFESpace () const { return *low_order_space; }
551
+ shared_ptr<FESpace> LowOrderFESpacePtr () const { return low_order_space; }
552
+ shared_ptr<BaseMatrix> LowOrderEmbedding () const { return low_order_embedding; }
553
+
554
+ /// non Dirichlet dofs
555
+ virtual shared_ptr<BitArray> GetFreeDofs (bool external = false) const;
556
+ bool IsFreeDof (DofId dof, bool external = false) const
557
+ {
558
+ if (external)
559
+ return external_free_dofs->Test(dof);
560
+ else
561
+ return free_dofs->Test(dof);
562
+ }
563
+ ///
564
+ bool IsDirichletDof (int i) const
565
+ { return dirichlet_dofs.Size() && dirichlet_dofs[i]; }
566
+
567
+ bool IsDirichletBoundary (int i) const
568
+ { return dirichlet_boundaries.Size() && dirichlet_boundaries[i]; }
569
+
570
+ /// is vertex on Dirichlet boundary ?
571
+ bool IsDirichletVertex (size_t i) const { return dirichlet_vertex.Size() && dirichlet_vertex[i]; }
572
+ /// is edge on Dirichlet boundary ?
573
+ bool IsDirichletEdge (size_t i) const { return dirichlet_edge.Size() && dirichlet_edge[i]; }
574
+ /// is face on Dirichlet boundary ?
575
+ bool IsDirichletFace (size_t i) const { return dirichlet_face.Size() && dirichlet_face[i]; }
576
+
577
+ void GetFilteredDofs(COUPLING_TYPE doffilter, BitArray & output, bool freedofsonly=true) const;
578
+ ///
579
+ virtual shared_ptr<Table<int>> CreateSmoothingBlocks (const Flags & flags) const;
580
+ /// for anisotropic plane smoothing:
581
+ virtual shared_ptr<Array<int>> CreateDirectSolverClusters (const Flags & flags) const
582
+ { return nullptr; }
583
+
584
+ virtual void AddDirectSolverClusterDof(int dn) const
585
+ { adddirectsolverdofs.Append(dn); }
586
+
587
+ virtual Array<int> & DirectVertexClusters(void)
588
+ { return directvertexclusters; }
589
+ virtual Array<int> & DirectEdgeClusters(void)
590
+ { return directedgeclusters; }
591
+ virtual Array<int> & DirectFaceClusters(void)
592
+ { return directfaceclusters; }
593
+ virtual Array<int> & DirectElementClusters(void)
594
+ { return directelementclusters; }
595
+
596
+ bool IsAtomicDof (size_t nr) const { return (is_atomic_dof.Size() != 0) && is_atomic_dof[nr]; }
597
+ bool HasAtomicDofs () const { return is_atomic_dof.Size() != 0; }
598
+
599
+
600
+ bool NeedsTransformVec() const { return needs_transform_vec; }
601
+
602
+ void TransformMat (ElementId ei,
603
+ SliceMatrix<double> mat, TRANSFORM_TYPE type) const
604
+ {
605
+ if (needs_transform_vec)
606
+ VTransformMR (ei, mat, type);
607
+ }
608
+ void TransformMat (ElementId ei,
609
+ SliceMatrix<Complex> mat, TRANSFORM_TYPE type) const
610
+ {
611
+ if (needs_transform_vec)
612
+ VTransformMC (ei, mat, type);
613
+ }
614
+ void TransformVec (ElementId ei,
615
+ SliceVector<double> vec, TRANSFORM_TYPE type) const
616
+ {
617
+ if (needs_transform_vec)
618
+ VTransformVR (ei, vec, type);
619
+ }
620
+ void TransformVec (ElementId ei,
621
+ SliceVector<Complex> vec, TRANSFORM_TYPE type) const
622
+ {
623
+ if (needs_transform_vec)
624
+ VTransformVC (ei, vec, type);
625
+ }
626
+
627
+ virtual void VTransformMR (ElementId ei,
628
+ const SliceMatrix<double> mat, TRANSFORM_TYPE type) const
629
+ { ; }
630
+ virtual void VTransformMC (ElementId ei,
631
+ const SliceMatrix<Complex> mat, TRANSFORM_TYPE type) const
632
+ { ; }
633
+
634
+
635
+ virtual void VTransformVR (ElementId ei,
636
+ const SliceVector<double> vec, TRANSFORM_TYPE type) const
637
+ { ; }
638
+ virtual void VTransformVC (ElementId ei,
639
+ const SliceVector<Complex> vec, TRANSFORM_TYPE type) const
640
+ { ; }
641
+
642
+
643
+ /// Returns multigrid-prolongation
644
+ virtual shared_ptr<Prolongation> GetProlongation () const;
645
+ // { return prol; }
646
+ /// Set multigrid prolongation
647
+ // void SetProlongation (ngmg::Prolongation * aprol)
648
+ // { prol = aprol; }
649
+ virtual void SetHarmonicProlongation (shared_ptr<BilinearForm> bfa, string inverse);
650
+
651
+ /// returns function-evaluator
652
+ shared_ptr<DifferentialOperator> GetEvaluator (VorB vb = VOL) const
653
+ {
654
+ return evaluator[vb];
655
+ }
656
+
657
+
658
+ shared_ptr<DifferentialOperator> GetFluxEvaluator (VorB vb = VOL) const
659
+ {
660
+ return flux_evaluator[vb];
661
+ }
662
+
663
+
664
+ virtual SymbolTable<shared_ptr<DifferentialOperator>> GetAdditionalEvaluators () const;
665
+ // { return additional_evaluators; }
666
+
667
+
668
+ shared_ptr<BilinearFormIntegrator> GetIntegrator (VorB vb = VOL) const;
669
+ /*
670
+ {
671
+ return integrator[vb];
672
+ }
673
+ */
674
+
675
+ ProxyNode GetProxyFunction(bool testfunction) const;
676
+ virtual ProxyNode MakeProxyFunction (bool testfunction,
677
+ const function<shared_ptr<ProxyFunction>(shared_ptr<ProxyFunction>)> & addblock) const;
678
+
679
+ auto GetTrialFunction() const { return GetProxyFunction(false); }
680
+ auto GetTestFunction() const { return GetProxyFunction(true); }
681
+
682
+
683
+ virtual shared_ptr<BaseMatrix> GetMassOperator (shared_ptr<CoefficientFunction> rho,
684
+ shared_ptr<Region> defon,
685
+ LocalHeap & lh) const;
686
+
687
+
688
+ virtual shared_ptr<BaseMatrix> CreateMassOperator (shared_ptr<CoefficientFunction> rho,
689
+ shared_ptr<Region> defon,
690
+ bool inverse,
691
+ LocalHeap & lh) const;
692
+
693
+ virtual void SolveM(CoefficientFunction * rho, BaseVector & vec, Region * definedon,
694
+ LocalHeap & lh) const;
695
+ virtual void ApplyM(CoefficientFunction * rho, BaseVector & vec, Region * definedon,
696
+ LocalHeap & lh) const;
697
+
698
+ virtual shared_ptr<BaseMatrix> GetTraceOperator (shared_ptr<FESpace> tracespace, bool avg) const;
699
+
700
+ virtual shared_ptr<BaseMatrix> ConvertL2Operator (shared_ptr<FESpace> l2space) const;
701
+
702
+ virtual void GetTrace (const FESpace & tracespace, const BaseVector & in, BaseVector & out, bool avg,
703
+ LocalHeap & lh) const;
704
+
705
+ virtual void GetTraceTrans (const FESpace & tracespace, const BaseVector & in, BaseVector & out, bool avg,
706
+ LocalHeap & lh) const;
707
+
708
+ shared_ptr<ParallelDofs> GetParallelDofs () const { return paralleldofs; }
709
+ virtual void UpdateParallelDofs ();
710
+
711
+ //// is FESpace mpi-distributed ?
712
+ bool IsParallel() const;
713
+
714
+ /// ndof over all mpi-partitions
715
+ size_t GetNDofGlobal() const;
716
+
717
+ virtual int GetRelOrder() const
718
+ {
719
+ return 0;
720
+ }
721
+
722
+ virtual bool VarOrder() const { return 0; }
723
+
724
+ bool timing;
725
+ std::list<std::tuple<std::string,double>> Timing () const;
726
+
727
+
728
+
729
+
730
+ /*
731
+ [[deprecated("Use GetFE with element-id instead of elnr!")]]
732
+ virtual const FiniteElement & GetFE (int elnr, LocalHeap & lh) const final;
733
+ [[deprecated("Use GetFE(ElementId(BND,elnr)) instead!")]]
734
+ virtual const FiniteElement & GetSFE (int elnr, LocalHeap & lh) const final;
735
+ [[deprecated("Use GetFE(ElementId(BBND,elnr)) instead!")]]
736
+ virtual const FiniteElement & GetCD2FE (int cd2elnr, LocalHeap & lh) const final;
737
+ */
738
+ /// get dof-nrs of the element
739
+ [[deprecated("Use GetDofNrs with element-id instead of elnr!")]]
740
+ void GetDofNrs (int elnr, Array<DofId> & dnums) const
741
+ { GetDofNrs(ElementId(VOL,elnr),dnums); }
742
+
743
+ [[deprecated("Use GetDofNrs with element-id instead of elnr!")]]
744
+ void GetDofNrs (int elnr, Array<DofId> & dnums, COUPLING_TYPE ctype) const;
745
+
746
+ /// get dofs on nr'th node of type nt.
747
+ [[deprecated("Use GetDofNrs with NodeId instead of nt/nr")]]
748
+ virtual void GetNodeDofNrs (NODE_TYPE nt, int nr, Array<int> & dnums) const final;
749
+ /// get number of low-order dofs for node of type nt
750
+ // virtual int GetNLowOrderNodeDofs ( NODE_TYPE nt ) const;
751
+ // { return lodofs_per_node[nt]; }
752
+
753
+ /// returns dofs of sourface element
754
+ [[deprecated("Use GetDofNrs(ElementId(BND,elnr)) instead!")]]
755
+ void GetSDofNrs (int selnr, Array<DofId> & dnums) const
756
+ { GetDofNrs(ElementId(BND,selnr),dnums); }
757
+
758
+ /// is the FESpace defined for this sub-domain nr ?
759
+ [[deprecated("Use Definedon(VorB,int) instead")]]
760
+ bool DefinedOn (int domnr) const
761
+ { return !definedon[VOL].Size() || definedon[VOL][domnr]; }
762
+ /// is the FESpace defined for this boundary nr ?
763
+ [[deprecated("Use Definedon(VorB,int) instead")]]
764
+ bool DefinedOnBoundary (int bnr) const
765
+ {return !definedon[BND].Size() || definedon[BND][bnr]; }
766
+
767
+ /// is the FESpace defined for this sub-domain / boundary nr ?
768
+ [[deprecated("Use DefinedOn(VorB, int) instead")]]
769
+ bool DefinedOn (int index, bool bound) const
770
+ {
771
+ if (bound)
772
+ return !definedon[BND].Size() || definedon[BND][index];
773
+ else
774
+ return !definedon[VOL].Size() || definedon[VOL][index];
775
+ }
776
+
777
+ [[deprecated("Use TransformMat with VorB instead of bool")]]
778
+ void TransformMat (int elnr, bool boundary,
779
+ const SliceMatrix<double> & mat, TRANSFORM_TYPE type) const
780
+ {
781
+ TransformMat(ElementId(boundary ? BND : VOL, elnr), mat, type);
782
+ }
783
+
784
+ [[deprecated("Use TransformMat with VorB instead of bool")]]
785
+ void TransformMat (int elnr, bool boundary,
786
+ const SliceMatrix<Complex> & mat, TRANSFORM_TYPE type) const
787
+ {
788
+ TransformMat(ElementId(boundary ? BND : VOL, elnr), mat, type);
789
+ }
790
+
791
+ [[deprecated("Use TransformVec with VorB instead of bool")]]
792
+ void TransformVec (int elnr, bool boundary,
793
+ const FlatVector<double> & vec, TRANSFORM_TYPE type) const
794
+ {
795
+ // VTransformVR (elnr, boundary ? BND : VOL, vec, type);
796
+ VTransformVR (ElementId(boundary ? BND : VOL, elnr), vec, type);
797
+ }
798
+
799
+ [[deprecated("Use TransformVec with VorB instead of bool")]]
800
+ void TransformVec (int elnr, bool boundary,
801
+ const FlatVector<Complex> & vec, TRANSFORM_TYPE type) const
802
+ {
803
+ // VTransformVC (elnr, boundary ? BND : VOL, vec, type);
804
+ VTransformVC (ElementId(boundary ? BND : VOL, elnr), vec, type);
805
+ }
806
+
807
+ [[deprecated("Use TransformMat with VorB instead of bool")]]
808
+ void TransformMat (int elnr, VorB vb,
809
+ const SliceMatrix<double> & mat, TRANSFORM_TYPE type) const
810
+ {
811
+ // VTransformMR (elnr, vb, mat, type);
812
+ VTransformMR (ElementId(vb, elnr), mat, type);
813
+ }
814
+
815
+ [[deprecated("Use TransformMat with VorB instead of bool")]]
816
+ void TransformMat (int elnr, VorB vb,
817
+ const SliceMatrix<Complex> & mat, TRANSFORM_TYPE type) const
818
+ {
819
+ // VTransformMC (elnr, vb, mat, type);
820
+ VTransformMC (ElementId(vb, elnr), mat, type);
821
+ }
822
+
823
+ [[deprecated("Use TransformVec with VorB instead of bool")]]
824
+ void TransformVec (int elnr, VorB vb,
825
+ const FlatVector<double> & vec, TRANSFORM_TYPE type) const
826
+ {
827
+ // VTransformVR (elnr, vb, vec, type);
828
+ VTransformVR (ElementId(vb, elnr), vec, type);
829
+ }
830
+
831
+ [[deprecated("Use TransformVec with VorB instead of bool")]]
832
+ void TransformVec (int elnr, VorB vb,
833
+ const FlatVector<Complex> & vec, TRANSFORM_TYPE type) const
834
+ {
835
+ // VTransformVC (elnr, vb, vec, type);
836
+ VTransformVC (ElementId(vb, elnr), vec, type);
837
+ }
838
+
839
+ [[deprecated("Use GetEvaluator(VorB) instead of GetEvaluator(bool)!")]]
840
+ shared_ptr<DifferentialOperator> GetEvaluator (bool boundary) const
841
+ {
842
+ if(boundary)
843
+ return evaluator[BND];
844
+ else
845
+ return evaluator[VOL];
846
+ }
847
+
848
+ [[deprecated("Use GetFluxEvaluator(VorB) instead of GetFluxEvaluator(bool)!")]]
849
+ shared_ptr<DifferentialOperator> GetFluxEvaluator (bool boundary) const
850
+ {
851
+ if(boundary)
852
+ return flux_evaluator[BND];
853
+ else
854
+ return flux_evaluator[VOL];
855
+ }
856
+
857
+ /// returns function-evaluator
858
+ [[deprecated("Use GetIntegrator(VorB) instead of GetIntegrator(bool)!")]]
859
+ shared_ptr<BilinearFormIntegrator> GetIntegrator (bool vb = VOL) const
860
+ {
861
+ return integrator[vb];
862
+ }
863
+ };
864
+
865
+
866
+
867
+ extern NGS_DLL_HEADER void IterateElements (const FESpace & fes,
868
+ VorB vb,
869
+ LocalHeap & clh,
870
+ const function<void(FESpace::Element,LocalHeap&)> & func);
871
+
872
+
873
+
874
+ /**
875
+ A space of continuous finite elements.
876
+ Supports first and second order finite elements.
877
+ */
878
+ class NGS_DLL_HEADER NodalFESpace : public FESpace
879
+ {
880
+ ///
881
+ // Array<int> ndlevel;
882
+ bool hb_defined;
883
+ Array<bool> used_vertex;
884
+ Array<bool> used_edge;
885
+
886
+ public:
887
+
888
+ ///
889
+ NodalFESpace (shared_ptr<MeshAccess> ama, const Flags & flags, bool parseflags=false);
890
+ ///
891
+ virtual ~NodalFESpace ();
892
+
893
+ ///
894
+ virtual string GetClassName () const override
895
+ {
896
+ return "NodalFESpace";
897
+ }
898
+
899
+ ///
900
+ void Update () override;
901
+ void UpdateCouplingDofArray() override;
902
+
903
+ virtual void DoArchive (Archive & archive) override;
904
+
905
+ virtual FiniteElement & GetFE(ElementId ei, Allocator & lh) const override;
906
+ ///
907
+ // virtual size_t GetNDof () const throw() override;
908
+ ///
909
+ // virtual size_t GetNDofLevel (int level) const override;
910
+ ///
911
+ // using FESpace::GetDofNrs;
912
+ virtual void GetDofNrs (ElementId ei, Array<DofId> & dnums) const override;
913
+ ///
914
+
915
+ virtual void GetVertexDofNrs (int vnr, Array<DofId> & dnums) const override;
916
+ virtual void GetEdgeDofNrs (int ednr, Array<DofId> & dnums) const override;
917
+ virtual void GetFaceDofNrs (int fanr, Array<DofId> & dnums) const override;
918
+ virtual void GetInnerDofNrs (int elnr, Array<DofId> & dnums) const override;
919
+
920
+ virtual shared_ptr<Array<int>> CreateDirectSolverClusters (const Flags & flags) const override;
921
+ };
922
+
923
+
924
+
925
+
926
+
927
+
928
+ ///
929
+ class NGS_DLL_HEADER NonconformingFESpace : public FESpace
930
+ {
931
+ ///
932
+ // Array<int> ndlevel;
933
+
934
+ public:
935
+ NonconformingFESpace (shared_ptr<MeshAccess> ama, const Flags & flags, bool parseflags=false);
936
+ virtual ~NonconformingFESpace ();
937
+
938
+ virtual string GetClassName () const override
939
+ { return "Nonconforming FESpace"; }
940
+
941
+ ///
942
+ void Update() override;
943
+
944
+ virtual FiniteElement & GetFE (ElementId ei, Allocator & lh) const override;
945
+ ///
946
+ // virtual size_t GetNDof () const throw() override;
947
+ ///
948
+ virtual void GetDofNrs (ElementId ei, Array<DofId> & dnums) const override;
949
+ };
950
+
951
+
952
+
953
+ ///
954
+ class NGS_DLL_HEADER NonconformingSurfaceFESpace : public FESpace
955
+ {
956
+ ///
957
+ // Array<int> ndlevel;
958
+
959
+ public:
960
+ NonconformingSurfaceFESpace (shared_ptr<MeshAccess> ama, const Flags & flags, bool parseflags=false);
961
+ virtual ~NonconformingSurfaceFESpace ();
962
+
963
+ virtual string GetClassName () const override
964
+ { return "Nonconforming surface FESpace"; }
965
+
966
+ ///
967
+ void Update() override;
968
+
969
+ virtual FiniteElement & GetFE (ElementId ei, Allocator & lh) const override;
970
+ ///
971
+ // virtual size_t GetNDof () const throw() override;
972
+ ///
973
+ virtual void GetDofNrs (ElementId ei, Array<DofId> & dnums) const override;
974
+ };
975
+
976
+
977
+
978
+
979
+
980
+
981
+
982
+ ///
983
+ class NGS_DLL_HEADER ElementFESpace : public FESpace
984
+ {
985
+ /// Array<int> startelement;
986
+ // Array<int> ndlevel;
987
+ int n_el_dofs;
988
+ public:
989
+ ///
990
+ ElementFESpace (shared_ptr<MeshAccess> ama, const Flags& flags, bool parseflags=false);
991
+
992
+ ///
993
+ ~ElementFESpace ();
994
+
995
+ virtual string GetClassName () const override
996
+ {
997
+ return "ElementFESpace";
998
+ }
999
+
1000
+ ///
1001
+ void Update() override;
1002
+ ///
1003
+ virtual void DoArchive (Archive & archive) override;
1004
+
1005
+ virtual FiniteElement & GetFE (ElementId ei, Allocator & lh) const override;
1006
+ ///
1007
+ // virtual size_t GetNDof () const throw() override { return ndlevel.Last(); }
1008
+
1009
+ ///
1010
+ virtual void GetDofNrs (ElementId ei, Array<DofId> & dnums) const override;
1011
+
1012
+ ///
1013
+ // virtual size_t GetNDofLevel (int level) const override;
1014
+
1015
+
1016
+ virtual void GetVertexDofNrs (int vnr, Array<DofId> & dnums) const override
1017
+ { dnums.SetSize (0); }
1018
+ virtual void GetEdgeDofNrs (int ednr, Array<DofId> & dnums) const override
1019
+ { dnums.SetSize (0); }
1020
+ virtual void GetFaceDofNrs (int fanr, Array<DofId> & dnums) const override
1021
+ { dnums.SetSize (0); }
1022
+ virtual void GetInnerDofNrs (int elnr, Array<DofId> & dnums) const override
1023
+ { GetDofNrs (elnr, dnums); }
1024
+ };
1025
+
1026
+
1027
+
1028
+
1029
+
1030
+ /// Non-continous fe space on boundary
1031
+ class NGS_DLL_HEADER SurfaceElementFESpace : public FESpace
1032
+ {
1033
+ ///
1034
+ // Array<int> ndlevel;
1035
+ int n_el_dofs;
1036
+ public:
1037
+ ///
1038
+ SurfaceElementFESpace (shared_ptr<MeshAccess> ama, const Flags& flags,
1039
+ bool checkflags = false);
1040
+
1041
+ ///
1042
+ ~SurfaceElementFESpace ();
1043
+
1044
+ ///
1045
+ virtual string GetClassName() const override
1046
+ { return "SurfaceElement"; }
1047
+
1048
+ ///
1049
+ void Update() override;
1050
+
1051
+ ///
1052
+ // virtual size_t GetNDof () const throw() { return ndlevel.Last(); }
1053
+
1054
+ ///
1055
+ virtual FiniteElement & GetFE (ElementId ei, Allocator & lh) const override;
1056
+
1057
+ ///
1058
+ virtual void GetDofNrs (ElementId ei, Array<DofId> & dnums) const override;
1059
+
1060
+ ///
1061
+ // virtual size_t GetNDofLevel (int level) const;
1062
+
1063
+ };
1064
+
1065
+
1066
+
1067
+
1068
+
1069
+
1070
+
1071
+ /// A combination of fe-spaces
1072
+ class NGS_DLL_HEADER CompoundFESpace : public FESpace
1073
+ {
1074
+ protected:
1075
+ /// pointers to components
1076
+ Array<shared_ptr<FESpace>> spaces;
1077
+ /// cummlated number of dofs of components
1078
+ Array<int> cummulative_nd;
1079
+ /// dofs on each multigrid level
1080
+ /// Array<int> ndlevel;
1081
+ bool all_the_same;
1082
+ bool do_subspace_update = true;
1083
+ public:
1084
+ /// generates a compound space.
1085
+ /// components will be added later
1086
+ CompoundFESpace (shared_ptr<MeshAccess> ama,
1087
+ const Flags & flags, bool parseflags = false);
1088
+ /// generates a compound space
1089
+ /// components are provided in aspaces
1090
+ CompoundFESpace (shared_ptr<MeshAccess> ama,
1091
+ const Array<shared_ptr<FESpace>> & aspaces,
1092
+ const Flags & flags, bool parseflags = false);
1093
+
1094
+ /// not much to do.
1095
+ /// components will not be deleted
1096
+ virtual ~CompoundFESpace ();
1097
+
1098
+ /// add an additional component space
1099
+ void AddSpace (shared_ptr<FESpace> fes);
1100
+ auto & Spaces() const { return spaces; }
1101
+
1102
+ ///
1103
+ string GetClassName () const override
1104
+ {
1105
+ return "CompoundFESpace";
1106
+ }
1107
+
1108
+ /// updates also components
1109
+ void Update() override;
1110
+ /// updates also components
1111
+ void FinalizeUpdate() override;
1112
+
1113
+ ProxyNode MakeProxyFunction (bool testfunction,
1114
+ const function<shared_ptr<ProxyFunction>(shared_ptr<ProxyFunction>)> & addblock) const override;
1115
+
1116
+ /// copies dofcoupling from components
1117
+ void UpdateCouplingDofArray() override;
1118
+ virtual void UpdateFreeDofs() override;
1119
+
1120
+ void SetDefinedOn (VorB vb, const BitArray& defon) override;
1121
+
1122
+ DofRange GetRange (int spacenr) const
1123
+ {
1124
+ if (spacenr+1 >= cummulative_nd.Size())
1125
+ throw Exception("spacenr >= cummulative_nd.Size() in CompoundFESpace!");
1126
+
1127
+ return DofRange(IntRange(cummulative_nd[spacenr], cummulative_nd[spacenr+1]),
1128
+ spaces[spacenr]->GetParallelDofs());
1129
+ }
1130
+
1131
+ shared_ptr<BaseMatrix> EmbeddingOperator (int spacenr) const;
1132
+ shared_ptr<BaseMatrix> RestrictionOperator (int spacenr) const;
1133
+
1134
+ /// get component space
1135
+ shared_ptr<FESpace> operator[] (int i) const { return spaces[i]; }
1136
+
1137
+ /// returns a compound finite element
1138
+ FiniteElement & GetFE (ElementId ei, Allocator & lh) const override;
1139
+ ///
1140
+ void GetDofNrs (ElementId ei, Array<DofId> & dnums) const override;
1141
+ void GetDofNrs (NodeId ni, Array<DofId> & dnums) const override;
1142
+ void GetElementDofsOfType (ElementId ei, Array<DofId> & dnums, COUPLING_TYPE ctype) const override;
1143
+ ///
1144
+ [[deprecated("Use GetDofNrs(NODE_TYPE(NT_VERTEX,nr) instead")]]
1145
+ void GetVertexDofNrs (int vnr, Array<DofId> & dnums) const override;
1146
+ [[deprecated("Use GetDofNrs(NODE_TYPE(NT_EDGE,nr) instead")]]
1147
+ void GetEdgeDofNrs (int ednr, Array<DofId> & dnums) const override;
1148
+ void GetFaceDofNrs (int fanr, Array<DofId> & dnums) const override;
1149
+ void GetInnerDofNrs (int elnr, Array<DofId> & dnums) const override;
1150
+ void SelectDofs (const string & name, BitArray & dofs) const override;
1151
+
1152
+ void SolveM(CoefficientFunction * rho, BaseVector & vec, Region * definedon,
1153
+ LocalHeap & lh) const override;
1154
+ void ApplyM(CoefficientFunction * rho, BaseVector & vec, Region * definedon,
1155
+ LocalHeap & lh) const override;
1156
+
1157
+ template <class T> NGS_DLL_HEADER
1158
+ void T_TransformMat (ElementId ei,
1159
+ SliceMatrix<T> mat, TRANSFORM_TYPE tt) const;
1160
+
1161
+ template <class T> NGS_DLL_HEADER
1162
+ void T_TransformVec (ElementId ei,
1163
+ SliceVector<T> vec, TRANSFORM_TYPE tt) const;
1164
+
1165
+ void VTransformMR (ElementId ei,
1166
+ SliceMatrix<double> mat, TRANSFORM_TYPE tt) const override;
1167
+ void VTransformMC (ElementId ei,
1168
+ SliceMatrix<Complex> mat, TRANSFORM_TYPE tt) const override;
1169
+ void VTransformVR (ElementId ei,
1170
+ SliceVector<double> vec, TRANSFORM_TYPE tt) const override;
1171
+ void VTransformVC (ElementId ei,
1172
+ SliceVector<Complex> vec, TRANSFORM_TYPE tt) const override;
1173
+
1174
+ /// number of component spaces
1175
+ inline int GetNSpaces () const { return spaces.Size(); }
1176
+
1177
+ void SetDoSubspaceUpdate(bool _do_subspace_update)
1178
+ { do_subspace_update = _do_subspace_update; }
1179
+ };
1180
+
1181
+
1182
+
1183
+ class NGS_DLL_HEADER CompoundFESpaceAllSame : public CompoundFESpace
1184
+ {
1185
+ bool interleaved;
1186
+ public:
1187
+ CompoundFESpaceAllSame (shared_ptr<FESpace> space, int dim, const Flags & flags,
1188
+ bool checkflags = false);
1189
+ virtual string GetClassName () const override;
1190
+
1191
+ virtual FiniteElement & GetFE (ElementId ei, Allocator & alloc) const override {
1192
+ return *new (alloc) VectorFiniteElement (spaces[0]->GetFE(ei, alloc), spaces.Size());
1193
+ }
1194
+
1195
+ virtual FlatArray<VorB> GetDualShapeNodes (VorB vb) const override
1196
+ {
1197
+ return spaces[0]->GetDualShapeNodes(vb);
1198
+ }
1199
+
1200
+ virtual shared_ptr<BaseMatrix> GetTraceOperator (shared_ptr<FESpace> tracespace, bool avg) const override;
1201
+ };
1202
+
1203
+ class NGS_DLL_HEADER MatrixFESpace : public CompoundFESpace
1204
+ {
1205
+ bool symmetric;
1206
+ bool deviatoric;
1207
+ bool skewsymmetric;
1208
+ int vdim;
1209
+ public:
1210
+ MatrixFESpace (shared_ptr<FESpace> space, int avdim, const Flags & flags,
1211
+ bool checkflags = false);
1212
+ virtual string GetClassName () const override;
1213
+ FiniteElement & GetFE (ElementId ei, Allocator & lh) const override;
1214
+ };
1215
+
1216
+
1217
+
1218
+ template <typename BASESPACE>
1219
+ class VectorFESpace : public CompoundFESpace
1220
+ {
1221
+ public:
1222
+ VectorFESpace (shared_ptr<MeshAccess> ama, const Flags & flags,
1223
+ bool checkflags = false)
1224
+ : CompoundFESpace (ama, flags)
1225
+ {
1226
+ Array<string> dirichlet_comp;
1227
+ string dirnames[] = { "dirichletx", "dirichlety", "dirichletz" };
1228
+ for (int i = 0; i < ma->GetDimension(); i++)
1229
+ {
1230
+ Flags tmpflags = flags;
1231
+ if (flags.StringFlagDefined(dirnames[i]))
1232
+ tmpflags.SetFlag ("dirichlet", flags.GetStringFlag(dirnames[i]));
1233
+ if (flags.StringFlagDefined(dirnames[i]+"_bbnd"))
1234
+ tmpflags.SetFlag ("dirichlet_bbnd", flags.GetStringFlag(dirnames[i]+"_bbnd"));
1235
+ AddSpace (make_shared<BASESPACE> (ama, tmpflags));
1236
+ }
1237
+
1238
+ for (auto vb : { VOL, BND, BBND, BBBND })
1239
+ {
1240
+ if (auto eval = spaces[0] -> GetEvaluator(vb))
1241
+ evaluator[vb] = make_shared<VectorDifferentialOperator> (eval, ma->GetDimension());
1242
+ if (auto fluxeval = spaces[0] -> GetFluxEvaluator(vb))
1243
+ flux_evaluator[vb] = make_shared<VectorDifferentialOperator> (fluxeval, ma->GetDimension());
1244
+ }
1245
+
1246
+ auto additional = spaces[0]->GetAdditionalEvaluators();
1247
+ for (int i = 0; i < additional.Size(); i++)
1248
+ additional_evaluators.Set (additional.GetName(i),
1249
+ make_shared<VectorDifferentialOperator>(additional[i], ma->GetDimension()));
1250
+
1251
+ type = "Vector"+(*this)[0]->type;
1252
+ }
1253
+
1254
+ virtual string GetClassName () const override
1255
+ {
1256
+ return "Vector"+ (*this)[0]->GetClassName();
1257
+ }
1258
+
1259
+ FiniteElement & GetFE (ElementId ei, Allocator & alloc) const override {
1260
+ return *new (alloc) VectorFiniteElement (spaces[0]->GetFE(ei, alloc), spaces.Size());
1261
+ }
1262
+
1263
+ virtual FlatArray<VorB> GetDualShapeNodes (VorB vb) const override
1264
+ {
1265
+ return spaces[0]->GetDualShapeNodes(vb);
1266
+ }
1267
+
1268
+ };
1269
+
1270
+
1271
+
1272
+ class NGS_DLL_HEADER ApplyMass : public BaseMatrix
1273
+ {
1274
+ protected:
1275
+ shared_ptr<FESpace> fes;
1276
+ shared_ptr<CoefficientFunction> rho;
1277
+ bool inverse;
1278
+ shared_ptr<Region> definedon;
1279
+ LocalHeap & lh;
1280
+ public:
1281
+ ///
1282
+ ApplyMass (shared_ptr<FESpace> afes,
1283
+ shared_ptr<CoefficientFunction> arho,
1284
+ bool ainverse,
1285
+ shared_ptr<Region> adefinedon,
1286
+ LocalHeap & alh);
1287
+ virtual ~ApplyMass();
1288
+ virtual shared_ptr<BaseMatrix> InverseMatrix (shared_ptr<BitArray> subset = nullptr) const override;
1289
+
1290
+ virtual bool IsComplex() const override
1291
+ {
1292
+ return fes->IsComplex();
1293
+ }
1294
+
1295
+ shared_ptr<BaseMatrix> CreateDeviceMatrix() const override
1296
+ {
1297
+ return fes->CreateMassOperator(rho, definedon, inverse, lh)->CreateDeviceMatrix();
1298
+ }
1299
+
1300
+
1301
+ virtual void Mult (const BaseVector & v, BaseVector & prod) const override;
1302
+ virtual void MultAdd (double val, const BaseVector & v, BaseVector & prod) const override;
1303
+ virtual void MultAdd (Complex val, const BaseVector & v, BaseVector & prod) const override;
1304
+ virtual void MultTransAdd (double val, const BaseVector & v, BaseVector & prod) const override;
1305
+
1306
+ virtual AutoVector CreateVector () const override;
1307
+ virtual AutoVector CreateRowVector () const override;
1308
+ virtual AutoVector CreateColVector () const override;
1309
+
1310
+ virtual int VHeight() const override
1311
+ {
1312
+ return fes->GetNDof();
1313
+ }
1314
+ ///
1315
+ virtual int VWidth() const override
1316
+ {
1317
+ return fes->GetNDof();
1318
+ }
1319
+ };
1320
+
1321
+
1322
+
1323
+ class NGS_DLL_HEADER ApplyTrace : public BaseMatrix
1324
+ {
1325
+ protected:
1326
+ shared_ptr<FESpace> fes;
1327
+ shared_ptr<FESpace> festrace;
1328
+ bool average;
1329
+ LocalHeap & lh;
1330
+ public:
1331
+ ApplyTrace (shared_ptr<FESpace> afes,
1332
+ shared_ptr<FESpace> afestrace,
1333
+ bool aaverage,
1334
+ LocalHeap & alh);
1335
+ virtual ~ApplyTrace();
1336
+
1337
+ virtual int VHeight() const override { return festrace->GetNDof(); }
1338
+ virtual int VWidth() const override { return fes->GetNDof(); }
1339
+ virtual bool IsComplex() const override { return fes->IsComplex(); }
1340
+
1341
+ virtual void Mult (const BaseVector & v, BaseVector & prod) const override;
1342
+ virtual void MultAdd (double val, const BaseVector & v, BaseVector & prod) const override;
1343
+ virtual void MultAdd (Complex val, const BaseVector & v, BaseVector & prod) const override;
1344
+ virtual void MultTransAdd (double val, const BaseVector & v, BaseVector & prod) const override;
1345
+
1346
+ virtual AutoVector CreateVector () const override;
1347
+ virtual AutoVector CreateRowVector () const override;
1348
+ virtual AutoVector CreateColVector () const override;
1349
+ };
1350
+
1351
+
1352
+
1353
+ /// Registered FESpace classes
1354
+ class NGS_DLL_HEADER FESpaceClasses
1355
+ {
1356
+ public:
1357
+ /// descriptor for register fespaces.
1358
+ /// function pointer to create function.
1359
+ struct FESpaceInfo
1360
+ {
1361
+ /// the name
1362
+ string name;
1363
+ /// function pointer to creator function
1364
+ shared_ptr<FESpace> (*creator)(shared_ptr<MeshAccess> ma, const Flags & flags);
1365
+ /// function pointer to docu function
1366
+ DocInfo (*getdocu)();
1367
+ /// creates a descriptor
1368
+ FESpaceInfo (const string & aname,
1369
+ shared_ptr<FESpace> (*acreator)(shared_ptr<MeshAccess> ma, const Flags & flags),
1370
+ DocInfo (*agetdocu)())
1371
+ : name(aname), creator(acreator), getdocu(agetdocu) {;}
1372
+ };
1373
+ private:
1374
+ Array<shared_ptr<FESpaceInfo>> fesa;
1375
+
1376
+ public:
1377
+ /// initialize
1378
+ FESpaceClasses() { ; }
1379
+ /// cleans up
1380
+ ~FESpaceClasses();
1381
+
1382
+ /// add a descriptor
1383
+ void AddFESpace (const string & aname,
1384
+ shared_ptr<FESpace> (*acreator)(shared_ptr<MeshAccess> ma, const Flags & flags),
1385
+ DocInfo (*getdocu)() = FESpace::GetDocu);
1386
+
1387
+ /// returns all creators
1388
+ const Array<shared_ptr<FESpaceInfo>> & GetFESpaces() { return fesa; }
1389
+
1390
+ /// returns a creator structure
1391
+ const shared_ptr<FESpaceInfo> GetFESpace(const string & name);
1392
+
1393
+ /// print available fespaces to stream
1394
+ void Print (ostream & ost) const;
1395
+ };
1396
+
1397
+ /// returns createion object
1398
+ extern NGS_DLL_HEADER FESpaceClasses & GetFESpaceClasses ();
1399
+
1400
+ /// creates a fespace of that type
1401
+ extern NGS_DLL_HEADER shared_ptr<FESpace> CreateFESpace (const string & type,
1402
+ shared_ptr<MeshAccess> ma,
1403
+ const Flags & flags);
1404
+
1405
+
1406
+ /**
1407
+ template for registration of finite element spaces.
1408
+ provides static Create - function
1409
+ */
1410
+ template <typename FES>
1411
+ class RegisterFESpace
1412
+ {
1413
+ public:
1414
+ RegisterClassForArchive<FES, FESpace> regclass;
1415
+ /// constructor registers fespace
1416
+ RegisterFESpace (string label)
1417
+ {
1418
+ GetFESpaceClasses().AddFESpace (label, Create, FES::GetDocu);
1419
+ // cout << "register fespace '" << label << "'" << endl;
1420
+ }
1421
+
1422
+ /// creates an fespace of type FES
1423
+ static shared_ptr<FESpace> Create (shared_ptr<MeshAccess> ma, const Flags & flags)
1424
+ {
1425
+ return make_shared<FES> (ma, flags);
1426
+ }
1427
+ };
1428
+
1429
+
1430
+ }
1431
+
1432
+
1433
+
1434
+
1435
+
1436
+ namespace ngcore
1437
+ {
1438
+ template<typename T> struct MPI_typetrait;
1439
+
1440
+ template<>
1441
+ struct MPI_typetrait<ngcomp::COUPLING_TYPE>
1442
+ {
1443
+ static auto MPIType ()
1444
+ {
1445
+ static_assert ( (sizeof(ngcomp::COUPLING_TYPE) == sizeof(char)) ||
1446
+ (sizeof(ngcomp::COUPLING_TYPE) == sizeof(int)) );
1447
+ if constexpr (sizeof(ngcomp::COUPLING_TYPE) == sizeof(char)) return MPI_typetrait<char>::MPIType();
1448
+ if constexpr (sizeof(ngcomp::COUPLING_TYPE) == sizeof(int)) return MPI_typetrait<int>::MPIType();
1449
+ }
1450
+ };
1451
+ }
1452
+
1453
+
1454
+ #endif