From 0378a976efc7bb701c576a10fcf81528370ac01b Mon Sep 17 00:00:00 2001
From: Christian Engwer <christi@dune-project.org>
Date: Tue, 20 Mar 2012 20:48:57 +0000
Subject: [PATCH] remove expression template support, until it is properly
 implemented

[[Imported from SVN: r6596]]
---
 configure.ac                      |    1 -
 dune/common/Makefile.am           |    9 +-
 dune/common/exprtmpl.cc           |    6 -
 dune/common/exprtmpl.hh           | 1105 -----------------------------
 dune/common/exprtmpl/Makefile.am  |    7 -
 dune/common/exprtmpl/exprexpr.inc |  136 ----
 dune/common/exprtmpl/norm.inc     |   74 --
 dune/common/exprtmpl/scalar.inc   |  185 -----
 m4/Makefile.am                    |    1 -
 m4/dune_common.m4                 |    1 -
 m4/dune_exprtmpl.m4               |   10 -
 11 files changed, 1 insertion(+), 1534 deletions(-)
 delete mode 100644 dune/common/exprtmpl.cc
 delete mode 100644 dune/common/exprtmpl.hh
 delete mode 100644 dune/common/exprtmpl/Makefile.am
 delete mode 100644 dune/common/exprtmpl/exprexpr.inc
 delete mode 100644 dune/common/exprtmpl/norm.inc
 delete mode 100644 dune/common/exprtmpl/scalar.inc
 delete mode 100644 m4/dune_exprtmpl.m4

diff --git a/configure.ac b/configure.ac
index 7ccb73ca8..68102c62c 100644
--- a/configure.ac
+++ b/configure.ac
@@ -25,7 +25,6 @@ AC_CONFIG_FILES([Makefile
      dune/Makefile
      dune/common/Makefile
      dune/common/test/Makefile
-     dune/common/exprtmpl/Makefile
      dune/common/parallel/Makefile
      dune/common/parallel/test/Makefile
      doc/Makefile
diff --git a/dune/common/Makefile.am b/dune/common/Makefile.am
index 31888bbdc..a347cdfef 100644
--- a/dune/common/Makefile.am
+++ b/dune/common/Makefile.am
@@ -1,6 +1,6 @@
 # $Id$
 
-SUBDIRS = . test exprtmpl parallel
+SUBDIRS = . test parallel
 
 # the standard debug streams are put into the libdune
 noinst_LTLIBRARIES = libcommon.la
@@ -83,11 +83,4 @@ commoninclude_HEADERS = 			\
 	unused.hh				\
 	version.hh
 
-if EXPRESSIONTEMPLATES
-commoninclude_HEADERS += exprtmpl.hh exprtmpl/scalar.inc exprtmpl/exprexpr.inc
-libcommon_la_SOURCES += exprtmpl.cc
-else
-sourcescheck_NOSOURCES = exprtmpl.hh exprtmpl.cc
-endif
-
 include $(top_srcdir)/am/global-rules
diff --git a/dune/common/exprtmpl.cc b/dune/common/exprtmpl.cc
deleted file mode 100644
index 86bdcfdc7..000000000
--- a/dune/common/exprtmpl.cc
+++ /dev/null
@@ -1,6 +0,0 @@
-// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
-// vi: set et ts=4 sw=2 sts=2:
-#include "exprtmpl.hh"
-
-/** This is only needed for debugging and will be removed in the future */
-Indent INDENT;
diff --git a/dune/common/exprtmpl.hh b/dune/common/exprtmpl.hh
deleted file mode 100644
index eac6e0e4d..000000000
--- a/dune/common/exprtmpl.hh
+++ /dev/null
@@ -1,1105 +0,0 @@
-// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
-// vi: set et ts=4 sw=2 sts=2:
-#if ! defined DUNE_EXPRTMPL_HH && DUNE_EXPRESSIONTEMPLATES
-#define DUNE_EXPRTMPL_HH
-
-/*! @file
-
-   @brief This file provides expression templates for the
-         «Dense Matrix and Vector Template Library» and for the
-         «Iterative Solvers Template Library».
-   @verbatim
-   $Id$
-   @endverbatim
- */
-
-#include <iostream>
-#include <iomanip>
-#include <cstdlib>
-#include <cmath>
-#include <complex>
-#include "iteratorfacades.hh"
-#include "static_assert.hh"
-#include "stdstreams.hh"
-
-struct Indent
-{
-  int i;
-  Indent() {
-    i = 0;
-  }
-  void operator ++ ()
-  {
-#ifdef DUNE_VVERBOSE
-    i += 3;
-#endif
-  };
-  void operator -- ()
-  {
-#ifdef DUNE_VVERBOSE
-    i -= 3;
-#endif
-  };
-};
-
-extern Indent INDENT;
-
-inline std::ostream & operator << (std::ostream & s, const Indent & i)
-{
-#ifdef DUNE_VVERBOSE
-  for (int n = 0; n < i.i; n++) s << " ";
-#endif
-  return s;
-}
-
-namespace Dune {
-
-  template<class V> class FlatIterator;
-  template<class K, int N> class FieldVector;
-  template<class K, int N, int M> class FieldMatrix;
-#warning this header should not know about BCRSMatrix and BlockVector
-  class ISTLAllocator;
-  template<class B, class A=ISTLAllocator> class BCRSMatrix;
-  template<class B, class A=ISTLAllocator> class BlockVector;
-
-  /**
-     Type Traits for field_type and block_type
-   */
-  template<class T>
-  struct BlockType
-  {};
-  template<class T>
-  struct FieldType
-  {};
-  // FieldType specializations for basic data types
-  template<>
-  struct FieldType<double>
-  {
-    typedef double type;
-  };
-  template<>
-  struct FieldType<float>
-  {
-    typedef float type;
-  };
-  template<>
-  struct FieldType<int>
-  {
-    typedef int type;
-  };
-  // FieldType specialization for FieldVector
-  template <class K, int N>
-  struct FieldType< FieldVector<K,N> >
-  {
-    typedef K type;
-  };
-  // BlockType specialization for FieldVector
-  template <class K, int N>
-  struct BlockType< FieldVector<K,N> >
-  {
-    typedef K type;
-  };
-  // FieldType specialization for const T
-  template<class T>
-  struct FieldType<const T>
-  {
-    typedef const typename FieldType<T>::type type;
-  };
-  // BlockType specialization for const T
-  template<class T>
-  struct BlockType<const T>
-  {
-    typedef const typename BlockType<T>::type type;
-  };
-
-  namespace ExprTmpl {
-
-    /* Important Classes */
-    template <class V> class ConstRef;
-    template <class Ex> class Expression;
-    template <class A, class B, template<class> class Op> class ExBinOp;
-    template <class I> class Vector;
-    template <class I> class Matrix;
-
-    /**
-       Type Trait for nested Expression
-     */
-    template<class T>
-    struct BlockExpression
-    {};
-    /**
-       Type Trait for Implementation of an Expression
-     */
-    template<class T>
-    struct ExpressionImp
-    {};
-
-    template <class V>
-    struct ExpressionImp< ExprTmpl::ConstRef<V> >
-    {
-      typedef ExprTmpl::ConstRef<V> type;
-    };
-
-    // TypeTraits
-    template <>
-    struct ExpressionImp<double>
-    {
-      typedef double type;
-    };
-    template <>
-    struct ExpressionImp<float>
-    {
-      typedef float type;
-    };
-    template <>
-    struct ExpressionImp<int>
-    {
-      typedef int type;
-    };
-    template <class Ex>
-    struct ExpressionImp< Expression<Ex> >
-    {
-      typedef Ex type;
-    };
-
-    /** Identify End of Expression Recursion */
-    template <class V>
-    struct isEndOfExpressionRecusion
-    {
-      enum { value=false };
-    };
-
-    template <>
-    struct isEndOfExpressionRecusion<double>
-    {
-      enum { value=true };
-    };
-
-    template <class K>
-    struct isEndOfExpressionRecusion< FieldVector<K,1> >
-    {
-      enum { value=true };
-    };
-
-    template <class K>
-    struct isEndOfExpressionRecusion< std::complex<K> >
-    {
-      enum { value=true };
-    };
-
-    template <>
-    struct isEndOfExpressionRecusion<int>
-    {
-      enum { value=true };
-    };
-
-    template <>
-    struct isEndOfExpressionRecusion<float>
-    {
-      enum { value=true };
-    };
-
-    /** Nested Expression in a ConstRef<V> */
-    template <class V>
-    struct BlockExpression< ConstRef<V> >
-    {
-      typedef ExprTmpl::Expression<
-          ExprTmpl::ConstRef<typename BlockType<V>::type> > type;
-    };
-
-    /** No nested Expression in ConstRef<FieldVector> */
-    template<class K, int N>
-    struct BlockExpression< ConstRef< FieldVector<K,N> > >
-    {
-      typedef K type;
-    };
-
-    /**
-       Wrapper for an expression template
-     */
-    template <class Ex>
-    class Expression
-    {
-    public:
-      Expression(const Ex & x) : ex(x) {}
-      typedef typename FieldType<Ex>::type field_type;
-      typedef typename BlockExpression<Ex>::type BlockExpr;
-      BlockExpr operator[] ( int i ) const {
-        return ex[i];
-      }
-      size_t N() const { return ex.N(); }
-      double one_norm() const { return eval_one_norm(*this); }
-      double one_norm_real() const { return eval_one_norm_real(*this); }
-      double two_norm() const { return sqrt(eval_two_norm2(*this)); }
-      double two_norm2() const { return eval_two_norm2(*this); }
-      double infinity_norm() const { return eval_infinity_norm(*this); }
-      double infinity_norm_real() const { return eval_infinity_norm_real(*this); }
-    private:
-      Ex ex;
-    };
-
-    /**
-       Vector Base Class for Expression Templates
-     */
-    template <class I>
-    class Vector {
-    public:
-      explicit Vector() {}
-      typedef typename BlockType<I>::type block_type;
-      typedef typename FieldType<I>::type field_type;
-      //! dimension of the vector space
-      size_t N() const {
-        return asImp().N();
-      }
-      double one_norm() const { return eval_one_norm(*this); }
-      double one_norm_real() const { return eval_one_norm_real(*this); }
-      double two_norm() const { return sqrt(eval_two_norm2(*this)); }
-      double two_norm2() const { return eval_two_norm2(*this); }
-      double infinity_norm() const { return eval_infinity_norm(*this); }
-      double infinity_norm_real() const { return eval_infinity_norm_real(*this); }
-      block_type & operator[] (int i) {
-        return asImp()[i];
-      }
-      const block_type & operator[] (int i) const {
-        return asImp()[i];
-      }
-      //! begin for FlatIterator
-      FlatIterator<I> fbegin() { return FlatIterator<I>(asImp().begin()); }
-      //! end for FlatIterator
-      FlatIterator<I> fend() { return FlatIterator<I>(asImp().end()); }
-      //! begin for ConstFlatIterator
-      FlatIterator<const I> fbegin() const {
-        return FlatIterator<const I>(asImp().begin());
-      }
-      //! end for ConstFlatIterator
-      FlatIterator<const I> fend() const {
-        return FlatIterator<const I>(asImp().end());
-      }
-      //! assign Vector from Expression
-      template <class E> I& assignFrom(Expression<E>& x) {
-#warning should there be a resize?
-#ifdef DUNE_ISTL_WITH_CHECKING
-        assert(N() == x.N());
-#endif
-#ifdef DUNE_VVERBOSE
-        Dune::dvverb << INDENT << "Assign Vector from Expression\n";
-#endif
-        ++INDENT;
-        for (int i=0; i<N(); ++i) { asImp()[i] = x[i]; }
-        --INDENT;
-        return asImp();
-      }
-      //! assign Vector from Vector
-      template <class V> I& assignFrom(const Vector<V>& v) {
-#ifdef DUNE_ISTL_WITH_CHECKING
-        assert(N() == v.N());
-#endif
-#ifdef DUNE_VVERBOSE
-        Dune::dvverb << INDENT << "Assign Vector from Vector\n";
-#endif
-        ++INDENT;
-        for (int i=0; i<N(); ++i) { asImp()[i] = v[i]; }
-        --INDENT;
-        return asImp();
-      }
-      /*
-         I& assignFrom(const Vector<block_type> & x) {
-         #ifdef DUNE_VVERBOSE
-         Dune::dvverb << INDENT << "Assign Vector block_type\n";
-         #endif
-         ++INDENT;
-         for (int i=0; i < asImp().N(); i++) asImp()[i] = x;
-         --INDENT;
-         return asImp();
-         }
-       */
-      I& assignFrom(field_type x) {
-#ifdef DUNE_VVERBOSE
-        Dune::dvverb << INDENT << "Assign Vector from field_type\n";
-#endif
-        ++INDENT;
-        for (size_t i=0; i<N(); ++i) { asImp()[i] = x; }
-        --INDENT;
-        return asImp();
-      }
-      template <class E> Vector<I>& operator+=(const Expression<E>& x) {
-        for (size_t i=0; i < asImp().N(); i++) asImp()[i] += x[i];
-        return asImp();
-      }
-      template <class V> Vector<I>& operator+=(const Vector<V>& x) {
-        for (size_t i=0; i < asImp().N(); i++) asImp()[i] += x[i];
-        return asImp();
-      }
-      template <class E> Vector<I>& operator-=(const Expression<E>& x) {
-        for (size_t i=0; i < asImp().N(); i++) asImp()[i] -= x[i];
-        return asImp();
-      }
-      template <class V> Vector<I>& operator-=(const Vector<V>& x) {
-        for (size_t i=0; i < asImp().N(); i++) asImp()[i] -= x[i];
-        return asImp();
-      }
-      Vector<I>& operator+=(field_type x) {
-        for (size_t i=0; i < asImp().N(); i++) asImp()[i] += x;
-        return asImp();
-      }
-      Vector<I>& operator-=(field_type x) {
-        for (size_t i=0; i < asImp().N(); i++) asImp()[i] -= x;
-        return asImp();
-      }
-      Vector<I>& operator*=(field_type x) {
-        for (size_t i=0; i < asImp().N(); i++) asImp()[i] *= x;
-        return asImp();
-      }
-      Vector<I>& operator/=(field_type x) {
-        for (size_t i=0; i < asImp().N(); i++) asImp()[i] /= x;
-        return asImp();
-      }
-    private:
-      I & asImp() { return static_cast<I&>(*this); }
-      const I & asImp() const { return static_cast<const I&>(*this); }
-    };
-
-    template <class V>
-    class ConstRef
-    {
-    public:
-      typedef typename FieldType<V>::type field_type;
-      typedef typename BlockType<V>::type block_type;
-      typedef typename BlockExpression< ConstRef<V> >::type BlockExpr;
-      typedef typename ExpressionImp<BlockExpr>::type BlockExprImp;
-      ConstRef (const Vector<V> & _v) : v(_v) {}
-      BlockExpr operator[] (int i) const {
-#ifdef DUNE_VVERBOSE
-        Dune::dvverb << INDENT << "ConstRef->dereference " << v[i] << std::endl;
-#endif
-        return BlockExprImp(v[i]);
-      }
-      size_t N() const { return v.N(); };
-      double one_norm() const { return eval_one_norm(*this); }
-      double one_norm_real() const { return eval_one_norm_real(*this); }
-      double two_norm() const { return sqrt(eval_two_norm2(*this)); }
-      double two_norm2() const { return eval_two_norm2(*this); }
-      double infinity_norm() const { return eval_infinity_norm(*this); }
-      double infinity_norm_real() const { return eval_infinity_norm_real(*this); }
-    private:
-      const Vector<V> & v;
-    };
-
-  } // namespace ExprTmpl
-
-  template <class A>
-  struct FieldType< ExprTmpl::Expression<A> >
-  {
-    typedef typename FieldType<A>::type type;
-  };
-
-  template <class V>
-  struct FieldType< ExprTmpl::ConstRef<V> >
-  {
-    typedef typename FieldType<V>::type type;
-  };
-
-  template <class I>
-  struct FieldType< ExprTmpl::Vector<I> >
-  {
-    typedef typename FieldType<I>::type type;
-  };
-
-  // ----
-  template <class A>
-  struct BlockType< ExprTmpl::Expression<A> >
-  {
-    typedef typename BlockType<A>::type type;
-  };
-
-  template <class V>
-  struct BlockType< ExprTmpl::ConstRef<V> >
-  {
-    typedef typename BlockType<V>::type type;
-  };
-
-  template <class I>
-  struct BlockType< ExprTmpl::Vector<I> >
-  {
-    typedef typename BlockType<I>::type type;
-  };
-
-  /**
-     Type Traits for row_type of Matrix
-   */
-  template<class M>
-  struct RowType
-  {
-    typedef typename M::row_type type;
-  };
-  template<class K, int N, int M>
-  struct RowType< FieldMatrix<K,N,M> >
-  {
-    typedef FieldVector<K,M> type;
-  };
-  template <class I>
-  struct RowType< ExprTmpl::Matrix<I> >
-  {
-    typedef typename RowType<I>::type type;
-  };
-  // RowType specialization for const T
-  template<class T>
-  struct RowType<const T>
-  {
-    typedef const typename RowType<T>::type type;
-  };
-
-  // Matrix-Vector Multiplication
-  namespace ExprTmpl {
-
-    /**
-       Matrix Base Class for Expression Templates
-     */
-    template <class I>
-    class Matrix {
-    public:
-      explicit Matrix() {}
-      typedef typename RowType<I>::type row_type;
-      typedef typename FieldType<I>::type field_type;
-      //! dimension of the vector space
-      size_t N() const {
-        return asImp().N();
-      }
-      int M() const {
-        return asImp().M();
-      }
-      row_type & operator[] (int i) {
-        return asImp()[i];
-      }
-      const row_type & operator[] (int i) const {
-        return asImp()[i];
-      }
-    private:
-      I & asImp() { return static_cast<I&>(*this); }
-      const I & asImp() const { return static_cast<const I&>(*this); }
-    };
-
-    // Trait Structs to extract infos needed for Matrix-Vector Multiplication
-    template<class M>
-    struct NestedDepth
-    {
-      enum { value = NestedDepth<typename BlockType<M>::type>::value + 1 };
-    };
-
-    template<class K, int N, int M>
-    struct NestedDepth< FieldMatrix<K,N,M> >
-    {
-      enum { value = 1 };
-    };
-
-    template<class Me, class M>
-    struct MyDepth
-    {
-      enum { value = MyDepth<Me,typename BlockType<M>::type>::value+1 };
-    };
-
-    template<class Me>
-    struct MyDepth<Me,Me>
-    {
-      enum { value = 0 };
-    };
-
-    template<class B, int i>
-    struct BlockTypeN
-    {
-      typedef typename BlockTypeN<typename BlockType<B>::type, i-1>::type type;
-    };
-
-    template<class B>
-    struct BlockTypeN<B,0>
-    {
-      typedef B type;
-    };
-
-    template<class B>
-    struct BlockTypeN<B,-1>
-    {
-      typedef B type;
-    };
-
-    //! Type Traits for Vector::Iterator vs (const Vector)::ConstIterator
-    template<class T>
-    struct ColIteratorType
-    {
-      typedef typename T::ColIterator type;
-    };
-
-    template<class T>
-    struct ColIteratorType<const T>
-    {
-      typedef typename T::ConstColIterator type;
-    };
-
-    //! Iterator class for flat sequential access to a nested Matrix Row
-    template<class A>
-    class FlatColIterator :
-      public ForwardIteratorFacade<FlatColIterator<A>,
-          typename FieldType<A>::type,
-          typename FieldType<A>::type&,
-          int>
-    {
-    public:
-      typedef typename ColIteratorType<A>::type ColBlockIterator;
-      typedef std::ptrdiff_t DifferenceType;
-      //    typedef typename BlockIterator::DifferenceType DifferenceType;
-      typedef typename BlockType<A>::type block_type;
-      typedef typename FieldType<A>::type field_type;
-      typedef FlatColIterator<block_type> SubBlockIterator;
-      FlatColIterator(const ColBlockIterator & i, const int* _M) :
-        M(_M), it(i),
-        bit((*i)[(*M)].begin(), M+1),
-        bend((*i)[(*M)].end(), M+1) {};
-      void increment ()
-      {
-        ++bit;
-        if (bit == bend)
-        {
-          ++it;
-          bit = (*it)[(*M)].begin();
-          bend = (*it)[(*M)].end();
-        }
-      }
-      bool equals (const FlatColIterator & fit) const
-      {
-        return fit.it == it && fit.bit == bit;
-      }
-      const field_type& dereference() const
-      {
-        return *bit;
-      }
-      template<class V>
-      const field_type& vectorentry(const Dune::ExprTmpl::Vector<V> & v) const
-      {
-        return bit.vectorentry(v[it.index()]);
-      }
-      //! return index
-      DifferenceType index () const
-      {
-        return bit.index();
-      }
-      FlatColIterator operator = (const ColBlockIterator & _i)
-      {
-        it = _i;
-        bit = (*it)[(*M)].begin();
-        bend = (*it)[(*M)].end();
-        return *this;
-      }
-    private:
-      const int* M;
-      ColBlockIterator it;
-      SubBlockIterator bit;
-      SubBlockIterator bend;
-    };
-
-    template<class K, int N, int M>
-    class FlatColIterator<FieldMatrix<K,N,M> > :
-      public ForwardIteratorFacade<
-          FlatColIterator< FieldMatrix<K,N,M> >, K, K&, int>
-    {
-    public:
-      typedef
-      typename ColIteratorType< FieldMatrix<K,N,M> >::type ColBlockIterator;
-      typedef std::ptrdiff_t DifferenceType;
-      typedef K field_type;
-      FlatColIterator(const ColBlockIterator & i, const int*) :
-        it(i) {};
-      void increment ()
-      {
-        ++it;
-      }
-      bool equals (const FlatColIterator & fit) const
-      {
-        return fit.it == it;
-      }
-      field_type& dereference() const
-      {
-        return *it;
-      }
-      const field_type& vectorentry(const FieldVector<K,M> & v) const
-      {
-        return v[it.index()];
-      }
-      //! return index
-      DifferenceType index () const
-      {
-        return it.index();
-      }
-      FlatColIterator operator = (const ColBlockIterator & _i)
-      {
-        it = _i;
-        return *this;
-      }
-    private:
-      ColBlockIterator it;
-    };
-
-    template<class K, int N, int M>
-    class FlatColIterator<const FieldMatrix<K,N,M> > :
-      public ForwardIteratorFacade<
-          FlatColIterator< const FieldMatrix<K,N,M> >, const K, const K&, int>
-    {
-    public:
-      typedef
-      typename ColIteratorType< const FieldMatrix<K,N,M> >::type ColBlockIterator;
-      typedef std::ptrdiff_t DifferenceType;
-      typedef const K field_type;
-      FlatColIterator(const ColBlockIterator & i, const int*) :
-        it(i) {};
-      void increment ()
-      {
-        ++it;
-      }
-      bool equals (const FlatColIterator & fit) const
-      {
-        return fit.it == it;
-      }
-      field_type& dereference() const
-      {
-        return *it;
-      }
-      const field_type& vectorentry(const FieldVector<K,M> & v) const
-      {
-        return v[it.index()];
-      }
-      //! return index
-      DifferenceType index () const
-      {
-        return it.index();
-      }
-      FlatColIterator operator = (const ColBlockIterator & _i)
-      {
-        it = _i;
-        return *this;
-      }
-    private:
-      ColBlockIterator it;
-    };
-
-    /**
-       B: BlockMatrix type -> indicated the current level.
-       M: ,,global'' Matrix type
-       V: ,,global'' Vector type
-     */
-    template <class B, class Mat, class Vec>
-    class MatrixMulVector
-    {
-    public:
-      typedef typename
-      BlockTypeN<MatrixMulVector<Mat,Mat,Vec>, MyDepth<B,Mat>::value-1>::type
-      ParentBlockType;
-      typedef
-      MatrixMulVector<typename BlockType<B>::type,Mat,Vec> SubMatrixMulVector;
-      typedef typename
-      Dune::ExprTmpl::BlockExpression< MatrixMulVector<B,Mat,Vec> >::type
-      BlockExpr;
-      typedef
-      typename BlockType<Mat>::type::ColIterator SubColIterator;
-      typedef typename Dune::FieldType<Vec>::type field_type;
-      /* constructor */
-      MatrixMulVector(const Mat & _A, const Vec & _v, int* _M,
-                      const ParentBlockType & _parent) :
-        parent(_parent), M(_M), A(_A), v(_v) {};
-      BlockExpr operator[] (int i) const {
-        M[MyDepth<B,Mat>::value] = i;
-        return SubMatrixMulVector(A,v,M,*this);
-      }
-      size_t N() const { return -1; }; //r.begin()->N(); }
-      const ParentBlockType & parent;
-    private:
-      mutable int* M;
-      const Mat & A;
-      const Vec & v;
-    };
-
-    template <class Mat, class Vec>
-    class MatrixMulVector<Mat,Mat,Vec>
-    {
-    public:
-      typedef
-      MatrixMulVector<typename BlockType<Mat>::type,Mat,Vec> SubMatrixMulVector;
-      typedef
-      typename BlockType<Mat>::type::ColIterator SubColIterator;
-      typedef typename
-      Dune::ExprTmpl::BlockExpression< MatrixMulVector<Mat,Mat,Vec> >::type
-      BlockExpr;
-      typedef typename Dune::FieldType<Vec>::type field_type;
-      /* constructor */
-      MatrixMulVector(const Mat & _A, const Vec & _v, int* _M) :
-        M(_M), A(_A), v(_v) {};
-      BlockExpr operator[] (int i) const {
-        M[0] = i;
-        return SubMatrixMulVector(A,v,M,*this);
-      }
-      size_t N() const { return -1; }; // { parent.begin().N(); }
-    private:
-      mutable int* M;
-      const Mat & A;
-      const Vec & v;
-    };
-
-    template <class K, int iN, int iM, class Mat, class Vec>
-    class MatrixMulVector< FieldMatrix<K,iN,iM>, Mat, Vec >
-    {
-    public:
-      typedef typename
-      BlockTypeN<MatrixMulVector<Mat,Mat,Vec>,
-          MyDepth<FieldMatrix<K,iN,iM>,Mat>::value-1>::type
-      ParentBlockType;
-      /* constructor */
-      MatrixMulVector(const Mat & _A, const Vec & _v, int* _M,
-                      const ParentBlockType & _parent) :
-        parent(_parent), M(_M), A(_A), v(_v ) {};
-      K operator[] (int i) const {
-        K x=0;
-        M[MyDepth<FieldMatrix<K,iN,iM>,Mat>::value] = i;
-
-        FlatColIterator<const Mat> j(A[*M].begin(),M+1);
-        FlatColIterator<const Mat> endj(A[*M].end(),M+1);
-        for (; j!=endj; ++j)
-        {
-          x   += (*j) * j.vectorentry(v);
-        }
-        return x;
-      }
-      size_t N() const { return iN; };
-      const ParentBlockType & parent;
-    private:
-      mutable int* M;
-      const Mat & A;
-      const Vec & v;
-    };
-
-    template <class K, int iN, int iM>
-    class MatrixMulVector< FieldMatrix<K,iN,iM>, FieldMatrix<K,iN,iM>,
-        FieldVector<K,iM> >
-    {
-    public:
-      typedef FieldMatrix<K,iN,iM> Mat;
-      typedef FieldVector<K,iM> Vec;
-      MatrixMulVector(const Mat & _A, const Vec & _v) :
-        A(_A), v(_v ){};
-      K operator[] (int i) const {
-        K x=0;
-        typename Mat::ColIterator j = A[i].begin();
-        typename Mat::ColIterator endj = A[i].end();
-        for (; j!=endj; ++j)
-        {
-          x   += (*j) * j.vectorentry(v);
-        }
-        return x;
-      }
-      size_t N() const { return iN; };
-    private:
-      const Mat & A;
-      const Vec & v;
-    };
-
-    template <class M, class A, class B>
-    struct BlockExpression< MatrixMulVector< M, A, B > >
-    {
-      typedef Expression< MatrixMulVector<typename BlockType<M>::type,A,B> > type;
-    };
-
-    template <class K, int N, int M, class A, class B>
-    struct BlockExpression< MatrixMulVector< FieldMatrix<K,N,M>, A, B > >
-    {
-      typedef K type;
-    };
-
-    template<class K, int N, int M>
-    ExprTmpl::Expression<
-        MatrixMulVector<FieldMatrix<K,N,M>, FieldMatrix<K,N,M>, FieldVector<K,M> > >
-    operator * ( const FieldMatrix<K,N,M> & A, const FieldVector<K,M> & v )
-    {
-      return
-        ExprTmpl::Expression<
-          MatrixMulVector<FieldMatrix<K,N,M>, FieldMatrix<K,N,M>, FieldVector<K,M> > >
-        (
-          MatrixMulVector<FieldMatrix<K,N,M>, FieldMatrix<K,N,M>, FieldVector<K,M> >
-            (A, v)
-        );
-    }
-
-    // template<class BM, class BV>
-    // ExprTmpl::Expression<
-    //   MatrixMulVector<BCRSMatrix<BM>, BCRSMatrix<BM>, BlockVector<BV> > >
-    // operator * ( const BCRSMatrix<BM> & A, const BlockVector<BV> & v )
-    // {
-    //   static int indizes[20];
-    //   return
-    //     Expression<
-    //       MatrixMulVector<BCRSMatrix<BM>, BCRSMatrix<BM>, BlockVector<BV> > >
-    //     (
-    //       MatrixMulVector<BCRSMatrix<BM>, BCRSMatrix<BM>, BlockVector<BV> >(A, v, indizes)
-    //       );
-    // }
-
-    template<class M, class V>
-    ExprTmpl::Expression<
-        MatrixMulVector<Matrix<M>, Matrix<M>, Vector<V> > >
-    operator * ( const Matrix<M> & A, const Vector<V> & v )
-    {
-      static int indizes[20];
-      return
-        Expression<
-          MatrixMulVector<Matrix<M>, Matrix<M>, Vector<V> > >
-        (
-          MatrixMulVector<Matrix<M>, Matrix<M>, Vector<V> >(A, v, indizes)
-        );
-    }
-
-    template<class I>
-    struct ColIteratorType< Matrix<I> >
-    {
-      typedef typename I::ColIterator type;
-    };
-    template<class I>
-    struct ColIteratorType< const Matrix<I> >
-    {
-      typedef typename I::ConstColIterator type;
-    };
-
-  } // namespace ExprTmpl
-
-  template <class B, class A, class V>
-  struct FieldType< ExprTmpl::MatrixMulVector<B,A,V> >
-  {
-    typedef typename FieldType<V>::type type;
-  };
-  template <class I>
-  struct BlockType< ExprTmpl::Matrix<I> >
-  {
-    typedef typename BlockType<I>::type type;
-  };
-  template <class I>
-  struct FieldType< ExprTmpl::Matrix<I> >
-  {
-    typedef typename FieldType<I>::type type;
-  };
-
-  // OPERATORS
-
-  /* Scalar-Expression Operator */
-#define OP *
-#define ExpressionOpScalar ExpressionMulScalar
-#define ScalarOpExpression ScalarMulExpression
-#include "exprtmpl/scalar.inc"
-
-#define OP /
-#define ExpressionOpScalar ExpressionDivScalar
-#include "exprtmpl/scalar.inc"
-
-#define OP +
-#define ExpressionOpScalar ExpressionAddScalar
-#define ScalarOpExpression ScalarAdExpression
-#include "exprtmpl/scalar.inc"
-
-#define OP -
-#define ExpressionOpScalar ExpressionMinScalar
-#define ScalarOpExpression ScalarMinExpression
-#include "exprtmpl/scalar.inc"
-
-  /* Expression-Expression Operator */
-#define OP +
-#define ExpressionOpExpression ExpressionAddExpression
-#include "exprtmpl/exprexpr.inc"
-
-#define OP -
-#define ExpressionOpExpression ExpressionMinExpression
-#include "exprtmpl/exprexpr.inc"
-
-  /* one norm (sum over absolute values of entries) */
-
-#define NORM eval_one_norm
-#define NORM_CODE \
-  { \
-    typename FieldType<A>::type val=0; \
-    Dune::dvverb << INDENT << "Infinity Norm of Expression\n"; \
-    ++INDENT; \
-    for (size_t i=0; i<a.N(); ++i) { val += eval_one_norm(a[i]); } \
-    --INDENT; \
-    return val; \
-  }
-#define VAL_CODE { return std::abs(a); }
-#include "exprtmpl/norm.inc"
-
-  template<class K>
-  inline K eval_one_norm (const std::complex<K>& c)
-  {
-    sqrt(c.real()*c.real() + c.imag()*c.imag());
-  }
-
-  template <class A>
-  typename FieldType<A>::type
-  one_norm (const A & a)
-  {
-    return eval_one_norm(a);
-  }
-
-  /* simplified one norm (uses Manhattan norm for complex values) */
-
-#define NORM eval_one_norm_real
-#define NORM_CODE \
-  { \
-    typename FieldType<A>::type val=0; \
-    Dune::dvverb << INDENT << "Infinity Norm of Expression\n"; \
-    ++INDENT; \
-    for (size_t i=0; i<a.N(); ++i) { val += eval_one_norm_real(a[i]); } \
-    --INDENT; \
-    return val; \
-  }
-#define VAL_CODE { return std::abs(a); }
-#include "exprtmpl/norm.inc"
-
-  template<class K>
-  inline K eval_one_norm_real (const std::complex<K>& c)
-  {
-    return eval_one_norm_real(c.real()) + eval_one_norm_real(c.imag());
-  }
-
-  template <class A>
-  typename FieldType<A>::type
-  one_norm_real (const A & a)
-  {
-    return eval_one_norm_real(a);
-  }
-
-  /* two norm sqrt(sum over squared values of entries) */
-
-  template <class A>
-  typename FieldType<A>::type
-  two_norm (const A & a)
-  {
-    return sqrt(eval_two_norm2(a));
-  }
-
-  /* sqare of two norm (sum over squared values of entries), need for block recursion */
-
-#define NORM eval_two_norm2
-#define NORM_CODE \
-  { \
-    typename FieldType<A>::type val=0; \
-    Dune::dvverb << INDENT << "Infinity Norm of Expression\n"; \
-    ++INDENT; \
-    for (size_t i=0; i<a.N(); ++i) { val += eval_two_norm2(a[i]); } \
-    --INDENT; \
-    return val; \
-  }
-#define VAL_CODE { return a*a; }
-#include "exprtmpl/norm.inc"
-
-  template<class K>
-  inline K eval_two_norm2 (const std::complex<K>& c)
-  {
-    return c.real()*c.real() + c.imag()*c.imag();
-  }
-
-  template <class A>
-  typename FieldType<A>::type
-  two_norm2 (const A & a)
-  {
-    return eval_two_norm2(a);
-  }
-
-  /* infinity norm (maximum of absolute values of entries) */
-
-#define NORM eval_infinity_norm
-#define NORM_CODE { \
-    typename FieldType<A>::type val=0; \
-    Dune::dvverb << INDENT << "Infinity Norm of Expression\n"; \
-    ++INDENT; \
-    for (size_t i=0; i<a.N(); ++i) { val = std::max(val,eval_infinity_norm(a[i])); } \
-    --INDENT; \
-    return val; \
-}
-#define VAL_CODE { return a; }
-#include "exprtmpl/norm.inc"
-
-  template <class A>
-  typename FieldType<A>::type
-  infinity_norm (const A & a)
-  {
-    return eval_infinity_norm(a);
-  }
-
-  /* simplified infinity norm (uses Manhattan norm for complex values) */
-
-#define NORM eval_infinity_norm_real
-#define NORM_CODE { \
-    typename FieldType<A>::type val=0; \
-    Dune::dvverb << INDENT << "Infinity Norm of Expression\n"; \
-    ++INDENT; \
-    for (size_t i=0; i<a.N(); ++i) { val = std::max(val,eval_infinity_norm(a[i])); } \
-    --INDENT; \
-    return val; \
-}
-#define VAL_CODE { return std::abs(a); }
-#include "exprtmpl/norm.inc"
-
-  template<class K>
-  inline K eval_infinity_norm_real (const std::complex<K>& c)
-  {
-    return eval_one_norm_real(c.real()) + eval_one_norm_real(c.imag());
-  }
-
-  template <class A>
-  typename FieldType<A>::type
-  infinity_norm_real (const A & a)
-  {
-    return eval_infinity_norm(a);
-  }
-
-  /* vector * vector */
-
-  namespace ExprTmpl {
-
-    // Vector * Vector
-    template <class A>
-    typename FieldType<A>::type
-    operator * (const Vector<A> & a, const Vector<A> & b)
-    {
-      assert(a.N() == b.N());
-      typename FieldType<A>::type x = 0;
-      for (size_t i=0; i<a.N(); i++)
-        x = a[i] * b[i];
-      return x;
-    }
-
-    // Expression * Vector
-    template <class A, class B>
-    typename FieldType<A>::type
-    operator * (const Vector<A> & a, const Expression<B> & b)
-    {
-      dune_static_assert((is_same<FieldType<A>,FieldType<B> >::value),
-                         "Field types of both operands must match!");
-      assert(a.N() == b.N());
-      typename FieldType<A>::type x = 0;
-      for (size_t i=0; i<a.N(); i++)
-        x = a[i] * b[i];
-      return x;
-    }
-
-    // Vector * Expression
-    template <class A, class B>
-    typename FieldType<A>::type
-    operator * (const Expression<A> & a, const Vector<B> & b)
-    {
-      dune_static_assert((is_same<FieldType<A>,FieldType<B> >::value),
-                         "Field types of both operands must match!");
-      assert(a.N() == b.N());
-      typename FieldType<A>::type x = 0;
-      for (size_t i=0; i<a.N(); i++)
-        x = a[i] * b[i];
-      return x;
-    }
-
-  } // namespace ExprTmpl
-
-} // namespace Dune
-
-#endif // DUNE_EXPRTMPL_HH
diff --git a/dune/common/exprtmpl/Makefile.am b/dune/common/exprtmpl/Makefile.am
deleted file mode 100644
index 1db37157c..000000000
--- a/dune/common/exprtmpl/Makefile.am
+++ /dev/null
@@ -1,7 +0,0 @@
-# $Id: $
-SOURCES = exprexpr.inc  norm.inc  scalar.inc
-
-exprtmpldir = $(includedir)/dune/common/exprtmpl
-exprtmpl_HEADERS = $(SOURCES)
-
-include $(top_srcdir)/am/global-rules
diff --git a/dune/common/exprtmpl/exprexpr.inc b/dune/common/exprtmpl/exprexpr.inc
deleted file mode 100644
index 861c2c6dc..000000000
--- a/dune/common/exprtmpl/exprexpr.inc
+++ /dev/null
@@ -1,136 +0,0 @@
-// -*- C++ -*-
-#ifndef OP
-#error OP undefined
-#endif
-
-namespace ExprTmpl {
-
-template <class A, class B>
-class ExpressionOpExpression
-{
-public:
-//#warning compare field_type of class A and B and choose infomation richest one!
-  typedef typename FieldType<A>::type field_type;
-  typedef typename BlockType<A>::type block_type;
-  typedef typename BlockExpression<ExpressionOpExpression>::type BlockExpr;
-  ExpressionOpExpression (const Expression<A> & _a, const Expression<B> & _b)
-    : a(_a), b(_b) {
-#ifdef DUNE_ISTL_WITH_CHECKING
-      assert(a.N() == b.N());
-#endif
-  }
-  BlockExpr operator[] (int i) const {
-    return a[i] OP b[i];
-  }
-  int N() const { return a.N(); };
-private:
-  Expression<A> a;
-  Expression<B> b;
-};
-
-// Expression op Expression
-template <class A, class B>
-Expression< ExpressionOpExpression<A,B> >
-operator OP (const Expression<A> & a, const Expression<B> & b)
-{
-  ExpressionOpExpression<A,B> ex(a, b);
-  return Expression< ExpressionOpExpression<A,B> >(ex);
-}
-
-// Expression op Vector
-template <class A, class B>
-Expression< ExpressionOpExpression<A, ConstRef<B> > >
-operator OP (const Expression<A> & a, const Vector<B> & b)
-{
-  ConstRef<B> rb(b);
-  ExpressionOpExpression<A, ConstRef<B> > ex(a, rb);
-  return Expression< ExpressionOpExpression<A, ConstRef<B> > >(ex);
-}
-
-// Expression op FieldVector<K,1>
-template <class A, class K>
-K operator OP (const Expression<A> & a,
-               const Expression< ConstRef< FieldVector<K,1> > >& b)
-{
-  return a OP b[0];
-}
-
-// Vector op Expression
-template <class A, class B>
-Expression< ExpressionOpExpression< ConstRef<A>, B> >
-operator OP (const Vector<A> & a, const Expression<B> & b)
-{
-  ConstRef<A> ra(a);
-  ExpressionOpExpression< ConstRef<A>, B> ex(ra, b);
-  return Expression< ExpressionOpExpression<ConstRef<A>, B> >(ex);
-}
-
-// FieldVector<K,1> op Expression
-template <class K, class B>
-K operator OP (const Expression< ConstRef< FieldVector<K,1> > > & a,
-               const Expression<B> & b)
-{
-  return a[0] OP b;
-}
-
-// Vector op Vector
-template <class V>
-Expression< ExpressionOpExpression< ConstRef<V>, ConstRef<V> > >
-operator OP (const Vector<V> & a, const Vector<V> & b)
-{
-  ConstRef<V> ra(a);
-  ConstRef<V> rb(b);
-  ExpressionOpExpression< ConstRef<V>, ConstRef<V> > ex(ra, rb);
-  return Expression< ExpressionOpExpression< ConstRef<V>, ConstRef<V> > >(ex);
-}
-
-// FieldVector<K,1> op FieldVector<K,1>
-template <class K>
-K operator OP (const Expression< ConstRef< FieldVector<K,1> > > & a,
-               const Expression< ConstRef< FieldVector<K,1> > > & b)
-{
-  return a[0] OP b[0];
-}
-
-// TypeTraits
-template<class A, class B>
-struct BlockExpression< ExpressionOpExpression<A,B> >
-{
-  typedef
-  typename SelectType<
-    // decide whether we are at the and of the recusrion
-    isEndOfExpressionRecusion<typename BlockType<A>::type>::value,
-    // select FieldType if where are at the end of the recursion
-    typename FieldType<A>::type,
-    // construct nested expression otherwise
-    ExprTmpl::Expression<
-    ExprTmpl::ExpressionOpExpression<
-      typename ExpressionImp< typename BlockExpression<
-        typename ExpressionImp<A>::type>::type>::type,
-      typename ExpressionImp< typename BlockExpression<
-        typename ExpressionImp<B>::type>::type>::type > >
-  >::Type type;
-};
-
-template <class A, class B>
-struct ExpressionImp< ExpressionOpExpression<A,B> >
-{
-  typedef ExpressionOpExpression<A,B> type;
-};
-
-}
-
-template <class A, class B>
-struct FieldType< ExprTmpl::ExpressionOpExpression<A,B> >
-{
-  typedef typename FieldType<A>::type type;
-};
-  
-template <class A, class B>
-struct BlockType< ExprTmpl::ExpressionOpExpression<A,B> >
-{
-  typedef typename BlockType<A>::type type;
-};
-  
-#undef ExpressionOpExpression
-#undef OP
diff --git a/dune/common/exprtmpl/norm.inc b/dune/common/exprtmpl/norm.inc
deleted file mode 100644
index b01127787..000000000
--- a/dune/common/exprtmpl/norm.inc
+++ /dev/null
@@ -1,74 +0,0 @@
-// -*- C++ -*-
-#ifndef NORM
-#error NORM undefined
-#endif
-
-#ifndef NORM_CODE
-#error NORM_CODE undefined
-#endif
-
-#ifndef VAL_CODE
-#error VAL_CODE undefined
-#endif
-
-template <class A>
-typename FieldType<A>::type
-NORM (const ExprTmpl::Expression<A> & a)
-{
-  NORM_CODE
-}
-
-template <class A>
-typename FieldType<A>::type
-NORM (const ExprTmpl::Vector<A> & a)
-{
-  NORM_CODE
-}
-
-/*
-template <class A>
-double
-ExprTmpl::Expression<A>::NORM () const
-{
-  const ExprTmpl::Expression<A> & a = *this;
-  NORM_CODE
-}
-
-template <class A>
-double
-ExprTmpl::Vector<A>::NORM () const
-{
-  const ExprTmpl::Vector<A> & a = *this;
-  NORM_CODE
-}
-
-template <class A>
-double
-ExprTmpl::ConstRef<A>::NORM () const
-{
-  const ExprTmpl::ConstRef<A> & a = *this;
-  NORM_CODE
-}
-*/
-
-inline double
-NORM (const double & a)
-{
-  VAL_CODE
-}
-
-inline float
-NORM (const float & a)
-{
-  VAL_CODE
-}
-
-inline int
-NORM (const int & a)
-{
-  VAL_CODE
-}
-
-#undef NORM
-#undef NORM_CODE
-#undef VAL_CODE
diff --git a/dune/common/exprtmpl/scalar.inc b/dune/common/exprtmpl/scalar.inc
deleted file mode 100644
index e943d045a..000000000
--- a/dune/common/exprtmpl/scalar.inc
+++ /dev/null
@@ -1,185 +0,0 @@
-// -*- C++ -*-
-#ifndef OP
-#error OP undefined
-#endif
-
-#ifdef ExpressionOpScalar
-
-namespace ExprTmpl {
-
-template <class A>
-class ExpressionOpScalar
-{
-public:
-  typedef typename FieldType<A>::type field_type;
-  typedef typename BlockType<A>::type block_type;
-  typedef typename BlockExpression<ExpressionOpScalar>::type BlockExpr;
-  ExpressionOpScalar (const Expression<A> & _a,
-            const typename FieldType<A>::type & _lambda)
-    : a(_a), lambda(_lambda) {}
-  BlockExpr operator[] (int i) const {
-    return a[i] OP lambda;
-  }
-  int N() const { return a.N(); };
-private:
-  Expression<A> a;
-  const field_type lambda;
-};
-
-// Scalar op FieldVector<K,1>
-template <class K>
-K operator OP (const Expression< ConstRef< FieldVector<K,1> > > & a,
-               const K & lambda)
-{
-  return a[0] OP lambda;
-}
-
-// Vector op Scalar
-template <class A>
-Expression< ExpressionOpScalar<ConstRef<A> > >
-operator OP (const Vector<A> & a, const typename FieldType<A>::type & lambda)
-{
-  ConstRef<A> ra(a);
-  ExpressionOpScalar< ConstRef<A> > ex(ra, lambda);
-  return Expression< ExpressionOpScalar<ConstRef<A> > >(ex);
-}
-
-// Expression op Scalar
-template <class A>
-Expression< ExpressionOpScalar<A> >
-operator OP (const Expression<A> & a, const typename FieldType<A>::type & lambda)
-{
-  ExpressionOpScalar<A> ex(a, lambda);
-  return Expression< ExpressionOpScalar<A> >(ex);
-}
-
-// TypeTraits
-//#warning Kann hier nicht das innere ExpressionImp weg?
-template <class Ex>
-struct BlockExpression< ExprTmpl::ExpressionOpScalar<Ex> >
-{
-  typedef
-  typename SelectType<
-    isEndOfExpressionRecusion< typename BlockType<Ex>::type >::value,
-    typename FieldType<Ex>::type,
-    ExprTmpl::Expression<
-    ExprTmpl::ExpressionOpScalar<typename ExpressionImp<
-      typename BlockExpression<
-        typename ExpressionImp<Ex>::type>::type>::type > >
-  >::Type type;
-};
-
-template <class Ex>
-struct ExpressionImp< ExprTmpl::ExpressionOpScalar<Ex> >
-{
-  typedef ExprTmpl::ExpressionOpScalar< Ex > type;
-};
-
-} // namespace ExprTmpl
-
-template <class A>
-struct FieldType< ExprTmpl::ExpressionOpScalar<A> >
-{
-  typedef typename FieldType<A>::type type;
-};
-
-template <class A>
-struct BlockType< ExprTmpl::ExpressionOpScalar<A> >
-{
-  typedef typename BlockType<A>::type type;
-};
-  
-#undef ExpressionOpScalar
-
-#endif
-
-#ifdef ScalarOpExpression
-
-namespace ExprTmpl {
-
-template <class A>
-class ScalarOpExpression
-{
-public:
-  typedef typename FieldType<A>::type field_type;
-  typedef typename BlockType<A>::type block_type;
-  typedef typename BlockExpression<ScalarOpExpression>::type BlockExpr;
-  ScalarOpExpression (const Expression<A> & _a,
-            const typename FieldType<A>::type & _lambda)
-    : a(_a), lambda(_lambda) {}
-  BlockExpr operator[] (int i) const {
-    return lambda OP a[i];
-  }
-  int N() const { return a.N(); };
-private:
-  Expression<A> a;
-  const field_type lambda;
-};
-
-// Scalar op FieldVector<K,1>
-template <class K>
-K operator OP (const K & lambda,
-               const Expression< ConstRef< FieldVector<K,1> > > & a)
-{
-  return lambda OP a[0];
-}
-
-// Scalar op Vector
-template <class A>
-Expression< ScalarOpExpression<ConstRef<A> > >
-operator OP (const typename FieldType<A>::type & lambda, const Vector<A> & a)
-{
-  ConstRef<A> ra(a);
-  ScalarOpExpression< ConstRef<A> > ex(ra, lambda);
-  return Expression< ScalarOpExpression<ConstRef<A> > >(ex);
-}
-
-// Scalar op Expression
-template <class A>
-Expression< ScalarOpExpression<A> >
-operator OP (const typename FieldType<A>::type & lambda, const Expression<A> & a)
-{
-  ScalarOpExpression<A> ex(a, lambda);
-  return Expression< ScalarOpExpression<A> >(ex);
-}
-
-// TypeTraits
-template <class Ex>
-struct BlockExpression< ExprTmpl::ScalarOpExpression<Ex> >
-{
-  typedef
-  typename SelectType<
-    isEndOfExpressionRecusion< typename BlockType<Ex>::type >::value,
-    typename FieldType<Ex>::type,
-    ExprTmpl::Expression<
-    ExprTmpl::ScalarOpExpression<typename ExpressionImp<
-      typename BlockExpression<
-        typename ExpressionImp<Ex>::type>::type>::type > >
-  >::Type type;
-};
-
-template <class Ex>
-struct ExpressionImp< ExprTmpl::ScalarOpExpression<Ex> >
-{
-  typedef ExprTmpl::ScalarOpExpression< Ex > type;
-};
-
-} // namespace ExprTmpl
-
-template <class A>
-struct FieldType< ExprTmpl::ScalarOpExpression<A> >
-{
-  typedef typename FieldType<A>::type type;
-};
-
-template <class A>
-struct BlockType< ExprTmpl::ScalarOpExpression<A> >
-{
-  typedef typename BlockType<A>::type type;
-};
-  
-#undef ScalarOpExpression
-
-#endif
-
-#undef OP
diff --git a/m4/Makefile.am b/m4/Makefile.am
index a5c09171c..795ff4124 100644
--- a/m4/Makefile.am
+++ b/m4/Makefile.am
@@ -28,7 +28,6 @@ ALLM4S = 					\
 	dune_deprecated.m4			\
 	dune_deprecated_cppflags.m4		\
 	dune_docu.m4				\
-	dune_exprtmpl.m4			\
 	dune_fieldvector_size_is_method.m4	\
 	dune_linkcxx.m4				\
 	dune_mpi.m4				\
diff --git a/m4/dune_common.m4 b/m4/dune_common.m4
index 9f23eab30..4f4a17401 100644
--- a/m4/dune_common.m4
+++ b/m4/dune_common.m4
@@ -29,7 +29,6 @@ AC_DEFUN([DUNE_COMMON_CHECKS],
   AC_REQUIRE([DUNE_SET_MINIMAL_DEBUG_LEVEL])
   AC_REQUIRE([DUNE_PATH_XDR])
   AC_REQUIRE([DUNE_MPI])
-  AC_REQUIRE([DUNE_EXPRTMPL])
   AC_REQUIRE([DUNE_TR1_HEADERS])
 
   dnl Create the flag --enable-fieldvector-size-is-method
diff --git a/m4/dune_exprtmpl.m4 b/m4/dune_exprtmpl.m4
deleted file mode 100644
index 027286f70..000000000
--- a/m4/dune_exprtmpl.m4
+++ /dev/null
@@ -1,10 +0,0 @@
-AC_DEFUN([DUNE_EXPRTMPL],[
-  # enable experimental features
-  AC_ARG_ENABLE(expressiontemplates,
-   AS_HELP_STRING([--enable-expressiontemplates],[enable experimental expression templates in dune]))
-  AS_IF([test "x$enable_expressiontemplates" = "xyes"],[
-    AC_DEFINE([DUNE_EXPRESSIONTEMPLATES], [1], 
-      [Define to 1 if the experimental expression templates should be used])])
-  AM_CONDITIONAL([EXPRESSIONTEMPLATES],
-    [test "x$enable_expressiontemplates" = "xyes"])
-])
-- 
GitLab