diff --git a/AMDiS/CMakeLists.txt b/AMDiS/CMakeLists.txt index 0d26b1968fc0ca354e5a66abb522a50dbe6b2641..f2575d357553238036baf2dec940839450412149 100644 --- a/AMDiS/CMakeLists.txt +++ b/AMDiS/CMakeLists.txt @@ -104,6 +104,7 @@ SET(AMDIS_SRC ${SOURCE_DIR}/AdaptBase.cc ${SOURCE_DIR}/Line.cc ${SOURCE_DIR}/MacroElement.cc ${SOURCE_DIR}/Marker.cc + ${SOURCE_DIR}/MatrixVector.cc ${SOURCE_DIR}/Mesh.cc ${SOURCE_DIR}/MeshStructure.cc ${SOURCE_DIR}/Operator.cc diff --git a/AMDiS/src/MatrixVector.cc b/AMDiS/src/MatrixVector.cc new file mode 100644 index 0000000000000000000000000000000000000000..361fc0cd1e10599fd8b57a90159034c392190811 --- /dev/null +++ b/AMDiS/src/MatrixVector.cc @@ -0,0 +1,38 @@ +// +// Software License for AMDiS +// +// Copyright (c) 2010 Dresden University of Technology +// All rights reserved. +// Authors: Simon Vey, Thomas Witkowski et al. +// +// This file is part of AMDiS +// +// See also license.opensource.txt in the distribution. + + +#include "MatrixVector.h" +#include "FiniteElemSpace.h" +#include "DOFMatrix.h" + +namespace AMDiS { + + vector<const FiniteElemSpace*> getFeSpaces(Matrix<DOFMatrix*> &mat) + { + FUNCNAME("getFeSpaces()"); + + int nComponents = mat.getNumRows(); + vector<const FiniteElemSpace*> result(nComponents); + + for (int i = 0; i < nComponents; i++) { + for (int j = 0; j < nComponents; j++) { + if (mat[i][j]) { + result[i] = mat[i][j]->getRowFeSpace(); + break; + } + } + } + + return result; + } + +} diff --git a/AMDiS/src/MatrixVector.h b/AMDiS/src/MatrixVector.h index 6b043fd0849290e73e22dc355458504e35357931..9edba99b9def59b87a5b0f8615d95d3c40fa38e1 100644 --- a/AMDiS/src/MatrixVector.h +++ b/AMDiS/src/MatrixVector.h @@ -518,6 +518,10 @@ namespace AMDiS { z[2] = x[0] * y[1] - x[1] * y[0]; } + + /// Returns a vector with the FE spaces of each row in the matrix. Thus, the + /// resulting vector may contain the same FE space multiple times. + vector<const FiniteElemSpace*> getFeSpaces(Matrix<DOFMatrix*> &mat); } #endif // AMDIS_MATRIXVECTOR_H diff --git a/AMDiS/src/parallel/ParallelCoarseSpaceMatVec.cc b/AMDiS/src/parallel/ParallelCoarseSpaceMatVec.cc index 0934f36b0f1974708599457391c876200f1834ae..f98d4c8a3e08fdb2fcf7dd374415887245fc3980 100644 --- a/AMDiS/src/parallel/ParallelCoarseSpaceMatVec.cc +++ b/AMDiS/src/parallel/ParallelCoarseSpaceMatVec.cc @@ -89,7 +89,7 @@ namespace AMDiS { int nMat = uniqueCoarseMap.size() + 1; nnz.resize(nMat); for (int i = 0; i < nMat; i++) { - nnz.resize(nMat); + nnz[i].resize(nMat); for (int j = 0; j < nMat; j++) nnz[i][j].clear(); } @@ -105,13 +105,15 @@ namespace AMDiS { continue; if (i == j) { - nnz[i][j].create(seqMat, mpiCommGlobal, coarseSpaceMap, NULL, + nnz[i][j].create(seqMat, mpiCommGlobal, *(coarseSpaceMap[i - 1]), NULL, meshDistributor->getElementObjectDb()); } else { - ParallelDofMapping *rowMap = NULL; - ParallelDofMapping *colMap = NULL; - - nnz[i][j].create(seqMat, mpiCommGlobal, *rowMap, *colMap, NULL, + ParallelDofMapping &rowMap = + (i == 0 ? *interiorMap : *(coarseSpaceMap[i - 1])); + ParallelDofMapping &colMap = + (j == 0 ? *interiorMap : *(coarseSpaceMap[j - 1])); + + nnz[i][j].create(seqMat, mpiCommGlobal, rowMap, colMap, NULL, meshDistributor->getElementObjectDb()); /* diff --git a/AMDiS/src/parallel/ParallelCoarseSpaceMatVec.h b/AMDiS/src/parallel/ParallelCoarseSpaceMatVec.h index 6ddeb9f5db9975e2d6feaa410bc183186813e812..4be886a64c94a00e18d26b67657638f464c308d7 100644 --- a/AMDiS/src/parallel/ParallelCoarseSpaceMatVec.h +++ b/AMDiS/src/parallel/ParallelCoarseSpaceMatVec.h @@ -27,6 +27,7 @@ #include <map> #include <petsc.h> #include "AMDiS_fwd.h" +#include "parallel/MatrixNnzStructure.h" namespace AMDiS { diff --git a/AMDiS/src/parallel/PetscSolver.cc b/AMDiS/src/parallel/PetscSolver.cc index 0b16c340580db29c930f46c5a33260199be510a6..6b25876a3c0558052c86950b59d22ec33aaa1aac 100644 --- a/AMDiS/src/parallel/PetscSolver.cc +++ b/AMDiS/src/parallel/PetscSolver.cc @@ -135,30 +135,6 @@ namespace AMDiS { } - vector<const FiniteElemSpace*> PetscSolver::getFeSpaces(Matrix<DOFMatrix*> *mat) - { - FUNCNAME("PetscSolver::getFeSpaces()"); - - int nComponents = mat->getNumRows(); - vector<const FiniteElemSpace*> result(nComponents); - - for (int i = 0; i < nComponents; i++) - for (int j = 0; j < nComponents; j++) - if ((*mat)[i][j]) { - result[i] = (*mat)[i][j]->getRowFeSpace(); - break; - } - -#if (DEBUG != 0) - // === In debug mode, we test if all FE spaces of the matrix are also === - // === considered by the mesh distributor. === - checkFeSpaces(result); -#endif - - return result; - } - - vector<const FiniteElemSpace*> PetscSolver::getFeSpaces(SystemVector *vec) { FUNCNAME("PetscSolver::getFeSpaces()"); diff --git a/AMDiS/src/parallel/PetscSolver.h b/AMDiS/src/parallel/PetscSolver.h index 6551d18a307074fb1dff27652aeb4ccd275385da..81f4e1a11eb2bcdf9124df77db7c601bcabab282 100644 --- a/AMDiS/src/parallel/PetscSolver.h +++ b/AMDiS/src/parallel/PetscSolver.h @@ -229,10 +229,6 @@ namespace AMDiS { /// Checks if all given FE spaces are handled by the mesh distributor. void checkFeSpaces(vector<const FiniteElemSpace*>& feSpaces); - /// Returns a vector with the FE spaces of each row in the matrix. Thus, the - /// resulting vector may contain the same FE space multiple times. - vector<const FiniteElemSpace*> getFeSpaces(Matrix<DOFMatrix*> *mat); - /// Returns a vector with the FE spaces of all components of a system vector. vector<const FiniteElemSpace*> getFeSpaces(SystemVector *vec); diff --git a/AMDiS/src/parallel/PetscSolverFeti.cc b/AMDiS/src/parallel/PetscSolverFeti.cc index 8905d8849cac52771a71e0316d1d2ba88e934d3e..e5b21db5cd7e7bdb3bae1908d79fbe5d9114e7bb 100644 --- a/AMDiS/src/parallel/PetscSolverFeti.cc +++ b/AMDiS/src/parallel/PetscSolverFeti.cc @@ -11,6 +11,7 @@ #include "AMDiS.h" +#include "MatrixVector.h" #include "parallel/PetscSolverFeti.h" #include "parallel/PetscSolverFetiStructs.h" #include "parallel/StdMpi.h" @@ -1351,7 +1352,7 @@ namespace AMDiS { // === Create all sets and indices. === - vector<const FiniteElemSpace*> feSpaces = getFeSpaces(mat); + vector<const FiniteElemSpace*> feSpaces = AMDiS::getFeSpaces(*mat); initialize(feSpaces); diff --git a/AMDiS/src/parallel/PetscSolverGlobalMatrix.cc b/AMDiS/src/parallel/PetscSolverGlobalMatrix.cc index d82b8caec741585eca074c63f91896d2ae70bb6e..d75905b250d247a93ff6c71aef045de4d13f77bb 100644 --- a/AMDiS/src/parallel/PetscSolverGlobalMatrix.cc +++ b/AMDiS/src/parallel/PetscSolverGlobalMatrix.cc @@ -24,7 +24,7 @@ namespace AMDiS { petscData.init(interiorMap, coarseSpaceMap, subdomainLevel, mpiCommLocal, mpiCommGlobal, meshDistributor); - petscData.create(); + petscData.create(*seqMat); if (coarseSpaceMap.size()) { updateSubdomainData(); @@ -130,7 +130,7 @@ namespace AMDiS { TEST_EXIT_DBG(coarseSpaceMap.size() == seqMat->getSize()) ("Wrong sizes %d %d\n", coarseSpaceMap.size(), seqMat->getSize()); - vector<const FiniteElemSpace*> feSpaces = getFeSpaces(seqMat); + vector<const FiniteElemSpace*> feSpaces = AMDiS::getFeSpaces(*seqMat); int nRowsRankInterior = interiorMap->getRankDofs(); int nRowsOverallInterior = interiorMap->getOverallDofs();