From 6445a56a5af18b45946fa70766024c01781e70c7 Mon Sep 17 00:00:00 2001
From: "Dennis.Glaeser" <dennis.glaeser@iws.uni-stuttgart.de>
Date: Mon, 3 Jun 2019 20:22:08 +0200
Subject: [PATCH] [projector] allow for vector-valued block types

---
 dumux/discretization/projection/projector.hh  |  40 +++-
 test/common/functions/test_function_l2norm.cc |  34 ++--
 test/discretization/projection/CMakeLists.txt |  37 +---
 .../projection/test_projection_2d1d.cc        | 188 ++++++++----------
 .../test_projection_2d1d_box_box_1d.csv       |  14 --
 .../test_projection_2d1d_box_box_2d.csv       | 121 -----------
 .../test_projection_2d1d_box_tpfa_1d.csv      |  13 --
 .../test_projection_2d1d_box_tpfa_2d.csv      | 121 -----------
 .../test_projection_2d1d_fem_box_1d.csv       |  14 --
 .../test_projection_2d1d_fem_box_2d.csv       | 121 -----------
 .../test_projection_2d1d_fem_fem_1d.csv       |  14 --
 .../test_projection_2d1d_fem_fem_2d.csv       | 121 -----------
 .../test_projection_2d1d_fem_tpfa_1d.csv      |  13 --
 .../test_projection_2d1d_fem_tpfa_2d.csv      | 121 -----------
 .../test_projection_2d1d_tpfa_box_1d.csv      |  14 --
 .../test_projection_2d1d_tpfa_box_2d.csv      | 100 ----------
 .../test_projection_2d1d_tpfa_fem_1d.csv      |  14 --
 .../test_projection_2d1d_tpfa_fem_2d.csv      | 100 ----------
 .../test_projection_2d1d_tpfa_tpfa_1d.csv     |  13 --
 .../test_projection_2d1d_tpfa_tpfa_2d.csv     | 100 ----------
 20 files changed, 137 insertions(+), 1176 deletions(-)
 delete mode 100644 test/references/test_projection_2d1d_box_box_1d.csv
 delete mode 100644 test/references/test_projection_2d1d_box_box_2d.csv
 delete mode 100644 test/references/test_projection_2d1d_box_tpfa_1d.csv
 delete mode 100644 test/references/test_projection_2d1d_box_tpfa_2d.csv
 delete mode 100644 test/references/test_projection_2d1d_fem_box_1d.csv
 delete mode 100644 test/references/test_projection_2d1d_fem_box_2d.csv
 delete mode 100644 test/references/test_projection_2d1d_fem_fem_1d.csv
 delete mode 100644 test/references/test_projection_2d1d_fem_fem_2d.csv
 delete mode 100644 test/references/test_projection_2d1d_fem_tpfa_1d.csv
 delete mode 100644 test/references/test_projection_2d1d_fem_tpfa_2d.csv
 delete mode 100644 test/references/test_projection_2d1d_tpfa_box_1d.csv
 delete mode 100644 test/references/test_projection_2d1d_tpfa_box_2d.csv
 delete mode 100644 test/references/test_projection_2d1d_tpfa_fem_1d.csv
 delete mode 100644 test/references/test_projection_2d1d_tpfa_fem_2d.csv
 delete mode 100644 test/references/test_projection_2d1d_tpfa_tpfa_1d.csv
 delete mode 100644 test/references/test_projection_2d1d_tpfa_tpfa_2d.csv

diff --git a/dumux/discretization/projection/projector.hh b/dumux/discretization/projection/projector.hh
index e17283efa9..9b74c78099 100644
--- a/dumux/discretization/projection/projector.hh
+++ b/dumux/discretization/projection/projector.hh
@@ -30,6 +30,7 @@
 #ifndef DUMUX_DISCRETIZATION_PROJECTOR_HH
 #define DUMUX_DISCRETIZATION_PROJECTOR_HH
 
+#include <algorithm>
 #include <string>
 #include <utility>
 #include <type_traits>
@@ -41,6 +42,8 @@
 
 #include <dune/geometry/quadraturerules.hh>
 #include <dune/istl/matrixindexset.hh>
+#include <dune/istl/bcrsmatrix.hh>
+#include <dune/istl/bvector.hh>
 
 #include <dumux/common/parameters.hh>
 #include <dumux/linear/seqsolverbackend.hh>
@@ -58,13 +61,13 @@ namespace Dumux {
 template<class ScalarType>
 class Projector
 {
-    using BlockType = Dune::FieldMatrix<ScalarType, 1, 1>;
+    using MatrixBlockType = Dune::FieldMatrix<ScalarType, 1, 1>;
 
 public:
     //! Export the scalar type
     using Scalar = ScalarType;
     //! Export the type of the projection matrices
-    using Matrix = Dune::BCRSMatrix< BlockType >;
+    using Matrix = Dune::BCRSMatrix< MatrixBlockType >;
 
     //! Parameters that can be passed to project()
     struct Params
@@ -89,16 +92,16 @@ public:
     /*!
      * \brief Project a solution u into up
      * \param u The solution living on the domain space
-     * \param up The projection of u into the target space
+     * \return The projection of u into the target space
      */
-    template< class DomainSolution, class TargetSolution>
-    void project(const DomainSolution& u, TargetSolution& up, const Params& params = Params{}) const
+    template< class BlockType, std::enable_if_t<std::is_convertible<BlockType, ScalarType>::value, int> = 0 >
+    Dune::BlockVector<BlockType> project(const Dune::BlockVector<BlockType>& u, const Params& params = Params{}) const
     {
         // be picky about size of u
         if ( u.size() != projMat_.M())
             DUNE_THROW(Dune::InvalidStateException, "Vector size mismatch" );
 
-        up.resize(massMat_.N());
+        Dune::BlockVector<BlockType> up(massMat_.N());
 
         auto rhs = up;
         projMat_.mv(u, rhs);
@@ -107,6 +110,31 @@ public:
         solver.setResidualReduction(params.residualReduction);
         solver.setMaxIter(params.maxIterations);
         solver.solve(massMat_, up, rhs);
+
+        return up;
+    }
+
+    /*!
+     * \brief Project a solution u into up
+     * \param u The solution living on the domain space
+     * \return The projection of u into the target space
+     */
+    template< class BlockType, std::enable_if_t<!std::is_convertible<BlockType, ScalarType>::value, int> = 0 >
+    Dune::BlockVector<BlockType> project(const Dune::BlockVector<BlockType>& u, const Params& params = Params{}) const
+    {
+        Dune::BlockVector<BlockType> result(massMat_.N());
+
+        for (int pvIdx = 0; pvIdx < BlockType::size(); ++pvIdx)
+        {
+            Dune::BlockVector<Dune::FieldVector<Scalar, 1>> tmp(u.size());
+            std::transform(u.begin(), u.end(), tmp.begin(), [pvIdx] (const auto& v) { return v[pvIdx]; });
+
+            const auto p = project(tmp, params);
+            for (std::size_t i = 0; i < p.size(); ++i)
+                result[i][pvIdx] = p[i];
+        }
+
+        return result;
     }
 
     /*!
diff --git a/test/common/functions/test_function_l2norm.cc b/test/common/functions/test_function_l2norm.cc
index baaba12f26..25ce705c41 100644
--- a/test/common/functions/test_function_l2norm.cc
+++ b/test/common/functions/test_function_l2norm.cc
@@ -5,6 +5,7 @@
 
 #include <dune/functions/functionspacebases/interpolate.hh>
 #include <dune/functions/functionspacebases/lagrangebasis.hh>
+#include <dune/functions/functionspacebases/powerbasis.hh>
 #include <dune/functions/gridfunctions/analyticgridviewfunction.hh>
 #include <dune/functions/gridfunctions/discreteglobalbasisfunction.hh>
 
@@ -37,10 +38,11 @@ int main (int argc, char *argv[]) try
     const auto gvCoarse = gridManagerCoarse.grid().leafGridView();
 
     // get some types
-    using R = Dune::FieldVector<double, 1>;
+    using R = Dune::FieldVector<double, 2>;
     using SolutionVector = Dune::BlockVector<R>;
     using GridView = Grid::LeafGridView;
     using namespace Dune::Functions;
+    using namespace Dune::Functions::BasisFactory;
     using P2 = LagrangeBasis<GridView, 2>;
 
     // construct glue, any grid geometry should be fine here
@@ -48,21 +50,24 @@ int main (int argc, char *argv[]) try
     auto glue = makeGlue(ggFine, ggCoarse);
 
     // a quadratic function on the grid
-    auto f = [](const auto& pos){ return pos.two_norm2(); };
+    auto f = [&] (const auto& pos) -> R { return {pos.two_norm2(), pos[0]*pos[0]*pos[1]}; };
 
     // make bases
-    P2 basisCoarse(gvCoarse), basisFine(gvFine);
     SolutionVector solCoarse, solFine;
-    interpolate(basisCoarse, solCoarse, f);
-    interpolate(basisFine, solFine, f);
+    interpolate(makeBasis(gvCoarse, power<2>(lagrange<2>())), solCoarse, f);
+    interpolate(makeBasis(gvFine, power<2>(lagrange<2>())), solFine, f);
+
+    P2 basisCoarse(gvCoarse), basisFine(gvFine);
     auto gfCoarse = makeDiscreteGlobalBasisFunction<R>(basisCoarse, solCoarse);
     auto gfFine = makeDiscreteGlobalBasisFunction<R>(basisFine, solFine);
 
     // project fine discrete function onto coarse grid and convert back to grid function
     const auto projector = Dumux::makeProjector(basisFine, basisCoarse, glue);
-    SolutionVector solCoarse2;
-    projector.project(solFine, solCoarse2);
-    auto gfCoarse2 = makeDiscreteGlobalBasisFunction<R>(basisCoarse, solCoarse);
+    auto params = projector.defaultParams();
+    params.residualReduction = 1e-16;
+
+    auto solCoarse2 = projector.project(solFine, params);
+    auto gfCoarse2 = makeDiscreteGlobalBasisFunction<R>(basisCoarse, solCoarse2);
 
     // check that these functions are identical and that they exactly represent the analytical function
     auto l2norm = Dumux::integrateL2Error(gvCoarse, gfCoarse, gfCoarse2, 3);
@@ -75,15 +80,16 @@ int main (int argc, char *argv[]) try
 
     // check the FV-style interface of integrateL2Error
     Dumux::BoxFVGridGeometry<double, GridView> ggBoxCoarse(gvCoarse), ggBoxFine(gvFine);
-    auto p1BasisCoarse = Dumux::getFunctionSpaceBasis(ggBoxCoarse);
-    auto p1BasisFine = Dumux::getFunctionSpaceBasis(ggBoxFine);
-    auto f2 = [](const auto& pos){ return pos[0]; };
-    interpolate(p1BasisFine, solFine, f2);
-    interpolate(p1BasisCoarse, solCoarse, f2);
+    auto f2 = [&] (const auto& pos) -> R { return {pos[0] + pos[1], pos[0]*pos[1]}; };
+
+    interpolate(makeBasis(gvFine, power<2>(lagrange<1>())), solFine, f2);
+    interpolate(makeBasis(gvCoarse, power<2>(lagrange<1>())), solCoarse, f2);
 
     // project fine discrete function onto coarse grid
+    auto p1BasisCoarse = Dumux::getFunctionSpaceBasis(ggBoxCoarse);
+    auto p1BasisFine = Dumux::getFunctionSpaceBasis(ggBoxFine);
     const auto projector2 = Dumux::makeProjector(p1BasisFine, p1BasisCoarse, glue);
-    projector2.project(solFine, solCoarse2);
+    solCoarse2 = projector2.project(solFine, params);
 
     l2norm = Dumux::integrateL2Error(ggBoxCoarse, solCoarse, solCoarse2, 3);
     if (l2norm > 1e-14)
diff --git a/test/discretization/projection/CMakeLists.txt b/test/discretization/projection/CMakeLists.txt
index cec331a494..82408a450a 100644
--- a/test/discretization/projection/CMakeLists.txt
+++ b/test/discretization/projection/CMakeLists.txt
@@ -3,39 +3,4 @@ dune_symlink_to_source_files(FILES "params.input")
 dune_add_test(NAME test_projection_2d1d
               SOURCES test_projection_2d1d.cc
               CMAKE_GUARD "( dune-foamgrid_FOUND AND dune-functions_FOUND )"
-              LABELS unit discretization
-              COMMAND ${CMAKE_SOURCE_DIR}/bin/testing/runtest.py
-              CMD_ARGS  --script fuzzyData
-                        --files ${CMAKE_SOURCE_DIR}/test/references/test_projection_2d1d_tpfa_tpfa_1d.csv
-                                ${CMAKE_CURRENT_BINARY_DIR}/1d_tpfa_tpfa.csv
-                                ${CMAKE_SOURCE_DIR}/test/references/test_projection_2d1d_tpfa_tpfa_2d.csv
-                                ${CMAKE_CURRENT_BINARY_DIR}/2d_tpfa_tpfa.csv
-                                ${CMAKE_SOURCE_DIR}/test/references/test_projection_2d1d_box_box_1d.csv
-                                ${CMAKE_CURRENT_BINARY_DIR}/1d_box_box.csv
-                                ${CMAKE_SOURCE_DIR}/test/references/test_projection_2d1d_box_box_2d.csv
-                                ${CMAKE_CURRENT_BINARY_DIR}/2d_box_box.csv
-                                ${CMAKE_SOURCE_DIR}/test/references/test_projection_2d1d_fem_fem_1d.csv
-                                ${CMAKE_CURRENT_BINARY_DIR}/1d_fem_fem.csv
-                                ${CMAKE_SOURCE_DIR}/test/references/test_projection_2d1d_fem_fem_2d.csv
-                                ${CMAKE_CURRENT_BINARY_DIR}/2d_fem_fem.csv
-                                ${CMAKE_SOURCE_DIR}/test/references/test_projection_2d1d_tpfa_box_1d.csv
-                                ${CMAKE_CURRENT_BINARY_DIR}/1d_tpfa_box.csv
-                                ${CMAKE_SOURCE_DIR}/test/references/test_projection_2d1d_tpfa_box_2d.csv
-                                ${CMAKE_CURRENT_BINARY_DIR}/2d_tpfa_box.csv
-                                ${CMAKE_SOURCE_DIR}/test/references/test_projection_2d1d_box_tpfa_1d.csv
-                                ${CMAKE_CURRENT_BINARY_DIR}/1d_box_tpfa.csv
-                                ${CMAKE_SOURCE_DIR}/test/references/test_projection_2d1d_box_tpfa_2d.csv
-                                ${CMAKE_CURRENT_BINARY_DIR}/2d_box_tpfa.csv
-                                ${CMAKE_SOURCE_DIR}/test/references/test_projection_2d1d_fem_box_2d.csv
-                                ${CMAKE_CURRENT_BINARY_DIR}/2d_fem_box.csv
-                                ${CMAKE_SOURCE_DIR}/test/references/test_projection_2d1d_fem_box_1d.csv
-                                ${CMAKE_CURRENT_BINARY_DIR}/1d_fem_box.csv
-                                ${CMAKE_SOURCE_DIR}/test/references/test_projection_2d1d_fem_tpfa_2d.csv
-                                ${CMAKE_CURRENT_BINARY_DIR}/2d_fem_tpfa.csv
-                                ${CMAKE_SOURCE_DIR}/test/references/test_projection_2d1d_fem_tpfa_1d.csv
-                                ${CMAKE_CURRENT_BINARY_DIR}/1d_fem_tpfa.csv
-                                ${CMAKE_SOURCE_DIR}/test/references/test_projection_2d1d_tpfa_fem_2d.csv
-                                ${CMAKE_CURRENT_BINARY_DIR}/2d_tpfa_fem.csv
-                                ${CMAKE_SOURCE_DIR}/test/references/test_projection_2d1d_tpfa_fem_1d.csv
-                                ${CMAKE_CURRENT_BINARY_DIR}/1d_tpfa_fem.csv
-                       --command "${CMAKE_CURRENT_BINARY_DIR}/test_projection_2d1d params.input")
+              LABELS unit discretization)
diff --git a/test/discretization/projection/test_projection_2d1d.cc b/test/discretization/projection/test_projection_2d1d.cc
index 16dd7b0038..b7e9bb4c0e 100644
--- a/test/discretization/projection/test_projection_2d1d.cc
+++ b/test/discretization/projection/test_projection_2d1d.cc
@@ -41,6 +41,7 @@
 
 #include <dumux/io/container.hh>
 #include <dumux/common/parameters.hh>
+#include <dumux/common/integrate.hh>
 
 #include <dumux/discretization/box/fvgridgeometry.hh>
 #include <dumux/discretization/fem/fegridgeometry.hh>
@@ -59,59 +60,8 @@ void writeProjection(const GridGeometry1& gg1, const GridGeometry2& gg2,
     const auto& forwardProjector = projectors.first;
     const auto& backwardProjector = projectors.second;
 
-    SolutionVector p2_1, p1_2;
-    forwardProjector.project(sol1, p2_1);
-    backwardProjector.project(sol2, p1_2);
-
-    const std::string filename1 = "2d_" + acro1 + "_" + acro2;
-    const std::string filename2 = "1d_" + acro1 + "_" + acro2;
-
-    Dumux::writeContainerToFile(p1_2, filename1 + ".csv");
-    Dumux::writeContainerToFile(p2_1, filename2 + ".csv");
-
-    static const bool writeVtk = Dumux::getParam<bool>("Vtk.EnableOutput", false);
-    if (writeVtk)
-    {
-        using namespace Dune;
-        VTKWriter<typename GridGeometry1::GridView> writer1(gg1.gridView());
-        VTKWriter<typename GridGeometry2::GridView> writer2(gg2.gridView());
-
-        const auto& basis1 = Dumux::getFunctionSpaceBasis(gg1);
-        const auto& basis2 = Dumux::getFunctionSpaceBasis(gg2);
-
-        const auto uInfo = VTK::FieldInfo("u", VTK::FieldInfo::Type::scalar, 1);
-        const auto upInfo = VTK::FieldInfo("u_p", VTK::FieldInfo::Type::scalar, 1);
-
-        const auto uFunction1 = Functions::makeDiscreteGlobalBasisFunction<Scalar>(basis1, sol1);
-        const auto uFunction2 = Functions::makeDiscreteGlobalBasisFunction<Scalar>(basis2, sol2);
-        const auto upFunction1 = Functions::makeDiscreteGlobalBasisFunction<Scalar>(basis1, p1_2);
-        const auto upFunction2 = Functions::makeDiscreteGlobalBasisFunction<Scalar>(basis2, p2_1);
-
-        if (GridGeometry1::discMethod == Dumux::DiscretizationMethod::cctpfa)
-        {
-            writer1.addCellData(uFunction1, uInfo);
-            writer1.addCellData(upFunction1, upInfo);
-        }
-        else
-        {
-            writer1.addVertexData(uFunction1, uInfo);
-            writer1.addVertexData(upFunction1, upInfo);
-        }
-
-        if (GridGeometry2::discMethod == Dumux::DiscretizationMethod::cctpfa)
-        {
-            writer2.addCellData(uFunction2, uInfo);
-            writer2.addCellData(upFunction2, upInfo);
-        }
-        else
-        {
-            writer2.addVertexData(uFunction2, uInfo);
-            writer2.addVertexData(upFunction2, upInfo);
-        }
-
-        writer1.write(filename1);
-        writer2.write(filename2);
-    }
+    const auto p2_1 = forwardProjector.project(sol1, p2_1);
+    const auto p1_2 = backwardProjector.project(sol2, p1_2);
 }
 
 int main (int argc, char *argv[]) try
@@ -127,16 +77,11 @@ int main (int argc, char *argv[]) try
 
     using GridView1 = typename Grid1::LeafGridView;
     using GridView2 = typename Grid2::LeafGridView;
-    using FEBasis1 = Dune::Functions::LagrangeBasis<GridView1, 1>;
-    using FEBasis2 = Dune::Functions::LagrangeBasis<GridView2, 1>;
+    using FEBasis1 = Dune::Functions::LagrangeBasis<GridView1, 2>;
+    using FEBasis2 = Dune::Functions::LagrangeBasis<GridView2, 2>;
 
     using Scalar = double;
-    using TpfaGridGeometry1 = Dumux::CCTpfaFVGridGeometry<GridView1>;
-    using BoxGridGeometry1 = Dumux::BoxFVGridGeometry<Scalar, GridView1>;
     using FEGridGeometry1 = Dumux::FEGridGeometry<FEBasis1>;
-
-    using TpfaGridGeometry2 = Dumux::CCTpfaFVGridGeometry<GridView2>;
-    using BoxGridGeometry2 = Dumux::BoxFVGridGeometry<Scalar, GridView2>;
     using FEGridGeometry2 = Dumux::FEGridGeometry<FEBasis2>;
 
     // make the 2d grid
@@ -148,60 +93,91 @@ int main (int argc, char *argv[]) try
 
     // make the 1d grid
     GlobalPosition lower2({0., 0.5});
-    GlobalPosition upper2({1. ,0.5});
+    GlobalPosition upper2({1., 0.5});
     std::array<unsigned int, 1> els2{{13}};
     std::shared_ptr<Grid2> grid2 = Dune::StructuredGridFactory<Grid2>::createSimplexGrid(lower2, upper2, els2);
 
-    Dune::Functions::LagrangeBasis<GridView1, 0> q0Basis1(grid1->leafGridView());
-    Dune::Functions::LagrangeBasis<GridView2, 0> q0Basis2(grid2->leafGridView());
-    Dune::Functions::LagrangeBasis<GridView1, 1> q1Basis1(grid1->leafGridView());
-    Dune::Functions::LagrangeBasis<GridView2, 1> q1Basis2(grid2->leafGridView());
-
-    // create all grid geometries
-    TpfaGridGeometry1 tpfaGridGeometry1(grid1->leafGridView());
-    BoxGridGeometry1 boxGridGeometry1(grid1->leafGridView());
+    // create grid geometries
     FEGridGeometry1 feGridGeometry1(std::make_shared<FEBasis1>(grid1->leafGridView()));
-
-    TpfaGridGeometry2 tpfaGridGeometry2(grid2->leafGridView());
-    BoxGridGeometry2 boxGridGeometry2(grid2->leafGridView());
     FEGridGeometry2 feGridGeometry2(std::make_shared<FEBasis2>(grid2->leafGridView()));
 
+    // create solution vectors
+    using BlockType = Dune::FieldVector<Scalar, 1>;
+    using SolutionVector = Dune::BlockVector< BlockType >;
+    SolutionVector sol1;
+    SolutionVector sol2;
+
     // function to distribute on grids
-    auto evalFunction1 = [] (const auto& pos)
-    { return std::sin(2*M_PI*pos[0])*std::cos(4*M_PI*pos[1]); };
-    auto evalFunction2 = [] (const auto& pos)
-    { return std::cos(4*M_PI*(pos[0] - M_PI))*std::sin(2*M_PI*(pos[1]-M_PI/2.0)); };
+    auto f = [] (const auto& pos) -> BlockType { return {pos.two_norm2()}; };
 
-    // create solution vectors
-    using SolutionVector = Dune::BlockVector< Dune::FieldVector<Scalar, 1> >;
-    SolutionVector sol2d_tpfa, sol2d_box, sol2d_fem;
-    SolutionVector sol1d_tpfa, sol1d_box, sol1d_fem;
-
-    Dune::Functions::interpolate(q0Basis1, sol2d_tpfa, evalFunction1);
-    Dune::Functions::interpolate(q0Basis2, sol1d_tpfa, evalFunction2);
-
-    Dune::Functions::interpolate(q1Basis1, sol2d_box, evalFunction1);
-    Dune::Functions::interpolate(q1Basis2, sol1d_box, evalFunction2);
-
-    Dune::Functions::interpolate(feGridGeometry1.feBasis(), sol2d_fem, evalFunction1);
-    Dune::Functions::interpolate(feGridGeometry2.feBasis(), sol1d_fem, evalFunction2);
-
-    // tpfa - tpfa
-    writeProjection<Scalar>(tpfaGridGeometry1, tpfaGridGeometry2, sol2d_tpfa, sol1d_tpfa, "tpfa", "tpfa");
-    // box - box
-    writeProjection<Scalar>(boxGridGeometry1, boxGridGeometry2, sol2d_box, sol1d_box, "box", "box");
-    // fem - fem
-    writeProjection<Scalar>(feGridGeometry1, feGridGeometry2, sol2d_fem, sol1d_fem, "fem", "fem");
-    // box - tpfa
-    writeProjection<Scalar>(boxGridGeometry1, tpfaGridGeometry2, sol2d_box, sol1d_tpfa, "box", "tpfa");
-    // tpfa - box
-    writeProjection<Scalar>(tpfaGridGeometry1, boxGridGeometry2, sol2d_tpfa, sol1d_box, "tpfa", "box");
-    // fem - tpfa
-    writeProjection<Scalar>(feGridGeometry1, tpfaGridGeometry2, sol2d_fem, sol1d_tpfa, "fem", "tpfa");
-    // fem - box
-    writeProjection<Scalar>(feGridGeometry1, boxGridGeometry2, sol2d_fem, sol1d_box, "fem", "box");
-    // tpfa - fem
-    writeProjection<Scalar>(tpfaGridGeometry1, feGridGeometry2, sol2d_tpfa, sol1d_fem, "tpfa", "fem");
+    Dune::Functions::interpolate(feGridGeometry1.feBasis(), sol1, f);
+    Dune::Functions::interpolate(feGridGeometry2.feBasis(), sol2, f);
+
+    // make projections and check them
+    const auto projectors = Dumux::makeProjectorPair( feGridGeometry1.feBasis(),
+                                                      feGridGeometry2.feBasis(),
+                                                      makeGlue(feGridGeometry1, feGridGeometry2) );
+    const auto& forwardProjector = projectors.first;
+    const auto& backwardProjector = projectors.second;
+
+    auto params = forwardProjector.defaultParams();
+    params.residualReduction = 1e-16;
+
+    const auto p12 = forwardProjector.project(sol1, params);
+    const auto p21 = backwardProjector.project(sol2, params);
+
+    using namespace Dune::Functions;
+
+    auto af1 = makeAnalyticGridViewFunction(f, feGridGeometry1.gridView());
+    auto af2 = makeAnalyticGridViewFunction(f, feGridGeometry2.gridView());
+
+    auto gf1 = makeDiscreteGlobalBasisFunction<BlockType>(feGridGeometry1.feBasis(), p21);
+    auto gf2 = makeDiscreteGlobalBasisFunction<BlockType>(feGridGeometry2.feBasis(), p12);
+
+    if (Dumux::getParam<bool>("Vtk.EnableOutput", false))
+    {
+        Dune::VTKWriter<typename FEGridGeometry1::GridView> writer1(feGridGeometry1.gridView());
+        Dune::VTKWriter<typename FEGridGeometry2::GridView> writer2(feGridGeometry2.gridView());
+
+        const auto fieldInfoAnalytic = Dune::VTK::FieldInfo({"u", Dune::VTK::FieldInfo::Type::scalar, 1});
+        const auto fieldInfoProjected = Dune::VTK::FieldInfo({"u_p", Dune::VTK::FieldInfo::Type::scalar, 1});
+
+        writer1.addVertexData(af1, fieldInfoAnalytic);
+        writer1.addVertexData(gf1, fieldInfoProjected);
+
+        writer2.addVertexData(af2, fieldInfoAnalytic);
+        writer2.addVertexData(gf2, fieldInfoProjected);
+
+        writer1.write("sol_2d");
+        writer2.write("sol_1d");
+    }
+
+    // make sure that solution projected on 2d grid is "exact" on the intersecting edges
+    for (const auto& element : elements(feGridGeometry1.gridView()))
+    {
+        auto lf1 = localFunction(gf1);
+        lf1.bind(element);
+
+        for (const auto& is : intersections(feGridGeometry1.gridView(), element))
+        {
+            const auto isGeom = is.geometry();
+            const auto p = isGeom.center();
+
+            if (p[1] > 0.5 - 1e-6 && p[1] < 0.5 + 1e-6)
+            {
+                const auto error = lf1(element.geometry().local(p)) - f(p);
+
+                using std::sqrt;
+                if ( sqrt(error*error) > 1e-14 )
+                    DUNE_THROW(Dune::MathError, "Error norm on 2d grid too high (" << sqrt(error*error) << ")!");
+            }
+        }
+    }
+
+    // one-dimensional solution should still be "exact"
+    const auto l2Norm = Dumux::integrateL2Error( feGridGeometry2.gridView(), af2, gf2, 3);
+    if ( l2Norm > 1e-14 )
+        DUNE_THROW(Dune::MathError, "Error norm on 1d grid too high!");
 
     return 0;
 }
diff --git a/test/references/test_projection_2d1d_box_box_1d.csv b/test/references/test_projection_2d1d_box_box_1d.csv
deleted file mode 100644
index 6f79a83904..0000000000
--- a/test/references/test_projection_2d1d_box_box_1d.csv
+++ /dev/null
@@ -1,14 +0,0 @@
-1.507142e-01
-4.422696e-01
-7.796350e-01
-9.409501e-01
-8.891607e-01
-6.289358e-01
-2.258410e-01
--2.258410e-01
--6.289358e-01
--8.891607e-01
--9.409501e-01
--7.796350e-01
--4.422696e-01
--1.507142e-01
diff --git a/test/references/test_projection_2d1d_box_box_2d.csv b/test/references/test_projection_2d1d_box_box_2d.csv
deleted file mode 100644
index 6197ca93b3..0000000000
--- a/test/references/test_projection_2d1d_box_box_2d.csv
+++ /dev/null
@@ -1,121 +0,0 @@
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
--7.637070e-02
--3.016355e-01
--2.583696e-01
-1.419646e-01
-3.462732e-01
-7.198979e-02
--3.016499e-01
--2.587126e-01
-1.419077e-01
-3.460640e-01
-2.207074e-01
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
diff --git a/test/references/test_projection_2d1d_box_tpfa_1d.csv b/test/references/test_projection_2d1d_box_tpfa_1d.csv
deleted file mode 100644
index 5035330ff9..0000000000
--- a/test/references/test_projection_2d1d_box_tpfa_1d.csv
+++ /dev/null
@@ -1,13 +0,0 @@
-2.260713e-01
-6.359015e-01
-9.007574e-01
-9.496593e-01
-7.833929e-01
-4.486884e-01
-1.608432e-16
--4.486884e-01
--7.833929e-01
--9.496593e-01
--9.007574e-01
--6.359015e-01
--2.260713e-01
diff --git a/test/references/test_projection_2d1d_box_tpfa_2d.csv b/test/references/test_projection_2d1d_box_tpfa_2d.csv
deleted file mode 100644
index c68fe4ee3e..0000000000
--- a/test/references/test_projection_2d1d_box_tpfa_2d.csv
+++ /dev/null
@@ -1,121 +0,0 @@
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
--1.322347e-01
--3.147229e-01
--2.684315e-01
-1.457959e-01
-3.607137e-01
-7.450318e-02
--3.129911e-01
--2.681667e-01
-1.480351e-01
-3.600225e-01
-2.827186e-01
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
diff --git a/test/references/test_projection_2d1d_fem_box_1d.csv b/test/references/test_projection_2d1d_fem_box_1d.csv
deleted file mode 100644
index 6f79a83904..0000000000
--- a/test/references/test_projection_2d1d_fem_box_1d.csv
+++ /dev/null
@@ -1,14 +0,0 @@
-1.507142e-01
-4.422696e-01
-7.796350e-01
-9.409501e-01
-8.891607e-01
-6.289358e-01
-2.258410e-01
--2.258410e-01
--6.289358e-01
--8.891607e-01
--9.409501e-01
--7.796350e-01
--4.422696e-01
--1.507142e-01
diff --git a/test/references/test_projection_2d1d_fem_box_2d.csv b/test/references/test_projection_2d1d_fem_box_2d.csv
deleted file mode 100644
index 6197ca93b3..0000000000
--- a/test/references/test_projection_2d1d_fem_box_2d.csv
+++ /dev/null
@@ -1,121 +0,0 @@
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
--7.637070e-02
--3.016355e-01
--2.583696e-01
-1.419646e-01
-3.462732e-01
-7.198979e-02
--3.016499e-01
--2.587126e-01
-1.419077e-01
-3.460640e-01
-2.207074e-01
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
diff --git a/test/references/test_projection_2d1d_fem_fem_1d.csv b/test/references/test_projection_2d1d_fem_fem_1d.csv
deleted file mode 100644
index 6f79a83904..0000000000
--- a/test/references/test_projection_2d1d_fem_fem_1d.csv
+++ /dev/null
@@ -1,14 +0,0 @@
-1.507142e-01
-4.422696e-01
-7.796350e-01
-9.409501e-01
-8.891607e-01
-6.289358e-01
-2.258410e-01
--2.258410e-01
--6.289358e-01
--8.891607e-01
--9.409501e-01
--7.796350e-01
--4.422696e-01
--1.507142e-01
diff --git a/test/references/test_projection_2d1d_fem_fem_2d.csv b/test/references/test_projection_2d1d_fem_fem_2d.csv
deleted file mode 100644
index 6197ca93b3..0000000000
--- a/test/references/test_projection_2d1d_fem_fem_2d.csv
+++ /dev/null
@@ -1,121 +0,0 @@
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
--7.637070e-02
--3.016355e-01
--2.583696e-01
-1.419646e-01
-3.462732e-01
-7.198979e-02
--3.016499e-01
--2.587126e-01
-1.419077e-01
-3.460640e-01
-2.207074e-01
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
diff --git a/test/references/test_projection_2d1d_fem_tpfa_1d.csv b/test/references/test_projection_2d1d_fem_tpfa_1d.csv
deleted file mode 100644
index 5035330ff9..0000000000
--- a/test/references/test_projection_2d1d_fem_tpfa_1d.csv
+++ /dev/null
@@ -1,13 +0,0 @@
-2.260713e-01
-6.359015e-01
-9.007574e-01
-9.496593e-01
-7.833929e-01
-4.486884e-01
-1.608432e-16
--4.486884e-01
--7.833929e-01
--9.496593e-01
--9.007574e-01
--6.359015e-01
--2.260713e-01
diff --git a/test/references/test_projection_2d1d_fem_tpfa_2d.csv b/test/references/test_projection_2d1d_fem_tpfa_2d.csv
deleted file mode 100644
index c68fe4ee3e..0000000000
--- a/test/references/test_projection_2d1d_fem_tpfa_2d.csv
+++ /dev/null
@@ -1,121 +0,0 @@
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
--1.322347e-01
--3.147229e-01
--2.684315e-01
-1.457959e-01
-3.607137e-01
-7.450318e-02
--3.129911e-01
--2.681667e-01
-1.480351e-01
-3.600225e-01
-2.827186e-01
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
diff --git a/test/references/test_projection_2d1d_tpfa_box_1d.csv b/test/references/test_projection_2d1d_tpfa_box_1d.csv
deleted file mode 100644
index d5785cd2cb..0000000000
--- a/test/references/test_projection_2d1d_tpfa_box_1d.csv
+++ /dev/null
@@ -1,14 +0,0 @@
-2.500000e-01
-3.491046e-01
-6.486663e-01
-7.804329e-01
-7.170844e-01
-5.250658e-01
-1.955902e-01
--1.955902e-01
--5.250658e-01
--7.170844e-01
--7.804329e-01
--6.486663e-01
--3.491046e-01
--2.500000e-01
diff --git a/test/references/test_projection_2d1d_tpfa_box_2d.csv b/test/references/test_projection_2d1d_tpfa_box_2d.csv
deleted file mode 100644
index 8164eac7cd..0000000000
--- a/test/references/test_projection_2d1d_tpfa_box_2d.csv
+++ /dev/null
@@ -1,100 +0,0 @@
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
--1.522871e-01
--3.678820e-01
--7.734819e-02
-3.249741e-01
-2.748287e-01
--1.506308e-01
--3.730112e-01
--7.651990e-02
-3.204851e-01
-2.773912e-01
--1.522871e-01
--3.678820e-01
--7.734819e-02
-3.249741e-01
-2.748287e-01
--1.506308e-01
--3.730112e-01
--7.651990e-02
-3.204851e-01
-2.773912e-01
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
diff --git a/test/references/test_projection_2d1d_tpfa_fem_1d.csv b/test/references/test_projection_2d1d_tpfa_fem_1d.csv
deleted file mode 100644
index d5785cd2cb..0000000000
--- a/test/references/test_projection_2d1d_tpfa_fem_1d.csv
+++ /dev/null
@@ -1,14 +0,0 @@
-2.500000e-01
-3.491046e-01
-6.486663e-01
-7.804329e-01
-7.170844e-01
-5.250658e-01
-1.955902e-01
--1.955902e-01
--5.250658e-01
--7.170844e-01
--7.804329e-01
--6.486663e-01
--3.491046e-01
--2.500000e-01
diff --git a/test/references/test_projection_2d1d_tpfa_fem_2d.csv b/test/references/test_projection_2d1d_tpfa_fem_2d.csv
deleted file mode 100644
index 8164eac7cd..0000000000
--- a/test/references/test_projection_2d1d_tpfa_fem_2d.csv
+++ /dev/null
@@ -1,100 +0,0 @@
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
--1.522871e-01
--3.678820e-01
--7.734819e-02
-3.249741e-01
-2.748287e-01
--1.506308e-01
--3.730112e-01
--7.651990e-02
-3.204851e-01
-2.773912e-01
--1.522871e-01
--3.678820e-01
--7.734819e-02
-3.249741e-01
-2.748287e-01
--1.506308e-01
--3.730112e-01
--7.651990e-02
-3.204851e-01
-2.773912e-01
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
diff --git a/test/references/test_projection_2d1d_tpfa_tpfa_1d.csv b/test/references/test_projection_2d1d_tpfa_tpfa_1d.csv
deleted file mode 100644
index f5b02f9059..0000000000
--- a/test/references/test_projection_2d1d_tpfa_tpfa_1d.csv
+++ /dev/null
@@ -1,13 +0,0 @@
-2.500000e-01
-5.331559e-01
-7.163119e-01
-7.935661e-01
-6.545085e-01
-3.309017e-01
--8.413409e-17
--3.309017e-01
--6.545085e-01
--7.935661e-01
--7.163119e-01
--5.331559e-01
--2.500000e-01
diff --git a/test/references/test_projection_2d1d_tpfa_tpfa_2d.csv b/test/references/test_projection_2d1d_tpfa_tpfa_2d.csv
deleted file mode 100644
index dd3b221824..0000000000
--- a/test/references/test_projection_2d1d_tpfa_tpfa_2d.csv
+++ /dev/null
@@ -1,100 +0,0 @@
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
--1.837861e-01
--3.788640e-01
--9.653650e-02
-3.406744e-01
-2.786035e-01
--1.478096e-01
--3.870042e-01
--6.424080e-02
-3.288829e-01
-3.100804e-01
--1.837861e-01
--3.788640e-01
--9.653650e-02
-3.406744e-01
-2.786035e-01
--1.478096e-01
--3.870042e-01
--6.424080e-02
-3.288829e-01
-3.100804e-01
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-0.000000e+00
-- 
GitLab