diff --git a/AMDiS/src/parallel/CheckerPartitioner.cc b/AMDiS/src/parallel/CheckerPartitioner.cc index 4d8c747c6e31b426608223984d21ec97b15ee6ae..5142e61a0c5cb73e13effcb82016e3c650c7dbeb 100644 --- a/AMDiS/src/parallel/CheckerPartitioner.cc +++ b/AMDiS/src/parallel/CheckerPartitioner.cc @@ -152,10 +152,19 @@ namespace AMDiS { case 4: // tetrahedron-stripes + elInRank = elStripeInRank[elIndex]; + +#if 0 { + + int nStripes = elInStripe.size(); + int elsPerStripe = elInStripe[0].size(); + int procPerStripe = mpiSize / nStripes; + TEST_EXIT(mpiSize % nStripes == 0)("Should not happen!\n"); + int inStripe = -1; int stripePos = -1; - for (int stripe = 0; stripe < elInStripe.size(); stripe++) { + for (int stripe = 0; stripe < nStripes; stripe++) { for (int pos = 0; pos < elInStripe[stripe].size(); pos++) { if (elInStripe[stripe][pos] == elIndex) { inStripe = stripe; @@ -171,6 +180,7 @@ namespace AMDiS { elInRank = inStripe; } +#endif break; @@ -197,6 +207,7 @@ namespace AMDiS { FUNCNAME("CheckerPartitioner::createTetrahedronStripes()"); vector<vector<MacroElement*> > stripes; + vector<vector<int> > elInStripe; int nElements = 0; TraverseStack stack; @@ -300,6 +311,32 @@ namespace AMDiS { } TEST_EXIT(testElementCounter == nElements)("Should not happen!\n"); + + int elsPerStripe = stripes[0].size(); + for (int i = 0; i < stripes.size(); i++) { + TEST_EXIT(stripes[i].size() == elsPerStripe) + ("Should not happen!\n"); + } + + + // === Computing mapping from macro element indices to ranks === + + int nStripes = elInStripe.size(); + int procPerStripe = mpiSize / nStripes; + int elsPerRank = elsPerStripe / procPerStripe; + TEST_EXIT(mpiSize % nStripes == 0)("Should not happen!\n"); + TEST_EXIT(elsPerStripe % procPerStripe == 0)("Should not happen!\n"); + + elStripeInRank.clear(); + + int rankCount = 0; + for (int i = 0; i < nStripes; i++) { + for (int j = 0; j < procPerStripe; j++) { + for (int k = 0; k < elsPerRank; k++) + elStripeInRank[elInStripe[i][j * elsPerRank + k]] = rankCount; + rankCount++; + } + } } } diff --git a/AMDiS/src/parallel/CheckerPartitioner.h b/AMDiS/src/parallel/CheckerPartitioner.h index f1c4809a04cbaa9d4e61f2f222abd371672ef2e0..4933e8a1a4e0869cbcd9a365480c84be0ed0852b 100644 --- a/AMDiS/src/parallel/CheckerPartitioner.h +++ b/AMDiS/src/parallel/CheckerPartitioner.h @@ -65,7 +65,7 @@ namespace AMDiS { int mode; /// Only used in mode 4. - vector<vector<int> > elInStripe; + map<int, int> elStripeInRank; bool multilevel; }; diff --git a/AMDiS/src/parallel/MeshDistributor.cc b/AMDiS/src/parallel/MeshDistributor.cc index fbdd1794b5f28be5cf86ac37a055775dfa34e61c..ba828905265565f3d5756270b9b2868061eb035c 100644 --- a/AMDiS/src/parallel/MeshDistributor.cc +++ b/AMDiS/src/parallel/MeshDistributor.cc @@ -1392,7 +1392,7 @@ namespace AMDiS { #else int writePartMesh = 0; #endif - Parameters::get("dbg->write part mesh", writePartMesh); + Parameters::get("parallel->debug->write part mesh", writePartMesh); if (writePartMesh > 0 && repartitioningCounter == 0) ParallelDebug::writePartitioningFile(debugOutputDir + "partitioning", repartitioningCounter, diff --git a/AMDiS/src/parallel/PetscSolverFeti.cc b/AMDiS/src/parallel/PetscSolverFeti.cc index 3941b7a6e9cc6daa5e6a0c66708328fe6ebb183d..0e698b69eb983edc5afd72fc4ab5e296695507f2 100644 --- a/AMDiS/src/parallel/PetscSolverFeti.cc +++ b/AMDiS/src/parallel/PetscSolverFeti.cc @@ -352,6 +352,8 @@ namespace AMDiS { (fabs(c[0] - 12.5) < e && fabs(c[1] - 12.5) < e)) { MSG("PRIMAL COORD %f %f\n", c[0], c[1]); primals.insert(**it); + } else { + MSG("OMMIT SOME PRIMAL!\n"); } } }