1 #include <flens/lapack/interface/include/config.h>
2
3
4 namespace flens { namespace lapack {
5
6 extern "C" {
7
8 //-- dgeev ---------------------------------------------------------------------
9 void
10 LAPACK_DECL(dgeev)(const char *JOBVL,
11 const char *JOBVR,
12 const INTEGER *N,
13 DOUBLE *A,
14 const INTEGER *LDA,
15 DOUBLE *WR,
16 DOUBLE *WI,
17 DOUBLE *VL,
18 const INTEGER *LDVL,
19 DOUBLE *VR,
20 const INTEGER *LDVR,
21 DOUBLE *WORK,
22 const INTEGER *LWORK,
23 INTEGER *INFO)
24 {
25 DEBUG_FLENS_LAPACK("dgeev");
26
27 using std::max;
28 using std::min;
29 //
30 // Test the input parameters so that we pass LAPACK error checks
31 //
32 *INFO = 0;
33 bool lQuery = (*LWORK==-1);
34 bool wantVL = (*JOBVL=='V');
35 bool wantVR = (*JOBVR=='V');
36
37 if ((!wantVL) && (*JOBVL!='N')) {
38 *INFO = 1;
39 } else if ((!wantVR) && (*JOBVR!='N')) {
40 *INFO = 2;
41 } else if (*N<0) {
42 *INFO = 3;
43 } else if (*LDA<max(INTEGER(1),*N)) {
44 *INFO = 5;
45 } else if (*LDVL<1 || (wantVL && *LDVL<*N)) {
46 *INFO = 9;
47 } else if (*LDVR<1 || (wantVR && *LDVR<*N)) {
48 *INFO = 11;
49 }
50
51 if (*INFO!=0) {
52 LAPACK_ERROR("DGEEV", INFO);
53 *INFO = -(*INFO);
54 return;
55 }
56
57 //
58 // Setup FLENS matrix/vector types
59 //
60 DGeMatrixView _A = DFSView(*N, *N, A, *LDA);
61 DDenseVectorView _WR = DArrayView(*N, WR, 1);
62 DDenseVectorView _WI = DArrayView(*N, WI, 1);
63 DGeMatrixView _VL = DFSView(*N, *N, VL, *LDVL);
64 DGeMatrixView _VR = DFSView(*N, *N, VR, *LDVR);
65 DDenseVectorView _WORK = DArrayView(*LWORK, WORK, 1);
66
67 //
68 // Test if work has at least minimal worksize
69 //
70 auto ws = ev_wsq(wantVL, wantVR, _A);
71
72 if (*LWORK<ws.first && !lQuery) {
73 *INFO = 13;
74 }
75
76 if (*INFO!=0) {
77 LAPACK_ERROR("DGEEV", INFO);
78 *INFO = -(*INFO);
79 return;
80 }
81 //
82 // Call FLENS implementation
83 //
84 ev(wantVL, wantVR, _A, _WR, _WI, _VL, _VR, _WORK);
85 }
86
87 } // extern "C"
88
89 } } // namespace lapack, flens
2
3
4 namespace flens { namespace lapack {
5
6 extern "C" {
7
8 //-- dgeev ---------------------------------------------------------------------
9 void
10 LAPACK_DECL(dgeev)(const char *JOBVL,
11 const char *JOBVR,
12 const INTEGER *N,
13 DOUBLE *A,
14 const INTEGER *LDA,
15 DOUBLE *WR,
16 DOUBLE *WI,
17 DOUBLE *VL,
18 const INTEGER *LDVL,
19 DOUBLE *VR,
20 const INTEGER *LDVR,
21 DOUBLE *WORK,
22 const INTEGER *LWORK,
23 INTEGER *INFO)
24 {
25 DEBUG_FLENS_LAPACK("dgeev");
26
27 using std::max;
28 using std::min;
29 //
30 // Test the input parameters so that we pass LAPACK error checks
31 //
32 *INFO = 0;
33 bool lQuery = (*LWORK==-1);
34 bool wantVL = (*JOBVL=='V');
35 bool wantVR = (*JOBVR=='V');
36
37 if ((!wantVL) && (*JOBVL!='N')) {
38 *INFO = 1;
39 } else if ((!wantVR) && (*JOBVR!='N')) {
40 *INFO = 2;
41 } else if (*N<0) {
42 *INFO = 3;
43 } else if (*LDA<max(INTEGER(1),*N)) {
44 *INFO = 5;
45 } else if (*LDVL<1 || (wantVL && *LDVL<*N)) {
46 *INFO = 9;
47 } else if (*LDVR<1 || (wantVR && *LDVR<*N)) {
48 *INFO = 11;
49 }
50
51 if (*INFO!=0) {
52 LAPACK_ERROR("DGEEV", INFO);
53 *INFO = -(*INFO);
54 return;
55 }
56
57 //
58 // Setup FLENS matrix/vector types
59 //
60 DGeMatrixView _A = DFSView(*N, *N, A, *LDA);
61 DDenseVectorView _WR = DArrayView(*N, WR, 1);
62 DDenseVectorView _WI = DArrayView(*N, WI, 1);
63 DGeMatrixView _VL = DFSView(*N, *N, VL, *LDVL);
64 DGeMatrixView _VR = DFSView(*N, *N, VR, *LDVR);
65 DDenseVectorView _WORK = DArrayView(*LWORK, WORK, 1);
66
67 //
68 // Test if work has at least minimal worksize
69 //
70 auto ws = ev_wsq(wantVL, wantVR, _A);
71
72 if (*LWORK<ws.first && !lQuery) {
73 *INFO = 13;
74 }
75
76 if (*INFO!=0) {
77 LAPACK_ERROR("DGEEV", INFO);
78 *INFO = -(*INFO);
79 return;
80 }
81 //
82 // Call FLENS implementation
83 //
84 ev(wantVL, wantVR, _A, _WR, _WI, _VL, _VR, _WORK);
85 }
86
87 } // extern "C"
88
89 } } // namespace lapack, flens