#include "DOFSerializer.h" #include #include "DOFVector.h" #include "Global.h" #include "Traverse.h" namespace AMDiS { // satre values of DOFVector on all macro elements to internal container void DOFSerializer::gather(DOFVector const* vec, std::vector& values) { std::fill(visited_.begin(), visited_.end(), false); values.clear(); for (auto* macroEl : mesh_->getMacroElements()) gather(macroEl->getIndex(), vec, values, false); } // satre values of DOFVector on macro element `macroIndex` to internal container void DOFSerializer::gather(int macroIndex, DOFVector const* vec, std::vector& values, bool reset) { if (reset) { std::fill(visited_.begin(), visited_.end(), false); values.clear(); } TraverseStack stack; ElInfo *elInfo = stack.traverseFirstOneMacro(mesh_, macroIndex, -1, Mesh::CALL_EVERY_EL_PREORDER); while (elInfo) { Element *el = elInfo->getElement(); if (el->isLeaf()) { gather(VERTEX, elInfo, vec, values); if (mesh_->getDim() > 1) gather(EDGE, elInfo, vec, values); if (mesh_->getDim() == 3) gather(FACE, elInfo, vec, values); gather(CENTER, elInfo, vec, values); } elInfo = stack.traverseNext(elInfo); } } void DOFSerializer::gather(GeoIndex geo, ElInfo* elInfo, DOFVector const* vec, std::vector& values) { int nd; if ((nd = admin_->getNumberOfDofs(geo))) { int vertices = mesh_->getGeo(geo); int nd0 = admin_->getNumberOfPreDofs(geo); int n0 = mesh_->getNode(geo); for (int n = 0; n < vertices; n++) { for(int d = 0; d < nd; d++) { DegreeOfFreedom globalDof = elInfo->getElement()->getDof(n0 + n, nd0 + d); if (!visited_[globalDof]) { visited_[globalDof] = true; values.push_back((*vec)[globalDof]); } } } } } // assign stored values to DOFVector, for all macro elements void DOFSerializer::scatter(std::vector const& values, DOFVector* vec) const { std::fill(visited_.begin(), visited_.end(), false); counter_ = 0u; for (auto* macroEl : mesh_->getMacroElements()) scatter(macroEl->getIndex(), values, vec, false); } // assign stored values to DOFVector, on macroElement with index `macroIndex` void DOFSerializer::scatter(int macroIndex, std::vector const& values, DOFVector* vec, bool reset) const { if (reset) { std::fill(visited_.begin(), visited_.end(), false); counter_ = 0u; } TraverseStack stack; ElInfo *elInfo = stack.traverseFirstOneMacro(mesh_, macroIndex, -1, Mesh::CALL_EVERY_EL_PREORDER); while (elInfo) { Element *el = elInfo->getElement(); if (el->isLeaf()) { scatter(VERTEX, elInfo, values, vec); if (mesh_->getDim() > 1) scatter(EDGE, elInfo, values, vec); if (mesh_->getDim() == 3) scatter(FACE, elInfo, values, vec); scatter(CENTER, elInfo, values, vec); } elInfo = stack.traverseNext(elInfo); } } void DOFSerializer::scatter(GeoIndex geo, ElInfo* elInfo, std::vector const& values, DOFVector* vec) const { int nd; if ((nd = admin_->getNumberOfDofs(geo))) { int vertices = mesh_->getGeo(geo); int nd0 = admin_->getNumberOfPreDofs(geo); int n0 = mesh_->getNode(geo); for (int n = 0; n < vertices; n++) { for(int d = 0; d < nd; d++) { DegreeOfFreedom globalDof = elInfo->getElement()->getDof(n0 + n, nd0 + d); if (!visited_[globalDof]) { visited_[globalDof] = true; assert( values.size() < counter_); (*vec)[globalDof] = values[counter_++]; } } } } } } // end namespace AMDiS