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