AbstractBoundaryConditionsContainerImplementation.hpp
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
00031
00032
00033
00034
00035
00036 #ifndef ABSTRACTBOUNDARYCONDITIONSCONTAINERIMPLEMENTATION_HPP_
00037 #define ABSTRACTBOUNDARYCONDITIONSCONTAINERIMPLEMENTATION_HPP_
00038
00039 #include "AbstractBoundaryConditionsContainer.hpp"
00040 #include "PetscTools.hpp"
00041
00042 template<unsigned ELEMENT_DIM, unsigned SPACE_DIM, unsigned PROBLEM_DIM>
00043 AbstractBoundaryConditionsContainer<ELEMENT_DIM,SPACE_DIM,PROBLEM_DIM>::AbstractBoundaryConditionsContainer(bool deleteConditions)
00044 : mHasDirichletBCs(false),
00045 mCheckedAndCommunicatedIfDirichletBcs(false),
00046 mDeleteConditions(deleteConditions)
00047 {
00048 for (unsigned index_of_unknown=0; index_of_unknown<PROBLEM_DIM; index_of_unknown++)
00049 {
00050 mpDirichletMap[index_of_unknown] = new std::map< const Node<SPACE_DIM> *, const AbstractBoundaryCondition<SPACE_DIM>*, LessThanNode<SPACE_DIM> >;
00051 }
00052 }
00053
00054 template<unsigned ELEMENT_DIM, unsigned SPACE_DIM, unsigned PROBLEM_DIM>
00055 AbstractBoundaryConditionsContainer<ELEMENT_DIM,SPACE_DIM,PROBLEM_DIM>::~AbstractBoundaryConditionsContainer()
00056 {
00057 DeleteDirichletBoundaryConditions();
00058 }
00059
00060 template<unsigned ELEMENT_DIM, unsigned SPACE_DIM, unsigned PROBLEM_DIM>
00061 bool AbstractBoundaryConditionsContainer<ELEMENT_DIM,SPACE_DIM,PROBLEM_DIM>::HasDirichletBoundaryConditions()
00062 {
00063 if (!mCheckedAndCommunicatedIfDirichletBcs)
00064 {
00065 bool i_have_dirichlet=false;
00066 for (unsigned i=0; i<PROBLEM_DIM; i++)
00067 {
00068 if (!mpDirichletMap[i]->empty())
00069 {
00070 i_have_dirichlet=true;
00071 break;
00072 }
00073 }
00074 mHasDirichletBCs = PetscTools::ReplicateBool(i_have_dirichlet);
00075 mCheckedAndCommunicatedIfDirichletBcs = true;
00076 }
00077 return mHasDirichletBCs;
00078 }
00079
00080 template<unsigned ELEMENT_DIM, unsigned SPACE_DIM, unsigned PROBLEM_DIM>
00081 void AbstractBoundaryConditionsContainer<ELEMENT_DIM,SPACE_DIM,PROBLEM_DIM>::DeleteDirichletBoundaryConditions(std::set<const AbstractBoundaryCondition<SPACE_DIM>*> alreadyDeletedConditions)
00082 {
00083 for (unsigned i=0; i<PROBLEM_DIM; i++)
00084 {
00085 if (mpDirichletMap[i])
00086 {
00087 mDirichIterator = mpDirichletMap[i]->begin();
00088 while (mDirichIterator != mpDirichletMap[i]->end() )
00089 {
00090 if (alreadyDeletedConditions.count(mDirichIterator->second) == 0)
00091 {
00092 alreadyDeletedConditions.insert(mDirichIterator->second);
00093 if (mDeleteConditions)
00094 {
00095 delete mDirichIterator->second;
00096 }
00097 }
00098 mDirichIterator++;
00099 }
00100
00101 delete(mpDirichletMap[i]);
00102 mpDirichletMap[i] = NULL;
00103 }
00104 }
00105
00106
00107 ResetDirichletCommunication();
00108 }
00109
00110 template<unsigned ELEMENT_DIM, unsigned SPACE_DIM, unsigned PROBLEM_DIM>
00111 double AbstractBoundaryConditionsContainer<ELEMENT_DIM,SPACE_DIM,PROBLEM_DIM>::GetDirichletBCValue(const Node<SPACE_DIM>* pBoundaryNode, unsigned indexOfUnknown)
00112 {
00113 assert(indexOfUnknown < PROBLEM_DIM);
00114
00115
00116 mDirichIterator = mpDirichletMap[indexOfUnknown]->find(pBoundaryNode);
00117 assert(mDirichIterator != mpDirichletMap[indexOfUnknown]->end());
00118
00119 return mDirichIterator->second->GetValue(pBoundaryNode->GetPoint());
00120 }
00121
00122 template<unsigned ELEMENT_DIM, unsigned SPACE_DIM, unsigned PROBLEM_DIM>
00123 bool AbstractBoundaryConditionsContainer<ELEMENT_DIM,SPACE_DIM,PROBLEM_DIM>::HasDirichletBoundaryCondition(const Node<SPACE_DIM>* pNode, unsigned indexOfUnknown)
00124 {
00125 assert(indexOfUnknown < PROBLEM_DIM);
00126
00127 this->mDirichIterator = this->mpDirichletMap[indexOfUnknown]->find(pNode);
00128
00129 return (this->mDirichIterator != this->mpDirichletMap[indexOfUnknown]->end());
00130 }
00131
00132 #endif