Skip to content
Snippets Groups Projects
Commit ca695efb authored by Oliver Sander's avatar Oliver Sander
Browse files

Allow to measure vector-valued functions

Unfortunately this involves moving the method bodies inside the class
declaration (I couldn't get the template code to compile otherwise).
I tried to get a patch with as little noise as possible.  Unfortunately
this means that indentation is now off in this file.
parent 42e5f9d7
No related branches found
No related tags found
No related merge requests found
...@@ -19,24 +19,11 @@ public: ...@@ -19,24 +19,11 @@ public:
/** \brief Compute L2 error between a grid function and an arbitrary function /** \brief Compute L2 error between a grid function and an arbitrary function
*/ */
static double computeL2Error(const VirtualGridViewFunction<GridView,Dune::FieldVector<double,1> >* a, template <int blocksize>
const Dune::VirtualFunction<Dune::FieldVector<ctype,dim>, Dune::FieldVector<double,1> >* b, static double computeL2Error(const VirtualGridViewFunction<GridView,Dune::FieldVector<double,blocksize> >* a,
QuadratureRuleKey quadKey); const Dune::VirtualFunction<Dune::FieldVector<ctype,dim>, Dune::FieldVector<double,blocksize> >* b,
static double computeH1HalfNormDifferenceSquared(const GridView& gridView,
const VirtualDifferentiableFunction<Dune::FieldVector<ctype,dim>, Dune::FieldVector<double,1> >* u,
const VirtualDifferentiableFunction<Dune::FieldVector<ctype,dim>, Dune::FieldVector<double,1> >* v,
QuadratureRuleKey quadKey);
};
template <class GridView>
double DiscretizationError<GridView>::
computeL2Error(const VirtualGridViewFunction<GridView,Dune::FieldVector<double,1> >* a,
const Dune::VirtualFunction<Dune::FieldVector<ctype,dim>, Dune::FieldVector<double,1> >* b,
QuadratureRuleKey quadKey) QuadratureRuleKey quadKey)
{ {
// The error to be computed // The error to be computed
double error = 0; double error = 0;
...@@ -55,13 +42,13 @@ computeL2Error(const VirtualGridViewFunction<GridView,Dune::FieldVector<double,1 ...@@ -55,13 +42,13 @@ computeL2Error(const VirtualGridViewFunction<GridView,Dune::FieldVector<double,1
for (size_t i=0; i<quad.size(); i++) { for (size_t i=0; i<quad.size(); i++) {
// Evaluate function a // Evaluate function a
Dune::FieldVector<double,1> aValue; Dune::FieldVector<double,blocksize> aValue;
a->evaluateLocal(*eIt, quad[i].position(),aValue); a->evaluateLocal(*eIt, quad[i].position(),aValue);
// Evaluate function b. If it is a grid function use that to speed up the evaluation // Evaluate function b. If it is a grid function use that to speed up the evaluation
Dune::FieldVector<double,1> bValue; Dune::FieldVector<double,blocksize> bValue;
if (dynamic_cast<const VirtualGridViewFunction<GridView,Dune::FieldVector<double,1> >*>(b)) if (dynamic_cast<const VirtualGridViewFunction<GridView,Dune::FieldVector<double,blocksize> >*>(b))
dynamic_cast<const VirtualGridViewFunction<GridView,Dune::FieldVector<double,1> >*>(b)->evaluateLocal(*eIt, dynamic_cast<const VirtualGridViewFunction<GridView,Dune::FieldVector<double,blocksize> >*>(b)->evaluateLocal(*eIt,
quad[i].position(), quad[i].position(),
bValue bValue
); );
...@@ -77,15 +64,15 @@ computeL2Error(const VirtualGridViewFunction<GridView,Dune::FieldVector<double,1 ...@@ -77,15 +64,15 @@ computeL2Error(const VirtualGridViewFunction<GridView,Dune::FieldVector<double,1
return std::sqrt(error); return std::sqrt(error);
} }
template <class GridView>
double DiscretizationError<GridView>:: template <int blocksize>
computeH1HalfNormDifferenceSquared(const GridView& gridView, static double computeH1HalfNormDifferenceSquared(const GridView& gridView,
const VirtualDifferentiableFunction<Dune::FieldVector<ctype,dim>, Dune::FieldVector<double,1> >* u, const VirtualDifferentiableFunction<Dune::FieldVector<ctype,dim>, Dune::FieldVector<double,blocksize> >* u,
const VirtualDifferentiableFunction<Dune::FieldVector<ctype,dim>, Dune::FieldVector<double,1> >* v, const VirtualDifferentiableFunction<Dune::FieldVector<ctype,dim>, Dune::FieldVector<double,blocksize> >* v,
QuadratureRuleKey quadKey) QuadratureRuleKey quadKey)
{ {
double norm = 0.0; double norm = 0.0;
typedef typename GridView::template Codim<0>::Iterator ElementIterator; typedef typename GridView::template Codim<0>::Iterator ElementIterator;
...@@ -106,16 +93,16 @@ computeH1HalfNormDifferenceSquared(const GridView& gridView, ...@@ -106,16 +93,16 @@ computeH1HalfNormDifferenceSquared(const GridView& gridView,
const double integrationElement = eIt->geometry().integrationElement(quadPos); const double integrationElement = eIt->geometry().integrationElement(quadPos);
// Evaluate integral // Evaluate integral
Dune::FieldMatrix<double,1,dim> u_di; Dune::FieldMatrix<double,blocksize,dim> u_di;
Dune::FieldMatrix<double,1,dim> v_di; Dune::FieldMatrix<double,blocksize,dim> v_di;
if (dynamic_cast<const VirtualGridViewFunction<GridView,Dune::FieldVector<double,1> >*>(u)) if (dynamic_cast<const VirtualGridViewFunction<GridView,Dune::FieldVector<double,blocksize> >*>(u))
dynamic_cast<const VirtualGridViewFunction<GridView,Dune::FieldVector<double,1> >*>(u)->evaluateDerivativeLocal(*eIt, quadPos, u_di); dynamic_cast<const VirtualGridViewFunction<GridView,Dune::FieldVector<double,blocksize> >*>(u)->evaluateDerivativeLocal(*eIt, quadPos, u_di);
else else
u->evaluateDerivative(eIt->geometry().global(quadPos), u_di); u->evaluateDerivative(eIt->geometry().global(quadPos), u_di);
if (dynamic_cast<const VirtualGridViewFunction<GridView,Dune::FieldVector<double,1> >*>(v)) if (dynamic_cast<const VirtualGridViewFunction<GridView,Dune::FieldVector<double,blocksize> >*>(v))
dynamic_cast<const VirtualGridViewFunction<GridView,Dune::FieldVector<double,1> >*>(v)->evaluateDerivativeLocal(*eIt, quadPos, v_di); dynamic_cast<const VirtualGridViewFunction<GridView,Dune::FieldVector<double,blocksize> >*>(v)->evaluateDerivativeLocal(*eIt, quadPos, v_di);
else else
v->evaluateDerivative(eIt->geometry().global(quadPos), v_di); v->evaluateDerivative(eIt->geometry().global(quadPos), v_di);
...@@ -124,8 +111,10 @@ computeH1HalfNormDifferenceSquared(const GridView& gridView, ...@@ -124,8 +111,10 @@ computeH1HalfNormDifferenceSquared(const GridView& gridView,
} }
} }
return norm; return norm;
} }
};
#endif #endif
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment