00001 00029 #ifndef ELEMENTBOUNDARYTRACES 00030 #define ELEMENTBOUNDARYTRACES 00031 00032 #include <vector> 00033 #include "AuxDefs.h" 00034 #include "Element.h" 00035 00062 class ElementBoundaryTraces 00063 { 00064 public: 00065 ElementBoundaryTraces() {} 00066 virtual ~ElementBoundaryTraces() {} 00067 ElementBoundaryTraces(const ElementBoundaryTraces &) {} 00068 virtual ElementBoundaryTraces * clone() const = 0; 00069 00071 virtual size_t getNumTraceFaces() const = 0; 00072 00082 virtual const std::vector<size_t> & getTraceFaceIds() const = 0; 00083 00084 00090 virtual size_t getTraceNumberOfFace(size_t FaceIndex) const = 0; 00091 00096 virtual const Element & getTrace(size_t FaceIndex) const = 0; 00097 00101 inline const Element & operator[](size_t FaceIndex) 00102 { return getTrace(FaceIndex); } 00103 00107 virtual const std::vector<double> & getNormal(size_t FaceIndex) const = 0; 00108 00118 virtual size_t dofMap(size_t FaceIndex, size_t field, size_t dof) const = 0; 00119 }; 00120 00121 00122 00123 00139 class ElementBoundaryTraces_: public ElementBoundaryTraces { 00140 private: 00141 void copy (const ElementBoundaryTraces_& that) { 00142 FaceNumbers = that.FaceNumbers; 00143 00144 for (size_t i = 0; i < that.FaceElements.size (); i++) { 00145 FaceElements.push_back (that.FaceElements[i]->clone ()); 00146 } 00147 } 00148 00149 void destroy () { 00150 for (size_t i = 0; i < FaceElements.size (); i++) { 00151 delete FaceElements[i]; 00152 FaceElements[i] = NULL; 00153 } 00154 } 00155 00156 public: 00157 ElementBoundaryTraces_ () { 00158 } 00159 00160 virtual ~ElementBoundaryTraces_ () { 00161 destroy(); 00162 } 00163 00164 ElementBoundaryTraces_ (const ElementBoundaryTraces_ & that) : 00165 ElementBoundaryTraces (that) { 00166 00167 copy (that); 00168 } 00169 00170 ElementBoundaryTraces_& operator = (const ElementBoundaryTraces_& that) { 00171 if (this != &that) { 00172 destroy (); 00173 copy (that); 00174 } 00175 return (*this); 00176 } 00177 00178 virtual ElementBoundaryTraces_ * clone () const = 0; 00179 00180 size_t getNumTraceFaces () const { 00181 return FaceElements.size (); 00182 } 00183 00184 const std::vector<size_t> & getTraceFaceIds () const { 00185 return FaceNumbers; 00186 } 00187 00188 inline size_t getTraceNumberOfFace (size_t FaceIndex) const { 00189 for (size_t i = 0; i < FaceNumbers.size (); i++) { 00190 if (FaceNumbers[i] == FaceIndex) { 00191 return i; 00192 } 00193 } 00194 return -1; 00195 } 00196 00197 virtual const Element & getTrace (size_t FaceIndex) const { 00198 return *FaceElements[FaceIndex]; 00199 } 00200 00201 protected: 00202 void addFace (const Element_ * NewFace, const size_t FaceNumber) { 00203 FaceElements.push_back (NewFace->clone ()); 00204 FaceNumbers.push_back (FaceNumber); 00205 } 00206 00207 private: 00208 std::vector<const Element *> FaceElements; 00209 std::vector<size_t> FaceNumbers; 00210 }; 00211 00212 #endif 00213