dune-localfunctions  2.2.0
monom.hh
Go to the documentation of this file.
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 &gt_)
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 &gt) {
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 &gt)
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