1 //
2 // Copyright (c) 2002--2010
3 // Toon Knapen, Karl Meerbergen, Kresimir Fresl,
4 // Thomas Klimpel and Rutger ter Borg
5 //
6 // Distributed under the Boost Software License, Version 1.0.
7 // (See accompanying file LICENSE_1_0.txt or copy at
8 // http://www.boost.org/LICENSE_1_0.txt)
9 //
10 // THIS FILE IS AUTOMATICALLY GENERATED
11 // PLEASE DO NOT EDIT!
12 //
13 
14 #ifndef BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_TGSJA_HPP
15 #define BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_TGSJA_HPP
16 
17 #include <boost/assert.hpp>
18 #include <boost/numeric/bindings/begin.hpp>
19 #include <boost/numeric/bindings/detail/array.hpp>
20 #include <boost/numeric/bindings/is_column_major.hpp>
21 #include <boost/numeric/bindings/is_complex.hpp>
22 #include <boost/numeric/bindings/is_mutable.hpp>
23 #include <boost/numeric/bindings/is_real.hpp>
24 #include <boost/numeric/bindings/lapack/workspace.hpp>
25 #include <boost/numeric/bindings/remove_imaginary.hpp>
26 #include <boost/numeric/bindings/size.hpp>
27 #include <boost/numeric/bindings/stride.hpp>
28 #include <boost/numeric/bindings/value_type.hpp>
29 #include <boost/static_assert.hpp>
30 #include <boost/type_traits/is_same.hpp>
31 #include <boost/type_traits/remove_const.hpp>
32 #include <boost/utility/enable_if.hpp>
33 
34 //
35 // The LAPACK-backend for tgsja is the netlib-compatible backend.
36 //
37 #include <boost/numeric/bindings/lapack/detail/lapack.h>
38 #include <boost/numeric/bindings/lapack/detail/lapack_option.hpp>
39 
40 namespace boost {
41 namespace numeric {
42 namespace bindings {
43 namespace lapack {
44 
45 //
46 // The detail namespace contains value-type-overloaded functions that
47 // dispatch to the appropriate back-end LAPACK-routine.
48 //
49 namespace detail {
50 
51 //
52 // Overloaded function for dispatching to
53 // * netlib-compatible LAPACK backend (the default), and
54 // * float value-type.
55 //
tgsja(const char jobu,const char jobv,const char jobq,const fortran_int_t m,const fortran_int_t p,const fortran_int_t n,const fortran_int_t k,const fortran_int_t l,float * a,const fortran_int_t lda,float * b,const fortran_int_t ldb,const float tola,const float tolb,float * alpha,float * beta,float * u,const fortran_int_t ldu,float * v,const fortran_int_t ldv,float * q,const fortran_int_t ldq,float * work,fortran_int_t & ncycle)56 inline std::ptrdiff_t tgsja( const char jobu, const char jobv, const char jobq,
57         const fortran_int_t m, const fortran_int_t p, const fortran_int_t n,
58         const fortran_int_t k, const fortran_int_t l, float* a,
59         const fortran_int_t lda, float* b, const fortran_int_t ldb,
60         const float tola, const float tolb, float* alpha, float* beta,
61         float* u, const fortran_int_t ldu, float* v, const fortran_int_t ldv,
62         float* q, const fortran_int_t ldq, float* work,
63         fortran_int_t& ncycle ) {
64     fortran_int_t info(0);
65     LAPACK_STGSJA( &jobu, &jobv, &jobq, &m, &p, &n, &k, &l, a, &lda, b, &ldb,
66             &tola, &tolb, alpha, beta, u, &ldu, v, &ldv, q, &ldq, work,
67             &ncycle, &info );
68     return info;
69 }
70 
71 //
72 // Overloaded function for dispatching to
73 // * netlib-compatible LAPACK backend (the default), and
74 // * double value-type.
75 //
tgsja(const char jobu,const char jobv,const char jobq,const fortran_int_t m,const fortran_int_t p,const fortran_int_t n,const fortran_int_t k,const fortran_int_t l,double * a,const fortran_int_t lda,double * b,const fortran_int_t ldb,const double tola,const double tolb,double * alpha,double * beta,double * u,const fortran_int_t ldu,double * v,const fortran_int_t ldv,double * q,const fortran_int_t ldq,double * work,fortran_int_t & ncycle)76 inline std::ptrdiff_t tgsja( const char jobu, const char jobv, const char jobq,
77         const fortran_int_t m, const fortran_int_t p, const fortran_int_t n,
78         const fortran_int_t k, const fortran_int_t l, double* a,
79         const fortran_int_t lda, double* b, const fortran_int_t ldb,
80         const double tola, const double tolb, double* alpha, double* beta,
81         double* u, const fortran_int_t ldu, double* v,
82         const fortran_int_t ldv, double* q, const fortran_int_t ldq,
83         double* work, fortran_int_t& ncycle ) {
84     fortran_int_t info(0);
85     LAPACK_DTGSJA( &jobu, &jobv, &jobq, &m, &p, &n, &k, &l, a, &lda, b, &ldb,
86             &tola, &tolb, alpha, beta, u, &ldu, v, &ldv, q, &ldq, work,
87             &ncycle, &info );
88     return info;
89 }
90 
91 //
92 // Overloaded function for dispatching to
93 // * netlib-compatible LAPACK backend (the default), and
94 // * complex<float> value-type.
95 //
tgsja(const char jobu,const char jobv,const char jobq,const fortran_int_t m,const fortran_int_t p,const fortran_int_t n,const fortran_int_t k,const fortran_int_t l,std::complex<float> * a,const fortran_int_t lda,std::complex<float> * b,const fortran_int_t ldb,const float tola,const float tolb,float * alpha,float * beta,std::complex<float> * u,const fortran_int_t ldu,std::complex<float> * v,const fortran_int_t ldv,std::complex<float> * q,const fortran_int_t ldq,std::complex<float> * work,fortran_int_t & ncycle)96 inline std::ptrdiff_t tgsja( const char jobu, const char jobv, const char jobq,
97         const fortran_int_t m, const fortran_int_t p, const fortran_int_t n,
98         const fortran_int_t k, const fortran_int_t l, std::complex<float>* a,
99         const fortran_int_t lda, std::complex<float>* b,
100         const fortran_int_t ldb, const float tola, const float tolb,
101         float* alpha, float* beta, std::complex<float>* u,
102         const fortran_int_t ldu, std::complex<float>* v,
103         const fortran_int_t ldv, std::complex<float>* q,
104         const fortran_int_t ldq, std::complex<float>* work,
105         fortran_int_t& ncycle ) {
106     fortran_int_t info(0);
107     LAPACK_CTGSJA( &jobu, &jobv, &jobq, &m, &p, &n, &k, &l, a, &lda, b, &ldb,
108             &tola, &tolb, alpha, beta, u, &ldu, v, &ldv, q, &ldq, work,
109             &ncycle, &info );
110     return info;
111 }
112 
113 //
114 // Overloaded function for dispatching to
115 // * netlib-compatible LAPACK backend (the default), and
116 // * complex<double> value-type.
117 //
tgsja(const char jobu,const char jobv,const char jobq,const fortran_int_t m,const fortran_int_t p,const fortran_int_t n,const fortran_int_t k,const fortran_int_t l,std::complex<double> * a,const fortran_int_t lda,std::complex<double> * b,const fortran_int_t ldb,const double tola,const double tolb,double * alpha,double * beta,std::complex<double> * u,const fortran_int_t ldu,std::complex<double> * v,const fortran_int_t ldv,std::complex<double> * q,const fortran_int_t ldq,std::complex<double> * work,fortran_int_t & ncycle)118 inline std::ptrdiff_t tgsja( const char jobu, const char jobv, const char jobq,
119         const fortran_int_t m, const fortran_int_t p, const fortran_int_t n,
120         const fortran_int_t k, const fortran_int_t l, std::complex<double>* a,
121         const fortran_int_t lda, std::complex<double>* b,
122         const fortran_int_t ldb, const double tola, const double tolb,
123         double* alpha, double* beta, std::complex<double>* u,
124         const fortran_int_t ldu, std::complex<double>* v,
125         const fortran_int_t ldv, std::complex<double>* q,
126         const fortran_int_t ldq, std::complex<double>* work,
127         fortran_int_t& ncycle ) {
128     fortran_int_t info(0);
129     LAPACK_ZTGSJA( &jobu, &jobv, &jobq, &m, &p, &n, &k, &l, a, &lda, b, &ldb,
130             &tola, &tolb, alpha, beta, u, &ldu, v, &ldv, q, &ldq, work,
131             &ncycle, &info );
132     return info;
133 }
134 
135 } // namespace detail
136 
137 //
138 // Value-type based template class. Use this class if you need a type
139 // for dispatching to tgsja.
140 //
141 template< typename Value, typename Enable = void >
142 struct tgsja_impl {};
143 
144 //
145 // This implementation is enabled if Value is a real type.
146 //
147 template< typename Value >
148 struct tgsja_impl< Value, typename boost::enable_if< is_real< Value > >::type > {
149 
150     typedef Value value_type;
151     typedef typename remove_imaginary< Value >::type real_type;
152 
153     //
154     // Static member function for user-defined workspaces, that
155     // * Deduces the required arguments for dispatching to LAPACK, and
156     // * Asserts that most arguments make sense.
157     //
158     template< typename MatrixA, typename MatrixB, typename VectorALPHA,
159             typename VectorBETA, typename MatrixU, typename MatrixV,
160             typename MatrixQ, typename WORK >
invokeboost::numeric::bindings::lapack::tgsja_impl161     static std::ptrdiff_t invoke( const char jobu, const char jobv,
162             const char jobq, const fortran_int_t k,
163             const fortran_int_t l, MatrixA& a, MatrixB& b,
164             const real_type tola, const real_type tolb, VectorALPHA& alpha,
165             VectorBETA& beta, MatrixU& u, MatrixV& v, MatrixQ& q,
166             fortran_int_t& ncycle, detail::workspace1< WORK > work ) {
167         namespace bindings = ::boost::numeric::bindings;
168         BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixA >::value) );
169         BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixB >::value) );
170         BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixU >::value) );
171         BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixV >::value) );
172         BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixQ >::value) );
173         BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const<
174                 typename bindings::value_type< MatrixA >::type >::type,
175                 typename remove_const< typename bindings::value_type<
176                 MatrixB >::type >::type >::value) );
177         BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const<
178                 typename bindings::value_type< MatrixA >::type >::type,
179                 typename remove_const< typename bindings::value_type<
180                 VectorALPHA >::type >::type >::value) );
181         BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const<
182                 typename bindings::value_type< MatrixA >::type >::type,
183                 typename remove_const< typename bindings::value_type<
184                 VectorBETA >::type >::type >::value) );
185         BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const<
186                 typename bindings::value_type< MatrixA >::type >::type,
187                 typename remove_const< typename bindings::value_type<
188                 MatrixU >::type >::type >::value) );
189         BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const<
190                 typename bindings::value_type< MatrixA >::type >::type,
191                 typename remove_const< typename bindings::value_type<
192                 MatrixV >::type >::type >::value) );
193         BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const<
194                 typename bindings::value_type< MatrixA >::type >::type,
195                 typename remove_const< typename bindings::value_type<
196                 MatrixQ >::type >::type >::value) );
197         BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixA >::value) );
198         BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixB >::value) );
199         BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorALPHA >::value) );
200         BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorBETA >::value) );
201         BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixU >::value) );
202         BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixV >::value) );
203         BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixQ >::value) );
204         BOOST_ASSERT( bindings::size(alpha) >= bindings::size_column(a) );
205         BOOST_ASSERT( bindings::size(work.select(real_type())) >=
206                 min_size_work( bindings::size_column(a) ));
207         BOOST_ASSERT( bindings::size_column(a) >= 0 );
208         BOOST_ASSERT( bindings::size_minor(a) == 1 ||
209                 bindings::stride_minor(a) == 1 );
210         BOOST_ASSERT( bindings::size_minor(b) == 1 ||
211                 bindings::stride_minor(b) == 1 );
212         BOOST_ASSERT( bindings::size_minor(q) == 1 ||
213                 bindings::stride_minor(q) == 1 );
214         BOOST_ASSERT( bindings::size_minor(u) == 1 ||
215                 bindings::stride_minor(u) == 1 );
216         BOOST_ASSERT( bindings::size_minor(v) == 1 ||
217                 bindings::stride_minor(v) == 1 );
218         BOOST_ASSERT( bindings::size_row(a) >= 0 );
219         BOOST_ASSERT( bindings::size_row(b) >= 0 );
220         BOOST_ASSERT( bindings::stride_major(a) >= std::max< std::ptrdiff_t >(1,
221                 bindings::size_row(a)) );
222         BOOST_ASSERT( bindings::stride_major(b) >= std::max< std::ptrdiff_t >(1,
223                 bindings::size_row(b)) );
224         BOOST_ASSERT( jobq == 'Q' || jobq == 'I' || jobq == 'N' );
225         BOOST_ASSERT( jobu == 'U' || jobu == 'I' || jobu == 'N' );
226         BOOST_ASSERT( jobv == 'V' || jobv == 'I' || jobv == 'N' );
227         return detail::tgsja( jobu, jobv, jobq, bindings::size_row(a),
228                 bindings::size_row(b), bindings::size_column(a), k, l,
229                 bindings::begin_value(a), bindings::stride_major(a),
230                 bindings::begin_value(b), bindings::stride_major(b), tola,
231                 tolb, bindings::begin_value(alpha),
232                 bindings::begin_value(beta), bindings::begin_value(u),
233                 bindings::stride_major(u), bindings::begin_value(v),
234                 bindings::stride_major(v), bindings::begin_value(q),
235                 bindings::stride_major(q),
236                 bindings::begin_value(work.select(real_type())), ncycle );
237     }
238 
239     //
240     // Static member function that
241     // * Figures out the minimal workspace requirements, and passes
242     //   the results to the user-defined workspace overload of the
243     //   invoke static member function
244     // * Enables the unblocked algorithm (BLAS level 2)
245     //
246     template< typename MatrixA, typename MatrixB, typename VectorALPHA,
247             typename VectorBETA, typename MatrixU, typename MatrixV,
248             typename MatrixQ >
invokeboost::numeric::bindings::lapack::tgsja_impl249     static std::ptrdiff_t invoke( const char jobu, const char jobv,
250             const char jobq, const fortran_int_t k,
251             const fortran_int_t l, MatrixA& a, MatrixB& b,
252             const real_type tola, const real_type tolb, VectorALPHA& alpha,
253             VectorBETA& beta, MatrixU& u, MatrixV& v, MatrixQ& q,
254             fortran_int_t& ncycle, minimal_workspace ) {
255         namespace bindings = ::boost::numeric::bindings;
256         bindings::detail::array< real_type > tmp_work( min_size_work(
257                 bindings::size_column(a) ) );
258         return invoke( jobu, jobv, jobq, k, l, a, b, tola, tolb, alpha, beta,
259                 u, v, q, ncycle, workspace( tmp_work ) );
260     }
261 
262     //
263     // Static member function that
264     // * Figures out the optimal workspace requirements, and passes
265     //   the results to the user-defined workspace overload of the
266     //   invoke static member
267     // * Enables the blocked algorithm (BLAS level 3)
268     //
269     template< typename MatrixA, typename MatrixB, typename VectorALPHA,
270             typename VectorBETA, typename MatrixU, typename MatrixV,
271             typename MatrixQ >
invokeboost::numeric::bindings::lapack::tgsja_impl272     static std::ptrdiff_t invoke( const char jobu, const char jobv,
273             const char jobq, const fortran_int_t k,
274             const fortran_int_t l, MatrixA& a, MatrixB& b,
275             const real_type tola, const real_type tolb, VectorALPHA& alpha,
276             VectorBETA& beta, MatrixU& u, MatrixV& v, MatrixQ& q,
277             fortran_int_t& ncycle, optimal_workspace ) {
278         namespace bindings = ::boost::numeric::bindings;
279         return invoke( jobu, jobv, jobq, k, l, a, b, tola, tolb, alpha, beta,
280                 u, v, q, ncycle, minimal_workspace() );
281     }
282 
283     //
284     // Static member function that returns the minimum size of
285     // workspace-array work.
286     //
min_size_workboost::numeric::bindings::lapack::tgsja_impl287     static std::ptrdiff_t min_size_work( const std::ptrdiff_t n ) {
288         return 2*n;
289     }
290 };
291 
292 //
293 // This implementation is enabled if Value is a complex type.
294 //
295 template< typename Value >
296 struct tgsja_impl< Value, typename boost::enable_if< is_complex< Value > >::type > {
297 
298     typedef Value value_type;
299     typedef typename remove_imaginary< Value >::type real_type;
300 
301     //
302     // Static member function for user-defined workspaces, that
303     // * Deduces the required arguments for dispatching to LAPACK, and
304     // * Asserts that most arguments make sense.
305     //
306     template< typename MatrixA, typename MatrixB, typename VectorALPHA,
307             typename VectorBETA, typename MatrixU, typename MatrixV,
308             typename MatrixQ, typename WORK >
invokeboost::numeric::bindings::lapack::tgsja_impl309     static std::ptrdiff_t invoke( const char jobu, const char jobv,
310             const char jobq, const fortran_int_t k,
311             const fortran_int_t l, MatrixA& a, MatrixB& b,
312             const real_type tola, const real_type tolb, VectorALPHA& alpha,
313             VectorBETA& beta, MatrixU& u, MatrixV& v, MatrixQ& q,
314             fortran_int_t& ncycle, detail::workspace1< WORK > work ) {
315         namespace bindings = ::boost::numeric::bindings;
316         BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixA >::value) );
317         BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixB >::value) );
318         BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixU >::value) );
319         BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixV >::value) );
320         BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixQ >::value) );
321         BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const<
322                 typename bindings::value_type< VectorALPHA >::type >::type,
323                 typename remove_const< typename bindings::value_type<
324                 VectorBETA >::type >::type >::value) );
325         BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const<
326                 typename bindings::value_type< MatrixA >::type >::type,
327                 typename remove_const< typename bindings::value_type<
328                 MatrixB >::type >::type >::value) );
329         BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const<
330                 typename bindings::value_type< MatrixA >::type >::type,
331                 typename remove_const< typename bindings::value_type<
332                 MatrixU >::type >::type >::value) );
333         BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const<
334                 typename bindings::value_type< MatrixA >::type >::type,
335                 typename remove_const< typename bindings::value_type<
336                 MatrixV >::type >::type >::value) );
337         BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const<
338                 typename bindings::value_type< MatrixA >::type >::type,
339                 typename remove_const< typename bindings::value_type<
340                 MatrixQ >::type >::type >::value) );
341         BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixA >::value) );
342         BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixB >::value) );
343         BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorALPHA >::value) );
344         BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorBETA >::value) );
345         BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixU >::value) );
346         BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixV >::value) );
347         BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixQ >::value) );
348         BOOST_ASSERT( bindings::size(alpha) >= bindings::size_column(a) );
349         BOOST_ASSERT( bindings::size(work.select(value_type())) >=
350                 min_size_work( bindings::size_column(a) ));
351         BOOST_ASSERT( bindings::size_column(a) >= 0 );
352         BOOST_ASSERT( bindings::size_minor(a) == 1 ||
353                 bindings::stride_minor(a) == 1 );
354         BOOST_ASSERT( bindings::size_minor(b) == 1 ||
355                 bindings::stride_minor(b) == 1 );
356         BOOST_ASSERT( bindings::size_minor(q) == 1 ||
357                 bindings::stride_minor(q) == 1 );
358         BOOST_ASSERT( bindings::size_minor(u) == 1 ||
359                 bindings::stride_minor(u) == 1 );
360         BOOST_ASSERT( bindings::size_minor(v) == 1 ||
361                 bindings::stride_minor(v) == 1 );
362         BOOST_ASSERT( bindings::size_row(a) >= 0 );
363         BOOST_ASSERT( bindings::size_row(b) >= 0 );
364         BOOST_ASSERT( bindings::stride_major(a) >= std::max< std::ptrdiff_t >(1,
365                 bindings::size_row(a)) );
366         BOOST_ASSERT( bindings::stride_major(b) >= std::max< std::ptrdiff_t >(1,
367                 bindings::size_row(b)) );
368         BOOST_ASSERT( jobq == 'Q' || jobq == 'I' || jobq == 'N' );
369         BOOST_ASSERT( jobu == 'U' || jobu == 'I' || jobu == 'N' );
370         BOOST_ASSERT( jobv == 'V' || jobv == 'I' || jobv == 'N' );
371         return detail::tgsja( jobu, jobv, jobq, bindings::size_row(a),
372                 bindings::size_row(b), bindings::size_column(a), k, l,
373                 bindings::begin_value(a), bindings::stride_major(a),
374                 bindings::begin_value(b), bindings::stride_major(b), tola,
375                 tolb, bindings::begin_value(alpha),
376                 bindings::begin_value(beta), bindings::begin_value(u),
377                 bindings::stride_major(u), bindings::begin_value(v),
378                 bindings::stride_major(v), bindings::begin_value(q),
379                 bindings::stride_major(q),
380                 bindings::begin_value(work.select(value_type())), ncycle );
381     }
382 
383     //
384     // Static member function that
385     // * Figures out the minimal workspace requirements, and passes
386     //   the results to the user-defined workspace overload of the
387     //   invoke static member function
388     // * Enables the unblocked algorithm (BLAS level 2)
389     //
390     template< typename MatrixA, typename MatrixB, typename VectorALPHA,
391             typename VectorBETA, typename MatrixU, typename MatrixV,
392             typename MatrixQ >
invokeboost::numeric::bindings::lapack::tgsja_impl393     static std::ptrdiff_t invoke( const char jobu, const char jobv,
394             const char jobq, const fortran_int_t k,
395             const fortran_int_t l, MatrixA& a, MatrixB& b,
396             const real_type tola, const real_type tolb, VectorALPHA& alpha,
397             VectorBETA& beta, MatrixU& u, MatrixV& v, MatrixQ& q,
398             fortran_int_t& ncycle, minimal_workspace ) {
399         namespace bindings = ::boost::numeric::bindings;
400         bindings::detail::array< value_type > tmp_work( min_size_work(
401                 bindings::size_column(a) ) );
402         return invoke( jobu, jobv, jobq, k, l, a, b, tola, tolb, alpha, beta,
403                 u, v, q, ncycle, workspace( tmp_work ) );
404     }
405 
406     //
407     // Static member function that
408     // * Figures out the optimal workspace requirements, and passes
409     //   the results to the user-defined workspace overload of the
410     //   invoke static member
411     // * Enables the blocked algorithm (BLAS level 3)
412     //
413     template< typename MatrixA, typename MatrixB, typename VectorALPHA,
414             typename VectorBETA, typename MatrixU, typename MatrixV,
415             typename MatrixQ >
invokeboost::numeric::bindings::lapack::tgsja_impl416     static std::ptrdiff_t invoke( const char jobu, const char jobv,
417             const char jobq, const fortran_int_t k,
418             const fortran_int_t l, MatrixA& a, MatrixB& b,
419             const real_type tola, const real_type tolb, VectorALPHA& alpha,
420             VectorBETA& beta, MatrixU& u, MatrixV& v, MatrixQ& q,
421             fortran_int_t& ncycle, optimal_workspace ) {
422         namespace bindings = ::boost::numeric::bindings;
423         return invoke( jobu, jobv, jobq, k, l, a, b, tola, tolb, alpha, beta,
424                 u, v, q, ncycle, minimal_workspace() );
425     }
426 
427     //
428     // Static member function that returns the minimum size of
429     // workspace-array work.
430     //
min_size_workboost::numeric::bindings::lapack::tgsja_impl431     static std::ptrdiff_t min_size_work( const std::ptrdiff_t n ) {
432         return 2*n;
433     }
434 };
435 
436 
437 //
438 // Functions for direct use. These functions are overloaded for temporaries,
439 // so that wrapped types can still be passed and used for write-access. In
440 // addition, if applicable, they are overloaded for user-defined workspaces.
441 // Calls to these functions are passed to the tgsja_impl classes. In the
442 // documentation, most overloads are collapsed to avoid a large number of
443 // prototypes which are very similar.
444 //
445 
446 //
447 // Overloaded function for tgsja. Its overload differs for
448 // * User-defined workspace
449 //
450 template< typename MatrixA, typename MatrixB, typename VectorALPHA,
451         typename VectorBETA, typename MatrixU, typename MatrixV,
452         typename MatrixQ, typename Workspace >
453 inline typename boost::enable_if< detail::is_workspace< Workspace >,
454         std::ptrdiff_t >::type
tgsja(const char jobu,const char jobv,const char jobq,const fortran_int_t k,const fortran_int_t l,MatrixA & a,MatrixB & b,const typename remove_imaginary<typename bindings::value_type<MatrixA>::type>::type tola,const typename remove_imaginary<typename bindings::value_type<MatrixA>::type>::type tolb,VectorALPHA & alpha,VectorBETA & beta,MatrixU & u,MatrixV & v,MatrixQ & q,fortran_int_t & ncycle,Workspace work)455 tgsja( const char jobu, const char jobv, const char jobq,
456         const fortran_int_t k, const fortran_int_t l, MatrixA& a,
457         MatrixB& b, const typename remove_imaginary<
458         typename bindings::value_type< MatrixA >::type >::type tola,
459         const typename remove_imaginary< typename bindings::value_type<
460         MatrixA >::type >::type tolb, VectorALPHA& alpha, VectorBETA& beta,
461         MatrixU& u, MatrixV& v, MatrixQ& q, fortran_int_t& ncycle,
462         Workspace work ) {
463     return tgsja_impl< typename bindings::value_type<
464             MatrixA >::type >::invoke( jobu, jobv, jobq, k, l, a, b, tola,
465             tolb, alpha, beta, u, v, q, ncycle, work );
466 }
467 
468 //
469 // Overloaded function for tgsja. Its overload differs for
470 // * Default workspace-type (optimal)
471 //
472 template< typename MatrixA, typename MatrixB, typename VectorALPHA,
473         typename VectorBETA, typename MatrixU, typename MatrixV,
474         typename MatrixQ >
475 inline typename boost::disable_if< detail::is_workspace< MatrixQ >,
476         std::ptrdiff_t >::type
tgsja(const char jobu,const char jobv,const char jobq,const fortran_int_t k,const fortran_int_t l,MatrixA & a,MatrixB & b,const typename remove_imaginary<typename bindings::value_type<MatrixA>::type>::type tola,const typename remove_imaginary<typename bindings::value_type<MatrixA>::type>::type tolb,VectorALPHA & alpha,VectorBETA & beta,MatrixU & u,MatrixV & v,MatrixQ & q,fortran_int_t & ncycle)477 tgsja( const char jobu, const char jobv, const char jobq,
478         const fortran_int_t k, const fortran_int_t l, MatrixA& a,
479         MatrixB& b, const typename remove_imaginary<
480         typename bindings::value_type< MatrixA >::type >::type tola,
481         const typename remove_imaginary< typename bindings::value_type<
482         MatrixA >::type >::type tolb, VectorALPHA& alpha, VectorBETA& beta,
483         MatrixU& u, MatrixV& v, MatrixQ& q, fortran_int_t& ncycle ) {
484     return tgsja_impl< typename bindings::value_type<
485             MatrixA >::type >::invoke( jobu, jobv, jobq, k, l, a, b, tola,
486             tolb, alpha, beta, u, v, q, ncycle, optimal_workspace() );
487 }
488 
489 } // namespace lapack
490 } // namespace bindings
491 } // namespace numeric
492 } // namespace boost
493 
494 #endif
495