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 #ifndef _ABSTRACTTETRAHEDRALELEMENT_HPP_
00031 #define _ABSTRACTTETRAHEDRALELEMENT_HPP_
00032
00033 #include <vector>
00034
00035 #include "UblasMatrixInclude.hpp"
00036 #include "UblasVectorInclude.hpp"
00037
00038 #include "AbstractElement.hpp"
00039 #include "Node.hpp"
00040
00044 template <unsigned ELEMENT_DIM, unsigned SPACE_DIM>
00045 class AbstractTetrahedralElement : public AbstractElement<ELEMENT_DIM,SPACE_DIM>
00046 {
00047 protected:
00048
00054 void RefreshJacobian(c_matrix<double, SPACE_DIM, ELEMENT_DIM>& rJacobian);
00055
00056 public:
00057
00064 AbstractTetrahedralElement(unsigned index, const std::vector<Node<SPACE_DIM>*>& rNodes);
00065
00072 AbstractTetrahedralElement(unsigned index=INDEX_IS_NOT_USED);
00073
00077 virtual ~AbstractTetrahedralElement()
00078 {}
00079
00083 c_vector<double, SPACE_DIM> CalculateCentroid() const;
00084
00091 void CalculateJacobian(c_matrix<double, SPACE_DIM, ELEMENT_DIM>& rJacobian,
00092 double& rJacobianDeterminant);
00093
00100 void CalculateWeightedDirection(c_vector<double, SPACE_DIM>& rWeightedDirection, double& rJacobianDeterminant);
00101
00109 void CalculateInverseJacobian(c_matrix<double, SPACE_DIM, ELEMENT_DIM>& rJacobian,
00110 double& rJacobianDeterminant,
00111 c_matrix<double, ELEMENT_DIM, SPACE_DIM>& rInverseJacobian);
00112
00117 double GetVolume(double determinant) const;
00118
00127 void GetStiffnessMatrixGlobalIndices(unsigned problemDim, unsigned* pIndices) const;
00128 };
00129
00130
00132
00134
00136
00141 template<unsigned SPACE_DIM>
00142 class AbstractTetrahedralElement<0, SPACE_DIM> : public AbstractElement<0,SPACE_DIM>
00143 {
00144 public:
00145
00152 AbstractTetrahedralElement(unsigned index, const std::vector<Node<SPACE_DIM>*>& rNodes);
00153
00160 AbstractTetrahedralElement(unsigned index=INDEX_IS_NOT_USED);
00161
00165 virtual ~AbstractTetrahedralElement()
00166 {}
00167
00171 c_vector<double, SPACE_DIM> CalculateCentroid() const;
00172
00179 void CalculateWeightedDirection(c_vector<double, SPACE_DIM>& rWeightedDirection, double& rJacobianDeterminant);
00180
00189 void GetStiffnessMatrixGlobalIndices(unsigned problemDim, unsigned* pIndices) const;
00190 };
00191
00192 #include <cassert>
00193
00194 template<unsigned SPACE_DIM>
00195 AbstractTetrahedralElement<0, SPACE_DIM>::AbstractTetrahedralElement(unsigned index, const std::vector<Node<SPACE_DIM>*>& rNodes)
00196 : AbstractElement<0, SPACE_DIM>(index, rNodes)
00197 {
00198
00199
00200 assert(this->mNodes.size() == 1);
00201 assert(SPACE_DIM > 0);
00202
00203
00204
00206 c_vector<double, SPACE_DIM> weighted_direction;
00207 double det;
00208
00209 CalculateWeightedDirection(weighted_direction, det);
00210
00211
00212
00213 assert(det > 0.0);
00214 }
00215
00216 template<unsigned SPACE_DIM>
00217 AbstractTetrahedralElement<0, SPACE_DIM>::AbstractTetrahedralElement(unsigned index)
00218 : AbstractElement<0, SPACE_DIM>(index)
00219 {
00220 }
00221
00222 template<unsigned SPACE_DIM>
00223 void AbstractTetrahedralElement<0, SPACE_DIM>::CalculateWeightedDirection(
00224 c_vector<double, SPACE_DIM>& rWeightedDirection,
00225 double& rJacobianDeterminant)
00226 {
00227 assert(SPACE_DIM > 0);
00228
00229
00230 rWeightedDirection = zero_vector<double>(SPACE_DIM);
00231 rWeightedDirection(0) = 1.0;
00232
00233 rJacobianDeterminant = 1.0;
00234 }
00235
00236 template<unsigned SPACE_DIM>
00237 c_vector<double, SPACE_DIM> AbstractTetrahedralElement<0, SPACE_DIM>::CalculateCentroid() const
00238 {
00239 c_vector<double, SPACE_DIM> centroid = this->mNodes[0]->rGetLocation();
00240 return centroid;
00241 }
00242
00243 template<unsigned SPACE_DIM>
00244 void AbstractTetrahedralElement<0, SPACE_DIM>::GetStiffnessMatrixGlobalIndices(unsigned problemDim, unsigned* pIndices) const
00245 {
00246 for (unsigned local_index=0; local_index<1; local_index++)
00247 {
00248 unsigned node = this->GetNodeGlobalIndex(local_index);
00249
00250 for (unsigned problem_index=0; problem_index<problemDim; problem_index++)
00251 {
00252
00253 pIndices[local_index*problemDim + problem_index] = node*problemDim + problem_index;
00254 }
00255 }
00256 }
00257
00258 #endif //_ABSTRACTTETRAHEDRALELEMENT_HPP_