From 9c3ff811eeb9f341eb6da1dcda0a3cb843fd27bc Mon Sep 17 00:00:00 2001
From: Oliver Sander <sander@igpm.rwth-aachen.de>
Date: Thu, 13 Sep 2012 15:37:20 +0000
Subject: [PATCH] properly implement getting the Lagrange nodes.  Works without
 a priori information for all orders and dimensions

[[Imported from SVN: r8869]]
---
 test/nestednesstest.cc | 54 +++++++++++++++++++++++-------------------
 1 file changed, 30 insertions(+), 24 deletions(-)

diff --git a/test/nestednesstest.cc b/test/nestednesstest.cc
index 96b488e2..8aa40b89 100644
--- a/test/nestednesstest.cc
+++ b/test/nestednesstest.cc
@@ -31,34 +31,40 @@ double diameter(const std::vector<TargetSpace>& v)
     return d;
 }
 
-template <int domainDim, int elementOrder>
-std::vector<FieldVector<double,domainDim> > lagrangeNodes(const GeometryType& type)
+// The function f(x_1,x_2,x_3) := x_i, needed to get the Lagrange nodes
+// from a Dune LocalFunction
+template <int dim>
+struct CoordinateFunction
+    : public Dune::VirtualFunction<FieldVector<double,dim>, FieldVector<double,1> >
 {
-    std::vector<FieldVector<double,domainDim> > result;
+    CoordinateFunction(int dir)
+    : dir_(dir)
+    {}
     
-    // Special case d=1, q=anything, because that one is easy
-    if (domainDim==1) {
-     
-        result.resize(elementOrder+1);
-        
-        for (size_t i=0; i<result.size(); i++)
-            result[i] = double(i)/double(elementOrder);
-        
-        return result;
+    void evaluate(const FieldVector<double, dim>& x, FieldVector<double,1>& out) const {
+        out = x[dir_];
     }
-    
-    assert(elementOrder==2);
+
+    int dir_;
+};
+
+
+
+template <int domainDim, int elementOrder>
+std::vector<FieldVector<double,domainDim> > lagrangeNodes(const GeometryType& type)
+{
     PQkLocalFiniteElementCache<double,double,domainDim,elementOrder> feCache;
-    result.resize(feCache.get(type).localBasis().size());
-    
-    // evaluate loF at the Lagrange points of the second-order function
-    const Dune::GenericReferenceElement<double,domainDim>& refElement
-        = Dune::GenericReferenceElements<double,domainDim>::general(type);
-        
-    for (size_t i=0; i<feCache.get(type).localBasis().size(); i++) {
+
+    std::vector<FieldVector<double,domainDim> > result(feCache.get(type).localBasis().size());
+    std::vector<FieldVector<double,1> > resultCoeff(feCache.get(type).localBasis().size());
+
+    for (size_t i=0; i<domainDim; i++) {
         
-        result[i] = refElement.position(feCache.get(type).localCoefficients().localKey(i).subEntity(),
-                                        feCache.get(type).localCoefficients().localKey(i).codim());
+        CoordinateFunction<domainDim> cF(i);
+        feCache.get(type).localInterpolation().interpolate(cF, resultCoeff);
+    
+        for (size_t j=0; j<result.size(); j++)
+            result[j][i] = resultCoeff[j];
         
     }
     
@@ -110,7 +116,7 @@ void testNestedness(const LocalGeodesicFEFunction<domainDim,double,typename PQkL
             assert(false);
         
         if ( diff.infinity_norm() > eps ) {
-            std::cout << className<TargetSpace>() << ": Values doe not match." << std::endl;
+            std::cout << className<TargetSpace>() << ": Values does not match." << std::endl;
             std::cout << "Low order : " << loValue << std::endl;
             std::cout << "High order: " << hoValue << std::endl;
             assert(false);
-- 
GitLab