diff --git a/AMDiS/src/ElInfo.cc b/AMDiS/src/ElInfo.cc index 346d9db299d2b390d39365ad4c592480d9d6bf07..95970a068c67fa649c7fe06a0d3e74f527575d38 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 2b75dcfd335911ec5c42af923d04c941af293519..a60d70b194657b6f101ffe3e6edf4fecc1baecb1 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 44ebec462cb9a194abd04976af1f6240556469b6..9fc6000d7bee21654f0c276673846f9012dcf4b7 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 9816d17f4b37da90967d95b76516417c5646e6a7..db21cd06e7254450d2b70ee39eb9cdf8fc1dab3f 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();