00001
00030 #ifndef P12DELEMENT
00031 #define P12DELEMENT
00032
00033 #include "Element.h"
00034 #include "P1nDElement.h"
00035
00036 #include "ElementGeometry.h"
00037 #include "Triangle.h"
00038 #include "ElementBoundaryTrace.h"
00039 #include "ShapesEvaluated.h"
00040
00041 #include <iostream>
00042 #include <vector>
00043 #include <cassert>
00044
00049 template<size_t NF>
00050 class P12DElement: public P1nDElement<NF> {
00051 public:
00052 P12DElement (const Triangle<2>& _elemGeom) :
00053 P1nDElement<NF> (_elemGeom) {
00054 ShapesP12D::Bulk modelShape (_elemGeom);
00055 Element_::addBasisFunctions (modelShape);
00056 }
00057
00058 P12DElement (const P12DElement<NF> &that) :
00059 P1nDElement<NF> (that) {
00060
00061 }
00062
00063 virtual P12DElement<NF>* clone () const {
00064 return new P12DElement<NF> (*this);
00065 }
00066 };
00067
00089 template<size_t NF>
00090 class P12DTrace: public P1nDTrace<NF> {
00091 public:
00092
00096 P12DTrace (const P12DElement<NF> & BaseElement, const typename P1nDTrace<NF>::FaceLabel& FaceName,
00097 const typename P1nDTrace<NF>::ShapeType& Type);
00098
00099 virtual ~P12DTrace () {
00100 }
00101
00102 P12DTrace (const P12DTrace<NF> &that) :
00103 P1nDTrace<NF> (that) {
00104 }
00105
00106 virtual P12DTrace<NF> * clone () const {
00107 return new P12DTrace<NF> (*this);
00108 }
00109 private:
00114 void checkArgs (const typename P1nDTrace<NF>::FaceLabel& faceLabel,
00115 const typename P1nDTrace<NF>::ShapeType& shapeType) {
00116
00117 assert (faceLabel != P1nDTrace<NF>::FaceFour);
00118
00119
00120 assert (shapeType == P1nDTrace<NF>::TwoDofs || shapeType == P1nDTrace<NF>::ThreeDofs);
00121 }
00122
00123 };
00124
00125 template<size_t NF>
00126 P12DTrace<NF>::P12DTrace (const P12DElement<NF> & BaseElement,
00127 const typename P1nDTrace<NF>::FaceLabel& FaceName, const typename P1nDTrace<NF>::ShapeType& Type) :
00128 P1nDTrace<NF> (BaseElement) {
00129
00130 checkArgs (FaceName, Type);
00131
00132 const ElementGeometry& TriGeom = Element::getGeometry ();
00133 if (Type == P1nDTrace<NF>::TwoDofs)
00134 switch (FaceName) {
00135 case P1nDTrace<NF>::FaceOne: {
00136 Segment<2> FaceGeom (TriGeom.getConnectivity ()[0], TriGeom.getConnectivity ()[1]);
00137 ShapesP12D::Faces ModelShape (&FaceGeom);
00138 Element_::addBasisFunctions (ModelShape);
00139 break;
00140 }
00141
00142 case P1nDTrace<NF>::FaceTwo: {
00143 Segment<2> FaceGeom (TriGeom.getConnectivity ()[1], TriGeom.getConnectivity ()[2]);
00144 ShapesP12D::Faces ModelShape (&FaceGeom);
00145 Element_::addBasisFunctions (ModelShape);
00146 break;
00147 }
00148
00149 case P1nDTrace<NF>::FaceThree: {
00150 Segment<2> FaceGeom (TriGeom.getConnectivity ()[2], TriGeom.getConnectivity ()[0]);
00151 ShapesP12D::Faces ModelShape (&FaceGeom);
00152 Element_::addBasisFunctions (ModelShape);
00153 break;
00154 }
00155 }
00156 else
00157
00158 switch (FaceName) {
00159 case P1nDTrace<NF>::FaceOne: {
00160 Segment<2> FaceGeom (TriGeom.getConnectivity ()[0], TriGeom.getConnectivity ()[1]);
00161 ShapesP12D::FaceOne ModelShape (&FaceGeom);
00162 Element_::addBasisFunctions (ModelShape);
00163 break;
00164 }
00165
00166 case P1nDTrace<NF>::FaceTwo: {
00167 Segment<2> FaceGeom (TriGeom.getConnectivity ()[1], TriGeom.getConnectivity ()[2]);
00168 ShapesP12D::FaceTwo ModelShape (&FaceGeom);
00169 Element_::addBasisFunctions (ModelShape);
00170 break;
00171 }
00172
00173 case P1nDTrace<NF>::FaceThree: {
00174 Segment<2> FaceGeom (TriGeom.getConnectivity ()[2], TriGeom.getConnectivity ()[0]);
00175 ShapesP12D::FaceThree ModelShape (&FaceGeom);
00176 Element_::addBasisFunctions (ModelShape);
00177 break;
00178 }
00179 }
00180 }
00181
00195 template<size_t NF>
00196 class P12DElementBoundaryTraces: public P1nDBoundaryTraces<NF> {
00197 public:
00201 P12DElementBoundaryTraces (const P12DElement<NF> &BaseElement,
00202 const std::vector<typename P1nDTrace<NF>::FaceLabel>& flabels,
00203 const typename P1nDTrace<NF>::ShapeType& shType):
00204 P1nDBoundaryTraces<NF> (BaseElement, flabels, shType) {
00205
00206 }
00207
00208 virtual ~P12DElementBoundaryTraces () {
00209 }
00210
00211 P12DElementBoundaryTraces (const P12DElementBoundaryTraces<NF> & OldElem) :
00212 P1nDBoundaryTraces<NF> (OldElem) {
00213 }
00214
00215 P12DElementBoundaryTraces<NF> * clone () const {
00216 return new P12DElementBoundaryTraces<NF> (*this);
00217 }
00218
00219
00220 size_t dofMap (size_t FaceIndex, size_t field, size_t dof) const;
00221
00222 };
00223
00224
00225 template<size_t NF> size_t P12DElementBoundaryTraces<NF>::dofMap (
00226 size_t FaceIndex, size_t field, size_t dof) const {
00227 size_t val;
00228 if (ElementBoundaryTraces::getTrace (FaceIndex).getDof (field) == 3) {
00229 val = dof;
00230 } else {
00231
00232 switch (ElementBoundaryTraces::getTraceFaceIds ()[FaceIndex]) {
00233 case 0:
00234 val = dof;
00235 break;
00236
00237 case 1:
00238 val = dof + 1;
00239 break;
00240
00241 case 2:
00242 val = (dof == 0 ? 2 : 0);
00243 break;
00244
00245 default:
00246 std::cerr << "P12DElementBoundaryTraces.DofMap Error\n";
00247 exit (1);
00248 }
00249 }
00250
00251 return val;
00252 }
00253
00259 template<size_t NF> class P12D: public SpecificElementFamily {
00260 public:
00262 typedef P12DElement<NF> Bulk;
00263
00265 typedef P12DTrace<NF> Face;
00266
00268 typedef P12DElementBoundaryTraces<NF> Traces;
00269 };
00270
00271
00272
00273 #endif
00274