1 //#define CXXBLAS_DEBUG_OUT(x) std::cerr << x << std::endl;
2
3 #define STR(x) #x
4 #define STRING(x) STR(x)
5
6 #define FLENS_DEFAULT_INDEXTYPE int
7
8 #include <flens/lapack/interface/include/config.h>
9
10
11 namespace flens { namespace lapack {
12
13 extern "C" {
14
15 //-- dgetrs --------------------------------------------------------------------
16 void
17 LAPACK_DECL(dgejsv)(const char *JOBA,
18 const char *JOBU,
19 const char *JOBV,
20 const char *JOBR,
21 const char *JOBT,
22 const char *JOBP,
23 const INTEGER *M,
24 const INTEGER *N,
25 DOUBLE *A,
26 const INTEGER *LDA,
27 DOUBLE *SVA,
28 DOUBLE *U,
29 const INTEGER *LDU,
30 DOUBLE *V,
31 const INTEGER *LDV,
32 DOUBLE *WORK,
33 const INTEGER *LWORK,
34 INTEGER *IWORK,
35 INTEGER *INFO)
36 {
37 DEBUG_FLENS_LAPACK("dgejsv");
38 //
39 // Test the input parameters so that we pass LAPACK error checks
40 //
41 const bool lsvec = (*JOBU=='U') || (*JOBU=='F');
42 const bool jracc = (*JOBV=='J');
43 const bool rsvec = (*JOBV=='V') || jracc;
44 const bool rowpiv = (*JOBA=='F') || (*JOBA=='G');
45 const bool l2rank = (*JOBA=='R');
46 const bool l2aber = (*JOBA=='A');
47 const bool errest = (*JOBA=='E') || (*JOBA=='G');
48 const bool l2tran = (*JOBT=='T');
49 const bool l2kill = (*JOBR=='R');
50 const bool defr = (*JOBR=='N');
51 const bool l2pert = (*JOBP=='P');
52
53 const INTEGER m = *M;
54 const INTEGER n = *N;
55
56 *INFO = 0;
57 if (!(rowpiv || l2rank || l2aber || errest || *JOBA=='C')) {
58 *INFO = -1;
59 } else if (!(lsvec || *JOBU=='N' || *JOBU=='W')) {
60 *INFO = -2;
61 } else if (!(rsvec || *JOBV=='N' || *JOBV=='W') || (jracc && !lsvec)) {
62 *INFO = -3;
63 } else if (!(l2kill || defr)) {
64 *INFO = -4;
65 } else if (!(l2tran || *JOBT=='N')) {
66 *INFO = -5;
67 } else if (!(l2pert || *JOBP=='N')) {
68 *INFO = -6;
69 } else if (m<0) {
70 *INFO = -7;
71 } else if ((n<0) || (n>m)) {
72 *INFO = -8;
73 } else if (*LDA<m) {
74 *INFO = -10;
75 } else if (lsvec && *LDU<m) {
76 *INFO = -13;
77 } else if (rsvec && *LDV<n) {
78 *INFO = -14;
79 } else if ((!(lsvec || rsvec || errest) || (*LWORK < max(7,4*n+1,2*m+n)))
80 || (!(lsvec || rsvec) || errest || (*LWORK < max(7,4*n+n*n,2*m+n)))
81 || (lsvec || (!rsvec) || (*LWORK < max(7,2*m+n,4*n+1)))
82 || (rsvec || (!lsvec) || (*LWORK < max(7,2*m+n,4*n+1)))
83 || (lsvec || rsvec || (!jracc) || (*LWORK<max(2*m+n,6*n+2*n*n)))
84 || (lsvec || rsvec || jracc || *LWORK<max(2*m+n,4*n+n*n,2*n+n*n+6)))
85 {
86 *INFO = -17;
87 }
88
89 if (*INFO!=0) {
90 *INFO = -(*INFO);
91 LAPACK_ERROR("DGEJSV", INFO);
92 *INFO = -(*INFO);
93 return;
94 }
95
96 //
97 // Call FLENS implementation
98 //
99 JSV::Accuracy accuracy = JSV::Accuracy(*JOBA);
100 JSV::JobU jobU = JSV::JobU(*JOBU);
101 JSV::JobV jobV = JSV::JobV(*JOBV);
102 const bool restrictedRange = (*JOBR=='R');
103 const bool considerTransA = (*JOBT=='T');
104 const bool perturb = (*JOBR=='P');
105
106 DGeMatrixView _A = DFSView(m, n, A, *LDA);
107 DDenseVectorView _sva = DArrayView(n, SVA, INTEGER(1));
108 DGeMatrixView _U = DFSView(m, n, U, *LDU);
109 DGeMatrixView _V = DFSView(n, n, V, *LDV);
110 DDenseVectorView _work = DArrayView(*LWORK, WORK, INTEGER(1));
111 IDenseVectorView _iwork = IArrayView(m+3*n, IWORK, INTEGER(1));
112
113 *INFO = jsv(accuracy, jobU, jobV,
114 restrictedRange, considerTransA, perturb,
115 _A, _sva, _U, _V, _work, _iwork);
116
117 if (*INFO<0) {
118 *INFO = -(*INFO);
119 LAPACK_ERROR("DGEJSV", INFO);
120 *INFO = -(*INFO);
121 return;
122 }
123 }
124
125 } // extern "C"
126
127 } } // namespace lapack, flens
2
3 #define STR(x) #x
4 #define STRING(x) STR(x)
5
6 #define FLENS_DEFAULT_INDEXTYPE int
7
8 #include <flens/lapack/interface/include/config.h>
9
10
11 namespace flens { namespace lapack {
12
13 extern "C" {
14
15 //-- dgetrs --------------------------------------------------------------------
16 void
17 LAPACK_DECL(dgejsv)(const char *JOBA,
18 const char *JOBU,
19 const char *JOBV,
20 const char *JOBR,
21 const char *JOBT,
22 const char *JOBP,
23 const INTEGER *M,
24 const INTEGER *N,
25 DOUBLE *A,
26 const INTEGER *LDA,
27 DOUBLE *SVA,
28 DOUBLE *U,
29 const INTEGER *LDU,
30 DOUBLE *V,
31 const INTEGER *LDV,
32 DOUBLE *WORK,
33 const INTEGER *LWORK,
34 INTEGER *IWORK,
35 INTEGER *INFO)
36 {
37 DEBUG_FLENS_LAPACK("dgejsv");
38 //
39 // Test the input parameters so that we pass LAPACK error checks
40 //
41 const bool lsvec = (*JOBU=='U') || (*JOBU=='F');
42 const bool jracc = (*JOBV=='J');
43 const bool rsvec = (*JOBV=='V') || jracc;
44 const bool rowpiv = (*JOBA=='F') || (*JOBA=='G');
45 const bool l2rank = (*JOBA=='R');
46 const bool l2aber = (*JOBA=='A');
47 const bool errest = (*JOBA=='E') || (*JOBA=='G');
48 const bool l2tran = (*JOBT=='T');
49 const bool l2kill = (*JOBR=='R');
50 const bool defr = (*JOBR=='N');
51 const bool l2pert = (*JOBP=='P');
52
53 const INTEGER m = *M;
54 const INTEGER n = *N;
55
56 *INFO = 0;
57 if (!(rowpiv || l2rank || l2aber || errest || *JOBA=='C')) {
58 *INFO = -1;
59 } else if (!(lsvec || *JOBU=='N' || *JOBU=='W')) {
60 *INFO = -2;
61 } else if (!(rsvec || *JOBV=='N' || *JOBV=='W') || (jracc && !lsvec)) {
62 *INFO = -3;
63 } else if (!(l2kill || defr)) {
64 *INFO = -4;
65 } else if (!(l2tran || *JOBT=='N')) {
66 *INFO = -5;
67 } else if (!(l2pert || *JOBP=='N')) {
68 *INFO = -6;
69 } else if (m<0) {
70 *INFO = -7;
71 } else if ((n<0) || (n>m)) {
72 *INFO = -8;
73 } else if (*LDA<m) {
74 *INFO = -10;
75 } else if (lsvec && *LDU<m) {
76 *INFO = -13;
77 } else if (rsvec && *LDV<n) {
78 *INFO = -14;
79 } else if ((!(lsvec || rsvec || errest) || (*LWORK < max(7,4*n+1,2*m+n)))
80 || (!(lsvec || rsvec) || errest || (*LWORK < max(7,4*n+n*n,2*m+n)))
81 || (lsvec || (!rsvec) || (*LWORK < max(7,2*m+n,4*n+1)))
82 || (rsvec || (!lsvec) || (*LWORK < max(7,2*m+n,4*n+1)))
83 || (lsvec || rsvec || (!jracc) || (*LWORK<max(2*m+n,6*n+2*n*n)))
84 || (lsvec || rsvec || jracc || *LWORK<max(2*m+n,4*n+n*n,2*n+n*n+6)))
85 {
86 *INFO = -17;
87 }
88
89 if (*INFO!=0) {
90 *INFO = -(*INFO);
91 LAPACK_ERROR("DGEJSV", INFO);
92 *INFO = -(*INFO);
93 return;
94 }
95
96 //
97 // Call FLENS implementation
98 //
99 JSV::Accuracy accuracy = JSV::Accuracy(*JOBA);
100 JSV::JobU jobU = JSV::JobU(*JOBU);
101 JSV::JobV jobV = JSV::JobV(*JOBV);
102 const bool restrictedRange = (*JOBR=='R');
103 const bool considerTransA = (*JOBT=='T');
104 const bool perturb = (*JOBR=='P');
105
106 DGeMatrixView _A = DFSView(m, n, A, *LDA);
107 DDenseVectorView _sva = DArrayView(n, SVA, INTEGER(1));
108 DGeMatrixView _U = DFSView(m, n, U, *LDU);
109 DGeMatrixView _V = DFSView(n, n, V, *LDV);
110 DDenseVectorView _work = DArrayView(*LWORK, WORK, INTEGER(1));
111 IDenseVectorView _iwork = IArrayView(m+3*n, IWORK, INTEGER(1));
112
113 *INFO = jsv(accuracy, jobU, jobV,
114 restrictedRange, considerTransA, perturb,
115 _A, _sva, _U, _V, _work, _iwork);
116
117 if (*INFO<0) {
118 *INFO = -(*INFO);
119 LAPACK_ERROR("DGEJSV", INFO);
120 *INFO = -(*INFO);
121 return;
122 }
123 }
124
125 } // extern "C"
126
127 } } // namespace lapack, flens