From 147d19c0e5ddd51439796e5d2eaaf47b0c97e31c Mon Sep 17 00:00:00 2001
From: Thomas Witkowski <thomas.witkowski@gmx.de>
Date: Wed, 10 Mar 2010 07:30:46 +0000
Subject: [PATCH] Introduced stack for subElemMatrices.

---
 AMDiS/src/ElInfo.cc     |  2 ++
 AMDiS/src/ElInfo.h      |  2 ++
 AMDiS/src/ElInfo2d.cc   | 29 ++++++++++++++++++-----------
 AMDiS/src/ProblemVec.cc |  2 ++
 4 files changed, 24 insertions(+), 11 deletions(-)

diff --git a/AMDiS/src/ElInfo.cc b/AMDiS/src/ElInfo.cc
index 346d9db2..95970a06 100644
--- a/AMDiS/src/ElInfo.cc
+++ b/AMDiS/src/ElInfo.cc
@@ -14,6 +14,8 @@
 
 namespace AMDiS {
 
+  std::map<unsigned long, mtl::dense2D<double> > ElInfo::subElemMatrices;
+
   ElInfo::ElInfo(Mesh *aMesh) 
     : mesh(aMesh),
       element(NULL),
diff --git a/AMDiS/src/ElInfo.h b/AMDiS/src/ElInfo.h
index 2b75dcfd..a60d70b1 100644
--- a/AMDiS/src/ElInfo.h
+++ b/AMDiS/src/ElInfo.h
@@ -544,6 +544,8 @@ namespace AMDiS {
     mtl::dense2D<double> subElemCoordsMat_so;
 
   public:
+    static std::map<unsigned long, mtl::dense2D<double> > subElemMatrices;
+
     /** \brief 
      * child_vertex[el_type][child][i] = father's local vertex index of new 
      * vertex i. 4 stands for the newly generated vertex .
diff --git a/AMDiS/src/ElInfo2d.cc b/AMDiS/src/ElInfo2d.cc
index 44ebec46..9fc6000d 100644
--- a/AMDiS/src/ElInfo2d.cc
+++ b/AMDiS/src/ElInfo2d.cc
@@ -697,18 +697,25 @@ namespace AMDiS {
     switch (degree) {
     case 1:
       {
-      mat = mat_d1;
-      dense2D<double> tmpMat(num_rows(mat), num_rows(mat));
-
-      for (int i = 0; i < refinementPathLength; i++) {
-	if (refinementPath & (1 << i)) {
-	  tmpMat = mat_d1_right * mat;
-	  mat = tmpMat;
-	} else  {
-	  tmpMat = mat_d1_left * mat;
-	  mat = tmpMat;
+	if (subElemMatrices.count(refinementPath) > 0) {
+	  mat = subElemMatrices[refinementPath];
+	  return;
 	}
-      }
+
+	mat = mat_d1;
+	dense2D<double> tmpMat(num_rows(mat), num_rows(mat));
+	
+	for (int i = 0; i < refinementPathLength; i++) {
+	  if (refinementPath & (1 << i)) {
+	    tmpMat = mat_d1_right * mat;
+	    mat = tmpMat;
+	  } else  {
+	    tmpMat = mat_d1_left * mat;
+	    mat = tmpMat;
+	  }
+	}
+
+	subElemMatrices[refinementPath] = mat;
       }
       break;
     default:
diff --git a/AMDiS/src/ProblemVec.cc b/AMDiS/src/ProblemVec.cc
index 9816d17f..db21cd06 100644
--- a/AMDiS/src/ProblemVec.cc
+++ b/AMDiS/src/ProblemVec.cc
@@ -627,6 +627,8 @@ namespace AMDiS {
 
     //    printOpenmpTraverseInfo(this, true);
 
+    //    std::cout << "ElInfo = " << ElInfo::subElemMatrices.size() << std::endl;
+
     clock_t first = clock();
 #ifdef _OPENMP
     double wtime = omp_get_wtime();
-- 
GitLab