#include "FiniteElemSpace.h" //#include "BoundaryCondition.h" #include "BoundaryManager.h" #include "DOFIndexed.h" #include "DOFVector.h" #include "Traverse.h" #include "BasisFunction.h" #include "ElInfo.h" namespace AMDiS { double BoundaryManager::boundResidual(ElInfo *elInfo, DOFMatrix *matrix, const DOFVectorBase *dv) { double result = 0; ::std::map::iterator it; for(it = localBCs.begin(); it != localBCs.end(); ++it) { if((*it).second) result += (*it).second->boundResidual(elInfo, matrix, dv); } return result; } void BoundaryManager::fillBoundaryConditions(ElInfo *elInfo, DOFVectorBase *vec) { // ===== fill local conditions ============================================== const FiniteElemSpace *feSpace = vec->getFESpace(); const BoundaryType *localBound = NULL; const DegreeOfFreedom *dofIndices = NULL; const BasisFunction *basisFcts = feSpace->getBasisFcts(); int nBasFcts = basisFcts->getNumber(); DOFAdmin *admin = feSpace->getAdmin(); ::std::map::iterator it; if(localBCs.size() > 0) { // get boundaries of all DOFs localBound = basisFcts->getBound(elInfo, NULL); // get dof indices dofIndices = basisFcts->getLocalIndices(elInfo->getElement(), admin, NULL); // apply non dirichlet boundary conditions for(it = localBCs.begin(); it != localBCs.end(); ++it) { if((*it).second) { if(!(*it).second->isDirichlet()) { (*it).second->fillBoundaryCondition(vec, elInfo, dofIndices, localBound, nBasFcts); } } } // apply dirichlet boundary conditions for(it = localBCs.begin(); it != localBCs.end(); ++it) { if((*it).second) { if((*it).second->isDirichlet()) { (*it).second->fillBoundaryCondition(vec, elInfo, dofIndices, localBound, nBasFcts); } } } } } void BoundaryManager::fillBoundaryConditions(ElInfo *elInfo, DOFMatrix *mat) { // ===== fill local conditions ============================================== const FiniteElemSpace *feSpace = mat->getRowFESpace(); const BoundaryType *localBound = NULL; const DegreeOfFreedom *dofIndices = NULL; const BasisFunction *basisFcts = feSpace->getBasisFcts(); int nBasFcts = basisFcts->getNumber(); DOFAdmin *admin = feSpace->getAdmin(); ::std::map::iterator it; if (localBCs.size() > 0) { // get boundaries of all DOFs localBound = basisFcts->getBound(elInfo, NULL); // get dof indices dofIndices = basisFcts->getLocalIndices(elInfo->getElement(), admin, NULL); // apply non dirichlet boundary conditions for (it = localBCs.begin(); it != localBCs.end(); ++it) { if ((*it).second) { if (!(*it).second->isDirichlet()) { (*it).second->fillBoundaryCondition(mat, elInfo, dofIndices, localBound, nBasFcts); } } } // apply dirichlet boundary conditions for (it = localBCs.begin(); it != localBCs.end(); ++it) { if ((*it).second) { if ((*it).second->isDirichlet()) { (*it).second->fillBoundaryCondition(mat, elInfo, dofIndices, localBound, nBasFcts); } } } } } // void BoundaryManager::fillGlobalBoundVector(DOFVectorBase *bound) // { // int i; // const BasisFunction *basFcts = bound->getFESpace()->getBasisFcts(); // int numBasFcts = basFcts->getNumber(); // TraverseStack stack; // ElInfo *elInfo = stack.traverseFirst(bound->getFESpace()->getMesh(), // -1, // Mesh::CALL_LEAF_EL | Mesh::FILL_BOUND); // while(elInfo) { // const DegreeOfFreedom *localIndices = // basFcts->getLocalIndices(elInfo->getElement(), // bound->getFESpace()->getAdmin(), // NULL); // for(i = 0; i < numBasFcts; i++) { // (*bound)[localIndices[i]] = elInfo->getBoundary(i); // } // elInfo = stack.traverseNext(elInfo); // } // } void BoundaryManager::initMatrix(DOFMatrix *matrix) { ::std::map::iterator it; for(it = localBCs.begin(); it != localBCs.end(); ++it) { if((*it).second) { if(!(*it).second->isDirichlet()) { (*it).second->initMatrix(matrix); } } } for(it = localBCs.begin(); it != localBCs.end(); ++it) { if((*it).second) { if((*it).second->isDirichlet()) { (*it).second->initMatrix(matrix); } } } } void BoundaryManager::exitMatrix(DOFMatrix *matrix) { ::std::map::iterator it; for(it = localBCs.begin(); it != localBCs.end(); ++it) { if((*it).second) { if(!(*it).second->isDirichlet()) { (*it).second->exitMatrix(matrix); } } } for(it = localBCs.begin(); it != localBCs.end(); ++it) { if((*it).second) { if((*it).second->isDirichlet()) { (*it).second->exitMatrix(matrix); } } } } void BoundaryManager::initVector(DOFVectorBase *vector) { ::std::map::iterator it; for(it = localBCs.begin(); it != localBCs.end(); ++it) { if((*it).second) { if(!(*it).second->isDirichlet()) { (*it).second->initVector(vector); } } } for(it = localBCs.begin(); it != localBCs.end(); ++it) { if((*it).second) { if((*it).second->isDirichlet()) { (*it).second->initVector(vector); } } } } void BoundaryManager::exitVector(DOFVectorBase *vector) { ::std::map::iterator it; for(it = localBCs.begin(); it != localBCs.end(); ++it) { if((*it).second) { if(!(*it).second->isDirichlet()) { (*it).second->exitVector(vector); } } } for(it = localBCs.begin(); it != localBCs.end(); ++it) { if((*it).second) { if((*it).second->isDirichlet()) { (*it).second->exitVector(vector); } } } } }