]> https://gitweb.dealii.org/ - dealii-svn.git/commitdiff
implementation of SparseMatrixEZ started
authorguido <guido@0785d39b-7218-0410-832d-ea1e28bc413d>
Mon, 8 Jul 2002 11:12:31 +0000 (11:12 +0000)
committerguido <guido@0785d39b-7218-0410-832d-ea1e28bc413d>
Mon, 8 Jul 2002 11:12:31 +0000 (11:12 +0000)
git-svn-id: https://svn.dealii.org/trunk@6222 0785d39b-7218-0410-832d-ea1e28bc413d

deal.II/lac/include/lac/sparse_matrix_ez.h
deal.II/lac/include/lac/sparse_matrix_ez.templates.h

index 3a4c61c82b09ff998efc41d0e35debf657407a85..2bbac3b8b6f33dad4bc7f0b78342cd4e49d36234 100644 (file)
@@ -137,7 +137,7 @@ class SparseMatrixEZ : public Subscriptor
                                      * the entries should happen to
                                      * be zero, it is counted anyway.
                                      */
-    unsigned int n_nonzero_elements () const;
+//    unsigned int n_nonzero_elements () const;
 
                                     /**
                                      * Return the number of actually
@@ -151,7 +151,7 @@ class SparseMatrixEZ : public Subscriptor
                                      * sparsity pattern but only the
                                      * ones that are nonzero.
                                      */
-    unsigned int n_actually_nonzero_elements () const;
+//    unsigned int n_actually_nonzero_elements () const;
     
                                     /**
                                      * Set the element @p{(i,j)} to
@@ -714,13 +714,18 @@ class SparseMatrixEZ : public Subscriptor
                                         /*
                                          * Access to value.
                                          */
-       number& operator() (unsigned int column);
+//     number& operator() (unsigned int column);
 
                                         /**
                                          * Read-only access to value.
                                          */
        const number& operator() (unsigned int column) const;
 
+                                        /**
+                                         * Number of entries.
+                                         */
+       unsigned int size() const;
+       
                                         /**
                                          * Start of entry list.
                                          */
@@ -744,7 +749,10 @@ class SparseMatrixEZ : public Subscriptor
        
        private:
                                         /**
-                                         * Actual data storage.
+                                         * Actual data storage. This
+                                         * vector contains the
+                                         * entries of a row ordered
+                                         * by column number.
                                          */
        std::vector<Entry> values;
       };
@@ -911,6 +919,15 @@ SparseMatrixEZ<number>::Row::begin()
 }
 
 
+template <typename number>
+inline
+unsigned int
+SparseMatrixEZ<number>::Row::size() const
+{
+  return values.size();
+}
+
+
 template <typename number>
 inline
 std::vector<Entry>::const_iterator
index 54c3fa448b82d73fbaa4e57871ca424c463b7d22..81ca366be0d221f5e68a00c8474b8f43dea74732 100644 (file)
@@ -1,11 +1,32 @@
 #include <lac/sparse_matrix_ez.h>
 
+#include <algorithm>
+
 template <typename number>
 void
 SparseMatrixEZ<number>::Row::set(unsigned int column,
                                 const number& value)
 {
-  Assert(false, ExcNotImplemented());
+                                  // Store end of vector
+  const std::vector<Entry>::const_iterator end_col = end();
+
+                                  // Create Entry for inserting
+  const Entry e(column, value);
+
+                                  // Find position for inserting
+                                  // should return first Entry with
+                                  // higher column number.
+  std::vector<Entry>::iterator col = lower_bound(begin(), end, e);
+
+                                  // Insert Entry if column did not exist.
+                                  // Edit existing entry otherwise.
+  if (col==end_col)
+    values.push_back(e);
+  else
+    if (col->column == column)
+      col->values = value;
+    else
+      values.insert(col, e);
 }
 
 
@@ -14,7 +35,25 @@ void
 SparseMatrixEZ<number>::Row::add(unsigned int column,
                                 const number& value)
 {
-  Assert(false, ExcNotImplemented());
+  const std::vector<Entry>::const_iterator end_col = end();
+
+                                  // Create Entry for inserting
+  const Entry e(column, value);
+  
+                                  // Find position for inserting
+                                  // should return first Entry with
+                                  // higher column number.
+  std::vector<Entry>::iterator col = lower_bound(begin(), end, e);
+
+                                  // Insert Entry if column did not exist.
+                                  // Edit existing entry otherwise.
+  if (col==end_col)
+    values.push_back(Entry(column, value));
+  else
+    if (col->column == column)
+      col->values += value;
+    else
+      values.insert(col, Entry(column, value));
 }
 
 
@@ -91,5 +130,89 @@ SparseMatrixEZ<number>::vmult (Vector<somenumber>& dst,
 {
   Assert(m() == dst.size(), ExcDimensionMismatch(m(),dst.size()));
   Assert(n() == src.size(), ExcDimensionMismatch(n(),src.size()));
+
+  std::vector<Row>::const_iterator row = rows.begin();
+  const std::vector<Row>::const_iterator end_row = rows.end();
+  for (unsigned int i=0; row != end_row; ++i, ++row)
+    {
+      std::vector<Entry>::const_iterator col = row->begin();
+      const std::vector<Entry>::const_iterator end_col = row->end();
+
+      double s = 0.;
+      for (;col != end_col; ++col)
+       s += col->value * src(col->column);
+      dst(i) = s;
+    }
 }
 
+
+template <typename number>
+template <typename somenumber>
+void
+SparseMatrixEZ<number>::Tvmult (Vector<somenumber>& dst,
+                               const Vector<somenumber>& src) const
+{
+  dst = 0.;
+  Tvmult_add(dst, src);
+}
+
+
+template <typename number>
+template <typename somenumber>
+void
+SparseMatrixEZ<number>::vmult_add (Vector<somenumber>& dst,
+                                  const Vector<somenumber>& src) const
+{
+  Assert(m() == dst.size(), ExcDimensionMismatch(m(),dst.size()));
+  Assert(n() == src.size(), ExcDimensionMismatch(n(),src.size()));
+
+  std::vector<Row>::const_iterator row = rows.begin();
+  const std::vector<Row>::const_iterator end_row = rows.end();
+  for (unsigned int i=0; row != end_row; ++i, ++row)
+    {
+      std::vector<Entry>::const_iterator col = row->begin();
+      const std::vector<Entry>::const_iterator end_col = row->end();
+
+      double s = 0.;
+      for (;col != end_col; ++col)
+       s += col->value * src(col->column);
+      dst(i) += s;
+    }
+}
+
+template <typename number>
+template <typename somenumber>
+void
+SparseMatrixEZ<number>::Tvmult_add (Vector<somenumber>& dst,
+                                   const Vector<somenumber>& src) const
+{
+  Assert(n() == dst.size(), ExcDimensionMismatch(n(),dst.size()));
+  Assert(m() == src.size(), ExcDimensionMismatch(m(),src.size()));
+
+  std::vector<Row>::const_iterator row = rows.begin();
+  const std::vector<Row>::const_iterator end_row = rows.end();
+  for (unsigned int i=0; row != end_row; ++i, ++row)
+    {
+      std::vector<Entry>::const_iterator col = row->begin();
+      const std::vector<Entry>::const_iterator end_col = row->end();
+
+      double s = 0.;
+      for (;col != end_col; ++col)
+       dst(col->column) += col->value * src(i);
+    }
+}
+
+template <typename number>
+template <typename somenumber>
+unsigned int
+SparseMatrixEZ<number>::memory_consumption() const
+{
+  unsigned int result = sizeof (*this)
+                       + sizeof(Row) * sizeof (rows);
+
+  for (std::vector<Row>::const_iterator r = rows.begin();
+       r != rows.end(); ++r)
+    result += r->size() * sizeof(Entry);
+
+  return result;
+}

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.