ngsolve 6.2.2506.post75.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.

Potentially problematic release.


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

Files changed (303) hide show
  1. ngsolve-6.2.2506.post75.dev0.data/data/bin/ngs_nvcc +14 -0
  2. ngsolve-6.2.2506.post75.dev0.data/data/bin/ngs_nvlink +14 -0
  3. ngsolve-6.2.2506.post75.dev0.data/data/bin/ngscxx +15 -0
  4. ngsolve-6.2.2506.post75.dev0.data/data/bin/ngsld +11 -0
  5. ngsolve-6.2.2506.post75.dev0.data/data/bin/ngsolve.tcl +648 -0
  6. ngsolve-6.2.2506.post75.dev0.data/data/bin/ngspy +2 -0
  7. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/analytic_integrals.hpp +10 -0
  8. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/arnoldi.hpp +55 -0
  9. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/bandmatrix.hpp +334 -0
  10. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/basematrix.hpp +957 -0
  11. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/basevector.hpp +1268 -0
  12. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/bdbequations.hpp +2805 -0
  13. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/bdbintegrator.hpp +1660 -0
  14. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/bem_diffops.hpp +475 -0
  15. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/bessel.hpp +1064 -0
  16. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/bilinearform.hpp +963 -0
  17. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/bla.hpp +29 -0
  18. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/blockalloc.hpp +95 -0
  19. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/blockjacobi.hpp +328 -0
  20. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/bspline.hpp +116 -0
  21. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/calcinverse.hpp +141 -0
  22. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/cg.hpp +368 -0
  23. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/chebyshev.hpp +44 -0
  24. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/cholesky.hpp +720 -0
  25. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/clapack.h +7254 -0
  26. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/code_generation.hpp +296 -0
  27. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/coefficient.hpp +2033 -0
  28. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/coefficient_impl.hpp +19 -0
  29. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/coefficient_stdmath.hpp +167 -0
  30. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/commutingAMG.hpp +106 -0
  31. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/comp.hpp +79 -0
  32. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/compatibility.hpp +41 -0
  33. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/complex_wrapper.hpp +73 -0
  34. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/compressedfespace.hpp +110 -0
  35. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/contact.hpp +235 -0
  36. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/cuda_linalg.hpp +175 -0
  37. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/cuda_ngbla.hpp +226 -0
  38. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/cuda_ngstd.hpp +527 -0
  39. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/cuda_profiler.hpp +240 -0
  40. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/diagonalmatrix.hpp +154 -0
  41. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/differentialoperator.hpp +276 -0
  42. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/diffop.hpp +1286 -0
  43. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/diffop_impl.hpp +328 -0
  44. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/diffopwithfactor.hpp +123 -0
  45. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/discontinuous.hpp +84 -0
  46. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/dump.hpp +949 -0
  47. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/ectypes.hpp +121 -0
  48. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/eigen.hpp +60 -0
  49. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/eigensystem.hpp +18 -0
  50. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/elasticity_equations.hpp +595 -0
  51. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/elementbyelement.hpp +195 -0
  52. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/elementtopology.hpp +1760 -0
  53. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/elementtransformation.hpp +339 -0
  54. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/evalfunc.hpp +405 -0
  55. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/expr.hpp +1686 -0
  56. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/facetfe.hpp +175 -0
  57. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/facetfespace.hpp +180 -0
  58. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/facethofe.hpp +111 -0
  59. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/facetsurffespace.hpp +112 -0
  60. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/fe_interfaces.hpp +32 -0
  61. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/fem.hpp +87 -0
  62. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/fesconvert.hpp +14 -0
  63. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/fespace.hpp +1449 -0
  64. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/finiteelement.hpp +286 -0
  65. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/globalinterfacespace.hpp +77 -0
  66. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/globalspace.hpp +115 -0
  67. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/gridfunction.hpp +525 -0
  68. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/h1amg.hpp +124 -0
  69. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/h1hofe.hpp +188 -0
  70. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/h1hofe_impl.hpp +1262 -0
  71. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/h1hofefo.hpp +148 -0
  72. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/h1hofefo_impl.hpp +185 -0
  73. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/h1hofespace.hpp +167 -0
  74. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/h1lofe.hpp +1240 -0
  75. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/h1lumping.hpp +41 -0
  76. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/hcurl_equations.hpp +1381 -0
  77. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/hcurlcurlfe.hpp +2241 -0
  78. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/hcurlcurlfespace.hpp +78 -0
  79. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/hcurlfe.hpp +259 -0
  80. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/hcurlfe_utils.hpp +107 -0
  81. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/hcurlhdiv_dshape.hpp +857 -0
  82. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/hcurlhdivfes.hpp +308 -0
  83. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/hcurlhofe.hpp +175 -0
  84. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/hcurlhofe_impl.hpp +1871 -0
  85. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/hcurlhofespace.hpp +193 -0
  86. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/hcurllofe.hpp +1146 -0
  87. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/hdiv_equations.hpp +880 -0
  88. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/hdivdivfe.hpp +2923 -0
  89. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/hdivdivsurfacespace.hpp +76 -0
  90. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/hdivfe.hpp +206 -0
  91. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/hdivfe_utils.hpp +717 -0
  92. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/hdivfes.hpp +75 -0
  93. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/hdivhofe.hpp +447 -0
  94. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/hdivhofe_impl.hpp +1107 -0
  95. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/hdivhofefo.hpp +229 -0
  96. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/hdivhofespace.hpp +177 -0
  97. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/hdivhosurfacefespace.hpp +106 -0
  98. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/hdivlofe.hpp +773 -0
  99. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/hidden.hpp +74 -0
  100. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/householder.hpp +181 -0
  101. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/hypre_ams_precond.hpp +123 -0
  102. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/hypre_precond.hpp +73 -0
  103. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/integrator.hpp +2012 -0
  104. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/integratorcf.hpp +253 -0
  105. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/interpolate.hpp +49 -0
  106. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/intrule.hpp +2542 -0
  107. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/intrules_SauterSchwab.hpp +25 -0
  108. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/irspace.hpp +49 -0
  109. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/jacobi.hpp +153 -0
  110. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/kernels.hpp +762 -0
  111. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/l2hofe.hpp +194 -0
  112. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/l2hofe_impl.hpp +564 -0
  113. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/l2hofefo.hpp +542 -0
  114. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/l2hofespace.hpp +344 -0
  115. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/la.hpp +38 -0
  116. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/linalg_kernels.hpp +102 -0
  117. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/linearform.hpp +266 -0
  118. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/matrix.hpp +2140 -0
  119. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/memusage.hpp +41 -0
  120. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/meshaccess.hpp +1359 -0
  121. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/mgpre.hpp +204 -0
  122. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/mp_coefficient.hpp +145 -0
  123. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/mptools.hpp +2281 -0
  124. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/multigrid.hpp +42 -0
  125. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/multivector.hpp +447 -0
  126. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/mumpsinverse.hpp +187 -0
  127. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/mycomplex.hpp +361 -0
  128. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/ng_lapack.hpp +1661 -0
  129. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/ngblas.hpp +1232 -0
  130. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/ngs_defines.hpp +30 -0
  131. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/ngs_stdcpp_include.hpp +106 -0
  132. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/ngs_utils.hpp +121 -0
  133. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/ngsobject.hpp +1019 -0
  134. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/ngsstream.hpp +113 -0
  135. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/ngstd.hpp +72 -0
  136. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/nodalhofe.hpp +96 -0
  137. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/nodalhofe_impl.hpp +141 -0
  138. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/normalfacetfe.hpp +223 -0
  139. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/normalfacetfespace.hpp +98 -0
  140. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/normalfacetsurfacefespace.hpp +84 -0
  141. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/order.hpp +251 -0
  142. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/parallel_matrices.hpp +222 -0
  143. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/paralleldofs.hpp +340 -0
  144. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/parallelngs.hpp +23 -0
  145. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/parallelvector.hpp +269 -0
  146. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/pardisoinverse.hpp +200 -0
  147. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/periodic.hpp +129 -0
  148. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/plateaufespace.hpp +25 -0
  149. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/pml.hpp +275 -0
  150. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/pmltrafo.hpp +631 -0
  151. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/postproc.hpp +142 -0
  152. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/potentialtools.hpp +22 -0
  153. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/precomp.hpp +60 -0
  154. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/preconditioner.hpp +602 -0
  155. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/prolongation.hpp +377 -0
  156. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/python_comp.hpp +107 -0
  157. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/python_fem.hpp +89 -0
  158. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/python_linalg.hpp +58 -0
  159. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/python_ngstd.hpp +386 -0
  160. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/recursive_pol.hpp +4896 -0
  161. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/recursive_pol_tet.hpp +395 -0
  162. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/recursive_pol_trig.hpp +492 -0
  163. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/reorderedfespace.hpp +81 -0
  164. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/sample_sort.hpp +105 -0
  165. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/scalarfe.hpp +335 -0
  166. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/shapefunction_utils.hpp +113 -0
  167. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/simd_complex.hpp +329 -0
  168. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/smoother.hpp +253 -0
  169. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/solve.hpp +89 -0
  170. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/sparsecholesky.hpp +313 -0
  171. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/sparsematrix.hpp +1038 -0
  172. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/sparsematrix_dyn.hpp +90 -0
  173. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/sparsematrix_impl.hpp +1013 -0
  174. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/special_matrix.hpp +463 -0
  175. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/specialelement.hpp +125 -0
  176. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/statushandler.hpp +33 -0
  177. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/stringops.hpp +12 -0
  178. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/superluinverse.hpp +136 -0
  179. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/symbolicintegrator.hpp +850 -0
  180. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/symmetricmatrix.hpp +144 -0
  181. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/tangentialfacetfe.hpp +224 -0
  182. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/tangentialfacetfespace.hpp +91 -0
  183. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/tensor.hpp +522 -0
  184. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/tensorcoefficient.hpp +446 -0
  185. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/tensorproductintegrator.hpp +113 -0
  186. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/thcurlfe.hpp +128 -0
  187. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/thcurlfe_impl.hpp +380 -0
  188. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/thdivfe.hpp +80 -0
  189. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/thdivfe_impl.hpp +492 -0
  190. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/tpdiffop.hpp +461 -0
  191. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/tpfes.hpp +133 -0
  192. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/tpintrule.hpp +224 -0
  193. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/triangular.hpp +465 -0
  194. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/tscalarfe.hpp +245 -0
  195. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/tscalarfe_impl.hpp +1029 -0
  196. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/umfpackinverse.hpp +148 -0
  197. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/unifiedvector.hpp +103 -0
  198. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/vector.hpp +1273 -0
  199. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/voxelcoefficientfunction.hpp +41 -0
  200. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/vtkoutput.hpp +198 -0
  201. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/vvector.hpp +208 -0
  202. ngsolve-6.2.2506.post75.dev0.data/data/include/netgen/webgui.hpp +92 -0
  203. ngsolve-6.2.2506.post75.dev0.data/data/lib/cmake/ngsolve/NGSolveConfig.cmake +102 -0
  204. ngsolve-6.2.2506.post75.dev0.data/data/lib/cmake/ngsolve/ngsolve-targets-release.cmake +89 -0
  205. ngsolve-6.2.2506.post75.dev0.data/data/lib/cmake/ngsolve/ngsolve-targets.cmake +173 -0
  206. ngsolve-6.2.2506.post75.dev0.data/data/lib/python3.14/site-packages/netgen_mesher.libs/libngbla.so +0 -0
  207. ngsolve-6.2.2506.post75.dev0.data/data/lib/python3.14/site-packages/netgen_mesher.libs/libngcomp.so +0 -0
  208. ngsolve-6.2.2506.post75.dev0.data/data/lib/python3.14/site-packages/netgen_mesher.libs/libngfem.so +0 -0
  209. ngsolve-6.2.2506.post75.dev0.data/data/lib/python3.14/site-packages/netgen_mesher.libs/libngla.so +0 -0
  210. ngsolve-6.2.2506.post75.dev0.data/data/lib/python3.14/site-packages/netgen_mesher.libs/libngsbem.so +0 -0
  211. ngsolve-6.2.2506.post75.dev0.data/data/lib/python3.14/site-packages/netgen_mesher.libs/libngscudalib.so +0 -0
  212. ngsolve-6.2.2506.post75.dev0.data/data/lib/python3.14/site-packages/netgen_mesher.libs/libngsolve.so +0 -0
  213. ngsolve-6.2.2506.post75.dev0.data/data/lib/python3.14/site-packages/netgen_mesher.libs/libngstd.so +0 -0
  214. ngsolve-6.2.2506.post75.dev0.data/data/lib/python3.14/site-packages/ngsolve/TensorProductTools.py +210 -0
  215. ngsolve-6.2.2506.post75.dev0.data/data/lib/python3.14/site-packages/ngsolve/__console.py +94 -0
  216. ngsolve-6.2.2506.post75.dev0.data/data/lib/python3.14/site-packages/ngsolve/__expr.py +181 -0
  217. ngsolve-6.2.2506.post75.dev0.data/data/lib/python3.14/site-packages/ngsolve/__init__.py +148 -0
  218. ngsolve-6.2.2506.post75.dev0.data/data/lib/python3.14/site-packages/ngsolve/_scikit_build_core_dependencies.py +30 -0
  219. ngsolve-6.2.2506.post75.dev0.data/data/lib/python3.14/site-packages/ngsolve/bvp.py +78 -0
  220. ngsolve-6.2.2506.post75.dev0.data/data/lib/python3.14/site-packages/ngsolve/config/__init__.py +1 -0
  221. ngsolve-6.2.2506.post75.dev0.data/data/lib/python3.14/site-packages/ngsolve/config/__main__.py +4 -0
  222. ngsolve-6.2.2506.post75.dev0.data/data/lib/python3.14/site-packages/ngsolve/config/config.py +60 -0
  223. ngsolve-6.2.2506.post75.dev0.data/data/lib/python3.14/site-packages/ngsolve/demos/TensorProduct/__init__.py +0 -0
  224. ngsolve-6.2.2506.post75.dev0.data/data/lib/python3.14/site-packages/ngsolve/demos/TensorProduct/tp_dg_1d_1d.py +80 -0
  225. ngsolve-6.2.2506.post75.dev0.data/data/lib/python3.14/site-packages/ngsolve/demos/TensorProduct/tp_dg_1d_2d.py +73 -0
  226. ngsolve-6.2.2506.post75.dev0.data/data/lib/python3.14/site-packages/ngsolve/demos/TensorProduct/tp_dg_2d_1d.py +72 -0
  227. ngsolve-6.2.2506.post75.dev0.data/data/lib/python3.14/site-packages/ngsolve/demos/TensorProduct/tp_dg_2d_2d.py +66 -0
  228. ngsolve-6.2.2506.post75.dev0.data/data/lib/python3.14/site-packages/ngsolve/demos/__init__.py +0 -0
  229. ngsolve-6.2.2506.post75.dev0.data/data/lib/python3.14/site-packages/ngsolve/demos/howto/__init__.py +0 -0
  230. ngsolve-6.2.2506.post75.dev0.data/data/lib/python3.14/site-packages/ngsolve/demos/howto/hhj.py +44 -0
  231. ngsolve-6.2.2506.post75.dev0.data/data/lib/python3.14/site-packages/ngsolve/demos/howto/hybrid_dg.py +53 -0
  232. ngsolve-6.2.2506.post75.dev0.data/data/lib/python3.14/site-packages/ngsolve/demos/howto/mixed.py +30 -0
  233. ngsolve-6.2.2506.post75.dev0.data/data/lib/python3.14/site-packages/ngsolve/demos/howto/nonlin.py +29 -0
  234. ngsolve-6.2.2506.post75.dev0.data/data/lib/python3.14/site-packages/ngsolve/demos/howto/pickling.py +26 -0
  235. ngsolve-6.2.2506.post75.dev0.data/data/lib/python3.14/site-packages/ngsolve/demos/howto/pml.py +31 -0
  236. ngsolve-6.2.2506.post75.dev0.data/data/lib/python3.14/site-packages/ngsolve/demos/howto/taskmanager.py +20 -0
  237. ngsolve-6.2.2506.post75.dev0.data/data/lib/python3.14/site-packages/ngsolve/demos/howto/tdnns.py +47 -0
  238. ngsolve-6.2.2506.post75.dev0.data/data/lib/python3.14/site-packages/ngsolve/demos/howto/timeDG-skeleton.py +45 -0
  239. ngsolve-6.2.2506.post75.dev0.data/data/lib/python3.14/site-packages/ngsolve/demos/howto/timeDG.py +38 -0
  240. ngsolve-6.2.2506.post75.dev0.data/data/lib/python3.14/site-packages/ngsolve/demos/howto/timeDGlap.py +42 -0
  241. ngsolve-6.2.2506.post75.dev0.data/data/lib/python3.14/site-packages/ngsolve/demos/howto/timeDGwave.py +61 -0
  242. ngsolve-6.2.2506.post75.dev0.data/data/lib/python3.14/site-packages/ngsolve/demos/intro/__init__.py +0 -0
  243. ngsolve-6.2.2506.post75.dev0.data/data/lib/python3.14/site-packages/ngsolve/demos/intro/adaptive.py +123 -0
  244. ngsolve-6.2.2506.post75.dev0.data/data/lib/python3.14/site-packages/ngsolve/demos/intro/cmagnet.py +59 -0
  245. ngsolve-6.2.2506.post75.dev0.data/data/lib/python3.14/site-packages/ngsolve/demos/intro/elasticity.py +76 -0
  246. ngsolve-6.2.2506.post75.dev0.data/data/lib/python3.14/site-packages/ngsolve/demos/intro/navierstokes.py +74 -0
  247. ngsolve-6.2.2506.post75.dev0.data/data/lib/python3.14/site-packages/ngsolve/demos/intro/poisson.ipynb +170 -0
  248. ngsolve-6.2.2506.post75.dev0.data/data/lib/python3.14/site-packages/ngsolve/demos/intro/poisson.py +41 -0
  249. ngsolve-6.2.2506.post75.dev0.data/data/lib/python3.14/site-packages/ngsolve/demos/mpi/__init__.py +0 -0
  250. ngsolve-6.2.2506.post75.dev0.data/data/lib/python3.14/site-packages/ngsolve/demos/mpi/mpi_cmagnet.py +87 -0
  251. ngsolve-6.2.2506.post75.dev0.data/data/lib/python3.14/site-packages/ngsolve/demos/mpi/mpi_navierstokes.py +117 -0
  252. ngsolve-6.2.2506.post75.dev0.data/data/lib/python3.14/site-packages/ngsolve/demos/mpi/mpi_poisson.py +89 -0
  253. ngsolve-6.2.2506.post75.dev0.data/data/lib/python3.14/site-packages/ngsolve/demos/mpi/mpi_timeDG.py +82 -0
  254. ngsolve-6.2.2506.post75.dev0.data/data/lib/python3.14/site-packages/ngsolve/directsolvers.py +26 -0
  255. ngsolve-6.2.2506.post75.dev0.data/data/lib/python3.14/site-packages/ngsolve/eigenvalues.py +364 -0
  256. ngsolve-6.2.2506.post75.dev0.data/data/lib/python3.14/site-packages/ngsolve/internal.py +89 -0
  257. ngsolve-6.2.2506.post75.dev0.data/data/lib/python3.14/site-packages/ngsolve/krylovspace.py +1013 -0
  258. ngsolve-6.2.2506.post75.dev0.data/data/lib/python3.14/site-packages/ngsolve/meshes.py +748 -0
  259. ngsolve-6.2.2506.post75.dev0.data/data/lib/python3.14/site-packages/ngsolve/ngs2petsc.py +310 -0
  260. ngsolve-6.2.2506.post75.dev0.data/data/lib/python3.14/site-packages/ngsolve/ngscuda.so +0 -0
  261. ngsolve-6.2.2506.post75.dev0.data/data/lib/python3.14/site-packages/ngsolve/ngscxx.py +42 -0
  262. ngsolve-6.2.2506.post75.dev0.data/data/lib/python3.14/site-packages/ngsolve/ngslib.so +0 -0
  263. ngsolve-6.2.2506.post75.dev0.data/data/lib/python3.14/site-packages/ngsolve/nonlinearsolvers.py +203 -0
  264. ngsolve-6.2.2506.post75.dev0.data/data/lib/python3.14/site-packages/ngsolve/preconditioners.py +11 -0
  265. ngsolve-6.2.2506.post75.dev0.data/data/lib/python3.14/site-packages/ngsolve/solve_implementation.py +168 -0
  266. ngsolve-6.2.2506.post75.dev0.data/data/lib/python3.14/site-packages/ngsolve/solvers.py +7 -0
  267. ngsolve-6.2.2506.post75.dev0.data/data/lib/python3.14/site-packages/ngsolve/timestepping.py +185 -0
  268. ngsolve-6.2.2506.post75.dev0.data/data/lib/python3.14/site-packages/ngsolve/timing.py +108 -0
  269. ngsolve-6.2.2506.post75.dev0.data/data/lib/python3.14/site-packages/ngsolve/utils.py +167 -0
  270. ngsolve-6.2.2506.post75.dev0.data/data/lib/python3.14/site-packages/ngsolve/webgui.py +670 -0
  271. ngsolve-6.2.2506.post75.dev0.data/data/share/ngsolve/beam.geo +17 -0
  272. ngsolve-6.2.2506.post75.dev0.data/data/share/ngsolve/beam.vol +240 -0
  273. ngsolve-6.2.2506.post75.dev0.data/data/share/ngsolve/chip.in2d +41 -0
  274. ngsolve-6.2.2506.post75.dev0.data/data/share/ngsolve/chip.vol +614 -0
  275. ngsolve-6.2.2506.post75.dev0.data/data/share/ngsolve/coil.geo +12 -0
  276. ngsolve-6.2.2506.post75.dev0.data/data/share/ngsolve/coil.vol +2560 -0
  277. ngsolve-6.2.2506.post75.dev0.data/data/share/ngsolve/coilshield.geo +24 -0
  278. ngsolve-6.2.2506.post75.dev0.data/data/share/ngsolve/coilshield.vol +3179 -0
  279. ngsolve-6.2.2506.post75.dev0.data/data/share/ngsolve/cube.geo +19 -0
  280. ngsolve-6.2.2506.post75.dev0.data/data/share/ngsolve/cube.vol +1832 -0
  281. ngsolve-6.2.2506.post75.dev0.data/data/share/ngsolve/d10_DGdoubleglazing.pde +50 -0
  282. ngsolve-6.2.2506.post75.dev0.data/data/share/ngsolve/d11_chip_nitsche.pde +40 -0
  283. ngsolve-6.2.2506.post75.dev0.data/data/share/ngsolve/d1_square.pde +43 -0
  284. ngsolve-6.2.2506.post75.dev0.data/data/share/ngsolve/d2_chip.pde +35 -0
  285. ngsolve-6.2.2506.post75.dev0.data/data/share/ngsolve/d3_helmholtz.pde +22 -0
  286. ngsolve-6.2.2506.post75.dev0.data/data/share/ngsolve/d4_cube.pde +46 -0
  287. ngsolve-6.2.2506.post75.dev0.data/data/share/ngsolve/d5_beam.pde +74 -0
  288. ngsolve-6.2.2506.post75.dev0.data/data/share/ngsolve/d6_shaft.pde +73 -0
  289. ngsolve-6.2.2506.post75.dev0.data/data/share/ngsolve/d7_coil.pde +50 -0
  290. ngsolve-6.2.2506.post75.dev0.data/data/share/ngsolve/d8_coilshield.pde +49 -0
  291. ngsolve-6.2.2506.post75.dev0.data/data/share/ngsolve/d9_hybridDG.pde +72 -0
  292. ngsolve-6.2.2506.post75.dev0.data/data/share/ngsolve/doubleglazing.in2d +27 -0
  293. ngsolve-6.2.2506.post75.dev0.data/data/share/ngsolve/doubleglazing.vol +737 -0
  294. ngsolve-6.2.2506.post75.dev0.data/data/share/ngsolve/piezo2d40round4.vol.gz +0 -0
  295. ngsolve-6.2.2506.post75.dev0.data/data/share/ngsolve/shaft.geo +73 -0
  296. ngsolve-6.2.2506.post75.dev0.data/data/share/ngsolve/shaft.vol +4291 -0
  297. ngsolve-6.2.2506.post75.dev0.data/data/share/ngsolve/square.in2d +17 -0
  298. ngsolve-6.2.2506.post75.dev0.data/data/share/ngsolve/square.vol +149 -0
  299. ngsolve-6.2.2506.post75.dev0.dist-info/METADATA +14 -0
  300. ngsolve-6.2.2506.post75.dev0.dist-info/RECORD +303 -0
  301. ngsolve-6.2.2506.post75.dev0.dist-info/WHEEL +5 -0
  302. ngsolve-6.2.2506.post75.dev0.dist-info/licenses/LICENSE +504 -0
  303. ngsolve-6.2.2506.post75.dev0.dist-info/top_level.txt +1 -0
@@ -0,0 +1,1661 @@
1
+ #ifndef FILE_NG_LAPACK
2
+ #define FILE_NG_LAPACK
3
+
4
+ // #include <mkl_cblas.h>
5
+
6
+ /****************************************************************************/
7
+ /* File: ng_lapack.hpp */
8
+ /* Author: Joachim Schoeberl */
9
+ /* Date: 21. Nov. 2004 */
10
+ /****************************************************************************/
11
+
12
+
13
+
14
+ namespace ngbla
15
+ {
16
+
17
+ class T_Lapack { };
18
+ static constexpr T_Lapack Lapack;
19
+
20
+ template <typename TA>
21
+ class LapackExpr : public Expr<LapackExpr<TA> >
22
+ {
23
+ const TA & a;
24
+ public:
25
+ LapackExpr (const TA & aa) : a(aa) { ; }
26
+ const TA & A() const { return a; }
27
+ size_t Height() const { return a.Height(); }
28
+ size_t Width() const { return a.Width(); }
29
+ };
30
+
31
+ template <typename TA>
32
+ INLINE LapackExpr<TA> operator| (const Expr<TA> & a, T_Lapack /* tl */)
33
+ {
34
+ return LapackExpr<TA> (a.Spec());
35
+ }
36
+
37
+
38
+ template <typename TOP, typename T, typename TB>
39
+ class assign_trait<TOP, T, LapackExpr<TB>, int>
40
+ {
41
+ public:
42
+ static INLINE T & Assign (MatExpr<T> & self, const Expr<LapackExpr<TB>> & v)
43
+ {
44
+ #ifdef LAPACK
45
+ if constexpr (std::is_same_v<TOP,typename MatExpr<T>::As>)
46
+ LapackMultAdd (v.Spec().A().A(), v.Spec().A().B(), 1.0, self.Spec(), 0.0);
47
+ if constexpr (std::is_same_v<TOP,typename MatExpr<T>::AsAdd>)
48
+ LapackMultAdd (v.Spec().A().A(), v.Spec().A().B(), 1.0, self.Spec(), 1.0);
49
+ if constexpr (std::is_same_v<TOP,typename MatExpr<T>::AsSub>)
50
+ LapackMultAdd (v.Spec().A().A(), v.Spec().A().B(), -1.0, self.Spec(), 1.0);
51
+ return self.Spec();
52
+ #else // LAPACK
53
+ throw Exception("No Lapack");
54
+ #endif // LAPACK
55
+ }
56
+ };
57
+
58
+
59
+
60
+
61
+
62
+
63
+
64
+ #ifdef LAPACK
65
+
66
+ extern "C" {
67
+ #ifdef MKL_ILP64
68
+ typedef long int integer;
69
+ #else
70
+ typedef int integer;
71
+ #endif
72
+ // typedef char logical;
73
+ typedef integer logical;
74
+ typedef float real;
75
+ typedef double doublereal;
76
+ typedef Complex doublecomplex;
77
+ typedef complex<float> singlecomplex;
78
+
79
+
80
+ // Windows SDK defines VOID in the file WinNT.h
81
+ #ifndef VOID
82
+ typedef void VOID;
83
+ #endif
84
+
85
+ typedef int ftnlen;
86
+ typedef int L_fp; // ?
87
+
88
+
89
+ #include "clapack.h"
90
+ }
91
+
92
+
93
+ // Interface to lapack functions
94
+ NGS_DLL_HEADER int sgemm(char *transa, char *transb, integer *m, integer *
95
+ n, integer *k, real *alpha, real *a, integer *lda,
96
+ real *b, integer *ldb, real *beta, real *c__,
97
+ integer *ldc);
98
+
99
+ NGS_DLL_HEADER int dgemm(char *transa, char *transb, integer *m, integer *
100
+ n, integer *k, doublereal *alpha, doublereal *a, integer *lda,
101
+ doublereal *b, integer *ldb, doublereal *beta, doublereal *c__,
102
+ integer *ldc);
103
+
104
+ NGS_DLL_HEADER int sgemm(char *transa, char *transb, integer *m, integer *
105
+ n, integer *k, real *alpha, real *a, integer *lda,
106
+ real *b, integer *ldb, real *beta, real *c__,
107
+ integer *ldc);
108
+
109
+ NGS_DLL_HEADER int zgemm(char *transa, char *transb, integer *m, integer *
110
+ n, integer *k, doublecomplex *alpha, doublecomplex *a, integer *lda,
111
+ doublecomplex *b, integer *ldb, doublecomplex *beta, doublecomplex *
112
+ c__, integer *ldc);
113
+
114
+ NGS_DLL_HEADER int dger(integer *m, integer *n, doublereal *alpha,
115
+ doublereal *x, integer *incx, doublereal *y, integer *incy,
116
+ doublereal *a, integer *lda);
117
+
118
+ NGS_DLL_HEADER int dgetrf(integer* n, integer* m, double* a, integer* lda, integer* ipiv, integer* info);
119
+ NGS_DLL_HEADER int dgetri(integer* n, double* a, integer* lda, integer* ipiv,
120
+ double* hwork, integer* lwork, integer* info);
121
+ NGS_DLL_HEADER int dgetrs(char *trans, integer *n, integer *nrhs,
122
+ doublereal *a, integer *lda, integer *ipiv, doublereal *b, integer *
123
+ ldb, integer *info);
124
+
125
+
126
+ inline int gemm(char *transa, char *transb, integer *m, integer *
127
+ n, integer *k, real *alpha, real *a, integer *lda,
128
+ real *b, integer *ldb, real *beta, real *c__,
129
+ integer *ldc)
130
+ {
131
+ return sgemm (transa, transb, m, n, k, alpha, a, lda, b, ldb, beta, c__, ldc);
132
+ }
133
+
134
+ inline int gemm(char *transa, char *transb, integer *m, integer *
135
+ n, integer *k, doublereal *alpha, doublereal *a, integer *lda,
136
+ doublereal *b, integer *ldb, doublereal *beta, doublereal *c__,
137
+ integer *ldc)
138
+ {
139
+ return dgemm (transa, transb, m, n, k, alpha, a, lda, b, ldb, beta, c__, ldc);
140
+ }
141
+
142
+ inline int gemm(char *transa, char *transb, integer *m, integer *
143
+ n, integer *k, doublecomplex *alpha, doublecomplex *a, integer *lda,
144
+ doublecomplex *b, integer *ldb, doublecomplex *beta, doublecomplex *
145
+ c__, integer *ldc)
146
+ {
147
+ return zgemm (transa, transb, m, n, k, alpha, a, lda, b, ldb, beta, c__, ldc);
148
+ }
149
+
150
+
151
+ // BLAS 1
152
+
153
+ inline double LapackDot (FlatVector<double> x, FlatVector<double> y)
154
+ {
155
+ integer n = x.Size();
156
+ integer incx = 1;
157
+ integer incy = 1;
158
+ return ddot_ (&n, &x(0), &incx, &y(0), &incy);
159
+ }
160
+
161
+
162
+
163
+ // BLAS 2
164
+
165
+ /*
166
+ extern "C"
167
+ void dgemv_ (char & trans, int & m, int & n, double & alpha, double & a, int & lda, double & x, int & incx,
168
+ double & beta, double & y, int & incy);
169
+ */
170
+
171
+ inline void LapackMultAx (ngbla::FlatMatrix<double> a,
172
+ ngbla::FlatVector<double> x,
173
+ ngbla::FlatVector<double> y)
174
+ {
175
+ char trans = 'T';
176
+ integer m = a.Width();
177
+ integer n = a.Height();
178
+ double alpha = 1;
179
+ integer lda = max(size_t(1), a.Width());
180
+ integer incx = 1;
181
+ double beta = 0;
182
+ integer incy = 1;
183
+ dgemv_ (&trans, &m, &n, &alpha, &a(0,0), &lda, &x(0), &incx, &beta, &y(0), &incy);
184
+ }
185
+
186
+ inline void LapackMultAx (ngbla::FlatMatrix<Complex> a,
187
+ ngbla::FlatVector<Complex> x,
188
+ ngbla::FlatVector<Complex> y)
189
+ {
190
+ char trans = 'T';
191
+ integer m = a.Width();
192
+ integer n = a.Height();
193
+ Complex alpha(1,0);
194
+ integer lda = max(size_t(1), a.Width());
195
+ integer incx = 1;
196
+ Complex beta(0, 0);
197
+ integer incy = 1;
198
+ zgemv_ (&trans, &m, &n, &alpha, &a(0,0), &lda, &x(0), &incx, &beta, &y(0), &incy);
199
+ }
200
+
201
+
202
+
203
+ inline void LapackMultAtx (ngbla::FlatMatrix<double> a,
204
+ ngbla::FlatVector<double> x,
205
+ ngbla::FlatVector<double> y)
206
+ {
207
+ char trans = 'N';
208
+ integer m = a.Width();
209
+ integer n = a.Height();
210
+ double alpha = 1;
211
+ integer lda = max(size_t(1), a.Width());
212
+ integer incx = 1;
213
+ double beta = 0;
214
+ integer incy = 1;
215
+ dgemv_ (&trans, &m, &n, &alpha, &a(0,0), &lda, &x(0), &incx, &beta, &y(0), &incy);
216
+ }
217
+
218
+
219
+ inline void LapackAddxyt (ngbla::FlatMatrix<double> a,
220
+ double fac,
221
+ ngbla::FlatVector<double> x,
222
+ ngbla::FlatVector<double> y)
223
+ {
224
+ integer m = a.Width();
225
+ integer n = a.Height();
226
+ double alpha = fac;
227
+ integer lda = max(size_t(1), a.Width());
228
+ integer incx = 1;
229
+ integer incy = 1;
230
+
231
+ dger (&m, &n, &alpha, &y(0), &incx, &x(0), &incy, &a(0,0), &lda);
232
+ }
233
+
234
+
235
+
236
+
237
+
238
+ template <typename SCAL>
239
+ inline void BASE_LapackMult (SliceMatrix<SCAL> a, bool transa,
240
+ SliceMatrix<SCAL> b, bool transb,
241
+ SliceMatrix<SCAL> c)
242
+ {
243
+ char transa_ = transa ? 'T' : 'N';
244
+ char transb_ = transb ? 'T' : 'N';
245
+
246
+ integer n = c.Width();
247
+ integer m = c.Height();
248
+ if (n == 0 || m == 0) return;
249
+ integer k = transa ? a.Height() : a.Width();
250
+ SCAL alpha = 1.0;
251
+ SCAL beta = 0;
252
+ integer lda = max(size_t(1), a.Dist());
253
+ integer ldb = max(size_t(1), b.Dist());
254
+ integer ldc = max(size_t(1), c.Dist());
255
+
256
+ gemm (&transb_, &transa_, &n, &m, &k, &alpha,
257
+ &b(0,0), &ldb, &a(0,0), &lda, &beta, &c(0,0), &ldc);
258
+ }
259
+
260
+ template <typename SCAL>
261
+ inline void BASE_LapackMultAdd (SliceMatrix<SCAL> a, bool transa,
262
+ SliceMatrix<SCAL> b, bool transb,
263
+ SCAL aalpha,
264
+ SliceMatrix<SCAL> c,
265
+ SCAL abeta)
266
+ {
267
+ char transa_ = transa ? 'T' : 'N';
268
+ char transb_ = transb ? 'T' : 'N';
269
+
270
+ integer n = c.Width();
271
+ integer m = c.Height();
272
+ if (n == 0 || m == 0) return;
273
+ integer k = transa ? a.Height() : a.Width();
274
+ SCAL alpha = aalpha;
275
+ SCAL beta = abeta;
276
+ integer lda = max(size_t(1), a.Dist());
277
+ integer ldb = max(size_t(1), b.Dist());
278
+ integer ldc = max(size_t(1), c.Dist());
279
+
280
+ gemm (&transb_, &transa_, &n, &m, &k, &alpha,
281
+ &b(0,0), &ldb, &a(0,0), &lda, &beta, &c(0,0), &ldc);
282
+ }
283
+
284
+
285
+
286
+ template <typename TA, typename TB, typename TC>
287
+ inline void LapackMult (const TA & a,
288
+ const TB & b,
289
+ const TC & c)
290
+ { BASE_LapackMult<typename TC::TSCAL> (a, false, b, false, c); }
291
+
292
+ template <typename TA, typename TB, typename TC>
293
+ inline void LapackMult (const TA & a,
294
+ TransExpr<TB> b,
295
+ const TC & c)
296
+ { BASE_LapackMult<typename TC::TSCAL> (a, false, b.A(), true, c); }
297
+
298
+ template <typename TA, typename TB, typename TC>
299
+ inline void LapackMult (TransExpr<TA> a,
300
+ const TB & b,
301
+ const TC & c)
302
+ { BASE_LapackMult<typename TC::TSCAL> (a.A(), true, b, false, c); }
303
+
304
+ template <typename TA, typename TB, typename TC>
305
+ inline void LapackMult (TransExpr<TA> a,
306
+ TransExpr<TB> b,
307
+ const TC & c)
308
+ { BASE_LapackMult<typename TC::TSCAL> (a.A(), true, b.A(), true, c); }
309
+
310
+
311
+
312
+ /*
313
+ inline void LapackMult (SliceMatrix<double> a,
314
+ SliceMatrix<double> b,
315
+ SliceMatrix<double> c)
316
+ { BASE_LapackMult<double> (a, false, b, false, c); }
317
+
318
+ template <typename TA>
319
+ inline void LapackMult (SliceMatrix<double> a,
320
+ TransExpr<TA> b,
321
+ SliceMatrix<double> c)
322
+ { BASE_LapackMult<double> (a, false, b.A(), true, c); }
323
+
324
+ template <typename TA>
325
+ inline void LapackMult (TransExpr<TA> a,
326
+ SliceMatrix<double> b,
327
+ SliceMatrix<double> c)
328
+ { BASE_LapackMult<double> (a.A(), true, b, false, c); }
329
+
330
+ template <typename TA, typename TB>
331
+ inline void LapackMult (TransExpr<TA> a,
332
+ TransExpr<TB> b,
333
+ SliceMatrix<double> c)
334
+ { BASE_LapackMult<double> (a.A(), true, b.A(), true, c); }
335
+ */
336
+
337
+
338
+ /*
339
+ inline void LapackMult (SliceMatrix<Complex> a,
340
+ SliceMatrix<Complex> b,
341
+ SliceMatrix<Complex> c)
342
+ { BASE_LapackMult<Complex> (a, false, b, false, c); }
343
+
344
+ template <typename TA>
345
+ inline void LapackMult (SliceMatrix<Complex> a,
346
+ TransExpr<TA> b,
347
+ SliceMatrix<Complex> c)
348
+ { BASE_LapackMult<Complex> (a, false, b.A(), true, c); }
349
+
350
+ template <typename TA>
351
+ inline void LapackMult (TransExpr<TA> a,
352
+ SliceMatrix<Complex> b,
353
+ SliceMatrix<Complex> c)
354
+ { BASE_LapackMult<Complex> (a.A(), true, b, false, c); }
355
+
356
+ template <typename TA, typename TB>
357
+ inline void LapackMult (TransExpr<TA> a,
358
+ TransExpr<TB> b,
359
+ SliceMatrix<Complex> c)
360
+ { BASE_LapackMult<Complex> (a.A(), true, b.A(), true, c); }
361
+ */
362
+
363
+
364
+
365
+ inline void LapackMultAdd (SliceMatrix<float> a,
366
+ SliceMatrix<float> b,
367
+ float alpha,
368
+ SliceMatrix<float> c,
369
+ float beta)
370
+ { BASE_LapackMultAdd<float> (a, false, b, false, alpha, c, beta); }
371
+
372
+ inline void LapackMultAdd (SliceMatrix<double> a,
373
+ SliceMatrix<double> b,
374
+ double alpha,
375
+ SliceMatrix<double> c,
376
+ double beta)
377
+ { BASE_LapackMultAdd<double> (a, false, b, false, alpha, c, beta); }
378
+
379
+ inline void LapackMultAdd (SliceMatrix<double,ColMajor> a,
380
+ SliceMatrix<double> b,
381
+ double alpha,
382
+ SliceMatrix<double> c,
383
+ double beta)
384
+ { BASE_LapackMultAdd<double> (Trans(a), true, b, false, alpha, c, beta); }
385
+
386
+ inline void LapackMultAdd (SliceMatrix<double> a,
387
+ SliceMatrix<double,ColMajor> b,
388
+ double alpha,
389
+ SliceMatrix<double> c,
390
+ double beta)
391
+ { BASE_LapackMultAdd<double> (a, false, Trans(b), true, alpha, c, beta); }
392
+
393
+ inline void LapackMultAdd (SliceMatrix<double,ColMajor> a,
394
+ SliceMatrix<double,ColMajor> b,
395
+ double alpha,
396
+ SliceMatrix<double> c,
397
+ double beta)
398
+ { BASE_LapackMultAdd<double> (Trans(a), true, Trans(b), true, alpha, c, beta); }
399
+
400
+
401
+
402
+ /*
403
+ template <typename TA>
404
+ inline void LapackMultAdd (SliceMatrix<double> a,
405
+ TransExpr<TA> b,
406
+ double alpha,
407
+ SliceMatrix<double> c,
408
+ double beta = 1.0)
409
+ { BASE_LapackMultAdd<double> (a, false, b.A(), true, alpha, c, beta); }
410
+
411
+ template <typename TA>
412
+ inline void LapackMultAdd (TransExpr<TA> a,
413
+ SliceMatrix<double> b,
414
+ double alpha,
415
+ SliceMatrix<double> c,
416
+ double beta = 1.0)
417
+ { BASE_LapackMultAdd<double> (a.A(), true, b, false, alpha, c, beta); }
418
+
419
+ template <typename TA, typename TB>
420
+ inline void LapackMultAdd (TransExpr<TA> a,
421
+ TransExpr<TB> b,
422
+ double alpha,
423
+ SliceMatrix<double> c,
424
+ double beta = 1.0)
425
+ { BASE_LapackMultAdd<double> (a.A(), true, b.A(), true, alpha, c, beta); }
426
+ */
427
+
428
+
429
+ inline void LapackMultAdd (SliceMatrix<Complex> a,
430
+ SliceMatrix<Complex> b,
431
+ Complex alpha,
432
+ SliceMatrix<Complex> c,
433
+ Complex beta = 1.0)
434
+ { BASE_LapackMultAdd<Complex> (a, false, b, false, alpha, c, beta); }
435
+
436
+ inline void LapackMultAdd (SliceMatrix<Complex,ColMajor> a,
437
+ SliceMatrix<Complex> b,
438
+ Complex alpha,
439
+ SliceMatrix<Complex> c,
440
+ Complex beta)
441
+ { BASE_LapackMultAdd<Complex> (Trans(a), true, b, false, alpha, c, beta); }
442
+
443
+ inline void LapackMultAdd (SliceMatrix<Complex> a,
444
+ SliceMatrix<Complex,ColMajor> b,
445
+ Complex alpha,
446
+ SliceMatrix<Complex> c,
447
+ Complex beta)
448
+ { BASE_LapackMultAdd<Complex> (a, false, Trans(b), true, alpha, c, beta); }
449
+
450
+ inline void LapackMultAdd (SliceMatrix<Complex,ColMajor> a,
451
+ SliceMatrix<Complex,ColMajor> b,
452
+ Complex alpha,
453
+ SliceMatrix<Complex> c,
454
+ Complex beta)
455
+ { BASE_LapackMultAdd<Complex> (Trans(a), true, Trans(b), true, alpha, c, beta); }
456
+
457
+
458
+ template <typename TA>
459
+ inline void LapackMultAdd (SliceMatrix<Complex> a,
460
+ TransExpr<TA> b,
461
+ Complex alpha,
462
+ SliceMatrix<Complex> c,
463
+ Complex beta = 1.0)
464
+ { BASE_LapackMultAdd<Complex> (a, false, b.A(), true, alpha, c, beta); }
465
+
466
+ template <typename TA>
467
+ inline void LapackMultAdd (TransExpr<TA> a,
468
+ SliceMatrix<Complex> b,
469
+ Complex alpha,
470
+ SliceMatrix<Complex> c,
471
+ Complex beta)
472
+ { BASE_LapackMultAdd<Complex> (a.A(), true, b, false, alpha, c, beta); }
473
+
474
+ template <typename TA, typename TB>
475
+ inline void LapackMultAdd (TransExpr<TA> a,
476
+ TransExpr<TB> b,
477
+ Complex alpha,
478
+ SliceMatrix<Complex> c,
479
+ Complex beta)
480
+ { BASE_LapackMultAdd<Complex> (a.A(), true, b.A(), true, alpha, c, beta); }
481
+
482
+
483
+
484
+ template <typename TA, typename TB, typename Talpha, typename Tc, typename Tbeta>
485
+ inline void LapackMultAdd (MinusExpr<TA> a,
486
+ const TB & b,
487
+ Talpha alpha,
488
+ const Tc & c,
489
+ Tbeta beta)
490
+ { LapackMultAdd (a.A(), b, -alpha, c, beta); }
491
+
492
+
493
+
494
+
495
+
496
+
497
+ // we don't have a lapack function for that
498
+ void LapackMultAdd (SliceMatrix<double> a,
499
+ SliceMatrix<Complex,ColMajor> b,
500
+ Complex alpha,
501
+ SliceMatrix<Complex> c,
502
+ Complex beta);
503
+ // ---> moved implementation to ng_blas
504
+ /*
505
+ {
506
+ if (beta == 0.0)
507
+ c = alpha * (a * b);
508
+ else
509
+ {
510
+ c *= beta;
511
+ c += alpha * (a * b);
512
+ }
513
+ // BASE_LapackMultAdd<double> (Trans(a), true, Trans(b), true, alpha, c, beta);
514
+ }
515
+ */
516
+
517
+ template <typename TA, typename TB, typename ALPHA, typename BETA, typename TC>
518
+ inline void LapackMultAdd (TA a,
519
+ TB b,
520
+ ALPHA alpha,
521
+ SliceMatrix<TC,ColMajor> c,
522
+ BETA beta)
523
+ {
524
+ LapackMultAdd (Trans(b), Trans(a), alpha, Trans(c), beta);
525
+ }
526
+
527
+
528
+ /*
529
+
530
+ // old-style function names, new driver
531
+ inline void LapackMultABt (SliceMatrix<double> a,
532
+ SliceMatrix<double> b,
533
+ SliceMatrix<double> c)
534
+ { BASE_LapackMult (a, false, b, true, c); }
535
+
536
+ inline void LapackMultABt (SliceMatrix<Complex> a,
537
+ SliceMatrix<Complex> b,
538
+ SliceMatrix<Complex> c)
539
+ { BASE_LapackMult (a, false, b, true, c); }
540
+
541
+ inline void LapackMultAB (SliceMatrix<double> a,
542
+ SliceMatrix<double> b,
543
+ SliceMatrix<double> c)
544
+ { BASE_LapackMult (a, false, b, false, c); }
545
+
546
+ inline void LapackMultAB (SliceMatrix<Complex> a,
547
+ SliceMatrix<Complex> b,
548
+ SliceMatrix<Complex> c)
549
+ { BASE_LapackMult (a, false, b, false, c); }
550
+
551
+
552
+ inline void LapackMultAtB (SliceMatrix<double> a,
553
+ SliceMatrix<double> b,
554
+ SliceMatrix<double> c)
555
+ { BASE_LapackMult (a, true, b, false, c); }
556
+
557
+ inline void LapackMultAtB (SliceMatrix<Complex> a,
558
+ SliceMatrix<Complex> b,
559
+ SliceMatrix<Complex> c)
560
+ { BASE_LapackMult (a, true, b, false, c); }
561
+
562
+
563
+ inline void LapackMultAtBt (SliceMatrix<double> a,
564
+ SliceMatrix<double> b,
565
+ SliceMatrix<double> c)
566
+ { BASE_LapackMult (a, true, b, true, c); }
567
+ inline void LapackMultAtBt (SliceMatrix<Complex> a,
568
+ SliceMatrix<Complex> b,
569
+ SliceMatrix<Complex> c)
570
+ { BASE_LapackMult (a, true, b, true, c); }
571
+
572
+ */
573
+
574
+
575
+
576
+
577
+
578
+
579
+ // old functions for compatibility
580
+ inline void LapackMultABt (SliceMatrix<double> a,
581
+ SliceMatrix<double> b,
582
+ SliceMatrix<double> c)
583
+ {
584
+ char transa = 'T';
585
+ char transb = 'N';
586
+ integer m = c.Height();
587
+ integer n = c.Width();
588
+ integer k = a.Width();
589
+ double alpha = 1.0;
590
+ double beta = 0;
591
+ integer lda = max(size_t(1), a.Dist());
592
+ integer ldb = max(size_t(1), b.Dist());
593
+ integer ldc = max(size_t(1), c.Dist());
594
+
595
+ dgemm (&transa, &transb, &n, &m, &k, &alpha, &b(0,0), &ldb, &a(0,0), &lda, &beta, &c(0,0), &ldc);
596
+ }
597
+
598
+
599
+ inline void LapackMultAB (SliceMatrix<double> a,
600
+ SliceMatrix<double> b,
601
+ SliceMatrix<double> c)
602
+ {
603
+ char transa = 'N';
604
+ char transb = 'N';
605
+ integer m = c.Height();
606
+ integer n = c.Width();
607
+ integer k = a.Width();
608
+ double alpha = 1.0;
609
+ double beta = 0;
610
+ integer lda = max(size_t(1), a.Dist());
611
+ integer ldb = max(size_t(1), b.Dist());
612
+ integer ldc = max(size_t(1), c.Dist());
613
+ dgemm (&transa, &transb, &n, &m, &k, &alpha, &b(0,0), &ldb, &a(0,0), &lda, &beta, &c(0,0), &ldc);
614
+ }
615
+
616
+ inline void LapackMultAtB (ngbla::FlatMatrix<double> a,
617
+ ngbla::FlatMatrix<double> b,
618
+ ngbla::SliceMatrix<double> c)
619
+ {
620
+ char transa = 'N';
621
+ char transb = 'T';
622
+ integer m = c.Height(); // changed n,m
623
+ integer n = c.Width();
624
+ integer k = a.Height();
625
+ double alpha = 1.0;
626
+ double beta = 0;
627
+ integer lda = max(size_t(1), a.Width());
628
+ integer ldb = max(size_t(1), b.Width());
629
+ integer ldc = max(size_t(1), c.Dist()); // c.Width();
630
+
631
+ dgemm (&transa, &transb, &n, &m, &k, &alpha, &b(0,0), &ldb, &a(0,0), &lda, &beta, &c(0,0), &ldc);
632
+ }
633
+
634
+ inline void LapackMultAtBt (ngbla::FlatMatrix<double> a,
635
+ ngbla::FlatMatrix<double> b,
636
+ ngbla::FlatMatrix<double> c)
637
+ {
638
+ char transa = 'T';
639
+ char transb = 'T';
640
+ integer m = c.Height();
641
+ integer n = c.Width();
642
+ integer k = a.Height();
643
+ double alpha = 1.0;
644
+ double beta = 0;
645
+ integer lda = max(size_t(1), a.Width());
646
+ integer ldb = max(size_t(1), b.Width());
647
+ integer ldc = max(size_t(1), c.Width());
648
+
649
+ dgemm (&transa, &transb, &n, &m, &k, &alpha, &b(0,0), &ldb, &a(0,0), &lda, &beta, &c(0,0), &ldc);
650
+ }
651
+
652
+ inline void LapackMultABt (ngbla::FlatMatrix<ngbla::Complex> a,
653
+ ngbla::FlatMatrix<ngbla::Complex> b,
654
+ ngbla::FlatMatrix<ngbla::Complex> c)
655
+ {
656
+ // c = a * Trans (b);
657
+
658
+ char transa = 'T';
659
+ char transb = 'N';
660
+ integer m = c.Height();
661
+ integer n = c.Width();
662
+ integer k = a.Width();
663
+ Complex alpha(1,0); // double alpha[2] = { 1.0, 0.0 };
664
+ Complex beta(0,0); // double beta[2] = { 0.0, 0.0 };
665
+ integer lda = max(size_t(1), a.Width());
666
+ integer ldb = max(size_t(1), b.Width());
667
+ integer ldc = max(size_t(1), c.Width());
668
+
669
+ zgemm (&transa, &transb, &n, &m, &k, &alpha,
670
+ &b(0,0), &ldb,
671
+ &a(0,0), &lda, &beta,
672
+ &c(0,0), &ldc);
673
+
674
+ }
675
+
676
+
677
+
678
+ inline void LapackMultAddABt (ngbla::FlatMatrix<double> a,
679
+ ngbla::FlatMatrix<double> b,
680
+ double fac,
681
+ ngbla::FlatMatrix<double> c)
682
+ {
683
+ char transa = 'T';
684
+ char transb = 'N';
685
+ integer m = c.Height();
686
+ integer n = c.Width();
687
+ integer k = a.Width();
688
+ double alpha = fac;
689
+ double beta = 1.0;
690
+ integer lda = max(size_t(1), a.Width());
691
+ integer ldb = max(size_t(1), b.Width());
692
+ integer ldc = max(size_t(1), c.Width());
693
+
694
+ dgemm (&transa, &transb, &n, &m, &k, &alpha, &b(0,0), &ldb, &a(0,0), &lda, &beta, &c(0,0), &ldc);
695
+ }
696
+
697
+
698
+ inline void LapackMultAddAB (ngbla::FlatMatrix<double> a,
699
+ ngbla::FlatMatrix<double> b,
700
+ double fac,
701
+ ngbla::FlatMatrix<double> c)
702
+ {
703
+ char transa = 'N';
704
+ char transb = 'N';
705
+ integer m = c.Height();
706
+ integer n = c.Width();
707
+ integer k = a.Width();
708
+ double alpha = fac;
709
+ double beta = 1.0;
710
+ integer lda = max(size_t(1), a.Width());
711
+ integer ldb = max(size_t(1), b.Width());
712
+ integer ldc = max(size_t(1), c.Width());
713
+
714
+ dgemm (&transa, &transb, &n, &m, &k, &alpha, &b(0,0), &ldb, &a(0,0), &lda, &beta, &c(0,0), &ldc);
715
+ }
716
+
717
+ inline void LapackMultAddAtB (ngbla::FlatMatrix<double> a,
718
+ ngbla::FlatMatrix<double> b,
719
+ double fac,
720
+ ngbla::FlatMatrix<double> c)
721
+ {
722
+ char transa = 'N';
723
+ char transb = 'T';
724
+ integer m = c.Height(); // changed n,m
725
+ integer n = c.Width();
726
+ integer k = a.Height();
727
+ double alpha = fac;
728
+ double beta = 1.0;
729
+ integer lda = max(size_t(1), a.Width());
730
+ integer ldb = max(size_t(1), b.Width());
731
+ integer ldc = max(size_t(1), c.Width());
732
+
733
+ dgemm (&transa, &transb, &n, &m, &k, &alpha, &b(0,0), &ldb, &a(0,0), &lda, &beta, &c(0,0), &ldc);
734
+ }
735
+
736
+
737
+ inline void LapackMultAddABt (ngbla::FlatMatrix<ngbla::Complex> a,
738
+ ngbla::FlatMatrix<ngbla::Complex> b,
739
+ double fac,
740
+ ngbla::FlatMatrix<ngbla::Complex> c)
741
+ {
742
+ // c += fac * a * Trans (b);
743
+ char transa = 'T';
744
+ char transb = 'N';
745
+ integer m = c.Height();
746
+ integer n = c.Width();
747
+ integer k = a.Width();
748
+ Complex alpha(fac, 0);
749
+ Complex beta(1,0);
750
+ integer lda = max(size_t(1), a.Width());
751
+ integer ldb = max(size_t(1), b.Width());
752
+ integer ldc = max(size_t(1), c.Width());
753
+
754
+ zgemm (&transa, &transb, &n, &m, &k, &alpha,
755
+ &b(0,0), &ldb,
756
+ &a(0,0), &lda, &beta,
757
+ &c(0,0), &ldc);
758
+ }
759
+
760
+
761
+
762
+ inline void LapackMultAddAtB (ngbla::FlatMatrix<ngbla::Complex> a,
763
+ ngbla::FlatMatrix<ngbla::Complex> b,
764
+ double fac,
765
+ ngbla::FlatMatrix<ngbla::Complex> c)
766
+ {
767
+ // c += fac * a * Trans (b);
768
+ char transa = 'N';
769
+ char transb = 'T';
770
+ integer m = c.Height();
771
+ integer n = c.Width();
772
+ integer k = a.Height();
773
+ Complex alpha(fac, 0); // double alpha[2] = { fac, 0 };
774
+ Complex beta(1,0); // double beta[2] = { 1.0, 0 };
775
+ integer lda = max(size_t(1), a.Width());
776
+ integer ldb = max(size_t(1), b.Width());
777
+ integer ldc = max(size_t(1), c.Width());
778
+
779
+ zgemm (&transa, &transb, &n, &m, &k, &alpha,
780
+ &b(0,0), &ldb,
781
+ &a(0,0), &lda, &beta,
782
+ &c(0,0), &ldc);
783
+ }
784
+
785
+
786
+
787
+
788
+ inline void LapackMultAddAB (ngbla::FlatMatrix<ngbla::Complex> a,
789
+ ngbla::FlatMatrix<ngbla::Complex> b,
790
+ double fac,
791
+ ngbla::FlatMatrix<ngbla::Complex> c)
792
+ {
793
+ char transa = 'N';
794
+ char transb = 'N';
795
+ integer m = c.Height();
796
+ integer n = c.Width();
797
+ integer k = a.Width();
798
+ Complex alpha(fac, 0); // double alpha[2] = { fac, 0 };
799
+ Complex beta(1,0); // double beta[2] = { 1.0, 0 };
800
+ integer lda = max(size_t(1), a.Width());
801
+ integer ldb = max(size_t(1), b.Width());
802
+ integer ldc = max(size_t(1), c.Width());
803
+
804
+ zgemm (&transa, &transb, &n, &m, &k, &alpha,
805
+ &b(0,0), &ldb,
806
+ &a(0,0), &lda, &beta,
807
+ &c(0,0), &ldc);
808
+ }
809
+
810
+
811
+
812
+
813
+ /*
814
+ extern "C"
815
+ void dgetri_ (int & n, double & a, int & lda,
816
+ int & ipiv, double & work, int & lwork, int & info);
817
+
818
+ extern "C"
819
+ void dgetrf_ (int & n, int & m, double & a, int & lda,
820
+ int & ipiv, int & info);
821
+
822
+ extern "C"
823
+ void dgetrs_ (char & trans, int & n, int & nrhs,
824
+ double & a, int & lda, int & ipiv,
825
+ double & b, int & ldb, int & info);
826
+
827
+
828
+
829
+ extern "C"
830
+ void dpotrf_ (char & uplo, int & n, double & a, int & lda,
831
+ int & info);
832
+
833
+ extern "C"
834
+ void dpotrs_ (char & uplo, int & n, int & nrhs,
835
+ double & a, int & lda,
836
+ double & b, int & ldb, int & info);
837
+ */
838
+
839
+
840
+ template <ORDERING ORD>
841
+ class LapackLU
842
+ {
843
+ Matrix <double, ORD> a;
844
+ ArrayMem<integer,100> ipiv;
845
+
846
+ public:
847
+ LapackLU (Matrix<double,ORD> _a)
848
+ : a(std::move(_a)), ipiv(a.Height())
849
+ {
850
+ integer m = a.Height();
851
+ if (m == 0) return;
852
+ integer n = a.Width();
853
+ integer lda = a.Dist();
854
+
855
+ integer info;
856
+ dgetrf(&n, &m, &a(0,0), &lda, &ipiv[0], &info);
857
+ }
858
+
859
+ template <typename Db>
860
+ void Solve (VectorView<double,Db> b) const
861
+ {
862
+ /*
863
+ int dgetrs_(char *trans, integer *n, integer *nrhs,
864
+ doublereal *a, integer *lda, integer *ipiv, doublereal *b, integer *
865
+ ldb, integer *info);
866
+ */
867
+ char transa = (ORD == ColMajor) ? 'N' : 'T';
868
+ integer n = a.Height();
869
+ integer nrhs = 1;
870
+ integer lda = a.Dist();
871
+ integer ldb = b.Size();
872
+ integer info;
873
+ dgetrs(&transa, &n, &nrhs, a.Data(), &lda, ipiv.Data(), b.Data(), &ldb, &info);
874
+ }
875
+
876
+ Matrix <double,ORD> Inverse() &&
877
+ {
878
+ double hwork;
879
+ integer lwork = -1;
880
+ integer n = a.Height();
881
+ integer lda = a.Dist();
882
+ integer info;
883
+ dgetri(&n, &a(0,0), &lda, &ipiv[0], &hwork, &lwork, &info);
884
+ lwork = integer(hwork);
885
+ ArrayMem<double,1000> work(lwork);
886
+ dgetri(&n, &a(0,0), &lda, &ipiv[0], &work[0], &lwork, &info);
887
+ return std::move(a);
888
+ }
889
+ };
890
+
891
+
892
+
893
+
894
+ inline void LapackInverse (ngbla::SliceMatrix<double> a)
895
+ {
896
+ integer m = a.Height();
897
+ if (m == 0) return;
898
+ integer n = a.Width();
899
+ integer lda = max(size_t(1), a.Dist());
900
+
901
+ ArrayMem<integer,100> ipiv(n);
902
+ integer info;
903
+
904
+ dgetrf(&n, &m, &a(0,0), &lda, &ipiv[0], &info);
905
+
906
+ double hwork;
907
+ integer lwork = -1;
908
+ dgetri(&n, &a(0,0), &lda, &ipiv[0], &hwork, &lwork, &info);
909
+ lwork = integer(hwork);
910
+
911
+ ArrayMem<double,1000> work(lwork);
912
+ dgetri(&n, &a(0,0), &lda, &ipiv[0], &work[0], &lwork, &info);
913
+ }
914
+
915
+
916
+
917
+ inline void LapackInverseSPD (ngbla::SliceMatrix<double> a)
918
+ {
919
+ integer n = a.Width();
920
+ if (n == 0) return;
921
+ integer lda = max(size_t(1), a.Dist());
922
+
923
+ integer info;
924
+ char uplo = 'U';
925
+
926
+ dpotrf_ (&uplo, &n, &a(0,0), &lda, &info);
927
+ dpotri_ (&uplo, &n, &a(0,0), &lda, &info);
928
+ for (int i = 0; i < n; i++)
929
+ for (int j = 0; j < i; j++)
930
+ a(j,i) = a(i,j);
931
+ }
932
+
933
+
934
+
935
+
936
+
937
+
938
+
939
+
940
+
941
+ /*
942
+ Compoutes B <--- B A^{-1} (trans = 'N')
943
+ Compoutes B <--- B A^{-T} (trans = 'T')
944
+ Compoutes B <--- B A^{-H} (trans = 'H')
945
+
946
+ // trans = 'N': solve A x = b^T
947
+ // trans = 'T': solve A^T x = b^T
948
+ // trans = 'C': solve A^H x = b^T
949
+ */
950
+ inline void LapackAInvBt (ngbla::FlatMatrix<double> a, ngbla::FlatMatrix<double> b, char trans = 'N')
951
+ {
952
+ integer m = a.Height();
953
+ integer n = a.Width();
954
+ integer lda = max(size_t(1), a.Width());
955
+ integer ldb = max(size_t(1), b.Width());
956
+ integer nrhs = b.Height();
957
+
958
+ ArrayMem<integer,100> ipiv(n);
959
+ integer info;
960
+ // char uplo = 'L';
961
+
962
+ dgetrf_ (&n, &m, &a(0,0), &lda, &ipiv[0], &info);
963
+ dgetrs_ (&trans, &n, &nrhs, &a(0,0), &lda, &ipiv[0], &b(0,0), &ldb, &info);
964
+
965
+ /*
966
+ // symmetric, non-spd
967
+ int lwork = -1;
968
+ double hwork[1] = { 1.0 };
969
+ dsytrf_ (&uplo, &n, &a(0,0), &lda, &ipiv[0], &hwork[0], &lwork, &info);
970
+ lwork = int(hwork[0]);
971
+ ArrayMem<double, 1000> work(lwork);
972
+ dsytrf_ (&uplo, &n, &a(0,0), &lda, &ipiv[0], &work[0], &lwork, &info);
973
+ dsytrs_ (&uplo, &n, &nrhs, &a(0,0), &lda, &ipiv[0], &b(0,0), &ldb, &info);
974
+ */
975
+
976
+ /*
977
+ // spd
978
+ dpotrf_ (&uplo, &n, &a(0,0), &lda, &info);
979
+ dpotrs_ (&uplo, &n, &nrhs, &a(0,0), &lda, &b(0,0), &ldb, &info);
980
+ */
981
+ }
982
+
983
+
984
+
985
+
986
+ /*
987
+ extern "C"
988
+ void zgetri_ (int & n, double & a, int & lda,
989
+ int & ipiv, double & work, int & lwork, int & info);
990
+
991
+ extern "C"
992
+ void zgetrf_ (int & n, int & m, double & a, int & lda,
993
+ int & ipiv, int & info);
994
+
995
+ extern "C"
996
+ void zgetrs_ (char & trans, int & m, int & nrhs, double & a, int & lda,
997
+ int & ipiv,
998
+ double & b, int & ldb,
999
+ int & info);
1000
+ */
1001
+
1002
+
1003
+ inline void LapackInverse (ngbla::SliceMatrix<ngbla::Complex> a)
1004
+ {
1005
+ integer m = a.Height();
1006
+ if (m == 0) return;
1007
+
1008
+ integer n = a.Width();
1009
+ integer lda = a.Dist();
1010
+ integer * ipiv = new integer[n];
1011
+ integer lwork = 100*n;
1012
+ Complex * work = new Complex[lwork];
1013
+ integer info;
1014
+
1015
+ // std::cout << "a = " << std::endl << a << std::endl;
1016
+ zgetrf_ (&n, &m, &a(0,0), &lda, ipiv, &info);
1017
+ // std::cout << "factors = " << std::endl << a << std::endl;
1018
+
1019
+ if (info != 0)
1020
+ {
1021
+ std::cout << "ZGETRF::info = " << info << std::endl;
1022
+ // *testout << "ZGETRF::info = " << info << std::endl;
1023
+ // *testout << "a = " << endl << a << endl;
1024
+ }
1025
+ zgetri_ (&n, &a(0,0), &lda, ipiv, work, &lwork, &info);
1026
+ if (info != 0)
1027
+ std::cout << "ZGETRI::info = " << info << std::endl;
1028
+
1029
+ delete [] work;
1030
+ delete [] ipiv;
1031
+
1032
+ }
1033
+
1034
+
1035
+ /*
1036
+ trans = 'N': solve A x = b^T
1037
+ trans = 'T': solve A^T x = b^T
1038
+ trans = 'C': solve A^H x = b^T
1039
+ */
1040
+
1041
+ inline void LapackAInvBt (ngbla::FlatMatrix<ngbla::Complex> a, ngbla::FlatMatrix<ngbla::Complex> b, char trans = 'N')
1042
+ {
1043
+ integer m = a.Height();
1044
+ integer n = a.Width();
1045
+ integer lda = max(size_t(1), a.Width());
1046
+ integer ldb = max(size_t(1), b.Width());
1047
+ integer nrhs = b.Height();
1048
+ integer * ipiv = new integer[n];
1049
+ integer lwork = 100*n;
1050
+ double * work = new double[2*lwork];
1051
+ integer info;
1052
+
1053
+
1054
+ zgetrf_ (&n, &m,&a(0,0), &lda, ipiv, &info);
1055
+ zgetrs_ (&trans, &n, &nrhs, &a(0,0), &lda, ipiv, &b(0,0), &ldb, &info);
1056
+
1057
+ delete [] work;
1058
+ delete [] ipiv;
1059
+ // std::cerr << "complex LapackAInvBt not implemented" << std::endl;
1060
+ }
1061
+
1062
+
1063
+ /*
1064
+ extern "C"
1065
+ void dsyev_(char & jobz, char & uplo, int & n , double & A , int & lda, double & w,
1066
+ double & work, int & lwork, int & info);
1067
+
1068
+ extern "C"
1069
+ void zgeev_( char *jobvl, char *jobvr, int *n, std::complex<double> *A, int * lda, std::complex<double>* lami,
1070
+ std::complex<double> * vl, int * nvl, std::complex<double> * vr, int * nvr,
1071
+ std::complex<double> * work, int * lwork, double * rwork, int * info);
1072
+ */
1073
+
1074
+ // extern "C"
1075
+ // void dgeev_( char *jobvl, char *jobvr, int *n, double *A, int * lda, double* lami_re, double *lami_im,
1076
+ // double * vl, int * nvl, double * vr, int * nvr,
1077
+ // double * work, int * lwork, /* double * rwork, */ int * info);
1078
+
1079
+
1080
+
1081
+ NGS_DLL_HEADER
1082
+ void LapackEigenValuesSymmetric (ngbla::FlatMatrix<double> a,
1083
+ ngbla::FlatVector<double> lami,
1084
+ ngbla::FlatMatrix<double> evecs = ngbla::FlatMatrix<double>(0,0));
1085
+ /*
1086
+ {
1087
+ char jobz, uplo = 'U';
1088
+ integer n = a.Height();
1089
+ integer lwork=(n+2)*n+1;
1090
+
1091
+ double* work = new double[lwork];
1092
+ integer info;
1093
+
1094
+ double * matA;
1095
+
1096
+ if ( evecs.Height() )
1097
+ {
1098
+ // eigenvectors are calculated
1099
+ evecs = a;
1100
+ jobz = 'V';
1101
+ matA = &evecs(0,0);
1102
+ }
1103
+ else
1104
+ {
1105
+ // only eigenvalues are calculated, matrix a is destroyed!!
1106
+ jobz = 'N';
1107
+ matA = &a(0,0);
1108
+ }
1109
+ dsyev_(&jobz, &uplo , &n , matA, &n, &lami(0), work, &lwork, &info);
1110
+
1111
+ if (info)
1112
+ std::cerr << "LapackEigenValuesSymmetric, info = " << info << std::endl;
1113
+
1114
+ delete [] work;
1115
+ }
1116
+ */
1117
+
1118
+
1119
+
1120
+ inline void LapackEigenValues (ngbla::FlatMatrix<double> a,
1121
+ ngbla::FlatVector<ngbla::Complex> lami,
1122
+ ngbla::FlatMatrix<double> eveci )
1123
+ {
1124
+ char jobvr = 'V' , jobvl= 'N';
1125
+
1126
+ integer n = a.Height();
1127
+ integer nvl = 1;
1128
+ integer nvr = eveci.Width() ;
1129
+
1130
+ double * vl = 0;
1131
+ double * vr;// = new std::complex<double> [nvr*n];
1132
+ double * lami_re = new double[n], * lami_im = new double[n];
1133
+
1134
+ integer lwork = 8*n;
1135
+ double * work = new double[lwork];
1136
+ double *rwork = new double[8*n];
1137
+ integer info = 0;
1138
+
1139
+ if ( eveci.Width() )
1140
+ {
1141
+ vr = &eveci(0,0);
1142
+ }
1143
+ else
1144
+ {
1145
+ nvr = n;
1146
+ vr = new double [nvr*n];
1147
+ }
1148
+
1149
+ dgeev_(&jobvl, &jobvr, &n, &a(0,0), &n, lami_re, lami_im, vl, &nvl, vr, &nvr, work, &lwork, /* rwork, */ &info);
1150
+
1151
+ if(info != 0)
1152
+ {
1153
+ std::cout << "**** Error in zggev_, info = " << info << " *****" << std::endl;
1154
+ return;
1155
+ }
1156
+
1157
+ for ( size_t i = 0; i < lami.Size(); i++ )
1158
+ lami(i) = ngbla::Complex (lami_re[i], lami_im[i]);
1159
+
1160
+ delete[] work;
1161
+ delete[] rwork;
1162
+ if ( !eveci.Width() )
1163
+ delete[] vr;
1164
+ delete [] lami_re;
1165
+ delete [] lami_im;
1166
+ }
1167
+
1168
+ inline void LapackEigenValues (ngbla::FlatMatrix<ngbla::Complex> a,
1169
+ ngbla::FlatVector<ngbla::Complex> lami,
1170
+ ngbla::FlatMatrix<ngbla::Complex> eveci )
1171
+ {
1172
+ char jobvr = 'V' , jobvl= 'N';
1173
+
1174
+ integer n = a.Height();
1175
+ integer nvl = 1;
1176
+ integer nvr = eveci.Width() ;
1177
+
1178
+ Complex * vl = 0;
1179
+ Complex * vr;// = new std::complex<double> [nvr*n];
1180
+
1181
+ integer lwork = 8*n;
1182
+ Complex * work = new Complex [lwork];
1183
+ double *rwork = new double[8*n];
1184
+ integer info = 0;
1185
+
1186
+ if ( eveci.Width() )
1187
+ {
1188
+ vr = &eveci(0,0);
1189
+ }
1190
+ else
1191
+ {
1192
+ nvr = n;
1193
+ vr = new Complex [nvr*n];
1194
+ }
1195
+
1196
+ zgeev_(&jobvl, &jobvr, &n, &a(0,0), &n, &lami(0), vl, &nvl, vr, &nvr, work, &lwork, rwork, &info);
1197
+ // alpha, beta, &vl, &nvl, vr, &nvr,
1198
+ // work , &lwork, rwork, &info);
1199
+
1200
+ if(info != 0)
1201
+ {
1202
+ std::cout << "**** Error in zggev_, info = " << info << " *****" << std::endl;
1203
+ return;
1204
+ }
1205
+
1206
+ delete[] work;
1207
+ delete[] rwork;
1208
+ if ( !eveci.Width() )
1209
+ delete[] vr;
1210
+ }
1211
+
1212
+
1213
+
1214
+
1215
+
1216
+ inline void LapackEigenValuesSymmetric (ngbla::FlatMatrix<ngbla::Complex> a,
1217
+ ngbla::FlatVector<ngbla::Complex> lami,
1218
+ ngbla::FlatMatrix<ngbla::Complex> eveci = ngbla::FlatMatrix<ngbla::Complex> (0,0) )
1219
+ {
1220
+ // std::cerr << "complex evp not implemented" << std::endl;
1221
+ LapackEigenValues ( a, lami, eveci );
1222
+ }
1223
+
1224
+
1225
+
1226
+ // Solve complex generalized eigenvalue problem (QZ)
1227
+ /*
1228
+ extern "C"
1229
+ void zggev_(char *jobvl,char* jobvr,int* N,std::complex<double>* A, int* lda,std::complex<double>* B, int* ldb, std::complex<double>* alpha, std::complex<double>* beta, std::complex<double>* vl, int* ldvl, std::complex<double>* vr, int* ldvr, std::complex<double>* work, int* lwork, double* rwork, int* info);
1230
+ */
1231
+
1232
+
1233
+ // Attention A,B are overwritten !!!
1234
+ inline void LapackEigenValues (ngbla::FlatMatrix<ngbla::Complex> a,
1235
+ ngbla::FlatMatrix<ngbla::Complex> b,
1236
+ ngbla::FlatVector<ngbla::Complex> lami)
1237
+
1238
+ {
1239
+ integer n = a.Height();
1240
+ // integer evecs_bool = 0;
1241
+ // std::complex<double> * evecs, * dummy;
1242
+
1243
+ char jobvr = 'N', jobvl= 'N';
1244
+ // bool balancing = 0;
1245
+
1246
+ Complex * alpha= new Complex[n];
1247
+ Complex * beta = new Complex[n];
1248
+ Complex vl=0.;
1249
+
1250
+ integer nvl = 1;
1251
+ Complex * vr = NULL;
1252
+
1253
+ Complex * work = new Complex[8*n];
1254
+ integer lwork = 8*n;
1255
+ double *rwork = new double[8*n];
1256
+
1257
+ integer nvr = n ;
1258
+
1259
+ //std::complex<double> * A1,*B1;
1260
+ integer i;
1261
+
1262
+ // char job=balance_type; // Permute and Scale in Balancing
1263
+ // integer ihi,ilo;
1264
+ double * lscale, *rscale;
1265
+ lscale = new double[n];
1266
+ rscale = new double[n];
1267
+ double * work2;
1268
+ work2 = new double[6*n];
1269
+
1270
+ // char side = 'R';
1271
+
1272
+ integer info = 0;
1273
+
1274
+ // integer ii;
1275
+ // ii=0;
1276
+
1277
+ // if(balancing) zggbal_(&job,&n, A, &n , B, &n, &ilo, &ihi, lscale, rscale, work2, &info) ;
1278
+
1279
+ // if(info == 0 )
1280
+ if (1)
1281
+ {
1282
+ zggev_(&jobvl, &jobvr, &n, &a(0,0), &n, &b(0,0), &n, alpha, beta, &vl, &nvl, vr, &nvr,
1283
+ work , &lwork, rwork, &info);
1284
+
1285
+ if(info==0)
1286
+ {
1287
+ /*
1288
+ if(jobvr == 'V' && balancing)
1289
+ {
1290
+ zggbak_(&job, &side, &n, &ilo, &ihi, lscale, rscale, &n, vr, &n,&info) ;
1291
+
1292
+ if(info!=0)
1293
+ {
1294
+ std::cout << "***** Error in zggbak_ **** " << endl;
1295
+ return;
1296
+ }
1297
+ }
1298
+ */
1299
+ }
1300
+ else
1301
+ {
1302
+ std::cout << "**** Error in zggev_, info = " << info << " *****" << std::endl;
1303
+ // return;
1304
+ }
1305
+ }
1306
+ else
1307
+ {
1308
+ std::cout << "**** Error in zggbal_ **** " << std::endl;
1309
+ return;
1310
+ }
1311
+
1312
+ delete [] work;
1313
+ delete [] rwork;
1314
+
1315
+ delete [] lscale;
1316
+ delete [] rscale;
1317
+ delete [] work2;
1318
+
1319
+ for(i=0;i<n;i++)
1320
+ {
1321
+ if(abs(beta[i]) >= 1.e-30)
1322
+ lami[i]=Complex(alpha[i]/beta[i]);
1323
+ else
1324
+ {
1325
+ lami[i] = Complex(100.,100.);
1326
+ }
1327
+ }
1328
+
1329
+ /*
1330
+ std:: complex<double> resid[n];
1331
+ double error;
1332
+ for(int k=0; k<n;k++)
1333
+ {
1334
+ for(i=0; i<n;i++)
1335
+ {
1336
+ resid[i] = 0.;
1337
+ for(int j=0;j<n;j++)
1338
+ {
1339
+ resid[i] += A[j*n + i]*evecs[k*n+j];
1340
+ resid[i] -=B[j*n+i]*evecs[k*n+j]*lami[k];
1341
+ }
1342
+
1343
+ error = abs(resid[i]) * abs(resid[i]) ;
1344
+ }
1345
+ error = sqrt(error);
1346
+ cout << " lami (i) " << lami[k] << "\t" << alpha[k] << "\t" << beta[k] << endl;
1347
+ cout << " error lapack " << k << " \t " << error << endl;
1348
+ }
1349
+ */
1350
+ delete [] alpha;
1351
+ delete [] beta;
1352
+
1353
+ }
1354
+
1355
+
1356
+
1357
+
1358
+
1359
+
1360
+
1361
+
1362
+
1363
+
1364
+ /*
1365
+ extern "C"
1366
+ void dsygv_(int & itype, char & jobzm, char & uplo , int & n1, double & A , int & n,
1367
+ double & B, int & nb, double & lami, double & work, int & lwork, int & info);
1368
+ */
1369
+
1370
+ inline void LapackEigenValuesSymmetric (ngbla::FlatMatrix<double> a,
1371
+ ngbla::FlatMatrix<double> b,
1372
+ ngbla::FlatVector<double> lami,
1373
+ ngbla::FlatMatrix<double> evecs = ngbla::FlatMatrix<double>(0,0))
1374
+ {
1375
+ char jobz = 'N' , uplo = 'U';
1376
+ integer n = a.Height();
1377
+
1378
+ integer lwork=(n+2)*n+1;
1379
+ double* work = new double[lwork];
1380
+
1381
+ integer info;
1382
+ integer itype =1;
1383
+
1384
+ if ( evecs.Height() )
1385
+ jobz = 'V';
1386
+ else
1387
+ jobz = 'N';
1388
+
1389
+ dsygv_(&itype, &jobz, &uplo , &n , &a(0,0), &n, &b(0,0), &n,
1390
+ &lami(0), work, &lwork, &info);
1391
+
1392
+ if ( evecs.Height() )
1393
+ evecs = a;
1394
+
1395
+ if (info)
1396
+ std::cerr << "LapackEigenValuesSymmetric, info = " << info << std::endl;
1397
+
1398
+ delete [] work;
1399
+ }
1400
+
1401
+ // A = U * diag(S) * V
1402
+ NGS_DLL_HEADER void LapackSVD (SliceMatrix<double, ColMajor> A,
1403
+ SliceMatrix<double, ColMajor> U,
1404
+ SliceMatrix<double, ColMajor> V,
1405
+ FlatVector<double> S,
1406
+ bool all);
1407
+
1408
+
1409
+ // A = U * diag(S) * V
1410
+ inline void LapackSVD (SliceMatrix<double> A,
1411
+ SliceMatrix<double> U,
1412
+ SliceMatrix<double> V,
1413
+ FlatVector<double> S,
1414
+ bool all)
1415
+ {
1416
+ LapackSVD (Trans(A), Trans(V), Trans(U), S, all);
1417
+ }
1418
+
1419
+
1420
+ // A = U * diag(S) * V
1421
+ NGS_DLL_HEADER void LapackSVD (SliceMatrix<Complex, ColMajor> A,
1422
+ SliceMatrix<Complex, ColMajor> U,
1423
+ SliceMatrix<Complex, ColMajor> V,
1424
+ FlatVector<double> S,
1425
+ bool all);
1426
+
1427
+
1428
+ // A = U * diag(S) * V
1429
+ inline void LapackSVD (SliceMatrix<Complex> A,
1430
+ SliceMatrix<Complex> U,
1431
+ SliceMatrix<Complex> V,
1432
+ FlatVector<double> S,
1433
+ bool all)
1434
+ {
1435
+ LapackSVD (Trans(A), Trans(V), Trans(U), S, all);
1436
+ }
1437
+
1438
+
1439
+
1440
+
1441
+
1442
+ #else
1443
+
1444
+ typedef int integer;
1445
+
1446
+ inline void LapackMultAtx (ngbla::FlatMatrix<double> a,
1447
+ ngbla::FlatVector<double> x,
1448
+ ngbla::FlatVector<double> y)
1449
+ { y = Trans (a) * x; }
1450
+
1451
+
1452
+ inline void LapackAddxyt (ngbla::FlatMatrix<double> a,
1453
+ ngbla::FlatVector<double> x,
1454
+ ngbla::FlatVector<double> y)
1455
+ { y += Trans (a) * x; }
1456
+
1457
+
1458
+ template <typename TA, typename TB>
1459
+ inline void LapackMult (const TA & a, const TB & b,
1460
+ ngbla::SliceMatrix<double> c)
1461
+ { c = a * b; }
1462
+
1463
+ template <typename TA, typename TB>
1464
+ inline void LapackMult (const TA & a, const TB & b,
1465
+ ngbla::SliceMatrix<Complex> c)
1466
+ { c = a * b; }
1467
+
1468
+ template <typename TA, typename TB>
1469
+ inline void LapackMultAdd (const TA & a,
1470
+ const TB & b,
1471
+ double alpha,
1472
+ SliceMatrix<double> c,
1473
+ double beta)
1474
+ { c *= beta; c += alpha * a * b; }
1475
+
1476
+ template <typename TA, typename TB>
1477
+ inline void LapackMultAdd (const TA & a,
1478
+ const TB & b,
1479
+ Complex alpha,
1480
+ SliceMatrix<Complex> c,
1481
+ Complex beta)
1482
+ { c *= beta; c += alpha * a * b; }
1483
+
1484
+
1485
+
1486
+ inline void LapackMultABt (ngbla::FlatMatrix<double> a,
1487
+ ngbla::FlatMatrix<double> b,
1488
+ ngbla::FlatMatrix<double> c)
1489
+ { c = a * Trans (b); }
1490
+
1491
+ inline void LapackMultAtB (ngbla::FlatMatrix<double> a,
1492
+ ngbla::FlatMatrix<double> b,
1493
+ ngbla::FlatMatrix<double> c)
1494
+ { c = Trans(a) * b; }
1495
+
1496
+
1497
+ inline void LapackMultAB (ngbla::FlatMatrix<double> a,
1498
+ ngbla::FlatMatrix<double> b,
1499
+ ngbla::FlatMatrix<double> c)
1500
+ { c = a * b; }
1501
+
1502
+
1503
+ inline void LapackMultABt (ngbla::FlatMatrix<ngbla::Complex> a,
1504
+ ngbla::FlatMatrix<ngbla::Complex> b,
1505
+ ngbla::FlatMatrix<ngbla::Complex> c)
1506
+ { c = a * Trans (b); }
1507
+
1508
+ inline void LapackMultAtB (ngbla::FlatMatrix<Complex> a,
1509
+ ngbla::FlatMatrix<Complex> b,
1510
+ ngbla::FlatMatrix<Complex> c)
1511
+ { c = Trans(a) * b; }
1512
+
1513
+
1514
+
1515
+ inline void LapackMultAddAB (ngbla::FlatMatrix<double> a,
1516
+ ngbla::FlatMatrix<double> b,
1517
+ double fac,
1518
+ ngbla::FlatMatrix<double> c)
1519
+ { c += fac * a * b; }
1520
+
1521
+ inline void LapackMultAddABt (ngbla::FlatMatrix<double> a,
1522
+ ngbla::FlatMatrix<double> b,
1523
+ double fac,
1524
+ ngbla::FlatMatrix<double> c)
1525
+ { c += fac * a * Trans (b); }
1526
+
1527
+ inline void LapackMultAddAtB (ngbla::FlatMatrix<double> a,
1528
+ ngbla::FlatMatrix<double> b,
1529
+ double fac,
1530
+ ngbla::FlatMatrix<double> c)
1531
+ { c += fac * Trans(a) * b; }
1532
+
1533
+
1534
+
1535
+ inline void LapackMultAddAB (ngbla::FlatMatrix<ngbla::Complex> a,
1536
+ ngbla::FlatMatrix<ngbla::Complex> b,
1537
+ double fac,
1538
+ ngbla::FlatMatrix<ngbla::Complex> c)
1539
+
1540
+ { c += fac * a * b; }
1541
+
1542
+ inline void LapackMultAddABt (ngbla::FlatMatrix<ngbla::Complex> a,
1543
+ ngbla::FlatMatrix<ngbla::Complex> b,
1544
+ double fac,
1545
+ ngbla::FlatMatrix<ngbla::Complex> c)
1546
+
1547
+ { c += fac * a * Trans (b); }
1548
+
1549
+
1550
+
1551
+ inline void LapackInverse (ngbla::FlatMatrix<double> a)
1552
+ {
1553
+ CalcInverse (a);
1554
+ /*
1555
+ ngbla::Matrix<> hm(a.Height());
1556
+ CalcInverse (a, hm);
1557
+ a = hm;
1558
+ */
1559
+ }
1560
+
1561
+ inline void LapackInverse (ngbla::FlatMatrix<ngbla::Complex> a)
1562
+ {
1563
+ CalcInverse (a);
1564
+ /*
1565
+ // std::cerr << "sorry, Inverse not available without LAPACK" << std::endl;
1566
+ ngbla::Matrix<Complex> hm(a.Height());
1567
+ CalcInverse (a, hm);
1568
+ a = hm;
1569
+ */
1570
+ }
1571
+
1572
+ inline void LapackAInvBt (ngbla::FlatMatrix<double> a, ngbla::FlatMatrix<double> b, char trans = 'N')
1573
+ {
1574
+ LapackInverse (a);
1575
+ ngbla::Matrix<> hb (b.Height(), b.Width());
1576
+ if (trans == 'T')
1577
+ hb = b * Trans(a);
1578
+ else
1579
+ hb = b * a;
1580
+ b = hb;
1581
+ }
1582
+
1583
+ inline void LapackAInvBt (ngbla::FlatMatrix<Complex> a, ngbla::FlatMatrix<Complex> b, char trans = 'N')
1584
+ {
1585
+ LapackInverse (a);
1586
+ ngbla::Matrix<Complex> hb (b.Height(), b.Width());
1587
+ if (trans == 'T')
1588
+ hb = b * Trans(a);
1589
+ else
1590
+ hb = b * a;
1591
+ b = hb;
1592
+ }
1593
+
1594
+
1595
+ inline void LapackEigenValuesSymmetric (ngbla::FlatMatrix<double> a,
1596
+ ngbla::FlatVector<double> lami)
1597
+ {
1598
+ std::cerr << "sorry, EVP not available without LAPACK" << std::endl;
1599
+ }
1600
+
1601
+ inline void LapackEigenValuesSymmetric (ngbla::FlatMatrix<double> a,
1602
+ ngbla::FlatMatrix<double> b,
1603
+ ngbla::FlatVector<double> lami)
1604
+ {
1605
+ std::cerr << "sorry, EVP not available without LAPACK" << std::endl;
1606
+ }
1607
+
1608
+
1609
+ inline void LapackEigenValuesSymmetric (ngbla::FlatMatrix<ngbla::Complex> a,
1610
+ ngbla::FlatVector<ngbla::Complex> lami)
1611
+ {
1612
+ std::cerr << "sorry, EVP not available without LAPACK" << std::endl;
1613
+ }
1614
+
1615
+
1616
+ #endif
1617
+
1618
+
1619
+
1620
+
1621
+ // several LAPACK eigenvalue solvers
1622
+
1623
+ #ifdef LAPACK
1624
+
1625
+ void LaEigNSSolve(int n, double * A, double * B, std::complex<double> * lami, int evecs_bool, double *evecs_re, double *evecs_im, char balance_type);
1626
+ void LaEigNSSolve(int n, std::complex<double> * A, std::complex<double> * B, std::complex<double> * lami, int evecs_bool, std::complex<double> *evecs, std::complex<double> *dummy, char balance_type);
1627
+
1628
+ void LapackSSEP(int n, double* A, double* lami, double* evecs);
1629
+
1630
+ void LapackHessenbergEP (int n, std::complex<double> * H, std::complex<double> * lami, std::complex<double> * evecs);
1631
+ void LapackGHEP(int n, double* A, double* B, double* lami) ;
1632
+ int LapackGHEPEPairs(int n, double* A, double* B, double* lami);
1633
+ int LapackGHEPEPairs(int n, std::complex<double>* A, std::complex<double>* B, double* lami);
1634
+ // A,B overwritten in A eigenvectors z^H B z = 1
1635
+
1636
+ //void LaEigNSSolve(const LaGenMatDouble &A, LaVectorDouble &eigvals);
1637
+ //void LaEigNSSolveIP(LaGenMatDouble &A, LaVectorDouble &eigvals);
1638
+
1639
+ void LaEigNSSolveTest();
1640
+ void LaLinearSolveComplex(int n, std::complex<double> * A, std::complex<double> * F);
1641
+ void LaLinearSolve(int n, double * A, double * F);
1642
+ void LaLinearSolveRHS(int n, double * A, double * F);
1643
+
1644
+
1645
+ void LaEigNSSolveX(int n, std::complex<double> * A, std::complex<double> * B, std::complex<double> * lami, int evecs_bool, std::complex<double> * evecs, std::complex<double> * dummy, char balance_type);
1646
+ void LaEigNSSolveX(int n, double * A, double * B, std::complex<double> * lami, int evecs_bool, double * evecs, double * dummy, char balance_type);
1647
+
1648
+ #else
1649
+
1650
+ inline void LapackHessenbergEP (int n, std::complex<double> * H, std::complex<double> * lami, std::complex<double> * evecs)
1651
+ {
1652
+ cerr << "Sorry, HessebergEP not available without Lapack" << endl;
1653
+ }
1654
+
1655
+
1656
+ #endif
1657
+
1658
+ }
1659
+
1660
+
1661
+ #endif