#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<double> *dv) { double result = 0; std::map<BoundaryType, BoundaryCondition*>::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<double> *vec) { // ===== fill local conditions ============================================== const FiniteElemSpace *feSpace = vec->getFESpace(); Vector<DegreeOfFreedom> dofIndices; const BasisFunction *basisFcts = feSpace->getBasisFcts(); int nBasFcts = basisFcts->getNumber(); DOFAdmin *admin = feSpace->getAdmin(); std::map<BoundaryType, BoundaryCondition*>::iterator it; if (localBCs.size() > 0) { // get boundaries of all DOFs BoundaryType *localBound = GET_MEMORY(BoundaryType, nBasFcts); basisFcts->getBound(elInfo, localBound); // get dof indices basisFcts->getLocalIndicesVec(elInfo->getElement(), admin, &dofIndices); // 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[0], 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[0], localBound, nBasFcts); } } } FREE_MEMORY(localBound, BoundaryType, nBasFcts); } } void BoundaryManager::fillBoundaryConditions(ElInfo *elInfo, DOFMatrix *mat) { // ===== fill local conditions ============================================== const FiniteElemSpace *feSpace = mat->getRowFESpace(); Vector<DegreeOfFreedom> dofIndices; const BasisFunction *basisFcts = feSpace->getBasisFcts(); int nBasFcts = basisFcts->getNumber(); DOFAdmin *admin = feSpace->getAdmin(); std::map<BoundaryType, BoundaryCondition*>::iterator it; if (localBCs.size() > 0) { // get boundaries of all DOFs const BoundaryType *localBound = basisFcts->getBound(elInfo, NULL); // get dof indices basisFcts->getLocalIndicesVec(elInfo->getElement(), admin, &dofIndices); // 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[0], 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[0], localBound, nBasFcts); } } } } } void BoundaryManager::initMatrix(DOFMatrix *matrix) { std::map<BoundaryType, BoundaryCondition*>::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<BoundaryType, BoundaryCondition*>::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<double> *vector) { std::map<BoundaryType, BoundaryCondition*>::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<double> *vector) { std::map<BoundaryType, BoundaryCondition*>::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); } } } } }