00001 #ifndef _MY_FEDealWrapper_
00002 #define _MY_FEDealWrapper_
00003 #include "finiteelementinterface.h"
00004
00038 class FEDealWrapper : public FiniteElementInterface
00039 {
00040 private:
00041 ArrayOfVecDouble m_support_points;
00042 protected:
00043 dealii::FiniteElement<3> *_dealFE;
00044 std::vector<VecIndex > _face_to_cell_map;
00045
00046 public:
00047 FEDealWrapper()
00048 :_dealFE(NULL)
00049 {
00050 }
00051
00052 public:
00053 void wrap(dealii::FiniteElement<3> &fe)
00054 {
00055 _dealFE = &fe;
00056
00057
00058 _face_to_cell_map.resize(6);
00059
00060 for (unsigned i=0;i<6;i++)
00061 {
00062
00063 _face_to_cell_map[i].resize(fe.n_dofs_per_face());
00064
00065
00066 for (unsigned j=0;j<fe.n_dofs_per_face();j++)
00067 _face_to_cell_map[i][j]=fe.face_to_cell_index(j,i);
00068 }
00069
00070 m_support_points=_dealFE->get_unit_support_points();
00071
00072 }
00073 virtual unsigned n_fields(){return _dealFE->n_components();}
00074
00075 ~FEDealWrapper(){}
00076
00077
00078 virtual Index n_dofs_per_face()
00079 {
00080 return _dealFE->n_dofs_per_face();
00081 }
00082
00083 virtual const VecIndex& face_to_cell_local_map(Index faceId)
00084 {
00085 return _face_to_cell_map[faceId];
00086 }
00087
00088
00089
00090 virtual Index n_local_dofs()
00091 {
00092 return _dealFE->n_dofs_per_cell();
00093 }
00094
00095
00096
00097 virtual Index local_dof_field(unsigned local_dof)
00098 {
00099 return _dealFE->system_to_component_index(local_dof).first;
00100 }
00101
00102 virtual double shape_value(unsigned i,const VecDouble &p)
00103 {
00104 Point3D pt(p(0),p(1),p(2));
00105 return _dealFE->shape_value(i,pt);
00106 }
00107
00108 virtual void shape_grad(unsigned i,const VecDouble &pt,VecDouble &vGrad)
00109 {
00110 Point3D p(pt(0),pt(1),pt(2));
00111 _dealFE->shape_grad(i,p).unroll(vGrad);
00112 }
00113
00114 virtual const ArrayOfVecDouble& get_support_points()
00115 {
00116 return m_support_points;
00117 }
00118
00119
00120
00121
00122 };
00123
00124
00125
00126
00127
00128 #endif