00001 #include "mappedfefacevalues.h"
00002 #include "unitcube.h"
00003 #include "exception.h"
00004 #include "numericmethods.h"
00005
00006
00007 MappedFEFaceValues::MappedFEFaceValues(FiniteElementInterface &fe,Index faceId)
00008 :MappedFEValuesBase(fe,fe.face_to_cell_local_map(faceId).size())
00009 {
00010 _dir = faceId;
00011
00012
00013
00014
00015 _face_to_cell_map= fe.face_to_cell_local_map(faceId);
00016
00017 UnitCube ref;
00018 ref.face_base_vectors(faceId,&e1,&e2);
00019
00020
00021 }
00022
00023 void MappedFEFaceValues::setPoints(const ArrayOfVecDouble &v,const VecDouble &weights)
00024 {
00025
00026
00027 assert(v.vecs_size() ==2);
00028
00029 ArrayOfVecDouble pts;
00030 pts.reinit(v.size(),3);
00031
00032 VecDoubleRef pt3D(3);
00033 VecDouble pt2D(2);
00034 UnitCube refDomain;
00035
00036 for (unsigned i=0;i<v.size();i++)
00037 {
00038 pts.getVecValues(i,&pt3D);
00039 v.copyVecValues(i,&pt2D);
00040 refDomain.project_2d_points_into_faces(pt2D,&pt3D,static_cast<FaceDirection3D>(_dir));
00041 }
00042 pts.print();
00043 MappedFEValuesBase::setPoints(pts,weights);
00044 }
00045
00046
00047
00048
00049 void MappedFEFaceValues::compute_values()
00050 {
00051 unsigned iEnd = _pts.size();
00052 VecDoubleRef pt(3);
00053 unsigned n_local_dofs = _face_to_cell_map.size();
00054
00055 for (unsigned i=0;i<iEnd;i++)
00056 {
00057 _pts.getVecValues(i,&pt);
00058 for (unsigned j=0;j<n_local_dofs;j++)
00059 {
00060
00061
00062 _Values(i,j)=_fe.shape_value(_face_to_cell_map[j],pt);
00063 }
00064 }
00065
00066 }
00067
00068
00069 void MappedFEFaceValues::compute_grads(MappingOrthoMesh &map)
00070 {
00071 throw new Exception("MappedFEFaceValues::compute_grads() not implemented yet\n");
00072 }
00073
00074
00075
00076 void MappedFEFaceValues::compute_J(MappingOrthoMesh &map)
00077 {
00078 static Matrix GradT(3,3);
00079 VecDoubleRef pt(3);
00080 static VecDouble aux1(3);
00081 static VecDouble aux2(3);
00082
00083 for(unsigned i=0;i<_pts.size();i++)
00084 {
00085
00086 _pts.getVecValues(i,&pt);
00087
00088
00089 map.T_grad(pt,GradT);
00090
00091 GradT.vmult(aux1,e1);
00092 GradT.vmult(aux2,e2);
00093
00094 _J(i) = NumericMethods::abs_vector_product(aux1,aux2);
00095 }
00096
00097 }
00098
00099
00100 void MappedFEFaceValues::compute_JxW(MappingOrthoMesh &map,const VecDouble &weights)
00101 {
00102 assert(weights.size() == _pts.size());
00103 compute_J(map);
00104 _JxW.term_mult(_J,weights);
00105 }
00106
00107
00108 void MappedFEFaceValues::setQuadrature(const dealii::Quadrature<2> &quad)
00109 {
00110
00111 MappedFEFaceValues::setPoints(quad.get_points(),quad.get_weights());
00112 }
00113
00114
00115 void MappedFEFaceValues::compute_JxW(MappingOrthoMesh &map)
00116 {
00117 compute_JxW(map,_weights);
00118 }