From 45e4e7047e5c079ac8d03ae4ff1ad035a4498e7d Mon Sep 17 00:00:00 2001
From: Thomas Witkowski <thomas.witkowski@gmx.de>
Date: Mon, 1 Dec 2008 08:22:45 +0000
Subject: [PATCH] * This and that

---
 AMDiS/src/DOFMatrix.cc          |  14 ++-
 AMDiS/src/DOFMatrix.h           |  18 ++--
 AMDiS/src/Operator.h            | 165 +++++++++++++++-----------------
 AMDiS/src/ProblemVec.cc         |   2 +-
 AMDiS/src/ZeroOrderAssembler.cc |  68 ++++++++++++-
 AMDiS/src/ZeroOrderAssembler.h  |   5 +-
 6 files changed, 160 insertions(+), 112 deletions(-)

diff --git a/AMDiS/src/DOFMatrix.cc b/AMDiS/src/DOFMatrix.cc
index 28f2427b..59b329d0 100644
--- a/AMDiS/src/DOFMatrix.cc
+++ b/AMDiS/src/DOFMatrix.cc
@@ -632,17 +632,23 @@ namespace AMDiS {
 
   void DOFMatrix::scal(double b) 
   {
-    int i;
     DOFMatrix::Iterator rowIterator(this, USED_DOFS);
-    for(rowIterator.reset(); !rowIterator.end(); ++rowIterator) {
-      for(i=0; i < static_cast<int>((*rowIterator).size()); i++) {
-	if((*rowIterator)[i].col >= 0) {
+    for (rowIterator.reset(); !rowIterator.end(); ++rowIterator) {
+      for (int i = 0; i < static_cast<int>((*rowIterator).size()); i++) {
+	if ((*rowIterator)[i].col >= 0) {
 	  (*rowIterator)[i].entry *= b;
 	}
       }
     }
   }
 
+  void DOFMatrix::addOperator(Operator *op, double* factor, double* estFactor) 
+  { 
+    operators.push_back(op);
+    operatorFactor.push_back(factor);
+    operatorEstFactor.push_back(estFactor);
+  }
+
   void DOFMatrix::copy(const DOFMatrix& rhs) 
   {
     clear();
diff --git a/AMDiS/src/DOFMatrix.h b/AMDiS/src/DOFMatrix.h
index 0285814a..25cacc21 100644
--- a/AMDiS/src/DOFMatrix.h
+++ b/AMDiS/src/DOFMatrix.h
@@ -294,23 +294,19 @@ namespace AMDiS {
     /** \brief
      * a*x + y
      */
-    void axpy(double a, 
-	      const DOFMatrix& x,
-	      const DOFMatrix& y);
+    void axpy(double a, const DOFMatrix& x, const DOFMatrix& y);
 
     /** \brief
      * Multiplication with a scalar.
      */
     void scal(double s);
 
-    inline void addOperator(Operator *op, 
-			    double* factor = NULL,
-			    double* estFactor = NULL) 
-    { 
-      operators.push_back(op);
-      operatorFactor.push_back(factor);
-      operatorEstFactor.push_back(estFactor);
-    }
+    /** \brief
+     * Adds an operator to the DOFMatrix. A factor, that is multipled
+     * to the operator, and a multilier factor for the estimator may be
+     * also given.
+     */
+    void addOperator(Operator *op, double* factor = NULL, double* estFactor = NULL);
 
     inline std::vector<double*>::iterator getOperatorFactorBegin() {
       return operatorFactor.begin();
diff --git a/AMDiS/src/Operator.h b/AMDiS/src/Operator.h
index 11210f56..fa863da0 100644
--- a/AMDiS/src/Operator.h
+++ b/AMDiS/src/Operator.h
@@ -674,7 +674,7 @@ namespace AMDiS {
       : SecondOrderTerm(f_->getDegree()), vec(dv), f(f_)
     {
       setSymmetric(true);
-    };
+    }
 
     /** \brief
      * Implementation of \ref OperatorTerm::initElement().
@@ -743,7 +743,7 @@ namespace AMDiS {
 	f(f_)
     {
       setSymmetric(true);
-    };
+    }
 
     /** \brief
      * Implementation of \ref OperatorTerm::initElement().
@@ -811,7 +811,7 @@ namespace AMDiS {
       : SecondOrderTerm(g_->getDegree()), g(g_)
     {
       setSymmetric(true);
-    };
+    }
 
     /** \brief
      * Implementation of \ref OperatorTerm::initElement().
@@ -877,7 +877,7 @@ namespace AMDiS {
       : SecondOrderTerm(f_->getDegree()), vec(dv), f(f_), divFct(divFct_), symmetric(symm)
     {
       setSymmetric(symmetric);
-    };
+    }
 
     /** \brief
      * Implementation of \ref OperatorTerm::initElement().
@@ -949,7 +949,7 @@ namespace AMDiS {
 		    AbstractFunction<double, WorldVector<double> > *f_)
       : SecondOrderTerm(f_->getDegree()), vec(dv), f(f_)
     {
-    };
+    }
 
     /** \brief
      * Implementation of \ref OperatorTerm::initElement().
@@ -1018,7 +1018,7 @@ namespace AMDiS {
 			   WorldVector<double> > *f_)
       : SecondOrderTerm(f_->getDegree()), vec(dv), f(f_)
     {
-    };
+    }
 
     /** \brief
      * Implementation of \ref OperatorTerm::initElement().
@@ -1090,7 +1090,7 @@ namespace AMDiS {
 	divFct(divFct_), symmetric(symm)
     {
       setSymmetric(symmetric);
-    };
+    }
 
     /** \brief
      * Implementation of \ref OperatorTerm::initElement().
@@ -1163,7 +1163,7 @@ namespace AMDiS {
 			  WorldVector<double> > *f_)
       : SecondOrderTerm(f_->getDegree()), vec(dv), f(f_)
     {
-    };
+    }
 
     /** \brief
      * Implementation of \ref OperatorTerm::initElement().
@@ -1233,7 +1233,7 @@ namespace AMDiS {
       : SecondOrderTerm(f_->getDegree()), vec(dv), f(f_)
     {
       setSymmetric(true);
-    };
+    }
 
     /** \brief
      * Implementation of \ref OperatorTerm::initElement().
@@ -1303,7 +1303,7 @@ namespace AMDiS {
       : SecondOrderTerm(f_->getDegree()), vec(dv), f(f_), divFct(divFct_), symmetric(symm)
     {
       setSymmetric(symmetric);
-    };
+    }
 
     /** \brief
      * Implementation of \ref OperatorTerm::initElement().
@@ -1383,7 +1383,7 @@ namespace AMDiS {
     {
       vecsAtQPs_.resize(vecs_.size());
       gradsAtQPs_.resize(grads_.size());
-    };
+    }
 
     /** \brief
      * Implementation of \ref OperatorTerm::initElement().
@@ -1461,7 +1461,7 @@ namespace AMDiS {
     {
       vecsAtQPs_.resize(vecs_.size());
       gradsAtQPs_.resize(grads_.size());
-    };
+    }
 
     /** \brief
      * Implementation of \ref OperatorTerm::initElement().
@@ -1535,12 +1535,12 @@ namespace AMDiS {
      */
     FirstOrderTerm(int deg) 
       : OperatorTerm(deg) 
-    {};
+    {}
 
     /** \brief
      * Destructor.
      */
-    virtual ~FirstOrderTerm() {};
+    virtual ~FirstOrderTerm() {}
 
     /** \brief
      * Evaluation of \f$ \Lambda b \f$.
@@ -1570,7 +1570,7 @@ namespace AMDiS {
 	  result[iq] += resultQP * factor;
 	}
       }
-    };
+    }
   };
 
   // ============================================================================
@@ -1590,7 +1590,7 @@ namespace AMDiS {
      */
     Simple_FOT() 
       : FirstOrderTerm(0) 
-    {};
+    {}
 
     /** \brief
      * Implements FirstOrderTerm::getLb().
@@ -1604,7 +1604,7 @@ namespace AMDiS {
       for (int iq = 0; iq < numPoints; iq++) {
 	l1(Lambda, Lb[iq], 1.0);
       }
-    };
+    }
   };
 
   // ============================================================================
@@ -1627,12 +1627,12 @@ namespace AMDiS {
     {
       factor  = NEW double;
       *factor = f;
-    };
+    }
 
     FactorSimple_FOT(double *fptr) 
       : FirstOrderTerm(0), 
 	factor(fptr) 
-    {};
+    {}
 
     /** \brief
      * Implements FirstOrderTerm::getLb().
@@ -1644,7 +1644,7 @@ namespace AMDiS {
       for (int iq = 0; iq < numPoints; iq++) {
 	l1(Lambda, Lb[iq], (*factor));
       }
-    };
+    }
 
   private:
     /** \brief
@@ -1670,7 +1670,7 @@ namespace AMDiS {
     Vector_FOT(WorldVector<double> b_) 
       : FirstOrderTerm(0), b(b_) 
     {
-    };
+    }
 
     /** \brief
      * Implements FirstOrderTerm::getLb().
@@ -1684,7 +1684,7 @@ namespace AMDiS {
       for (int iq = 0; iq < numPoints; iq++) {
 	lb(Lambda, b, Lb[iq], 1.0);
       }
-    };
+    }
 
     /** \brief
      * Implements FirstOrderTerm::eval().
@@ -1701,7 +1701,7 @@ namespace AMDiS {
 	  result[iq] += b * grdUhAtQP[iq] * factor; 
 	}
       }
-    };
+    }
 
   protected:
     /** \brief
@@ -1729,7 +1729,7 @@ namespace AMDiS {
 		WorldVector<double> *b_)
       : FirstOrderTerm(f_->getDegree()), vec(dv), f(f_), b(b_)
     {
-    };
+    }
 
     /** \brief
      * Implementation of \ref OperatorTerm::initElement().
@@ -1789,8 +1789,7 @@ namespace AMDiS {
      */
     CoordsAtQP_FOT(AbstractFunction<double, WorldVector<double> > *g_)
       : FirstOrderTerm(g_->getDegree()), g(g_) 
-    {
-    };
+    {}
 
     /** \brief
      * Implementation of \ref OperatorTerm::initElement().
@@ -1840,7 +1839,7 @@ namespace AMDiS {
     VecCoordsAtQP_FOT(AbstractFunction<double, WorldVector<double> > *g_,
 		      WorldVector<double> b_)
       : FirstOrderTerm(g_->getDegree()), g(g_), b(b_)
-    {};
+    {}
 
     /** \brief
      * Implementation of \ref OperatorTerm::initElement().
@@ -1897,8 +1896,7 @@ namespace AMDiS {
     VectorGradient_FOT(DOFVectorBase<double> *dv,
 		       AbstractFunction<WorldVector<double>, WorldVector<double> > *f_)
       : FirstOrderTerm(f_->getDegree()), vec(dv), f(f_)
-    {
-    };
+    {}
 
     /** \brief
      * Implementation of \ref OperatorTerm::initElement().
@@ -1952,8 +1950,7 @@ namespace AMDiS {
     VectorFct_FOT(DOFVectorBase<double> *dv,
 		  AbstractFunction<WorldVector<double>, double> *vecFct_)
       : FirstOrderTerm(vecFct_->getDegree()), vec(dv), vecFct(vecFct_) 
-    {
-    };
+    {}
 
     /** \brief
      * Implementation of \ref OperatorTerm::initElement().
@@ -2010,8 +2007,7 @@ namespace AMDiS {
      */
     VecFctAtQP_FOT(AbstractFunction<WorldVector<double>, WorldVector<double> > *g_)
       : FirstOrderTerm(g_->getDegree()), g(g_) 
-    {
-    };
+    {}
 
     /** \brief
      * Implementation of \ref OperatorTerm::initElement().
@@ -2063,7 +2059,7 @@ namespace AMDiS {
 		BinaryAbstractFunction<WorldVector<double>, double,
 		WorldVector<double> > *vecFct_)
     : FirstOrderTerm(vecFct_->getDegree()), vec1(dv1), vec2(dv2), vecFct(vecFct_) 
-    {};
+    {}
 
     /** \brief
      * Implementation of \ref OperatorTerm::initElement().
@@ -2128,7 +2124,7 @@ namespace AMDiS {
     {
       vecsAtQPs_.resize(vecs_.size());
       gradsAtQPs_.resize(grads_.size());
-    };
+    }
 
     /** \brief
      * Implementation of \ref OperatorTerm::initElement().
@@ -2194,7 +2190,7 @@ namespace AMDiS {
     {
       vecsAtQPs_.resize(vecs_.size());
       gradsAtQPs_.resize(grads_.size());
-    };
+    }
 
     /** \brief
      * Implementation of \ref OperatorTerm::initElement().
@@ -2255,12 +2251,12 @@ namespace AMDiS {
     /** \brief
      * Constructor.
      */
-    ZeroOrderTerm(int deg) : OperatorTerm(deg) {};
+    ZeroOrderTerm(int deg) : OperatorTerm(deg) {}
 
     /** \brief
      * Destructor.
      */
-    virtual ~ZeroOrderTerm() {};
+    virtual ~ZeroOrderTerm() {}
 
     /** \brief
      * Evaluates \f$ c \f$
@@ -2285,7 +2281,7 @@ namespace AMDiS {
     /** \brief
      * Constructor.
      */
-    Simple_ZOT(double f = 1.0) : ZeroOrderTerm(0), factor(f) {};
+    Simple_ZOT(double f = 1.0) : ZeroOrderTerm(0), factor(f) {}
 
     /** \brief
      * Implements ZeroOrderTerm::getC().
@@ -2295,7 +2291,7 @@ namespace AMDiS {
       for (int iq = 0; iq < nPoints; iq++) {
 	C[iq] += factor; 
       }
-    };
+    }
 
     /** \brief
      * Implements ZeroOrderTerm::eval().
@@ -2310,7 +2306,7 @@ namespace AMDiS {
       for (int iq = 0; iq < nPoints; iq++) {
 	result[iq] += fac * factor * uhAtQP[iq];
       }
-    };
+    }
  
   protected:
     /** \brief
@@ -2336,8 +2332,7 @@ namespace AMDiS {
     VecAtQP_ZOT(DOFVectorBase<double> *dv,
 		AbstractFunction<double, double> *f_)
       : ZeroOrderTerm(f_ ? f_->getDegree() : 0), vec(dv), f(f_) 
-    {
-    };
+    {}
 
     /** \brief
      * Implementation of \ref OperatorTerm::initElement().
@@ -2395,8 +2390,7 @@ namespace AMDiS {
 		    AbstractFunction<double, double> *f2_)
       : ZeroOrderTerm(f1->getDegree()+f2_->getDegree()), 
 	vec1(dv1), vec2(dv2), f1(f1_), f2(f2_)
-    {
-    };
+    {}
 
     /** \brief
      * Implementation of \ref OperatorTerm::initElement().
@@ -2460,8 +2454,7 @@ namespace AMDiS {
 		 BinaryAbstractFunction<double, double, double> *f_)
       : ZeroOrderTerm(f_->getDegree()), 
 	vec1(dv1), vec2(dv2), f(f_)
-    {
-    };
+    {}
 
     /** \brief
      * Implementation of \ref OperatorTerm::initElement().
@@ -2525,7 +2518,7 @@ namespace AMDiS {
 	vec2(dv2), 
 	vec3(dv3), 
 	f(f_)
-    {};
+    {}
 
     /** \brief
      * Implementation of \ref OperatorTerm::initElement().
@@ -2587,8 +2580,7 @@ namespace AMDiS {
 			  BinaryAbstractFunction<double,
 			  WorldVector<double>, WorldVector<double> > *f_)
       : ZeroOrderTerm(f_->getDegree()), vec(dv), f(f_)
-    {
-    };
+    {}
 
     /** \brief
      * Implementation of \ref OperatorTerm::initElement().
@@ -2645,7 +2637,7 @@ namespace AMDiS {
     VecGradCoordsAtQP_ZOT(DOFVectorBase<double> *dv,
 			  TertiaryAbstractFunction<double, double, WorldVector<double>, WorldVector<double> > *f_)
       : ZeroOrderTerm(f_->getDegree()), vec(dv), f(f_) 
-    {};
+    {}
 
     /** \brief
      * Implementation of \ref OperatorTerm::initElement().
@@ -2709,8 +2701,7 @@ namespace AMDiS {
     VecAndCoordsAtQP_ZOT(DOFVectorBase<double> *dv,
 			 BinaryAbstractFunction<double, double, WorldVector<double> > *f_)
       : ZeroOrderTerm(f_->getDegree()), vec(dv), f(f_) 
-    {
-    };
+    {}
 
     /** \brief
      * Implementation of \ref OperatorTerm::initElement().
@@ -2771,8 +2762,7 @@ namespace AMDiS {
 			TertiaryAbstractFunction<double, double, WorldVector<double>,
 			double > *f_)
       : ZeroOrderTerm(f_->getDegree()), vec1(dv1), vec2(dv2), f(f_) 
-    {
-    };
+    {}
 
     /** \brief
      * Implementation of \ref OperatorTerm::initElement().
@@ -2836,8 +2826,7 @@ namespace AMDiS {
     FctGradient_ZOT(DOFVectorBase<double> *dv,
 		    AbstractFunction<double, WorldVector<double> > *f_)
       : ZeroOrderTerm(f_->getDegree()), vec(dv), f(f_)
-    {
-    };
+    {}
 
     /** \brief
      * Implementation of \ref OperatorTerm::initElement().
@@ -2892,8 +2881,7 @@ namespace AMDiS {
     VecAndGradAtQP_ZOT(DOFVectorBase<double> *dv,
 		       BinaryAbstractFunction<double, double, WorldVector<double> > *f_)
       : ZeroOrderTerm(f_->getDegree()), vec(dv), f(f_) 
-    {
-    };
+    {}
 
     /** \brief
      * Implementation of \ref OperatorTerm::initElement().
@@ -2954,8 +2942,7 @@ namespace AMDiS {
     VecAndGradAtQP_SOT(DOFVectorBase<double> *dv,
 		       BinaryAbstractFunction<double, double, WorldVector<double> > *f_)
       : SecondOrderTerm(f_->getDegree()), vec(dv), f(f_) 
-    {
-    };
+    {}
 
     /** \brief
      * Implementation of \ref OperatorTerm::initElement().
@@ -3026,7 +3013,7 @@ namespace AMDiS {
     CoordsAtQP_ZOT(AbstractFunction<double, WorldVector<double> > *g_)
       : ZeroOrderTerm(g_->getDegree()), 
 	g(g_) 
-    {};
+    {}
 
     /** \brief
      * Implementation of \ref OperatorTerm::initElement().
@@ -3083,7 +3070,7 @@ namespace AMDiS {
       : SecondOrderTerm(g_->getDegree()), g(g_), xi(x_i), xj(x_j)
     {
       setSymmetric(xi == xj);
-    };
+    }
 
     /** \brief
      * Implementation of \ref OperatorTerm::initElement().
@@ -3153,7 +3140,7 @@ namespace AMDiS {
       : SecondOrderTerm(f_->getDegree()), vec(dv), f(f_), xi(x_i), xj(x_j)
     {
       setSymmetric(xi == xj);
-    };
+    }
 
     /** \brief
      * Implementation of \ref OperatorTerm::initElement().
@@ -3219,8 +3206,7 @@ namespace AMDiS {
 			  DOFVectorBase<double> *dGrd,
 			  BinaryAbstractFunction<double, double, WorldVector<double> > *f_) 
       : ZeroOrderTerm(f_->getDegree()), vec(dv), vecGrd(dGrd), f(f_) 
-    { 
-    }; 
+    {}
 
     /** \brief
      * Implementation of \ref OperatorTerm::initElement().
@@ -3283,8 +3269,7 @@ namespace AMDiS {
 			   TertiaryAbstractFunction<double, 
 			   double, WorldVector<double>, WorldVector<double> > *f_) 
       : ZeroOrderTerm(f_->getDegree()), vec(dv), vecGrd1(dGrd1), vecGrd2(dGrd2), f(f_) 
-    { 
-    }; 
+    {}
 
     /** \brief
      * Implementation of \ref OperatorTerm::initElement().
@@ -3356,7 +3341,7 @@ namespace AMDiS {
       : ZeroOrderTerm(f_->getDegree()), vecs(dv), f(f_) 
     {
       vecsAtQPs.resize(vecs.size());
-    }; 
+    } 
 
     /** \brief
      * Implementation of \ref OperatorTerm::initElement().
@@ -3407,7 +3392,7 @@ namespace AMDiS {
       : ZeroOrderTerm(f_->getDegree()), vecs(dv), f(f_) 
     {
       gradsAtQPs.resize(vecs.size());
-    }; 
+    } 
 
     /** \brief
      * Implementation of \ref OperatorTerm::initElement().
@@ -3465,7 +3450,7 @@ namespace AMDiS {
       vecs[0] = vec0;
       vecs[1] = vec1;
       vecs[2] = vec2;
-    }; 
+    }
 
     /** \brief
      * Implementation of \ref OperatorTerm::initElement().
@@ -3514,7 +3499,7 @@ namespace AMDiS {
       : ZeroOrderTerm(f_->getDegree()), vec(vec_), vecs(dv), f(f_)
     {
       gradsAtQPs.resize(vecs.size());
-    };
+    }
 
     /** \brief
      * Implementation of \ref OperatorTerm::initElement().
@@ -3587,7 +3572,7 @@ namespace AMDiS {
     {
       vecsAtQPs_.resize(vecs_.size());
       gradsAtQPs_.resize(grads_.size());
-    };
+    }
 
     /** \brief
      * Implementation of \ref OperatorTerm::initElement().
@@ -3650,7 +3635,7 @@ namespace AMDiS {
     {
       vecsAtQPs_.resize(vecs_.size());
       gradsAtQPs_.resize(grads_.size());
-    };
+    }
 
     /** \brief
      * Implementation of \ref OperatorTerm::initElement().
@@ -3740,21 +3725,21 @@ namespace AMDiS {
     /** \brief
      * Destructor.
      */
-    virtual ~Operator() {};
+    virtual ~Operator() {}
 
     /** \brief
      * Sets \ref optimized.
      */
     inline void useOptimizedAssembler(bool opt) {
       optimized = opt;
-    };
+    }
 
     /** \brief
      * Returns \ref optimized.
      */
     inline bool isOptimized() {
       return optimized;
-    };
+    }
 
     /** \brief
      * Adds a SecondOrderTerm to the Operator
@@ -3897,7 +3882,7 @@ namespace AMDiS {
 	   ++termIt) {
 	(*termIt)->eval(numPoints, uhAtQP, grdUhAtQP, D2UhAtQP, result, factor);
       }
-    };
+    }
 
 
     /** \brief
@@ -3918,7 +3903,7 @@ namespace AMDiS {
 	   ++termIt) {
 	(*termIt)->eval(numPoints, uhAtQP, grdUhAtQP, D2UhAtQP, result, factor);
       }
-    };
+    }
 
     /** \brief
      * Evaluation of all terms in \ref firstOrderGrdPhi. 
@@ -3938,7 +3923,7 @@ namespace AMDiS {
 	   ++termIt) {
 	(*termIt)->eval(numPoints, uhAtQP, grdUhAtQP, D2UhAtQP, result, factor);
       }
-    };
+    }
 
 
     /** \brief
@@ -3959,7 +3944,7 @@ namespace AMDiS {
 	   ++termIt) {
 	(*termIt)->eval(numPoints, uhAtQP, grdUhAtQP, D2UhAtQP, result, factor);
       }
-    };
+    }
 
     /** \brief
      * Weak evaluation of all terms in \ref secondOrder. 
@@ -3976,7 +3961,7 @@ namespace AMDiS {
 	   ++termIt) {
 	static_cast<SecondOrderTerm*>(*termIt)->weakEval(numPoints, grdUhAtQP, result);
       }
-    };
+    }
   
     /** \brief
      * Calls getLALt() for each term in \ref secondOrder 
@@ -3992,7 +3977,7 @@ namespace AMDiS {
 	   ++termIt) {
 	static_cast<SecondOrderTerm*>(*termIt)->getLALt(elInfo, numPoints, LALt);
       }
-    };
+    }
   
     /** \brief
      * Calls getLb() for each term in \ref firstOrderGrdPsi 
@@ -4008,7 +3993,7 @@ namespace AMDiS {
 	   ++termIt) {
 	static_cast<FirstOrderTerm*>(*termIt)->getLb(elInfo, numPoints, Lb);
       }
-    };
+    }
 
     /** \brief
      * Calls getLb() for each term in \ref firstOrderGrdPhi 
@@ -4024,7 +4009,7 @@ namespace AMDiS {
 	   ++termIt) {
 	static_cast<FirstOrderTerm*>(*termIt)->getLb(elInfo, numPoints, Lb);
       }
-    };
+    }
 
     /** \brief
      * Calls getC() for each term in \ref zeroOrder
@@ -4040,14 +4025,14 @@ namespace AMDiS {
 	   ++termIt) {
 	static_cast<ZeroOrderTerm*>(*termIt)->getC(elInfo, numPoints, c);
       }
-    };
+    }
 
     /** \brief
      * Returns true, if there are second order terms. Returns false otherwise.
      */
     inline bool secondOrderTerms() {
       return secondOrder[omp_get_thread_num()].size() != 0;
-    };
+    }
 
     /** \brief
      * Returns true, if there are first order terms (grdPsi). 
@@ -4055,7 +4040,7 @@ namespace AMDiS {
      */
     inline bool firstOrderTermsGrdPsi() {
       return firstOrderGrdPsi[omp_get_thread_num()].size() != 0;
-    };
+    }
 
     /** \brief
      * Returns true, if there are first order terms (grdPhi). 
@@ -4063,7 +4048,7 @@ namespace AMDiS {
      */
     inline bool firstOrderTermsGrdPhi() {
       return firstOrderGrdPhi[omp_get_thread_num()].size() != 0;
-    };
+    }
 
     /** \brief
      * Returns true, if there are zero order terms.
@@ -4071,7 +4056,7 @@ namespace AMDiS {
      */
     inline bool zeroOrderTerms() {
       return zeroOrder[omp_get_thread_num()].size() != 0;
-    };
+    }
 
   public:
     /** \brief
diff --git a/AMDiS/src/ProblemVec.cc b/AMDiS/src/ProblemVec.cc
index 1ba7847a..3d8817d3 100644
--- a/AMDiS/src/ProblemVec.cc
+++ b/AMDiS/src/ProblemVec.cc
@@ -833,7 +833,7 @@ namespace AMDiS {
 				     double *estFactor)
   {
     FUNCNAME("ProblemVec::addMatrixOperator()");
-
+   
     if (!(*systemMatrix_)[i][j]) {
       TEST_EXIT(i != j)("should have been created already\n");
       (*systemMatrix_)[i][j] = NEW DOFMatrix(componentSpaces[i],
diff --git a/AMDiS/src/ZeroOrderAssembler.cc b/AMDiS/src/ZeroOrderAssembler.cc
index e3579a36..2d72f50d 100644
--- a/AMDiS/src/ZeroOrderAssembler.cc
+++ b/AMDiS/src/ZeroOrderAssembler.cc
@@ -175,14 +175,13 @@ namespace AMDiS {
     // The constants are defined by the subElement Matrix.
 
 
+    int myRank = omp_get_thread_num();
     int nPoints = quadrature->getNumPoints();
     double *c = GET_MEMORY(double, nPoints);
-
     for (int iq = 0; iq < nPoints; iq++) {
       c[iq] = 0.0;
     }
 
-    int myRank = omp_get_thread_num();
     std::vector<OperatorTerm*>::iterator termIt;
     for (termIt = terms[myRank].begin(); termIt != terms[myRank].end(); ++termIt) {
       (static_cast<ZeroOrderTerm*>((*termIt)))->getC(rowElInfo, nPoints, c);
@@ -205,6 +204,8 @@ namespace AMDiS {
 	}
       }
     }
+
+    FREE_MEMORY(c, double, nPoints);
   }
 
   void StandardZOA::calculateElementVector(const ElInfo *elInfo, ElementVector *vec)
@@ -308,6 +309,69 @@ namespace AMDiS {
     }
   }
 
+  void FastQuadZOA::calculateElementMatrix(const ElInfo *rowElInfo,
+					   const ElInfo *colElInfo,
+					   const ElInfo *smallElInfo,
+					   const ElInfo *largeElInfo,
+					   ElementMatrix *mat) 
+  {
+    int nPoints = quadrature->getNumPoints();
+    int myRank = omp_get_thread_num();
+    DimMat<double> *m = smallElInfo->getSubElemCoordsMat();
+
+    if (firstCall) {
+#ifdef _OPENMP
+#pragma omp critical
+#endif 
+      {
+	cPtrs[myRank] = GET_MEMORY(double, nPoints);
+	const BasisFunction *basFcts = owner->getRowFESpace()->getBasisFcts();
+	psiFast = updateFastQuadrature(psiFast, basFcts, INIT_PHI);
+	basFcts = owner->getColFESpace()->getBasisFcts();
+	phiFast = updateFastQuadrature(phiFast, basFcts, INIT_PHI);
+	firstCall = false;
+      }
+    }
+
+    double *c = cPtrs[myRank];
+    for (int iq = 0; iq < nPoints; iq++) {
+      c[iq] = 0.0;
+    }
+
+    std::vector<OperatorTerm*>::iterator termIt;
+    for (termIt = terms[myRank].begin(); termIt != terms[myRank].end(); ++termIt) {
+      (static_cast<ZeroOrderTerm*>((*termIt)))->getC(rowElInfo, nPoints, c);
+    }
+
+    for (int iq = 0; iq < nPoints; iq++) {
+      c[iq] *= smallElInfo->getDet();
+      
+      const double *psi = psiFast->getPhi(iq);
+      const double *phi = phiFast->getPhi(iq);
+
+      //      for (int i = 0; i < nRow; i++) {
+      //	for (int j = 0; j < nCol; j++) {
+      //	  (*mat)[i][j] += quadrature->getWeight(iq) * c[iq] * psi[i] * phi[j];
+      //	}
+      //      }
+
+      for (int i = 0; i < nCol; i++) { 
+	for (int j = 0; j < nRow; j++) { 
+	  double val = quadrature->getWeight(iq) * c[iq] * psi[i];
+
+	  double tmpval = 0.0;
+	  for (int k = 0; k < nCol; k++) {
+	    tmpval += (*m)[j][k] * phi[k];
+	  }
+	  val *= tmpval;
+
+	  (*mat)[j][i] += val;
+	}
+      }
+
+    }    
+  }
+
   void FastQuadZOA::calculateElementVector(const ElInfo *elInfo, ElementVector *vec)
   {
     if (firstCall) {
diff --git a/AMDiS/src/ZeroOrderAssembler.h b/AMDiS/src/ZeroOrderAssembler.h
index aa33fcce..4c40f300 100644
--- a/AMDiS/src/ZeroOrderAssembler.h
+++ b/AMDiS/src/ZeroOrderAssembler.h
@@ -121,10 +121,7 @@ namespace AMDiS {
 				const ElInfo *colElInfo,
 				const ElInfo *smallElInfo,
 				const ElInfo *largeElInfo,
-				ElementMatrix *mat) 
-    {
-      ERROR_EXIT("CEM not yet\n");
-    }
+				ElementMatrix *mat);
 
     /** \brief
      * Implements SubAssembler::calculateElementVector().
-- 
GitLab