ngsolve 6.2.2506.post74.dev0__cp314-cp314-macosx_10_15_universal2.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


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

Files changed (315) hide show
  1. netgen/include/analytic_integrals.hpp +10 -0
  2. netgen/include/arnoldi.hpp +55 -0
  3. netgen/include/bandmatrix.hpp +334 -0
  4. netgen/include/basematrix.hpp +957 -0
  5. netgen/include/basevector.hpp +1268 -0
  6. netgen/include/bdbequations.hpp +2805 -0
  7. netgen/include/bdbintegrator.hpp +1660 -0
  8. netgen/include/bem_diffops.hpp +475 -0
  9. netgen/include/bessel.hpp +1064 -0
  10. netgen/include/bilinearform.hpp +963 -0
  11. netgen/include/bla.hpp +29 -0
  12. netgen/include/blockalloc.hpp +95 -0
  13. netgen/include/blockjacobi.hpp +328 -0
  14. netgen/include/bspline.hpp +116 -0
  15. netgen/include/calcinverse.hpp +141 -0
  16. netgen/include/cg.hpp +368 -0
  17. netgen/include/chebyshev.hpp +44 -0
  18. netgen/include/cholesky.hpp +720 -0
  19. netgen/include/clapack.h +7254 -0
  20. netgen/include/code_generation.hpp +296 -0
  21. netgen/include/coefficient.hpp +2033 -0
  22. netgen/include/coefficient_impl.hpp +19 -0
  23. netgen/include/coefficient_stdmath.hpp +167 -0
  24. netgen/include/commutingAMG.hpp +106 -0
  25. netgen/include/comp.hpp +79 -0
  26. netgen/include/compatibility.hpp +41 -0
  27. netgen/include/complex_wrapper.hpp +73 -0
  28. netgen/include/compressedfespace.hpp +110 -0
  29. netgen/include/contact.hpp +235 -0
  30. netgen/include/diagonalmatrix.hpp +154 -0
  31. netgen/include/differentialoperator.hpp +276 -0
  32. netgen/include/diffop.hpp +1286 -0
  33. netgen/include/diffop_impl.hpp +328 -0
  34. netgen/include/diffopwithfactor.hpp +123 -0
  35. netgen/include/discontinuous.hpp +84 -0
  36. netgen/include/dump.hpp +949 -0
  37. netgen/include/ectypes.hpp +121 -0
  38. netgen/include/eigen.hpp +60 -0
  39. netgen/include/eigensystem.hpp +18 -0
  40. netgen/include/elasticity_equations.hpp +595 -0
  41. netgen/include/elementbyelement.hpp +195 -0
  42. netgen/include/elementtopology.hpp +1760 -0
  43. netgen/include/elementtransformation.hpp +339 -0
  44. netgen/include/evalfunc.hpp +405 -0
  45. netgen/include/expr.hpp +1686 -0
  46. netgen/include/facetfe.hpp +175 -0
  47. netgen/include/facetfespace.hpp +180 -0
  48. netgen/include/facethofe.hpp +111 -0
  49. netgen/include/facetsurffespace.hpp +112 -0
  50. netgen/include/fe_interfaces.hpp +32 -0
  51. netgen/include/fem.hpp +87 -0
  52. netgen/include/fesconvert.hpp +14 -0
  53. netgen/include/fespace.hpp +1449 -0
  54. netgen/include/finiteelement.hpp +286 -0
  55. netgen/include/globalinterfacespace.hpp +77 -0
  56. netgen/include/globalspace.hpp +115 -0
  57. netgen/include/gridfunction.hpp +525 -0
  58. netgen/include/h1amg.hpp +124 -0
  59. netgen/include/h1hofe.hpp +188 -0
  60. netgen/include/h1hofe_impl.hpp +1262 -0
  61. netgen/include/h1hofefo.hpp +148 -0
  62. netgen/include/h1hofefo_impl.hpp +185 -0
  63. netgen/include/h1hofespace.hpp +167 -0
  64. netgen/include/h1lofe.hpp +1240 -0
  65. netgen/include/h1lumping.hpp +41 -0
  66. netgen/include/hcurl_equations.hpp +1381 -0
  67. netgen/include/hcurlcurlfe.hpp +2241 -0
  68. netgen/include/hcurlcurlfespace.hpp +78 -0
  69. netgen/include/hcurlfe.hpp +259 -0
  70. netgen/include/hcurlfe_utils.hpp +107 -0
  71. netgen/include/hcurlhdiv_dshape.hpp +857 -0
  72. netgen/include/hcurlhdivfes.hpp +308 -0
  73. netgen/include/hcurlhofe.hpp +175 -0
  74. netgen/include/hcurlhofe_impl.hpp +1871 -0
  75. netgen/include/hcurlhofespace.hpp +193 -0
  76. netgen/include/hcurllofe.hpp +1146 -0
  77. netgen/include/hdiv_equations.hpp +880 -0
  78. netgen/include/hdivdivfe.hpp +2923 -0
  79. netgen/include/hdivdivsurfacespace.hpp +76 -0
  80. netgen/include/hdivfe.hpp +206 -0
  81. netgen/include/hdivfe_utils.hpp +717 -0
  82. netgen/include/hdivfes.hpp +75 -0
  83. netgen/include/hdivhofe.hpp +447 -0
  84. netgen/include/hdivhofe_impl.hpp +1107 -0
  85. netgen/include/hdivhofefo.hpp +229 -0
  86. netgen/include/hdivhofespace.hpp +177 -0
  87. netgen/include/hdivhosurfacefespace.hpp +106 -0
  88. netgen/include/hdivlofe.hpp +773 -0
  89. netgen/include/hidden.hpp +74 -0
  90. netgen/include/householder.hpp +181 -0
  91. netgen/include/hypre_ams_precond.hpp +123 -0
  92. netgen/include/hypre_precond.hpp +73 -0
  93. netgen/include/integrator.hpp +2012 -0
  94. netgen/include/integratorcf.hpp +253 -0
  95. netgen/include/interpolate.hpp +49 -0
  96. netgen/include/intrule.hpp +2542 -0
  97. netgen/include/intrules_SauterSchwab.hpp +25 -0
  98. netgen/include/irspace.hpp +49 -0
  99. netgen/include/jacobi.hpp +153 -0
  100. netgen/include/kernels.hpp +762 -0
  101. netgen/include/l2hofe.hpp +194 -0
  102. netgen/include/l2hofe_impl.hpp +564 -0
  103. netgen/include/l2hofefo.hpp +542 -0
  104. netgen/include/l2hofespace.hpp +344 -0
  105. netgen/include/la.hpp +38 -0
  106. netgen/include/linearform.hpp +266 -0
  107. netgen/include/matrix.hpp +2140 -0
  108. netgen/include/memusage.hpp +41 -0
  109. netgen/include/meshaccess.hpp +1359 -0
  110. netgen/include/mgpre.hpp +204 -0
  111. netgen/include/mp_coefficient.hpp +145 -0
  112. netgen/include/mptools.hpp +2281 -0
  113. netgen/include/multigrid.hpp +42 -0
  114. netgen/include/multivector.hpp +447 -0
  115. netgen/include/mumpsinverse.hpp +187 -0
  116. netgen/include/mycomplex.hpp +361 -0
  117. netgen/include/ng_lapack.hpp +1661 -0
  118. netgen/include/ngblas.hpp +1232 -0
  119. netgen/include/ngs_defines.hpp +30 -0
  120. netgen/include/ngs_stdcpp_include.hpp +106 -0
  121. netgen/include/ngs_utils.hpp +121 -0
  122. netgen/include/ngsobject.hpp +1019 -0
  123. netgen/include/ngsstream.hpp +113 -0
  124. netgen/include/ngstd.hpp +72 -0
  125. netgen/include/nodalhofe.hpp +96 -0
  126. netgen/include/nodalhofe_impl.hpp +141 -0
  127. netgen/include/normalfacetfe.hpp +223 -0
  128. netgen/include/normalfacetfespace.hpp +98 -0
  129. netgen/include/normalfacetsurfacefespace.hpp +84 -0
  130. netgen/include/order.hpp +251 -0
  131. netgen/include/parallel_matrices.hpp +222 -0
  132. netgen/include/paralleldofs.hpp +340 -0
  133. netgen/include/parallelngs.hpp +23 -0
  134. netgen/include/parallelvector.hpp +269 -0
  135. netgen/include/pardisoinverse.hpp +200 -0
  136. netgen/include/periodic.hpp +129 -0
  137. netgen/include/plateaufespace.hpp +25 -0
  138. netgen/include/pml.hpp +275 -0
  139. netgen/include/pmltrafo.hpp +631 -0
  140. netgen/include/postproc.hpp +142 -0
  141. netgen/include/potentialtools.hpp +22 -0
  142. netgen/include/precomp.hpp +60 -0
  143. netgen/include/preconditioner.hpp +602 -0
  144. netgen/include/prolongation.hpp +377 -0
  145. netgen/include/python_comp.hpp +107 -0
  146. netgen/include/python_fem.hpp +89 -0
  147. netgen/include/python_linalg.hpp +58 -0
  148. netgen/include/python_ngstd.hpp +386 -0
  149. netgen/include/recursive_pol.hpp +4896 -0
  150. netgen/include/recursive_pol_tet.hpp +395 -0
  151. netgen/include/recursive_pol_trig.hpp +492 -0
  152. netgen/include/reorderedfespace.hpp +81 -0
  153. netgen/include/sample_sort.hpp +105 -0
  154. netgen/include/scalarfe.hpp +335 -0
  155. netgen/include/shapefunction_utils.hpp +113 -0
  156. netgen/include/simd_complex.hpp +329 -0
  157. netgen/include/smoother.hpp +253 -0
  158. netgen/include/solve.hpp +89 -0
  159. netgen/include/sparsecholesky.hpp +313 -0
  160. netgen/include/sparsematrix.hpp +1038 -0
  161. netgen/include/sparsematrix_dyn.hpp +90 -0
  162. netgen/include/sparsematrix_impl.hpp +1013 -0
  163. netgen/include/special_matrix.hpp +463 -0
  164. netgen/include/specialelement.hpp +125 -0
  165. netgen/include/statushandler.hpp +33 -0
  166. netgen/include/stringops.hpp +12 -0
  167. netgen/include/superluinverse.hpp +136 -0
  168. netgen/include/symbolicintegrator.hpp +850 -0
  169. netgen/include/symmetricmatrix.hpp +144 -0
  170. netgen/include/tangentialfacetfe.hpp +224 -0
  171. netgen/include/tangentialfacetfespace.hpp +91 -0
  172. netgen/include/tensor.hpp +522 -0
  173. netgen/include/tensorcoefficient.hpp +446 -0
  174. netgen/include/tensorproductintegrator.hpp +113 -0
  175. netgen/include/thcurlfe.hpp +128 -0
  176. netgen/include/thcurlfe_impl.hpp +380 -0
  177. netgen/include/thdivfe.hpp +80 -0
  178. netgen/include/thdivfe_impl.hpp +492 -0
  179. netgen/include/tpdiffop.hpp +461 -0
  180. netgen/include/tpfes.hpp +133 -0
  181. netgen/include/tpintrule.hpp +224 -0
  182. netgen/include/triangular.hpp +465 -0
  183. netgen/include/tscalarfe.hpp +245 -0
  184. netgen/include/tscalarfe_impl.hpp +1029 -0
  185. netgen/include/umfpackinverse.hpp +148 -0
  186. netgen/include/vector.hpp +1273 -0
  187. netgen/include/voxelcoefficientfunction.hpp +41 -0
  188. netgen/include/vtkoutput.hpp +198 -0
  189. netgen/include/vvector.hpp +208 -0
  190. netgen/include/webgui.hpp +92 -0
  191. netgen/libngbla.dylib +0 -0
  192. netgen/libngcomp.dylib +0 -0
  193. netgen/libngfem.dylib +0 -0
  194. netgen/libngla.dylib +0 -0
  195. netgen/libngsbem.dylib +0 -0
  196. netgen/libngsolve.dylib +0 -0
  197. netgen/libngstd.dylib +0 -0
  198. ngsolve/TensorProductTools.py +210 -0
  199. ngsolve/__console.py +94 -0
  200. ngsolve/__expr.py +181 -0
  201. ngsolve/__init__.py +148 -0
  202. ngsolve/__init__.pyi +233 -0
  203. ngsolve/_scikit_build_core_dependencies.py +30 -0
  204. ngsolve/bla.pyi +1153 -0
  205. ngsolve/bvp.py +78 -0
  206. ngsolve/bvp.pyi +32 -0
  207. ngsolve/cmake/NGSolveConfig.cmake +102 -0
  208. ngsolve/cmake/ngsolve-targets-release.cmake +79 -0
  209. ngsolve/cmake/ngsolve-targets.cmake +163 -0
  210. ngsolve/comp/__init__.pyi +5449 -0
  211. ngsolve/comp/pml.pyi +89 -0
  212. ngsolve/config/__init__.py +1 -0
  213. ngsolve/config/__init__.pyi +43 -0
  214. ngsolve/config/__main__.py +4 -0
  215. ngsolve/config/config.py +60 -0
  216. ngsolve/config/config.pyi +45 -0
  217. ngsolve/demos/TensorProduct/__init__.py +0 -0
  218. ngsolve/demos/TensorProduct/tp_dg_1d_1d.py +80 -0
  219. ngsolve/demos/TensorProduct/tp_dg_1d_2d.py +73 -0
  220. ngsolve/demos/TensorProduct/tp_dg_2d_1d.py +72 -0
  221. ngsolve/demos/TensorProduct/tp_dg_2d_2d.py +66 -0
  222. ngsolve/demos/__init__.py +0 -0
  223. ngsolve/demos/howto/__init__.py +0 -0
  224. ngsolve/demos/howto/hhj.py +44 -0
  225. ngsolve/demos/howto/hybrid_dg.py +53 -0
  226. ngsolve/demos/howto/mixed.py +30 -0
  227. ngsolve/demos/howto/nonlin.py +29 -0
  228. ngsolve/demos/howto/pickling.py +26 -0
  229. ngsolve/demos/howto/pml.py +31 -0
  230. ngsolve/demos/howto/taskmanager.py +20 -0
  231. ngsolve/demos/howto/tdnns.py +47 -0
  232. ngsolve/demos/howto/timeDG-skeleton.py +45 -0
  233. ngsolve/demos/howto/timeDG.py +38 -0
  234. ngsolve/demos/howto/timeDGlap.py +42 -0
  235. ngsolve/demos/howto/timeDGwave.py +61 -0
  236. ngsolve/demos/intro/__init__.py +0 -0
  237. ngsolve/demos/intro/adaptive.py +123 -0
  238. ngsolve/demos/intro/cmagnet.py +59 -0
  239. ngsolve/demos/intro/elasticity.py +76 -0
  240. ngsolve/demos/intro/navierstokes.py +74 -0
  241. ngsolve/demos/intro/poisson.ipynb +170 -0
  242. ngsolve/demos/intro/poisson.py +41 -0
  243. ngsolve/demos/mpi/__init__.py +0 -0
  244. ngsolve/demos/mpi/mpi_cmagnet.py +87 -0
  245. ngsolve/demos/mpi/mpi_navierstokes.py +117 -0
  246. ngsolve/demos/mpi/mpi_poisson.py +89 -0
  247. ngsolve/demos/mpi/mpi_timeDG.py +82 -0
  248. ngsolve/directsolvers.py +26 -0
  249. ngsolve/directsolvers.pyi +15 -0
  250. ngsolve/eigenvalues.py +364 -0
  251. ngsolve/eigenvalues.pyi +30 -0
  252. ngsolve/fem.pyi +1647 -0
  253. ngsolve/internal.py +89 -0
  254. ngsolve/krylovspace.py +1013 -0
  255. ngsolve/krylovspace.pyi +298 -0
  256. ngsolve/la.pyi +1230 -0
  257. ngsolve/meshes.py +748 -0
  258. ngsolve/ngs2petsc.py +310 -0
  259. ngsolve/ngscxx.py +42 -0
  260. ngsolve/ngslib.so +0 -0
  261. ngsolve/ngstd.pyi +59 -0
  262. ngsolve/nonlinearsolvers.py +203 -0
  263. ngsolve/nonlinearsolvers.pyi +95 -0
  264. ngsolve/preconditioners.py +11 -0
  265. ngsolve/preconditioners.pyi +7 -0
  266. ngsolve/solve.pyi +109 -0
  267. ngsolve/solve_implementation.py +168 -0
  268. ngsolve/solve_implementation.pyi +42 -0
  269. ngsolve/solvers.py +7 -0
  270. ngsolve/solvers.pyi +14 -0
  271. ngsolve/timestepping.py +185 -0
  272. ngsolve/timestepping.pyi +28 -0
  273. ngsolve/timing.py +108 -0
  274. ngsolve/timing.pyi +54 -0
  275. ngsolve/utils.py +167 -0
  276. ngsolve/utils.pyi +273 -0
  277. ngsolve/webgui.py +670 -0
  278. ngsolve-6.2.2506.post74.dev0.data/data/Netgen.icns +0 -0
  279. ngsolve-6.2.2506.post74.dev0.data/data/bin/ngscxx +17 -0
  280. ngsolve-6.2.2506.post74.dev0.data/data/bin/ngsld +13 -0
  281. ngsolve-6.2.2506.post74.dev0.data/data/bin/ngsolve.tcl +648 -0
  282. ngsolve-6.2.2506.post74.dev0.data/data/bin/ngspy +2 -0
  283. ngsolve-6.2.2506.post74.dev0.data/data/share/ngsolve/beam.geo +17 -0
  284. ngsolve-6.2.2506.post74.dev0.data/data/share/ngsolve/beam.vol +240 -0
  285. ngsolve-6.2.2506.post74.dev0.data/data/share/ngsolve/chip.in2d +41 -0
  286. ngsolve-6.2.2506.post74.dev0.data/data/share/ngsolve/chip.vol +614 -0
  287. ngsolve-6.2.2506.post74.dev0.data/data/share/ngsolve/coil.geo +12 -0
  288. ngsolve-6.2.2506.post74.dev0.data/data/share/ngsolve/coil.vol +2560 -0
  289. ngsolve-6.2.2506.post74.dev0.data/data/share/ngsolve/coilshield.geo +24 -0
  290. ngsolve-6.2.2506.post74.dev0.data/data/share/ngsolve/coilshield.vol +3179 -0
  291. ngsolve-6.2.2506.post74.dev0.data/data/share/ngsolve/cube.geo +19 -0
  292. ngsolve-6.2.2506.post74.dev0.data/data/share/ngsolve/cube.vol +1832 -0
  293. ngsolve-6.2.2506.post74.dev0.data/data/share/ngsolve/d10_DGdoubleglazing.pde +50 -0
  294. ngsolve-6.2.2506.post74.dev0.data/data/share/ngsolve/d11_chip_nitsche.pde +40 -0
  295. ngsolve-6.2.2506.post74.dev0.data/data/share/ngsolve/d1_square.pde +43 -0
  296. ngsolve-6.2.2506.post74.dev0.data/data/share/ngsolve/d2_chip.pde +35 -0
  297. ngsolve-6.2.2506.post74.dev0.data/data/share/ngsolve/d3_helmholtz.pde +22 -0
  298. ngsolve-6.2.2506.post74.dev0.data/data/share/ngsolve/d4_cube.pde +46 -0
  299. ngsolve-6.2.2506.post74.dev0.data/data/share/ngsolve/d5_beam.pde +74 -0
  300. ngsolve-6.2.2506.post74.dev0.data/data/share/ngsolve/d6_shaft.pde +73 -0
  301. ngsolve-6.2.2506.post74.dev0.data/data/share/ngsolve/d7_coil.pde +50 -0
  302. ngsolve-6.2.2506.post74.dev0.data/data/share/ngsolve/d8_coilshield.pde +49 -0
  303. ngsolve-6.2.2506.post74.dev0.data/data/share/ngsolve/d9_hybridDG.pde +72 -0
  304. ngsolve-6.2.2506.post74.dev0.data/data/share/ngsolve/doubleglazing.in2d +27 -0
  305. ngsolve-6.2.2506.post74.dev0.data/data/share/ngsolve/doubleglazing.vol +737 -0
  306. ngsolve-6.2.2506.post74.dev0.data/data/share/ngsolve/piezo2d40round4.vol.gz +0 -0
  307. ngsolve-6.2.2506.post74.dev0.data/data/share/ngsolve/shaft.geo +73 -0
  308. ngsolve-6.2.2506.post74.dev0.data/data/share/ngsolve/shaft.vol +4291 -0
  309. ngsolve-6.2.2506.post74.dev0.data/data/share/ngsolve/square.in2d +17 -0
  310. ngsolve-6.2.2506.post74.dev0.data/data/share/ngsolve/square.vol +149 -0
  311. ngsolve-6.2.2506.post74.dev0.dist-info/METADATA +13 -0
  312. ngsolve-6.2.2506.post74.dev0.dist-info/RECORD +315 -0
  313. ngsolve-6.2.2506.post74.dev0.dist-info/WHEEL +5 -0
  314. ngsolve-6.2.2506.post74.dev0.dist-info/licenses/LICENSE +504 -0
  315. ngsolve-6.2.2506.post74.dev0.dist-info/top_level.txt +2 -0
@@ -0,0 +1,857 @@
1
+ #ifndef FILE_HCURLHDIV_DSHAPE
2
+ #define FILE_HCURLHDIV_DSHAPE
3
+
4
+
5
+ #include "finiteelement.hpp"
6
+ #include "diffop.hpp"
7
+
8
+ namespace ngfem
9
+ {
10
+
11
+ /** calculates [du1/dx1 du2/dx1 (du3/dx1) du1/dx2 du2/dx2 (du3/dx2) (du1/dx3 du2/dx3 du3/dx3)] */
12
+ template<typename FEL, int DIMSPACE, int DIM, int DIM_STRESS>
13
+ void CalcDShapeFE(const FEL & fel, const MappedIntegrationPoint<DIM,DIMSPACE>& mip,
14
+ BareSliceMatrix<> bmatu, LocalHeap& lh, double eps = 1e-4)
15
+ {
16
+ HeapReset hr(lh);
17
+ // bmatu = 0;
18
+ // evaluate dshape by numerical diff
19
+ //fel, eltrans, mip, returnval, lh
20
+ int nd_u = fel.GetNDof();
21
+ const IntegrationPoint& ip = mip.IP();//volume_ir[i];
22
+ const ElementTransformation & eltrans = mip.GetTransformation();
23
+ FlatMatrixFixWidth<DIM_STRESS> shape_ul(nd_u, lh);
24
+ FlatMatrixFixWidth<DIM_STRESS> shape_ur(nd_u, lh);
25
+ FlatMatrixFixWidth<DIM_STRESS> shape_ull(nd_u, lh);
26
+ FlatMatrixFixWidth<DIM_STRESS> shape_urr(nd_u, lh);
27
+ FlatMatrixFixWidth<DIM_STRESS> dshape_u_ref(nd_u, lh);//(shape_ur); ///saves "reserved lh-memory"
28
+
29
+ FlatMatrixFixWidth<DIM> dshape_u_ref_comp(nd_u, lh);
30
+ FlatMatrixFixWidth<DIMSPACE> dshape_u(nd_u, lh);//(shape_ul);///saves "reserved lh-memory"
31
+
32
+ for (int j = 0; j < DIM; j++) // d / dxj
33
+ {
34
+ IntegrationPoint ipl(ip);
35
+ ipl(j) -= eps;
36
+ IntegrationPoint ipr(ip);
37
+ ipr(j) += eps;
38
+ IntegrationPoint ipll(ip);
39
+ ipll(j) -= 2*eps;
40
+ IntegrationPoint iprr(ip);
41
+ iprr(j) += 2*eps;
42
+
43
+ MappedIntegrationPoint<DIM,DIMSPACE> mipl(ipl, eltrans);
44
+ MappedIntegrationPoint<DIM,DIMSPACE> mipr(ipr, eltrans);
45
+ MappedIntegrationPoint<DIM,DIMSPACE> mipll(ipll, eltrans);
46
+ MappedIntegrationPoint<DIM,DIMSPACE> miprr(iprr, eltrans);
47
+
48
+ fel.CalcMappedShape (mipl, shape_ul);
49
+ fel.CalcMappedShape (mipr, shape_ur);
50
+ fel.CalcMappedShape (mipll, shape_ull);
51
+ fel.CalcMappedShape (miprr, shape_urr);
52
+
53
+ dshape_u_ref = (1.0/(12.0*eps)) * (8.0*shape_ur-8.0*shape_ul-shape_urr+shape_ull);
54
+ for (int l = 0; l < DIM_STRESS; l++)
55
+ bmatu.Col(j*DIM_STRESS+l) = dshape_u_ref.Col(l);
56
+ }
57
+
58
+ for (int j = 0; j < DIM_STRESS; j++)
59
+ {
60
+ for (int k = 0; k < nd_u; k++)
61
+ for (int l = 0; l < DIM; l++)
62
+ dshape_u_ref_comp(k,l) = bmatu(k, l*DIM_STRESS+j);
63
+
64
+ dshape_u = dshape_u_ref_comp * mip.GetJacobianInverse();
65
+
66
+ for (int k = 0; k < nd_u; k++)
67
+ for (int l = 0; l < DIMSPACE; l++)
68
+ bmatu(k, l*DIM_STRESS+j) = dshape_u(k,l);
69
+ }
70
+ }
71
+
72
+
73
+ template<typename FEL, int DIMSPACE, int DIM, int DIM_STRESS, class TVX, class TVY>
74
+ void ApplyDShapeFE(const FEL & fel, const MappedIntegrationPoint<DIM,DIMSPACE>& mip, const TVX & x, TVY & y, LocalHeap& lh, double eps = 1e-4)
75
+ {
76
+ const IntegrationPoint& ip = mip.IP();
77
+ const ElementTransformation & eltrans = mip.GetTransformation();
78
+ Mat<DIM_STRESS,1> shape_ul;
79
+ Mat<DIM_STRESS,1> shape_ur;
80
+ Mat<DIM_STRESS,1> shape_ull;
81
+ Mat<DIM_STRESS,1> shape_urr;
82
+ Mat<DIM_STRESS,1> dshape_u_ref;
83
+
84
+ Vec<DIM> dshape_u_ref_comp;
85
+ Vec<DIMSPACE> dshape_u;
86
+
87
+ for (int j = 0; j < DIM; j++) // d / dxj
88
+ {
89
+ IntegrationPoint ipl(ip);
90
+ ipl(j) -= eps;
91
+ IntegrationPoint ipr(ip);
92
+ ipr(j) += eps;
93
+ IntegrationPoint ipll(ip);
94
+ ipll(j) -= 2*eps;
95
+ IntegrationPoint iprr(ip);
96
+ iprr(j) += 2*eps;
97
+
98
+ MappedIntegrationPoint<DIM,DIMSPACE> mipl(ipl, eltrans);
99
+ MappedIntegrationPoint<DIM,DIMSPACE> mipr(ipr, eltrans);
100
+ MappedIntegrationPoint<DIM,DIMSPACE> mipll(ipll, eltrans);
101
+ MappedIntegrationPoint<DIM,DIMSPACE> miprr(iprr, eltrans);
102
+
103
+ fel.EvaluateMappedShape (mipl, x, shape_ul);
104
+ fel.EvaluateMappedShape (mipr, x, shape_ur);
105
+ fel.EvaluateMappedShape (mipll, x, shape_ull);
106
+ fel.EvaluateMappedShape (miprr, x, shape_urr);
107
+
108
+ dshape_u_ref = (1.0/(12.0*eps)) * (8.0*shape_ur-8.0*shape_ul-shape_urr+shape_ull);
109
+
110
+ for (int l = 0; l < DIM_STRESS; l++)
111
+ y(j*DIM_STRESS+l) = dshape_u_ref(l);
112
+ }
113
+
114
+ for (int j = 0; j < DIM_STRESS; j++)
115
+ {
116
+ for (int l = 0; l < DIM; l++)
117
+ dshape_u_ref_comp(l) = y(l*DIM_STRESS+j);
118
+
119
+ dshape_u = Trans(mip.GetJacobianInverse()) * dshape_u_ref_comp;
120
+
121
+ for (int l = 0; l < DIMSPACE; l++)
122
+ y(l*DIM_STRESS+j) = dshape_u(l);
123
+ }
124
+ }
125
+
126
+ template<typename FEL, int DIMSPACE, int DIM, int DIM_STRESS, class TVX, class TVY>
127
+ void ApplyTransDShapeFE(const FEL & fel_u, const MappedIntegrationPoint<DIM,DIMSPACE>& mip, const TVX & x, TVY & by, LocalHeap & lh, double eps = 1e-4)
128
+ {
129
+ typedef typename TVX::TSCAL TSCALX;
130
+
131
+ HeapReset hr(lh);
132
+ int nd_u = fel_u.GetNDof();
133
+ FlatMatrixFixWidth<DIM_STRESS*DIMSPACE> bmatu(nd_u,lh);
134
+
135
+ auto y = by.Range(0, nd_u);
136
+ const IntegrationPoint& ip = mip.IP();
137
+ const ElementTransformation & eltrans = mip.GetTransformation();
138
+ FlatMatrixFixWidth<DIM_STRESS> shape_ul(nd_u, lh);
139
+ FlatMatrixFixWidth<DIM_STRESS> shape_ur(nd_u, lh);
140
+ FlatMatrixFixWidth<DIM_STRESS> shape_ull(nd_u, lh);
141
+ FlatMatrixFixWidth<DIM_STRESS> shape_urr(nd_u, lh);
142
+ FlatMatrixFixWidth<DIM_STRESS> dshape_u_ref(nd_u, lh);
143
+ FlatMatrixFixWidth<DIM_STRESS> dshape_u(nd_u, lh);
144
+
145
+ FlatMatrix<TSCALX> hx(DIMSPACE,DIM_STRESS,&x(0));
146
+ Mat<DIM,DIM_STRESS,TSCALX> tx = mip.GetJacobianInverse() * hx;
147
+
148
+ y = 0;
149
+ for (int j = 0; j < DIM; j++) // d / dxj
150
+ {
151
+ IntegrationPoint ipts[4];
152
+
153
+ ipts[0] = ip;
154
+ ipts[0](j) -= eps;
155
+ ipts[1] = ip;
156
+ ipts[1](j) += eps;
157
+ ipts[2] = ip;
158
+ ipts[2](j) -= 2*eps;
159
+ ipts[3] = ip;
160
+ ipts[3](j) += 2*eps;
161
+
162
+ IntegrationRule ir(4, ipts);
163
+ MappedIntegrationRule<DIM,DIMSPACE> mirl(ir, eltrans, lh);
164
+
165
+ fel_u.CalcMappedShape (mirl[0], shape_ul);
166
+ fel_u.CalcMappedShape (mirl[1], shape_ur);
167
+ fel_u.CalcMappedShape (mirl[2], shape_ull);
168
+ fel_u.CalcMappedShape (mirl[3], shape_urr);
169
+
170
+ dshape_u_ref = (1.0/(12.0*eps)) * (8.0*shape_ur-8.0*shape_ul-shape_urr+shape_ull);
171
+ y += dshape_u_ref * tx.Row(j);
172
+ }
173
+ }
174
+
175
+
176
+
177
+ template<typename FEL, int DIMSPACE, int DIM, int DIM_STRESS>
178
+ void CalcSIMDDShapeFE(const FEL & fel, const SIMD_MappedIntegrationRule<DIM,DIMSPACE>& mir, BareSliceMatrix<SIMD<double>> mat, double eps = 1e-4)
179
+ {
180
+ size_t nd_u = fel.GetNDof();
181
+
182
+ STACK_ARRAY(SIMD<double>, mem1, 2*DIM_STRESS*nd_u);
183
+ FlatMatrix<SIMD<double>> shape_u_tmp(nd_u*DIM_STRESS, 1, &mem1[0]);
184
+
185
+ FlatMatrix<SIMD<double>> dshape_u_ref(nd_u*DIM_STRESS, 1, &mem1[DIM_STRESS*nd_u]);
186
+
187
+ LocalHeapMem<10000> lh("diffopgrad-lh");
188
+
189
+ auto & ir = mir.IR();
190
+ for (size_t i = 0; i < mir.Size(); i++)
191
+ {
192
+ const SIMD<IntegrationPoint> & ip = ir[i];
193
+ const ElementTransformation & eltrans = mir[i].GetTransformation();
194
+
195
+ for (int j = 0; j < DIM; j++) // d / dxj
196
+ {
197
+ HeapReset hr(lh);
198
+ SIMD<IntegrationPoint> ipts[4];
199
+ ipts[0] = ip;
200
+ ipts[0](j) -= eps;
201
+ ipts[1] = ip;
202
+ ipts[1](j) += eps;
203
+ ipts[2] = ip;
204
+ ipts[2](j) -= 2*eps;
205
+ ipts[3] = ip;
206
+ ipts[3](j) += 2*eps;
207
+
208
+ SIMD_IntegrationRule ir(4, ipts);
209
+ SIMD_MappedIntegrationRule<DIM,DIMSPACE> mirl(ir, eltrans, lh);
210
+
211
+ fel.CalcMappedShape (mirl[2], shape_u_tmp);
212
+ dshape_u_ref = 1.0/(12.0*eps) * shape_u_tmp;
213
+ fel.CalcMappedShape (mirl[3], shape_u_tmp);
214
+ dshape_u_ref -= 1.0/(12.0*eps) * shape_u_tmp;
215
+ fel.CalcMappedShape (mirl[0], shape_u_tmp);
216
+ dshape_u_ref -= 8.0/(12.0*eps) * shape_u_tmp;
217
+ fel.CalcMappedShape (mirl[1], shape_u_tmp);
218
+ dshape_u_ref += 8.0/(12.0*eps) * shape_u_tmp;
219
+
220
+ // dshape_u_ref = (8.0*shape_ur-8.0*shape_ul-shape_urr+shape_ull);
221
+ for (size_t l = 0; l < DIM_STRESS; l++)
222
+ for (size_t k = 0; k < nd_u; k++)
223
+ mat(k*DIM_STRESS*DIM+j*DIM_STRESS+l, i) = dshape_u_ref(k*DIM_STRESS+l, 0);
224
+ }
225
+
226
+ for (size_t j = 0; j < DIM_STRESS; j++)
227
+ for (size_t k = 0; k < nd_u; k++)
228
+ {
229
+ Vec<DIM,SIMD<double>> dshape_u_ref, dshape_u;
230
+ for (size_t l = 0; l < DIM; l++)
231
+ dshape_u_ref(l) = mat(k*DIM_STRESS*DIM+l*DIM+j, i);
232
+
233
+ dshape_u = Trans(mir[i].GetJacobianInverse()) * dshape_u_ref;
234
+
235
+ for (size_t l = 0; l < DIMSPACE; l++)
236
+ mat(k*DIM_STRESS*DIMSPACE+l*DIM_STRESS+j, i) = dshape_u(l);
237
+ }
238
+ }
239
+ }
240
+
241
+ template<typename FEL, int DIMSPACE, int DIM, int DIM_STRESS>
242
+ void ApplySIMDDShapeFE (const FEL & fel_u, const SIMD_BaseMappedIntegrationRule & bmir,
243
+ BareSliceVector<double> x, BareSliceMatrix<SIMD<double>> y, double eps = 1e-4)
244
+ {
245
+ constexpr size_t BS = 64; // number of simd-points
246
+ size_t maxnp = min2(BS, bmir.Size());
247
+ size_t size = (maxnp+1)*SIMD<double>::Size()*500 + 5*DIM_STRESS*BS*sizeof(SIMD<double>);
248
+ STACK_ARRAY(char, data, size);
249
+ LocalHeap lh(data, size);
250
+
251
+ auto & mir = static_cast<const SIMD_MappedIntegrationRule<DIM,DIMSPACE>&> (bmir);
252
+ auto & ir = mir.IR();
253
+ const ElementTransformation & trafo = mir.GetTransformation();
254
+
255
+ for (int k = 0; k < mir.Size(); k++)
256
+ for (int m = 0; m < DIM_STRESS*DIMSPACE; m++)
257
+ y(m, k) = SIMD<double> (0.0);
258
+
259
+ for (size_t base = 0; base < ir.Size(); base += BS)
260
+ {
261
+ HeapReset hr(lh);
262
+ size_t num = min2(BS, ir.Size()-base);
263
+
264
+ FlatMatrix<SIMD<double>> hxl(DIM_STRESS, num, lh);
265
+ FlatMatrix<SIMD<double>> hxr(DIM_STRESS, num, lh);
266
+ FlatMatrix<SIMD<double>> hxll(DIM_STRESS, num, lh);
267
+ FlatMatrix<SIMD<double>> hxrr(DIM_STRESS, num, lh);
268
+ FlatMatrix<SIMD<double>> hx(DIM_STRESS, num, lh);
269
+
270
+ for (int j = 0; j < DIM; j++)
271
+ {
272
+ // hx = (F^-1 * x).Row(j)
273
+ {
274
+ HeapReset hr(lh);
275
+ SIMD_IntegrationRule irl(num*SIMD<double>::Size(), lh);
276
+ for (int k = 0; k < irl.Size(); k++)
277
+ {
278
+ irl[k] = ir[base+k];
279
+ irl[k](j) -= eps;
280
+ }
281
+ SIMD_MappedIntegrationRule<DIM,DIMSPACE> mirl(irl, trafo, lh);
282
+ fel_u.Evaluate (mirl, x, hxl);
283
+ }
284
+ {
285
+ HeapReset hr(lh);
286
+ SIMD_IntegrationRule irr(num*SIMD<double>::Size(), lh);
287
+ for (int k = 0; k < irr.Size(); k++)
288
+ {
289
+ irr[k] = ir[base+k];
290
+ irr[k](j) += eps;
291
+ }
292
+ SIMD_MappedIntegrationRule<DIM,DIMSPACE> mirr(irr, trafo, lh);
293
+ fel_u.Evaluate (mirr, x, hxr);
294
+ }
295
+ {
296
+ HeapReset hr(lh);
297
+ SIMD_IntegrationRule irll(num*SIMD<double>::Size(), lh);
298
+ for (int k = 0; k < irll.Size(); k++)
299
+ {
300
+ irll[k] = ir[base+k];
301
+ irll[k](j) -= 2*eps;
302
+ }
303
+ SIMD_MappedIntegrationRule<DIM,DIMSPACE> mirll(irll, trafo, lh);
304
+ fel_u.Evaluate (mirll, x, hxll);
305
+ }
306
+ {
307
+ HeapReset hr(lh);
308
+ SIMD_IntegrationRule irrr(num*SIMD<double>::Size(), lh);
309
+ for (int k = 0; k < irrr.Size(); k++)
310
+ {
311
+ irrr[k] = ir[base+k];
312
+ irrr[k](j) += 2*eps;
313
+ }
314
+ SIMD_MappedIntegrationRule<DIM,DIMSPACE> mirrr(irrr, trafo, lh);
315
+ fel_u.Evaluate (mirrr, x, hxrr);
316
+ }
317
+ // hx = 1.0/(2*eps) * (hxr-hxl);
318
+ hx = 1.0/(12*eps) * (8*hxr-8*hxl-hxrr+hxll);
319
+ for (int k = 0; k < num; k++)
320
+ {
321
+ auto jacinv = mir[base+k].GetJacobianInverse();
322
+ for (int l = 0; l < DIM_STRESS; l++)
323
+ {
324
+ for (int m = 0; m < DIMSPACE; m++)
325
+ y(m*DIM_STRESS+l, base+k) += jacinv(j,m) * hx(l, k);
326
+ }
327
+ }
328
+ }
329
+ }
330
+ }
331
+
332
+
333
+
334
+
335
+ template<typename FEL, int DIMSPACE, int DIM, int DIM_STRESS>
336
+ void AddTransSIMDDShapeFE (const FEL & fel_u, const SIMD_BaseMappedIntegrationRule & bmir,
337
+ BareSliceMatrix<SIMD<double>> x, BareSliceVector<double> y, double eps = 1e-4)
338
+ {
339
+ constexpr size_t BS = 64; // number of simd-points
340
+ size_t maxnp = min2(BS, bmir.Size());
341
+ size_t size = (maxnp+1)*SIMD<double>::Size()*500;
342
+
343
+ STACK_ARRAY(char, data, size);
344
+ LocalHeap lh(data, size);
345
+
346
+ auto & mir = static_cast<const SIMD_MappedIntegrationRule<DIM,DIMSPACE>&> (bmir);
347
+ auto & ir = mir.IR();
348
+ const ElementTransformation & trafo = mir.GetTransformation();
349
+
350
+ for (size_t base = 0; base < ir.Size(); base += BS)
351
+ {
352
+ HeapReset hr(lh);
353
+ size_t num = min2(BS, ir.Size()-base);
354
+
355
+ FlatMatrix<SIMD<double>> hx1(DIM_STRESS, num, lh);
356
+ FlatMatrix<SIMD<double>> hx2(DIM_STRESS, num, lh);
357
+
358
+ for (size_t j = 0; j < DIM; j++)
359
+ {
360
+ // hx = (F^-1 * x).Row(j)
361
+ for (size_t k = 0; k < num; k++)
362
+ {
363
+ auto jacinv = mir[base+k].GetJacobianInverse();
364
+ for (int l = 0; l < DIM_STRESS; l++)
365
+ {
366
+ SIMD<double> sum = 0;
367
+ for (int m = 0; m < DIMSPACE; m++)
368
+ sum += jacinv(j,m) * x(m*DIM_STRESS+l, base+k);
369
+
370
+ hx1(l,k) = (-(8/(12*eps)) * sum).Data();
371
+ hx2(l,k) = ( (1/(12*eps)) * sum).Data();
372
+ }
373
+ }
374
+
375
+ {
376
+ HeapReset hr(lh);
377
+ SIMD_IntegrationRule irl(num*SIMD<double>::Size(), lh);
378
+ for (size_t k = 0; k < irl.Size(); k++)
379
+ {
380
+ irl[k] = ir[base+k];
381
+ irl[k](j) -= eps;
382
+ }
383
+ SIMD_MappedIntegrationRule<DIM,DIMSPACE> mirl(irl, trafo, lh);
384
+ fel_u.AddTrans (mirl, hx1, y);
385
+ irl.NothingToDelete();
386
+ }
387
+ {
388
+ HeapReset hr(lh);
389
+ hx1 *= -1;
390
+ SIMD_IntegrationRule irr(num*SIMD<double>::Size(), lh);
391
+ for (int k = 0; k < irr.Size(); k++)
392
+ {
393
+ irr[k] = ir[base+k];
394
+ irr[k](j) += eps;
395
+ }
396
+ SIMD_MappedIntegrationRule<DIM,DIMSPACE> mirr(irr, trafo, lh);
397
+ fel_u.AddTrans (mirr, hx1, y);
398
+ }
399
+ {
400
+ HeapReset hr(lh);
401
+ SIMD_IntegrationRule irl(num*SIMD<double>::Size(), lh);
402
+ for (int k = 0; k < irl.Size(); k++)
403
+ {
404
+ irl[k] = ir[base+k];
405
+ irl[k](j) -= 2*eps;
406
+ }
407
+ SIMD_MappedIntegrationRule<DIM,DIMSPACE> mirl(irl, trafo, lh);
408
+ fel_u.AddTrans (mirl, hx2, y);
409
+ }
410
+ {
411
+ HeapReset hr(lh);
412
+ hx2 *= -1;
413
+ SIMD_IntegrationRule irr(num*SIMD<double>::Size(), lh);
414
+ for (int k = 0; k < irr.Size(); k++)
415
+ {
416
+ irr[k] = ir[base+k];
417
+ irr[k](j) += 2*eps;
418
+ }
419
+ SIMD_MappedIntegrationRule<DIM,DIMSPACE> mirr(irr, trafo, lh);
420
+ fel_u.AddTrans (mirr, hx2, y);
421
+ }
422
+ }
423
+ }
424
+ }
425
+
426
+
427
+
428
+ template <typename ME, typename ORIG, typename FEL>
429
+ class NumDiffGradient : public DiffOp<ME>
430
+ {
431
+ typedef DiffOp<ME> BASE;
432
+ public:
433
+ static constexpr double eps() { return 1e-4; }
434
+
435
+ static constexpr int DIM = ORIG::DIM;
436
+ static constexpr int DIM_SPACE = ORIG::DIM_SPACE;
437
+ static constexpr int DIM_ELEMENT = ORIG::DIM_ELEMENT;
438
+ static constexpr int DIM_DMAT = ORIG::DIM_DMAT*ORIG::DIM_SPACE;
439
+ static constexpr int DIFFORDER = ORIG::DIFFORDER+1;
440
+
441
+
442
+ template <typename AFEL, typename SIP, typename MAT,
443
+ typename std::enable_if<!std::is_convertible<MAT,BareSliceMatrix<double,ColMajor>>::value, int>::type = 0>
444
+ static void GenerateMatrix (const AFEL & fel, const SIP & sip,
445
+ MAT & mat, LocalHeap & lh)
446
+ {
447
+ cout << "nicht gut" << endl;
448
+ cout << "type(fel) = " << typeid(fel).name() << ", sip = " << typeid(sip).name()
449
+ << ", mat = " << typeid(mat).name() << endl;
450
+ }
451
+
452
+
453
+ static int DimRef() { return DIM_DMAT + ORIG::DIM_DMAT; } // grad(u), u
454
+
455
+ template <typename IP, typename MAT>
456
+ static void GenerateMatrixRef (const FiniteElement & fel, const IP & ip,
457
+ MAT && mat, LocalHeap & lh)
458
+ {
459
+ int nd_u = fel.GetNDof();
460
+
461
+ FlatMatrixFixWidth<ORIG::DIM_DMAT> shape_ul(nd_u, lh);
462
+ FlatMatrixFixWidth<ORIG::DIM_DMAT> shape_ur(nd_u, lh);
463
+ FlatMatrixFixWidth<ORIG::DIM_DMAT> shape_ull(nd_u, lh);
464
+ FlatMatrixFixWidth<ORIG::DIM_DMAT> shape_urr(nd_u, lh);
465
+ FlatMatrixFixWidth<ORIG::DIM_DMAT> dshape_u_ref(nd_u, lh);
466
+
467
+ FlatMatrixFixWidth<DIM_ELEMENT> dshape_u_ref_comp(nd_u, lh);
468
+ FlatMatrixFixWidth<DIM_SPACE> dshape_u(nd_u, lh);
469
+
470
+ for (int j = 0; j < DIM_ELEMENT; j++) // d / dxj
471
+ {
472
+ IntegrationPoint ipl(ip);
473
+ ipl(j) -= eps();
474
+ IntegrationPoint ipr(ip);
475
+ ipr(j) += eps();
476
+ IntegrationPoint ipll(ip);
477
+ ipll(j) -= 2*eps();
478
+ IntegrationPoint iprr(ip);
479
+ iprr(j) += 2*eps();
480
+
481
+
482
+ ORIG::GenerateMatrixRef (fel, ipl, Trans(shape_ul), lh);
483
+ ORIG::GenerateMatrixRef (fel, ipr, Trans(shape_ur), lh);
484
+ ORIG::GenerateMatrixRef (fel, ipll, Trans(shape_ull), lh);
485
+ ORIG::GenerateMatrixRef (fel, iprr, Trans(shape_urr), lh);
486
+
487
+ dshape_u_ref = (1.0/(12.0*eps())) * (8.0*shape_ur-8.0*shape_ul-shape_urr+shape_ull);
488
+ for (int l = 0; l < ORIG::DIM_DMAT; l++)
489
+ mat.Row(j*ORIG::DIM_DMAT+l) = dshape_u_ref.Col(l);
490
+ }
491
+
492
+ ORIG::GenerateMatrixRef (fel, ip, mat.Rows(DIM_DMAT, DIM_DMAT+ORIG::DIM_DMAT), lh);
493
+ }
494
+
495
+
496
+
497
+ template <typename MIP, typename MAT>
498
+ static void CalcTransformationMatrix (const MIP & mip,
499
+ MAT & mat, LocalHeap & lh)
500
+ {
501
+ auto matgrad = Trans(static_cast<const MappedIntegrationPoint<DIM_SPACE,DIM_SPACE>&>(mip).GetJacobianInverse());
502
+ Mat<DIM_SPACE,DIM_SPACE> matshape;
503
+ ORIG::CalcTransformationMatrix (mip, matshape, lh);
504
+
505
+ // input: du0/dx0, du1/dx0, du2/dx0, d0/dx1, ....
506
+ // output du0/dx0, du1/dx0, du2/dx0 ...
507
+ for (int i = 0; i < DIM_SPACE; i++)
508
+ for (int j = 0; j < DIM_SPACE; j++)
509
+ for (int k = 0; k < DIM_SPACE; k++)
510
+ for (int l = 0; l < DIM_SPACE; l++)
511
+ mat(k*DIM_SPACE+i, l*DIM_SPACE+j) = matshape(i,j) * matgrad(k,l);
512
+
513
+
514
+ // numerical diff of ORIG::CalcTransformationMatrix (mip, matshape, lh);
515
+
516
+ for (int i = 0; i < DIM_SPACE; i++)
517
+ for (int j = 0; j < DIM_SPACE; j++)
518
+ for (int k = 0; k < DIM_SPACE; k++)
519
+ mat(k*DIM_SPACE+i, DIM_SPACE*DIM_SPACE+j) = 0.0;
520
+
521
+ Mat<DIM_SPACE,DIM_SPACE> dmatshape_dxj;
522
+ const IntegrationPoint& ip = mip.IP();
523
+ const ElementTransformation & eltrans = mip.GetTransformation();
524
+ for (int j = 0; j < DIM_ELEMENT; j++) // d / dxj
525
+ {
526
+ IntegrationPoint ipl(ip);
527
+ ipl(j) -= eps();
528
+ IntegrationPoint ipr(ip);
529
+ ipr(j) += eps();
530
+ IntegrationPoint ipll(ip);
531
+ ipll(j) -= 2*eps();
532
+ IntegrationPoint iprr(ip);
533
+ iprr(j) += 2*eps();
534
+
535
+ MappedIntegrationPoint<DIM_ELEMENT,DIM_SPACE> mipl(ipl, eltrans);
536
+ MappedIntegrationPoint<DIM_ELEMENT,DIM_SPACE> mipr(ipr, eltrans);
537
+ MappedIntegrationPoint<DIM_ELEMENT,DIM_SPACE> mipll(ipll, eltrans);
538
+ MappedIntegrationPoint<DIM_ELEMENT,DIM_SPACE> miprr(iprr, eltrans);
539
+
540
+ Mat<DIM_SPACE,DIM_SPACE> dml, dmll, dmr, dmrr;
541
+ ORIG::CalcTransformationMatrix (mipl, dml, lh);
542
+ ORIG::CalcTransformationMatrix (mipr, dmr, lh);
543
+ ORIG::CalcTransformationMatrix (mipll, dmll, lh);
544
+ ORIG::CalcTransformationMatrix (miprr, dmrr, lh);
545
+
546
+ dmatshape_dxj = (1.0/(12.0*eps())) * (8.0*dmr-8.0*dml-dmrr+dmll);
547
+
548
+ for (int i = 0; i < DIM_SPACE; i++)
549
+ for (int l = 0; l < DIM_SPACE; l++)
550
+ for (int k = 0; k < DIM_SPACE; k++)
551
+ mat(k*DIM_SPACE+i, DIM_SPACE*DIM_SPACE+l) += matgrad(k,j) * dmatshape_dxj(i,l);
552
+ }
553
+
554
+
555
+ }
556
+
557
+
558
+
559
+
560
+ template <typename AFEL, typename MIP, typename MAT,
561
+ typename std::enable_if<std::is_convertible<MAT,BareSliceMatrix<double,ColMajor>>::value, int>::type = 0>
562
+ static void GenerateMatrix (const AFEL & bfel, const MIP & mip,
563
+ MAT mat, LocalHeap & lh)
564
+ {
565
+ // CalcDShapeFE<FEL,DIM_SPACE,DIM_ELEMENT,ORIG::DIM_DMAT>
566
+ // (static_cast<const FEL&>(fel), mip, Trans(mat), lh, eps());
567
+
568
+ HeapReset hr(lh);
569
+
570
+ int nd_u = bfel.GetNDof();
571
+ const IntegrationPoint& ip = mip.IP();
572
+ const ElementTransformation & eltrans = mip.GetTransformation();
573
+ FlatMatrixFixWidth<ORIG::DIM_DMAT> shape_ul(nd_u, lh);
574
+ FlatMatrixFixWidth<ORIG::DIM_DMAT> shape_ur(nd_u, lh);
575
+ FlatMatrixFixWidth<ORIG::DIM_DMAT> shape_ull(nd_u, lh);
576
+ FlatMatrixFixWidth<ORIG::DIM_DMAT> shape_urr(nd_u, lh);
577
+ FlatMatrixFixWidth<ORIG::DIM_DMAT> dshape_u_ref(nd_u, lh);
578
+
579
+ FlatMatrixFixWidth<DIM_ELEMENT> dshape_u_ref_comp(nd_u, lh);
580
+ FlatMatrixFixWidth<DIM_SPACE> dshape_u(nd_u, lh);
581
+
582
+ for (int j = 0; j < DIM_ELEMENT; j++) // d / dxj
583
+ {
584
+ IntegrationPoint ipl(ip);
585
+ ipl(j) -= eps();
586
+ IntegrationPoint ipr(ip);
587
+ ipr(j) += eps();
588
+ IntegrationPoint ipll(ip);
589
+ ipll(j) -= 2*eps();
590
+ IntegrationPoint iprr(ip);
591
+ iprr(j) += 2*eps();
592
+
593
+ MappedIntegrationPoint<DIM_ELEMENT,DIM_SPACE> mipl(ipl, eltrans);
594
+ MappedIntegrationPoint<DIM_ELEMENT,DIM_SPACE> mipr(ipr, eltrans);
595
+ MappedIntegrationPoint<DIM_ELEMENT,DIM_SPACE> mipll(ipll, eltrans);
596
+ MappedIntegrationPoint<DIM_ELEMENT,DIM_SPACE> miprr(iprr, eltrans);
597
+
598
+ ORIG::GenerateMatrix (bfel, mipl, Trans(shape_ul), lh);
599
+ ORIG::GenerateMatrix (bfel, mipr, Trans(shape_ur), lh);
600
+ ORIG::GenerateMatrix (bfel, mipll, Trans(shape_ull), lh);
601
+ ORIG::GenerateMatrix (bfel, miprr, Trans(shape_urr), lh);
602
+
603
+ dshape_u_ref = (1.0/(12.0*eps())) * (8.0*shape_ur-8.0*shape_ul-shape_urr+shape_ull);
604
+ for (int l = 0; l < ORIG::DIM_DMAT; l++)
605
+ mat.Row(j*ORIG::DIM_DMAT+l) = dshape_u_ref.Col(l);
606
+ }
607
+
608
+ for (int j = 0; j < ORIG::DIM_DMAT; j++)
609
+ {
610
+ for (int k = 0; k < nd_u; k++)
611
+ for (int l = 0; l < DIM_ELEMENT; l++)
612
+ dshape_u_ref_comp(k,l) = mat(l*ORIG::DIM_DMAT+j, k);
613
+
614
+ dshape_u = dshape_u_ref_comp * mip.GetJacobianInverse();
615
+
616
+ for (int k = 0; k < nd_u; k++)
617
+ for (int l = 0; l < DIM_SPACE; l++)
618
+ mat(l*ORIG::DIM_DMAT+j, k) = dshape_u(k,l);
619
+ }
620
+ }
621
+
622
+
623
+
624
+ /*
625
+ template <typename AFEL, typename MIP, typename MAT,
626
+ typename std::enable_if<std::is_convertible<MAT,SliceMatrix<double,ColMajor>>::value, int>::type = 0>
627
+ static void GenerateMatrix (const AFEL & fel, const MIP & mip,
628
+ MAT mat, LocalHeap & lh)
629
+ {
630
+ CalcDShapeFE<FEL,DIM_SPACE,DIM_ELEMENT,ORIG::DIM_DMAT>
631
+ (static_cast<const FEL&>(fel), mip, Trans(mat), lh, eps());
632
+ }
633
+
634
+ template <typename AFEL, typename MIP, class TVX, class TVY>
635
+ static void Apply (const AFEL & fel, const MIP & mip,
636
+ const TVX & x, TVY && y,
637
+ LocalHeap & lh)
638
+ {
639
+ HeapReset hr(lh);
640
+ FlatMatrixFixWidth<DIM_SPACE*ORIG::DIM_DMAT> hm(fel.GetNDof(),lh);
641
+ CalcDShapeFE<FEL,DIM_SPACE,DIM_ELEMENT,ORIG::DIM_DMAT>
642
+ (static_cast<const FEL&>(fel), mip, hm, lh, eps());
643
+ y = Trans(hm)*x;
644
+ }
645
+
646
+ template <typename AFEL, typename MIP, class TVX, class TVY>
647
+ static void ApplyTrans (const AFEL & fel, const MIP & mip,
648
+ const TVX & x, TVY & by,
649
+ LocalHeap & lh)
650
+ {
651
+ ApplyTransDShapeFE<FEL,DIM_SPACE,DIM_ELEMENT,ORIG::DIM_DMAT>
652
+ (static_cast<const FEL&>(fel), mip, x, by, lh, eps());
653
+ }
654
+ */
655
+
656
+
657
+ static void GenerateMatrixSIMDIR (const FiniteElement & bfel,
658
+ const SIMD_BaseMappedIntegrationRule & bmir, BareSliceMatrix<SIMD<double>> mat)
659
+ {
660
+ /*
661
+ CalcSIMDDShapeFE<FEL,DIM_SPACE,DIM_ELEMENT,ORIG::DIM_DMAT>
662
+ (static_cast<const FEL&>(bfel), static_cast<const SIMD_MappedIntegrationRule<DIM_ELEMENT,DIM_SPACE> &>(bmir), mat, eps());
663
+ return;
664
+ */
665
+
666
+ auto & mir = static_cast<const SIMD_MappedIntegrationRule<DIM_ELEMENT,DIM_SPACE>&> (bmir);
667
+ // auto & fel_u = static_cast<const FEL&>(bfel);
668
+ size_t nd_u = bfel.GetNDof();
669
+
670
+ STACK_ARRAY(SIMD<double>, mem1, 5*ORIG::DIM_DMAT*nd_u);
671
+ FlatMatrix<SIMD<double>> shape_u_tmp(nd_u*ORIG::DIM_DMAT, 4, &mem1[0]);
672
+ FlatMatrix<SIMD<double>> dshape_u_ref(nd_u*ORIG::DIM_DMAT, 1, &mem1[4*ORIG::DIM_DMAT*nd_u]);
673
+
674
+ LocalHeapMem<10000> lh("diffopgrad-lh");
675
+
676
+ auto & ir = mir.IR();
677
+ for (size_t i = 0; i < mir.Size(); i++)
678
+ {
679
+ const SIMD<IntegrationPoint> & ip = ir[i];
680
+ const ElementTransformation & eltrans = mir[i].GetTransformation();
681
+
682
+ double dist[] = { 1, -1, 2, -2 };
683
+ double weight[] = { 8/12., -8/12., -1/12., 1/12. };
684
+
685
+ for (int j = 0; j < DIM_ELEMENT; j++) // d / dxj
686
+ {
687
+ HeapReset hr(lh);
688
+ SIMD<IntegrationPoint> ipts[4];
689
+ for (int i = 0; i < 4; i++)
690
+ {
691
+ ipts[i] = ip;
692
+ ipts[i](j) += dist[i]*eps();
693
+ }
694
+ SIMD_IntegrationRule ir(4, ipts);
695
+ SIMD_MappedIntegrationRule<DIM_ELEMENT,DIM_SPACE> mirl(ir, eltrans, lh);
696
+ ORIG::GenerateMatrixSIMDIR (bfel, mirl, shape_u_tmp);
697
+
698
+ dshape_u_ref.Col(0) =
699
+ weight[0]/eps() * shape_u_tmp.Col(0) +
700
+ weight[1]/eps() * shape_u_tmp.Col(1) +
701
+ weight[2]/eps() * shape_u_tmp.Col(2) +
702
+ weight[3]/eps() * shape_u_tmp.Col(3);
703
+
704
+ for (size_t l = 0; l < ORIG::DIM_DMAT; l++)
705
+ for (size_t k = 0; k < nd_u; k++)
706
+ mat(k*ORIG::DIM_DMAT*DIM_ELEMENT+j*ORIG::DIM_DMAT+l, i) = dshape_u_ref(k*ORIG::DIM_DMAT+l, 0);
707
+ }
708
+
709
+ for (size_t j = 0; j < ORIG::DIM_DMAT; j++)
710
+ for (size_t k = 0; k < nd_u; k++)
711
+ {
712
+ Vec<DIM_ELEMENT,SIMD<double>> dshape_u_ref;
713
+ Vec<DIM_SPACE,SIMD<double>> dshape_u;
714
+
715
+ for (size_t l = 0; l < DIM_ELEMENT; l++)
716
+ dshape_u_ref(l) = mat(k*ORIG::DIM_DMAT*DIM_ELEMENT+l*DIM_ELEMENT+j, i);
717
+
718
+ dshape_u = Trans(mir[i].GetJacobianInverse()) * dshape_u_ref;
719
+
720
+ for (size_t l = 0; l < DIM_SPACE; l++)
721
+ mat(k*ORIG::DIM_DMAT*DIM_SPACE+l*ORIG::DIM_DMAT+j, i) = dshape_u(l);
722
+ }
723
+ }
724
+ }
725
+
726
+
727
+
728
+ using BASE::ApplySIMDIR;
729
+ static void ApplySIMDIR (const FiniteElement & fel, const SIMD_BaseMappedIntegrationRule & bmir,
730
+ BareSliceVector<double> x, BareSliceMatrix<SIMD<double>> y)
731
+ {
732
+ // ApplySIMDDShapeFE<FEL,ORIG::DIM_SPACE,ORIG::DIM_ELEMENT,ORIG::DIM_DMAT>(static_cast<const FEL&>(fel), bmir, x, y, eps());
733
+ // return;
734
+
735
+ constexpr size_t BS = 16; // number of simd-points
736
+ size_t maxnp = min2(BS, bmir.Size());
737
+ size_t size = (maxnp+1)*SIMD<double>::Size()*500 + 5*ORIG::DIM_DMAT*BS*sizeof(SIMD<double>);
738
+ size *= 4;
739
+ STACK_ARRAY(char, data, size);
740
+ LocalHeap lh(data, size);
741
+
742
+ auto & mir = static_cast<const SIMD_MappedIntegrationRule<DIM_ELEMENT,DIM_SPACE>&> (bmir);
743
+ auto & ir = mir.IR();
744
+ const ElementTransformation & trafo = mir.GetTransformation();
745
+
746
+ y.AddSize(ORIG::DIM_DMAT*DIM_SPACE, mir.Size()) = SIMD<double>(0.);
747
+ for (size_t base = 0; base < ir.Size(); base += BS)
748
+ {
749
+ HeapReset hr(lh);
750
+ size_t num = std::min(BS, ir.Size()-base);
751
+ FlatMatrix<SIMD<double>> hxi(ORIG::DIM_DMAT, 4*num, lh);
752
+
753
+ static constexpr double dist[] = { 1, -1, 2, -2 };
754
+ static constexpr double weight[] = { 8/12., -8/12., -1/12., 1/12. };
755
+
756
+ for (int j = 0; j < DIM_ELEMENT; j++)
757
+ {
758
+ HeapReset hr(lh);
759
+
760
+ SIMD_IntegrationRule iri(4*num*SIMD<double>::Size(), lh);
761
+
762
+ for (int k = 0; k < num; k++)
763
+ for (int i = 0; i < 4; i++)
764
+ {
765
+ iri[4*k+i] = ir[base+k];
766
+ iri[4*k+i](j) += dist[i]*eps();
767
+ }
768
+
769
+ SIMD_MappedIntegrationRule<DIM_ELEMENT,DIM_SPACE> mir2(iri, trafo, lh);
770
+ ORIG::ApplySIMDIR (fel, mir2, x, hxi);
771
+
772
+ for (int k = 0; k < num; k++)
773
+ {
774
+ Vec<ORIG::DIM_DMAT, SIMD<double>> hxk =
775
+ weight[0]/eps() * hxi.Col(4*k) +
776
+ weight[1]/eps() * hxi.Col(4*k+1) +
777
+ weight[2]/eps() * hxi.Col(4*k+2) +
778
+ weight[3]/eps() * hxi.Col(4*k+3);
779
+
780
+ auto jacinv = mir[base+k].GetJacobianInverse();
781
+ for (int l = 0; l < ORIG::DIM_DMAT; l++)
782
+ for (int m = 0; m < DIM_SPACE; m++)
783
+ y(m*ORIG::DIM_DMAT+l, base+k) += jacinv(j,m) * hxk(l); // , k);
784
+ }
785
+ }
786
+ }
787
+ }
788
+
789
+
790
+
791
+
792
+ using BASE::AddTransSIMDIR;
793
+ static void AddTransSIMDIR (const FiniteElement & fel, const SIMD_BaseMappedIntegrationRule & bmir,
794
+ BareSliceMatrix<SIMD<double>> x, BareSliceVector<double> y)
795
+ {
796
+ // AddTransSIMDDShapeFE<FEL,DIM_SPACE,DIM_ELEMENT,ORIG::DIM_DMAT>(static_cast<const FEL&>(fel), bmir, x, y, eps());
797
+ // return;
798
+
799
+ // auto & fel_u = static_cast<const FEL&>(fel);
800
+ constexpr size_t BS = 64; // number of simd-points
801
+ size_t maxnp = std::min(BS, bmir.Size());
802
+ size_t size = (maxnp+1)*SIMD<double>::Size()*500;
803
+
804
+ STACK_ARRAY(char, data, size);
805
+ LocalHeap lh(data, size);
806
+
807
+ auto & mir = static_cast<const SIMD_MappedIntegrationRule<DIM_ELEMENT,DIM_SPACE>&> (bmir);
808
+ auto & ir = mir.IR();
809
+ const ElementTransformation & trafo = mir.GetTransformation();
810
+
811
+ for (size_t base = 0; base < ir.Size(); base += BS)
812
+ {
813
+ HeapReset hr(lh);
814
+ size_t num = min2(BS, ir.Size()-base);
815
+
816
+ FlatMatrix<SIMD<double>> hx1(ORIG::DIM_DMAT, num, lh);
817
+ FlatMatrix<SIMD<double>> hx(ORIG::DIM_DMAT, num, lh);
818
+
819
+ for (size_t j = 0; j < DIM_ELEMENT; j++)
820
+ {
821
+ // hx = (F^-1 * x).Row(j)
822
+ for (size_t k = 0; k < num; k++)
823
+ {
824
+ auto jacinv = mir[base+k].GetJacobianInverse();
825
+ for (int l = 0; l < ORIG::DIM_DMAT; l++)
826
+ {
827
+ SIMD<double> sum = 0;
828
+ for (int m = 0; m < DIM_SPACE; m++)
829
+ sum += jacinv(j,m) * x(m*ORIG::DIM_DMAT+l, base+k);
830
+ hx(l,k) = sum;
831
+ }
832
+ }
833
+
834
+ double dist[] = { 1, -1, 2, -2 };
835
+ double weight[] = { 8/12., -8/12., -1/12., 1/12. };
836
+ for (int i = 0; i < 4; i++)
837
+ {
838
+ HeapReset hr(lh);
839
+ SIMD_IntegrationRule irl(num*SIMD<double>::Size(), lh);
840
+ for (size_t k = 0; k < irl.Size(); k++)
841
+ {
842
+ irl[k] = ir[base+k];
843
+ irl[k](j) += dist[i]*eps();
844
+ }
845
+ SIMD_MappedIntegrationRule<DIM_ELEMENT,DIM_SPACE> mirl(irl, trafo, lh);
846
+ hx1 = weight[i]/eps() * hx;
847
+ // fel_u.AddTrans (mirl, hx1, y);
848
+ ORIG::AddTransSIMDIR(fel, mirl, hx1, y);
849
+ irl.NothingToDelete();
850
+ }
851
+ }
852
+ }
853
+ }
854
+ };
855
+ }
856
+
857
+ #endif