Skip to content
Snippets Groups Projects
Commit c2c7c1c1 authored by Uli Sack's avatar Uli Sack Committed by usack
Browse files

implement methods normSquared and diff

[[Imported from SVN: r6545]]
parent 8c852f02
No related branches found
No related tags found
No related merge requests found
......@@ -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);
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment