dune-localfunctions
2.2.0
|
00001 // -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- 00002 // vi: set et ts=4 sw=2 sts=2: 00003 00004 #ifndef DUNE_MONOMLOCALFINITEELEMENT_HH 00005 #define DUNE_MONOMLOCALFINITEELEMENT_HH 00006 00007 #include <cassert> 00008 #include <cstddef> 00009 #include <cstdlib> 00010 #include <vector> 00011 00012 #include <dune/common/deprecated.hh> 00013 #include <dune/common/shared_ptr.hh> 00014 #include <dune/common/static_assert.hh> 00015 00016 #include <dune/geometry/type.hh> 00017 00018 #include "common/localfiniteelementtraits.hh" 00019 #include "common/localtoglobaladaptors.hh" 00020 #include "monom/monomlocalbasis.hh" 00021 #include "monom/monomlocalcoefficients.hh" 00022 #include "monom/monomlocalinterpolation.hh" 00023 00024 namespace Dune 00025 { 00026 00035 template<class D, class R, int d, int p, int diffOrder = p> 00036 class MonomLocalFiniteElement 00037 { 00038 enum { static_size = MonomImp::Size<d,p>::val }; 00039 00040 public: 00043 typedef LocalFiniteElementTraits< 00044 MonomLocalBasis<D,R,d,p, diffOrder>, 00045 MonomLocalCoefficients<static_size>, 00046 MonomLocalInterpolation<MonomLocalBasis<D,R,d,p, diffOrder>,static_size> 00047 > Traits; 00048 00051 MonomLocalFiniteElement (GeometryType::BasicType basicType) DUNE_DEPRECATED 00052 : basis(), interpolation(basicType, basis), gt(basicType,d) 00053 {} 00054 00056 MonomLocalFiniteElement (const GeometryType >_) 00057 : basis(), interpolation(gt_, basis), gt(gt_) 00058 {} 00059 00062 const typename Traits::LocalBasisType& localBasis () const 00063 { 00064 return basis; 00065 } 00066 00069 const typename Traits::LocalCoefficientsType& localCoefficients () const 00070 { 00071 return coefficients; 00072 } 00073 00076 const typename Traits::LocalInterpolationType& localInterpolation () const 00077 { 00078 return interpolation; 00079 } 00080 00083 GeometryType type () const 00084 { 00085 return gt; 00086 } 00087 00088 private: 00089 MonomLocalBasis<D,R,d,p, diffOrder> basis; 00090 MonomLocalCoefficients<static_size> coefficients; 00091 MonomLocalInterpolation<MonomLocalBasis<D,R,d,p, diffOrder>,static_size> interpolation; 00092 GeometryType gt; 00093 }; 00094 00096 00108 template<class Geometry, class RF, std::size_t p> 00109 class MonomFiniteElementFactory { 00110 typedef typename Geometry::ctype DF; 00111 static const std::size_t dim = Geometry::mydimension; 00112 00113 typedef MonomLocalFiniteElement<DF, RF, dim, p> LocalFE; 00114 00115 std::vector<shared_ptr<const LocalFE> > localFEs; 00116 00117 void init(const GeometryType >) { 00118 std::size_t index = gt.id() >> 1; 00119 if(localFEs.size() <= index) 00120 localFEs.resize(index+1); 00121 localFEs[index].reset(new LocalFE(gt)); 00122 } 00123 00124 public: 00125 typedef ScalarLocalToGlobalFiniteElementAdaptor<LocalFE, Geometry> 00126 FiniteElement; 00127 00129 00133 template<class ForwardIterator> 00134 MonomFiniteElementFactory(const ForwardIterator &begin, 00135 const ForwardIterator &end) 00136 { 00137 for(ForwardIterator it = begin; it != end; ++it) 00138 init(*it); 00139 } 00140 00142 00145 MonomFiniteElementFactory(const GeometryType >) 00146 { init(gt); } 00147 00149 00152 MonomFiniteElementFactory() { 00153 dune_static_assert(dim <= 3, "MonomFiniteElementFactory knows the " 00154 "available geometry types only up to dimension 3"); 00155 00156 GeometryType gt; 00157 switch(dim) { 00158 case 0: 00159 gt.makeVertex(); init(gt); 00160 break; 00161 case 1: 00162 gt.makeLine(); init(gt); 00163 break; 00164 case 2: 00165 gt.makeTriangle(); init(gt); 00166 gt.makeQuadrilateral(); init(gt); 00167 break; 00168 case 3: 00169 gt.makeTetrahedron(); init(gt); 00170 gt.makePyramid(); init(gt); 00171 gt.makePrism(); init(gt); 00172 gt.makeHexahedron(); init(gt); 00173 break; 00174 default: 00175 // this should never happen -- it should be caught by the static 00176 // assert above. 00177 std::abort(); 00178 }; 00179 } 00180 00182 00192 const FiniteElement make(const Geometry& geometry) { 00193 std::size_t index = geometry.type().id() >> 1; 00194 assert(localFEs.size() > index && localFEs[index]); 00195 return FiniteElement(*localFEs[index], geometry); 00196 } 00197 }; 00198 } 00199 00200 #endif // DUNE_MONOMLOCALFINITEELEMENT_HH