From c2c7c1c12f13ad0cf796b3ec14ffcb9e401d6f05 Mon Sep 17 00:00:00 2001
From: Uli Sack <usack@math.fu-berlin.de>
Date: Mon, 23 Jul 2012 14:01:09 +0000
Subject: [PATCH] implement methods normSquared and diff

[[Imported from SVN: r6545]]
---
 dune/solvers/norms/reorderedblocknorm.hh | 34 +++++++++++++++++++-----
 1 file changed, 27 insertions(+), 7 deletions(-)

diff --git a/dune/solvers/norms/reorderedblocknorm.hh b/dune/solvers/norms/reorderedblocknorm.hh
index 593e227f..b4a4d14e 100644
--- a/dune/solvers/norms/reorderedblocknorm.hh
+++ b/dune/solvers/norms/reorderedblocknorm.hh
@@ -4,16 +4,18 @@
 #include <vector>
 #include <cmath>
 
+#include <dune/common/shared_ptr.hh>
+
 #include "norm.hh"
 
-//! A norm for blocks of vectors
+//! A norm for blocks of interlaced vectors
 template <class VectorType, class ReorderedLocalVector>
 class ReorderedBlockNorm: public Norm<VectorType>
 {
     public:
-        typedef typename std::vector<ReorderedLocalVector> ReorderedVector;
+        typedef Dune::BlockVector<ReorderedLocalVector> ReorderedVector;
 
-        typedef typename std::vector<const Norm<typename VectorType::block_type>* > NormPointerVector;
+        typedef std::vector< Dune::shared_ptr<const Norm<ReorderedLocalVector> > > NormPointerVector;
 
         ReorderedBlockNorm(const NormPointerVector& norms) :
             norms_(norms)
@@ -21,23 +23,41 @@ class ReorderedBlockNorm: public Norm<VectorType>
 
         //! Compute the norm of the given vector
         double operator()(const VectorType &v) const
+        {
+            return std::sqrt(normSquared(v));
+        }
+
+        //! Compute the square of the norm of the given vector
+        double normSquared(const VectorType& v) const
         {
             double r = 0.0;
+
+            ReorderedVector v_r;
+            GenericVector::deinterlace(v,v_r);
+
             for (int i=0; i<norms_.size(); ++i)
             {
-                double ri = (*norms_[i])(v[i]);
+                double ri = (*norms_[i])(v_r[i]);
                 r += ri*ri;
             }
-            return std::sqrt(r);
+            return r;
         }
 
         //! Compute the norm of the difference of two vectors
         double diff(const VectorType &v1, const VectorType &v2) const
         {
             double r = 0.0;
-            for (int i=0; i<norms_.size(); ++i)
+
+            ReorderedVector v1_r, v2_r;
+            GenericVector::deinterlace(v1,v1_r);
+            GenericVector::deinterlace(v2,v2_r);
+
+            for (size_t i=0; i<norms_.size(); ++i)
             {
-                double ri = (*norms_[i]).diff(v1[i], v2[i]);
+//                std::cout << "norms.size()= " << norms_.size() << ", v1_r.size= " << v1_r.size() << ", v2_r.size= " << v2_r.size() << std::endl;
+//                std::cout << "v1_r[" << i << "].size= " << v1_r[i].size() << ", v2_r[i].size= " << v2_r[i].size() << std::endl;
+//                std::cout <<  v1_r[i] << std::endl << v2_r[i] << std::endl;
+                double ri = (*norms_[i]).diff(v1_r[i], v2_r[i]);
                 r += ri*ri;
             }
             return std::sqrt(r);
-- 
GitLab