Commit 1e7a784a authored by Thomas Witkowski's avatar Thomas Witkowski
Browse files

Bugfix for setDofVector in global matrix solver when using a coarse space.

parent 83248601
...@@ -120,7 +120,7 @@ namespace AMDiS { ...@@ -120,7 +120,7 @@ namespace AMDiS {
/// global index must not be set. /// global index must not be set.
MultiIndex& operator[](DegreeOfFreedom d) MultiIndex& operator[](DegreeOfFreedom d)
{ {
TEST_EXIT_DBG(dofMap.count(d))("Should not happen!\n"); TEST_EXIT_DBG(dofMap.count(d))("DOF %d is not in map!\n", d);
return dofMap[d]; return dofMap[d];
} }
......
...@@ -86,6 +86,16 @@ namespace AMDiS { ...@@ -86,6 +86,16 @@ namespace AMDiS {
double wtime = MPI::Wtime(); double wtime = MPI::Wtime();
#if 0
double vm, rss;
processMemUsage(vm, rss);
MSG("STAGE 1\n");
MSG("My memory usage is VM = %.1f MB RSS = %.1f MB\n", vm, rss);
mpi::globalAdd(vm);
mpi::globalAdd(rss);
MSG("Overall memory usage is VM = %.1f MB RSS = %.1f MB\n", vm, rss);
#endif
if (createMatrixData) { if (createMatrixData) {
petscSolver->setMeshDistributor(meshDistributor, petscSolver->setMeshDistributor(meshDistributor,
meshDistributor->getMpiComm(), meshDistributor->getMpiComm(),
...@@ -96,6 +106,15 @@ namespace AMDiS { ...@@ -96,6 +106,15 @@ namespace AMDiS {
petscSolver->fillPetscRhs(rhs); petscSolver->fillPetscRhs(rhs);
#if 0
processMemUsage(vm, rss);
MSG("STAGE 2\n");
MSG("My memory usage is VM = %.1f MB RSS = %.1f MB\n", vm, rss);
mpi::globalAdd(vm);
mpi::globalAdd(rss);
MSG("Overall memory usage is VM = %.1f MB RSS = %.1f MB\n", vm, rss);
#endif
petscSolver->solvePetscMatrix(*solution, adaptInfo); petscSolver->solvePetscMatrix(*solution, adaptInfo);
petscSolver->destroyVectorData(); petscSolver->destroyVectorData();
...@@ -103,6 +122,15 @@ namespace AMDiS { ...@@ -103,6 +122,15 @@ namespace AMDiS {
if (!storeMatrixData) if (!storeMatrixData)
petscSolver->destroyMatrixData(); petscSolver->destroyMatrixData();
#if 0
processMemUsage(vm, rss);
MSG("STAGE 3\n");
MSG("My memory usage is VM = %.1f MB RSS = %.1f MB\n", vm, rss);
mpi::globalAdd(vm);
mpi::globalAdd(rss);
MSG("Overall memory usage is VM = %.1f MB RSS = %.1f MB\n", vm, rss);
#endif
INFO(info, 8)("solution of discrete system needed %.5f seconds\n", INFO(info, 8)("solution of discrete system needed %.5f seconds\n",
MPI::Wtime() - wtime); MPI::Wtime() - wtime);
} }
......
...@@ -450,10 +450,17 @@ namespace AMDiS { ...@@ -450,10 +450,17 @@ namespace AMDiS {
MatDestroy(&matIntInt); MatDestroy(&matIntInt);
KSPDestroy(&kspInterior); KSPDestroy(&kspInterior);
if (petscSolVec != PETSC_NULL) if (coarseSpaceMap) {
MatDestroy(&matCoarseCoarse);
MatDestroy(&matCoarseInt);
MatDestroy(&matIntCoarse);
}
if (petscSolVec != PETSC_NULL) {
VecDestroy(&petscSolVec); VecDestroy(&petscSolVec);
petscSolVec = PETSC_NULL; petscSolVec = PETSC_NULL;
} }
}
void PetscSolverGlobalMatrix::destroyVectorData() void PetscSolverGlobalMatrix::destroyVectorData()
...@@ -461,6 +468,9 @@ namespace AMDiS { ...@@ -461,6 +468,9 @@ namespace AMDiS {
FUNCNAME("PetscSolverGlobalMatrix::destroyVectorData()"); FUNCNAME("PetscSolverGlobalMatrix::destroyVectorData()");
VecDestroy(&rhsInterior); VecDestroy(&rhsInterior);
if (coarseSpaceMap)
VecDestroy(&rhsCoarseSpace);
} }
...@@ -702,9 +712,16 @@ namespace AMDiS { ...@@ -702,9 +712,16 @@ namespace AMDiS {
if (rankOnly && !(*interiorMap)[feSpace].isRankDof(dofIt.getDOFIndex())) if (rankOnly && !(*interiorMap)[feSpace].isRankDof(dofIt.getDOFIndex()))
continue; continue;
if (coarseSpaceMap && isCoarseSpace(feSpace, dofIt.getDOFIndex())) {
TEST_EXIT_DBG(vecCoarse != PETSC_NULL)("Should not happen!\n");
int index = coarseSpaceMap->getMatIndex(nRowVec, dofIt.getDOFIndex());
VecSetValue(vecCoarse, index, *dofIt, ADD_VALUES);
} else {
// Calculate global row index of the DOF. // Calculate global row index of the DOF.
DegreeOfFreedom globalRowDof = DegreeOfFreedom globalRowDof =
(*interiorMap)[feSpace][dofIt.getDOFIndex()].global; (*interiorMap)[feSpace][dofIt.getDOFIndex()].global;
// Get PETSc's mat index of the row DOF. // Get PETSc's mat index of the row DOF.
int index = 0; int index = 0;
if (interiorMap->isMatIndexFromGlobal()) if (interiorMap->isMatIndexFromGlobal())
...@@ -715,9 +732,6 @@ namespace AMDiS { ...@@ -715,9 +732,6 @@ namespace AMDiS {
interiorMap->getMatIndex(nRowVec, dofIt.getDOFIndex()) + rStartInterior; interiorMap->getMatIndex(nRowVec, dofIt.getDOFIndex()) + rStartInterior;
if (perMap.isPeriodic(feSpace, globalRowDof)) { if (perMap.isPeriodic(feSpace, globalRowDof)) {
if (coarseSpaceMap && isCoarseSpace(feSpace, dofIt.getDOFIndex())) {
ERROR_EXIT("Periodic coarse space not yet supported!\n");
} else {
std::set<int>& perAsc = perMap.getAssociations(feSpace, globalRowDof); std::set<int>& perAsc = perMap.getAssociations(feSpace, globalRowDof);
double value = *dofIt / (perAsc.size() + 1.0); double value = *dofIt / (perAsc.size() + 1.0);
VecSetValue(vecInterior, index, value, ADD_VALUES); VecSetValue(vecInterior, index, value, ADD_VALUES);
...@@ -728,16 +742,9 @@ namespace AMDiS { ...@@ -728,16 +742,9 @@ namespace AMDiS {
int mappedIndex = interiorMap->getMatIndex(nRowVec, mappedDof); int mappedIndex = interiorMap->getMatIndex(nRowVec, mappedDof);
VecSetValue(vecInterior, mappedIndex, value, ADD_VALUES); VecSetValue(vecInterior, mappedIndex, value, ADD_VALUES);
} }
}
} else { } else {
// The DOF index is not periodic. // The DOF index is not periodic.
if (coarseSpaceMap && isCoarseSpace(feSpace, dofIt.getDOFIndex())) {
TEST_EXIT_DBG(vecCoarse != PETSC_NULL)("Should not happen!\n");
index = coarseSpaceMap->getMatIndex(nRowVec, dofIt.getDOFIndex());
VecSetValue(vecCoarse, index, *dofIt, ADD_VALUES);
} else {
VecSetValue(vecInterior, index, *dofIt, ADD_VALUES); VecSetValue(vecInterior, index, *dofIt, ADD_VALUES);
} }
} }
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment