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