00001 #include "mappedfevalues.h"
00002 #include "numericmethods.h"
00003
00004
00005 void MappedFEValues::setPoints(const dealii::Quadrature<3> &quad)
00006 {
00007 MappedFEValuesBase::setPoints(quad.get_points(),quad.get_weights());
00008 }
00009
00010
00011
00015 void MappedFEValues::compute_values()
00016 {
00017 unsigned iEnd = _pts.size();
00018 VecDoubleRef pt(3);
00019 unsigned n_local_dofs = _fe.n_local_dofs();
00020
00021 for (unsigned i=0;i<iEnd;i++)
00022 {
00023 _pts.getVecValues(i,&pt);
00024 for (unsigned j=0;j<n_local_dofs;j++)
00025 {
00026
00027
00028 _Values(i,j)=_fe.shape_value(j,pt);
00029 }
00030 }
00031 }
00032
00033
00034 void MappedFEValues::compute_grads(MappingOrthoMesh &map)
00035 {
00036 unsigned iEnd = _pts.size();
00037 unsigned n_local_dofs = _fe.n_local_dofs();
00038 VecDoubleRef pt(3);
00039 static VecDouble vGradRef(3);
00040 Matrix invTGrad(3,3);
00041 for (unsigned iPt=0;iPt<iEnd;iPt++)
00042 {
00043 _pts.getVecValues(iPt,&pt);
00044 map.Inv_T_Grad(pt,invTGrad);
00045
00046 for (unsigned j=0;j<n_local_dofs;j++)
00047 {
00048 _fe.shape_grad(j,pt,vGradRef);
00049 invTGrad.Tvmult(_Grad[iPt*m_n_dofs + j],vGradRef);
00050 }
00051 }
00052 }
00053
00054
00055
00056
00057 void MappedFEValues::compute_J(MappingOrthoMesh &map)
00058 {
00059 static Matrix GradT(3,3);
00060 VecDoubleRef pt(3);
00061
00062 for(unsigned i=0;i<_pts.size();i++)
00063 {
00064
00065 _pts.getVecValues(i,&pt);
00066
00067
00068 map.T_grad(pt,GradT);
00069 _J(i)=NumericMethods::det3x3(GradT);
00070 }
00071 }
00072
00073
00074
00080 void MappedFEValues::compute_JxW(MappingOrthoMesh &map,const VecDouble &weights)
00081 {
00082 assert(weights.size() == _pts.size());
00083 compute_J(map);
00084 _JxW.term_mult(_J,weights);
00085 }
00086
00087 void MappedFEValues::compute_JxW(MappingOrthoMesh &map){
00088 assert(_weights.size() == _pts.size());
00089 compute_J(map);
00090 _JxW.term_mult(_J,_weights);
00091 }
00092
00093
00094
00095 MappedFEValues::MappedFEValues(FiniteElementInterface &fe)
00096 :MappedFEValuesBase(fe,fe.n_local_dofs())
00097 {
00098
00099 }
00100
00101
00102 void MappedFEValues::compute(MappingOrthoMesh &map,unsigned compute_flags)
00103 {
00104 m_compute_flags=compute_flags;
00105 if (compute_flags | COMPUTE_VALUES)
00106 compute_values();
00107 if (compute_flags | COMPUTE_GRADS)
00108 compute_grads(map);
00109 if (compute_flags | COMPUTE_PTS)
00110 compute_points(map);
00111 if (compute_flags | COMPUTE_JxW)
00112 compute_JxW(map,_weights);
00113 else if (compute_flags | COMPUTE_J)
00114 compute_J(map);
00115
00116 }
00117
00118
00119 void MappedFEValues::setPoints(const ArrayOfVecDouble &pts,const VecDouble &weights)
00120 {
00121 MappedFEValuesBase::setPoints(pts,weights);
00122 }