From 4626656bc7e73e16f039c61b69603e305eb499eb Mon Sep 17 00:00:00 2001
From: Thomas Witkowski <thomas.witkowski@gmx.de>
Date: Fri, 12 Mar 2010 13:33:41 +0000
Subject: [PATCH] Okay, ab ins Wochenende.

---
 AMDiS/Reinit/src/HL_SignedDistTraverse.cc |   2 +-
 AMDiS/src/AdaptInfo.cc                    |   4 +-
 AMDiS/src/AdaptInfo.h                     |  35 +++---
 AMDiS/src/Assembler.cc                    |   8 +-
 AMDiS/src/DOFAdmin.cc                     |   9 +-
 AMDiS/src/DOFMatrix.cc                    |   5 +
 AMDiS/src/DOFVector.cc                    |   1 +
 AMDiS/src/Element.cc                      |  10 +-
 AMDiS/src/Marker.cc                       |  10 +-
 AMDiS/src/Mesh.cc                         |  44 ++------
 AMDiS/src/Mesh.h                          |  14 ---
 AMDiS/src/ProblemVec.cc                   | 130 +++++++++++-----------
 12 files changed, 128 insertions(+), 144 deletions(-)

diff --git a/AMDiS/Reinit/src/HL_SignedDistTraverse.cc b/AMDiS/Reinit/src/HL_SignedDistTraverse.cc
index bc782dc0..5e1b3ff0 100644
--- a/AMDiS/Reinit/src/HL_SignedDistTraverse.cc
+++ b/AMDiS/Reinit/src/HL_SignedDistTraverse.cc
@@ -4,7 +4,7 @@
 void HL_SignedDistTraverse::initializeBoundary() 
 {
   FUNCNAME("HL_SignedDistTraverse::initializeBoundary()");
-  
+ 
   // ===== All non-boundary vertices are initialized with "infinity". =====
   sD_DOF->set(inftyValue);
   
diff --git a/AMDiS/src/AdaptInfo.cc b/AMDiS/src/AdaptInfo.cc
index 262ae05b..3275be86 100644
--- a/AMDiS/src/AdaptInfo.cc
+++ b/AMDiS/src/AdaptInfo.cc
@@ -8,7 +8,7 @@ namespace AMDiS {
 
   void AdaptInfo::setScalContents(int newSize) 
   {
-    int oldSize = scalContents.getSize();
+    int oldSize = static_cast<int>(scalContents.size());
 
     if (newSize > oldSize) { 
       scalContents.resize(newSize);
@@ -42,7 +42,7 @@ namespace AMDiS {
     SerUtil::serialize(out, solverTolerance);
     SerUtil::serialize(out, solverResidual);
 
-    int size = scalContents.getSize();
+    int size = static_cast<int>(scalContents.size());
     SerUtil::serialize(out, size);
     for (int i = 0; i < size; i++) {
       SerUtil::serialize(out, scalContents[i]->est_sum);
diff --git a/AMDiS/src/AdaptInfo.h b/AMDiS/src/AdaptInfo.h
index 92de1757..498f8ba0 100644
--- a/AMDiS/src/AdaptInfo.h
+++ b/AMDiS/src/AdaptInfo.h
@@ -171,8 +171,9 @@ namespace AMDiS {
     }
 
     /// Destructor.
-    virtual ~AdaptInfo() {
-      for (int i = 0;  i < scalContents.getSize(); i++)
+    virtual ~AdaptInfo() 
+    {
+      for (unsigned int i = 0;  i < scalContents.size(); i++)
 	delete scalContents[i];
     }
 
@@ -193,10 +194,10 @@ namespace AMDiS {
     /// Returns whether space tolerance is reached.
     virtual bool spaceToleranceReached() 
     {
-      int size = scalContents.getSize();
-      for (int i = 0; i < size; i++)
-      {
-	std::cout<<"est_sum:"<<scalContents[i]->est_sum<<" spaceTol:"<<scalContents[i]->spaceTolerance<<std::endl;
+      for (unsigned int i = 0; i < scalContents.size(); i++) {
+	std::cout << "est_sum:" <<scalContents[i]->est_sum 
+		  << " spaceTol: " << scalContents[i]->spaceTolerance 
+		  << std::endl;
 	if (!(scalContents[i]->est_sum < scalContents[i]->spaceTolerance))
 	  return false;
       }
@@ -216,8 +217,7 @@ namespace AMDiS {
     /// Returns whether time tolerance is reached.
     virtual bool timeToleranceReached() 
     {
-      int size = scalContents.getSize();
-      for (int i = 0; i < size; i++)
+      for (unsigned int i = 0; i < scalContents.size(); i++)
 	if (!(scalContents[i]->est_t_sum < scalContents[i]->timeTolerance))
 	  return false;
 
@@ -236,8 +236,7 @@ namespace AMDiS {
     /// Returns whether time error is under its lower bound.
     virtual bool timeErrorLow() 
     {
-      int size = scalContents.getSize();
-      for (int i = 0; i < size; i++)
+      for (unsigned int i = 0; i < scalContents.size(); i++)
 	if (!(scalContents[i]->est_t_sum < scalContents[i]->timeErrLow))
 	  return false;
 
@@ -247,7 +246,7 @@ namespace AMDiS {
     /// Print debug information about time error and its bound.
     void printTimeErrorLowInfo() 
     {
-      for (int i = 0; i < scalContents.getSize(); i++)
+      for (unsigned int i = 0; i < scalContents.size(); i++)
 	std::cout << "    Time error estimate = " << scalContents[i]->est_t_sum 
 		  << "    Time error bound = " << scalContents[i]->timeErrLow << "\n";
     }
@@ -387,6 +386,11 @@ namespace AMDiS {
     /// Returns \ref est_sum.
     inline double getEstSum(int index) 
     { 
+      FUNCNAME("AdaptInfo::getEstSum()");
+
+      TEST_EXIT_DBG(static_cast<unsigned int>(index) < scalContents.size())
+	("Wrong index for adaptInfo!\n");
+
       return scalContents[index]->est_sum; 
     }
 
@@ -399,6 +403,11 @@ namespace AMDiS {
     /// Returns \ref est_max.
     inline double getEstMax(int index) 
     { 
+      FUNCNAME("AdaptInfo::getEstSum()");
+
+      TEST_EXIT_DBG(static_cast<unsigned int>(index) < scalContents.size())
+	("Wrong index for adaptInfo!\n");
+
       return scalContents[index]->est_max; 
     }
 
@@ -586,7 +595,7 @@ namespace AMDiS {
 
     inline int getSize() 
     { 
-      return scalContents.getSize(); 
+      return scalContents.size(); 
     }
 
     inline void setSolverIterations(int it) 
@@ -728,7 +737,7 @@ namespace AMDiS {
     double solverResidual;
 
     /// Scalar adapt infos.
-    Vector<ScalContent*> scalContents;
+    std::vector<ScalContent*> scalContents;
 
     /// Is true, if the adaptive procedure was deserialized from a file.
     bool isDeserialized_;
diff --git a/AMDiS/src/Assembler.cc b/AMDiS/src/Assembler.cc
index a9a1078e..d6954d9c 100644
--- a/AMDiS/src/Assembler.cc
+++ b/AMDiS/src/Assembler.cc
@@ -135,12 +135,12 @@ namespace AMDiS {
       ElementMatrix &m = 
 	smallElInfo->getSubElemCoordsMat(rowFESpace->getBasisFcts()->getDegree());
 
-      if (smallElInfo == colElInfo) 
+      if (smallElInfo == colElInfo)
 	tmpMat = m * mat;	
       else
-	tmpMat = mat * trans(m);
-
-      mat = tmpMat;     
+  	tmpMat = mat * trans(m);
+      
+      mat = tmpMat;
     }
 
     if (rememberElMat && &userMat != &elementMatrix)
diff --git a/AMDiS/src/DOFAdmin.cc b/AMDiS/src/DOFAdmin.cc
index 9e8ddd69..fa859f95 100644
--- a/AMDiS/src/DOFAdmin.cc
+++ b/AMDiS/src/DOFAdmin.cc
@@ -246,14 +246,14 @@ namespace AMDiS {
     ERROR("container not in list\n");
   }
 
+
   void DOFAdmin::compress(std::vector<DegreeOfFreedom> &new_dof)
   {
     FUNCNAME("DOFAdmin::compress()");
 
     // nothing to do ?
-    if (size < 1) return;
-    if (usedCount < 1) return;
-    if (holeCount < 1) return;
+    if (size < 1 || usedCount < 1 || holeCount < 1) 
+      return;
 
     // vector to mark used dofs
     for (int i = 0; i < size; i++)
@@ -289,7 +289,7 @@ namespace AMDiS {
     // get index of first changed dof
     int first = last;
     for (int i = 0; i<size; i++) {
-      if ((new_dof[i] < i) && (new_dof[i] >= 0)) {
+      if (new_dof[i] < i && new_dof[i] >= 0) {
 	first = i;
 	break;
       }
@@ -307,6 +307,7 @@ namespace AMDiS {
       (*dc)->compressDOFContainer(n, new_dof);
   }
 
+
   void DOFAdmin::setNumberOfDOFs(int i, int v) 
   { 
     FUNCNAME("DOFAdmin::setNumberOfDOFs()");
diff --git a/AMDiS/src/DOFMatrix.cc b/AMDiS/src/DOFMatrix.cc
index a8d6589e..fcc63e76 100644
--- a/AMDiS/src/DOFMatrix.cc
+++ b/AMDiS/src/DOFMatrix.cc
@@ -345,6 +345,7 @@ namespace AMDiS {
     addElementMatrix(elementMatrix, bound, mainElInfo, NULL);       
   }
 
+
   void DOFMatrix::finishAssembling()
   {
     // call the operatos cleanup procedures
@@ -353,6 +354,7 @@ namespace AMDiS {
       (*it)->finishAssembling();
   }
 
+
   // Should work as before
   Flag DOFMatrix::getAssembleFlag()
   {
@@ -364,6 +366,7 @@ namespace AMDiS {
     return fillFlag;
   }
 
+
   void DOFMatrix::axpy(double a, const DOFMatrix& x, const DOFMatrix& y)
   {
     matrix+= a * x.matrix + y.matrix;
@@ -375,6 +378,7 @@ namespace AMDiS {
     matrix*= b;
   }
 
+
   void DOFMatrix::addOperator(Operator *op, double* factor, double* estFactor) 
   { 
     operators.push_back(op);
@@ -382,6 +386,7 @@ namespace AMDiS {
     operatorEstFactor.push_back(estFactor);
   }
 
+
   void DOFMatrix::serialize(std::ostream &out)
   {
     using namespace mtl; 
diff --git a/AMDiS/src/DOFVector.cc b/AMDiS/src/DOFVector.cc
index 04ae730c..cb978648 100644
--- a/AMDiS/src/DOFVector.cc
+++ b/AMDiS/src/DOFVector.cc
@@ -829,6 +829,7 @@ namespace AMDiS {
       addElementVector(factor, this->elementVector, bound, elInfo);
   }
 
+
   template<>
   void DOFVectorBase<double>::assemble2(double factor, 
 					ElInfo *mainElInfo, ElInfo *auxElInfo,
diff --git a/AMDiS/src/Element.cc b/AMDiS/src/Element.cc
index 62c5618f..39c8fe3d 100644
--- a/AMDiS/src/Element.cc
+++ b/AMDiS/src/Element.cc
@@ -260,7 +260,7 @@ namespace AMDiS {
 
   void Element::newDOFFct2(const DOFAdmin* admin)
   {
-    int i, j, k, n0, nd0;
+    int j, k, n0, nd0;
     DegreeOfFreedom  *ldof;
     int vertices = mesh->getGeo(VERTEX);
     int edges = mesh->getGeo(EDGE); 
@@ -270,7 +270,7 @@ namespace AMDiS {
     if (nd) {
       nd0 = admin->getNumberOfPreDOFs(VERTEX);
       n0 = admin->getMesh()->getNode(VERTEX);
-      for (i = 0; i < vertices; i++) {
+      for (int i = 0; i < vertices; i++) {
 	CHANGE_DOFS_2(this);
       }
     }
@@ -280,7 +280,7 @@ namespace AMDiS {
       if (nd) {
 	nd0 = admin->getNumberOfPreDOFs(EDGE);
 	n0 = admin->getMesh()->getNode(EDGE);
-	for (i = 0; i < edges; i++) {
+	for (int i = 0; i < edges; i++) {
 	  CHANGE_DOFS_2(this);
 	}
       }
@@ -291,7 +291,7 @@ namespace AMDiS {
       if (nd) {
 	nd0 = admin->getNumberOfPreDOFs(FACE);
 	n0 = admin->getMesh()->getNode(FACE);
-	for (i = 0; i < faces; i++) {
+	for (int i = 0; i < faces; i++) {
 	  CHANGE_DOFS_2(this);
 	}
       }
@@ -302,7 +302,7 @@ namespace AMDiS {
       nd0 = admin->getNumberOfPreDOFs(CENTER);
       n0 = admin->getMesh()->getNode(CENTER);
       // only one center
-      i = 0;   
+      int i = 0;   
       CHANGE_DOFS_2(this);
     }
   }
diff --git a/AMDiS/src/Marker.cc b/AMDiS/src/Marker.cc
index 18c2fd44..a9342bf0 100644
--- a/AMDiS/src/Marker.cc
+++ b/AMDiS/src/Marker.cc
@@ -35,7 +35,7 @@ namespace AMDiS {
   {
     FUNCNAME("Marker::initMarking()");
 
-    TEST_EXIT(adaptInfo)("No AdaptInfo object!\n");
+    TEST_EXIT_DBG(adaptInfo)("No AdaptInfo object!\n");
 
     elMarkRefine = 0;
     elMarkCoarsen = 0;
@@ -70,8 +70,12 @@ namespace AMDiS {
 
   Flag Marker::markMesh(AdaptInfo *adaptInfo, Mesh *mesh) 
   {
+    FUNCNAME("Marker::markMesh()");
+
+    TEST_EXIT_DBG(mesh)("No mesh!\n");
+
     initMarking(adaptInfo, mesh);
-    
+   
     if (!adaptInfo->isCoarseningAllowed(row == -1 ? 0 : row) && 
 	!adaptInfo->isRefinementAllowed(row == -1 ? 0 : row))
       return 0;    
@@ -100,7 +104,7 @@ namespace AMDiS {
     FUNCNAME("ESMarker::initMarking()");
     
     Marker::initMarking(adaptInfo, mesh);
-    
+   
     double ESThetaP = pow(ESTheta, p);
     double ESThetaCP = pow(ESThetaC, p);
     
diff --git a/AMDiS/src/Mesh.cc b/AMDiS/src/Mesh.cc
index 80f05347..d5cfc0a0 100644
--- a/AMDiS/src/Mesh.cc
+++ b/AMDiS/src/Mesh.cc
@@ -63,7 +63,6 @@ namespace AMDiS {
 
   // const Flag Mesh::USE_PARAMETRIC          = 0X8000L ; // used in mg methods 
 
-  DOFAdmin* Mesh::compressAdmin = NULL;
   std::vector<DegreeOfFreedom> Mesh::dof_used;
   const int Mesh::MAX_DOF = 100;
   std::map<std::pair<DegreeOfFreedom, int>, DegreeOfFreedom*> Mesh::serializedDOFs;
@@ -432,46 +431,39 @@ namespace AMDiS {
       nNodeEl += 1;
   }
 
+
   void Mesh::dofCompress()
   {
     FUNCNAME("Mesh::dofCompress()");
-    Flag fill_flag;
 
-    for (int iadmin = 0; iadmin < static_cast<int>(admin.size()); iadmin++) {
-      compressAdmin = admin[iadmin];
+    for (unsigned int iadmin = 0; iadmin < admin.size(); iadmin++) {
+      DOFAdmin* compressAdmin = admin[iadmin];
 
       TEST_EXIT_DBG(compressAdmin)("no admin[%d] in mesh\n", iadmin);
       
       int size = compressAdmin->getSize();
-      if (size < 1) 
-	continue;
-
-      if (compressAdmin->getUsedDOFs() < 1)    
+      if (size < 1 || 
+	  compressAdmin->getUsedDOFs() < 1 || 
+	  compressAdmin->getHoleCount() < 1)    
 	continue;
 
-      if (compressAdmin->getHoleCount() < 1)    
-	continue;
-  
       newDOF.resize(size);
       
       compressAdmin->compress(newDOF);
-      
-      if (preserveCoarseDOFs)
-	fill_flag = Mesh::CALL_EVERY_EL_PREORDER | Mesh::FILL_NOTHING;
-      else
-	fill_flag = Mesh::CALL_LEAF_EL | Mesh::FILL_NOTHING;
-      
-      
+
+      Flag fill_flag = (preserveCoarseDOFs ?  
+			Mesh::CALL_EVERY_EL_PREORDER | Mesh::FILL_NOTHING :
+			Mesh::CALL_LEAF_EL | Mesh::FILL_NOTHING);          
       TraverseStack stack;
       ElInfo *elInfo = stack.traverseFirst(this, -1, fill_flag);
       while (elInfo) {
-	newDOFFct1(elInfo);
+	elInfo->getElement()->newDOFFct1(compressAdmin);
 	elInfo = stack.traverseNext(elInfo);
       }
 
       elInfo = stack.traverseFirst(this, -1, fill_flag);
       while (elInfo) {
-	newDOFFct2(elInfo);
+	elInfo->getElement()->newDOFFct2(compressAdmin);
 	elInfo = stack.traverseNext(elInfo);
       }
 
@@ -941,18 +933,6 @@ namespace AMDiS {
     diam[i] = w; 
   }
 
-  int Mesh::newDOFFct1(ElInfo* ei) 
-  {
-    ei->getElement()->newDOFFct1(compressAdmin);
-    return 0;
-  }
-
-  int Mesh::newDOFFct2(ElInfo* ei) 
-  {
-    ei->getElement()->newDOFFct2(compressAdmin);
-    return 0;
-  }
-
   void Mesh::serialize(std::ostream &out)
   {
     serializedDOFs.clear();
diff --git a/AMDiS/src/Mesh.h b/AMDiS/src/Mesh.h
index 3dd5c345..57369844 100644
--- a/AMDiS/src/Mesh.h
+++ b/AMDiS/src/Mesh.h
@@ -68,17 +68,6 @@ namespace AMDiS {
     /// Assignment operator
     Mesh& operator=(const Mesh&);
 
-    /** \name static methods used while mesh traversal 
-     * \{
-     */
-
-    /// Used while dof compress
-    static int newDOFFct1(ElInfo* e);
-
-    /// Used while dof compress
-    static int newDOFFct2(ElInfo* e);
-    /** \} */
-
     /** \name getting methods
      * \{
      */
@@ -765,9 +754,6 @@ namespace AMDiS {
     /// Needed during DOF compression (\ref DOFAdmin::compress).
     std::vector<DegreeOfFreedom> newDOF;
 
-    /// Needed during DOF compression (\ref DOFAdmin::compress).
-    static DOFAdmin *compressAdmin;
-
     /// Used by check functions
     static std::vector<DegreeOfFreedom> dof_used;
 
diff --git a/AMDiS/src/ProblemVec.cc b/AMDiS/src/ProblemVec.cc
index 822cd79b..827d6c5c 100644
--- a/AMDiS/src/ProblemVec.cc
+++ b/AMDiS/src/ProblemVec.cc
@@ -564,16 +564,21 @@ namespace AMDiS {
     // here is reached already because of time adaption
     allowFirstRefinement();
 
+    TEST_EXIT_DBG(static_cast<unsigned int>(nComponents == marker.size()))
+      ("Wrong number of markers!\n");
+
     Flag markFlag = 0;
-    for (int i = 0; i < nComponents; i++)
+    for (int i = 0; i < nComponents; i++) {
       if (marker[i])
 	markFlag |= marker[i]->markMesh(adaptInfo, componentMeshes[i]);
       else
-	WARNING("No marker for component %d\n", i);         
+	WARNING("No marker for component %d\n", i);              
+    }
     
     return markFlag;
   }
 
+
   Flag ProblemVec::refineMesh(AdaptInfo *adaptInfo) 
   {
     FUNCNAME("ProblemVec::refineMesh()");
@@ -587,6 +592,7 @@ namespace AMDiS {
     return refineFlag;
   }
 
+
   Flag ProblemVec::coarsenMesh(AdaptInfo *adaptInfo) 
   {
     FUNCNAME("ProblemVec::coarsenMesh()");
@@ -600,6 +606,7 @@ namespace AMDiS {
     return coarsenFlag;
   }
 
+
   Flag ProblemVec::oneIteration(AdaptInfo *adaptInfo, Flag toDo)
   {
     FUNCNAME("ProblemVec::oneIteration()");
@@ -620,6 +627,7 @@ namespace AMDiS {
     return StandardProblemIteration::oneIteration(adaptInfo, toDo);
   }
 
+
   void ProblemVec::buildAfterCoarsen(AdaptInfo *adaptInfo, Flag flag,
 				     bool asmMatrix, bool asmVector)
   {
@@ -633,13 +641,15 @@ namespace AMDiS {
     //    printOpenmpTraverseInfo(this, true);
     //    std::cout << "ElInfo = " << ElInfo::subElemMatrices.size() << std::endl;
 
+    for (unsigned int i = 0; i < meshes.size(); i++)
+      meshes[i]->dofCompress();
+
+
     clock_t first = clock();
 #ifdef _OPENMP
     double wtime = omp_get_wtime();
 #endif
 
-    for (int i = 0; i < static_cast<int>(meshes.size()); i++)
-      meshes[i]->dofCompress();
 
     Flag assembleFlag = 
       flag | 
@@ -653,7 +663,8 @@ namespace AMDiS {
 
     if (useGetBound)
       assembleFlag |= Mesh::FILL_BOUND;
-   
+
+  
     traverseInfo.updateStatus();
 
     // Used to calculate the overall number of non zero entries.
@@ -734,6 +745,7 @@ namespace AMDiS {
       
 	assembledMatrix[i][j] = true;
 
+	
 	if (assembleMatrix)
 	  matrix->finishInsertion();
 
@@ -741,18 +753,18 @@ namespace AMDiS {
  	  matrix->getBoundaryManager()->exitMatrix(matrix);	
 	
 	if (matrix)
-	  nnz += matrix->getBaseMatrix().nnz();	  	
+	  nnz += matrix->getBaseMatrix().nnz();
       }
 
       // And now assemble boundary conditions on the vectors
       assembleBoundaryConditions(rhs->getDOFVector(i),
-				 solution->getDOFVector(i),
-				 componentMeshes[i],
-				 assembleFlag);     
+ 				 solution->getDOFVector(i),
+ 				 componentMeshes[i],
+ 				 assembleFlag);     
     }
 
     solverMatrix.setMatrix(*systemMatrix);
-
+	 
     createPrecon();
 
     INFO(info, 8)("fillin of assembled matrix: %d\n", nnz);
@@ -781,14 +793,16 @@ namespace AMDiS {
   {
     FUNCNAME("ProblemVec::dualAssemble()");
 
+    for (unsigned int i = 0; i < meshes.size(); i++)
+      meshes[i]->dofCompress();
+
+
     clock_t first = clock();
 #ifdef _OPENMP
     double wtime = omp_get_wtime();
 #endif
 
-    for (int i = 0; i < static_cast<int>(meshes.size()); i++)
-      meshes[i]->dofCompress();
-
+    
     Flag assembleFlag = 
       flag | 
       (*systemMatrix)[0][0]->getAssembleFlag() | 
@@ -801,7 +815,7 @@ namespace AMDiS {
 
     if (useGetBound)
       assembleFlag |= Mesh::FILL_BOUND;
-   
+
     traverseInfo.updateStatus();
 
     // Used to calculate the overall number of non zero entries.
@@ -887,11 +901,11 @@ namespace AMDiS {
     bool cont = dualTraverse.traverseFirst(meshes[0], meshes[1], -1, -1, 
 					   assembleFlag, assembleFlag, dualElInfo);
 
-    while (cont) {
+    while (cont) {     
       bool newEl0 = (dualElInfo.rowElInfo->getElement()->getIndex() != oldElIndex0);
       bool newEl1 = (dualElInfo.colElInfo->getElement()->getIndex() != oldElIndex1);
       oldElIndex0 = dualElInfo.rowElInfo->getElement()->getIndex();
-      oldElIndex1 = dualElInfo.colElInfo->getElement()->getIndex();
+      oldElIndex1 = dualElInfo.colElInfo->getElement()->getIndex();      
 
       for (int i = 0; i < nComponents; i++) {
 	for (int j = 0; j < nComponents; j++) {
@@ -901,64 +915,48 @@ namespace AMDiS {
 	    continue;
 
 	  if (traverseInfo.eqSpaces(i, j)) {
+
 	    ElInfo *elInfo = NULL;	    
 	    if (componentMeshes[i] == meshes[0] && newEl0)
 	      elInfo = dualElInfo.rowElInfo;	    
 	    if (componentMeshes[i] == meshes[1] && newEl1)
 	      elInfo = dualElInfo.colElInfo;
-	    
+	  
+
 	    if (elInfo != NULL) {
 	      if (useGetBound)
 		basisFcts->getBound(elInfo, bound);
 	      
-	      if (matrix) {
+	      if (matrix)
 		matrix->assemble(1.0, elInfo, bound);
-		// Take the matrix boundary manager from the public matrix,
-		// but assemble the boundary conditions on the thread private matrix.
-		if (matrix->getBoundaryManager())
-		  matrix->getBoundaryManager()->fillBoundaryConditions(elInfo, matrix);
-	      }
-
+	      
 	      if (i == j)
 		rhs->getDOFVector(i)->assemble(1.0, elInfo, bound);
 	    }
-	    
-	    if (traverseInfo.difAuxSpace(i) && i == j) {
-	      ElInfo *mainElInfo, *auxElInfo;
-	      if (traverseInfo.getRowFeSpace(i)->getMesh() == meshes[0]) {
-		mainElInfo = dualElInfo.rowElInfo;
-		auxElInfo = dualElInfo.colElInfo;
-	      } else {
-		mainElInfo = dualElInfo.colElInfo;
-		auxElInfo = dualElInfo.rowElInfo;
-	      }
 
-	      if (useGetBound)
-		basisFcts->getBound(mainElInfo, bound);
-
-	      rhs->getDOFVector(i)->assemble2(1.0, mainElInfo, auxElInfo,
-					      dualElInfo.smallElInfo, dualElInfo.largeElInfo, bound);
+	    ElInfo *mainElInfo, *auxElInfo;
+	    if (traverseInfo.getRowFeSpace(i)->getMesh() == meshes[0]) {
+	      mainElInfo = dualElInfo.rowElInfo;
+	      auxElInfo = dualElInfo.colElInfo;
+	    } else {
+	      mainElInfo = dualElInfo.colElInfo;
+	      auxElInfo = dualElInfo.rowElInfo;
 	    }
 
-	    if (traverseInfo.difAuxSpace(i, j) && matrix) {
-	      ElInfo *mainElInfo, *auxElInfo;
-	      if (traverseInfo.getRowFeSpace(i)->getMesh() == meshes[0]) {
-		mainElInfo = dualElInfo.rowElInfo;
-		auxElInfo = dualElInfo.colElInfo;
-	      } else {
-		mainElInfo = dualElInfo.colElInfo;
-		auxElInfo = dualElInfo.rowElInfo;
-	      }
+	    if (useGetBound && mainElInfo != elInfo)
+	      basisFcts->getBound(mainElInfo, bound);
+	    
+ 	    if (traverseInfo.difAuxSpace(i) && i == j)
+ 	      rhs->getDOFVector(i)->assemble2(1.0, mainElInfo, auxElInfo,
+ 					      dualElInfo.smallElInfo, dualElInfo.largeElInfo, bound);	    
 
-	      if (useGetBound)
-		basisFcts->getBound(mainElInfo, bound);
+ 	    if (traverseInfo.difAuxSpace(i, j) && matrix)
+ 	      matrix->assemble2(1.0, mainElInfo, auxElInfo,
+ 				dualElInfo.smallElInfo, dualElInfo.largeElInfo, bound);
+
+	    if (matrix && matrix->getBoundaryManager())
+	      matrix->getBoundaryManager()->fillBoundaryConditions(mainElInfo, matrix);	
 
-	      matrix->assemble2(1.0, mainElInfo, auxElInfo,
-				dualElInfo.smallElInfo, dualElInfo.largeElInfo, bound);
-	      
-	      if (matrix->getBoundaryManager())
-		matrix->getBoundaryManager()->fillBoundaryConditions(mainElInfo, matrix);
-	    }
 	  } else {
 	    TEST_EXIT_DBG(traverseInfo.getStatus(i, j) != SingleComponentInfo::DIF_SPACES_WITH_DIF_AUX)
 	      ("Not yet supported!\n");
@@ -976,16 +974,15 @@ namespace AMDiS {
 	      basisFcts->getBound(rowElInfo, bound);	      
 	    
 	    if (matrix) {
-	      matrix->assemble(1.0, rowElInfo, colElInfo, 
-			       dualElInfo.smallElInfo, dualElInfo.largeElInfo, bound);
+ 	      matrix->assemble(1.0, rowElInfo, colElInfo, 
+ 			       dualElInfo.smallElInfo, dualElInfo.largeElInfo, bound);
 	      
 	      if (matrix->getBoundaryManager())
 		matrix->getBoundaryManager()->fillBoundaryConditions(rowElInfo, matrix);
 	    }
 	    
-	    if (i == j) 
-	      rhs->getDOFVector(i)->assemble(1.0, rowElInfo, bound);
-	    
+ 	    if (i == j) 
+ 	      rhs->getDOFVector(i)->assemble(1.0, rowElInfo, bound);    
 	  }	  
 	}
       }
@@ -1022,6 +1019,7 @@ namespace AMDiS {
 
     createPrecon();
 
+
     INFO(info, 8)("fillin of assembled matrix: %d\n", nnz);
 
 #ifdef _OPENMP
@@ -1337,8 +1335,8 @@ namespace AMDiS {
 	if (useGetBound)
 	  basisFcts->getBound(elInfo, bound);
 
- 	if (matrix) {
-	  tmpMatrix->assemble(1.0, elInfo, bound);
+  	if (matrix) {
+ 	  tmpMatrix->assemble(1.0, elInfo, bound);
 	
 	  // Take the matrix boundary manager from the public matrix,
 	  // but assemble the boundary conditions on the thread private matrix.
@@ -1346,9 +1344,9 @@ namespace AMDiS {
  	    matrix->getBoundaryManager()->fillBoundaryConditions(elInfo, tmpMatrix);    
 	}
 	
-  	if (vector)
-  	  tmpVector->assemble(1.0, elInfo, bound, NULL);
-	
+   	if (vector)
+   	  tmpVector->assemble(1.0, elInfo, bound, NULL);	
+
 	elInfo = stack.traverseNext(elInfo);
       }
 
-- 
GitLab