]> https://gitweb.dealii.org/ - dealii.git/commitdiff
Allow for resorting of diagonal
authorGuido Kanschat <dr.guido.kanschat@gmail.com>
Mon, 24 Jun 2013 06:54:03 +0000 (06:54 +0000)
committerGuido Kanschat <dr.guido.kanschat@gmail.com>
Mon, 24 Jun 2013 06:54:03 +0000 (06:54 +0000)
git-svn-id: https://svn.dealii.org/trunk@29854 0785d39b-7218-0410-832d-ea1e28bc413d

deal.II/include/deal.II/lac/sparse_matrix.h

index 0419e4d371f19b5e02327586c6fefaa2f6121a0f..5c3fe719a801e21652530300ce85f13647377fa2 100644 (file)
@@ -1476,13 +1476,18 @@ public:
 //@{
 
   /**
-   * Print the matrix to the given stream, using the format <tt>(row,column)
-   * value</tt>, i.e. one nonzero entry of the matrix per line. If @p across
-   * is true, print all entries on a single line, using the format
-   * row,column:value
+   * Print the matrix to the given stream, using the format
+   * <tt>(row,column) value</tt>, i.e. one nonzero entry of the matrix
+   * per line. If <tt>across</tt> is true, print all entries on a
+   * single line, using the format row,column:value.
+   *
+   * If the argument <tt>diagonal_first</tt> is true, diagonal
+   * elements of quadratic matrices are printed first in their row,
+   * corresponding to the internal storage scheme. If it is false, the
+   * elements in a row are written in ascending column order.
    */
   template <class STREAM>
-  void print (STREAM &out, bool across=false) const;
+  void print (STREAM &out, bool across=false, bool diagonal_first=true) const;
 
   /**
    * Print the matrix in the usual format, i.e. as a matrix and not as a list
@@ -2464,22 +2469,40 @@ SparseMatrix<number>::end (const size_type r)
 template <typename number>
 template <class STREAM>
 inline
-void SparseMatrix<number>::print (STREAM &out, bool across) const
+void SparseMatrix<number>::print (STREAM &out, bool across, bool diagonal_first) const
 {
   Assert (cols != 0, ExcNotInitialized());
   Assert (val != 0, ExcNotInitialized());
-
+  
+  bool hanging_diagonal = false;
+  number diagonal;
+  
+  for (size_type i=0; i<cols->rows; ++i)
+    for (size_type j=cols->rowstart[i]; j<cols->rowstart[i+1]; ++j)
+      {
+       if (!diagonal_first && i == cols->colnums[j])
+         {
+           diagonal = val[j];
+           hanging_diagonal = true;
+         }
+       else
+         {
+           if (hanging_diagonal && cols->colnums[j]>i)
+             {
+               if (across)
+                 out << '(' << i << ',' << i << ") " << diagonal << std::endl;
+               else
+                 out << ' ' << i << ',' << i << ':' << diagonal;
+               hanging_diagonal = false;
+             }
+           if (across)
+             out << ' ' << i << ',' << cols->colnums[j] << ':' << val[j];
+           else
+             out << "(" << i << "," << cols->colnums[j] << ") " << val[j] << std::endl;
+         }
+      }
   if (across)
-    {
-      for (size_type i=0; i<cols->rows; ++i)
-        for (size_type j=cols->rowstart[i]; j<cols->rowstart[i+1]; ++j)
-          out << ' ' << i << ',' << cols->colnums[j] << ':' << val[j];
-      out << std::endl;
-    }
-  else
-    for (size_type i=0; i<cols->rows; ++i)
-      for (size_type j=cols->rowstart[i]; j<cols->rowstart[i+1]; ++j)
-        out << "(" << i << "," << cols->colnums[j] << ") " << val[j] << std::endl;
+    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.