Newer
Older
#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);
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);
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);
}
}
}
}
}