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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (306) hide show
  1. ngsolve-6.2.2506.post216.dev0.data/data/bin/ngs_nvcc +22 -0
  2. ngsolve-6.2.2506.post216.dev0.data/data/bin/ngs_nvlink +17 -0
  3. ngsolve-6.2.2506.post216.dev0.data/data/bin/ngscxx +15 -0
  4. ngsolve-6.2.2506.post216.dev0.data/data/bin/ngsld +11 -0
  5. ngsolve-6.2.2506.post216.dev0.data/data/bin/ngsolve.tcl +648 -0
  6. ngsolve-6.2.2506.post216.dev0.data/data/bin/ngspy +2 -0
  7. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/analytic_integrals.hpp +10 -0
  8. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/arnoldi.hpp +55 -0
  9. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/bandmatrix.hpp +334 -0
  10. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/basematrix.hpp +963 -0
  11. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/basevector.hpp +1268 -0
  12. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/bdbequations.hpp +2807 -0
  13. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/bdbintegrator.hpp +1660 -0
  14. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/bem_diffops.hpp +475 -0
  15. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/bessel.hpp +1064 -0
  16. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/bilinearform.hpp +966 -0
  17. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/bla.hpp +29 -0
  18. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/blockalloc.hpp +95 -0
  19. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/blockjacobi.hpp +328 -0
  20. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/bspline.hpp +116 -0
  21. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/calcinverse.hpp +141 -0
  22. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/cg.hpp +368 -0
  23. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/chebyshev.hpp +44 -0
  24. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/cholesky.hpp +720 -0
  25. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/clapack.h +7254 -0
  26. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/code_generation.hpp +296 -0
  27. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/coefficient.hpp +2033 -0
  28. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/coefficient_impl.hpp +19 -0
  29. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/coefficient_stdmath.hpp +167 -0
  30. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/commutingAMG.hpp +106 -0
  31. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/comp.hpp +79 -0
  32. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/compatibility.hpp +41 -0
  33. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/complex_wrapper.hpp +101 -0
  34. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/compressedfespace.hpp +110 -0
  35. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/contact.hpp +239 -0
  36. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/cuda_core.hpp +216 -0
  37. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/cuda_linalg.hpp +185 -0
  38. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/cuda_ngbla.hpp +317 -0
  39. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/cuda_ngstd.hpp +414 -0
  40. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/cuda_profiler.hpp +240 -0
  41. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/diagonalmatrix.hpp +160 -0
  42. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/differentialoperator.hpp +276 -0
  43. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/diffop.hpp +1286 -0
  44. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/diffop_impl.hpp +328 -0
  45. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/diffopwithfactor.hpp +123 -0
  46. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/discontinuous.hpp +84 -0
  47. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/dump.hpp +949 -0
  48. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/ectypes.hpp +121 -0
  49. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/eigen.hpp +60 -0
  50. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/eigensystem.hpp +18 -0
  51. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/elasticity_equations.hpp +595 -0
  52. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/elementbyelement.hpp +201 -0
  53. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/elementtopology.hpp +1760 -0
  54. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/elementtransformation.hpp +339 -0
  55. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/evalfunc.hpp +405 -0
  56. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/expr.hpp +1693 -0
  57. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/facetfe.hpp +175 -0
  58. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/facetfespace.hpp +180 -0
  59. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/facethofe.hpp +111 -0
  60. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/facetsurffespace.hpp +112 -0
  61. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/fe_interfaces.hpp +32 -0
  62. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/fem.hpp +87 -0
  63. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/fesconvert.hpp +14 -0
  64. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/fespace.hpp +1454 -0
  65. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/finiteelement.hpp +286 -0
  66. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/globalinterfacespace.hpp +77 -0
  67. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/globalspace.hpp +115 -0
  68. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/gridfunction.hpp +525 -0
  69. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/h1amg.hpp +124 -0
  70. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/h1hofe.hpp +188 -0
  71. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/h1hofe_impl.hpp +1262 -0
  72. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/h1hofefo.hpp +148 -0
  73. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/h1hofefo_impl.hpp +185 -0
  74. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/h1hofespace.hpp +167 -0
  75. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/h1lofe.hpp +1240 -0
  76. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/h1lumping.hpp +41 -0
  77. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/hcurl_equations.hpp +1381 -0
  78. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/hcurlcurlfe.hpp +2241 -0
  79. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/hcurlcurlfespace.hpp +78 -0
  80. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/hcurlfe.hpp +259 -0
  81. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/hcurlfe_utils.hpp +107 -0
  82. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/hcurlhdiv_dshape.hpp +857 -0
  83. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/hcurlhdivfes.hpp +308 -0
  84. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/hcurlhofe.hpp +175 -0
  85. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/hcurlhofe_impl.hpp +1871 -0
  86. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/hcurlhofespace.hpp +193 -0
  87. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/hcurllofe.hpp +1146 -0
  88. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/hdiv_equations.hpp +880 -0
  89. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/hdivdivfe.hpp +2923 -0
  90. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/hdivdivsurfacespace.hpp +76 -0
  91. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/hdivfe.hpp +206 -0
  92. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/hdivfe_utils.hpp +717 -0
  93. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/hdivfes.hpp +75 -0
  94. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/hdivhofe.hpp +447 -0
  95. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/hdivhofe_impl.hpp +1107 -0
  96. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/hdivhofefo.hpp +229 -0
  97. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/hdivhofespace.hpp +177 -0
  98. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/hdivhosurfacefespace.hpp +106 -0
  99. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/hdivlofe.hpp +773 -0
  100. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/hidden.hpp +74 -0
  101. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/householder.hpp +181 -0
  102. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/hypre_ams_precond.hpp +123 -0
  103. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/hypre_precond.hpp +73 -0
  104. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/integrator.hpp +2012 -0
  105. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/integratorcf.hpp +253 -0
  106. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/interpolate.hpp +49 -0
  107. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/intrule.hpp +2542 -0
  108. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/intrules_SauterSchwab.hpp +25 -0
  109. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/irspace.hpp +49 -0
  110. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/jacobi.hpp +153 -0
  111. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/kernels.hpp +724 -0
  112. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/l2hofe.hpp +194 -0
  113. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/l2hofe_impl.hpp +564 -0
  114. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/l2hofefo.hpp +542 -0
  115. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/l2hofespace.hpp +344 -0
  116. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/la.hpp +38 -0
  117. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/linalg_kernels.hpp +70 -0
  118. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/linearform.hpp +266 -0
  119. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/matrix.hpp +2145 -0
  120. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/memusage.hpp +41 -0
  121. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/meshaccess.hpp +1359 -0
  122. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/mgpre.hpp +204 -0
  123. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/mp_coefficient.hpp +145 -0
  124. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/mptools.hpp +2281 -0
  125. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/multigrid.hpp +42 -0
  126. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/multivector.hpp +447 -0
  127. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/mumpsinverse.hpp +187 -0
  128. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/mycomplex.hpp +361 -0
  129. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/ng_lapack.hpp +1661 -0
  130. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/ngblas.hpp +1232 -0
  131. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/ngs_defines.hpp +30 -0
  132. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/ngs_stdcpp_include.hpp +106 -0
  133. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/ngs_utils.hpp +121 -0
  134. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/ngsobject.hpp +1019 -0
  135. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/ngsstream.hpp +113 -0
  136. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/ngstd.hpp +72 -0
  137. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/nodalhofe.hpp +96 -0
  138. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/nodalhofe_impl.hpp +141 -0
  139. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/normalfacetfe.hpp +223 -0
  140. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/normalfacetfespace.hpp +98 -0
  141. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/normalfacetsurfacefespace.hpp +84 -0
  142. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/order.hpp +251 -0
  143. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/parallel_matrices.hpp +222 -0
  144. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/paralleldofs.hpp +340 -0
  145. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/parallelngs.hpp +23 -0
  146. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/parallelvector.hpp +269 -0
  147. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/pardisoinverse.hpp +200 -0
  148. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/periodic.hpp +129 -0
  149. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/plateaufespace.hpp +25 -0
  150. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/pml.hpp +275 -0
  151. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/pmltrafo.hpp +631 -0
  152. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/postproc.hpp +142 -0
  153. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/potentialtools.hpp +22 -0
  154. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/precomp.hpp +60 -0
  155. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/preconditioner.hpp +602 -0
  156. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/prolongation.hpp +380 -0
  157. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/python_comp.hpp +107 -0
  158. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/python_fem.hpp +89 -0
  159. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/python_linalg.hpp +58 -0
  160. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/python_ngstd.hpp +386 -0
  161. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/recursive_pol.hpp +4896 -0
  162. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/recursive_pol_tet.hpp +395 -0
  163. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/recursive_pol_trig.hpp +492 -0
  164. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/reorderedfespace.hpp +81 -0
  165. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/sample_sort.hpp +105 -0
  166. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/scalarfe.hpp +335 -0
  167. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/shapefunction_utils.hpp +113 -0
  168. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/simd_complex.hpp +329 -0
  169. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/smoother.hpp +253 -0
  170. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/solve.hpp +89 -0
  171. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/sparsecholesky.hpp +317 -0
  172. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/sparsefactorization_interface.hpp +159 -0
  173. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/sparsematrix.hpp +1052 -0
  174. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/sparsematrix_dyn.hpp +90 -0
  175. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/sparsematrix_impl.hpp +1055 -0
  176. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/special_matrix.hpp +463 -0
  177. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/specialelement.hpp +125 -0
  178. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/statushandler.hpp +33 -0
  179. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/stringops.hpp +12 -0
  180. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/superluinverse.hpp +136 -0
  181. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/symbolicintegrator.hpp +850 -0
  182. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/symmetricmatrix.hpp +144 -0
  183. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/tangentialfacetfe.hpp +224 -0
  184. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/tangentialfacetfespace.hpp +91 -0
  185. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/tensor.hpp +522 -0
  186. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/tensorcoefficient.hpp +446 -0
  187. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/tensorproductintegrator.hpp +113 -0
  188. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/thcurlfe.hpp +128 -0
  189. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/thcurlfe_impl.hpp +380 -0
  190. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/thdivfe.hpp +80 -0
  191. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/thdivfe_impl.hpp +492 -0
  192. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/tpdiffop.hpp +461 -0
  193. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/tpfes.hpp +133 -0
  194. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/tpintrule.hpp +224 -0
  195. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/triangular.hpp +465 -0
  196. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/tscalarfe.hpp +245 -0
  197. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/tscalarfe_impl.hpp +1029 -0
  198. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/umfpackinverse.hpp +148 -0
  199. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/unifiedvector.hpp +103 -0
  200. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/vector.hpp +1452 -0
  201. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/voxelcoefficientfunction.hpp +41 -0
  202. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/vtkoutput.hpp +198 -0
  203. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/vvector.hpp +208 -0
  204. ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/webgui.hpp +92 -0
  205. ngsolve-6.2.2506.post216.dev0.data/data/lib/cmake/ngsolve/NGSolveConfig.cmake +102 -0
  206. ngsolve-6.2.2506.post216.dev0.data/data/lib/cmake/ngsolve/ngsolve-targets-release.cmake +89 -0
  207. ngsolve-6.2.2506.post216.dev0.data/data/lib/cmake/ngsolve/ngsolve-targets.cmake +180 -0
  208. ngsolve-6.2.2506.post216.dev0.data/data/lib/python3.14/site-packages/netgen_mesher.libs/libngbla.so +0 -0
  209. ngsolve-6.2.2506.post216.dev0.data/data/lib/python3.14/site-packages/netgen_mesher.libs/libngcomp.so +0 -0
  210. ngsolve-6.2.2506.post216.dev0.data/data/lib/python3.14/site-packages/netgen_mesher.libs/libngfem.so +0 -0
  211. ngsolve-6.2.2506.post216.dev0.data/data/lib/python3.14/site-packages/netgen_mesher.libs/libngla.so +0 -0
  212. ngsolve-6.2.2506.post216.dev0.data/data/lib/python3.14/site-packages/netgen_mesher.libs/libngsbem.so +0 -0
  213. ngsolve-6.2.2506.post216.dev0.data/data/lib/python3.14/site-packages/netgen_mesher.libs/libngscudalib.so +0 -0
  214. ngsolve-6.2.2506.post216.dev0.data/data/lib/python3.14/site-packages/netgen_mesher.libs/libngsolve.so +0 -0
  215. ngsolve-6.2.2506.post216.dev0.data/data/lib/python3.14/site-packages/netgen_mesher.libs/libngstd.so +0 -0
  216. ngsolve-6.2.2506.post216.dev0.data/data/lib/python3.14/site-packages/ngsolve/TensorProductTools.py +210 -0
  217. ngsolve-6.2.2506.post216.dev0.data/data/lib/python3.14/site-packages/ngsolve/__console.py +94 -0
  218. ngsolve-6.2.2506.post216.dev0.data/data/lib/python3.14/site-packages/ngsolve/__expr.py +181 -0
  219. ngsolve-6.2.2506.post216.dev0.data/data/lib/python3.14/site-packages/ngsolve/__init__.py +148 -0
  220. ngsolve-6.2.2506.post216.dev0.data/data/lib/python3.14/site-packages/ngsolve/_scikit_build_core_dependencies.py +30 -0
  221. ngsolve-6.2.2506.post216.dev0.data/data/lib/python3.14/site-packages/ngsolve/bvp.py +78 -0
  222. ngsolve-6.2.2506.post216.dev0.data/data/lib/python3.14/site-packages/ngsolve/config/__init__.py +1 -0
  223. ngsolve-6.2.2506.post216.dev0.data/data/lib/python3.14/site-packages/ngsolve/config/__main__.py +4 -0
  224. ngsolve-6.2.2506.post216.dev0.data/data/lib/python3.14/site-packages/ngsolve/config/config.py +60 -0
  225. ngsolve-6.2.2506.post216.dev0.data/data/lib/python3.14/site-packages/ngsolve/demos/TensorProduct/__init__.py +0 -0
  226. ngsolve-6.2.2506.post216.dev0.data/data/lib/python3.14/site-packages/ngsolve/demos/TensorProduct/tp_dg_1d_1d.py +80 -0
  227. ngsolve-6.2.2506.post216.dev0.data/data/lib/python3.14/site-packages/ngsolve/demos/TensorProduct/tp_dg_1d_2d.py +73 -0
  228. ngsolve-6.2.2506.post216.dev0.data/data/lib/python3.14/site-packages/ngsolve/demos/TensorProduct/tp_dg_2d_1d.py +72 -0
  229. ngsolve-6.2.2506.post216.dev0.data/data/lib/python3.14/site-packages/ngsolve/demos/TensorProduct/tp_dg_2d_2d.py +66 -0
  230. ngsolve-6.2.2506.post216.dev0.data/data/lib/python3.14/site-packages/ngsolve/demos/__init__.py +0 -0
  231. ngsolve-6.2.2506.post216.dev0.data/data/lib/python3.14/site-packages/ngsolve/demos/howto/__init__.py +0 -0
  232. ngsolve-6.2.2506.post216.dev0.data/data/lib/python3.14/site-packages/ngsolve/demos/howto/hhj.py +44 -0
  233. ngsolve-6.2.2506.post216.dev0.data/data/lib/python3.14/site-packages/ngsolve/demos/howto/hybrid_dg.py +53 -0
  234. ngsolve-6.2.2506.post216.dev0.data/data/lib/python3.14/site-packages/ngsolve/demos/howto/mixed.py +30 -0
  235. ngsolve-6.2.2506.post216.dev0.data/data/lib/python3.14/site-packages/ngsolve/demos/howto/nonlin.py +29 -0
  236. ngsolve-6.2.2506.post216.dev0.data/data/lib/python3.14/site-packages/ngsolve/demos/howto/pickling.py +26 -0
  237. ngsolve-6.2.2506.post216.dev0.data/data/lib/python3.14/site-packages/ngsolve/demos/howto/pml.py +31 -0
  238. ngsolve-6.2.2506.post216.dev0.data/data/lib/python3.14/site-packages/ngsolve/demos/howto/taskmanager.py +20 -0
  239. ngsolve-6.2.2506.post216.dev0.data/data/lib/python3.14/site-packages/ngsolve/demos/howto/tdnns.py +47 -0
  240. ngsolve-6.2.2506.post216.dev0.data/data/lib/python3.14/site-packages/ngsolve/demos/howto/timeDG-skeleton.py +45 -0
  241. ngsolve-6.2.2506.post216.dev0.data/data/lib/python3.14/site-packages/ngsolve/demos/howto/timeDG.py +38 -0
  242. ngsolve-6.2.2506.post216.dev0.data/data/lib/python3.14/site-packages/ngsolve/demos/howto/timeDGlap.py +42 -0
  243. ngsolve-6.2.2506.post216.dev0.data/data/lib/python3.14/site-packages/ngsolve/demos/howto/timeDGwave.py +61 -0
  244. ngsolve-6.2.2506.post216.dev0.data/data/lib/python3.14/site-packages/ngsolve/demos/intro/__init__.py +0 -0
  245. ngsolve-6.2.2506.post216.dev0.data/data/lib/python3.14/site-packages/ngsolve/demos/intro/adaptive.py +123 -0
  246. ngsolve-6.2.2506.post216.dev0.data/data/lib/python3.14/site-packages/ngsolve/demos/intro/cmagnet.py +59 -0
  247. ngsolve-6.2.2506.post216.dev0.data/data/lib/python3.14/site-packages/ngsolve/demos/intro/elasticity.py +76 -0
  248. ngsolve-6.2.2506.post216.dev0.data/data/lib/python3.14/site-packages/ngsolve/demos/intro/navierstokes.py +74 -0
  249. ngsolve-6.2.2506.post216.dev0.data/data/lib/python3.14/site-packages/ngsolve/demos/intro/poisson.ipynb +170 -0
  250. ngsolve-6.2.2506.post216.dev0.data/data/lib/python3.14/site-packages/ngsolve/demos/intro/poisson.py +41 -0
  251. ngsolve-6.2.2506.post216.dev0.data/data/lib/python3.14/site-packages/ngsolve/demos/mpi/__init__.py +0 -0
  252. ngsolve-6.2.2506.post216.dev0.data/data/lib/python3.14/site-packages/ngsolve/demos/mpi/mpi_cmagnet.py +87 -0
  253. ngsolve-6.2.2506.post216.dev0.data/data/lib/python3.14/site-packages/ngsolve/demos/mpi/mpi_navierstokes.py +117 -0
  254. ngsolve-6.2.2506.post216.dev0.data/data/lib/python3.14/site-packages/ngsolve/demos/mpi/mpi_poisson.py +89 -0
  255. ngsolve-6.2.2506.post216.dev0.data/data/lib/python3.14/site-packages/ngsolve/demos/mpi/mpi_timeDG.py +82 -0
  256. ngsolve-6.2.2506.post216.dev0.data/data/lib/python3.14/site-packages/ngsolve/directsolvers.py +14 -0
  257. ngsolve-6.2.2506.post216.dev0.data/data/lib/python3.14/site-packages/ngsolve/eigenvalues.py +364 -0
  258. ngsolve-6.2.2506.post216.dev0.data/data/lib/python3.14/site-packages/ngsolve/internal.py +89 -0
  259. ngsolve-6.2.2506.post216.dev0.data/data/lib/python3.14/site-packages/ngsolve/krylovspace.py +1182 -0
  260. ngsolve-6.2.2506.post216.dev0.data/data/lib/python3.14/site-packages/ngsolve/meshes.py +748 -0
  261. ngsolve-6.2.2506.post216.dev0.data/data/lib/python3.14/site-packages/ngsolve/ngs2petsc.py +310 -0
  262. ngsolve-6.2.2506.post216.dev0.data/data/lib/python3.14/site-packages/ngsolve/ngscuda.so +0 -0
  263. ngsolve-6.2.2506.post216.dev0.data/data/lib/python3.14/site-packages/ngsolve/ngscxx.py +42 -0
  264. ngsolve-6.2.2506.post216.dev0.data/data/lib/python3.14/site-packages/ngsolve/ngslib.so +0 -0
  265. ngsolve-6.2.2506.post216.dev0.data/data/lib/python3.14/site-packages/ngsolve/nonlinearsolvers.py +203 -0
  266. ngsolve-6.2.2506.post216.dev0.data/data/lib/python3.14/site-packages/ngsolve/preconditioners.py +11 -0
  267. ngsolve-6.2.2506.post216.dev0.data/data/lib/python3.14/site-packages/ngsolve/solve_implementation.py +168 -0
  268. ngsolve-6.2.2506.post216.dev0.data/data/lib/python3.14/site-packages/ngsolve/solvers/__init__.py +7 -0
  269. ngsolve-6.2.2506.post216.dev0.data/data/lib/python3.14/site-packages/ngsolve/solvers/cudss.py +112 -0
  270. ngsolve-6.2.2506.post216.dev0.data/data/lib/python3.14/site-packages/ngsolve/timestepping.py +185 -0
  271. ngsolve-6.2.2506.post216.dev0.data/data/lib/python3.14/site-packages/ngsolve/timing.py +108 -0
  272. ngsolve-6.2.2506.post216.dev0.data/data/lib/python3.14/site-packages/ngsolve/utils.py +167 -0
  273. ngsolve-6.2.2506.post216.dev0.data/data/lib/python3.14/site-packages/ngsolve/webgui.py +671 -0
  274. ngsolve-6.2.2506.post216.dev0.data/data/share/ngsolve/beam.geo +17 -0
  275. ngsolve-6.2.2506.post216.dev0.data/data/share/ngsolve/beam.vol +240 -0
  276. ngsolve-6.2.2506.post216.dev0.data/data/share/ngsolve/chip.in2d +41 -0
  277. ngsolve-6.2.2506.post216.dev0.data/data/share/ngsolve/chip.vol +614 -0
  278. ngsolve-6.2.2506.post216.dev0.data/data/share/ngsolve/coil.geo +12 -0
  279. ngsolve-6.2.2506.post216.dev0.data/data/share/ngsolve/coil.vol +2560 -0
  280. ngsolve-6.2.2506.post216.dev0.data/data/share/ngsolve/coilshield.geo +24 -0
  281. ngsolve-6.2.2506.post216.dev0.data/data/share/ngsolve/coilshield.vol +3179 -0
  282. ngsolve-6.2.2506.post216.dev0.data/data/share/ngsolve/cube.geo +19 -0
  283. ngsolve-6.2.2506.post216.dev0.data/data/share/ngsolve/cube.vol +1832 -0
  284. ngsolve-6.2.2506.post216.dev0.data/data/share/ngsolve/d10_DGdoubleglazing.pde +50 -0
  285. ngsolve-6.2.2506.post216.dev0.data/data/share/ngsolve/d11_chip_nitsche.pde +40 -0
  286. ngsolve-6.2.2506.post216.dev0.data/data/share/ngsolve/d1_square.pde +43 -0
  287. ngsolve-6.2.2506.post216.dev0.data/data/share/ngsolve/d2_chip.pde +35 -0
  288. ngsolve-6.2.2506.post216.dev0.data/data/share/ngsolve/d3_helmholtz.pde +22 -0
  289. ngsolve-6.2.2506.post216.dev0.data/data/share/ngsolve/d4_cube.pde +46 -0
  290. ngsolve-6.2.2506.post216.dev0.data/data/share/ngsolve/d5_beam.pde +74 -0
  291. ngsolve-6.2.2506.post216.dev0.data/data/share/ngsolve/d6_shaft.pde +73 -0
  292. ngsolve-6.2.2506.post216.dev0.data/data/share/ngsolve/d7_coil.pde +50 -0
  293. ngsolve-6.2.2506.post216.dev0.data/data/share/ngsolve/d8_coilshield.pde +49 -0
  294. ngsolve-6.2.2506.post216.dev0.data/data/share/ngsolve/d9_hybridDG.pde +72 -0
  295. ngsolve-6.2.2506.post216.dev0.data/data/share/ngsolve/doubleglazing.in2d +27 -0
  296. ngsolve-6.2.2506.post216.dev0.data/data/share/ngsolve/doubleglazing.vol +737 -0
  297. ngsolve-6.2.2506.post216.dev0.data/data/share/ngsolve/piezo2d40round4.vol.gz +0 -0
  298. ngsolve-6.2.2506.post216.dev0.data/data/share/ngsolve/shaft.geo +73 -0
  299. ngsolve-6.2.2506.post216.dev0.data/data/share/ngsolve/shaft.vol +4291 -0
  300. ngsolve-6.2.2506.post216.dev0.data/data/share/ngsolve/square.in2d +17 -0
  301. ngsolve-6.2.2506.post216.dev0.data/data/share/ngsolve/square.vol +149 -0
  302. ngsolve-6.2.2506.post216.dev0.dist-info/METADATA +14 -0
  303. ngsolve-6.2.2506.post216.dev0.dist-info/RECORD +306 -0
  304. ngsolve-6.2.2506.post216.dev0.dist-info/WHEEL +5 -0
  305. ngsolve-6.2.2506.post216.dev0.dist-info/licenses/LICENSE +504 -0
  306. ngsolve-6.2.2506.post216.dev0.dist-info/top_level.txt +1 -0
@@ -0,0 +1,949 @@
1
+ #ifndef FILE_NGS_DUMP
2
+ #define FILE_NGS_DUMP
3
+
4
+ /*********************************************************************/
5
+ /* File: dump.hpp */
6
+ /* Author: Lukas Kogler */
7
+ /* Date: Sep. 2014 */
8
+ /*********************************************************************/
9
+
10
+ namespace ngstd
11
+ {
12
+
13
+ template <NODE_TYPE NT>
14
+ class key_trait { };
15
+
16
+ template <>
17
+ class key_trait<NT_VERTEX>
18
+ {
19
+ public:
20
+ typedef int TKEY;
21
+ };
22
+
23
+ template <>
24
+ class key_trait<NT_EDGE>
25
+ {
26
+ public:
27
+ typedef IVec<2> TKEY;
28
+ };
29
+
30
+ template <>
31
+ class key_trait<NT_FACE>
32
+ {
33
+ public:
34
+ typedef IVec<3> TKEY;
35
+ };
36
+
37
+ template <>
38
+ class key_trait<NT_CELL>
39
+ {
40
+ public:
41
+ typedef IVec<4> TKEY;
42
+ };
43
+
44
+
45
+ template <int N>
46
+ bool operator < (IVec<N> a, IVec<N> b)
47
+ {
48
+ for (int i = 0; i < N; i++)
49
+ {
50
+ if (a[i] < b[i]) return true;
51
+ if (a[i] > b[i]) return false;
52
+ }
53
+ return false;
54
+ }
55
+
56
+ /*
57
+ bool operator < (IVec<2> & nodea, IVec<2> & nodeb)
58
+ {
59
+ if(nodea[0] < nodeb[0])
60
+ return true;
61
+ else if(nodea[0] == nodeb[0] && nodea[1] < nodeb[1])
62
+ return true;
63
+ return false;
64
+ }
65
+
66
+ bool operator < (IVec<3> & nodea, IVec<3> & nodeb)
67
+ {
68
+ if(nodea[0] < nodeb[0])
69
+ return true;
70
+ else if(nodea[0] == nodeb[0])
71
+ {
72
+ if(nodea[1] < nodeb[1])
73
+ return true;
74
+ else if(nodea[1] == nodeb[1])
75
+ if(nodea[2] < nodeb[2])
76
+ return true;
77
+ }
78
+ return false;
79
+ }
80
+
81
+ bool operator < (IVec<4> & nodea, IVec<4> & nodeb)
82
+ {
83
+ if(nodea[0] < nodeb[0])
84
+ return true;
85
+ else if(nodea[0] == nodeb[0])
86
+ {
87
+ if(nodea[1] < nodeb[1])
88
+ return true;
89
+ else if(nodea[1] == nodeb[1])
90
+ {
91
+ if(nodea[2] < nodeb[2])
92
+ return true;
93
+ else if(nodea[2] == nodeb[2])
94
+ {
95
+ if(nodea[3] < nodeb[3])
96
+ return true;
97
+ }
98
+ }
99
+ }
100
+ return false;
101
+ }
102
+ */
103
+
104
+
105
+
106
+ /*
107
+ template <NODE_TYPE NT>
108
+ auto GetGlobalNodeId (const MeshAccess & ma, int nr) -> typename key_trait<NT>::TKEY { ; }
109
+ */
110
+
111
+ template <NODE_TYPE NT>
112
+ inline auto GetGlobalNodeId (const MeshAccess & ma, int nr) -> typename key_trait<NT>::TKEY
113
+ {
114
+ cout << "called base GetGlobalNodeId!!" << endl;
115
+ return 1;
116
+ }
117
+
118
+ template <>
119
+ inline auto GetGlobalNodeId<NT_VERTEX> (const MeshAccess & ma, int nr)
120
+ -> typename key_trait<NT_VERTEX>::TKEY
121
+ {
122
+ cout << "GetGlobalNodeId<vertex>" << endl;
123
+ return ma.GetGlobalVertexNum (nr);
124
+ }
125
+
126
+ template <>
127
+ inline auto GetGlobalNodeId<NT_EDGE> (const MeshAccess & ma, int nr) -> typename key_trait<NT_EDGE>::TKEY
128
+ {
129
+ // int pi1,pi2;
130
+ // ma.GetEdgePNums (nr, pi1, pi2);
131
+ auto pts = ma.GetEdgePNums(nr);
132
+ int pi1 = pts[0], pi2 = pts[1];
133
+ cout << "GetGlobalNodeId<edge>" << endl;
134
+ return IVec<2> (ma.GetGlobalVertexNum (pi1),
135
+ ma.GetGlobalVertexNum (pi2));
136
+ }
137
+
138
+ template <>
139
+ inline auto GetGlobalNodeId<NT_FACE> (const MeshAccess & ma, int nr) -> typename key_trait<NT_FACE>::TKEY
140
+ {
141
+ // Array<int> edges (3);
142
+ Array<int> verts;
143
+ // ma.GetFaceEdges(nr, edges);
144
+ auto edges = ma.GetFaceEdges(nr);
145
+ for(int k=0;k<3;k++)
146
+ {
147
+ // int p1, p2;
148
+ // ma.GetEdgePNums(edges[k], p1, p2);
149
+ auto pts = ma.GetEdgePNums(edges[k]);
150
+ int p1 = pts[0], p2 = pts[1];
151
+
152
+ if(verts.Contains(p1)==0)
153
+ verts.Append(p1);
154
+ if(verts.Contains(p2)==0)
155
+ verts.Append(p2);
156
+ }
157
+ QuickSort(verts);
158
+ return IVec<3> (verts[0], verts[1], verts[2]);
159
+ }
160
+
161
+ template <>
162
+ inline auto GetGlobalNodeId<NT_CELL> (const MeshAccess & ma, int nr) -> typename key_trait<NT_CELL>::TKEY
163
+ {
164
+ // Array<int> faces(4);
165
+ Array<int> verts;
166
+ // ma.GetElFacets(nr, faces);
167
+ auto faces = ma.GetElFacets(ElementId(VOL,nr));
168
+ for(int k=0;k<4;k++)
169
+ {
170
+ // Array<int> edges(3);
171
+ // ma.GetFaceEdges(faces[k], edges);
172
+ auto edges = ma.GetFaceEdges(faces[k]);
173
+ //cout << "edges: " << edges << endl;
174
+ for(int j=0;j<3;j++)
175
+ {
176
+ // int p1, p2;
177
+ // ma.GetEdgePNums(edges[j], p1, p2);
178
+ auto pts = ma.GetEdgePNums(edges[j]);
179
+ int p1 = pts[0], p2 = pts[1];
180
+ if(verts.Contains(p1)==0)
181
+ verts.Append(p1);
182
+ if(verts.Contains(p2)==0)
183
+ verts.Append(p2);
184
+ }
185
+ }
186
+ QuickSort(verts);
187
+ return IVec<4> (verts[0], verts[1], verts[2], verts[3]);
188
+ }
189
+
190
+ /*
191
+ template <NODE_TYPE NT>
192
+ void SetMPIType(MPI_Datatype * type)
193
+ {
194
+ int sz = 1;
195
+ switch (NT)
196
+ {
197
+ case NT_VERTEX:
198
+ sz = 1;
199
+ break;
200
+ case NT_EDGE:
201
+ sz = 2;
202
+ break;
203
+ case NT_FACE:
204
+ sz = 3;
205
+ break;
206
+ case NT_CELL:
207
+ sz = 4;
208
+ break;
209
+ }
210
+ MPI_Type_contiguous(sz, MPI_INT, type);
211
+ MPI_Type_commit(type);
212
+ }
213
+ */
214
+
215
+ /*
216
+ template <typename DT> struct MPIT {};
217
+ template<> struct MPIT<double> {static MPI_Datatype mpi_type;};
218
+ MPI_Datatype MPIT<double> :: mpi_type = MPI_DOUBLE;
219
+ template <> struct MPIT<int> {static MPI_Datatype mpi_type;};
220
+ MPI_Datatype MPIT<int> :: mpi_type = MPI_INT;
221
+ template <> struct MPIT<unsigned char> {static MPI_Datatype mpi_type;};
222
+ MPI_Datatype MPIT<unsigned char> :: mpi_type = MPI_BYTE;
223
+ template <> struct MPIT<IVec<2,unsigned char>> { static MPI_Datatype mpi_type;};
224
+ MPI_Datatype MPIT<IVec<2,unsigned char>> :: mpi_type;
225
+ template <> struct MPIT<IVec<3,unsigned char>> { static MPI_Datatype mpi_type;};
226
+ MPI_Datatype MPIT<IVec<3,unsigned char>> :: mpi_type;
227
+
228
+ class class_init_mpi_types
229
+ {
230
+ public:
231
+ class_init_mpi_types()
232
+ {
233
+ MPI_Type_contiguous ( 2, MPI_BYTE, &MPIT<IVec<2,unsigned char>>::mpi_type);
234
+ MPI_Type_commit ( &MPIT<IVec<2,unsigned char>>::mpi_type );
235
+
236
+ MPI_Type_contiguous ( 3, MPI_BYTE, &MPIT<IVec<3,unsigned char>>::mpi_type);
237
+ MPI_Type_commit ( &MPIT<IVec<3,unsigned char>>::mpi_type );
238
+
239
+ }
240
+ };
241
+ static class_init_mpi_types init_mpi_types;
242
+ */
243
+
244
+ //provides the place in merge-tree
245
+ inline void find_SRRMS (int rank, int np, int* p1, int* p2, int* p3, bool ignore_in, bool ignore_out);
246
+ inline void find_ROMS (int rank, int np, int* p1, int* p2);
247
+
248
+
249
+ template<typename DT, NODE_TYPE NT>
250
+ void packaged_buffered_send(int rank, int np, DT* a, typename key_trait<NT>::TKEY* b, int n, int pkg_size, int p,
251
+ NgMPI_Requests & requests)
252
+ {
253
+ // NG_MPI_Datatype mpi_type_array = MPIT<DT>::mpi_type;
254
+ NG_MPI_Datatype mpi_type_array = GetMPIType<DT>();
255
+
256
+ //get type for keys
257
+ // NG_MPI_Datatype mpi_type_key;
258
+ // SetMPIType<NT>(&mpi_type_key);
259
+ typedef typename key_trait<NT>::TKEY tkey;
260
+ NG_MPI_Datatype mpi_type_key = GetMPIType<tkey>();
261
+
262
+ bool has_extra = n%pkg_size;
263
+ int n_packages = n/pkg_size + (has_extra ? 1 : 0);
264
+
265
+ //send size
266
+ NG_MPI_Send ( &n, 1, NG_MPI_INT, p, 700001, NG_MPI_COMM_WORLD);
267
+
268
+ for(int k=0;k<n_packages - has_extra?1:0;k++)
269
+ {
270
+ // NG_MPI_Send ( a+k*pkg_size, pkg_size, mpi_type_array, p, 700001, NG_MPI_COMM_WORLD);
271
+ // NG_MPI_Send ( b+k*pkg_size, pkg_size, mpi_type_key, p, 700001, NG_MPI_COMM_WORLD);
272
+ NG_MPI_Request requ;
273
+ NG_MPI_Isend ( a+k*pkg_size, pkg_size, mpi_type_array, p, 700001, NG_MPI_COMM_WORLD, &requ);
274
+ requests += requ;
275
+ NG_MPI_Isend ( b+k*pkg_size, pkg_size, mpi_type_key, p, 700001, NG_MPI_COMM_WORLD, &requ);
276
+ requests += requ;
277
+ }
278
+ //copy last part into new memory so full package can be sent - for simplicity!!
279
+ if(has_extra)
280
+ {
281
+ DT *a_ext = (DT*) malloc(pkg_size * sizeof(DT)); // I know, it is leaking ...
282
+ tkey *b_ext = (tkey*) malloc(pkg_size * sizeof(tkey));
283
+ for(int k=0;k<n%pkg_size;k++)
284
+ {
285
+ //a and b already point to last part
286
+ a_ext[n%pkg_size-k-1] = a[n-1-k];
287
+ b_ext[n%pkg_size-k-1] = b[n-1-k];
288
+ }
289
+ // NG_MPI_Send ( a_ext, pkg_size, mpi_type_array, p, 700001, NG_MPI_COMM_WORLD);
290
+ // NG_MPI_Send ( b_ext, pkg_size, mpi_type_key, p, 700001, NG_MPI_COMM_WORLD);
291
+
292
+ NG_MPI_Request requ;
293
+ NG_MPI_Isend ( a_ext, pkg_size, mpi_type_array, p, 700001, NG_MPI_COMM_WORLD, &requ);
294
+ requests += requ;
295
+ NG_MPI_Isend ( b_ext, pkg_size, mpi_type_key, p, 700001, NG_MPI_COMM_WORLD, &requ);
296
+ requests += requ;
297
+ }
298
+ }
299
+
300
+ template<typename DT, NODE_TYPE NT>
301
+ void merge_own_in_out (int rank, int size, int pkg_size, DT* array, typename key_trait<NT>::TKEY *array_dnrs, int n, int p_in, int p_out)
302
+ {
303
+ NgMPI_Comm comm(NG_MPI_COMM_WORLD);
304
+
305
+ typedef typename key_trait<NT>::TKEY TKEY;
306
+
307
+ int base_array_size = n;
308
+
309
+ //in-buffer
310
+ int n_in = 0;
311
+ NG_MPI_Recv( &n_in, 1, NG_MPI_INT, p_in, 700001, NG_MPI_COMM_WORLD, NG_MPI_STATUS_IGNORE);
312
+
313
+ int in_buf_size = 2 * pkg_size; //do not change this for now!!
314
+
315
+ Array<DT> in_buf(in_buf_size);
316
+ Array<TKEY> in_dnrs(in_buf_size);
317
+
318
+ int index_in = 0;
319
+ int index_own = 0;
320
+
321
+ //out-buffer
322
+ int n_out = base_array_size + n_in;
323
+
324
+ NG_MPI_Send(&n_out, 1, NG_MPI_INT, p_out, 700001, NG_MPI_COMM_WORLD);
325
+ int out_buf_size = pkg_size;
326
+
327
+ Array<DT> out_buf(out_buf_size);
328
+ Array<TKEY> out_dnrs(out_buf_size);
329
+
330
+ IntRange r1 (0, pkg_size);
331
+ IntRange r2 (pkg_size, 2*pkg_size);
332
+
333
+ int index_out = 0;
334
+ bool has_extra = (n_out%pkg_size)?1:0;
335
+
336
+ if(n_in)
337
+ {
338
+ //get 1st halve
339
+ comm.Recv (in_buf[r1], p_in, 700001);
340
+ comm.Recv (in_dnrs[r1], p_in, 700001);
341
+
342
+ if(n_in>pkg_size)
343
+ {
344
+ //get 2nd halve
345
+ comm.Recv (in_buf[r2], p_in, 700001);
346
+ comm.Recv (in_dnrs[r2], p_in, 700001);
347
+ }
348
+ }
349
+
350
+ bool have1[2];
351
+ have1[0] = true;
352
+ have1[1] = true;
353
+
354
+ // int packages_sent = 0;
355
+
356
+
357
+ int iib; //index in buf
358
+ while (index_in<n_in && index_own<base_array_size)
359
+ {
360
+ iib = index_in%in_buf_size;
361
+ if(iib == pkg_size && index_in+pkg_size<n_in && !have1[0]) //is at first of 2nd halve - replace first halve
362
+ {
363
+ comm.Recv (in_buf[r1], p_in, 700001);
364
+ comm.Recv (in_dnrs[r1], p_in, 700001);
365
+ have1[0] = true;
366
+ }
367
+ if(iib == 0 && index_in!=0 && index_in+pkg_size<n_in && !have1[1] ) //is at last of 2nd halve - set to 0 and replace 2nd halve
368
+ {
369
+ comm.Recv (in_buf[r2], p_in, 700001);
370
+ comm.Recv (in_dnrs[r2], p_in, 700001);
371
+ have1[1] = true;
372
+ }
373
+ if(in_dnrs[iib] < array_dnrs[index_own])
374
+ {
375
+ out_buf[index_out] = in_buf[iib];
376
+ out_dnrs[index_out++] = in_dnrs[iib];
377
+ index_in++;
378
+ if(index_in%in_buf_size == 0)
379
+ have1[1] = false;
380
+ else if(index_in%in_buf_size == pkg_size)
381
+ have1[0] = false;
382
+ }
383
+ else
384
+ {
385
+ out_buf[index_out] = array[index_own];
386
+ out_dnrs[index_out++] = array_dnrs[index_own++];
387
+ }
388
+ if(index_out == pkg_size)
389
+ {
390
+ index_out = 0;
391
+ comm.Send (out_buf, p_out, 700001);
392
+ comm.Send (out_dnrs, p_out, 700001);
393
+ // packages_sent++;
394
+ }
395
+ }
396
+ while(index_in<n_in)
397
+ {
398
+ iib = index_in%in_buf_size;
399
+ if(iib == pkg_size && index_in+pkg_size<n_in && !have1[0]) //is at first of 2nd halve - replace first halve
400
+ {
401
+ comm.Recv (in_buf[r1], p_in, 700001);
402
+ comm.Recv (in_dnrs[r1], p_in, 700001);
403
+ have1[0] = true;
404
+ }
405
+ if(iib == 0 && index_in!= 0 && index_in+pkg_size<n_in && !have1[1]) //is at last of 2nd halve - set to 0 and replace 2nd halve
406
+ {
407
+ comm.Recv (in_buf[r2], p_in, 700001);
408
+ comm.Recv (in_dnrs[r2], p_in, 700001);
409
+ have1[1] = true;
410
+ }
411
+ out_buf[index_out] = in_buf[iib];
412
+ out_dnrs[index_out++] = in_dnrs[iib];
413
+ index_in++;
414
+ if(index_in%in_buf_size == 0)
415
+ have1[1] = false;
416
+ else if(index_in%in_buf_size == pkg_size)
417
+ have1[0] = false;
418
+ if(index_out == pkg_size)
419
+ {
420
+ index_out = 0;
421
+ comm.Send (out_buf, p_out, 700001);
422
+ comm.Send (out_dnrs, p_out, 700001);
423
+ // packages_sent++;
424
+ }
425
+ }
426
+ while(index_own<base_array_size)
427
+ {
428
+ out_buf[index_out] = array[index_own];
429
+ out_dnrs[index_out++] = array_dnrs[index_own++];
430
+ if(index_out == pkg_size)
431
+ {
432
+ index_out = 0;
433
+ comm.Send (out_buf, p_out, 700001);
434
+ comm.Send (out_dnrs, p_out, 700001);
435
+ // packages_sent++;
436
+ }
437
+ }
438
+ if(has_extra)
439
+ {
440
+ comm.Send (out_buf, p_out, 700001);
441
+ comm.Send (out_dnrs, p_out, 700001);
442
+ // packages_sent++;
443
+ }
444
+ }
445
+
446
+ template<typename DT, NODE_TYPE NT>
447
+ void merge_in_in_out (int pkg_size, int rank, int np, int p1, int p2, int p_out)
448
+ {
449
+ // NG_MPI_Datatype mpi_type_array = MPIT<DT>::mpi_type;
450
+ NG_MPI_Datatype mpi_type_array = GetMPIType<DT>();
451
+ //get type for keys
452
+ // NG_MPI_Datatype mpi_type_key;
453
+ // SetMPIType<NT>(&mpi_type_key);
454
+ typedef typename key_trait<NT>::TKEY tkey;
455
+ NG_MPI_Datatype mpi_type_key = GetMPIType<tkey>();
456
+
457
+ int in_buf_size = pkg_size * 2;
458
+ DT* a1 = (DT*) malloc (sizeof(DT) * in_buf_size);
459
+ tkey* b1 = (tkey*) malloc (sizeof(tkey) * in_buf_size);
460
+ DT* a2 = (DT*) malloc (sizeof(DT) * in_buf_size);
461
+ tkey* b2 = (tkey*) malloc (sizeof(tkey) * in_buf_size);
462
+
463
+ int out_buf_size = pkg_size;
464
+ DT* a3 = (DT*) malloc (sizeof(DT) * out_buf_size);
465
+ tkey* b3 = (tkey*) malloc (sizeof(tkey) * out_buf_size);
466
+
467
+ for(int k=0;k<in_buf_size;k++)
468
+ {
469
+ a1[k] = a2[k] = -1;
470
+ b1[k] = b2[k] = -1;
471
+ }
472
+ for(int k=0;k<out_buf_size;k++)
473
+ {
474
+ a3[k] = -1;
475
+ b3[k] = -1;
476
+ }
477
+
478
+ //Communicate sizes
479
+ int n_in1, n_in2;
480
+ int n_out;
481
+ NG_MPI_Recv( &n_in1, 1, NG_MPI_INT, p1, 700001, NG_MPI_COMM_WORLD, NG_MPI_STATUS_IGNORE);
482
+ NG_MPI_Recv( &n_in2, 1, NG_MPI_INT, p2, 700001, NG_MPI_COMM_WORLD, NG_MPI_STATUS_IGNORE);
483
+
484
+ n_out = n_in1 + n_in2;
485
+ NG_MPI_Send( &n_out, 1, NG_MPI_INT, p_out, 700001, NG_MPI_COMM_WORLD);
486
+
487
+
488
+ //initial filling of buffer
489
+ if(n_in1)
490
+ {
491
+ //1st halve, p1
492
+ NG_MPI_Recv(a1, pkg_size, mpi_type_array, p1, 700001, NG_MPI_COMM_WORLD, NG_MPI_STATUS_IGNORE);
493
+ NG_MPI_Recv(b1, pkg_size, mpi_type_key, p1, 700001, NG_MPI_COMM_WORLD, NG_MPI_STATUS_IGNORE);
494
+ if(n_in1>pkg_size)
495
+ {
496
+ //2nd halve, p1
497
+ NG_MPI_Recv(a1+pkg_size, pkg_size, mpi_type_array, p1, 700001, NG_MPI_COMM_WORLD, NG_MPI_STATUS_IGNORE);
498
+ NG_MPI_Recv(b1+pkg_size, pkg_size, mpi_type_key, p1, 700001, NG_MPI_COMM_WORLD, NG_MPI_STATUS_IGNORE);
499
+ }
500
+ }
501
+ if(n_in2)
502
+ {
503
+ //1st halve, p2
504
+ NG_MPI_Recv(a2, pkg_size, mpi_type_array, p2, 700001, NG_MPI_COMM_WORLD, NG_MPI_STATUS_IGNORE);
505
+ NG_MPI_Recv(b2, pkg_size, mpi_type_key, p2, 700001, NG_MPI_COMM_WORLD, NG_MPI_STATUS_IGNORE);
506
+ if(n_in2>pkg_size)
507
+ {
508
+ //2nd halve, p2
509
+ NG_MPI_Recv(a2+pkg_size, pkg_size, mpi_type_array, p2, 700001, NG_MPI_COMM_WORLD, NG_MPI_STATUS_IGNORE);
510
+ NG_MPI_Recv(b2+pkg_size, pkg_size, mpi_type_key, p2, 700001, NG_MPI_COMM_WORLD, NG_MPI_STATUS_IGNORE);
511
+ }
512
+ }
513
+
514
+
515
+ // int got_from_p1 = 2;
516
+ // int got_from_p2 = 2;
517
+ // int packages_sent = 0;
518
+ int index1, index2, i3;
519
+ index1 = index2 = i3 = 0;
520
+
521
+ bool have1[2];
522
+ have1[0] = have1[1] = true;
523
+ bool have2[2];
524
+ have2[0] = have2[1] = true;
525
+
526
+
527
+ while(index1<n_in1 && index2<n_in2)
528
+ {
529
+ int i1 = index1%in_buf_size;
530
+ int i2 = index2%in_buf_size;
531
+ if(i1==pkg_size && index1+pkg_size<n_in1 && !have1[0]) //replace 1st halve
532
+ {
533
+ //1st halve, p1
534
+ NG_MPI_Recv(a1, pkg_size, mpi_type_array, p1, 700001, NG_MPI_COMM_WORLD, NG_MPI_STATUS_IGNORE);
535
+ NG_MPI_Recv(b1, pkg_size, mpi_type_key, p1, 700001, NG_MPI_COMM_WORLD, NG_MPI_STATUS_IGNORE);
536
+ have1[0] = true;
537
+ // got_from_p1++;
538
+ }
539
+ else if (i1 == 0 && index1 !=0 && index1+pkg_size<n_in1 && !have1[1]) //replace 2nd halve
540
+ {
541
+ //2nd halve, p1
542
+ NG_MPI_Recv(a1+pkg_size, pkg_size, mpi_type_array, p1, 700001, NG_MPI_COMM_WORLD, NG_MPI_STATUS_IGNORE);
543
+ NG_MPI_Recv(b1+pkg_size, pkg_size, mpi_type_key, p1, 700001, NG_MPI_COMM_WORLD, NG_MPI_STATUS_IGNORE);
544
+ have1[1] = true;
545
+ // got_from_p1++;
546
+ }
547
+ else if(i2==pkg_size && index2+pkg_size<n_in2 && !have2[0]) //replace 1st halve
548
+ {
549
+ //1st halve, p2
550
+ NG_MPI_Recv(a2, pkg_size, mpi_type_array, p2, 700001, NG_MPI_COMM_WORLD, NG_MPI_STATUS_IGNORE);
551
+ NG_MPI_Recv(b2, pkg_size, mpi_type_key, p2, 700001, NG_MPI_COMM_WORLD, NG_MPI_STATUS_IGNORE);
552
+ have2[0] = true;
553
+ // got_from_p2++;
554
+ }
555
+ else if (i2 == 0 && index2 !=0 && index2+pkg_size<n_in2 && !have2[1]) //replace 2nd halve
556
+ {
557
+ have2[1] = true;
558
+ NG_MPI_Recv(a2+pkg_size, pkg_size, mpi_type_array, p2, 700001, NG_MPI_COMM_WORLD, NG_MPI_STATUS_IGNORE);
559
+ NG_MPI_Recv(b2+pkg_size, pkg_size, mpi_type_key, p2, 700001, NG_MPI_COMM_WORLD, NG_MPI_STATUS_IGNORE);
560
+ // got_from_p2++;
561
+ }
562
+
563
+ if(b1[i1]<b2[i2])
564
+ {
565
+ b3[i3] = b1[i1];
566
+ a3[i3++] = a1[i1];
567
+ index1++;
568
+ if(index1%in_buf_size == 0)
569
+ have1[1] = false;
570
+ else if(index1%in_buf_size == pkg_size)
571
+ have1[0] = false;
572
+ }
573
+ else
574
+ {
575
+ b3[i3] = b2[i2];
576
+ a3[i3++] = a2[i2];
577
+ index2++;
578
+ if(index2%in_buf_size == 0)
579
+ have2[1] = false;
580
+ else if(index2%in_buf_size == pkg_size)
581
+ have2[0] = false;
582
+ }
583
+
584
+ if(i3==pkg_size)
585
+ {
586
+ i3 = 0;
587
+ NG_MPI_Send(a3, pkg_size, mpi_type_array, p_out, 700001, NG_MPI_COMM_WORLD);
588
+ NG_MPI_Send(b3, pkg_size, mpi_type_key, p_out, 700001, NG_MPI_COMM_WORLD);
589
+ // packages_sent++;
590
+ }
591
+
592
+ }
593
+ while(index1<n_in1)
594
+ {
595
+ int i1 = index1%in_buf_size;
596
+ if(i1==pkg_size && index1+pkg_size<n_in1 && have1[0] == false) //replace 1st halve
597
+ {
598
+ //1st halve, p1
599
+ NG_MPI_Recv(a1, pkg_size, mpi_type_array, p1, 700001, NG_MPI_COMM_WORLD, NG_MPI_STATUS_IGNORE);
600
+ NG_MPI_Recv(b1, pkg_size, mpi_type_key, p1, 700001, NG_MPI_COMM_WORLD, NG_MPI_STATUS_IGNORE);
601
+ have1[0] = true;
602
+ // got_from_p1++;
603
+ }
604
+ else if (i1 == 0 && index1 !=0 && index1+pkg_size<n_in1 && have1[1] == false) //replace 2nd halve
605
+ {
606
+ //2nd halve, p1
607
+ NG_MPI_Recv(a1+pkg_size, pkg_size, mpi_type_array, p1, 700001, NG_MPI_COMM_WORLD, NG_MPI_STATUS_IGNORE);
608
+ NG_MPI_Recv(b1+pkg_size, pkg_size, mpi_type_key, p1, 700001, NG_MPI_COMM_WORLD, NG_MPI_STATUS_IGNORE);
609
+ have1[1] = true;
610
+ // got_from_p1++;
611
+ }
612
+ b3[i3] = b1[i1];
613
+ a3[i3++] = a1[i1];
614
+ index1++;
615
+ if(index1%in_buf_size == 0)
616
+ have1[1] = false;
617
+ else if(index1%in_buf_size == pkg_size)
618
+ have1[0] = false;
619
+ if(i3==pkg_size)
620
+ {
621
+ i3 = 0;
622
+ NG_MPI_Send(a3, pkg_size, mpi_type_array, p_out, 700001, NG_MPI_COMM_WORLD);
623
+ NG_MPI_Send(b3, pkg_size, mpi_type_key, p_out, 700001, NG_MPI_COMM_WORLD);
624
+ // packages_sent++;
625
+ }
626
+ }
627
+ while(index2<n_in2)
628
+ {
629
+ int i2 = index2%in_buf_size;
630
+ if(i2==pkg_size && index2+pkg_size<n_in2 && have2[0] == false) //replace 1st halve
631
+ {
632
+ //1st halve, p2
633
+ NG_MPI_Recv(a2, pkg_size, mpi_type_array, p2, 700001, NG_MPI_COMM_WORLD, NG_MPI_STATUS_IGNORE);
634
+ NG_MPI_Recv(b2, pkg_size, mpi_type_key, p2, 700001, NG_MPI_COMM_WORLD, NG_MPI_STATUS_IGNORE);
635
+ have2[0] = true;
636
+ // got_from_p2++;
637
+ }
638
+ else if (i2 == 0 && index2 !=0 && index2+pkg_size<n_in2 && have2[1] == false) //replace 2nd halve
639
+ {
640
+ NG_MPI_Recv(a2+pkg_size, pkg_size, mpi_type_array, p2, 700001, NG_MPI_COMM_WORLD, NG_MPI_STATUS_IGNORE);
641
+ NG_MPI_Recv(b2+pkg_size, pkg_size, mpi_type_key, p2, 700001, NG_MPI_COMM_WORLD, NG_MPI_STATUS_IGNORE);
642
+ have2[1] = true;
643
+ // got_from_p2++;
644
+ }
645
+ b3[i3] = b2[i2];
646
+ a3[i3++] = a2[i2];
647
+ index2++;
648
+ if(index2%in_buf_size == 0)
649
+ have2[1] = false;
650
+ else if(index2%in_buf_size == pkg_size)
651
+ have2[0] = false;
652
+ if(i3==pkg_size)
653
+ {
654
+ i3 = 0;
655
+ NG_MPI_Send(a3, pkg_size, mpi_type_array, p_out, 700001, NG_MPI_COMM_WORLD);
656
+ NG_MPI_Send(b3, pkg_size, mpi_type_key, p_out, 700001, NG_MPI_COMM_WORLD);
657
+ // packages_sent++;
658
+ }
659
+ }
660
+ if(i3!=0)
661
+ {
662
+ i3 = 0;
663
+ NG_MPI_Send(a3, pkg_size, mpi_type_array, p_out, 700001, NG_MPI_COMM_WORLD);
664
+ NG_MPI_Send(b3, pkg_size, mpi_type_key, p_out, 700001, NG_MPI_COMM_WORLD);
665
+ // packages_sent++;
666
+ }
667
+
668
+ free(a1);
669
+ free(a2);
670
+ free(a3);
671
+ free(b1);
672
+ free(b2);
673
+ free(b3);
674
+ }
675
+
676
+
677
+ void find_ROMS (int rank, int np, int* p1, int* p2)
678
+ {
679
+ //cout << "rank " << rank << " called _roms " << endl;
680
+ int p_in, p_out;
681
+ p_in = rank - 1;
682
+ if(rank%4==1 && rank+1<np)
683
+ p_out = rank+1;
684
+ else if(rank%4==1)
685
+ {
686
+ int q1, q2, q3;
687
+ find_SRRMS(rank+1, np, &q1, &q2, &q3, true, false);
688
+ p_out = q3;
689
+ }
690
+ else
691
+ p_out = rank-1;
692
+ *p1 = p_in;
693
+ *p2 = p_out;
694
+ //cout << "rank " << rank << " _roms " << p_in << "/" << p_out << endl;
695
+
696
+ }
697
+
698
+ //send, recv+recv, send
699
+ void find_SRRMS (int rank, int np, int* p1, int* p2, int* p3, bool ignore_in, bool ignore_out)
700
+ {
701
+
702
+ if(rank%2!=0)
703
+ {
704
+ // cout << "rank " << rank << " reached end of recursion SRRMS, use ROMS" << endl;
705
+ *p1 = rank -1;
706
+ *p2 = rank;
707
+ *p3 = 0;
708
+ //cout << "rank " << rank << "_srrms (after _roms) " << *p1 << "/" << *p2 << "/" << *p3 << endl;
709
+ return;
710
+ }
711
+ int p_in1, p_in2, p_out;
712
+ // int k = 1;
713
+ int block_size = 2;
714
+ int first_active = 1;
715
+ bool found = false;
716
+ while(!found)
717
+ {
718
+ block_size *=2;
719
+ // k++;
720
+ first_active *=2;
721
+ int am_i = first_active;
722
+ while(am_i<2*np)
723
+ {
724
+ if(am_i == rank)
725
+ {
726
+ found = true;
727
+ am_i = 2*np;
728
+ }
729
+ else
730
+ am_i+=block_size;
731
+ }
732
+ }
733
+ p_in1 = rank - block_size/4;
734
+ p_in2 = rank + block_size/4;
735
+ if(block_size>=np) //send to 0
736
+ {
737
+ p_out = 0;
738
+ //cout << "rank " << rank << " gives back to start " << endl;
739
+ }
740
+ else if((rank/block_size)%2==0)
741
+ p_out = rank + block_size/2;
742
+ else
743
+ p_out = rank - block_size/2;
744
+
745
+ // cout << "rank " << rank << " _srrms " << p_in1 << "/" << p_in2 << "/" << p_out << endl;
746
+
747
+ if(!ignore_in) //look up, prioritize left
748
+ {
749
+ if(p_in1>np-1)
750
+ {
751
+ int q1, q2, q3;
752
+ //cout << "rank " << rank << " go left up to " << p_in1 << endl;
753
+ find_SRRMS(p_in1, np, &q1, &q2, &q3, false, true);
754
+ p_in1 = q1;
755
+ }
756
+ else if(p_in2>np-1)
757
+ {
758
+ int q1, q2, q3;
759
+ //cout << "rank " << rank << " go right up to " << p_in2 << endl;
760
+ find_SRRMS(p_in2, np, &q1, &q2, &q3, false, true);
761
+ p_in2 = q1;
762
+ }
763
+ }
764
+
765
+ if(!ignore_out)
766
+ {
767
+ if(p_out>np-1) //look down
768
+ {
769
+ int q1, q2, q3;
770
+ find_SRRMS(p_out, np, &q1, &q2, &q3, true, false);
771
+ p_out = q3;
772
+ }
773
+ }
774
+ *p1 = p_in1;
775
+ *p2 = p_in2;
776
+ *p3 = p_out;
777
+
778
+ }
779
+
780
+ template<typename DT, NODE_TYPE NT, typename TSIZEFUNC, typename TFUNC>
781
+ void streamed_key_merge_templated (DT* array,
782
+ typename key_trait<NT>::TKEY* array_keys,
783
+ int base_array_size, int pkg_size,
784
+ TSIZEFUNC sf, TFUNC f)
785
+ {
786
+ // NG_MPI_Datatype mpi_type_array = MyGetMPIType<DT>();
787
+ typedef typename key_trait<NT>::TKEY tkey;
788
+ // NG_MPI_Datatype mpi_type_key = MyGetMPIType<tkey>();
789
+
790
+ NgMPI_Comm comm(NG_MPI_COMM_WORLD);
791
+ int rank = comm.Rank();
792
+ int np = comm.Size();
793
+ /*
794
+ int rank, np;
795
+ NG_MPI_Comm_rank(NG_MPI_COMM_WORLD, &rank);
796
+ NG_MPI_Comm_size(NG_MPI_COMM_WORLD, &np);
797
+ */
798
+ bool even = 1-rank%2;
799
+ //first step
800
+
801
+ if(rank == 0)
802
+ {
803
+ NgMPI_Requests requests;
804
+ //packaged_send
805
+ packaged_buffered_send<DT,NT>(rank, np, array, array_keys, base_array_size, pkg_size, 1, requests);
806
+
807
+ int n;
808
+ NG_MPI_Recv(&n, 1, NG_MPI_INT, NG_MPI_ANY_SOURCE, 700001, NG_MPI_COMM_WORLD, NG_MPI_STATUS_IGNORE);
809
+ int n_pkg = n/pkg_size + ( (n%pkg_size)?1:0);
810
+
811
+ sf(n);
812
+
813
+ /*
814
+ DT* end = (DT*) malloc(pkg_size * sizeof(DT));
815
+ tkey* end_keys = (tkey*) malloc(pkg_size * sizeof(tkey));
816
+ */
817
+ Array<DT> end(pkg_size);
818
+ Array<tkey> end_keys(pkg_size);
819
+
820
+ for(int k=0;k<n_pkg-1;k++)
821
+ {
822
+ // NG_MPI_Recv(&end[0] , pkg_size, mpi_type_array, NG_MPI_ANY_SOURCE, 700001, NG_MPI_COMM_WORLD, NG_MPI_STATUS_IGNORE);
823
+ // NG_MPI_Recv(&end_keys[0], pkg_size, mpi_type_key , NG_MPI_ANY_SOURCE, 700001, NG_MPI_COMM_WORLD, NG_MPI_STATUS_IGNORE);
824
+
825
+ comm.Recv(end, NG_MPI_ANY_SOURCE, 700001);
826
+ comm.Recv(end_keys, NG_MPI_ANY_SOURCE, 700001);
827
+
828
+ //cout << "0 received pkg " << k << "/" << n_pkg << endl;
829
+ for(int j = 0; j < pkg_size; j++)
830
+ f(end_keys[j], end[j]);
831
+ }
832
+ // NG_MPI_Recv(&end[0] , pkg_size, mpi_type_array, NG_MPI_ANY_SOURCE, 700001, NG_MPI_COMM_WORLD, NG_MPI_STATUS_IGNORE);
833
+ // NG_MPI_Recv(&end_keys[0], pkg_size, mpi_type_key , NG_MPI_ANY_SOURCE, 700001, NG_MPI_COMM_WORLD, NG_MPI_STATUS_IGNORE);
834
+ comm.Recv(end, NG_MPI_ANY_SOURCE, 700001);
835
+ comm.Recv(end_keys, NG_MPI_ANY_SOURCE, 700001);
836
+
837
+ for(int j=0;(n_pkg-1)*pkg_size+j < n;j++)
838
+ f(end_keys[j], end[j]);
839
+ requests.WaitAll();
840
+ // free(end);
841
+ // free(end_keys);
842
+ }
843
+ else if(even)
844
+ {
845
+ // -> RRM
846
+ int p_in1, p_in2, p_out;
847
+ find_SRRMS (rank, np, &p_in1, &p_in2, &p_out, false, false);
848
+ if(np-1 == rank) //is on right border
849
+ {
850
+ //cout << "rank " << rank << " (irregularly) gets from " << p_in1 << " and sends to " << p_out << endl;
851
+ merge_own_in_out <DT,NT> (rank, np, pkg_size, array, array_keys, base_array_size, p_in1, p_out);
852
+ }
853
+ else //regular
854
+ {
855
+ //cout << "rank " << rank << " sends to " << rank+1 << " then gets from " << p_in1 << "/" << p_in2 << " and sends to " << p_out << endl;
856
+ NgMPI_Requests requests;
857
+ packaged_buffered_send<DT,NT>(rank, np, array, array_keys, base_array_size, pkg_size, rank+1, requests);
858
+ merge_in_in_out<DT,NT>(pkg_size, rank, np, p_in1, p_in2, p_out);
859
+ requests.WaitAll();
860
+ }
861
+ }
862
+ else
863
+ {
864
+ // ROM ->
865
+ int p_in,p_out;
866
+ find_ROMS(rank, np, &p_in, &p_out);
867
+ //cout << "rank " << rank << " gets from " << p_in << " and sends to " << p_out << endl;
868
+ merge_own_in_out<DT,NT>(rank, np, pkg_size, array, array_keys, base_array_size, p_in, p_out);
869
+ }
870
+ }
871
+
872
+ template <class T>
873
+ void MyQuickSortI (FlatArray<T> data, FlatArray<int> index)
874
+ {
875
+ if (index.Size() <= 1) return;
876
+
877
+ int i = 0;
878
+ int j = index.Size()-1;
879
+
880
+ int midval = index[ (i+j)/2 ];
881
+
882
+ do
883
+ {
884
+ while (data[index[i]] < data[midval]) i++;
885
+ while (data[midval] < data[index[j]]) j--;
886
+ /*
887
+ while (less (data[index[i]],data[midval]) ) i++;
888
+ while (less (data[midval], data[index[j]])) j--;
889
+ */
890
+
891
+ if (i <= j)
892
+ {
893
+ Swap (index[i], index[j]);
894
+ i++; j--;
895
+ }
896
+ }
897
+ while (i <= j);
898
+
899
+ MyQuickSortI (data, index.Range (0, j+1));
900
+ MyQuickSortI (data, index.Range (i, index.Size()));
901
+ }
902
+
903
+
904
+
905
+
906
+
907
+
908
+ template <NODE_TYPE NT, typename T, typename TSIZEFUNC, typename TFUNC>
909
+ void GatherNodalData (const MeshAccess & ma, FlatArray<T> data,
910
+ TSIZEFUNC sf, TFUNC f)
911
+ {
912
+ typedef typename key_trait<NT>::TKEY TKEY;
913
+
914
+ Array<T> local_data;
915
+ Array<TKEY> global_keys;
916
+
917
+ // gather local data where I am master
918
+ auto comm = ma.GetCommunicator();
919
+ int myid = comm.Rank();
920
+ for (int i = 0; i < ma.GetNNodes(NT); i++)
921
+ {
922
+ bool ismaster = true;
923
+ for (int p : ma.GetDistantProcs (Node(NT,i)))
924
+ if (p < myid) ismaster = false;
925
+
926
+ if (ismaster)
927
+ {
928
+ local_data.Append (data[i]);
929
+ TKEY key1 = GetGlobalNodeId<NT>(ma,i);
930
+ global_keys.Append (key1);
931
+ }
932
+ }
933
+
934
+ Array<int> index (local_data.Size());
935
+ for (int k = 0; k < index.Size(); k++) index[k] = k;
936
+
937
+ MyQuickSortI (global_keys, index);
938
+
939
+ local_data = Array<T> (local_data[index]);
940
+ global_keys = Array<TKEY> (global_keys[index]);
941
+
942
+
943
+ streamed_key_merge_templated<T,NT> (&local_data[0], &global_keys[0], local_data.Size(), 10000, sf, f);
944
+ }
945
+
946
+
947
+
948
+ }
949
+ #endif