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,762 @@
1
+ #ifndef KERNELS_hpp
2
+ #define KERNELS_hpp
3
+
4
+ #include "mptools.hpp"
5
+ #include <type_traits>
6
+
7
+
8
+ // **************************** The kernels **********************************
9
+
10
+ namespace ngsbem
11
+ {
12
+
13
+ struct KernelTerm
14
+ {
15
+ double fac;
16
+ size_t kernel_comp;
17
+ size_t trial_comp;
18
+ size_t test_comp;
19
+ };
20
+
21
+
22
+ class BaseKernel
23
+ {
24
+ public:
25
+ shared_ptr<SingularMLExpansion<Complex>> CreateMultipoleExpansion (Vec<3> c, double r) const
26
+ {
27
+ throw Exception("Create Multipole Expansion not implemented");
28
+ }
29
+
30
+ shared_ptr<RegularMLExpansion<Complex>> CreateLocalExpansion (Vec<3> c, double r) const
31
+ {
32
+ throw Exception("Create Local Expansion not implemented");
33
+ }
34
+
35
+ template <typename TV>
36
+ void AddSource (SingularMLExpansion<Complex> & mp, Vec<3> pnt, Vec<3> nv, const TV & val) const
37
+ {
38
+ throw Exception("Addsource not implemented");
39
+ }
40
+
41
+ template <typename entry, typename TV>
42
+ void AddSourceTrans(SingularMLExpansion<entry> & mp, Vec<3> pnt, Vec<3> nv, const TV & val) const
43
+ {
44
+ throw Exception("AddSourceTrans not implemented");
45
+ }
46
+
47
+ template <typename TV>
48
+ void EvaluateMP (RegularMLExpansion<Complex> & mp, Vec<3> pnt, Vec<3> nv, const TV & val) const
49
+ {
50
+ throw Exception("Evaluate not implemented");
51
+ }
52
+
53
+ template <typename entry, typename TV>
54
+ void EvaluateMPTrans(RegularMLExpansion<entry> & mp, Vec<3> pnt, Vec<3> nv, const TV & val) const
55
+ {
56
+ throw Exception("EvaluateMPTrans not implemented");
57
+ }
58
+ };
59
+
60
+
61
+
62
+
63
+
64
+ /** LaplaceSLkernel is the kernel for the single layer potential of
65
+ the Laplace equation $ \Delta u = 0 \,.$ */
66
+ template <int DIM, int COMPS=1> class LaplaceSLKernel;
67
+
68
+ /** LaplaceSLkernel in 3D reads
69
+ $$ G(x-y) = \frac{1}{4\,\pi \, | x-y| }, \quad x, y \in \mathbb R^3, \; x\not=y\,. $$ */
70
+ template<int COMPS>
71
+ class LaplaceSLKernel<3, COMPS> : public BaseKernel
72
+ {
73
+ public:
74
+ LaplaceSLKernel<3,COMPS>()
75
+ {
76
+ for (size_t i = 0; i < COMPS; i++)
77
+ terms += {1.0, 0, i, i};
78
+ };
79
+ typedef double value_type;
80
+ using mp_type = typename std::conditional<COMPS == 1,
81
+ Complex,
82
+ Vec<COMPS, Complex>>::type;
83
+
84
+ static string Name() { return "LaplaceSL"; }
85
+ static auto Shape() { return IVec<2>(COMPS,COMPS); }
86
+
87
+ template <typename T>
88
+ auto Evaluate (Vec<3,T> x, Vec<3,T> y, Vec<3,T> nx, Vec<3,T> ny) const
89
+ {
90
+ T norm = L2Norm(x-y);
91
+ // return 1.0 / (4 * M_PI * norm);
92
+ return Vec<1,T> (1.0 / (4 * M_PI * norm));
93
+ }
94
+
95
+ Array<KernelTerm> terms;
96
+
97
+ auto CreateMultipoleExpansion (Vec<3> c, double r, FMM_Parameters fmm_params) const
98
+ {
99
+ return make_shared<SingularMLExpansion<mp_type>> (c, r, 1e-16, fmm_params);
100
+ }
101
+
102
+ auto CreateLocalExpansion (Vec<3> c, double r, FMM_Parameters fmm_params) const
103
+ {
104
+ return make_shared<RegularMLExpansion<mp_type>> (c, r, 1e-16, fmm_params);
105
+ }
106
+
107
+ void AddSource (SingularMLExpansion<mp_type> & mp, Vec<3> pnt, Vec<3> nv, BareSliceVector<double> val) const
108
+ {
109
+ if constexpr (COMPS == 1)
110
+ mp.AddCharge (pnt, val(0));
111
+ else
112
+ mp.AddCharge (pnt, val);
113
+ }
114
+
115
+ void EvaluateMP (RegularMLExpansion<mp_type> & mp, Vec<3> pnt, Vec<3> nv, BareSliceVector<double> val) const
116
+ {
117
+ if constexpr (COMPS == 1)
118
+ val(0) = Real(mp.Evaluate (pnt));
119
+ else
120
+ val = Real(mp.Evaluate (pnt));
121
+ }
122
+ };
123
+
124
+
125
+ /** LaplaceDLkernel is the kernel for the double layer potential of
126
+ the Laplace equation $ \Delta u = 0 \,.$ */
127
+ template <int DIM, int COMPS=1> class LaplaceDLKernel;
128
+
129
+ /** LaplaceDLkernel in 3D reads
130
+ $$ \frac{\partial }{ \partial n_y} G(x-y) = \frac{1}{4\,\pi} \,
131
+ \frac{ \langle n(y), x-y\rangle }{ | x-y|^3 },
132
+ \quad x, y \in \mathbb R^3, \; x\not=y\,. $$ */
133
+ template<int COMPS>
134
+ class LaplaceDLKernel<3, COMPS> : public BaseKernel
135
+ {
136
+ public:
137
+ LaplaceDLKernel<3,COMPS>()
138
+ {
139
+ for (size_t i = 0; i < COMPS; i++)
140
+ terms += {1.0, 0, i, i};
141
+ };
142
+ typedef double value_type;
143
+ using mp_type = typename std::conditional<COMPS == 1,
144
+ Complex,
145
+ Vec<COMPS, Complex>>::type;
146
+ static string Name() { return "LaplaceDL"; }
147
+ static auto Shape() { return IVec<2>(COMPS,COMPS); }
148
+
149
+ template <typename T>
150
+ auto Evaluate (Vec<3,T> x, Vec<3,T> y, Vec<3,T> nx, Vec<3,T> ny) const
151
+ {
152
+ T norm = L2Norm(x-y);
153
+ T nxy = InnerProduct(ny, (x-y));
154
+ // return nxy / (4 * M_PI * norm*norm*norm);
155
+ return Vec<1,T> (nxy / (4 * M_PI * norm*norm*norm));
156
+ }
157
+
158
+ Array<KernelTerm> terms;
159
+
160
+ auto CreateMultipoleExpansion (Vec<3> c, double r, FMM_Parameters fmm_params) const
161
+ {
162
+ return make_shared<SingularMLExpansion<mp_type>> (c, r, 1e-16, fmm_params);
163
+ }
164
+
165
+ auto CreateLocalExpansion (Vec<3> c, double r, FMM_Parameters fmm_params) const
166
+ {
167
+ return make_shared<RegularMLExpansion<mp_type>> (c, r, 1e-16, fmm_params);
168
+ }
169
+
170
+ void AddSource (SingularMLExpansion<mp_type> & mp, Vec<3> pnt, Vec<3> nv, BareSliceVector<double> val) const
171
+ {
172
+ if constexpr (COMPS == 1)
173
+ mp.AddDipole(pnt, -nv, val(0));
174
+ else
175
+ mp.AddDipole(pnt, -nv, val);
176
+ }
177
+
178
+ void AddSourceTrans(SingularMLExpansion<mp_type> & mp, Vec<3> pnt, Vec<3> nv, BareSliceVector<double> val) const
179
+ {
180
+ if constexpr (COMPS == 1)
181
+ mp.AddCharge (pnt, val(0));
182
+ else
183
+ mp.AddCharge (pnt, val);
184
+ }
185
+
186
+ void EvaluateMP (RegularMLExpansion<mp_type> & mp, Vec<3> pnt, Vec<3> nv, BareSliceVector<double> val) const
187
+ {
188
+ if constexpr (COMPS == 1)
189
+ val(0) = Real(mp.Evaluate (pnt));
190
+ else
191
+ val = Real(mp.Evaluate (pnt));
192
+ }
193
+
194
+ void EvaluateMPTrans(RegularMLExpansion<mp_type> & mp, Vec<3> pnt, Vec<3> nv, BareSliceVector<double> val) const
195
+ {
196
+ if constexpr (COMPS == 1)
197
+ val(0) = Real(mp.EvaluateDirectionalDerivative(pnt, nv));
198
+ else
199
+ val = Real(mp.EvaluateDirectionalDerivative(pnt, nv));
200
+ }
201
+ };
202
+
203
+
204
+ /** HelmholtzSLkernel is the kernel for the double layer potential of the
205
+ Helmholtz equation $ -\Delta u - \kappa^2 u = 0, \; \kappa>0\,. $ */
206
+ template <int DIM> class HelmholtzSLKernel;
207
+
208
+ /** HelmholtzSLkernel in 3D reads
209
+ $$ G(x-y) = \frac{1 }{4\,\pi} \,\frac{e^{i\,\kappa \, |x-y| }{|x-y|} \,
210
+ \quad x, y \in \mathbb R^3, \; x\not=y\,. $$ */
211
+ template<>
212
+ class HelmholtzSLKernel<3> : public BaseKernel
213
+ {
214
+ double kappa;
215
+ public:
216
+ typedef Complex value_type;
217
+ static string Name() { return "HelmholtzSL"; }
218
+ static auto Shape() { return IVec<2>(1,1); }
219
+
220
+ /** Construction of the kernel specifies the wavenumber $\kappa$. */
221
+ HelmholtzSLKernel (double _kappa) : kappa(_kappa) { }
222
+
223
+ template <typename T>
224
+ auto Evaluate (Vec<3,T> x, Vec<3,T> y, Vec<3,T> nx, Vec<3,T> ny) const
225
+ {
226
+ T norm = L2Norm(x-y);
227
+ auto kern = exp(Complex(0,kappa)*norm) / (4 * M_PI * norm);
228
+ // return kern;
229
+ return Vec<1,decltype(kern)> (kern);
230
+ }
231
+ double GetKappa() const { return kappa; }
232
+ Array<KernelTerm> terms = { KernelTerm{1.0, 0, 0, 0}, };
233
+
234
+ auto CreateMultipoleExpansion (Vec<3> c, double r, FMM_Parameters fmm_params) const
235
+ {
236
+ return make_shared<SingularMLExpansion<Complex>> (c, r, kappa, fmm_params);
237
+ }
238
+
239
+ auto CreateLocalExpansion (Vec<3> c, double r, FMM_Parameters fmm_params) const
240
+ {
241
+ return make_shared<RegularMLExpansion<Complex>> (c, r, kappa, fmm_params);
242
+ }
243
+
244
+ void AddSource (SingularMLExpansion<Complex> & mp, Vec<3> pnt, Vec<3> nv, BareSliceVector<Complex> val) const
245
+ {
246
+ mp.AddCharge(pnt, val(0));
247
+ }
248
+
249
+ void EvaluateMP (RegularMLExpansion<Complex> & mp, Vec<3> pnt, Vec<3> nv, BareSliceVector<Complex> val) const
250
+ {
251
+ val(0) = mp.Evaluate (pnt);
252
+ }
253
+ };
254
+
255
+
256
+ /** HelmholtzDLkernel is the kernel for the double layer potential of
257
+ the Helmholtz equation $ -\Delta u - \kappa^2 u = 0, \; \kappa>0\,.$ */
258
+ template <int DIM> class HelmholtzDLKernel;
259
+
260
+ /** HelmholtzDLkernel in 3D reads
261
+ $$ \frac{\partial }{ \partial n_y} G(x-y) = \frac{1}{4\,\pi} \, \frac{e^{i\,\kappa\,|x-y|}}{|x-y|^3} \,
262
+ \langle n(y), x-y\rangle \cdot \left( 1 - i\,\kappa\, | x-y| \right),
263
+ \quad x, y \in \mathbb R^3, \; x\not=y\,. $$ */
264
+ template<>
265
+ class HelmholtzDLKernel<3> : public BaseKernel
266
+ {
267
+ double kappa;
268
+ public:
269
+ typedef Complex value_type;
270
+ static string Name() { return "HelmholtzDL"; }
271
+ static auto Shape() { return IVec<2>(1,1); }
272
+
273
+ HelmholtzDLKernel (double _kappa) : kappa(_kappa) { }
274
+
275
+ template <typename T>
276
+ auto Evaluate (Vec<3,T> x, Vec<3,T> y, Vec<3,T> nx, Vec<3,T> ny) const
277
+ {
278
+ T norm = L2Norm(x-y);
279
+ T nxy = InnerProduct(ny, (x-y));
280
+ auto kern = exp(Complex(0,kappa)*norm) / (4 * M_PI * norm*norm*norm)
281
+ * nxy * (Complex(1,0)*T(1.) - Complex(0,kappa)*norm);
282
+ // return kern;
283
+ return Vec<1,decltype(kern)> (kern);
284
+ }
285
+ double GetKappa() const { return kappa; }
286
+ Array<KernelTerm> terms = { KernelTerm{1.0, 0, 0, 0}, };
287
+
288
+ auto CreateMultipoleExpansion (Vec<3> c, double r, FMM_Parameters fmm_params) const
289
+ {
290
+ return make_shared<SingularMLExpansion<Complex>> (c, r, kappa, fmm_params);
291
+ }
292
+
293
+ auto CreateLocalExpansion (Vec<3> c, double r, FMM_Parameters fmm_params) const
294
+ {
295
+ return make_shared<RegularMLExpansion<Complex>> (c, r, kappa, fmm_params);
296
+ }
297
+
298
+ void AddSource (SingularMLExpansion<Complex> & mp, Vec<3> pnt, Vec<3> nv, BareSliceVector<Complex> val) const
299
+ {
300
+ mp.AddDipole(pnt, -nv, val(0));
301
+ }
302
+
303
+ void AddSourceTrans(SingularMLExpansion<Complex> & mp, Vec<3> pnt, Vec<3> nv, BareSliceVector<Complex> val) const
304
+ {
305
+ mp.AddCharge(pnt, val(0));
306
+ }
307
+
308
+ void EvaluateMP (RegularMLExpansion<Complex> & mp, Vec<3> pnt, Vec<3> nv, BareSliceVector<Complex> val) const
309
+ {
310
+ val(0) = mp.Evaluate (pnt);
311
+ }
312
+
313
+ void EvaluateMPTrans(RegularMLExpansion<Complex> & mp, Vec<3> pnt, Vec<3> nv, BareSliceVector<Complex> val) const
314
+ {
315
+ val(0) = mp.EvaluateDirectionalDerivative(pnt, nv);
316
+ }
317
+ };
318
+
319
+
320
+ template <int DIM> class HelmholtzSLVecKernel;
321
+
322
+ template<>
323
+ class HelmholtzSLVecKernel<3> : public BaseKernel
324
+ {
325
+ double kappa;
326
+ public:
327
+ typedef Complex value_type;
328
+ static string Name() { return "HelmholtzSLVec"; }
329
+ static auto Shape() { return IVec<2>(3,3); }
330
+
331
+ HelmholtzSLVecKernel (double _kappa) : kappa(_kappa) { }
332
+
333
+ template <typename T>
334
+ auto Evaluate (Vec<3,T> x, Vec<3,T> y, Vec<3,T> nx, Vec<3,T> ny) const
335
+ {
336
+ T norm = L2Norm(x-y);
337
+ auto kern = exp(Complex(0,kappa)*norm) / (4 * M_PI * norm);
338
+ return Vec<1,decltype(kern)> (kern);
339
+ }
340
+ double GetKappa() const { return kappa; }
341
+ Array<KernelTerm> terms =
342
+ {
343
+ KernelTerm{1.0, 0, 0, 0},
344
+ KernelTerm{1.0, 0, 1, 1},
345
+ KernelTerm{1.0, 0, 2, 2},
346
+ };
347
+
348
+ auto CreateMultipoleExpansion (Vec<3> c, double r, FMM_Parameters fmm_params) const
349
+ {
350
+ return make_shared<SingularMLExpansion<Vec<3,Complex>>> (c, r, kappa, fmm_params);
351
+ }
352
+
353
+ auto CreateLocalExpansion (Vec<3> c, double r, FMM_Parameters fmm_params) const
354
+ {
355
+ return make_shared<RegularMLExpansion<Vec<3,Complex>>> (c, r, kappa, fmm_params);
356
+ }
357
+
358
+ void AddSource (SingularMLExpansion<Vec<3,Complex>> & mp, Vec<3> pnt, Vec<3> nv, BareSliceVector<Complex> val) const
359
+ {
360
+ mp.AddCharge(pnt, val);
361
+ }
362
+
363
+ void EvaluateMP (RegularMLExpansion<Vec<3,Complex>> & mp, Vec<3> pnt, Vec<3> nv, BareSliceVector<Complex> val) const
364
+ {
365
+ val = mp.Evaluate (pnt);
366
+ }
367
+ };
368
+
369
+
370
+ template <int DIM> class HelmholtzHSKernel;
371
+
372
+ template<>
373
+ class HelmholtzHSKernel<3> : public BaseKernel
374
+ {
375
+ double kappa;
376
+ public:
377
+ typedef Complex value_type;
378
+ static string Name() { return "HelmholtzHS"; }
379
+ static auto Shape() { return IVec<2>(4,4); }
380
+
381
+ HelmholtzHSKernel (double _kappa) : kappa(_kappa) { }
382
+ template <typename T>
383
+ auto Evaluate (Vec<3,T> x, Vec<3,T> y, Vec<3,T> nx, Vec<3,T> ny) const
384
+ {
385
+ T norm = L2Norm(x-y);
386
+ T nxny = InnerProduct(nx, ny);
387
+ auto kern = exp(Complex(0,kappa)*norm) / (4 * M_PI * norm);
388
+ auto kernnxny = -kappa * kappa * kern * nxny;
389
+ // return kern;
390
+ return Vec<2,decltype(kern)> ({kern, kernnxny});
391
+ }
392
+ double GetKappa() const { return kappa; }
393
+ Array<KernelTerm> terms =
394
+ {
395
+ KernelTerm{1.0, 0, 0, 0},
396
+ KernelTerm{1.0, 0, 1, 1},
397
+ KernelTerm{1.0, 0, 2, 2},
398
+ KernelTerm{1.0, 1, 3, 3},
399
+ };
400
+
401
+ auto CreateMultipoleExpansion (Vec<3> c, double r, FMM_Parameters fmm_params) const
402
+ {
403
+ return make_shared<SingularMLExpansion<Vec<6,Complex>>> (c, r, kappa, fmm_params);
404
+ }
405
+
406
+ auto CreateLocalExpansion (Vec<3> c, double r, FMM_Parameters fmm_params) const
407
+ {
408
+ return make_shared<RegularMLExpansion<Vec<6,Complex>>> (c, r, kappa, fmm_params);
409
+ }
410
+
411
+ void AddSource (SingularMLExpansion<Vec<6,Complex>> & mp, Vec<3> pnt, Vec<3> nv, BareSliceVector<Complex> val) const
412
+ {
413
+ Vec<6,Complex> charge;
414
+ charge.Range(0,3) = val.Range(0,3);
415
+ charge.Range(3,6) = -kappa * kappa * val(3) * nv;
416
+ mp.AddCharge(pnt, charge);
417
+ }
418
+
419
+ void EvaluateMP (RegularMLExpansion<Vec<6,Complex>> & mp, Vec<3> pnt, Vec<3> nv, BareSliceVector<Complex> val) const
420
+ {
421
+ Vec<6,Complex> eval = mp.Evaluate (pnt);
422
+ val.Range(0,3) = eval.Range(0,3);
423
+ val(3) = InnerProduct(eval.Range(3,6), nv);
424
+ }
425
+ };
426
+
427
+
428
+
429
+
430
+
431
+
432
+ /** CombinedFieldKernel is a kernel for the combined field integral equation
433
+ is considered for the Helmholtz equation. */
434
+ template <int DIM> class CombinedFieldKernel;
435
+
436
+ /** CombinedFieldKernel in 3D reads
437
+ $$ G(x-y) = \frac{1}{4\,\pi} \, \frac{e^{i\,\kappa\,|x-y|}}{|x-y|^3} \,
438
+ \left( \langle n_y, x-y\rangle (1- i\,\kappa\, | x-y|) - i\,\kappa\,|x-y|^2 \right),
439
+ \quad x, y \in \mathbb R^3, \; x\not=y\,. $$ */
440
+ template<>
441
+ class CombinedFieldKernel<3> : public BaseKernel
442
+ {
443
+ double kappa;
444
+ public:
445
+ typedef Complex value_type;
446
+ static string Name() { return "Helmholtz Combined Field"; }
447
+ static auto Shape() { return IVec<2>(1,1); }
448
+
449
+ CombinedFieldKernel (double _kappa) : kappa(_kappa) { }
450
+
451
+ template <typename T>
452
+ auto Evaluate (Vec<3,T> x, Vec<3,T> y, Vec<3,T> nx, Vec<3,T> ny) const
453
+ {
454
+ T norm = L2Norm(x-y);
455
+ T nxy = InnerProduct(ny, (x-y));
456
+ auto kern = exp(Complex(0,kappa)*norm) / (4 * M_PI * norm*norm*norm)
457
+ * ( nxy * (Complex(1,0)*T(1.) - Complex(0,kappa)*norm) - Complex(0,kappa)*norm*norm);
458
+ // return kern;
459
+ return Vec<1,decltype(kern)> (kern);
460
+ }
461
+ double GetKappa() const { return kappa; }
462
+ Array<KernelTerm> terms = { KernelTerm{1.0, 0, 0, 0}, };
463
+
464
+ auto CreateMultipoleExpansion (Vec<3> c, double r, FMM_Parameters fmm_params) const
465
+ {
466
+ return make_shared<SingularMLExpansion<Complex>> (c, r, kappa, fmm_params);
467
+ }
468
+
469
+ auto CreateLocalExpansion (Vec<3> c, double r, FMM_Parameters fmm_params) const
470
+ {
471
+ return make_shared<RegularMLExpansion<Complex>> (c, r, kappa, fmm_params);
472
+ }
473
+
474
+ void AddSource (SingularMLExpansion<Complex> & mp, Vec<3> pnt, Vec<3> nv, BareSliceVector<Complex> val) const
475
+ {
476
+ // mp.AddCharge(pnt, Complex(0, -kappa)*val(0));
477
+ // mp.AddDipole(pnt, -nv, val(0));
478
+
479
+ mp.AddChargeDipole (pnt, Complex(0, -kappa)*val(0), -nv, val(0));
480
+ }
481
+
482
+ void EvaluateMP (RegularMLExpansion<Complex> & mp, Vec<3> pnt, Vec<3> nv, BareSliceVector<Complex> val) const
483
+ {
484
+ val(0) = mp.Evaluate (pnt);
485
+ }
486
+ };
487
+
488
+
489
+
490
+
491
+
492
+ template <int D> class MaxwellSLKernel;
493
+
494
+ template<>
495
+ class MaxwellSLKernel<3> : public BaseKernel
496
+ {
497
+ double kappa;
498
+ public:
499
+ typedef Complex value_type;
500
+ static string Name() { return "MaxwellSL"; }
501
+ static auto Shape() { return IVec<2>(4,4); }
502
+
503
+ MaxwellSLKernel (const MaxwellSLKernel&) = default;
504
+ MaxwellSLKernel (MaxwellSLKernel&&) = default;
505
+ MaxwellSLKernel (double _kappa) : kappa(_kappa)
506
+ {
507
+ for (size_t i = 0; i < 3; i++)
508
+ terms += KernelTerm { kappa, 0, i, i };
509
+ terms += KernelTerm { -1.0/kappa, 0, 3, 3 };
510
+ }
511
+
512
+ template <typename T>
513
+ auto Evaluate (Vec<3,T> x, Vec<3,T> y, Vec<3,T> nx, Vec<3,T> ny) const
514
+ {
515
+ T norm = L2Norm(x-y);
516
+ auto kern = exp(Complex(0,kappa)*norm) / (4 * M_PI * norm);
517
+ return Vec<1,decltype(kern)> (kern);
518
+ }
519
+ double GetKappa() const { return kappa; }
520
+ Array<KernelTerm> terms;
521
+
522
+ auto CreateMultipoleExpansion (Vec<3> c, double r, FMM_Parameters fmm_params) const
523
+ {
524
+ return make_shared<SingularMLExpansion<Vec<4,Complex>>> (c, r, kappa, fmm_params);
525
+ }
526
+
527
+ auto CreateLocalExpansion (Vec<3> c, double r, FMM_Parameters fmm_params) const
528
+ {
529
+ return make_shared<RegularMLExpansion<Vec<4,Complex>>> (c, r, kappa, fmm_params);
530
+ }
531
+
532
+ void AddSource (SingularMLExpansion<Vec<4,Complex>> & mp, Vec<3> pnt, Vec<3> nv, BareSliceVector<Complex> val) const
533
+ {
534
+ Vec<4,Complex> charge;
535
+ charge.Range(0,3) = kappa * val.Range(0, 3);
536
+ charge(3) = -1.0/kappa * val(3);
537
+ mp.AddCharge(pnt, charge);
538
+ }
539
+
540
+ void EvaluateMP (RegularMLExpansion<Vec<4,Complex>> & mp, Vec<3> pnt, Vec<3> nv, BareSliceVector<Complex> val) const
541
+ {
542
+ val = mp.Evaluate (pnt);
543
+ }
544
+ };
545
+
546
+
547
+
548
+
549
+
550
+
551
+ template <int D> class MaxwellDLKernel;
552
+
553
+ // https://weggler.github.io/ngbem/short_and_sweet/Maxwell_Formulations.html
554
+ /** MaxwellDLkernel for 3D in matrix representation reads
555
+ $$ \left( \begin{array}{ccc} 0 & -\frac{\partial G_\kappa(x-y)}{\partial x_3} & \frac{\partial G_\kappa(x-y)}{\partial x_2} \\ \frac{\partial G_\kappa(x-y)}{\partial x_3} & 0 & -\frac{\partial G_\kappa(x-y)}{\partial x_1} \\ -\frac{\partial G_\kappa(x-y)}{\partial x_2} & \frac{\partial G_\kappa(x-y)}{\partial x_1} & 0 \end{array}\right)\,,$$ with
556
+ $$ G_\kappa(x-y) = \frac{1}{4\,\pi} \, \frac{e^{i\,\kappa\,|x-y|}}{|x-y|^3} \,
557
+ \langle n(y), x-y\rangle \cdot \left( 1 - i\,\kappa\, | x-y| \right),
558
+ \quad x, y \in \mathbb R^3, \; x\not=y\,. $$ */
559
+ template<>
560
+ class MaxwellDLKernel<3> : public BaseKernel
561
+ {
562
+ double kappa;
563
+ public:
564
+ typedef Complex value_type;
565
+ static string Name() { return "MaxwellDL"; }
566
+ static auto Shape() { return IVec<2>(3,3); }
567
+
568
+ MaxwellDLKernel (double _kappa) : kappa(_kappa) { }
569
+
570
+ template <typename T>
571
+ auto Evaluate (Vec<3,T> x, Vec<3,T> y, Vec<3,T> nx, Vec<3,T> ny) const
572
+ {
573
+ T norm = L2Norm(x-y);
574
+ auto kern = exp(Complex(0,kappa)*norm) / (4 * M_PI * norm*norm*norm)
575
+ * (Complex(0,kappa)*norm - Complex(1,0)*T(1.)) * (x-y);
576
+ return kern;
577
+ }
578
+ double GetKappa() const { return kappa; }
579
+ Array<KernelTerm> terms =
580
+ {
581
+ KernelTerm{ 1.0, 0, 1, 2}, // factor, comp, trial, test
582
+ KernelTerm{-1.0, 0, 2, 1},
583
+ KernelTerm{ 1.0, 1, 2, 0},
584
+ KernelTerm{-1.0, 1, 0, 2},
585
+ KernelTerm{ 1.0, 2, 0, 1},
586
+ KernelTerm{-1.0, 2, 1, 0},
587
+ };
588
+
589
+ auto CreateMultipoleExpansion (Vec<3> c, double r, FMM_Parameters fmm_params) const
590
+ {
591
+ return make_shared<SingularMLExpansion<Vec<3,Complex>>> (c, r, kappa, fmm_params);
592
+ }
593
+
594
+ auto CreateLocalExpansion (Vec<3> c, double r, FMM_Parameters fmm_params) const
595
+ {
596
+ return make_shared<RegularMLExpansion<Vec<3,Complex>>> (c, r, kappa, fmm_params);
597
+ }
598
+
599
+ void AddSource (SingularMLExpansion<Vec<3,Complex>> & mp, Vec<3> pnt, Vec<3> nv, BareSliceVector<Complex> val) const
600
+ {
601
+ Vec<3,Complex> n_cross_m = val.Range(0, 3);
602
+ for (int k = 0; k < 3; k++)
603
+ {
604
+ Vec<3> ek{0.0}; ek(k) = 1;
605
+ Vec<3> n_cross_m_real = Real(n_cross_m);
606
+ Vec<3> n_cross_m_imag = Imag(n_cross_m);
607
+ mp.AddDipole(pnt, Cross(n_cross_m_real, ek), ek);
608
+ mp.AddDipole(pnt, Cross(n_cross_m_imag, ek), Complex(0,1)*ek);
609
+ }
610
+ }
611
+
612
+ void AddSourceTrans(SingularMLExpansion<Vec<3,Complex>> & mp, Vec<3> pnt, Vec<3> nv, BareSliceVector<Complex> val) const
613
+ {
614
+ Vec<3,Complex> n_cross_m = val.Range(0, 3);
615
+ for (int k = 0; k < 3; k++)
616
+ {
617
+ Vec<3> ek{0.0}; ek(k) = 1;
618
+ Vec<3> n_cross_m_real = Real(n_cross_m);
619
+ Vec<3> n_cross_m_imag = Imag(n_cross_m);
620
+ mp.AddDipole(pnt, Cross(n_cross_m_real, ek), ek);
621
+ mp.AddDipole(pnt, Cross(n_cross_m_imag, ek), Complex(0,1)*ek);
622
+ }
623
+ }
624
+
625
+ void EvaluateMP (RegularMLExpansion<Vec<3,Complex>> & mp, Vec<3> pnt, Vec<3> nv, BareSliceVector<Complex> val) const
626
+ {
627
+ val = mp.Evaluate (pnt);
628
+ }
629
+
630
+ void EvaluateMPTrans(RegularMLExpansion<Vec<3,Complex>> & mp, Vec<3> pnt, Vec<3> nv, BareSliceVector<Complex> val) const
631
+ {
632
+ val = mp.Evaluate (pnt);
633
+ }
634
+ };
635
+
636
+
637
+
638
+
639
+
640
+ /*
641
+ Dissertation Guenther Of
642
+ "BETI–Gebietszerlegungsmethoden
643
+ mit schnellen Randelementverfahren
644
+ und Anwendungen"
645
+ page 85
646
+ */
647
+
648
+ template <int D> class LameSLKernel;
649
+
650
+ template<>
651
+ class LameSLKernel<3> : public BaseKernel
652
+ {
653
+ double E, nu;
654
+ double alpha;
655
+ public:
656
+ typedef double value_type;
657
+
658
+ static string Name() { return "LameSL"; }
659
+ static auto Shape() { return IVec<2>(3,3); }
660
+
661
+ LameSLKernel (const LameSLKernel&) = default;
662
+ LameSLKernel (LameSLKernel&&) = default;
663
+ LameSLKernel (double _E, double _nu) : E(_E), nu(_nu)
664
+ {
665
+ alpha = (1+nu)/((1-nu)*2*E);
666
+
667
+ terms += { 3-4*nu, 0, 0, 0 };
668
+ terms += { 3-4*nu, 0, 1, 1 };
669
+ terms += { 3-4*nu, 0, 2, 2 };
670
+
671
+ terms += { 1, 1, 0, 0 };
672
+ terms += { 1, 2, 0, 1 };
673
+ terms += { 1, 2, 1, 0 };
674
+
675
+ terms += { 1, 3, 0, 2 };
676
+ terms += { 1, 3, 2, 0 };
677
+ terms += { 1, 4, 1, 1 };
678
+
679
+ terms += { 1, 5, 1, 2 };
680
+ terms += { 1, 5, 2, 1 };
681
+ terms += { 1, 6, 2, 2 };
682
+ }
683
+
684
+ Array<KernelTerm> terms;
685
+
686
+ template <typename T>
687
+ auto Evaluate (Vec<3,T> x, Vec<3,T> y, Vec<3,T> nx, Vec<3,T> ny) const
688
+ {
689
+ T norm = L2Norm(x-y);
690
+ auto lapkern = alpha / (4 * M_PI * norm); // lapkern times factor
691
+
692
+ return Vec<7,T> { lapkern,
693
+ (x(0)-y(0))*(x(0)-y(0))/sqr(norm) * lapkern,
694
+ (x(0)-y(0))*(x(1)-y(1))/sqr(norm) * lapkern,
695
+ (x(0)-y(0))*(x(2)-y(2))/sqr(norm) * lapkern,
696
+ (x(1)-y(1))*(x(1)-y(1))/sqr(norm) * lapkern,
697
+ (x(1)-y(1))*(x(2)-y(2))/sqr(norm) * lapkern,
698
+ (x(2)-y(2))*(x(2)-y(2))/sqr(norm) * lapkern
699
+ };
700
+ }
701
+
702
+
703
+ auto CreateMultipoleExpansion (Vec<3> c, double r, FMM_Parameters fmm_params) const
704
+ {
705
+ return make_shared<SingularMLExpansion<Vec<6,Complex>>> (c, r, 1e-16, fmm_params);
706
+ }
707
+
708
+ auto CreateLocalExpansion (Vec<3> c, double r, FMM_Parameters fmm_params) const
709
+ {
710
+ return make_shared<RegularMLExpansion<Vec<6,Complex>>> (c, r, 1e-16, fmm_params);
711
+ }
712
+
713
+
714
+ void AddSource (SingularMLExpansion<Vec<6,Complex>> & mp, Vec<3> pnt, Vec<3> nv, BareSliceVector<double> val) const
715
+ {
716
+ Vec<6> charge = 0.0;
717
+ charge.Range(0,3) = val;
718
+ mp.AddCharge(pnt, charge); // Row 1+2
719
+
720
+ Mat<3,3> jacobi = OuterProduct(pnt, val) + InnerProduct(pnt, val) * Id<3>();
721
+
722
+ for (int k = 0; k < 3; k++)
723
+ {
724
+ Vec<6> dipole_charge = 0.0;
725
+ dipole_charge.Range(3,6) = jacobi.Col(k);
726
+
727
+ auto ek = UnitVec<3>(k);
728
+ mp.AddDipole(pnt, -ek, dipole_charge);
729
+ }
730
+ }
731
+
732
+ void EvaluateMP (RegularMLExpansion<Vec<6,Complex>> & mp, Vec<3> pnt, Vec<3> nv, BareSliceVector<double> val) const
733
+ {
734
+ Vec<6> mpval = Real(mp.Evaluate (pnt));
735
+ val.Range(0,3) = 0;
736
+ val += (3-4*nu)*alpha * mpval.Range(0,3); // Row 1
737
+
738
+ val -= alpha/2 * mpval.Range(3,6); // Row 3
739
+
740
+ // Row 2
741
+ Mat<3,3> jacobi = 0.0;
742
+ for (int k = 0; k < 3; k++)
743
+ {
744
+ auto ek = UnitVec<3>(k);
745
+ jacobi.Col(k) = Real(mp.EvaluateDirectionalDerivative(pnt, ek).Range(0,3));
746
+ }
747
+
748
+ val -= alpha/2 * ( Trans(jacobi) * pnt + Trace(jacobi) * pnt);
749
+ }
750
+ };
751
+
752
+
753
+
754
+
755
+
756
+
757
+
758
+ }
759
+
760
+
761
+ #endif
762
+