]> https://gitweb.dealii.org/ - dealii.git/commitdiff
LAPACKFullMatrix::add() uses BLAS routine 5934/head
authorBenjamin Brands <benjamin.brands@fau.de>
Tue, 20 Feb 2018 18:41:24 +0000 (19:41 +0100)
committerBenjamin Brands <benjamin.brands@fau.de>
Tue, 20 Feb 2018 18:57:40 +0000 (19:57 +0100)
doc/news/changes/minor/20180220BenjaminBrands [new file with mode: 0644]
include/deal.II/lac/lapack_templates.h
source/lac/lapack_full_matrix.cc

diff --git a/doc/news/changes/minor/20180220BenjaminBrands b/doc/news/changes/minor/20180220BenjaminBrands
new file mode 100644 (file)
index 0000000..e5d0989
--- /dev/null
@@ -0,0 +1,4 @@
+New: LAPACKFullMatrix: make operators *= and /= use Lapack function,
+LAPACKFullMatrix::add() uses BLAS 1 routine instead of handwritten loops
+<br>
+(Benjamin Brands, 2018/02/20)
index 9e62ea97a2e6b5648019db39ed1c5cae7e6d24e2..d0491cef2f07770b26e690fb97cb59f1ed0ee6cc 100644 (file)
@@ -317,25 +317,25 @@ extern "C"
               float *A, const dealii::types::blas_int *lda);
 // Multiply rectangular mxn real matrix by real scalar CTO/CFROM
   void dlascl_(const char *type,
-               const int *kl,
-               const int *ku,
+               const dealii::types::blas_int *kl,
+               const dealii::types::blas_int *ku,
                const double *cfrom,
                const double *cto,
-               const int *m,
-               const int *n,
+               const dealii::types::blas_int *m,
+               const dealii::types::blas_int *n,
                double *A,
-               const int *lda,
-               int *info);
+               const dealii::types::blas_int *lda,
+               dealii::types::blas_int *info);
   void slascl_(const char *type,
-               const int *kl,
-               const int *ku,
+               const dealii::types::blas_int *kl,
+               const dealii::types::blas_int *ku,
                const float *cfrom,
                const float *cto,
-               const int *m,
-               const int *n,
+               const dealii::types::blas_int *m,
+               const dealii::types::blas_int *n,
                float *A,
-               const int *lda,
-               int *info);
+               const dealii::types::blas_int *lda,
+               dealii::types::blas_int *info);
 }
 
 DEAL_II_NAMESPACE_OPEN
index 8e71fd8d33b2e95cf3806bb15a8cd4a449b37e52..cd23a761cd0dd59ca68e9e2511765c0a2f20154c 100644 (file)
@@ -195,12 +195,13 @@ LAPACKFullMatrix<number>::operator*= (const number factor)
   const types::blas_int n = this->n();
   const types::blas_int lda = this->m();
   types::blas_int info;
-  // kl and ku will not be referenced for type = G (dense matrices)
+  // kl and ku will not be referenced for type = G (dense matrices).
   const types::blas_int kl=0;
   number *values = &this->values[0];
 
   lascl(&type,&kl,&kl,&cfrom,&factor,&m,&n,values,&lda,&info);
 
+  // Negative return value implies a wrong argument. This should be internal.
   Assert(info >= 0, ExcInternalError());
 
   return *this;
@@ -224,12 +225,13 @@ LAPACKFullMatrix<number>::operator/= (const number factor)
   const types::blas_int n = this->n();
   const types::blas_int lda = this->m();
   types::blas_int info;
-  // kl and ku will not be referenced for type = G (dense matrices)
+  // kl and ku will not be referenced for type = G (dense matrices).
   const types::blas_int kl=0;
   number *values = &this->values[0];
 
   lascl(&type,&kl,&kl,&factor,&cto,&m,&n,values,&lda,&info);
 
+  // Negative return value implies a wrong argument. This should be internal.
   Assert(info >= 0, ExcInternalError());
 
   return *this;
@@ -239,7 +241,7 @@ LAPACKFullMatrix<number>::operator/= (const number factor)
 
 template <typename number>
 void
-LAPACKFullMatrix<number>::add (const number              a,
+LAPACKFullMatrix<number>::add (const number a,
                                const LAPACKFullMatrix<number> &A)
 {
   Assert(state == LAPACKSupport::matrix ||
@@ -251,9 +253,15 @@ LAPACKFullMatrix<number>::add (const number              a,
 
   AssertIsFinite(a);
 
-  for (size_type i=0; i<m(); ++i)
-    for (size_type j=0; j<n(); ++j)
-      (*this)(i,j) += a * A(i,j);
+  // BLAS does not offer functions to add matrices.
+  // LapackFullMatrix is stored in contiguous array
+  // ==> use BLAS 1 for adding vectors
+  const types::blas_int n = this->m() * this->n();
+  const types::blas_int inc=1;
+  number *values = &this->values[0];
+  const number *values_A = &A.values[0];
+
+  axpy(&n,&a,values_A,&inc,values,&inc);
 }
 
 

In the beginning the Universe was created. This has made a lot of people very angry and has been widely regarded as a bad move.

Douglas Adams


Typeset in Trocchi and Trocchi Bold Sans Serif.