]> https://gitweb.dealii.org/ - dealii.git/commitdiff
various cleanups and improvements
authorDenis Davydov <davydden@gmail.com>
Mon, 18 Dec 2017 21:53:55 +0000 (22:53 +0100)
committerDenis Davydov <davydden@gmail.com>
Tue, 19 Dec 2017 14:48:16 +0000 (15:48 +0100)
17 files changed:
doc/news/changes/minor/20171216DenisDavydov
doc/news/changes/minor/20171217DenisDavydov
include/deal.II/lac/lapack_full_matrix.h
include/deal.II/lac/utilities.h
include/deal.II/lac/vector.h
include/deal.II/lac/vector.templates.h
source/lac/lapack_full_matrix.cc
tests/lac/utilities_04.cc
tests/lac/utilities_04.output
tests/lac/utilities_05.cc
tests/lac/utilities_05.output
tests/lapack/full_matrix_26.cc
tests/lapack/full_matrix_27.cc
tests/lapack/full_matrix_27.output
tests/lapack/full_matrix_28.cc
tests/lapack/full_matrix_29.cc
tests/vector/vector_58.cc

index abfcd93b8e58297f288abf62cadeb99ebce3cc93..7ef45c916e13c83c553101cd24275c42955cbc6f 100644 (file)
@@ -1,4 +1,4 @@
-New: Add Vector::reinit_preserve() and LAPACKFullMatrix::reinit_preserve()
+New: Add Vector::grow_or_shrink() and LAPACKFullMatrix::grow_or_shrink()
 to (partly) keep the previous values upon resizing.
 <br>
 (Denis Davydov, 2017/12/16)
index b08111702d4d9aeae8ffd2f801e01ca1deca1ccb..b1b8ab4c53cf9aa5ae1827bfa9996ac49edfcab0 100644 (file)
@@ -1,4 +1,4 @@
-New: LAPACKFullMatrix::add(const number, const Vector<number> &) performs
+New: LAPACKFullMatrix::rank1_update(const number, const Vector<number> &) performs
 a rank-1 update of a matrix.
 <br>
 (Denis Davydov, 2017/12/17)
index 0479b3ba0c11ad65a5fe67cb33a9f252b88b7440..32cff484043d43826849555a4a764f0202c7dc8a 100644 (file)
@@ -145,13 +145,16 @@ public:
    * Perform a rank-1 update of a symmetric matrix
    * $ A \leftarrow A + a \, \rm v \rm v^T $.
    *
-   * This function also works for Cholesky factorization. Updating ($a>0$) is
+   * This function also works for Cholesky factorization.
+   * In that case, updating ($a>0$) is
    * performed via Givens rotations, whereas downdating ($a<0$) via hyperbolic
-   * rotations. Note that the later case might lead to a negative definite
-   * matrix in which case the error will be thrown.
+   * rotations. Note that the latter case might lead to a negative definite
+   * matrix in which case the error will be thrown (because Cholesky
+   * factorizations are only valid for symmetric and positive definite
+   * matrices).
    */
-  void add(const number a,
-           const Vector<number> &v);
+  void rank1_update(const number a,
+                    const Vector<number> &v);
 
   /**
    * Assignment from different matrix classes, performing the usual conversion
@@ -185,16 +188,16 @@ public:
    * Whereas if the new size is smaller, the matrix will contain the upper left block
    * of the original one
    * \f[
-   * \mathbf A_{11} \leftarrow
    * \left(
    * \begin{array}{cc}
    * \mathbf A_{11} & \mathbf A_{12} \\
    * \mathbf A_{21} & \mathbf A_{22}
    * \end{array}
+   * \rightarrow \mathbf A_{11}
    * \right)
    * \f]
    */
-  void reinit_preserve (const size_type size);
+  void grow_or_shrink (const size_type size);
 
   /**
    * Regenerate the current matrix by one that has the same properties as if
index b1c56f5bf4929173a89846fccd84fcec20651431..352d00ad72e5f122be29c32fa720f9993eef6ca9 100644 (file)
@@ -37,7 +37,8 @@ namespace Utilities
   {
 
     /**
-     * Return elements of continuous Givens rotation matrix and norm of the input vector.
+     * Return the elements of a continuous Givens rotation matrix and
+     * the norm of the input vector.
      *
      * That is for a given
      * pair @p x and @p y, return $c$ , $s$ and $\sqrt{x^2+y^2}$ such that
@@ -66,7 +67,7 @@ namespace Utilities
                                              const NumberType &y);
 
     /**
-     * Return elements of hyperbolic rotation matrix.
+     * Return the elements of a hyperbolic rotation matrix.
      *
      * That is for a given
      * pair @p x and @p y, return $c$ , $s$ and $r$ such that
@@ -209,6 +210,17 @@ namespace Utilities
   namespace LinearAlgebra
   {
 
+    template<typename NumberType>
+    std::array<std::complex<NumberType>,3> hyperbolic_rotation(const std::complex<NumberType> &f,
+                                                               const std::complex<NumberType> &g)
+    {
+      AssertThrow(false, ExcNotImplemented());
+      std::array<NumberType,3> res;
+      return res;
+    }
+
+
+
     template<typename NumberType>
     std::array<NumberType,3> hyperbolic_rotation(const NumberType &f,
                                                  const NumberType &g)
@@ -229,14 +241,6 @@ namespace Utilities
       return csr;
     }
 
-    template<typename NumberType>
-    std::array<std::complex<NumberType>,3> hyperbolic_rotation(const std::complex<NumberType> &f,
-                                                               const std::complex<NumberType> &g)
-    {
-      AssertThrow(false, ExcNotImplemented());
-      std::array<NumberType,3> res;
-      return res;
-    }
 
 
     template<typename NumberType>
@@ -248,19 +252,24 @@ namespace Utilities
       return res;
     }
 
+
+
     template<typename NumberType>
     std::array<NumberType,3> Givens_rotation(const NumberType &f,
                                              const NumberType &g)
     {
       std::array<NumberType,3> res;
-      // naieve calculation for "r" may overflow or underflow:
+      // naive calculation for "r" may overflow or underflow:
       // c =  x / \sqrt{x^2+y^2}
       // s = -y / \sqrt{x^2+y^2}
 
       // See Golub 2013, Matrix computations, Chapter 5.1.8
       // Algorithm 5.1.3
       // and
-      // Anderson (2000), Discontinuous Plane Rotations and the Symmetric Eigenvalue Problem. LAPACK Working Note 150, University of Tennessee, UT-CS-00-454, December 4, 2000.
+      // Anderson (2000),
+      // Discontinuous Plane Rotations and the Symmetric Eigenvalue Problem.
+      // LAPACK Working Note 150, University of Tennessee, UT-CS-00-454,
+      // December 4, 2000.
       // Algorithm 4
       // We implement the latter below:
       if (g == NumberType())
index eba1f004d8003e2166327981d63f5ed1ed97e935..23172d60676a05def79754d19b6c952e152eade3 100644 (file)
@@ -272,17 +272,16 @@ public:
    * \f]
    * whereas if the desired size is smaller, then
    * \f[
-   * \mathbf V_1 \leftarrow
    * \left(
    * \begin{array}{c}
    * \mathbf V_1   \\
    * \mathbf V_2
    * \end{array}
    * \right)
+   * \rightarrow \mathbf V_1
    * \f]
    */
-  void reinit_preserve (const size_type N);
-
+  void grow_or_shrink (const size_type N);
 
   /**
    * Change the dimension to that of the vector @p V. The same applies as for
index 2a1c83a2fa062e88fd2955aa2c69fbcca9a100b0..04b03b18d9edcdf403719b4571c2e9c3f3f887cc 100644 (file)
@@ -291,7 +291,7 @@ void Vector<Number>::reinit (const size_type n,
 
 template <typename Number>
 inline
-void Vector<Number>::reinit_preserve (const size_type n)
+void Vector<Number>::grow_or_shrink (const size_type n)
 {
   if (n==0)
     {
index 5645f64f4e9717c49f18eea05f97feb041c68742..f94cbbeee20ad0002cde7ae2ee6f50e97e98bde3 100644 (file)
@@ -83,7 +83,7 @@ LAPACKFullMatrix<number>::reinit (const size_type n)
 
 template <typename number>
 void
-LAPACKFullMatrix<number>::reinit_preserve (const size_type n)
+LAPACKFullMatrix<number>::grow_or_shrink (const size_type n)
 {
   TransposeTable<number> copy(*this);
   const size_type s = std::min(std::min(this->m(), n), this->n());
@@ -91,8 +91,6 @@ LAPACKFullMatrix<number>::reinit_preserve (const size_type n)
   for (unsigned int i = 0; i < s; ++i)
     for (unsigned int j = 0; j < s; ++j)
       (*this)(i,j) = copy(i,j);
-
-  state = LAPACKSupport::matrix;
 }
 
 
@@ -305,10 +303,11 @@ namespace
 }
 
 
+
 template <typename number>
 void
-LAPACKFullMatrix<number>::add(const number a,
-                              const Vector<number> &v)
+LAPACKFullMatrix<number>::rank1_update(const number a,
+                                       const Vector<number> &v)
 {
   Assert(property == LAPACKSupport::symmetric,
          ExcProperty(property));
@@ -344,7 +343,6 @@ LAPACKFullMatrix<number>::add(const number a,
 
 
 
-
 template <typename number>
 void
 LAPACKFullMatrix<number>::vmult (
index bdff2d07fa454f78292c9008d44bc94ab431412b..078658c9c4f43dd461e598ff2b07db37c890786c 100644 (file)
@@ -46,7 +46,7 @@ void test (const NumberType a, const NumberType b)
   const double norm = res.l2_norm();
   deallog << norm << std::endl;
 
-  if (norm > 1e-12)
+  if (norm > 1e-12 || csr[2] < 0.)
     {
       deallog << "x:" << std::endl;
       x.print(deallog.get_file_stream());
@@ -67,10 +67,21 @@ int main()
   deallog << std::setprecision(6);
   deallog.attach(logfile);
 
-  test<double>(1., 0.);
-  test<double>(0., 1.);
-  test<double>(1., -2.);
-  test<double>(-1., 2.);
-  test<double>(-15.,3.);
-  test<double>(15.,-3.);
+  deallog << "Residuals:"<< std::endl;
+  // g==0
+  test<double>( 3.,  0.);
+  test<double>(-2.,  0.);
+  // f==0
+  test<double>( 0.,  2.);
+  test<double>( 0., -5.);
+  // |f| > |g|
+  test<double>( 15., 3.);
+  test<double>( 15.,-4.);
+  test<double>(-17., 2.);
+  test<double>(-18.,-5.);
+  // |f| < |g|
+  test<double>( 2., -4.);
+  test<double>(-2.,  3.);
+  test<double>(-3., -7.);
+  test<double>( 5.,  9.);
 }
index 687ddbebbcba437cb4bf5c5863ee97cb53cf73e9..2a9b0035fe336f58119b66594569fdf205c1fb6c 100644 (file)
@@ -1,4 +1,11 @@
 
+DEAL::Residuals:
+DEAL::0.00000
+DEAL::0.00000
+DEAL::0.00000
+DEAL::0.00000
+DEAL::0.00000
+DEAL::0.00000
 DEAL::0.00000
 DEAL::0.00000
 DEAL::0.00000
index 92839492afe6a1040a69ad535929e11e8b678d4e..88a31ebb6dfb5d1644d146ade34ab44bb47c5022 100644 (file)
@@ -46,7 +46,7 @@ void test (const NumberType a, const NumberType b)
   const NumberType norm = res.l2_norm();
   deallog << norm << std::endl;
 
-  if (norm > 1e-12)
+  if (norm > 1e-12 || csr[2] < 0.)
     {
       deallog << "x:" << std::endl;
       x.print(deallog.get_file_stream());
@@ -67,9 +67,10 @@ int main()
   deallog << std::setprecision(6);
   deallog.attach(logfile);
 
-  // check all combinations with real solutions:
-  test<double>( 1.,  0.);  // g == 0
-  test<double>( 2.,  1.);  // both positive
+  deallog << "Residuals:"<< std::endl;
+  // check all combinations with real solutions: |f| > |g|
+  test<double>( 3.,  0.);  // g == 0
+  test<double>( 2.,  1.5); // both positive
   test<double>( 3., -0.5); // g negative
   test<double>(-4., -2.4); // both negative
   test<double>(-5.,  2);   // f negative
index 1f17d1a21be67bf3a0f25f08ea9c88e58d0e3765..35a82f964eaed889a1583a0d6eb2c8b117664210 100644 (file)
@@ -1,4 +1,5 @@
 
+DEAL::Residuals:
 DEAL::0.00000
 DEAL::0.00000
 DEAL::0.00000
index 5bf75008f55677a1c342144cb0ce079d47ab985a..62067264d48cc88f2acfd8499e6680ed42e04214 100644 (file)
@@ -14,7 +14,7 @@
 // ---------------------------------------------------------------------
 
 
-// Tests reinitialization of square and rectangle LAPACKFullMatrix
+// Tests grow_or_shrink() of square and rectangle LAPACKFullMatrix
 
 #include "../tests.h"
 #include <deal.II/lac/lapack_full_matrix.h>
@@ -38,13 +38,13 @@ void test (const unsigned int size)
 
   LAPACKFullMatrix<double> M1(M), M2(M);
 
-  M1.reinit_preserve(smaller);
+  M1.grow_or_shrink(smaller);
   for (unsigned int i = 0; i < smaller; ++i)
     for (unsigned int j = 0; j < smaller; ++j)
       AssertThrow(M1(i,j) == M(i,j),
                   ExcInternalError());
 
-  M2.reinit_preserve(larger);
+  M2.grow_or_shrink(larger);
   for (unsigned int i = 0; i < larger; ++i)
     for (unsigned int j = 0; j < larger; ++j)
       {
index ce9d7aab7bc04d1aafb38554160675239fce3b85..64e62d469bbf1e883cbcce8a8518a355061c300b 100644 (file)
@@ -1,6 +1,6 @@
 // ---------------------------------------------------------------------
 //
-// Copyright (C) 2005 - 2015 by the deal.II authors
+// Copyright (C) 2017 by the deal.II authors
 //
 // This file is part of the deal.II library.
 //
@@ -14,7 +14,7 @@
 // ---------------------------------------------------------------------
 
 
-// test LAPACKFullMatrix::add() for rank1 update of a matrix
+// test LAPACKFullMatrix::rank1_update() for rank1 update of a matrix
 
 #include "../tests.h"
 #include "create_matrix.h"
@@ -50,7 +50,7 @@ test(const unsigned int size)
   LAPACKFullMatrix<NumberType> B(size);
   B = A;
 
-  B.add(a, v);
+  B.rank1_update(a, v);
 
   for (unsigned int i = 0; i < size; ++i)
     for (unsigned int j = 0; j < size; ++j)
@@ -60,7 +60,7 @@ test(const unsigned int size)
                     ExcMessage("diff="+ std::to_string(diff)));
       }
 
-  deallog << "Ok" << std::endl;
+  deallog << "OK" << std::endl;
 }
 
 
index 2f2ffd5b6704217981e5e10d7bd73bebbf0b40e7..cee1d11396d578f74a5f67c4c50f723fe40b321a 100644 (file)
@@ -1,7 +1,7 @@
 
 DEAL::size=17
-DEAL::Ok
+DEAL::OK
 DEAL::size=35
-DEAL::Ok
+DEAL::OK
 DEAL::size=391
-DEAL::Ok
+DEAL::OK
index 4ddba3ce3759a4fa17cbedf892ecc135edd10e00..643872b3c2615b1772331697024770cb5bd39d33 100644 (file)
@@ -14,7 +14,7 @@
 // ---------------------------------------------------------------------
 
 
-// test LAPACKFullMatrix::add() for rank1 update of a Cholesky factorization
+// test LAPACKFullMatrix::rank1_update() for rank1 update of a Cholesky factorization
 
 /* MWE in Octave:
 A = pascal(4)
@@ -92,7 +92,7 @@ test()
   deallog << "Cholesky:" << std::endl;
   A.print_formatted(deallog.get_file_stream(),5);
 
-  A.add(a,v);
+  A.rank1_update(a,v);
 
   deallog << "Cholesky updated:" << std::endl;
   A.print_formatted(deallog.get_file_stream(),5);
index f7569b6947db9103eecfbf24bc7f2e4c5616a5c6..912cea1031ab29769459fbe3ef06fc293ca22e83 100644 (file)
@@ -14,7 +14,7 @@
 // ---------------------------------------------------------------------
 
 
-// test LAPACKFullMatrix::add() for rank1 downdate of a Cholesky factorization
+// test LAPACKFullMatrix::rank1_update() for rank1 downdate of a Cholesky factorization
 
 /* MWE in Octave:
 A = pascal(4)
@@ -103,14 +103,14 @@ test()
   deallog << "Cholesky:" << std::endl;
   A.print_formatted(deallog.get_file_stream(),5);
 
-  A.add(a,v);
+  A.rank1_update(a,v);
 
   deallog << "Cholesky updated:" << std::endl;
   A.print_formatted(deallog.get_file_stream(),5);
 
   v /= 2.;
 
-  A.add(-1.,v);
+  A.rank1_update(-1.,v);
 
   deallog << "Cholesky downdated:" << std::endl;
   A.print_formatted(deallog.get_file_stream(),5);
index 76fbb63ae9513135c8e8c864a26796747746f65c..7967399d81e9c500aa925dc15623cc3b990e95b5 100644 (file)
@@ -47,7 +47,7 @@ void test (const std::vector<unsigned int> &size_sequence)
       else
         {
           const unsigned int check_s = (s > v.size() ? v.size() : s);
-          v.reinit_preserve(s);
+          v.grow_or_shrink(s);
           for (unsigned int i = 0; i < check_s; ++i)
             AssertThrow(v(i) == v_old(i),
                         ExcMessage("s=" + std::to_string(s) + " i=" + std::to_string(i) + " " +

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.