00001 #ifndef _MY_FEOrthoMeshDealWrapper_
00002 #define _MY_FEOrthoMeshDealWrapper_
00003
00004 #include "feorthomesh.h"
00005
00010 class FEOrthoMeshDealWrapper : public FEOrthoMesh
00011 {
00012 private:
00013 ArrayOfVecDouble m_support_points;
00014 protected:
00015 dealii::FiniteElement<3> *_dealFE;
00016 std::vector<VecIndex > _face_to_cell_map;
00017
00018 public:
00019 FEOrthoMeshDealWrapper()
00020 :_dealFE(NULL)
00021 {
00022 }
00023 ~FEOrthoMeshDealWrapper(){}
00024
00025 public:
00026 void wrap(dealii::FiniteElement<3> &fe)
00027 {
00028 _dealFE = &fe;
00029
00030
00031 _face_to_cell_map.resize(6);
00032
00033 for (unsigned i=0;i<6;i++)
00034 {
00035
00036 _face_to_cell_map[i].resize(fe.n_dofs_per_face());
00037
00038
00039 for (unsigned j=0;j<fe.n_dofs_per_face();j++)
00040 _face_to_cell_map[i][j]=fe.face_to_cell_index(j,i);
00041 }
00042
00043 m_support_points=_dealFE->get_unit_support_points();
00044 }
00045 virtual unsigned n_fields(){return _dealFE->n_components();}
00046
00047
00048
00049 virtual Index n_dofs_per_face()
00050 {
00051 return _dealFE->n_dofs_per_face();
00052 }
00053
00054 virtual const VecIndex& face_to_cell_local_map(Index faceId)
00055 {
00056 return _face_to_cell_map[faceId];
00057 }
00058
00059
00060
00061 virtual Index n_local_dofs()
00062 {
00063 return _dealFE->n_dofs_per_cell();
00064 }
00065
00066
00067
00068 virtual Index local_dof_field(unsigned local_dof)
00069 {
00070 return _dealFE->system_to_component_index(local_dof).first;
00071 }
00072
00073 virtual double shape_value(unsigned i,const VecDouble &p)
00074 {
00075 Point3D pt(p(0),p(1),p(2));
00076 return _dealFE->shape_value(i,pt);
00077 }
00078
00079 virtual void shape_grad(unsigned i,const VecDouble &pt,VecDouble &vGrad)
00080 {
00081 Point3D p(pt(0),pt(1),pt(2));
00082 _dealFE->shape_grad(i,p).unroll(vGrad);
00083 }
00084
00085 virtual const ArrayOfVecDouble& get_support_points()
00086 {
00087 return m_support_points;
00088 }
00089
00090
00091
00092
00093
00094 };
00095
00096 #endif