00001
00030 #ifndef P13DELEMENT
00031 #define P13DELEMENT
00032
00033 #include "P1nDElement.h"
00034 #include "P12DElement.h"
00035 #include "ShapesEvaluatedP13D.h"
00036 #include "Tetrahedron.h"
00037 #include "ElementGeometry.h"
00038
00039
00040 #include <iostream>
00041 #include <vector>
00042 #include <cassert>
00043
00045 template<size_t NF>
00046 class P13DElement: public P1nDElement<NF> {
00047 public:
00049 P13DElement (const Tetrahedron& _elemGeom): P1nDElement<NF> (_elemGeom) {
00050 ShapesP13D::Bulk modelShape (_elemGeom);
00051 Element_::addBasisFunctions (modelShape);
00052 }
00053
00054
00056 P13DElement (const P13DElement<NF>& that): P1nDElement<NF> (that) {
00057
00058 }
00059
00061 virtual P13DElement<NF>* clone () const {
00062 return new P13DElement<NF> (*this);
00063 }
00064
00065 };
00066
00067
00068
00099 template<size_t NF>
00100 class P13DTrace: public P1nDTrace<NF> {
00101 public:
00102
00106 P13DTrace (const P13DElement<NF> &BaseElement, const typename P1nDTrace<NF>::FaceLabel& FaceName,
00107 const typename P1nDTrace<NF>::ShapeType& Type);
00108
00109 virtual ~P13DTrace () {
00110 }
00111
00113 P13DTrace (const P13DTrace<NF> &OldElement_) :
00114 P1nDTrace<NF> (OldElement_) {
00115 }
00116
00118 virtual P13DTrace<NF>* clone () const {
00119 return new P13DTrace<NF> (*this);
00120 }
00121
00122 protected:
00124 static const size_t FaceNodes[];
00125
00126 private:
00130 void checkArgs (const typename P1nDTrace<NF>::FaceLabel& flabel, const typename P1nDTrace<NF>::ShapeType& shType) {
00131 assert (shType != P1nDTrace<NF>::TwoDofs);
00132 }
00133
00134 };
00135
00136 template<size_t NF>
00137 const size_t P13DTrace<NF>::FaceNodes[] = { 2, 1, 0, 2, 0, 3, 2, 3, 1, 0, 1, 3 };
00138
00139
00140 template<size_t NF>
00141 P13DTrace<NF>::P13DTrace (const P13DElement<NF> &BaseElement,
00142 const typename P1nDTrace<NF>::FaceLabel& FaceName, const typename P1nDTrace<NF>::ShapeType& Type) :
00143 P1nDTrace<NF> (BaseElement) {
00144
00145 checkArgs (FaceName, Type);
00146
00147 const ElementGeometry& tetGeom = Element::getGeometry ();
00148
00149 Triangle<3> FaceGeom (tetGeom.getConnectivity ()[FaceNodes[FaceName * 3 + 0]],
00150 tetGeom.getConnectivity ()[FaceNodes[FaceName * 3 + 1]],
00151 tetGeom.getConnectivity ()[FaceNodes[FaceName * 3 + 2]]);
00152
00153 if (Type == P1nDTrace<NF>::ThreeDofs) {
00154 ShapesP13D::Faces ModelShape (&FaceGeom);
00155 Element_::addBasisFunctions (ModelShape);
00156 } else {
00157
00158 switch (FaceName) {
00159 case P1nDTrace<NF>::FaceOne: {
00160 ShapesP13D::FaceOne ModelShape(FaceGeom);
00161 Element_::addBasisFunctions(ModelShape);
00162 break;
00163 }
00164
00165 case P1nDTrace<NF>::FaceTwo: {
00166 ShapesP13D::FaceTwo ModelShape(FaceGeom);
00167 Element_::addBasisFunctions(ModelShape);
00168 break;
00169 }
00170
00171 case P1nDTrace<NF>::FaceThree: {
00172 ShapesP13D::FaceThree ModelShape(FaceGeom);
00173 Element_::addBasisFunctions(ModelShape);
00174 break;
00175 }
00176
00177 case P1nDTrace<NF>::FaceFour: {
00178 ShapesP13D::FaceFour ModelShape(FaceGeom);
00179 Element_::addBasisFunctions(ModelShape);
00180 break;
00181 }
00182
00183 }
00184 }
00185 }
00186
00187
00188
00199 template<size_t NF>
00200 class P13DElementBoundaryTraces: public P1nDBoundaryTraces<NF> {
00201 public:
00202
00206 P13DElementBoundaryTraces (const P13DElement<NF> &BaseElement,
00207 const std::vector<typename P1nDTrace<NF>::FaceLabel>& faceLabels,
00208 typename P13DTrace<NF>::ShapeType Type):
00209 P1nDBoundaryTraces<NF> (BaseElement, faceLabels, Type) {
00210
00211 }
00212
00213 virtual ~P13DElementBoundaryTraces () {
00214 }
00215
00217 P13DElementBoundaryTraces (const P13DElementBoundaryTraces<NF> &OldElem) :
00218 P1nDBoundaryTraces<NF> (OldElem) {
00219 }
00220
00222 P13DElementBoundaryTraces<NF> * clone () const {
00223 return new P13DElementBoundaryTraces<NF> (*this);
00224 }
00225
00231 size_t dofMap (size_t FaceIndex, size_t field, size_t dof) const;
00232 };
00233
00234
00235 template<size_t NF>
00236 size_t P13DElementBoundaryTraces<NF>::dofMap (size_t FaceIndex, size_t field, size_t dof) const {
00237 size_t val;
00238
00239 if (ElementBoundaryTraces::getTrace (FaceIndex).getDof (field) == 4) {
00240 val = dof;
00241 } else {
00242
00243
00244 const size_t* FaceNodes = P13DTrace<NF>::FaceNodes;
00245 size_t facenum = ElementBoundaryTraces::getTraceFaceIds ()[FaceIndex];
00246 val = FaceNodes[3 * facenum + dof];
00247 }
00248 return val;
00249 }
00250
00252 template<size_t NF>
00253 class P13D: public SpecificElementFamily {
00254
00255 public:
00257 typedef P13DElement<NF> Bulk;
00258
00260 typedef P13DTrace<NF> Face;
00261
00263 typedef P13DElementBoundaryTraces<NF> Traces;
00264
00265 };
00266
00267
00268
00269 #endif
00270