00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030 #ifndef ABSTRACTBOUNDARYCONDITIONSCONTAINERIMPLEMENTATION_HPP_
00031 #define ABSTRACTBOUNDARYCONDITIONSCONTAINERIMPLEMENTATION_HPP_
00032
00033 #include "AbstractBoundaryConditionsContainer.hpp"
00034
00035 template<unsigned ELEM_DIM, unsigned SPACE_DIM, unsigned PROBLEM_DIM>
00036 AbstractBoundaryConditionsContainer<ELEM_DIM,SPACE_DIM,PROBLEM_DIM>::AbstractBoundaryConditionsContainer()
00037 {
00038 for (unsigned index_of_unknown=0; index_of_unknown<PROBLEM_DIM; index_of_unknown++)
00039 {
00040 mpDirichletMap[index_of_unknown] = new std::map< const Node<SPACE_DIM> *, const AbstractBoundaryCondition<SPACE_DIM>*, LessThanNode<SPACE_DIM> >;
00041 }
00042 }
00043
00044 template<unsigned ELEM_DIM, unsigned SPACE_DIM, unsigned PROBLEM_DIM>
00045 AbstractBoundaryConditionsContainer<ELEM_DIM,SPACE_DIM,PROBLEM_DIM>::~AbstractBoundaryConditionsContainer()
00046 {
00047 DeleteDirichletBoundaryConditions();
00048 }
00049
00050 template<unsigned ELEM_DIM, unsigned SPACE_DIM, unsigned PROBLEM_DIM>
00051 bool AbstractBoundaryConditionsContainer<ELEM_DIM,SPACE_DIM,PROBLEM_DIM>::HasDirichletBoundaryConditions()
00052 {
00053 for (unsigned i=0; i<PROBLEM_DIM; i++)
00054 {
00055 if (!mpDirichletMap[i]->empty())
00056 {
00057 return true;
00058 }
00059 }
00060 return false;
00061 }
00062
00063 template<unsigned ELEM_DIM, unsigned SPACE_DIM, unsigned PROBLEM_DIM>
00064 void AbstractBoundaryConditionsContainer<ELEM_DIM,SPACE_DIM,PROBLEM_DIM>::DeleteDirichletBoundaryConditions(std::set<const AbstractBoundaryCondition<SPACE_DIM>*> deletedConditions)
00065 {
00066 for (unsigned i=0; i<PROBLEM_DIM; i++)
00067 {
00068 if (mpDirichletMap[i])
00069 {
00070 mDirichIterator = mpDirichletMap[i]->begin();
00071 while (mDirichIterator != mpDirichletMap[i]->end() )
00072 {
00073 if (deletedConditions.count(mDirichIterator->second) == 0)
00074 {
00075 deletedConditions.insert(mDirichIterator->second);
00076 delete mDirichIterator->second;
00077 }
00078 mDirichIterator++;
00079 }
00080
00081 delete(mpDirichletMap[i]);
00082 mpDirichletMap[i] = NULL;
00083 }
00084 }
00085 }
00086
00087 template<unsigned ELEM_DIM, unsigned SPACE_DIM, unsigned PROBLEM_DIM>
00088 double AbstractBoundaryConditionsContainer<ELEM_DIM,SPACE_DIM,PROBLEM_DIM>::GetDirichletBCValue(const Node<SPACE_DIM>* pBoundaryNode, unsigned indexOfUnknown)
00089 {
00090 assert(indexOfUnknown < PROBLEM_DIM);
00091
00092
00093 mDirichIterator = mpDirichletMap[indexOfUnknown]->find(pBoundaryNode);
00094 assert(mDirichIterator != mpDirichletMap[indexOfUnknown]->end());
00095
00096 return mDirichIterator->second->GetValue(pBoundaryNode->GetPoint());
00097 }
00098
00099 template<unsigned ELEM_DIM, unsigned SPACE_DIM, unsigned PROBLEM_DIM>
00100 bool AbstractBoundaryConditionsContainer<ELEM_DIM,SPACE_DIM,PROBLEM_DIM>::HasDirichletBoundaryCondition(const Node<SPACE_DIM>* pNode, unsigned indexOfUnknown)
00101 {
00102 assert(indexOfUnknown < PROBLEM_DIM);
00103
00104 this->mDirichIterator = this->mpDirichletMap[indexOfUnknown]->find(pNode);
00105
00106 return (this->mDirichIterator != this->mpDirichletMap[indexOfUnknown]->end());
00107 }
00108
00109 #endif