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 @@ ...@@ -4,16 +4,18 @@
#include <vector> #include <vector>
#include <cmath> #include <cmath>
#include <dune/common/shared_ptr.hh>
#include "norm.hh" #include "norm.hh"
//! A norm for blocks of vectors //! A norm for blocks of interlaced vectors
template <class VectorType, class ReorderedLocalVector> template <class VectorType, class ReorderedLocalVector>
class ReorderedBlockNorm: public Norm<VectorType> class ReorderedBlockNorm: public Norm<VectorType>
{ {
public: 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) : ReorderedBlockNorm(const NormPointerVector& norms) :
norms_(norms) norms_(norms)
...@@ -21,23 +23,41 @@ class ReorderedBlockNorm: public Norm<VectorType> ...@@ -21,23 +23,41 @@ class ReorderedBlockNorm: public Norm<VectorType>
//! Compute the norm of the given vector //! Compute the norm of the given vector
double operator()(const VectorType &v) const 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; double r = 0.0;
ReorderedVector v_r;
GenericVector::deinterlace(v,v_r);
for (int i=0; i<norms_.size(); ++i) for (int i=0; i<norms_.size(); ++i)
{ {
double ri = (*norms_[i])(v[i]); double ri = (*norms_[i])(v_r[i]);
r += ri*ri; r += ri*ri;
} }
return std::sqrt(r); return r;
} }
//! Compute the norm of the difference of two vectors //! Compute the norm of the difference of two vectors
double diff(const VectorType &v1, const VectorType &v2) const double diff(const VectorType &v1, const VectorType &v2) const
{ {
double r = 0.0; 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; r += ri*ri;
} }
return std::sqrt(r); 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