Skip to content
Snippets Groups Projects
BoundaryManager.cc 5.18 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();
    const BoundaryType    *localBound = NULL;
    const DegreeOfFreedom *dofIndices = NULL;
    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
      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<BoundaryType, BoundaryCondition*>::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::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);
	}
      }
    }
  }

}