QuadraturePointsGroup.cpp
00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036 #include "QuadraturePointsGroup.hpp"
00037 #include "Exception.hpp"
00038
00039 template<unsigned DIM>
00040 QuadraturePointsGroup<DIM>::QuadraturePointsGroup(AbstractTetrahedralMesh<DIM,DIM>& rMesh,
00041 GaussianQuadratureRule<DIM>& rQuadRule)
00042 {
00043 c_vector<double, DIM> unset;
00044 for (unsigned i=0; i<DIM; i++)
00045 {
00046 unset(i)=DOUBLE_UNSET;
00047 }
00048 mNumElements = rMesh.GetNumElements();
00049 mNumQuadPointsPerElement = rQuadRule.GetNumQuadPoints();
00050 data.resize(mNumElements*mNumQuadPointsPerElement, unset);
00051
00052
00053 for (typename AbstractTetrahedralMesh<DIM, DIM>::ElementIterator iter = rMesh.GetElementIteratorBegin();
00054 iter != rMesh.GetElementIteratorEnd();
00055 ++iter)
00056 {
00057
00058 unsigned elem_index = iter->GetIndex();
00059
00060 c_vector<double, DIM+1> linear_phi;
00061 for (unsigned quad_index=0; quad_index<rQuadRule.GetNumQuadPoints(); quad_index++)
00062 {
00063 const ChastePoint<DIM>& quadrature_point = rQuadRule.rGetQuadPoint(quad_index);
00064
00065 LinearBasisFunction<DIM>::ComputeBasisFunctions(quadrature_point, linear_phi);
00066
00067
00068 c_vector<double,DIM> physical_quad_point = zero_vector<double>(DIM);
00069 for (unsigned node_index=0; node_index<DIM+1; node_index++)
00070 {
00071 physical_quad_point += linear_phi(node_index)*(iter->GetNode(node_index))->rGetLocation();
00072 }
00073
00074
00075 assert(elem_index<mNumElements);
00076 assert(quad_index<mNumQuadPointsPerElement);
00077 data[ elem_index*mNumQuadPointsPerElement + quad_index ] = physical_quad_point;
00078 }
00079 }
00080 }
00081
00082 template<unsigned DIM>
00083 c_vector<double,DIM>& QuadraturePointsGroup<DIM>::rGet(unsigned elementIndex, unsigned quadIndex)
00084 {
00085 assert(elementIndex<mNumElements);
00086 assert(quadIndex<mNumQuadPointsPerElement);
00087 return data[ elementIndex*mNumQuadPointsPerElement + quadIndex ];
00088 }
00089
00090 template<unsigned DIM>
00091 c_vector<double,DIM>& QuadraturePointsGroup<DIM>::rGet(unsigned i)
00092 {
00093 assert(i < mNumElements*mNumQuadPointsPerElement);
00094 return data[i];
00095 }
00096
00097 template<unsigned DIM>
00098 unsigned QuadraturePointsGroup<DIM>::GetNumElements() const
00099 {
00100 return mNumElements;
00101 }
00102
00103 template<unsigned DIM>
00104 unsigned QuadraturePointsGroup<DIM>::GetNumQuadPointsPerElement() const
00105 {
00106 return mNumQuadPointsPerElement;
00107 }
00108
00109 template<unsigned DIM>
00110 unsigned QuadraturePointsGroup<DIM>::Size() const
00111 {
00112 return mNumElements*mNumQuadPointsPerElement;
00113 }
00114
00116
00118
00119 template class QuadraturePointsGroup<1>;
00120 template class QuadraturePointsGroup<2>;
00121 template class QuadraturePointsGroup<3>;