$include_dir="/home/hyper-archives/boost-commit/include"; include("$include_dir/msg-header.inc") ?>
Subject: [Boost-commit] svn:boost r50057 - in sandbox/boost/numeric/bindings: lapack traits
From: thomas.klimpel_at_[hidden]
Date: 2008-12-01 16:44:23
Author: klimpel
Date: 2008-12-01 16:44:22 EST (Mon, 01 Dec 2008)
New Revision: 50057
URL: http://svn.boost.org/trac/boost/changeset/50057
Log:
added Vardan Akopian's bindings for gbtrf / gbtrs
Added:
   sandbox/boost/numeric/bindings/lapack/gbsv.hpp   (contents, props changed)
Text files modified: 
   sandbox/boost/numeric/bindings/lapack/hbev.hpp         |     1 -                                       
   sandbox/boost/numeric/bindings/lapack/hbevx.hpp        |     1 -                                       
   sandbox/boost/numeric/bindings/lapack/lapack.h         |    17 ++++++++++++++++-                       
   sandbox/boost/numeric/bindings/lapack/lapack_names.h   |     6 ++++++                                  
   sandbox/boost/numeric/bindings/traits/ublas_banded.hpp |     4 ++--                                    
   5 files changed, 24 insertions(+), 5 deletions(-)
Added: sandbox/boost/numeric/bindings/lapack/gbsv.hpp
==============================================================================
--- (empty file)
+++ sandbox/boost/numeric/bindings/lapack/gbsv.hpp	2008-12-01 16:44:22 EST (Mon, 01 Dec 2008)
@@ -0,0 +1,174 @@
+//
+// Copyright Vardan Akopian 2007
+//
+// Distributed under the Boost Software License, Version 1.0.
+// (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_GBSV_HPP
+#define BOOST_NUMERIC_BINDINGS_LAPACK_GBSV_HPP
+
+#include <boost/numeric/bindings/traits/traits.hpp>
+#include <boost/numeric/bindings/traits/type_traits.hpp>
+#include <boost/numeric/bindings/lapack/lapack.h>
+
+
+#ifndef BOOST_NUMERIC_BINDINGS_NO_STRUCTURE_CHECK 
+#  include <boost/static_assert.hpp>
+#  include <boost/type_traits/is_same.hpp>
+#endif 
+
+
+namespace boost { namespace numeric { namespace bindings { 
+
+  namespace lapack {
+
+
+    namespace detail {
+      inline
+      void gbtrf (int const n, int const m, int const kl, int const ku,
+                  float* ab, int const ldab, int* ipiv, int* info) 
+      {
+        LAPACK_SGBTRF (&n, &m, &kl, &ku, ab, &ldab, ipiv, info);
+      }
+      inline
+      void gbtrf (int const n, int const m, int const kl, int const ku,
+                  double* ab, int const ldab, int* ipiv, int* info) 
+      {
+        LAPACK_DGBTRF (&n, &m, &kl, &ku, ab, &ldab, ipiv, info);
+      }
+      inline
+      void gbtrf (int const n, int const m, int const kl, int const ku,
+                  traits::complex_f* ab, int const ldab, int* ipiv, int* info) 
+      {
+        LAPACK_CGBTRF (&n, &m, &kl, &ku, traits::complex_ptr(ab), &ldab, ipiv, info);
+      }
+      inline
+      void gbtrf (int const n, int const m, int const kl, int const ku,
+                  traits::complex_d* ab, int const ldab, int* ipiv, int* info) 
+      {
+        LAPACK_ZGBTRF (&n, &m, &kl, &ku, traits::complex_ptr(ab), &ldab, ipiv, info);
+      }
+    }
+
+    template <typename MatrA, typename IVec>
+    inline
+    int gbtrf (MatrA& a, IVec& ipiv) {
+
+#ifndef BOOST_NUMERIC_BINDINGS_NO_STRUCTURE_CHECK 
+      BOOST_STATIC_ASSERT((boost::is_same<
+        typename traits::matrix_traits<MatrA>::matrix_structure, 
+        traits::banded_t
+      >::value)); 
+      BOOST_STATIC_ASSERT((boost::is_same<
+        typename traits::matrix_traits<MatrA>::ordering_type, 
+        traits::row_major_t
+      >::value)); 
+#endif 
+
+      int const n = traits::matrix_size1 (a);
+      int const m = traits::matrix_size2 (a); 
+      assert (traits::vector_size (ipiv) == (m < n ? m : n));
+
+      // if the matrix has kl lower and ku upper diagonals, then we should have
+      // allocated kl lower and kl+ku upper diagonals
+      int const kl = traits::matrix_lower_bandwidth (a);
+      int const ku = traits::matrix_upper_bandwidth (a) - kl;
+      int const ld = traits::leading_dimension (a);
+
+      assert(ku >= 0);
+
+      int info; 
+      detail::gbtrf (n, m, kl, ku,
+                     traits::matrix_storage (a), 
+		     ld,
+                     traits::vector_storage (ipiv),  
+                     &info);
+      return info; 
+    }
+
+
+    namespace detail {
+      inline
+      void gbtrs (char const trans, int const n, int const kl, int const ku, int const m,
+                  float const* ab, int const ldab, int const* ipiv,
+		  float* b, int const ldb, int* info) 
+      {
+        LAPACK_SGBTRS (&trans, &n, &kl, &ku, &m, ab, &ldab, ipiv, b, &ldb, info);
+      }
+      inline
+      void gbtrs (char const trans, int const n, int const kl, int const ku, int const m,
+                  double const* ab, int const ldab, int const* ipiv,
+		  double* b, int const ldb, int* info) 
+      {
+        LAPACK_DGBTRS (&trans, &n, &kl, &ku, &m, ab, &ldab, ipiv, b, &ldb, info);
+      }
+      inline
+      void gbtrs (char const trans, int const n, int const kl, int const ku, int const m,
+                  traits::complex_f const* ab, int const ldab, int const* ipiv,
+		  traits::complex_f* b, int const ldb, int* info) 
+      {
+        LAPACK_CGBTRS (&trans, &n, &kl, &ku, &m, traits::complex_ptr(ab), &ldab, ipiv, traits::complex_ptr(b), &ldb, info);
+      }
+      inline
+      void gbtrs (char const trans, int const n, int const kl, int const ku, int const m,
+                  traits::complex_d const* ab, int const ldab, int const* ipiv,
+		  traits::complex_d* b, int const ldb, int* info) 
+      {
+        LAPACK_ZGBTRS (&trans, &n, &kl, &ku, &m, traits::complex_ptr(ab), &ldab, ipiv, traits::complex_ptr(b), &ldb, info);
+      }
+    }
+
+
+    template <typename MatrA, typename MatrB, typename IVec>
+    inline
+    int gbtrs (char const trans, MatrA const& a, IVec const& ipiv, MatrB& b) 
+    {
+      assert (trans == 'N' || trans == 'T' || trans == 'C'); 
+
+#ifndef BOOST_NUMERIC_BINDINGS_NO_STRUCTURE_CHECK 
+      BOOST_STATIC_ASSERT((boost::is_same<
+        typename traits::matrix_traits<MatrA>::matrix_structure, 
+        traits::banded_t
+      >::value)); 
+#endif 
+
+      int const n = traits::matrix_size1 (a);
+      assert (n == traits::matrix_size2 (a)); 
+      assert (n == traits::matrix_size1 (b)); 
+      assert (n == traits::vector_size (ipiv)); 
+
+      // if the matrix has kl lower and ku upper diagonals, then we should have
+      // allocated kl lower and kl+ku upper diagonals
+      int const kl = traits::matrix_lower_bandwidth (a);
+      int const ku = traits::matrix_upper_bandwidth (a) - kl;
+      int const ld = traits::leading_dimension (a);
+
+      assert(ku >= 0);
+
+      int info; 
+      detail::gbtrs (trans, n, kl, ku, traits::matrix_size2 (b), 
+#ifndef BOOST_NO_FUNCTION_TEMPLATE_ORDERING
+                     traits::matrix_storage (a), 
+#else
+                     traits::matrix_storage_const (a), 
+#endif 
+                     ld,
+#ifndef BOOST_NO_FUNCTION_TEMPLATE_ORDERING
+                     traits::vector_storage (ipiv),  
+#else
+                     traits::vector_storage_const (ipiv),  
+#endif
+                     traits::matrix_storage (b),
+                     traits::leading_dimension (b),
+                     &info);
+      return info; 
+    }
+
+
+  }
+
+}}}
+
+#endif 
Modified: sandbox/boost/numeric/bindings/lapack/hbev.hpp
==============================================================================
--- sandbox/boost/numeric/bindings/lapack/hbev.hpp	(original)
+++ sandbox/boost/numeric/bindings/lapack/hbev.hpp	2008-12-01 16:44:22 EST (Mon, 01 Dec 2008)
@@ -14,7 +14,6 @@
 #ifndef BOOST_NUMERIC_BINDINGS_LAPACK_HBEV_HPP
 #define BOOST_NUMERIC_BINDINGS_LAPACK_HBEV_HPP
 
-#include <boost/numeric/bindings/traits/type.hpp>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
 #include <boost/numeric/bindings/lapack/lapack.h>
Modified: sandbox/boost/numeric/bindings/lapack/hbevx.hpp
==============================================================================
--- sandbox/boost/numeric/bindings/lapack/hbevx.hpp	(original)
+++ sandbox/boost/numeric/bindings/lapack/hbevx.hpp	2008-12-01 16:44:22 EST (Mon, 01 Dec 2008)
@@ -15,7 +15,6 @@
 #ifndef BOOST_NUMERIC_BINDINGS_LAPACK_HBEVX_HPP
 #define BOOST_NUMERIC_BINDINGS_LAPACK_HBEVX_HPP
 
-#include <boost/numeric/bindings/traits/type.hpp>
 #include <boost/numeric/bindings/traits/traits.hpp>
 #include <boost/numeric/bindings/traits/type_traits.hpp>
 #include <boost/numeric/bindings/lapack/lapack.h>
Modified: sandbox/boost/numeric/bindings/lapack/lapack.h
==============================================================================
--- sandbox/boost/numeric/bindings/lapack/lapack.h	(original)
+++ sandbox/boost/numeric/bindings/lapack/lapack.h	2008-12-01 16:44:22 EST (Mon, 01 Dec 2008)
@@ -333,12 +333,27 @@
 
   /* banded */
 
+  void LAPACK_SGBTRF (int const* n, int const* m, int const* kl, int const* ku,
+                      float* ab, int const* ldab, int* ipiv, int* info);
   void LAPACK_DGBTRF (int const* n, int const* m, int const* kl, int const* ku,
                       double* ab, int const* ldab, int* ipiv, int* info);
-
+  void LAPACK_CGBTRF (int const* n, int const* m, int const* kl, int const* ku,
+                      fcomplex_t* ab, int const* ldab, int* ipiv, int* info);
+  void LAPACK_ZGBTRF (int const* n, int const* m, int const* kl, int const* ku,
+                      dcomplex_t* ab, int const* ldab, int* ipiv, int* info);
+
+  void LAPACK_SGBTRS (char const* trans, int const* n, int const* kl, int const* ku, int const* nrhs, 
+                      float const* ab, int const* ldab, int const* ipiv, 
+                      float* b, int const* ldb, int* info);
   void LAPACK_DGBTRS (char const* trans, int const* n, int const* kl, int const* ku, int const* nrhs, 
                       double const* ab, int const* ldab, int const* ipiv, 
                       double* b, int const* ldb, int* info);
+  void LAPACK_CGBTRS (char const* trans, int const* n, int const* kl, int const* ku, int const* nrhs, 
+                      fcomplex_t const* ab, int const* ldab, int const* ipiv, 
+                      fcomplex_t* b, int const* ldb, int* info);
+  void LAPACK_ZGBTRS (char const* trans, int const* n, int const* kl, int const* ku, int const* nrhs, 
+                      dcomplex_t const* ab, int const* ldab, int const* ipiv, 
+                      dcomplex_t* b, int const* ldb, int* info);
 
 
   /**********************************************************************/
Modified: sandbox/boost/numeric/bindings/lapack/lapack_names.h
==============================================================================
--- sandbox/boost/numeric/bindings/lapack/lapack_names.h	(original)
+++ sandbox/boost/numeric/bindings/lapack/lapack_names.h	2008-12-01 16:44:22 EST (Mon, 01 Dec 2008)
@@ -169,8 +169,14 @@
 
 /* banded solve */
 
+#define LAPACK_SGBTRF FORTRAN_ID( sgbtrf )
 #define LAPACK_DGBTRF FORTRAN_ID( dgbtrf )
+#define LAPACK_CGBTRF FORTRAN_ID( cgbtrf )
+#define LAPACK_ZGBTRF FORTRAN_ID( zgbtrf )
+#define LAPACK_SGBTRS FORTRAN_ID( sgbtrs )
 #define LAPACK_DGBTRS FORTRAN_ID( dgbtrs )
+#define LAPACK_CGBTRS FORTRAN_ID( cgbtrs )
+#define LAPACK_ZGBTRS FORTRAN_ID( zgbtrs )
 
 
 /********************************************/
Modified: sandbox/boost/numeric/bindings/traits/ublas_banded.hpp
==============================================================================
--- sandbox/boost/numeric/bindings/traits/ublas_banded.hpp	(original)
+++ sandbox/boost/numeric/bindings/traits/ublas_banded.hpp	2008-12-01 16:44:22 EST (Mon, 01 Dec 2008)
@@ -65,8 +65,8 @@
       typedef typename detail::generate_const<M,ArrT>::type array_type ;
       return vector_traits<array_type>::storage (m.data()); 
     }
-    static std::ptrdiff_t size1 (matrix_type& m) { return m.size1(); } 
-    static std::ptrdiff_t size2 (matrix_type& m) { return m.size2(); }
+    static std::ptrdiff_t num_rows (matrix_type& m) { return m.size1(); } 
+    static std::ptrdiff_t num_columns (matrix_type& m) { return m.size2(); }
     static std::ptrdiff_t lower_bandwidth (matrix_type& m) { return m.lower() ; }
     static std::ptrdiff_t upper_bandwidth (matrix_type& m) { return m.upper() ; }
     static std::ptrdiff_t storage_size (matrix_type& m) { return size1 (m) * size2 (m); }