]> https://gitweb.dealii.org/ - dealii.git/commitdiff
Added separator to Matrix::print_formatted(). 16138/head
authorMarc Fehling <mafehling.git@gmail.com>
Fri, 13 Oct 2023 22:03:10 +0000 (16:03 -0600)
committerMarc Fehling <mafehling.git@gmail.com>
Sun, 15 Oct 2023 21:05:15 +0000 (15:05 -0600)
14 files changed:
doc/news/changes/minor/20231015Fehling [new file with mode: 0644]
include/deal.II/lac/block_sparse_matrix.h
include/deal.II/lac/block_sparse_matrix.templates.h
include/deal.II/lac/chunk_sparse_matrix.h
include/deal.II/lac/chunk_sparse_matrix.templates.h
include/deal.II/lac/cuda_sparse_matrix.h
include/deal.II/lac/full_matrix.h
include/deal.II/lac/full_matrix.templates.h
include/deal.II/lac/lapack_full_matrix.h
include/deal.II/lac/sparse_matrix.h
include/deal.II/lac/sparse_matrix.templates.h
include/deal.II/lac/sparse_matrix_ez.h
include/deal.II/lac/sparse_matrix_ez.templates.h
source/lac/lapack_full_matrix.cc

diff --git a/doc/news/changes/minor/20231015Fehling b/doc/news/changes/minor/20231015Fehling
new file mode 100644 (file)
index 0000000..e5bd7f7
--- /dev/null
@@ -0,0 +1,7 @@
+New: The print_formatted() functions of the following matrix classes
+now offer the option to specify a string that separates row entries:
+<br>
+SparseMatrixEZ, SparseMatrix, LAPACKFullMatrix, FullMatrix,
+ChunkSparseMatrix, BlockSparseMatrix, CUDAWrappers::SparseMatrix
+<br>
+(Marc Fehling, 2023/10/15)
index 88d086e35333394f9d8a601867cae76751b77b41..cd06f2e71f911031716a7adfb685b42c440483ba 100644 (file)
@@ -320,23 +320,25 @@ public:
    */
   /** @{ */
   /**
-   * Print the matrix in the usual format, i.e. as a matrix and not as a list
+   * Print the matrix in the usual format, i.e., as a matrix and not as a list
    * of nonzero elements. For better readability, elements not in the matrix
    * are displayed as empty space, while matrix elements which are explicitly
    * set to zero are displayed as such.
    *
    * The parameters allow for a flexible setting of the output format:
-   * <tt>precision</tt> and <tt>scientific</tt> are used to determine the
-   * number format, where <tt>scientific = false</tt> means fixed point
-   * notation.  A zero entry for <tt>width</tt> makes the function compute a
-   * width, but it may be changed to a positive value, if output is crude.
+   * @p precision and @p scientific are used to determine the number format,
+   * where <code>scientific = false</code> means fixed point notation. A zero
+   * entry for @p width makes the function compute a width, but it may be
+   * changed to a positive value, if output is crude.
    *
-   * Additionally, a character for an empty value may be specified.
+   * Additionally, a character for an empty value may be specified in
+   * @p zero_string, and a character to separate row entries can be set in
+   * @p separator.
    *
-   * Finally, the whole matrix can be multiplied with a common denominator to
-   * produce more readable output, even integers.
+   * Finally, the whole matrix can be multiplied with a common @p denominator
+   * to produce more readable output, even integers.
    *
-   * @attention This function may produce <b>large</b> amounts of output if
+   * @attention This function may produce @em large amounts of output if
    * applied to a large matrix!
    */
   void
@@ -345,7 +347,8 @@ public:
                   const bool         scientific  = true,
                   const unsigned int width       = 0,
                   const char        *zero_string = " ",
-                  const double       denominator = 1.) const;
+                  const double       denominator = 1.,
+                  const char        *separator   = " ") const;
   /** @} */
   /**
    * @addtogroup Exceptions
index 360296de9e9f937293fc5ef7585c40b56731d801..3044e5e61cb09c7a68ae1aac65383aac968e049d 100644 (file)
@@ -178,14 +178,20 @@ BlockSparseMatrix<number>::print_formatted(std::ostream      &out,
                                            const bool         scientific,
                                            const unsigned int width,
                                            const char        *zero_string,
-                                           const double       denominator) const
+                                           const double       denominator,
+                                           const char        *separator) const
 {
   for (size_type r = 0; r < this->n_block_rows(); ++r)
     for (size_type c = 0; c < this->n_block_cols(); ++c)
       {
         out << "Component (" << r << ',' << c << ')' << std::endl;
-        this->block(r, c).print_formatted(
-          out, precision, scientific, width, zero_string, denominator);
+        this->block(r, c).print_formatted(out,
+                                          precision,
+                                          scientific,
+                                          width,
+                                          zero_string,
+                                          denominator,
+                                          separator);
       }
 }
 
index 1ed88219198bd50dfb485670dacc6b486d6606f2..ec7c428cf7b1a0c7e790db165358fb635b30bc74 100644 (file)
@@ -1285,23 +1285,25 @@ public:
   print(std::ostream &out) const;
 
   /**
-   * Print the matrix in the usual format, i.e. as a matrix and not as a list
+   * Print the matrix in the usual format, i.e., as a matrix and not as a list
    * of nonzero elements. For better readability, elements not in the matrix
    * are displayed as empty space, while matrix elements which are explicitly
    * set to zero are displayed as such.
    *
    * The parameters allow for a flexible setting of the output format:
-   * <tt>precision</tt> and <tt>scientific</tt> are used to determine the
-   * number format, where <tt>scientific = false</tt> means fixed point
-   * notation.  A zero entry for <tt>width</tt> makes the function compute a
-   * width, but it may be changed to a positive value, if output is crude.
+   * @p precision and @p scientific are used to determine the number format,
+   * where <code>scientific = false</code> means fixed point notation. A zero
+   * entry for @p width makes the function compute a width, but it may be
+   * changed to a positive value, if output is crude.
    *
-   * Additionally, a character for an empty value may be specified.
+   * Additionally, a character for an empty value may be specified in
+   * @p zero_string, and a character to separate row entries can be set in
+   * @p separator.
    *
-   * Finally, the whole matrix can be multiplied with a common denominator to
-   * produce more readable output, even integers.
+   * Finally, the whole matrix can be multiplied with a common @p denominator
+   * to produce more readable output, even integers.
    *
-   * @attention This function may produce <b>large</b> amounts of output if
+   * @attention This function may produce @em large amounts of output if
    * applied to a large matrix!
    */
   void
@@ -1310,7 +1312,8 @@ public:
                   const bool         scientific  = true,
                   const unsigned int width       = 0,
                   const char        *zero_string = " ",
-                  const double       denominator = 1.) const;
+                  const double       denominator = 1.,
+                  const char        *separator   = " ") const;
 
   /**
    * Print the actual pattern of the matrix. For each entry with an absolute
index 914b131e97b598d126ba8547beedb25103213d1c..2eca5897c5f6f7e477ae67a829de5b0925a79545 100644 (file)
@@ -1473,7 +1473,8 @@ ChunkSparseMatrix<number>::print_formatted(std::ostream      &out,
                                            const bool         scientific,
                                            const unsigned int width_,
                                            const char        *zero_string,
-                                           const double       denominator) const
+                                           const double       denominator,
+                                           const char        *separator) const
 {
   AssertThrow(out.fail() == false, ExcIO());
 
@@ -1505,9 +1506,9 @@ ChunkSparseMatrix<number>::print_formatted(std::ostream      &out,
       for (size_type j = 0; j < n(); ++j)
         if (cols->sparsity_pattern(i, j) != SparsityPattern::invalid_entry)
           out << std::setw(width)
-              << val[cols->sparsity_pattern(i, j)] * denominator << ' ';
+              << val[cols->sparsity_pattern(i, j)] * denominator << separator;
         else
-          out << std::setw(width) << zero_string << ' ';
+          out << std::setw(width) << zero_string << separator;
       out << std::endl;
     };
   AssertThrow(out.fail() == false, ExcIO());
index 6755b3bb6f77abcc0848ec96a28eb1595f9bb8b6..6b711c0ddf0503d7c10361b0b67c9a0eb1525277 100644 (file)
@@ -166,23 +166,25 @@ namespace CUDAWrappers
           const bool  diagonal_first = true) const;
 
     /**
-     * Print the matrix in the usual format, i.e. as a matrix and not as a list
+     * Print the matrix in the usual format, i.e., as a matrix and not as a list
      * of nonzero elements. For better readability, elements not in the matrix
      * are displayed as empty space, while matrix elements which are explicitly
      * set to zero are displayed as such.
      *
      * The parameters allow for a flexible setting of the output format:
-     * <tt>precision</tt> and <tt>scientific</tt> are used to determine the
-     * number format, where <tt>scientific = false</tt> means fixed point
-     * notation.  A zero entry for <tt>width</tt> makes the function compute a
-     * width, but it may be changed to a positive value, if output is crude.
+     * @p precision and @p scientific are used to determine the number format,
+     * where <code>scientific = false</code> means fixed point notation. A zero
+     * entry for @p width makes the function compute a width, but it may be
+     * changed to a positive value, if output is crude.
      *
-     * Additionally, a character for an empty value may be specified.
+     * Additionally, a character for an empty value may be specified in
+     * @p zero_string, and a character to separate row entries can be set in
+     * @p separator.
      *
-     * Finally, the whole matrix can be multiplied with a common denominator to
-     * produce more readable output, even integers.
+     * Finally, the whole matrix can be multiplied with a common @p denominator
+     * to produce more readable output, even integers.
      *
-     * @attention This function may produce <b>large</b> amounts of output if
+     * @attention This function may produce @em large amounts of output if
      * applied to a large matrix!
      */
     void
@@ -191,7 +193,8 @@ namespace CUDAWrappers
                     const bool         scientific  = true,
                     const unsigned int width       = 0,
                     const char        *zero_string = " ",
-                    const double       denominator = 1.) const;
+                    const double       denominator = 1.,
+                    const char        *separator   = " ") const;
     /** @} */
 
     /**
@@ -467,7 +470,8 @@ namespace CUDAWrappers
                                         const bool         scientific,
                                         const unsigned int width_,
                                         const char        *zero_string,
-                                        const double       denominator) const
+                                        const double       denominator,
+                                        const char        *separator) const
   {
     Assert(column_index_dev != nullptr, ExcNotInitialized());
     Assert(val_dev != nullptr, ExcNotInitialized());
@@ -505,11 +509,12 @@ namespace CUDAWrappers
           {
             if (k == cols[j])
               {
-                out << std::setw(width) << val[j] * Number(denominator) << ' ';
+                out << std::setw(width) << val[j] * Number(denominator)
+                    << separator;
                 ++j;
               }
             else
-              out << std::setw(width) << zero_string << ' ';
+              out << std::setw(width) << zero_string << separator;
           }
         out << std::endl;
       };
index d025ab1bfe042b16b841c05d7f160182b3ce22e1..787330ad7d834d53b604b175be389071ed65c48b 100644 (file)
@@ -498,22 +498,26 @@ public:
    *
    * The parameters allow for a flexible setting of the output format:
    *
-   * @arg <tt>precision</tt> denotes the number of trailing digits.
+   * @param out This specifies the stream to write to.
    *
-   * @arg <tt>scientific</tt> is used to determine the number format, where
-   * <tt>scientific</tt> = <tt>false</tt> means fixed point notation.
+   * @param precision denotes the number of trailing digits.
    *
-   * @arg <tt>width</tt> denotes the with of each column. A zero entry for
-   * <tt>width</tt> makes the function compute a width, but it may be changed
+   * @param scientific is used to determine the number format, where
+   * <code>scientific = false</code> means fixed point notation.
+   *
+   * @param width denotes the with of each column. A zero entry for
+   * @p width makes the function compute a width, but it may be changed
    * to a positive value, if output is crude.
    *
-   * @arg <tt>zero_string</tt> specifies a string printed for zero entries.
+   * @param zero_string specifies a string printed for zero entries.
    *
-   * @arg <tt>denominator</tt> Multiply the whole matrix by this common
+   * @param denominator Multiply the whole matrix by this common
    * denominator to get nicer numbers.
    *
-   * @arg <tt>threshold</tt>: all entries with absolute value smaller than
+   * @param threshold all entries with absolute value smaller than
    * this are considered zero.
+   *
+   * @param separator specifies a string printed to separate row entries.
    */
   void
   print_formatted(std::ostream      &out,
@@ -522,7 +526,8 @@ public:
                   const unsigned int width       = 0,
                   const char        *zero_string = " ",
                   const double       denominator = 1.,
-                  const double       threshold   = 0.) const;
+                  const double       threshold   = 0.,
+                  const char        *separator   = " ") const;
 
   /**
    * Determine an estimate for the memory consumption (in bytes) of this
index 4f8163a4e9f66e85ebf93a926b1d1db76b0ab822..69c1466685087b3f93a2ac7204a6425b8453ddfc 100644 (file)
@@ -1657,7 +1657,8 @@ FullMatrix<number>::print_formatted(std::ostream      &out,
                                     const unsigned int width_,
                                     const char        *zero_string,
                                     const double       denominator,
-                                    const double       threshold) const
+                                    const double       threshold,
+                                    const char        *separator) const
 {
   unsigned int width = width_;
 
@@ -1688,11 +1689,12 @@ FullMatrix<number>::print_formatted(std::ostream      &out,
         // we might have complex numbers, so use abs also to check for nan
         // since there is no isnan on complex numbers
         if (numbers::is_nan(std::abs((*this)(i, j))))
-          out << std::setw(width) << (*this)(i, j) << ' ';
+          out << std::setw(width) << (*this)(i, j) << separator;
         else if (std::abs((*this)(i, j)) > threshold)
-          out << std::setw(width) << (*this)(i, j) * number(denominator) << ' ';
+          out << std::setw(width) << (*this)(i, j) * number(denominator)
+              << separator;
         else
-          out << std::setw(width) << zero_string << ' ';
+          out << std::setw(width) << zero_string << separator;
       out << std::endl;
     };
 
index 6f77da50fbdc22029c0778ab397b2b14e9a2ca43..9a71f305bf9c7fadea472ce2b657192835d6a60a 100644 (file)
@@ -902,6 +902,8 @@ public:
    * @param threshold all entries with absolute value smaller than
    * this are considered zero.
    *
+   * @param separator specifies a string printed to separate row entries.
+   *
    * @note The entries stored resemble a matrix only if the state is either
    * LAPACKSupport::matrix or LAPACK::inverse_matrix. Otherwise, calling this
    * function is not allowed.
@@ -913,7 +915,8 @@ public:
                   const unsigned int width       = 0,
                   const char        *zero_string = " ",
                   const double       denominator = 1.,
-                  const double       threshold   = 0.) const;
+                  const double       threshold   = 0.,
+                  const char        *separator   = " ") const;
 
 private:
   /**
index cc3c481d044891a2963af34baafd13ce29f59ff8..d1400eab4303f1b250c97df956845b9a162df190 100644 (file)
@@ -1584,23 +1584,25 @@ public:
         const bool  diagonal_first = true) const;
 
   /**
-   * Print the matrix in the usual format, i.e. as a matrix and not as a list
+   * Print the matrix in the usual format, i.e., as a matrix and not as a list
    * of nonzero elements. For better readability, elements not in the matrix
    * are displayed as empty space, while matrix elements which are explicitly
    * set to zero are displayed as such.
    *
    * The parameters allow for a flexible setting of the output format:
-   * <tt>precision</tt> and <tt>scientific</tt> are used to determine the
-   * number format, where <tt>scientific = false</tt> means fixed point
-   * notation.  A zero entry for <tt>width</tt> makes the function compute a
-   * width, but it may be changed to a positive value, if output is crude.
+   * @p precision and @p scientific are used to determine the number format,
+   * where <code>scientific = false</code> means fixed point notation. A zero
+   * entry for @p width makes the function compute a width, but it may be
+   * changed to a positive value, if output is crude.
    *
-   * Additionally, a character for an empty value may be specified.
+   * Additionally, a character for an empty value may be specified in
+   * @p zero_string, and a character to separate row entries can be set in
+   * @p separator.
    *
-   * Finally, the whole matrix can be multiplied with a common denominator to
-   * produce more readable output, even integers.
+   * Finally, the whole matrix can be multiplied with a common @p denominator
+   * to produce more readable output, even integers.
    *
-   * @attention This function may produce <b>large</b> amounts of output if
+   * @attention This function may produce @em large amounts of output if
    * applied to a large matrix!
    */
   void
@@ -1609,7 +1611,8 @@ public:
                   const bool         scientific  = true,
                   const unsigned int width       = 0,
                   const char        *zero_string = " ",
-                  const double       denominator = 1.) const;
+                  const double       denominator = 1.,
+                  const char        *separator   = " ") const;
 
   /**
    * Print the actual pattern of the matrix. For each entry with an absolute
index 5910ca5a7612e0ca47fe2de538d4a2dae11e674d..c1c97cae506c7f590490555b8d770b0347d5b3be 100644 (file)
@@ -1912,7 +1912,8 @@ SparseMatrix<number>::print_formatted(std::ostream      &out,
                                       const bool         scientific,
                                       const unsigned int width_,
                                       const char        *zero_string,
-                                      const double       denominator) const
+                                      const double       denominator,
+                                      const char        *separator) const
 {
   Assert(cols != nullptr, ExcNeedsSparsityPattern());
   Assert(val != nullptr, ExcNotInitialized());
@@ -1940,9 +1941,9 @@ SparseMatrix<number>::print_formatted(std::ostream      &out,
       for (size_type j = 0; j < n(); ++j)
         if ((*cols)(i, j) != SparsityPattern::invalid_entry)
           out << std::setw(width)
-              << val[cols->operator()(i, j)] * number(denominator) << ' ';
+              << val[cols->operator()(i, j)] * number(denominator) << separator;
         else
-          out << std::setw(width) << zero_string << ' ';
+          out << std::setw(width) << zero_string << separator;
       out << std::endl;
     };
   AssertThrow(out.fail() == false, ExcIO());
index 46fa52da60e6c4737365a2335b715ee99c38212e..ab0d0c2c48e1f313f95f35cbbe19d6de4e366d16 100644 (file)
@@ -749,24 +749,26 @@ public:
   print(std::ostream &out) const;
 
   /**
-   * Print the matrix in the usual format, i.e. as a matrix and not as a list
+   * Print the matrix in the usual format, i.e., as a matrix and not as a list
    * of nonzero elements. For better readability, elements not in the matrix
    * are displayed as empty space, while matrix elements which are explicitly
    * set to zero are displayed as such.
    *
-   * The parameters allow for a flexible setting of the output format: @p
-   * precision and @p scientific are used to determine the number format,
-   * where @p scientific = @p false means fixed point notation.  A zero entry
-   * for @p width makes the function compute a width, but it may be changed to
-   * a positive value, if output is crude.
+   * The parameters allow for a flexible setting of the output format:
+   * @p precision and @p scientific are used to determine the number format,
+   * where <code>scientific = false</code> means fixed point notation. A zero
+   * entry for @p width makes the function compute a width, but it may be
+   * changed to a positive value, if output is crude.
    *
-   * Additionally, a character for an empty value may be specified.
+   * Additionally, a character for an empty value may be specified in
+   * @p zero_string, and a character to separate row entries can be set in
+   * @p separator.
    *
-   * Finally, the whole matrix can be multiplied with a common denominator to
-   * produce more readable output, even integers.
+   * Finally, the whole matrix can be multiplied with a common @p denominator
+   * to produce more readable output, even integers.
    *
-   * This function may produce @em large amounts of output if applied to a
-   * large matrix!
+   * @attention This function may produce @em large amounts of output if
+   * applied to a large matrix!
    */
   void
   print_formatted(std::ostream      &out,
@@ -774,7 +776,8 @@ public:
                   const bool         scientific  = true,
                   const unsigned int width       = 0,
                   const char        *zero_string = " ",
-                  const double       denominator = 1.) const;
+                  const double       denominator = 1.,
+                  const char        *separator   = " ") const;
 
   /**
    * Write the data of this object in binary mode to a file.
index 29d30e56724e5eb40a32f3f466f4cade51c06109..f40ff31fbd927ec48eecf2bce0d42f62ff715141 100644 (file)
@@ -485,7 +485,8 @@ SparseMatrixEZ<number>::print_formatted(std::ostream      &out,
                                         const bool         scientific,
                                         const unsigned int width_,
                                         const char        *zero_string,
-                                        const double       denominator) const
+                                        const double       denominator,
+                                        const char        *separator) const
 {
   AssertThrow(out.fail() == false, ExcIO());
   Assert(m() != 0, ExcNotInitialized());
@@ -516,9 +517,9 @@ SparseMatrixEZ<number>::print_formatted(std::ostream      &out,
         {
           const Entry *entry = locate(i, j);
           if (entry)
-            out << std::setw(width) << entry->value * denominator << ' ';
+            out << std::setw(width) << entry->value * denominator << separator;
           else
-            out << std::setw(width) << zero_string << ' ';
+            out << std::setw(width) << zero_string << separator;
         }
       out << std::endl;
     };
index 3a08525826259d4ccf633ce1b46fddc97a2586a1..f6d95c2a05d3332dd9c1a3fb9a77ad5c17638ed4 100644 (file)
@@ -2523,7 +2523,8 @@ LAPACKFullMatrix<number>::print_formatted(std::ostream      &out,
                                           const unsigned int width_,
                                           const char        *zero_string,
                                           const double       denominator,
-                                          const double       threshold) const
+                                          const double       threshold,
+                                          const char        *separator) const
 {
   unsigned int width = width_;
 
@@ -2559,11 +2560,11 @@ LAPACKFullMatrix<number>::print_formatted(std::ostream      &out,
         // we might have complex numbers, so use abs also to check for nan
         // since there is no isnan on complex numbers
         if (numbers::is_nan(std::abs((*this)(i, j))))
-          out << std::setw(width) << (*this)(i, j) << ' ';
+          out << std::setw(width) << (*this)(i, j) << separator;
         else if (std::abs(this->el(i, j)) > threshold)
-          out << std::setw(width) << this->el(i, j) * denominator << ' ';
+          out << std::setw(width) << this->el(i, j) * denominator << separator;
         else
-          out << std::setw(width) << zero_string << ' ';
+          out << std::setw(width) << zero_string << separator;
       out << std::endl;
     }
 

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.