ngsolve 6.2.2501__cp312-cp312-macosx_10_15_universal2.whl → 6.2.2501.post37.dev1__cp312-cp312-macosx_10_15_universal2.whl

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

Potentially problematic release.


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

Files changed (286) hide show
  1. ngsolve/webgui.py +1 -1
  2. {ngsolve-6.2.2501.dist-info → ngsolve-6.2.2501.post37.dev1.dist-info}/METADATA +2 -2
  3. ngsolve-6.2.2501.post37.dev1.dist-info/RECORD +25 -0
  4. netgen/include/arnoldi.hpp +0 -55
  5. netgen/include/bandmatrix.hpp +0 -334
  6. netgen/include/basematrix.hpp +0 -957
  7. netgen/include/basevector.hpp +0 -1268
  8. netgen/include/bdbequations.hpp +0 -2752
  9. netgen/include/bdbintegrator.hpp +0 -1659
  10. netgen/include/bessel.hpp +0 -1064
  11. netgen/include/bilinearform.hpp +0 -963
  12. netgen/include/bla.hpp +0 -29
  13. netgen/include/blockalloc.hpp +0 -95
  14. netgen/include/blockjacobi.hpp +0 -316
  15. netgen/include/bspline.hpp +0 -114
  16. netgen/include/calcinverse.hpp +0 -141
  17. netgen/include/cg.hpp +0 -368
  18. netgen/include/chebyshev.hpp +0 -44
  19. netgen/include/cholesky.hpp +0 -720
  20. netgen/include/clapack.h +0 -7254
  21. netgen/include/code_generation.hpp +0 -296
  22. netgen/include/coefficient.hpp +0 -2006
  23. netgen/include/coefficient_impl.hpp +0 -18
  24. netgen/include/coefficient_stdmath.hpp +0 -157
  25. netgen/include/commutingAMG.hpp +0 -106
  26. netgen/include/comp.hpp +0 -79
  27. netgen/include/compatibility.hpp +0 -41
  28. netgen/include/complex_wrapper.hpp +0 -73
  29. netgen/include/compressedfespace.hpp +0 -110
  30. netgen/include/contact.hpp +0 -231
  31. netgen/include/diagonalmatrix.hpp +0 -154
  32. netgen/include/differentialoperator.hpp +0 -276
  33. netgen/include/diffop.hpp +0 -1286
  34. netgen/include/diffop_impl.hpp +0 -326
  35. netgen/include/discontinuous.hpp +0 -84
  36. netgen/include/dump.hpp +0 -949
  37. netgen/include/eigen.hpp +0 -60
  38. netgen/include/eigensystem.hpp +0 -18
  39. netgen/include/elasticity_equations.hpp +0 -595
  40. netgen/include/elementbyelement.hpp +0 -195
  41. netgen/include/elementtopology.hpp +0 -1760
  42. netgen/include/elementtransformation.hpp +0 -339
  43. netgen/include/evalfunc.hpp +0 -405
  44. netgen/include/expr.hpp +0 -1655
  45. netgen/include/facetfe.hpp +0 -175
  46. netgen/include/facetfespace.hpp +0 -178
  47. netgen/include/facethofe.hpp +0 -111
  48. netgen/include/facetsurffespace.hpp +0 -112
  49. netgen/include/fe_interfaces.hpp +0 -32
  50. netgen/include/fem.hpp +0 -87
  51. netgen/include/fesconvert.hpp +0 -14
  52. netgen/include/fespace.hpp +0 -1445
  53. netgen/include/finiteelement.hpp +0 -286
  54. netgen/include/globalinterfacespace.hpp +0 -77
  55. netgen/include/globalspace.hpp +0 -115
  56. netgen/include/gridfunction.hpp +0 -525
  57. netgen/include/h1amg.hpp +0 -41
  58. netgen/include/h1hofe.hpp +0 -188
  59. netgen/include/h1hofe_impl.hpp +0 -1262
  60. netgen/include/h1hofefo.hpp +0 -148
  61. netgen/include/h1hofefo_impl.hpp +0 -185
  62. netgen/include/h1hofespace.hpp +0 -167
  63. netgen/include/h1lofe.hpp +0 -1237
  64. netgen/include/h1lumping.hpp +0 -35
  65. netgen/include/hcurl_equations.hpp +0 -1352
  66. netgen/include/hcurlcurlfe.hpp +0 -2221
  67. netgen/include/hcurlcurlfespace.hpp +0 -78
  68. netgen/include/hcurlfe.hpp +0 -259
  69. netgen/include/hcurlfe_utils.hpp +0 -107
  70. netgen/include/hcurlhdiv_dshape.hpp +0 -857
  71. netgen/include/hcurlhdivfes.hpp +0 -308
  72. netgen/include/hcurlhofe.hpp +0 -175
  73. netgen/include/hcurlhofe_impl.hpp +0 -1871
  74. netgen/include/hcurlhofespace.hpp +0 -193
  75. netgen/include/hcurllofe.hpp +0 -1146
  76. netgen/include/hdiv_equations.hpp +0 -865
  77. netgen/include/hdivdivfe.hpp +0 -2923
  78. netgen/include/hdivdivsurfacespace.hpp +0 -76
  79. netgen/include/hdivfe.hpp +0 -206
  80. netgen/include/hdivfe_utils.hpp +0 -716
  81. netgen/include/hdivfes.hpp +0 -75
  82. netgen/include/hdivhofe.hpp +0 -447
  83. netgen/include/hdivhofe_impl.hpp +0 -1107
  84. netgen/include/hdivhofefo.hpp +0 -229
  85. netgen/include/hdivhofespace.hpp +0 -175
  86. netgen/include/hdivhosurfacefespace.hpp +0 -106
  87. netgen/include/hdivlofe.hpp +0 -773
  88. netgen/include/hidden.hpp +0 -74
  89. netgen/include/householder.hpp +0 -181
  90. netgen/include/hypre_ams_precond.hpp +0 -123
  91. netgen/include/hypre_precond.hpp +0 -73
  92. netgen/include/integrator.hpp +0 -2024
  93. netgen/include/integratorcf.hpp +0 -253
  94. netgen/include/interpolate.hpp +0 -49
  95. netgen/include/intrule.hpp +0 -2541
  96. netgen/include/irspace.hpp +0 -49
  97. netgen/include/jacobi.hpp +0 -136
  98. netgen/include/l2hofe.hpp +0 -193
  99. netgen/include/l2hofe_impl.hpp +0 -564
  100. netgen/include/l2hofefo.hpp +0 -542
  101. netgen/include/l2hofespace.hpp +0 -344
  102. netgen/include/la.hpp +0 -38
  103. netgen/include/linearform.hpp +0 -266
  104. netgen/include/matrix.hpp +0 -2140
  105. netgen/include/memusage.hpp +0 -41
  106. netgen/include/meshaccess.hpp +0 -1358
  107. netgen/include/mgpre.hpp +0 -204
  108. netgen/include/mptools.hpp +0 -2145
  109. netgen/include/multigrid.hpp +0 -42
  110. netgen/include/multivector.hpp +0 -447
  111. netgen/include/mumpsinverse.hpp +0 -187
  112. netgen/include/mycomplex.hpp +0 -361
  113. netgen/include/ng_lapack.hpp +0 -1661
  114. netgen/include/ngblas.hpp +0 -1099
  115. netgen/include/ngs_defines.hpp +0 -30
  116. netgen/include/ngs_stdcpp_include.hpp +0 -106
  117. netgen/include/ngs_utils.hpp +0 -121
  118. netgen/include/ngsobject.hpp +0 -1019
  119. netgen/include/ngsstream.hpp +0 -113
  120. netgen/include/ngstd.hpp +0 -72
  121. netgen/include/nodalhofe.hpp +0 -96
  122. netgen/include/nodalhofe_impl.hpp +0 -141
  123. netgen/include/normalfacetfe.hpp +0 -223
  124. netgen/include/normalfacetfespace.hpp +0 -98
  125. netgen/include/normalfacetsurfacefespace.hpp +0 -84
  126. netgen/include/order.hpp +0 -251
  127. netgen/include/parallel_matrices.hpp +0 -222
  128. netgen/include/paralleldofs.hpp +0 -340
  129. netgen/include/parallelngs.hpp +0 -23
  130. netgen/include/parallelvector.hpp +0 -269
  131. netgen/include/pardisoinverse.hpp +0 -200
  132. netgen/include/periodic.hpp +0 -125
  133. netgen/include/plateaufespace.hpp +0 -25
  134. netgen/include/pml.hpp +0 -275
  135. netgen/include/pmltrafo.hpp +0 -631
  136. netgen/include/postproc.hpp +0 -142
  137. netgen/include/precomp.hpp +0 -60
  138. netgen/include/preconditioner.hpp +0 -602
  139. netgen/include/prolongation.hpp +0 -235
  140. netgen/include/python_comp.hpp +0 -107
  141. netgen/include/python_fem.hpp +0 -89
  142. netgen/include/python_linalg.hpp +0 -58
  143. netgen/include/python_ngstd.hpp +0 -385
  144. netgen/include/recursive_pol.hpp +0 -4844
  145. netgen/include/recursive_pol_tet.hpp +0 -395
  146. netgen/include/recursive_pol_trig.hpp +0 -492
  147. netgen/include/reorderedfespace.hpp +0 -81
  148. netgen/include/sample_sort.hpp +0 -105
  149. netgen/include/scalarfe.hpp +0 -335
  150. netgen/include/shapefunction_utils.hpp +0 -113
  151. netgen/include/simd_complex.hpp +0 -284
  152. netgen/include/smoother.hpp +0 -253
  153. netgen/include/solve.hpp +0 -89
  154. netgen/include/sparsecholesky.hpp +0 -313
  155. netgen/include/sparsematrix.hpp +0 -1038
  156. netgen/include/sparsematrix_dyn.hpp +0 -91
  157. netgen/include/sparsematrix_impl.hpp +0 -920
  158. netgen/include/special_matrix.hpp +0 -461
  159. netgen/include/specialelement.hpp +0 -125
  160. netgen/include/statushandler.hpp +0 -33
  161. netgen/include/stringops.hpp +0 -12
  162. netgen/include/superluinverse.hpp +0 -136
  163. netgen/include/symbolicintegrator.hpp +0 -849
  164. netgen/include/symmetricmatrix.hpp +0 -144
  165. netgen/include/tangentialfacetfe.hpp +0 -224
  166. netgen/include/tangentialfacetfespace.hpp +0 -106
  167. netgen/include/tensor.hpp +0 -522
  168. netgen/include/tensorcoefficient.hpp +0 -446
  169. netgen/include/tensorproductintegrator.hpp +0 -113
  170. netgen/include/thcurlfe.hpp +0 -128
  171. netgen/include/thcurlfe_impl.hpp +0 -380
  172. netgen/include/thdivfe.hpp +0 -80
  173. netgen/include/thdivfe_impl.hpp +0 -426
  174. netgen/include/tpdiffop.hpp +0 -461
  175. netgen/include/tpfes.hpp +0 -133
  176. netgen/include/tpintrule.hpp +0 -224
  177. netgen/include/triangular.hpp +0 -465
  178. netgen/include/tscalarfe.hpp +0 -245
  179. netgen/include/tscalarfe_impl.hpp +0 -1029
  180. netgen/include/umfpackinverse.hpp +0 -148
  181. netgen/include/vector.hpp +0 -1219
  182. netgen/include/voxelcoefficientfunction.hpp +0 -41
  183. netgen/include/vtkoutput.hpp +0 -198
  184. netgen/include/vvector.hpp +0 -208
  185. netgen/include/webgui.hpp +0 -92
  186. netgen/libngbla.dylib +0 -0
  187. netgen/libngcomp.dylib +0 -0
  188. netgen/libngfem.dylib +0 -0
  189. netgen/libngla.dylib +0 -0
  190. netgen/libngsolve.dylib +0 -0
  191. netgen/libngstd.dylib +0 -0
  192. ngsolve/__init__.pyi +0 -231
  193. ngsolve/bla.pyi +0 -1139
  194. ngsolve/bvp.pyi +0 -32
  195. ngsolve/cmake/NGSolveConfig.cmake +0 -102
  196. ngsolve/cmake/ngsolve-targets-release.cmake +0 -69
  197. ngsolve/cmake/ngsolve-targets.cmake +0 -163
  198. ngsolve/comp/__init__.pyi +0 -5382
  199. ngsolve/comp/pml.pyi +0 -89
  200. ngsolve/config/__init__.py +0 -1
  201. ngsolve/config/__init__.pyi +0 -43
  202. ngsolve/config/__main__.py +0 -4
  203. ngsolve/config/config.py +0 -60
  204. ngsolve/config/config.pyi +0 -45
  205. ngsolve/demos/TensorProduct/__init__.py +0 -0
  206. ngsolve/demos/TensorProduct/tp_dg_1d_1d.py +0 -80
  207. ngsolve/demos/TensorProduct/tp_dg_1d_2d.py +0 -73
  208. ngsolve/demos/TensorProduct/tp_dg_2d_1d.py +0 -72
  209. ngsolve/demos/TensorProduct/tp_dg_2d_2d.py +0 -66
  210. ngsolve/demos/__init__.py +0 -0
  211. ngsolve/demos/howto/__init__.py +0 -0
  212. ngsolve/demos/howto/hhj.py +0 -44
  213. ngsolve/demos/howto/hybrid_dg.py +0 -53
  214. ngsolve/demos/howto/mixed.py +0 -30
  215. ngsolve/demos/howto/nonlin.py +0 -29
  216. ngsolve/demos/howto/pickling.py +0 -26
  217. ngsolve/demos/howto/pml.py +0 -31
  218. ngsolve/demos/howto/taskmanager.py +0 -20
  219. ngsolve/demos/howto/tdnns.py +0 -47
  220. ngsolve/demos/howto/timeDG-skeleton.py +0 -45
  221. ngsolve/demos/howto/timeDG.py +0 -38
  222. ngsolve/demos/howto/timeDGlap.py +0 -42
  223. ngsolve/demos/howto/timeDGwave.py +0 -61
  224. ngsolve/demos/intro/__init__.py +0 -0
  225. ngsolve/demos/intro/adaptive.py +0 -123
  226. ngsolve/demos/intro/cmagnet.py +0 -62
  227. ngsolve/demos/intro/elasticity.py +0 -76
  228. ngsolve/demos/intro/navierstokes.py +0 -74
  229. ngsolve/demos/intro/poisson.ipynb +0 -170
  230. ngsolve/demos/intro/poisson.py +0 -41
  231. ngsolve/demos/mpi/__init__.py +0 -0
  232. ngsolve/demos/mpi/mpi_cmagnet.py +0 -87
  233. ngsolve/demos/mpi/mpi_navierstokes.py +0 -117
  234. ngsolve/demos/mpi/mpi_poisson.py +0 -89
  235. ngsolve/demos/mpi/mpi_timeDG.py +0 -82
  236. ngsolve/directsolvers.pyi +0 -15
  237. ngsolve/eigenvalues.pyi +0 -30
  238. ngsolve/fem.pyi +0 -1707
  239. ngsolve/krylovspace.pyi +0 -301
  240. ngsolve/la.pyi +0 -1218
  241. ngsolve/ngslib.so +0 -0
  242. ngsolve/ngstd.pyi +0 -58
  243. ngsolve/nonlinearsolvers.pyi +0 -97
  244. ngsolve/preconditioners.pyi +0 -6
  245. ngsolve/solve.pyi +0 -108
  246. ngsolve/solvers.pyi +0 -14
  247. ngsolve/timestepping.pyi +0 -27
  248. ngsolve/timing.pyi +0 -54
  249. ngsolve/utils.pyi +0 -279
  250. ngsolve-6.2.2501.data/data/Netgen.icns +0 -0
  251. ngsolve-6.2.2501.data/data/bin/ngscxx +0 -17
  252. ngsolve-6.2.2501.data/data/bin/ngsld +0 -13
  253. ngsolve-6.2.2501.data/data/bin/ngsolve.tcl +0 -648
  254. ngsolve-6.2.2501.data/data/bin/ngspy +0 -2
  255. ngsolve-6.2.2501.data/data/share/ngsolve/beam.geo +0 -17
  256. ngsolve-6.2.2501.data/data/share/ngsolve/beam.vol +0 -240
  257. ngsolve-6.2.2501.data/data/share/ngsolve/chip.in2d +0 -41
  258. ngsolve-6.2.2501.data/data/share/ngsolve/chip.vol +0 -614
  259. ngsolve-6.2.2501.data/data/share/ngsolve/coil.geo +0 -12
  260. ngsolve-6.2.2501.data/data/share/ngsolve/coil.vol +0 -2560
  261. ngsolve-6.2.2501.data/data/share/ngsolve/coilshield.geo +0 -24
  262. ngsolve-6.2.2501.data/data/share/ngsolve/coilshield.vol +0 -3179
  263. ngsolve-6.2.2501.data/data/share/ngsolve/cube.geo +0 -19
  264. ngsolve-6.2.2501.data/data/share/ngsolve/cube.vol +0 -1832
  265. ngsolve-6.2.2501.data/data/share/ngsolve/d10_DGdoubleglazing.pde +0 -50
  266. ngsolve-6.2.2501.data/data/share/ngsolve/d11_chip_nitsche.pde +0 -40
  267. ngsolve-6.2.2501.data/data/share/ngsolve/d1_square.pde +0 -43
  268. ngsolve-6.2.2501.data/data/share/ngsolve/d2_chip.pde +0 -35
  269. ngsolve-6.2.2501.data/data/share/ngsolve/d3_helmholtz.pde +0 -22
  270. ngsolve-6.2.2501.data/data/share/ngsolve/d4_cube.pde +0 -46
  271. ngsolve-6.2.2501.data/data/share/ngsolve/d5_beam.pde +0 -74
  272. ngsolve-6.2.2501.data/data/share/ngsolve/d6_shaft.pde +0 -73
  273. ngsolve-6.2.2501.data/data/share/ngsolve/d7_coil.pde +0 -50
  274. ngsolve-6.2.2501.data/data/share/ngsolve/d8_coilshield.pde +0 -49
  275. ngsolve-6.2.2501.data/data/share/ngsolve/d9_hybridDG.pde +0 -72
  276. ngsolve-6.2.2501.data/data/share/ngsolve/doubleglazing.in2d +0 -27
  277. ngsolve-6.2.2501.data/data/share/ngsolve/doubleglazing.vol +0 -737
  278. ngsolve-6.2.2501.data/data/share/ngsolve/piezo2d40round4.vol.gz +0 -0
  279. ngsolve-6.2.2501.data/data/share/ngsolve/shaft.geo +0 -73
  280. ngsolve-6.2.2501.data/data/share/ngsolve/shaft.vol +0 -4291
  281. ngsolve-6.2.2501.data/data/share/ngsolve/square.in2d +0 -17
  282. ngsolve-6.2.2501.data/data/share/ngsolve/square.vol +0 -149
  283. ngsolve-6.2.2501.dist-info/RECORD +0 -304
  284. {ngsolve-6.2.2501.dist-info → ngsolve-6.2.2501.post37.dev1.dist-info}/LICENSE +0 -0
  285. {ngsolve-6.2.2501.dist-info → ngsolve-6.2.2501.post37.dev1.dist-info}/WHEEL +0 -0
  286. {ngsolve-6.2.2501.dist-info → ngsolve-6.2.2501.post37.dev1.dist-info}/top_level.txt +0 -0
@@ -1,1661 +0,0 @@
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