ngsolve 6.2.2501.post48.dev1__cp312-cp312-manylinux_2_28_x86_64.whl → 6.2.2501.post60.dev1__cp312-cp312-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.

Potentially problematic release.


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

Files changed (295) hide show
  1. ngsolve-6.2.2501.post60.dev1.data/data/include/netgen/mptools.hpp +1054 -0
  2. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/include/netgen/ngblas.hpp +11 -1
  3. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/include/netgen/vector.hpp +8 -0
  4. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/lib/cmake/ngsolve/NGSolveConfig.cmake +1 -1
  5. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/lib/python3.12/site-packages/netgen_mesher.libs/libngbla.so +0 -0
  6. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/lib/python3.12/site-packages/netgen_mesher.libs/libngcomp.so +0 -0
  7. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/lib/python3.12/site-packages/netgen_mesher.libs/libngfem.so +0 -0
  8. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/lib/python3.12/site-packages/netgen_mesher.libs/libngla.so +0 -0
  9. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/lib/python3.12/site-packages/netgen_mesher.libs/libngscudalib.so +0 -0
  10. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/lib/python3.12/site-packages/netgen_mesher.libs/libngstd.so +0 -0
  11. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/lib/python3.12/site-packages/ngsolve/config/config.py +5 -5
  12. {ngsolve-6.2.2501.post48.dev1.dist-info → ngsolve-6.2.2501.post60.dev1.dist-info}/METADATA +2 -2
  13. ngsolve-6.2.2501.post60.dev1.dist-info/RECORD +293 -0
  14. ngsolve-6.2.2501.post48.dev1.data/data/include/netgen/mptools.hpp +0 -2145
  15. ngsolve-6.2.2501.post48.dev1.dist-info/RECORD +0 -293
  16. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/bin/ngs_nvcc +0 -0
  17. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/bin/ngs_nvlink +0 -0
  18. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/bin/ngscxx +0 -0
  19. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/bin/ngsld +0 -0
  20. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/bin/ngsolve.tcl +0 -0
  21. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/bin/ngspy +0 -0
  22. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/include/netgen/arnoldi.hpp +0 -0
  23. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/include/netgen/bandmatrix.hpp +0 -0
  24. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/include/netgen/basematrix.hpp +0 -0
  25. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/include/netgen/basevector.hpp +0 -0
  26. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/include/netgen/bdbequations.hpp +0 -0
  27. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/include/netgen/bdbintegrator.hpp +0 -0
  28. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/include/netgen/bessel.hpp +0 -0
  29. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/include/netgen/bilinearform.hpp +0 -0
  30. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/include/netgen/bla.hpp +0 -0
  31. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/include/netgen/blockalloc.hpp +0 -0
  32. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/include/netgen/blockjacobi.hpp +0 -0
  33. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/include/netgen/bspline.hpp +0 -0
  34. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/include/netgen/calcinverse.hpp +0 -0
  35. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/include/netgen/cg.hpp +0 -0
  36. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/include/netgen/chebyshev.hpp +0 -0
  37. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/include/netgen/cholesky.hpp +0 -0
  38. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/include/netgen/clapack.h +0 -0
  39. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/include/netgen/code_generation.hpp +0 -0
  40. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/include/netgen/coefficient.hpp +0 -0
  41. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/include/netgen/coefficient_impl.hpp +0 -0
  42. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/include/netgen/coefficient_stdmath.hpp +0 -0
  43. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/include/netgen/commutingAMG.hpp +0 -0
  44. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/include/netgen/comp.hpp +0 -0
  45. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/include/netgen/compatibility.hpp +0 -0
  46. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/include/netgen/complex_wrapper.hpp +0 -0
  47. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/include/netgen/compressedfespace.hpp +0 -0
  48. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/include/netgen/contact.hpp +0 -0
  49. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/include/netgen/cuda_linalg.hpp +0 -0
  50. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/include/netgen/cuda_ngbla.hpp +0 -0
  51. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/include/netgen/cuda_ngstd.hpp +0 -0
  52. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/include/netgen/cuda_profiler.hpp +0 -0
  53. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/include/netgen/diagonalmatrix.hpp +0 -0
  54. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/include/netgen/differentialoperator.hpp +0 -0
  55. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/include/netgen/diffop.hpp +0 -0
  56. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/include/netgen/diffop_impl.hpp +0 -0
  57. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/include/netgen/discontinuous.hpp +0 -0
  58. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/include/netgen/dump.hpp +0 -0
  59. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/include/netgen/eigen.hpp +0 -0
  60. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/include/netgen/eigensystem.hpp +0 -0
  61. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/include/netgen/elasticity_equations.hpp +0 -0
  62. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/include/netgen/elementbyelement.hpp +0 -0
  63. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/include/netgen/elementtopology.hpp +0 -0
  64. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/include/netgen/elementtransformation.hpp +0 -0
  65. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/include/netgen/evalfunc.hpp +0 -0
  66. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/include/netgen/expr.hpp +0 -0
  67. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/include/netgen/facetfe.hpp +0 -0
  68. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/include/netgen/facetfespace.hpp +0 -0
  69. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/include/netgen/facethofe.hpp +0 -0
  70. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/include/netgen/facetsurffespace.hpp +0 -0
  71. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/include/netgen/fe_interfaces.hpp +0 -0
  72. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/include/netgen/fem.hpp +0 -0
  73. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/include/netgen/fesconvert.hpp +0 -0
  74. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/include/netgen/fespace.hpp +0 -0
  75. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/include/netgen/finiteelement.hpp +0 -0
  76. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/include/netgen/globalinterfacespace.hpp +0 -0
  77. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/include/netgen/globalspace.hpp +0 -0
  78. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/include/netgen/gridfunction.hpp +0 -0
  79. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/include/netgen/h1amg.hpp +0 -0
  80. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/include/netgen/h1hofe.hpp +0 -0
  81. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/include/netgen/h1hofe_impl.hpp +0 -0
  82. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/include/netgen/h1hofefo.hpp +0 -0
  83. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/include/netgen/h1hofefo_impl.hpp +0 -0
  84. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/include/netgen/h1hofespace.hpp +0 -0
  85. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/include/netgen/h1lofe.hpp +0 -0
  86. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/include/netgen/h1lumping.hpp +0 -0
  87. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/include/netgen/hcurl_equations.hpp +0 -0
  88. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/include/netgen/hcurlcurlfe.hpp +0 -0
  89. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/include/netgen/hcurlcurlfespace.hpp +0 -0
  90. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/include/netgen/hcurlfe.hpp +0 -0
  91. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/include/netgen/hcurlfe_utils.hpp +0 -0
  92. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/include/netgen/hcurlhdiv_dshape.hpp +0 -0
  93. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/include/netgen/hcurlhdivfes.hpp +0 -0
  94. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/include/netgen/hcurlhofe.hpp +0 -0
  95. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/include/netgen/hcurlhofe_impl.hpp +0 -0
  96. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/include/netgen/hcurlhofespace.hpp +0 -0
  97. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/include/netgen/hcurllofe.hpp +0 -0
  98. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/include/netgen/hdiv_equations.hpp +0 -0
  99. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/include/netgen/hdivdivfe.hpp +0 -0
  100. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/include/netgen/hdivdivsurfacespace.hpp +0 -0
  101. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/include/netgen/hdivfe.hpp +0 -0
  102. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/include/netgen/hdivfe_utils.hpp +0 -0
  103. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/include/netgen/hdivfes.hpp +0 -0
  104. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/include/netgen/hdivhofe.hpp +0 -0
  105. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/include/netgen/hdivhofe_impl.hpp +0 -0
  106. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/include/netgen/hdivhofefo.hpp +0 -0
  107. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/include/netgen/hdivhofespace.hpp +0 -0
  108. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/include/netgen/hdivhosurfacefespace.hpp +0 -0
  109. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/include/netgen/hdivlofe.hpp +0 -0
  110. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/include/netgen/hidden.hpp +0 -0
  111. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/include/netgen/householder.hpp +0 -0
  112. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/include/netgen/hypre_ams_precond.hpp +0 -0
  113. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/include/netgen/hypre_precond.hpp +0 -0
  114. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/include/netgen/integrator.hpp +0 -0
  115. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/include/netgen/integratorcf.hpp +0 -0
  116. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/include/netgen/interpolate.hpp +0 -0
  117. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/include/netgen/intrule.hpp +0 -0
  118. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/include/netgen/irspace.hpp +0 -0
  119. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/include/netgen/jacobi.hpp +0 -0
  120. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/include/netgen/l2hofe.hpp +0 -0
  121. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/include/netgen/l2hofe_impl.hpp +0 -0
  122. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/include/netgen/l2hofefo.hpp +0 -0
  123. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/include/netgen/l2hofespace.hpp +0 -0
  124. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/include/netgen/la.hpp +0 -0
  125. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/include/netgen/linalg_kernels.hpp +0 -0
  126. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/include/netgen/linearform.hpp +0 -0
  127. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/include/netgen/matrix.hpp +0 -0
  128. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/include/netgen/memusage.hpp +0 -0
  129. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/include/netgen/meshaccess.hpp +0 -0
  130. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/include/netgen/mgpre.hpp +0 -0
  131. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/include/netgen/multigrid.hpp +0 -0
  132. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/include/netgen/multivector.hpp +0 -0
  133. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/include/netgen/mumpsinverse.hpp +0 -0
  134. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/include/netgen/mycomplex.hpp +0 -0
  135. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/include/netgen/ng_lapack.hpp +0 -0
  136. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/include/netgen/ngs_defines.hpp +0 -0
  137. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/include/netgen/ngs_stdcpp_include.hpp +0 -0
  138. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/include/netgen/ngs_utils.hpp +0 -0
  139. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/include/netgen/ngsobject.hpp +0 -0
  140. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/include/netgen/ngsstream.hpp +0 -0
  141. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/include/netgen/ngstd.hpp +0 -0
  142. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/include/netgen/nodalhofe.hpp +0 -0
  143. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/include/netgen/nodalhofe_impl.hpp +0 -0
  144. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/include/netgen/normalfacetfe.hpp +0 -0
  145. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/include/netgen/normalfacetfespace.hpp +0 -0
  146. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/include/netgen/normalfacetsurfacefespace.hpp +0 -0
  147. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/include/netgen/order.hpp +0 -0
  148. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/include/netgen/parallel_matrices.hpp +0 -0
  149. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/include/netgen/paralleldofs.hpp +0 -0
  150. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/include/netgen/parallelngs.hpp +0 -0
  151. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/include/netgen/parallelvector.hpp +0 -0
  152. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/include/netgen/pardisoinverse.hpp +0 -0
  153. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/include/netgen/periodic.hpp +0 -0
  154. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/include/netgen/plateaufespace.hpp +0 -0
  155. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/include/netgen/pml.hpp +0 -0
  156. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/include/netgen/pmltrafo.hpp +0 -0
  157. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/include/netgen/postproc.hpp +0 -0
  158. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/include/netgen/precomp.hpp +0 -0
  159. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/include/netgen/preconditioner.hpp +0 -0
  160. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/include/netgen/prolongation.hpp +0 -0
  161. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/include/netgen/python_comp.hpp +0 -0
  162. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/include/netgen/python_fem.hpp +0 -0
  163. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/include/netgen/python_linalg.hpp +0 -0
  164. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/include/netgen/python_ngstd.hpp +0 -0
  165. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/include/netgen/recursive_pol.hpp +0 -0
  166. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/include/netgen/recursive_pol_tet.hpp +0 -0
  167. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/include/netgen/recursive_pol_trig.hpp +0 -0
  168. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/include/netgen/reorderedfespace.hpp +0 -0
  169. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/include/netgen/sample_sort.hpp +0 -0
  170. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/include/netgen/scalarfe.hpp +0 -0
  171. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/include/netgen/shapefunction_utils.hpp +0 -0
  172. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/include/netgen/simd_complex.hpp +0 -0
  173. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/include/netgen/smoother.hpp +0 -0
  174. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/include/netgen/solve.hpp +0 -0
  175. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/include/netgen/sparsecholesky.hpp +0 -0
  176. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/include/netgen/sparsematrix.hpp +0 -0
  177. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/include/netgen/sparsematrix_dyn.hpp +0 -0
  178. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/include/netgen/sparsematrix_impl.hpp +0 -0
  179. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/include/netgen/special_matrix.hpp +0 -0
  180. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/include/netgen/specialelement.hpp +0 -0
  181. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/include/netgen/statushandler.hpp +0 -0
  182. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/include/netgen/stringops.hpp +0 -0
  183. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/include/netgen/superluinverse.hpp +0 -0
  184. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/include/netgen/symbolicintegrator.hpp +0 -0
  185. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/include/netgen/symmetricmatrix.hpp +0 -0
  186. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/include/netgen/tangentialfacetfe.hpp +0 -0
  187. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/include/netgen/tangentialfacetfespace.hpp +0 -0
  188. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/include/netgen/tensor.hpp +0 -0
  189. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/include/netgen/tensorcoefficient.hpp +0 -0
  190. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/include/netgen/tensorproductintegrator.hpp +0 -0
  191. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/include/netgen/thcurlfe.hpp +0 -0
  192. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/include/netgen/thcurlfe_impl.hpp +0 -0
  193. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/include/netgen/thdivfe.hpp +0 -0
  194. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/include/netgen/thdivfe_impl.hpp +0 -0
  195. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/include/netgen/tpdiffop.hpp +0 -0
  196. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/include/netgen/tpfes.hpp +0 -0
  197. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/include/netgen/tpintrule.hpp +0 -0
  198. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/include/netgen/triangular.hpp +0 -0
  199. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/include/netgen/tscalarfe.hpp +0 -0
  200. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/include/netgen/tscalarfe_impl.hpp +0 -0
  201. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/include/netgen/umfpackinverse.hpp +0 -0
  202. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/include/netgen/unifiedvector.hpp +0 -0
  203. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/include/netgen/voxelcoefficientfunction.hpp +0 -0
  204. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/include/netgen/vtkoutput.hpp +0 -0
  205. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/include/netgen/vvector.hpp +0 -0
  206. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/include/netgen/webgui.hpp +0 -0
  207. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/lib/cmake/ngsolve/ngsolve-targets-release.cmake +0 -0
  208. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/lib/cmake/ngsolve/ngsolve-targets.cmake +0 -0
  209. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/lib/python3.12/site-packages/netgen_mesher.libs/libngsolve.so +0 -0
  210. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/lib/python3.12/site-packages/ngsolve/TensorProductTools.py +0 -0
  211. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/lib/python3.12/site-packages/ngsolve/__console.py +0 -0
  212. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/lib/python3.12/site-packages/ngsolve/__expr.py +0 -0
  213. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/lib/python3.12/site-packages/ngsolve/__init__.py +0 -0
  214. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/lib/python3.12/site-packages/ngsolve/_scikit_build_core_dependencies.py +0 -0
  215. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/lib/python3.12/site-packages/ngsolve/bvp.py +0 -0
  216. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/lib/python3.12/site-packages/ngsolve/config/__init__.py +0 -0
  217. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/lib/python3.12/site-packages/ngsolve/config/__main__.py +0 -0
  218. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/lib/python3.12/site-packages/ngsolve/demos/TensorProduct/__init__.py +0 -0
  219. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/lib/python3.12/site-packages/ngsolve/demos/TensorProduct/tp_dg_1d_1d.py +0 -0
  220. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/lib/python3.12/site-packages/ngsolve/demos/TensorProduct/tp_dg_1d_2d.py +0 -0
  221. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/lib/python3.12/site-packages/ngsolve/demos/TensorProduct/tp_dg_2d_1d.py +0 -0
  222. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/lib/python3.12/site-packages/ngsolve/demos/TensorProduct/tp_dg_2d_2d.py +0 -0
  223. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/lib/python3.12/site-packages/ngsolve/demos/__init__.py +0 -0
  224. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/lib/python3.12/site-packages/ngsolve/demos/howto/__init__.py +0 -0
  225. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/lib/python3.12/site-packages/ngsolve/demos/howto/hhj.py +0 -0
  226. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/lib/python3.12/site-packages/ngsolve/demos/howto/hybrid_dg.py +0 -0
  227. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/lib/python3.12/site-packages/ngsolve/demos/howto/mixed.py +0 -0
  228. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/lib/python3.12/site-packages/ngsolve/demos/howto/nonlin.py +0 -0
  229. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/lib/python3.12/site-packages/ngsolve/demos/howto/pickling.py +0 -0
  230. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/lib/python3.12/site-packages/ngsolve/demos/howto/pml.py +0 -0
  231. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/lib/python3.12/site-packages/ngsolve/demos/howto/taskmanager.py +0 -0
  232. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/lib/python3.12/site-packages/ngsolve/demos/howto/tdnns.py +0 -0
  233. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/lib/python3.12/site-packages/ngsolve/demos/howto/timeDG-skeleton.py +0 -0
  234. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/lib/python3.12/site-packages/ngsolve/demos/howto/timeDG.py +0 -0
  235. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/lib/python3.12/site-packages/ngsolve/demos/howto/timeDGlap.py +0 -0
  236. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/lib/python3.12/site-packages/ngsolve/demos/howto/timeDGwave.py +0 -0
  237. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/lib/python3.12/site-packages/ngsolve/demos/intro/__init__.py +0 -0
  238. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/lib/python3.12/site-packages/ngsolve/demos/intro/adaptive.py +0 -0
  239. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/lib/python3.12/site-packages/ngsolve/demos/intro/cmagnet.py +0 -0
  240. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/lib/python3.12/site-packages/ngsolve/demos/intro/elasticity.py +0 -0
  241. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/lib/python3.12/site-packages/ngsolve/demos/intro/navierstokes.py +0 -0
  242. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/lib/python3.12/site-packages/ngsolve/demos/intro/poisson.ipynb +0 -0
  243. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/lib/python3.12/site-packages/ngsolve/demos/intro/poisson.py +0 -0
  244. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/lib/python3.12/site-packages/ngsolve/demos/mpi/__init__.py +0 -0
  245. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/lib/python3.12/site-packages/ngsolve/demos/mpi/mpi_cmagnet.py +0 -0
  246. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/lib/python3.12/site-packages/ngsolve/demos/mpi/mpi_navierstokes.py +0 -0
  247. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/lib/python3.12/site-packages/ngsolve/demos/mpi/mpi_poisson.py +0 -0
  248. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/lib/python3.12/site-packages/ngsolve/demos/mpi/mpi_timeDG.py +0 -0
  249. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/lib/python3.12/site-packages/ngsolve/directsolvers.py +0 -0
  250. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/lib/python3.12/site-packages/ngsolve/eigenvalues.py +0 -0
  251. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/lib/python3.12/site-packages/ngsolve/internal.py +0 -0
  252. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/lib/python3.12/site-packages/ngsolve/krylovspace.py +0 -0
  253. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/lib/python3.12/site-packages/ngsolve/meshes.py +0 -0
  254. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/lib/python3.12/site-packages/ngsolve/ngs2petsc.py +0 -0
  255. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/lib/python3.12/site-packages/ngsolve/ngscuda.so +0 -0
  256. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/lib/python3.12/site-packages/ngsolve/ngscxx.py +0 -0
  257. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/lib/python3.12/site-packages/ngsolve/ngslib.so +0 -0
  258. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/lib/python3.12/site-packages/ngsolve/nonlinearsolvers.py +0 -0
  259. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/lib/python3.12/site-packages/ngsolve/preconditioners.py +0 -0
  260. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/lib/python3.12/site-packages/ngsolve/solvers.py +0 -0
  261. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/lib/python3.12/site-packages/ngsolve/timestepping.py +0 -0
  262. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/lib/python3.12/site-packages/ngsolve/timing.py +0 -0
  263. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/lib/python3.12/site-packages/ngsolve/utils.py +0 -0
  264. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/lib/python3.12/site-packages/ngsolve/webgui.py +0 -0
  265. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/share/ngsolve/beam.geo +0 -0
  266. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/share/ngsolve/beam.vol +0 -0
  267. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/share/ngsolve/chip.in2d +0 -0
  268. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/share/ngsolve/chip.vol +0 -0
  269. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/share/ngsolve/coil.geo +0 -0
  270. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/share/ngsolve/coil.vol +0 -0
  271. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/share/ngsolve/coilshield.geo +0 -0
  272. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/share/ngsolve/coilshield.vol +0 -0
  273. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/share/ngsolve/cube.geo +0 -0
  274. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/share/ngsolve/cube.vol +0 -0
  275. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/share/ngsolve/d10_DGdoubleglazing.pde +0 -0
  276. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/share/ngsolve/d11_chip_nitsche.pde +0 -0
  277. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/share/ngsolve/d1_square.pde +0 -0
  278. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/share/ngsolve/d2_chip.pde +0 -0
  279. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/share/ngsolve/d3_helmholtz.pde +0 -0
  280. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/share/ngsolve/d4_cube.pde +0 -0
  281. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/share/ngsolve/d5_beam.pde +0 -0
  282. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/share/ngsolve/d6_shaft.pde +0 -0
  283. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/share/ngsolve/d7_coil.pde +0 -0
  284. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/share/ngsolve/d8_coilshield.pde +0 -0
  285. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/share/ngsolve/d9_hybridDG.pde +0 -0
  286. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/share/ngsolve/doubleglazing.in2d +0 -0
  287. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/share/ngsolve/doubleglazing.vol +0 -0
  288. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/share/ngsolve/piezo2d40round4.vol.gz +0 -0
  289. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/share/ngsolve/shaft.geo +0 -0
  290. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/share/ngsolve/shaft.vol +0 -0
  291. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/share/ngsolve/square.in2d +0 -0
  292. {ngsolve-6.2.2501.post48.dev1.data → ngsolve-6.2.2501.post60.dev1.data}/data/share/ngsolve/square.vol +0 -0
  293. {ngsolve-6.2.2501.post48.dev1.dist-info → ngsolve-6.2.2501.post60.dev1.dist-info}/WHEEL +0 -0
  294. {ngsolve-6.2.2501.post48.dev1.dist-info → ngsolve-6.2.2501.post60.dev1.dist-info}/licenses/LICENSE +0 -0
  295. {ngsolve-6.2.2501.post48.dev1.dist-info → ngsolve-6.2.2501.post60.dev1.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,1054 @@
1
+ #ifndef FILE_MPTOOLS
2
+ #define FILE_MPTOOLS
3
+
4
+ /*
5
+ tools for computing with spherical harmonics and multi-poles
6
+ */
7
+
8
+
9
+ #include <bla.hpp>
10
+ #include <coefficient.hpp>
11
+ #include <recursive_pol.hpp>
12
+
13
+ namespace ngfem
14
+ {
15
+
16
+
17
+
18
+ class NGS_DLL_HEADER SphericalHarmonics
19
+ {
20
+ int order;
21
+ Vector<Complex> coefs;
22
+
23
+ public:
24
+ SphericalHarmonics (int aorder)
25
+ : order(aorder), coefs(sqr(order+1)) { coefs=0.0; }
26
+
27
+ int Order() const { return order; }
28
+ FlatVector<Complex> Coefs() const { return coefs; }
29
+
30
+ Complex & Coef(int n, int m)
31
+ {
32
+ return coefs(n*(n+1) + m);
33
+ }
34
+
35
+ auto CoefsN (int n) const
36
+ {
37
+ return coefs.RangeN(n*n, 2*n+1);
38
+ }
39
+
40
+ static std::tuple<double,double> Polar (Vec<3> x)
41
+ {
42
+ double phi, theta;
43
+ if (x(0) == 0 && x(1) == 0)
44
+ {
45
+ phi = 0;
46
+ theta = x(2) > 0 ? 0 : M_PI;
47
+ }
48
+ else
49
+ {
50
+ phi = atan2(x(1), x(0));
51
+ theta = acos(x(2)/L2Norm(x));
52
+ }
53
+ return { theta, phi };
54
+ }
55
+
56
+ Complex Eval (Vec<3> x) const
57
+ {
58
+ auto [theta, phi] = Polar(x);
59
+ return Eval(theta, phi);
60
+ }
61
+
62
+ Complex Eval (double theta, double phi) const;
63
+
64
+ Complex EvalOrder (int n, Vec<3> x) const
65
+ {
66
+ auto [theta, phi] = Polar (x);
67
+ return EvalOrder(n, theta, phi);
68
+ }
69
+
70
+ Complex EvalOrder (int n, double theta, double phi) const;
71
+
72
+ void EvalOrders (Vec<3> x, FlatVector<Complex> vals) const
73
+ {
74
+ auto [theta, phi] = Polar(x);
75
+ return EvalOrders(theta, phi, vals);
76
+ }
77
+
78
+ void EvalOrders (double theta, double phi, FlatVector<Complex> vals) const;
79
+
80
+ void Calc (Vec<3> x, FlatVector<Complex> shapes);
81
+
82
+
83
+ void RotateZ (double alpha);
84
+ void RotateY (double alpha);
85
+
86
+
87
+ static double CalcAmn (int m, int n)
88
+ {
89
+ if (m < 0) m=-m;
90
+ if (n < m) return 0;
91
+ return sqrt( (n+1.0+m)*(n+1.0-m) / ( (2*n+1)*(2*n+3) ));
92
+ }
93
+
94
+ static double CalcBmn (int m, int n)
95
+ {
96
+ double sgn = (m >= 0) ? 1 : -1;
97
+ if ( (m > n) || (-m > n) ) return 0;
98
+ return sgn * sqrt( (n-m-1.0)*(n-m) / ( (2*n-1.0)*(2*n+1)));
99
+ }
100
+
101
+ static double CalcDmn (int m, int n)
102
+ {
103
+ double sgn = (m >= 0) ? 1 : -1;
104
+ return sgn/2 * sqrt((n-m)*(n+m+1));
105
+ }
106
+
107
+ // Nail A. Gumerov and Ramani Duraiswami book, formula (2.2.12)
108
+ // add directional derivative divided by kappa to res, both multipoles need same scaling
109
+ void DirectionalDiffAdd (Vec<3> d, SphericalHarmonics & res, double scale = 1);
110
+
111
+ };
112
+
113
+
114
+ // https://fortran-lang.discourse.group/t/looking-for-spherical-bessel-and-hankel-functions-of-first-and-second-kind-and-arbitrary-order/2308/2
115
+ NGS_DLL_HEADER
116
+ void besseljs3d (int nterms, double z, double scale,
117
+ FlatVector<double> fjs, FlatVector<double> fjder);
118
+
119
+ NGS_DLL_HEADER
120
+ void besseljs3d (int nterms, Complex z, double scale,
121
+ FlatVector<Complex> fjs, FlatVector<Complex> fjder);
122
+
123
+
124
+ /*
125
+ spherical bessel functions of first (the j_n) and second (the y_n) kind.
126
+
127
+ j0(r) = sin(r)/r
128
+ j1(r) = (sin(r)-r cos(r)) / r**2
129
+
130
+ y0(r) = -cos(r)/r
131
+ y1(r) = (-cos(r)-r*sin(r)) / r**2
132
+ */
133
+ NGS_DLL_HEADER
134
+ void SBESJY (double x, int lmax,
135
+ FlatVector<double> j,
136
+ FlatVector<double> y,
137
+ FlatVector<double> jp,
138
+ FlatVector<double> yp);
139
+
140
+
141
+
142
+ template <typename T>
143
+ void SphericalBessel (int n, double rho, double scale, T && values)
144
+ {
145
+ Vector<double> j(n+1), jp(n+1);
146
+ besseljs3d (n, rho, scale, j, jp);
147
+ values = j;
148
+ }
149
+
150
+
151
+ template <typename T>
152
+ void SphericalHankel1 (int n, double rho, double scale, T && values)
153
+ {
154
+ // Complex imag(0,1);
155
+ /*
156
+ if (n >= 0)
157
+ values(0) = exp(imag*rho) / (imag*rho);
158
+ if (n >= 1)
159
+ values(1) = -imag*values(0)*(1.0-1.0/(imag*rho));
160
+
161
+ for (int i = 2; i <= n; i++)
162
+ values(i) = (2*i-1)/rho * values(i-1) - values(i-2);
163
+ */
164
+
165
+ if (rho < 1e-8)
166
+ {
167
+ values = Complex(0);
168
+ return;
169
+ }
170
+ Vector j(n+1), y(n+1), jp(n+1), yp(n+1);
171
+ SBESJY (rho, n, j, y, jp, yp);
172
+
173
+ values = j + Complex(0,1) * y;
174
+ if (scale != 1.0)
175
+ {
176
+ double prod = 1.0;
177
+ for (int i = 0; i <= n; i++)
178
+ {
179
+ values(i) *= prod;
180
+ prod *= scale;
181
+ }
182
+ }
183
+ }
184
+
185
+
186
+
187
+
188
+
189
+ // hn1 = jn+ i*yn
190
+ class MPSingular
191
+ {
192
+ public:
193
+ template <typename T>
194
+ static void Eval (int order, double r, double scale, T && values)
195
+ {
196
+ SphericalHankel1(order, r, scale, values);
197
+ }
198
+ };
199
+
200
+ // jn
201
+ class MPRegular
202
+ {
203
+ public:
204
+ template <typename T>
205
+ static void Eval (int order, double r, double scale, T && values)
206
+ {
207
+ SphericalBessel (order, r, 1.0/scale, values);
208
+ }
209
+ };
210
+
211
+
212
+
213
+
214
+ template <typename RADIAL>
215
+ class NGS_DLL_HEADER MultiPole
216
+ {
217
+ SphericalHarmonics sh;
218
+ double kappa;
219
+ double scale;
220
+ public:
221
+ MultiPole (int aorder, double akappa, double ascale = 1)
222
+ : sh(aorder), kappa(akappa), scale(ascale) { }
223
+
224
+ Complex & Coef(int n, int m) { return sh.Coef(n,m); }
225
+ auto & SH() { return sh; }
226
+ const auto & SH() const { return sh; }
227
+ double Kappa() const { return kappa; }
228
+ double Scale() const { return scale; }
229
+ int Order() const { return sh.Order(); }
230
+
231
+ MultiPole<RADIAL> Truncate(int neworder) const
232
+ {
233
+ if (neworder > sh.Order()) neworder=sh.Order();
234
+ MultiPole nmp(neworder, kappa);
235
+ nmp.sh.Coefs() = sh.Coefs().Range(sqr(neworder+1));
236
+ return nmp;
237
+ }
238
+
239
+ MultiPole & operator+= (const MultiPole & mp2)
240
+ {
241
+ size_t commonsize = min(SH().Coefs().Size(), mp2.SH().Coefs().Size());
242
+ SH().Coefs().Range(commonsize) += mp2.SH().Coefs().Range(commonsize);
243
+ return *this;
244
+ }
245
+
246
+ Complex Eval (Vec<3> x) const;
247
+
248
+ void AddCharge (Vec<3> x, Complex c);
249
+ void AddDipole (Vec<3> x, Vec<3> d, Complex c);
250
+
251
+
252
+ void ChangeScaleTo (double newscale)
253
+ {
254
+ double fac = scale/newscale;
255
+ double prod = 1;
256
+ for (int n = 0; n <= sh.Order(); n++, prod*= fac)
257
+ sh.CoefsN(n) *= prod;
258
+ scale = newscale;
259
+ }
260
+
261
+ template <typename TARGET>
262
+ void Transform (MultiPole<TARGET> & target, Vec<3> dist) const
263
+ {
264
+ if (target.SH().Order() < 0) return;
265
+ if (SH().Order() < 0)
266
+ {
267
+ target.SH().Coefs() = 0.0;
268
+ return;
269
+ }
270
+
271
+ static Timer t("mptool Transform "+ToString(typeid(RADIAL).name())+ToString(typeid(TARGET).name()));
272
+ RegionTimer reg(t);
273
+
274
+ double len = L2Norm(dist);
275
+ double theta, phi;
276
+
277
+ if (len < 1e-30)
278
+ theta = 0;
279
+ else
280
+ theta = acos (dist(2) / len);
281
+
282
+ if (sqr(dist(0))+sqr(dist(1)) < 1e-30)
283
+ phi = 0;
284
+ else
285
+ phi = atan2(dist(1), dist(0));
286
+
287
+
288
+ MultiPole<RADIAL> tmp(*this);
289
+ tmp.SH().RotateZ(phi);
290
+ tmp.SH().RotateY(theta);
291
+
292
+ tmp.ShiftZ(-len, target);
293
+
294
+ target.SH().RotateY(-theta);
295
+ target.SH().RotateZ(-phi);
296
+ }
297
+
298
+ template <typename TARGET>
299
+ void TransformAdd (MultiPole<TARGET> & target, Vec<3> dist) const
300
+ {
301
+ if (SH().Order() < 0) return;
302
+ if (target.SH().Order() < 0) return;
303
+
304
+ MultiPole<TARGET> tmp{target};
305
+ Transform(tmp, dist);
306
+ target.SH().Coefs() += tmp.SH().Coefs();
307
+ }
308
+
309
+ template <typename TARGET>
310
+ void ShiftZ (double z, MultiPole<TARGET> & target);
311
+
312
+ };
313
+
314
+
315
+
316
+ // ***************** parameters ****************
317
+
318
+ static int MPOrder (double rho_kappa)
319
+ {
320
+ return max (20, int(2*rho_kappa));
321
+ }
322
+ static constexpr int maxdirect = 100;
323
+
324
+ class SingularMLMultiPole
325
+ {
326
+ static Array<size_t> nodes_on_level;
327
+
328
+ struct Node
329
+ {
330
+ Vec<3> center;
331
+ double r;
332
+ int level;
333
+ std::array<unique_ptr<Node>,8> childs;
334
+ MultiPole<MPSingular> mp;
335
+
336
+ Array<tuple<Vec<3>, Complex>> charges;
337
+ Array<tuple<Vec<3>, Vec<3>, Complex>> dipoles;
338
+ int total_sources;
339
+
340
+ Node (Vec<3> acenter, double ar, int alevel, int order, double kappa)
341
+ : center(acenter), r(ar), level(alevel), mp(MPOrder(ar*kappa), kappa, min(1.0, 1*r*kappa))
342
+ // : center(acenter), r(ar), level(alevel), mp(MPOrder(ar*kappa), kappa, 1.0)
343
+ {
344
+ // cout << "singml, add node, level = " << level << endl;
345
+ if (level < nodes_on_level.Size())
346
+ nodes_on_level[level]++;
347
+ }
348
+
349
+
350
+ void CreateChilds()
351
+ {
352
+ if (childs[0]) throw Exception("have already childs");
353
+ for (int i = 0; i < 8; i++)
354
+ {
355
+ Vec<3> cc = center;
356
+ cc(0) += (i&1) ? r/2 : -r/2;
357
+ cc(1) += (i&2) ? r/2 : -r/2;
358
+ cc(2) += (i&4) ? r/2 : -r/2;
359
+ childs[i] = make_unique<Node> (cc, r/2, level+1, max(mp.SH().Order()/2, 8), mp.Kappa());
360
+ }
361
+ }
362
+
363
+
364
+ void AddCharge (Vec<3> x, Complex c)
365
+ {
366
+ if (childs[0])
367
+ {
368
+ // directly send to childs:
369
+ int childnum = 0;
370
+ if (x(0) > center(0)) childnum += 1;
371
+ if (x(1) > center(1)) childnum += 2;
372
+ if (x(2) > center(2)) childnum += 4;
373
+ childs[childnum] -> AddCharge(x, c);
374
+ return;
375
+ }
376
+
377
+ charges.Append( tuple{x,c} );
378
+
379
+ if (r*mp.Kappa() < 1e-8) return;
380
+ if (charges.Size() < maxdirect && r*mp.Kappa() < 1)
381
+ return;
382
+
383
+ CreateChilds();
384
+
385
+ for (auto [x,c] : charges)
386
+ AddCharge (x,c);
387
+ for (auto [x,d,c] : dipoles)
388
+ AddDipole (x,d,c);
389
+
390
+ charges.SetSize0();
391
+ dipoles.SetSize0();
392
+ }
393
+
394
+
395
+ void AddDipole (Vec<3> x, Vec<3> d, Complex c)
396
+ {
397
+ if (childs[0])
398
+ {
399
+ // directly send to childs:
400
+
401
+ int childnum = 0;
402
+ if (x(0) > center(0)) childnum += 1;
403
+ if (x(1) > center(1)) childnum += 2;
404
+ if (x(2) > center(2)) childnum += 4;
405
+ childs[childnum] -> AddDipole(x, d, c);
406
+ return;
407
+ }
408
+
409
+ dipoles.Append (tuple{x,d,c});
410
+
411
+ if (dipoles.Size() < maxdirect || r < 1e-8)
412
+ return;
413
+
414
+ CreateChilds();
415
+
416
+ for (auto [x,c] : charges)
417
+ AddCharge (x,c);
418
+ for (auto [x,d,c] : dipoles)
419
+ AddDipole (x,d,c);
420
+
421
+ charges.SetSize0();
422
+ dipoles.SetSize0();
423
+ }
424
+
425
+
426
+ Complex Evaluate(Vec<3> p) const
427
+ {
428
+ Complex sum = 0;
429
+ if (childs[0])
430
+ {
431
+ for (auto & child : childs)
432
+ sum += child->Evaluate(p);
433
+ return sum;
434
+ }
435
+
436
+ for (auto [x,c] : charges)
437
+ if (double rho = L2Norm(p-x); rho > 0)
438
+ sum += c*(1/(4*M_PI))*exp(Complex(0,rho*mp.Kappa())) / rho;
439
+
440
+ for (auto [x,d,c] : dipoles)
441
+ if (double rho = L2Norm(p-x); rho > 0)
442
+ {
443
+ Vec<3> drhodp = 1.0/rho * (p-x);
444
+ Complex dGdrho = c*(1/(4*M_PI))*exp(Complex(0,rho*mp.Kappa())) *
445
+ (Complex(0, mp.Kappa())/rho - 1.0/sqr(rho));
446
+ sum += dGdrho * InnerProduct(drhodp, d);
447
+ }
448
+
449
+ return sum;
450
+ }
451
+
452
+ void CalcTotalSources()
453
+ {
454
+ total_sources = charges.Size() + dipoles.Size();
455
+ for (auto & child : childs)
456
+ if (child)
457
+ {
458
+ child->CalcTotalSources();
459
+ total_sources += child->total_sources;
460
+ }
461
+ }
462
+
463
+ void CalcMP()
464
+ {
465
+ mp.SH().Coefs() = 0.0;
466
+ if (childs[0])
467
+ {
468
+ if (total_sources < 1000)
469
+ for (auto & child : childs)
470
+ child->CalcMP();
471
+ else
472
+ ParallelFor (8, [&] (int nr)
473
+ {
474
+ childs[nr] -> CalcMP();
475
+ });
476
+
477
+
478
+ for (auto & child : childs)
479
+ child->mp.TransformAdd(mp, center-child->center);
480
+ }
481
+ else
482
+ {
483
+ if (charges.Size()+dipoles.Size() == 0)
484
+ {
485
+ mp = MultiPole<MPSingular> (-1, mp.Kappa());
486
+ return;
487
+ }
488
+
489
+ for (auto [x,c] : charges)
490
+ mp.AddCharge (x-center,c);
491
+
492
+ for (auto [x,d,c] : dipoles)
493
+ mp.AddDipole (x-center, d, c);
494
+ }
495
+ }
496
+
497
+ Complex EvaluateMP(Vec<3> p) const
498
+ {
499
+ if (charges.Size() || dipoles.Size())
500
+ return Evaluate(p);
501
+
502
+ if (L2Norm(p-center) > 3*r)
503
+ return mp.Eval(p-center);
504
+
505
+ if (!childs[0]) // || level==1)
506
+ return Evaluate(p);
507
+
508
+ Complex sum = 0.0;
509
+ for (auto & child : childs)
510
+ sum += child->EvaluateMP(p);
511
+ return sum;
512
+ }
513
+
514
+
515
+ void Print (ostream & ost) const
516
+ {
517
+ ost << "c = " << center << ", r = " << r << endl;
518
+ // for (int i = 0; i < loc_pnts.Size(); i++)
519
+ for (auto [x,c] : charges)
520
+ ost << "xi = " << x << ", ci = " << c << endl;
521
+
522
+ for (int i = 0; i < 8; i++)
523
+ if (childs[i]) childs[i] -> Print (ost);
524
+ }
525
+
526
+ double Norm () const
527
+ {
528
+ double norm = L2Norm(mp.SH().Coefs());
529
+ if (childs[0])
530
+ for (auto & ch : childs)
531
+ norm += ch->Norm();
532
+ return norm;
533
+ }
534
+
535
+ size_t NumCoefficients() const
536
+ {
537
+ size_t num = sqr(mp.SH().Order()+1);
538
+ if (childs[0])
539
+ for (auto & ch : childs)
540
+ num += ch->NumCoefficients();
541
+ return num;
542
+ }
543
+ };
544
+
545
+ Node root;
546
+ bool havemp = false;
547
+
548
+ public:
549
+ SingularMLMultiPole (Vec<3> center, double r, int order, double kappa)
550
+ : root(center, r, 0, order, kappa)
551
+ {
552
+ nodes_on_level = 0;
553
+ nodes_on_level[0] = 1;
554
+ }
555
+
556
+ double Kappa() const { return root.mp.Kappa(); }
557
+
558
+ void AddCharge(Vec<3> x, Complex c)
559
+ {
560
+ root.AddCharge(x, c);
561
+ }
562
+
563
+ void AddDipole(Vec<3> x, Vec<3> d, Complex c)
564
+ {
565
+ root.AddDipole(x, d, c);
566
+ }
567
+
568
+ void Print (ostream & ost) const
569
+ {
570
+ root.Print(ost);
571
+ }
572
+
573
+ double Norm() const
574
+ {
575
+ return root.Norm();
576
+ }
577
+
578
+ size_t NumCoefficients() const
579
+ {
580
+ return root.NumCoefficients();
581
+ }
582
+
583
+ void CalcMP()
584
+ {
585
+ static Timer t("mptool compute singular MLMP"); RegionTimer rg(t);
586
+
587
+ /*
588
+ int maxlevel = 0;
589
+ for (auto [i,num] : Enumerate(nodes_on_level))
590
+ if (num > 0) maxlevel = i;
591
+
592
+ for (int i = 0; i <= maxlevel; i++)
593
+ cout << "sing " << i << ": " << nodes_on_level[i] << endl;
594
+ */
595
+ root.CalcTotalSources();
596
+ root.CalcMP();
597
+
598
+ havemp = true;
599
+ }
600
+
601
+ Complex Evaluate (Vec<3> p) const
602
+ {
603
+ if (havemp)
604
+ return root.EvaluateMP(p);
605
+ else
606
+ return root.Evaluate(p);
607
+ }
608
+
609
+ friend class RegularMLMultiPole;
610
+ };
611
+
612
+
613
+ inline ostream & operator<< (ostream & ost, const SingularMLMultiPole & mlmp)
614
+ {
615
+ mlmp.Print(ost);
616
+ return ost;
617
+ }
618
+
619
+
620
+ class NGS_DLL_HEADER RegularMLMultiPole
621
+ {
622
+ static Array<size_t> nodes_on_level;
623
+
624
+ struct Node
625
+ {
626
+ Vec<3> center;
627
+ double r;
628
+ int level;
629
+ std::array<unique_ptr<Node>,8> childs;
630
+ MultiPole<MPRegular> mp;
631
+ Array<Vec<3>> targets;
632
+ int total_targets;
633
+
634
+ Array<const SingularMLMultiPole::Node*> singnodes;
635
+
636
+ Node (Vec<3> acenter, double ar, int alevel, int order, double kappa)
637
+ : center(acenter), r(ar), level(alevel), mp(MPOrder(ar*kappa), kappa, 1.0/min(1.0, 0.25*r*kappa))
638
+ // : center(acenter), r(ar), level(alevel), mp(MPOrder(ar*kappa), kappa, 1.0)
639
+ {
640
+ if (level < nodes_on_level.Size())
641
+ nodes_on_level[level]++;
642
+ }
643
+
644
+
645
+ void CreateChilds()
646
+ {
647
+ if (childs[0]) throw Exception("have already childs");
648
+ // create children nodes:
649
+ for (int i = 0; i < 8; i++)
650
+ {
651
+ Vec<3> cc = center;
652
+ cc(0) += (i&1) ? r/2 : -r/2;
653
+ cc(1) += (i&2) ? r/2 : -r/2;
654
+ cc(2) += (i&4) ? r/2 : -r/2;
655
+ childs[i] = make_unique<Node> (cc, r/2, level+1, max(mp.SH().Order()/2, 8), mp.Kappa());
656
+ }
657
+ }
658
+
659
+ void AddSingularNode (const SingularMLMultiPole::Node & singnode, bool allow_refine)
660
+ {
661
+ if (mp.SH().Order() < 0) return;
662
+ if (singnode.mp.SH().Order() < 0) return;
663
+ if (L2Norm(singnode.mp.SH().Coefs()) == 0) return;
664
+ if (level > 20)
665
+ {
666
+ singnodes.Append(&singnode);
667
+ return;
668
+ }
669
+
670
+ // static Timer t("AddSingularNode"); RegionTimer reg(t);
671
+
672
+ Vec<3> dist = center-singnode.center;
673
+
674
+ // if (L2Norm(dist)*mp.Kappa() > (mp.Order()+singnode.mp.Order()))
675
+ if (L2Norm(dist) > 2*(r + singnode.r))
676
+ {
677
+ if (singnode.mp.Order() > 2 * mp.Order() &&
678
+ singnode.childs[0] &&
679
+ singnode.childs[0]->mp.Order() < singnode.mp.Order())
680
+ {
681
+ for (auto & child : singnode.childs)
682
+ AddSingularNode (*child, allow_refine);
683
+ return;
684
+ }
685
+
686
+ // static Timer t("mptool transform Helmholtz-criterion"); RegionTimer r(t);
687
+ singnode.mp.TransformAdd(mp, dist);
688
+ return;
689
+ }
690
+
691
+
692
+ if ( singnode.childs[0]==nullptr )
693
+ {
694
+ singnodes.Append(&singnode);
695
+ return;
696
+ }
697
+
698
+ if (r > singnode.r)
699
+ {
700
+ if (allow_refine)
701
+ {
702
+ if (!childs[0])
703
+ CreateChilds();
704
+
705
+ for (auto & ch : childs)
706
+ ch -> AddSingularNode (singnode, allow_refine);
707
+ }
708
+ else
709
+ {
710
+ if (total_targets < 1000)
711
+ {
712
+ for (auto & ch : childs)
713
+ if (ch)
714
+ ch -> AddSingularNode (singnode, allow_refine);
715
+ }
716
+ else
717
+ ParallelFor (8, [&] (int nr)
718
+ {
719
+ if (childs[nr])
720
+ childs[nr] -> AddSingularNode (singnode, allow_refine);
721
+ });
722
+
723
+ if (targets.Size())
724
+ singnodes.Append(&singnode);
725
+ }
726
+ }
727
+ else
728
+ {
729
+ for (auto & childsing : singnode.childs)
730
+ AddSingularNode (*childsing, allow_refine);
731
+ }
732
+ }
733
+
734
+ void LocalizeExpansion(bool allow_refine)
735
+ {
736
+ if (allow_refine)
737
+ if (mp.Order() > 20 && !childs[0])
738
+ CreateChilds();
739
+
740
+ if (childs[0])
741
+ {
742
+ for (auto & ch : childs)
743
+ {
744
+ if (L2Norm(mp.SH().Coefs()) > 0)
745
+ mp.TransformAdd (ch->mp, ch->center-center);
746
+ ch->LocalizeExpansion(allow_refine);
747
+ }
748
+ mp = MultiPole<MPRegular>(-1, mp.Kappa());
749
+ //mp.SH().Coefs()=0.0;
750
+ }
751
+ }
752
+
753
+ Complex Evaluate (Vec<3> p) const
754
+ {
755
+ // *testout << "eval p = " << p << ", level = " << level << ", center = " << center << ", r = " << r << endl;
756
+ Complex sum = 0.0;
757
+ /*
758
+ if (childs[0])
759
+ {
760
+ int childnum = 0;
761
+ if (p(0) > center(0)) childnum += 1;
762
+ if (p(1) > center(1)) childnum += 2;
763
+ if (p(2) > center(2)) childnum += 4;
764
+ sum = childs[childnum]->Evaluate(p);
765
+ }
766
+ */
767
+ int childnum = 0;
768
+ if (p(0) > center(0)) childnum += 1;
769
+ if (p(1) > center(1)) childnum += 2;
770
+ if (p(2) > center(2)) childnum += 4;
771
+ if (childs[childnum])
772
+ sum = childs[childnum]->Evaluate(p);
773
+ else
774
+ sum = mp.Eval(p-center);
775
+
776
+
777
+ static Timer t("mptool direct evaluate"); RegionTimer r(t);
778
+ for (auto sn : singnodes)
779
+ sum += sn->EvaluateMP(p);
780
+
781
+ return sum;
782
+ }
783
+
784
+ double Norm() const
785
+ {
786
+ double norm = L2Norm(mp.SH().Coefs());
787
+ if (childs[0])
788
+ for (auto & ch : childs)
789
+ norm += ch->Norm();
790
+ return norm;
791
+ }
792
+
793
+ size_t NumCoefficients() const
794
+ {
795
+ size_t num = sqr(mp.SH().Order()+1);
796
+ if (childs[0])
797
+ for (auto & ch : childs)
798
+ num += ch->NumCoefficients();
799
+ return num;
800
+ }
801
+
802
+ void AddTarget (Vec<3> x)
803
+ {
804
+ if (childs[0])
805
+ {
806
+ // directly send to childs:
807
+ int childnum = 0;
808
+ if (x(0) > center(0)) childnum += 1;
809
+ if (x(1) > center(1)) childnum += 2;
810
+ if (x(2) > center(2)) childnum += 4;
811
+ childs[childnum] -> AddTarget( x );
812
+ return;
813
+ }
814
+
815
+ targets.Append( x );
816
+
817
+ if (r*mp.Kappa() < 1e-8) return;
818
+ if (targets.Size() < maxdirect && r*mp.Kappa() < 1)
819
+ return;
820
+
821
+ CreateChilds();
822
+
823
+ for (auto t : targets)
824
+ AddTarget (t);
825
+ targets.SetSize0();
826
+ }
827
+
828
+ void CalcTotalTargets()
829
+ {
830
+ total_targets = targets.Size();
831
+ for (auto & child : childs)
832
+ if (child)
833
+ {
834
+ child->CalcTotalTargets();
835
+ total_targets += child->total_targets;
836
+ }
837
+ }
838
+
839
+ void RemoveEmptyTrees()
840
+ {
841
+ for (auto & child : childs)
842
+ if (child)
843
+ {
844
+ child->RemoveEmptyTrees();
845
+ // if (child->total_targets == 0)
846
+ // child = nullptr;
847
+ }
848
+
849
+ if (total_targets == 0)
850
+ mp = MultiPole<MPRegular>(-1, mp.Kappa());
851
+ }
852
+
853
+ };
854
+
855
+ Node root;
856
+ shared_ptr<SingularMLMultiPole> singmp;
857
+
858
+ public:
859
+ RegularMLMultiPole (shared_ptr<SingularMLMultiPole> asingmp, Vec<3> center, double r, int order)
860
+ : root(center, r, 0, order, asingmp->Kappa()), singmp(asingmp)
861
+ {
862
+ if (!singmp->havemp) throw Exception("first call Calc for singular MP");
863
+
864
+ nodes_on_level = 0;
865
+ nodes_on_level[0] = 1;
866
+ {
867
+ static Timer t("mptool compute regular MLMP"); RegionTimer rg(t);
868
+ root.AddSingularNode(singmp->root, true);
869
+ // cout << "norm after S->R conversion: " << root.Norm() << endl;
870
+ }
871
+
872
+
873
+ /*
874
+ int maxlevel = 0;
875
+ for (auto [i,num] : Enumerate(nodes_on_level))
876
+ if (num > 0) maxlevel = i;
877
+
878
+ for (int i = 0; i <= maxlevel; i++)
879
+ cout << "reg " << i << ": " << nodes_on_level[i] << endl;
880
+ */
881
+
882
+ {
883
+ static Timer t("mptool expand regular MLMP"); RegionTimer rg(t);
884
+ root.LocalizeExpansion(true);
885
+ // cout << "norm after local expansion: " << root.Norm() << endl;
886
+ }
887
+ }
888
+
889
+ RegularMLMultiPole (Vec<3> center, double r, int order, double kappa)
890
+ : root(center, r, 0, order, kappa)
891
+ {
892
+ nodes_on_level = 0;
893
+ nodes_on_level[0] = 1;
894
+ }
895
+
896
+ void AddTarget (Vec<3> t)
897
+ {
898
+ root.AddTarget (t);
899
+ }
900
+
901
+ void CalcMP(shared_ptr<SingularMLMultiPole> asingmp)
902
+ {
903
+ singmp = asingmp;
904
+
905
+ root.CalcTotalTargets();
906
+ root.RemoveEmptyTrees();
907
+
908
+ root.AddSingularNode(singmp->root, false);
909
+
910
+ /*
911
+ int maxlevel = 0;
912
+ for (auto [i,num] : Enumerate(RegularMLMultiPole::nodes_on_level))
913
+ if (num > 0) maxlevel = i;
914
+
915
+ for (int i = 0; i <= maxlevel; i++)
916
+ cout << "reg " << i << ": " << RegularMLMultiPole::nodes_on_level[i] << endl;
917
+ */
918
+
919
+ root.LocalizeExpansion(false);
920
+ }
921
+
922
+ double Norm() const
923
+ {
924
+ return root.Norm();
925
+ }
926
+
927
+ size_t NumCoefficients() const
928
+ {
929
+ return root.NumCoefficients();
930
+ }
931
+
932
+ Complex Evaluate (Vec<3> p) const
933
+ {
934
+ // static Timer t("mptool Eval MLMP regular"); RegionTimer r(t);
935
+ if (L2Norm(p-root.center) > root.r) return 0.0;
936
+ return root.Evaluate(p);
937
+ }
938
+
939
+
940
+ };
941
+
942
+
943
+
944
+
945
+
946
+
947
+
948
+ // ******************** Coefficient Functions *********************
949
+
950
+
951
+ class SphericalHarmonicsCF : public CoefficientFunction
952
+ {
953
+ SphericalHarmonics sh;
954
+ public:
955
+ SphericalHarmonicsCF (int order)
956
+ : CoefficientFunction(1, true), sh(order) { }
957
+ Complex & Coef(int n, int m) { return sh.Coef(n,m); }
958
+
959
+ virtual double Evaluate (const BaseMappedIntegrationPoint & ip) const override
960
+ { throw Exception("real eval not available"); }
961
+
962
+ virtual void Evaluate (const BaseMappedIntegrationPoint & mip, FlatVector<Complex> values) const override
963
+ {
964
+ values(0) = sh.Eval(mip.GetPoint());
965
+ }
966
+
967
+ virtual void Evaluate (const BaseMappedIntegrationRule & ir, BareSliceMatrix<Complex> values) const override
968
+ {
969
+ for (int i = 0; i < ir.Size(); i++)
970
+ {
971
+ auto & mip = ir[i];
972
+ values(i,0) = sh.Eval(mip.GetPoint());
973
+ }
974
+ }
975
+
976
+ auto & SH() { return sh; }
977
+ };
978
+
979
+
980
+
981
+ template <typename RADIAL>
982
+ class MultiPoleCF : public CoefficientFunction
983
+ {
984
+ MultiPole<RADIAL> mp;
985
+ Vec<3> center;
986
+ public:
987
+ MultiPoleCF (int order, double kappa, Vec<3> acenter, double scale = 1)
988
+ : CoefficientFunction(1, true), mp(order, kappa, scale), center(acenter) { }
989
+
990
+ Complex & Coef(int n, int m) { return mp.Coef(n,m); }
991
+ auto & SH() { return mp.SH(); }
992
+ auto & MP() { return mp; }
993
+ Vec<3> Center() const { return center; }
994
+
995
+ virtual double Evaluate (const BaseMappedIntegrationPoint & ip) const override
996
+ { throw Exception("real eval not available"); }
997
+
998
+ virtual void Evaluate (const BaseMappedIntegrationPoint & mip, FlatVector<Complex> values) const override
999
+ {
1000
+ values(0) = mp.Eval(mip.GetPoint()-center);
1001
+ }
1002
+
1003
+ template <typename TARGET>
1004
+ void ShiftZ (double z, MultiPole<TARGET> & target) { mp.ShiftZ(z, target); }
1005
+
1006
+ using CoefficientFunction::Transform;
1007
+ template <typename TARGET>
1008
+ void Transform (MultiPoleCF<TARGET> & target)
1009
+ {
1010
+ mp.Transform (target.MP(), target.Center()-center);
1011
+ }
1012
+ };
1013
+
1014
+
1015
+ class SingularMLMultiPoleCF : public CoefficientFunction
1016
+ {
1017
+ shared_ptr<SingularMLMultiPole> mlmp;
1018
+ public:
1019
+ SingularMLMultiPoleCF (Vec<3> center, double r, int order, double kappa)
1020
+ : CoefficientFunction(1, true), mlmp{make_shared<SingularMLMultiPole>(center, r, order, kappa)} { }
1021
+
1022
+ virtual double Evaluate (const BaseMappedIntegrationPoint & ip) const override
1023
+ { throw Exception("real eval not available"); }
1024
+
1025
+ virtual void Evaluate (const BaseMappedIntegrationPoint & mip, FlatVector<Complex> values) const override
1026
+ {
1027
+ values(0) = mlmp->Evaluate(mip.GetPoint());
1028
+ }
1029
+
1030
+ shared_ptr<SingularMLMultiPole> MLMP() { return mlmp; }
1031
+ };
1032
+
1033
+
1034
+ class RegularMLMultiPoleCF : public CoefficientFunction
1035
+ {
1036
+ RegularMLMultiPole mlmp;
1037
+ public:
1038
+ RegularMLMultiPoleCF (shared_ptr<SingularMLMultiPoleCF> asingmp, Vec<3> center, double r, int order)
1039
+ : CoefficientFunction(1, true), mlmp(asingmp->MLMP(), center, r, order) { }
1040
+
1041
+ virtual double Evaluate (const BaseMappedIntegrationPoint & ip) const override
1042
+ { throw Exception("real eval not available"); }
1043
+
1044
+ virtual void Evaluate (const BaseMappedIntegrationPoint & mip, FlatVector<Complex> values) const override
1045
+ {
1046
+ values(0) = mlmp.Evaluate(mip.GetPoint());
1047
+ }
1048
+
1049
+ RegularMLMultiPole & MLMP() { return mlmp; }
1050
+ };
1051
+
1052
+
1053
+ }
1054
+ #endif