00001
00002
00003
00004
00005
00006
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