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