Skip to content
Snippets Groups Projects
BoundaryManager.cc 5.15 KiB
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;

      // 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);
      // 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);
	}
      }
    }
  }

}