Commit 7b9cb31c authored by Thomas Witkowski's avatar Thomas Witkowski

Blbu

parent 47dace03
...@@ -191,13 +191,13 @@ namespace AMDiS { ...@@ -191,13 +191,13 @@ namespace AMDiS {
icend = end<nz>(cursor); icursor != icend; ++icursor) { icend = end<nz>(cursor); icursor != icend; ++icursor) {
if (colDofMap[colFeSpace].find(col(*icursor), colDofIndex) == false) if (colDofMap[colFeSpace].find(col(*icursor), colDofIndex) == false)
continue; continue;
// Set of periodic row associations (is empty, if row DOF is not // Set of periodic row associations (is empty, if row DOF is not
// periodic. // periodic.
std::set<int> perColAsc; std::set<int> perColAsc = perRowAsc;
if (perMap) if (perMap)
perMap->fillAssociations(colFeSpace, colDofIndex.global, elObjDb, perColAsc); perMap->fillAssociations(colFeSpace, colDofIndex.global, elObjDb, perColAsc);
if (perColAsc.empty()) { if (perColAsc.empty()) {
if (colDofMap[colFeSpace].isRankDof(col(*icursor))) if (colDofMap[colFeSpace].isRankDof(col(*icursor)))
dnnz[localPetscRowIdx]++; dnnz[localPetscRowIdx]++;
...@@ -206,7 +206,7 @@ namespace AMDiS { ...@@ -206,7 +206,7 @@ namespace AMDiS {
} else { } else {
vector<int> newCols; vector<int> newCols;
perMap->mapDof(colFeSpace, colDofIndex.global, perColAsc, newCols); perMap->mapDof(colFeSpace, colDofIndex.global, perColAsc, newCols);
for (int aa = 0; aa < newCols.size(); aa++) { for (int aa = 0; aa < newCols.size(); aa++) {
int petscColIdx = colDofMap.getMatIndex(colComp, newCols[aa]); int petscColIdx = colDofMap.getMatIndex(colComp, newCols[aa]);
...@@ -221,6 +221,14 @@ namespace AMDiS { ...@@ -221,6 +221,14 @@ namespace AMDiS {
} }
} }
} }
if (!perRowAsc.empty()) {
vector<int> newRows;
perMap->mapDof(rowFeSpace, rowIt->second.global, perRowAsc, newRows);
dnnz[localPetscRowIdx] +=
(newRows.size() - 1) * (onnz[localPetscRowIdx] + dnnz[localPetscRowIdx]);
}
} }
} else { } else {
// === The current row DOF is not a rank DOF, i.e., its values === // === The current row DOF is not a rank DOF, i.e., its values ===
......
...@@ -1818,13 +1818,13 @@ namespace AMDiS { ...@@ -1818,13 +1818,13 @@ namespace AMDiS {
TEST_EXIT(levelData.getLevelNumber() == 1) TEST_EXIT(levelData.getLevelNumber() == 1)
("Periodic DOF map does not support multi level domain decomposition!\n"); ("Periodic DOF map does not support multi level domain decomposition!\n");
MPI::COMM_WORLD.Barrier(); // MPI::COMM_WORLD.Barrier(); [TODO: CHANGE BECAUSE NOT ALL RANKS HAVE PERIODIC MAP!!!]
double first = MPI::Wtime(); double first = MPI::Wtime();
for (unsigned int i = 0; i < feSpaces.size(); i++) for (unsigned int i = 0; i < feSpaces.size(); i++)
createPeriodicMap(feSpaces[i]); createPeriodicMap(feSpaces[i]);
MPI::COMM_WORLD.Barrier(); // MPI::COMM_WORLD.Barrier();
INFO(info, 8)("Creation of periodic mapping needed %.5f seconds\n", INFO(info, 8)("Creation of periodic mapping needed %.5f seconds\n",
MPI::Wtime() - first); MPI::Wtime() - first);
} }
......
...@@ -184,13 +184,18 @@ namespace AMDiS { ...@@ -184,13 +184,18 @@ namespace AMDiS {
return static_cast<bool>(dofMap.count(dof)); return static_cast<bool>(dofMap.count(dof));
} }
/// Checks if a given DOF is a rank owned DOF of the DOF mapping. The DOF must /// Checks if a given DOF is a rank owned DOF of the DOF mapping. The DOF
/// a DOF of the mapping (this is not checked here), otherwise the result is /// must be a DOF of the mapping (this is not checked here), otherwise the
/// meaningsless. /// result is meaningsless.
bool isRankDof(DegreeOfFreedom dof) bool isRankDof(DegreeOfFreedom dof)
{ {
return !(static_cast<bool>(nonRankDofs.count(dof))); return !(static_cast<bool>(nonRankDofs.count(dof)));
} }
bool isRankGlobalDof(int dof)
{
return (dof >= rStartDofs && dof < rStartDofs + nRankDofs);
}
/// Returns number of DOFs in the mapping. /// Returns number of DOFs in the mapping.
unsigned int size() unsigned int size()
......
...@@ -72,6 +72,37 @@ namespace AMDiS { ...@@ -72,6 +72,37 @@ namespace AMDiS {
} }
void PeriodicMap::mapDof(const FiniteElemSpace* rowFeSpace,
const FiniteElemSpace* colFeSpace,
pair<int, int> globalDofIndex,
const std::set<int>& perAsc,
vector<pair<int, int> >& mappedDofs)
{
mappedDofs.clear();
mappedDofs.push_back(globalDofIndex);
for (std::set<int>::iterator it = perAsc.begin();
it != perAsc.end(); ++it) {
int nDofs = static_cast<int>(mappedDofs.size());
for (int i = 0; i < nDofs; i++) {
int perRowDof = 0;
if (isPeriodic(rowFeSpace, *it, mappedDofs[i].first))
perRowDof = map(rowFeSpace, *it, mappedDofs[i].first);
else
perRowDof = mappedDofs[i].first;
int perColDof;
if (isPeriodic(colFeSpace, *it, mappedDofs[i].second))
perColDof = map(colFeSpace, *it, mappedDofs[i].second);
else
perColDof = mappedDofs[i].second;
mappedDofs.push_back(make_pair(perRowDof, perColDof));
}
}
}
void PeriodicMap::serialize(ostream &out, void PeriodicMap::serialize(ostream &out,
vector<const FiniteElemSpace*> feSpaces) vector<const FiniteElemSpace*> feSpaces)
{ {
......
...@@ -159,6 +159,21 @@ namespace AMDiS { ...@@ -159,6 +159,21 @@ namespace AMDiS {
const std::set<int>& perAsc, const std::set<int>& perAsc,
vector<int>& mappedDofs); vector<int>& mappedDofs);
/** \brief
* Maps a given DOF index pair for all given periodic DOF associations.
*
* \param[in] rowFeSpace feSpace of the DOFs on the first component.
* \param[in] colFeSpace feSpace of the DOFs on the second component.
* \param[in] globalDofIndex pair of global index of a DOF.
* \param[in] perAsc set of periodic associations.
* \param[out] mappedDofs set of pairs of global DOF indices.
*/
void mapDof(const FiniteElemSpace* rowFeSpace,
const FiniteElemSpace* colFeSpace,
pair<int, int> globalDofIndex,
const std::set<int>& perAsc,
vector<pair<int, int> >& mappedDofs);
/// Returns true, if the DOF (global index) is a periodic DOF. /// Returns true, if the DOF (global index) is a periodic DOF.
inline bool isPeriodic(const FiniteElemSpace *feSpace, int globalDofIndex) inline bool isPeriodic(const FiniteElemSpace *feSpace, int globalDofIndex)
......
...@@ -805,32 +805,8 @@ namespace AMDiS { ...@@ -805,32 +805,8 @@ namespace AMDiS {
// === associations of the row and column indices. === // === associations of the row and column indices. ===
vector<pair<int, int> > entry; vector<pair<int, int> > entry;
perMap.mapDof(rowFe, colFe, make_pair(globalRowDof, globalColDof),
// First, add the original entry. perAsc, entry);
entry.push_back(make_pair(globalRowDof, globalColDof));
// Then, traverse the periodic associations of the row and column
// indices and create the corresponding entries.
for (std::set<int>::iterator it = perAsc.begin(); it != perAsc.end(); ++it) {
int nEntry = static_cast<int>(entry.size());
for (int i = 0; i < nEntry; i++) {
int perRowDof = 0;
if (perMap.isPeriodic(rowFe, *it, entry[i].first))
perRowDof = perMap.map(rowFe, *it, entry[i].first);
else
perRowDof = entry[i].first;
int perColDof;
if (perMap.isPeriodic(colFe, *it, entry[i].second))
perColDof = perMap.map(colFe, *it, entry[i].second);
else
perColDof = entry[i].second;
entry.push_back(make_pair(perRowDof, perColDof));
}
}
// === Translate the matrix entries to PETSc's matrix. // === Translate the matrix entries to PETSc's matrix.
......
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