ElementIntegrator.hpp

00001 // This file is part of the imaging2 class library.
00002 //
00003 // University of Innsbruck, Infmath Imaging, 2009.
00004 // http://infmath.uibk.ac.at
00005 //
00006 // All rights reserved.
00007 
00008 
00009 #ifndef FEM_ELEMENTINTEGRATOR_H
00010 #define FEM_ELEMENTINTEGRATOR_H
00011 
00012 #include <core/imaging2.hpp>
00013 #include <core/vector_utilities.hpp>
00014 #include <core/matrix_utilities.hpp>
00015 
00016 
00017 namespace imaging
00018 {
00026   template<std::size_t N, std::size_t N_NODES>
00027   class ElementIntegrator
00028   {
00029   protected:
00031     ublas::fixed_vector< ublas::fixed_vector<float_t, N>, N_NODES> _nodes;
00032     
00034     ublas::fixed_vector<float_t, N_NODES> _weights;
00035   public:
00037     static const std::size_t n_nodes = N_NODES;
00038 
00040     const ublas::fixed_vector<float_t, N> & node(std::size_t i) const { return _nodes(i); }
00041     
00043     float_t weight(std::size_t i) const { return _weights(i); }
00044   };
00045   
00046   
00047 
00048 
00054   template<std::size_t N_NODES>
00055   class SquareIntegrator : public ElementIntegrator<2, N_NODES>
00056   {
00057   public:
00058     SquareIntegrator();
00059   };
00060 
00061   template<>
00062   SquareIntegrator<4>::SquareIntegrator();
00063   
00064 
00071   template<std::size_t N_NODES>
00072   class CubeIntegrator : public ElementIntegrator<3, N_NODES>
00073   {
00074   public:
00075     CubeIntegrator();
00076   };
00077 
00078   template<>
00079   CubeIntegrator<8>::CubeIntegrator();
00080   
00086   template<std::size_t N_NODES>
00087   class TriangleIntegrator : public ElementIntegrator<2, N_NODES>
00088   {
00089   public:
00090     TriangleIntegrator();
00091   };
00092 
00093   template<>
00094   TriangleIntegrator<1>::TriangleIntegrator();
00095 
00096   template<>
00097   TriangleIntegrator<4>::TriangleIntegrator();
00098   
00099   template<>
00100   TriangleIntegrator<7>::TriangleIntegrator();
00101 
00102 
00108   template<std::size_t N_NODES>
00109   class TetrahedraIntegrator : public ElementIntegrator<3, N_NODES>
00110   {
00111   public:
00112     TetrahedraIntegrator();
00113   };
00114 
00115   template<>
00116   TetrahedraIntegrator<1>::TetrahedraIntegrator();
00117 
00118   
00124   template<std::size_t N_NODES>
00125   class IntervalIntegrator : public ElementIntegrator<1, N_NODES>
00126   {
00127   public:
00128     IntervalIntegrator();
00129   };
00130 
00131   template<>
00132   IntervalIntegrator<2>::IntervalIntegrator();
00133 
00134   template<>
00135   IntervalIntegrator<1>::IntervalIntegrator();
00136   
00142   class PointIntegrator : public ElementIntegrator<0, 1>
00143   {
00144   public:
00145     PointIntegrator() : ElementIntegrator<0, 1>() { _weights.assign(1.0); }
00146   };
00147 
00148 }
00149 
00150 
00151 #endif

Generated on Tue Feb 10 10:01:30 2009 for imaging2 by  doxygen 1.5.5