Main Page   Groups   Namespace List   Class Hierarchy   Alphabetical List   Compound List   File List   Namespace Members   Compound Members   File Members   Concepts

itkFEMElementBase.h

Go to the documentation of this file.
00001 /*========================================================================= 00002 00003 Program: Insight Segmentation & Registration Toolkit 00004 Module: $RCSfile: itkFEMElementBase.h,v $ 00005 Language: C++ 00006 Date: $Date: 2003/09/10 14:29:41 $ 00007 Version: $Revision: 1.42 $ 00008 00009 Copyright (c) Insight Software Consortium. All rights reserved. 00010 See ITKCopyright.txt or http://www.itk.org/HTML/Copyright.htm for details. 00011 00012 This software is distributed WITHOUT ANY WARRANTY; without even 00013 the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR 00014 PURPOSE. See the above copyright notices for more information. 00015 00016 =========================================================================*/ 00017 00018 #ifndef __itkFEMElementBase_h 00019 #define __itkFEMElementBase_h 00020 00021 #include "itkFEMLightObject.h" 00022 #include "itkFEMPArray.h" 00023 #include "itkFEMMaterialBase.h" 00024 #include "itkFEMSolution.h" 00025 #include "itkVisitorDispatcher.h" 00026 #include "vnl/vnl_matrix.h" 00027 #include "vnl/vnl_vector.h" 00028 #include <set> 00029 #include <vector> 00030 00031 namespace itk { 00032 namespace fem { 00033 00034 00035 00036 // FIXME: Write better documentation 00069 #define HANDLE_ELEMENT_LOADS() \ 00070 \ 00071 typedef void (*LoadImplementationFunctionPointer)(ConstPointer,Element::LoadPointer, Element::VectorType& ); \ 00072 virtual void GetLoadVector( Element::LoadPointer l, Element::VectorType& Fe ) const \ 00073 { VisitorDispatcher<Self,Element::LoadType, LoadImplementationFunctionPointer>::Visit(l)(this,l,Fe); } 00074 00075 class Element : public FEMLightObject 00076 { 00077 FEM_ABSTRACT_CLASS(Element,FEMLightObject) 00078 public: 00079 00083 typedef double Float; 00084 00088 typedef FEMPArray<Element> ArrayType; 00089 00093 typedef vnl_matrix<Float> MatrixType; 00094 00098 typedef vnl_vector<Float> VectorType; 00099 00111 typedef FEMLightObject LoadType; 00112 typedef LoadType::Pointer LoadPointer; 00113 00117 typedef unsigned int DegreeOfFreedomIDType; 00118 00124 enum{ InvalidDegreeOfFreedomID = 0xffffffff }; 00125 00134 class Node : public FEMLightObject 00135 { 00136 FEM_CLASS(Node,FEMLightObject) 00137 public: 00138 00142 typedef double Float; 00143 00147 typedef FEMPArray<Self> ArrayType; 00148 00149 00150 /* Windows visualization */ 00151 #ifdef FEM_BUILD_VISUALIZATION 00153 void Draw(CDC* pDC, Solution::ConstPointer sol) const; 00155 static double& DC_Scale; 00156 #endif 00157 00161 Node() {} 00162 00166 Node(Float x, Float y) : m_coordinates(VectorType(2)) 00167 { m_coordinates[0]=x; m_coordinates[1]=y; } 00168 00172 Node(Float x, Float y, Float z) : m_coordinates(VectorType(3)) 00173 { m_coordinates[0]=x; m_coordinates[1]=y; m_coordinates[2]=z;} 00178 const VectorType& GetCoordinates( void ) const 00179 { return m_coordinates; } 00180 00184 void SetCoordinates( const VectorType& coords ) 00185 { m_coordinates=coords; } 00186 00190 DegreeOfFreedomIDType GetDegreeOfFreedom(unsigned int i) const 00191 { 00192 if( i>=m_dof.size() ) { return InvalidDegreeOfFreedomID; } 00193 return m_dof[i]; 00194 } 00195 00199 void SetDegreeOfFreedom(unsigned int i, DegreeOfFreedomIDType dof) const 00200 { 00201 if( i>=m_dof.size() ) { m_dof.resize(i+1, InvalidDegreeOfFreedomID); } 00202 m_dof[i]=dof; 00203 } 00204 00205 virtual void ClearDegreesOfFreedom( void ) const 00206 { 00207 m_dof.clear(); 00208 } 00209 00210 virtual void Read( std::istream& f, void* info ); 00211 virtual void Write( std::ostream& f ) const; 00212 00213 public: 00218 typedef std::set<Element*> SetOfElements; 00219 mutable SetOfElements m_elements; 00220 00221 private: 00225 VectorType m_coordinates; 00226 00231 mutable std::vector<DegreeOfFreedomIDType> m_dof; 00232 00233 }; // end class Node 00234 00235 00236 00237 00239 /* 00240 * Methods related to the physics of the problem. 00241 */ 00242 00243 virtual VectorType GetStrainsAtPoint(const VectorType& pt, const Solution& sol, unsigned int index) const; 00244 00245 virtual VectorType GetStressesAtPoint(const VectorType& pt, const VectorType& e, const Solution& sol, unsigned int index) const; 00246 00267 virtual void GetStiffnessMatrix( MatrixType& Ke ) const; 00268 00278 virtual Float GetElementDeformationEnergy( MatrixType& LocalSolution ) const; 00279 00291 virtual void GetMassMatrix( MatrixType& Me ) const; 00292 00304 virtual void GetLandmarkContributionMatrix(float eta, MatrixType& Le) const; 00305 00335 virtual void GetLoadVector( LoadPointer l, VectorType& Fe ) const = 0; 00336 00344 virtual void GetStrainDisplacementMatrix( MatrixType& B, const MatrixType& shapeDgl ) const = 0; 00345 00351 virtual void GetMaterialMatrix( MatrixType& D ) const = 0; 00352 00364 virtual VectorType InterpolateSolution( const VectorType& pt, const Solution& sol , unsigned int solutionIndex=0 ) const; 00365 00379 virtual Float InterpolateSolutionN( const VectorType& pt, const Solution& sol, unsigned int f , unsigned int solutionIndex=0 ) const; 00380 00387 DegreeOfFreedomIDType GetDegreeOfFreedom( unsigned int local_dof ) const 00388 { 00389 if(local_dof>this->GetNumberOfDegreesOfFreedom()) { return InvalidDegreeOfFreedomID; } 00390 return this->GetNode(local_dof/this->GetNumberOfDegreesOfFreedomPerNode())->GetDegreeOfFreedom(local_dof%this->GetNumberOfDegreesOfFreedomPerNode()); 00391 } 00392 00409 virtual Material::ConstPointer GetMaterial(void) const { return 0; } 00410 00419 virtual void SetMaterial(Material::ConstPointer) {} // FIXME: maybe we should throw an exception instead 00420 00421 00422 00423 00425 /* 00426 * Methods related to numeric integration 00427 */ 00428 00451 virtual void GetIntegrationPointAndWeight( unsigned int i, VectorType& pt, Float& w, unsigned int order=0 ) const = 0; 00452 00463 virtual unsigned int GetNumberOfIntegrationPoints( unsigned int order=0 ) const = 0; 00464 00473 enum { gaussMaxOrder=10 }; 00474 00486 static const Float gaussPoint[gaussMaxOrder+1][gaussMaxOrder]; 00487 00493 static const Float gaussWeight[gaussMaxOrder+1][gaussMaxOrder]; 00494 00495 00497 /* 00498 * Methods related to the geometry of an element 00499 */ 00500 00505 typedef Node::ConstPointer NodeIDType; 00506 00510 virtual unsigned int GetNumberOfNodes( void ) const = 0; 00511 00515 virtual NodeIDType GetNode(unsigned int n) const = 0; 00516 00520 virtual void SetNode(unsigned int n, NodeIDType node) = 0; 00521 00527 virtual const VectorType& GetNodeCoordinates( unsigned int n ) const = 0; 00528 00534 virtual VectorType GetGlobalFromLocalCoordinates( const VectorType& pt ) const; 00535 00542 virtual bool GetLocalFromGlobalCoordinates( const VectorType& globalPt , VectorType& localPt ) const = 0; 00543 00549 virtual unsigned int GetNumberOfSpatialDimensions() const = 0; 00550 00558 virtual VectorType ShapeFunctions( const VectorType& pt ) const = 0; 00559 00575 virtual void ShapeFunctionDerivatives( const VectorType& pt, MatrixType& shapeD ) const = 0; 00576 00596 virtual void ShapeFunctionGlobalDerivatives( const VectorType& pt, MatrixType& shapeDgl, const MatrixType* pJ=0, const MatrixType* pshapeD=0 ) const; 00597 00619 virtual void Jacobian( const VectorType& pt, MatrixType& J, const MatrixType* pshapeD = 0 ) const; 00620 00630 virtual Float JacobianDeterminant( const VectorType& pt, const MatrixType* pJ = 0 ) const; 00631 00643 virtual void JacobianInverse( const VectorType& pt, MatrixType& invJ, const MatrixType* pJ = 0 ) const; 00644 00650 virtual unsigned int GetNumberOfDegreesOfFreedom( void ) const 00651 { 00652 return this->GetNumberOfNodes() * this->GetNumberOfDegreesOfFreedomPerNode(); 00653 } 00654 00662 virtual unsigned int GetNumberOfDegreesOfFreedomPerNode( void ) const = 0; 00663 00664 00665 00666 00668 /* 00669 * Methods and classes related to IO and drawing 00670 */ 00671 00672 #ifdef FEM_BUILD_VISUALIZATION 00676 virtual void Draw(CDC* pDC, Solution::ConstPointer sol) const {} 00678 static double DC_Scale; 00679 #endif 00680 00681 }; 00682 00683 // Make sure that Element::Node class is registered with the object factory. 00684 static INITClass Initializer_ElementNode(Element::Node::CLID()); 00685 00686 // Alias for Element::Node class 00687 typedef Element::Node Node; 00688 00689 00690 00691 00703 class ReadInfoType 00704 { 00705 public: 00706 00707 typedef Node::ArrayType::ConstPointer NodeArrayPointer; 00708 typedef Element::ArrayType::ConstPointer ElementArrayPointer; 00709 typedef Material::ArrayType::ConstPointer MaterialArrayPointer; 00710 00712 NodeArrayPointer m_node; 00713 00715 ElementArrayPointer m_el; 00716 00718 MaterialArrayPointer m_mat; 00719 00721 ReadInfoType( NodeArrayPointer node_, ElementArrayPointer el_, MaterialArrayPointer mat_) : 00722 m_node(node_), m_el(el_), m_mat(mat_) {} 00723 }; 00724 00725 00726 00727 00728 }} // end namespace itk::fem 00729 00730 #endif // #ifndef __itkFEMElementBase_h

Generated at Sat Mar 31 02:18:24 2007 for ITK by doxygen 1.3.8 written by Dimitri van Heesch, © 1997-2000