// // 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 "parallel/DofComm.h" #include "parallel/InteriorBoundary.h" #include "parallel/MeshLevelData.h" #include "FiniteElemSpace.h" #include "Debug.h" #include "ElementDofIterator.h" namespace AMDiS { using namespace std; void DofComm::init(int level, MeshLevelData &ld, vector &fe) { FUNCNAME("DofComm::init()"); meshLevel = level; levelData = &ld; feSpaces = fe; nLevel = levelData->getLevelNumber() - meshLevel; TEST_EXIT_DBG(nLevel >= 1)("Should not happen!\n"); sendDofs.clear(); recvDofs.clear(); periodicDofs.clear(); sendDofs.resize(nLevel); recvDofs.resize(nLevel); periodicDofs.resize(nLevel); } void DofComm::create(InteriorBoundary &boundary) { FUNCNAME("DofComm::create()"); createContainer(boundary.getOwn(), sendDofs); createContainer(boundary.getOther(), recvDofs); } void DofComm::createContainer(RankToBoundMap &boundary, LevelDataType &data) { FUNCNAME("DofComm::createContainer()"); // === Fill data. === for (unsigned int i = 0; i < feSpaces.size(); i++) for (int level = 0; level < nLevel; level++) for (InteriorBoundary::iterator it(boundary, level); !it.end(); ++it){ it->rankObj.el->getAllDofs(feSpaces[i], it->rankObj, data[level][it.getRank()][feSpaces[i]]); } // === Remove empty data containers. === for (unsigned int i = 0; i < data.size(); i++) { DataIter dit = data[i].begin(); while (dit != data[i].end()) { FeMapIter it = dit->second.begin(); while (it != dit->second.end()) { if (it->second.size() == 0) { const FiniteElemSpace *fe = it->first; ++it; dit->second.erase(fe); } else ++it; } if (dit->second.size() == 0) data[i].erase(dit++); else ++dit; } } } void DofComm::serialize(ostream &out) { FUNCNAME("DofComm:serialize()"); ERROR_EXIT("MUSS DAS WIRKLICH SEIN????\n"); } int DofComm::getNumberDofs(LevelDataType &data, int level, const FiniteElemSpace *feSpace, bool countDouble) { FUNCNAME("DofComm::getNumberDofs()"); TEST_EXIT_DBG(level < data.size())("Should not happen!\n"); DofContainerSet dofSet; DofContainer dofVec; for (DataIter rankIt = data[level].begin(); rankIt != data[level].end(); ++rankIt) for (FeMapIter feIt = rankIt->second.begin(); feIt != rankIt->second.end(); ++feIt) if (feIt->first == feSpace) if (countDouble) dofVec.insert(dofVec.end(), feIt->second.begin(), feIt->second.end()); else dofSet.insert(feIt->second.begin(), feIt->second.end()); if (countDouble) return static_cast(dofVec.size()); return static_cast(dofSet.size()); } bool DofComm::Iterator::setNextFeMap() { FUNCNAME("DofComm::Iterator::setNextFeMap()"); if (dataIter != data[traverseLevel].end()) { TEST_EXIT_DBG(dataIter->second.size())("Should not happen!\n"); feMapIter = dataIter->second.begin(); if (traverseFeSpace != NULL) { if ((dataIter->second.count(traverseFeSpace) == 0)) return false; while (feMapIter->first != traverseFeSpace && feMapIter != dataIter->second.end()) ++feMapIter; TEST_EXIT_DBG(feMapIter != dataIter->second.end() && feMapIter->first == traverseFeSpace) ("Should not happen!\n"); } dofIter = feMapIter->second.begin(); dofCounter = 0; } return true; } }