Commit 235f1f39 authored by Thomas Witkowski's avatar Thomas Witkowski

Removed level hierarchie in parallel dof mapping, is not necessary.

parent 346f9163
......@@ -238,7 +238,7 @@ namespace AMDiS {
if (condition->applyBoundaryCondition()) {
#ifdef HAVE_PARALLEL_DOMAIN_AMDIS
if (dofMap->isRankDof(rowIndices[i], 0))
if (dofMap->isRankDof(rowIndices[i]))
applyDBCs.insert(static_cast<int>(row));
#else
applyDBCs.insert(static_cast<int>(row));
......
......@@ -248,7 +248,7 @@ namespace AMDiS {
{
TEST_EXIT_DBG(dofMap)("No rank dofs set!\n");
return dofMap->isRankDof(dof, 0);
return dofMap->isRankDof(dof);
}
#endif
......
......@@ -1246,7 +1246,7 @@ namespace AMDiS {
// === Run mesh partitioner to calculate a new mesh partitioning. ===
partitioner->setLocalGlobalDofMap(&(dofMap[feSpaces[0]].getMap(0)));
partitioner->setLocalGlobalDofMap(&(dofMap[feSpaces[0]].getMap()));
bool partitioningSucceed =
partitioner->partition(elemWeights, ADAPTIVE_REPART);
......@@ -1654,23 +1654,19 @@ namespace AMDiS {
MSG("| number of levels: %d\n", nLevels);
MSG("| number of FE spaces: %d\n", feSpaces.size());
for (int level = 0; level < nLevels; level++) {
for (unsigned int i = 0; i < feSpaces.size(); i++) {
MSG("| level = %d FE space = %d:\n", level, i);
MSG("| nRankDofs = %d\n", dofMap[feSpaces[i]].nRankDofs[level]);
MSG("| nOverallDofs = %d\n", dofMap[feSpaces[i]].nOverallDofs[level]);
MSG("| rStartDofs = %d\n", dofMap[feSpaces[i]].rStartDofs[level]);
}
for (unsigned int i = 0; i < feSpaces.size(); i++) {
MSG("| FE space = %d:\n", i);
MSG("| nRankDofs = %d\n", dofMap[feSpaces[i]].nRankDofs);
MSG("| nOverallDofs = %d\n", dofMap[feSpaces[i]].nOverallDofs);
MSG("| rStartDofs = %d\n", dofMap[feSpaces[i]].rStartDofs);
}
if (nLevels > 1) {
for (int level = 0; level < nLevels; level++) {
for (unsigned int i = 0; i < feSpaces.size(); i++) {
MSG("| level = %d FE space = %d:\n", level, i);
MSG("| nRankDofs = %d\n", dofMapSd[feSpaces[i]].nRankDofs[level]);
MSG("| nOverallDofs = %d\n", dofMapSd[feSpaces[i]].nOverallDofs[level]);
MSG("| rStartDofs = %d\n", dofMapSd[feSpaces[i]].rStartDofs[level]);
}
for (unsigned int i = 0; i < feSpaces.size(); i++) {
MSG("| FE space = %d:\n", i);
MSG("| nRankDofs = %d\n", dofMapSd[feSpaces[i]].nRankDofs);
MSG("| nOverallDofs = %d\n", dofMapSd[feSpaces[i]].nOverallDofs);
MSG("| rStartDofs = %d\n", dofMapSd[feSpaces[i]].rStartDofs);
}
}
......@@ -1704,23 +1700,19 @@ namespace AMDiS {
sort(rankDofs.begin(), rankDofs.end(), cmpDofsByValue);
// === Traverse interior boundaries and get all DOFs on them. ===
int nLevels = levelData.getLevelNumber();
for (int level = 0; level < nLevels; level++) {
DofContainerSet nonRankDofs;
for (DofComm::Iterator it(dcom.getRecvDofs(), level, feSpace);
!it.end(); it.nextRank())
for (; !it.endDofIter(); it.nextDof())
nonRankDofs.insert(it.getDof());
for (unsigned int i = 0; i < rankDofs.size(); i++)
if (nonRankDofs.count(rankDofs[i]) == 0)
dmap[feSpace].insertRankDof(level, *(rankDofs[i]));
for (DofContainerSet::iterator it = nonRankDofs.begin();
it != nonRankDofs.end(); ++it)
dmap[feSpace].insertNonRankDof(level, **it);
}
DofContainerSet nonRankDofs;
for (DofComm::Iterator it(dcom.getRecvDofs(), 0, feSpace);
!it.end(); it.nextRank())
for (; !it.endDofIter(); it.nextDof())
nonRankDofs.insert(it.getDof());
for (unsigned int i = 0; i < rankDofs.size(); i++)
if (nonRankDofs.count(rankDofs[i]) == 0)
dmap[feSpace].insertRankDof(*(rankDofs[i]));
for (DofContainerSet::iterator it = nonRankDofs.begin();
it != nonRankDofs.end(); ++it)
dmap[feSpace].insertNonRankDof(**it);
}
......@@ -1782,8 +1774,8 @@ namespace AMDiS {
BoundaryType type = bound.type;
for (unsigned int j = 0; j < dofs0.size(); j++) {
DegreeOfFreedom globalDof0 = dofMap[feSpace][0][*(dofs0[j])].global;
DegreeOfFreedom globalDof1 = dofMap[feSpace][0][*(dofs1[j])].global;
DegreeOfFreedom globalDof0 = dofMap[feSpace][*(dofs0[j])].global;
DegreeOfFreedom globalDof1 = dofMap[feSpace][*(dofs1[j])].global;
if (!periodicMap.isPeriodicOnBound(feSpace, type, globalDof0))
periodicMap.add(feSpace, type, globalDof0, globalDof1);
......@@ -1808,7 +1800,7 @@ namespace AMDiS {
// Send the global indices to the rank on the other side.
stdMpi.getSendData(it->first).reserve(dofs.size());
for (unsigned int i = 0; i < dofs.size(); i++)
stdMpi.getSendData(it->first).push_back(dofMap[feSpace][0][*(dofs[i])].global);
stdMpi.getSendData(it->first).push_back(dofMap[feSpace][*(dofs[i])].global);
// Receive from this rank the same number of dofs.
stdMpi.recv(it->first, dofs.size());
......@@ -1834,7 +1826,7 @@ namespace AMDiS {
// Added the received DOFs to the mapping.
for (unsigned int i = 0; i < dofs.size(); i++) {
int globalDofIndex = dofMap[feSpace][0][*(dofs[i])].global;
int globalDofIndex = dofMap[feSpace][*(dofs[i])].global;
int mapGlobalDofIndex = stdMpi.getRecvData(it->first)[i];
BoundaryType type = types[i];
......@@ -1867,7 +1859,7 @@ namespace AMDiS {
boundIt->rankObj.el->getAllDofs(feSpace, boundIt->rankObj, dofs);
for (unsigned int i = 0; i < dofs.size(); i++) {
DegreeOfFreedom globalDof = dofMap[feSpace][0][*dofs[i]].global;
DegreeOfFreedom globalDof = dofMap[feSpace][*dofs[i]].global;
std::set<BoundaryType>& assoc =
periodicMap.getAssociations(feSpace, globalDof);
......
......@@ -151,6 +151,11 @@ namespace AMDiS {
return dofMap;
}
inline ParallelDofMapping& getDofMapSd()
{
return dofMapSd;
}
/// Returns the periodic mapping handler, \ref periodicMap.
inline PeriodicMap& getPeriodicMap()
{
......
......@@ -480,7 +480,7 @@ namespace AMDiS {
DOFIterator<WorldVector<double> > it(&coords, USED_DOFS);
for (it.reset(); !it.end(); ++it) {
coordsToIndex[(*it)] = pdb.dofMap[feSpace][0][it.getDOFIndex()].global;
coordsToIndex[(*it)] = pdb.dofMap[feSpace][it.getDOFIndex()].global;
// MSG(" CHECK FOR DOF %d AT COORDS %f %f %f\n",
// coordsToIndex[(*it)], (*it)[0], (*it)[1], (*it)[2]);
}
......@@ -794,8 +794,8 @@ namespace AMDiS {
DOFIterator<WorldVector<double> > it(&coords, USED_DOFS);
for (it.reset(); !it.end(); ++it) {
file << it.getDOFIndex() << " "
<< pdb.dofMap[feSpace][0][it.getDOFIndex()].global << " "
<< pdb.dofMap[feSpace].isRankDof(it.getDOFIndex(), 0);
<< pdb.dofMap[feSpace][it.getDOFIndex()].global << " "
<< pdb.dofMap[feSpace].isRankDof(it.getDOFIndex());
for (int i = 0; i < pdb.mesh->getDim(); i++)
file << " " << (*it)[i];
file << "\n";
......
This diff is collapsed.
......@@ -107,7 +107,6 @@ namespace AMDiS {
: levelData(ld),
dofComm(NULL),
feSpace(NULL),
dofMap(1),
needGlobalMapping(false),
hasNonLocalDofs(false)
{
......@@ -117,75 +116,66 @@ namespace AMDiS {
/// Clears all data of the mapping.
void clear();
#if 0
/// Maps a DOF index to both, the local and global index of the mapping. The
/// global index must not be set.
MultiIndex& operator[](DegreeOfFreedom d)
{
TEST_EXIT_DBG(dofMap[0].count(d))("Should not happen!\n");
TEST_EXIT_DBG(dofMap.count(d))("Should not happen!\n");
return dofMap[0][d];
return dofMap[d];
}
#else
DofMap& operator[](int level)
{
TEST_EXIT_DBG(level < static_cast<int>(dofMap.size()))("Should not happen!\n");
return dofMap[level];
}
#endif
/// Inserts a new DOF to rank's mapping. The DOF is assumed to be owend by
/// the rank.
void insertRankDof(int level, DegreeOfFreedom dof0, DegreeOfFreedom dof1 = -1)
void insertRankDof(DegreeOfFreedom dof0, DegreeOfFreedom dof1 = -1)
{
FUNCNAME("FeSpaceDofMap::insertRankDof()");
TEST_EXIT_DBG(dofMap[level].count(dof0) == 0)("Should not happen!\n");
TEST_EXIT_DBG(dofMap.count(dof0) == 0)("Should not happen!\n");
dofMap[level][dof0].local = dof1;
nLocalDofs[level]++;
dofMap[dof0].local = dof1;
nLocalDofs++;
if (dof1 != -1)
nRankDofs[level]++;
nRankDofs++;
}
/// Inserts a new DOF to rank's mapping. The DOF exists in rank's subdomain
/// but is owned by a different rank, thus it is part of an interior boundary.
void insertNonRankDof(int level, DegreeOfFreedom dof0, DegreeOfFreedom dof1 = -1)
void insertNonRankDof(DegreeOfFreedom dof0, DegreeOfFreedom dof1 = -1)
{
FUNCNAME("FeSpaceDofMap::insertNonRankDof()");
TEST_EXIT_DBG(dofMap[level].count(dof0) == 0)("Should not happen!\n");
TEST_EXIT_DBG(dofMap.count(dof0) == 0)("Should not happen!\n");
dofMap[level][dof0].local = dof1;
nLocalDofs[level]++;
nonRankDofs[level].insert(dof0);
dofMap[dof0].local = dof1;
nLocalDofs++;
nonRankDofs.insert(dof0);
}
/// Checks if a given DOF is in the DOF mapping.
bool isSet(DegreeOfFreedom dof, int level)
bool isSet(DegreeOfFreedom dof)
{
return static_cast<bool>(dofMap[level].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
/// a DOF of the mapping (this is not checked here), otherwise the result is
/// meaningsless.
bool isRankDof(DegreeOfFreedom dof, int level)
bool isRankDof(DegreeOfFreedom dof)
{
return !(static_cast<bool>(nonRankDofs[level].count(dof)));
return !(static_cast<bool>(nonRankDofs.count(dof)));
}
/// Returns number of DOFs in the mapping.
unsigned int size(int level)
unsigned int size()
{
return dofMap[level].size();
return dofMap.size();
}
/// Returns the raw data of the mapping.
DofMap& getMap(int level)
DofMap& getMap()
{
return dofMap[level];
return dofMap;
}
/// Recomputes the mapping.
......@@ -224,11 +214,11 @@ namespace AMDiS {
private:
/// Computes a global mapping from the local one.
void computeGlobalMapping(int level);
void computeGlobalMapping();
/// Computes the global indices of all DOFs in the mapping that are not owned
/// by the rank.
void computeNonLocalIndices(int level);
void computeNonLocalIndices();
private:
MeshLevelData *levelData;
......@@ -245,10 +235,10 @@ namespace AMDiS {
const FiniteElemSpace *feSpace;
/// Mapping data from DOF indices to local and global indices.
vector<DofMap> dofMap;
DofMap dofMap;
/// Set of all DOFs that are in mapping but are not owned by the rank.
vector<std::set<DegreeOfFreedom> > nonRankDofs;
std::set<DegreeOfFreedom> nonRankDofs;
/// If true, a global index mapping will be computed for all DOFs.
bool needGlobalMapping;
......@@ -260,7 +250,7 @@ namespace AMDiS {
public:
///
vector<int> nRankDofs, nLocalDofs, nOverallDofs, rStartDofs;
int nRankDofs, nLocalDofs, nOverallDofs, rStartDofs;
};
......@@ -283,10 +273,10 @@ namespace AMDiS {
nOverallDofs(1),
rStartDofs(1)
{
nRankDofs[0] = -1;
nLocalDofs[0] = -1;
nOverallDofs[0] = -1;
rStartDofs[0] = -1;
nRankDofs = -1;
nLocalDofs = -1;
nOverallDofs = -1;
rStartDofs = -1;
}
/** \brief Initialize the parallel DOF mapping.
......@@ -335,36 +325,36 @@ namespace AMDiS {
}
/// Returns \ref nRankDofs, thus the number of DOFs owned by the rank.
inline int getRankDofs(int level)
inline int getRankDofs()
{
TEST_EXIT_DBG(nRankDofs[level] >= 0)("Should not happen!\n");
TEST_EXIT_DBG(nRankDofs >= 0)("Should not happen!\n");
return nRankDofs[level];
return nRankDofs;
}
/// Returns \ref nLocalDofs, thus the number of DOFs in ranks subdomain.
inline int getLocalDofs(int level)
inline int getLocalDofs()
{
TEST_EXIT_DBG(nLocalDofs[level] >= 0)("Should not happen!\n");
TEST_EXIT_DBG(nLocalDofs >= 0)("Should not happen!\n");
return nLocalDofs[level];
return nLocalDofs;
}
/// Returns \ref nOverallDofs, thus the number of all DOFs in this mapping.
inline int getOverallDofs(int level)
inline int getOverallDofs()
{
TEST_EXIT_DBG(nOverallDofs[level] >= 0)("Should not happen!\n");
TEST_EXIT_DBG(nOverallDofs >= 0)("Should not happen!\n");
return nOverallDofs[level];
return nOverallDofs;
}
/// Returns \ref rStartDofs, thus the smallest global index of a DOF that is
/// owned by the rank.
inline int getStartDofs(int level)
inline int getStartDofs()
{
TEST_EXIT_DBG(rStartDofs[level] >= 0)("Should not happen!\n");
TEST_EXIT_DBG(rStartDofs >= 0)("Should not happen!\n");
return rStartDofs[level];
return rStartDofs;
}
/// Update the mapping.
......@@ -375,21 +365,21 @@ namespace AMDiS {
/// Returns the global matrix index of a given DOF for a given
/// component number.
inline int getMatIndex(int level, int ithComponent, DegreeOfFreedom d)
inline int getMatIndex(int ithComponent, DegreeOfFreedom d)
{
return dofToMatIndex[level].get(ithComponent, d);
return dofToMatIndex.get(ithComponent, d);
}
/// Returns the local matrix index of a given DOF for a given
/// component number.
inline int getLocalMatIndex(int level, int ithComponent, DegreeOfFreedom d)
inline int getLocalMatIndex(int ithComponent, DegreeOfFreedom d)
{
FUNCNAME("ParallelDofMapping::getLocalMatIndex()");
TEST_EXIT_DBG(data[feSpaces[ithComponent]].isRankDof(d, level))
TEST_EXIT_DBG(data[feSpaces[ithComponent]].isRankDof(d))
("Should not happen!\n");
return dofToMatIndex[level].get(ithComponent, d) - rStartDofs[level];
return dofToMatIndex.get(ithComponent, d) - rStartDofs;
}
// Writes all data of this object to an output stream.
......@@ -405,23 +395,23 @@ namespace AMDiS {
}
/// Compute local and global matrix indices.
void computeMatIndex(bool globalIndex, int level);
void computeMatIndex(bool globalIndex);
protected:
/// Insert a new FE space DOF mapping for a given FE space.
void addFeSpace(const FiniteElemSpace* feSpace);
/// Compute \ref nRankDofs.
int computeRankDofs(int level);
int computeRankDofs();
/// Compute \ref nLocalDofs.
int computeLocalDofs(int level);
int computeLocalDofs();
/// Compute \ref nOverallDofs.
int computeOverallDofs(int level);
int computeOverallDofs();
/// Compute \ref rStartDofs.
int computeStartDofs(int level);
int computeStartDofs();
private:
MPI::Intracomm mpiComm;
......@@ -459,20 +449,20 @@ namespace AMDiS {
vector<const FiniteElemSpace*> feSpacesUnique;
/// Number of DOFs owned by rank.
vector<int> nRankDofs;
int nRankDofs;
/// Number of DOFs in rank's subdomain.
vector<int> nLocalDofs;
int nLocalDofs;
/// Number of global DOFs (this value is thus the same on all ranks).
vector<int> nOverallDofs;
int nOverallDofs;
/// Smallest global index of a DOF owned by the rank.
vector<int> rStartDofs;
int rStartDofs;
/// Mapping from global DOF indices to global matrix indices under
/// consideration of possibly multiple components.
vector<DofToMatIndex> dofToMatIndex;
DofToMatIndex dofToMatIndex;
};
}
......
This diff is collapsed.
......@@ -80,22 +80,22 @@ namespace AMDiS {
int getNumberOfPrimals()
{
return primalDofMap.getOverallDofs(meshLevel);
return primalDofMap.getOverallDofs();
}
int getNumberOfRankPrimals()
{
return primalDofMap.getRankDofs(meshLevel);
return primalDofMap.getRankDofs();
}
int getNumberOfDuals()
{
return dualDofMap.getOverallDofs(meshLevel);
return dualDofMap.getOverallDofs();
}
int getNumberOfRankDuals()
{
return dualDofMap.getRankDofs(meshLevel);
return dualDofMap.getRankDofs();
}
protected:
......@@ -174,14 +174,14 @@ namespace AMDiS {
inline bool isPrimal(const FiniteElemSpace *feSpace,
DegreeOfFreedom dof)
{
return primalDofMap[feSpace].isSet(dof, meshLevel);
return primalDofMap[feSpace].isSet(dof);
}
/// Checks whether a given DOF in a give FE space is a dual DOF.
inline bool isDual(const FiniteElemSpace *feSpace,
DegreeOfFreedom dof)
{
return dualDofMap[feSpace].isSet(dof, meshLevel);
return dualDofMap[feSpace].isSet(dof);
}
protected:
......
......@@ -27,8 +27,8 @@ namespace AMDiS {
double wtime = MPI::Wtime();
const FiniteElemSpace *feSpace = meshDistributor->getFeSpace(0);
nComponents = mat->getNumRows();
int nRankRows = (*dofMap)[feSpace].nRankDofs[0];
int nOverallRows = (*dofMap)[feSpace].nOverallDofs[0];
int nRankRows = (*dofMap)[feSpace].nRankDofs;
int nOverallRows = (*dofMap)[feSpace].nOverallDofs;
#if (DEBUG != 0)
MSG("Fill petsc matrix 1 needed %.5f seconds\n", MPI::Wtime() - wtime);
......@@ -108,8 +108,8 @@ namespace AMDiS {
nComponents = vec->getSize();
const FiniteElemSpace *feSpace = meshDistributor->getFeSpace(0);
int nRankRows = (*dofMap)[feSpace].nRankDofs[0];
int nOverallRows = (*dofMap)[feSpace].nOverallDofs[0];
int nRankRows = (*dofMap)[feSpace].nRankDofs;
int nOverallRows = (*dofMap)[feSpace].nOverallDofs;
nestVec.resize(nComponents);
......@@ -151,11 +151,11 @@ namespace AMDiS {
Vec tmp;
VecNestGetSubVec(petscSolVec, i, &tmp);
int nRankDofs = (*dofMap)[feSpace].nRankDofs[0];
int nRankDofs = (*dofMap)[feSpace].nRankDofs;
PetscScalar *vecPointer;
VecGetArray(tmp, &vecPointer);
DofMap& d = (*dofMap)[feSpace].getMap(0);
DofMap& d = (*dofMap)[feSpace].getMap();
for (DofMap::iterator it = d.begin(); it != d.end(); ++it)
if (it->second.local != -1)
dofvec[it->first] = vecPointer[it->second.local];
......@@ -217,8 +217,8 @@ namespace AMDiS {
typedef traits::range_generator<row, Matrix>::type cursor_type;
typedef traits::range_generator<nz, cursor_type>::type icursor_type;
int dispRowIndex = (*dofMap)[feSpace].nRankDofs[0] * dispRowBlock;
int dispColIndex = (*dofMap)[feSpace].nRankDofs[0] * dispColBlock;
int dispRowIndex = (*dofMap)[feSpace].nRankDofs * dispRowBlock;
int dispColIndex = (*dofMap)[feSpace].nRankDofs * dispColBlock;
vector<int> cols;
vector<double> values;
......@@ -232,7 +232,7 @@ namespace AMDiS {
cend = end<row>(mat->getBaseMatrix()); cursor != cend; ++cursor) {
// Global index of the current row DOF.
int rowIndex = (*dofMap)[feSpace][0][*cursor].global + dispRowIndex;
int rowIndex = (*dofMap)[feSpace][*cursor].global + dispRowIndex;
cols.clear();
values.clear();
......@@ -240,7 +240,7 @@ namespace AMDiS {
for (icursor_type icursor = begin<nz>(cursor), icend = end<nz>(cursor);
icursor != icend; ++icursor) {
// Global index of the current column index.
int colIndex = (*dofMap)[feSpace][0][col(*icursor)].global + dispColIndex;
int colIndex = (*dofMap)[feSpace][col(*icursor)].global + dispColIndex;
// Ignore all zero entries, expect it is a diagonal entry.
if (value(*icursor) == 0.0 && rowIndex != colIndex)
......@@ -267,7 +267,7 @@ namespace AMDiS {
// Traverse all used DOFs in the dof vector.
DOFVector<double>::Iterator dofIt(vec, USED_DOFS);
for (dofIt.reset(); !dofIt.end(); ++dofIt) {
int index = (*dofMap)[feSpace][0][dofIt.getDOFIndex()].global;
int index = (*dofMap)[feSpace][dofIt.getDOFIndex()].global;
double value = *dofIt;
VecSetValues(petscVec, 1, &index, &value, ADD_VALUES);
......
......@@ -55,8 +55,8 @@ namespace AMDiS {
// === Create PETSc vector (solution and a temporary vector). ===
int nRankRows = dofMap->getRankDofs(0);
int nOverallRows = dofMap->getOverallDofs(0);
int nRankRows = dofMap->getRankDofs();
int nOverallRows = dofMap->getOverallDofs();
VecCreateMPI(mpiComm, nRankRows, nOverallRows, &petscSolVec);
VecCreateMPI(mpiComm, nRankRows, nOverallRows, &petscTmpVec);
......@@ -87,8 +87,8 @@ namespace AMDiS {
#if (DEBUG != 0)
int a, b;
MatGetOwnershipRange(petscMatrix, &a, &b);
TEST_EXIT(a == dofMap->getStartDofs(0))("Wrong matrix ownership range!\n");
TEST_EXIT(b == dofMap->getStartDofs(0) + nRankRows)
TEST_EXIT(a == dofMap->getStartDofs())("Wrong matrix ownership range!\n");
TEST_EXIT(b == dofMap->getStartDofs() + nRankRows)
("Wrong matrix ownership range!\n");
#endif
......@@ -133,8 +133,8 @@ namespace AMDiS {
TEST_EXIT_DBG(vec)("No DOF vector defined!\n");
TEST_EXIT_DBG(dofMap)("No parallel DOF map defined!\n");
int nRankRows = dofMap->getRankDofs(0);
int nOverallRows = dofMap->getOverallDofs(0);
int nRankRows = dofMap->getRankDofs();
int nOverallRows = dofMap->getOverallDofs();
VecCreateMPI(mpiComm, nRankRows, nOverallRows, &petscRhsVec);
......@@ -193,7 +193,7 @@ namespace AMDiS {
int c = 0;
for (int i = 0; i < nComponents; i++) {
DOFVector<double> &dv = *(vec.getDOFVector(i));
DofMap& d = (*dofMap)[dv.getFeSpace()].getMap(0);
DofMap& d = (*dofMap)[dv.getFeSpace()].getMap();
for (DofMap::iterator it = d.begin(); it != d.end(); ++it)
if (it->second.local != -1)
dv[it->first] = vecPointer[c++];
......@@ -268,7 +268,7 @@ namespace AMDiS {
const FiniteElemSpace *colFe = mat->getColFeSpace();
// Global index of the current row DOF.
int globalRowDof = (*dofMap)[rowFe][0][*cursor].global;
int globalRowDof = (*dofMap)[rowFe][*cursor].global;