dune-localfunctions  2.2.0
pk2dlocalcoefficients.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_PK2DLOCALCOEFFICIENTS_HH
00005 #define DUNE_PK2DLOCALCOEFFICIENTS_HH
00006 
00007 #include <cstddef>
00008 #include <vector>
00009 
00010 #include <dune/localfunctions/common/localkey.hh>
00011 
00012 namespace Dune 
00013 {
00014 
00021   template<unsigned int k>
00022   class Pk2DLocalCoefficients 
00023   {
00024         enum {N = (k+1)*(k+2)/2};
00025 
00026   public:
00028         Pk2DLocalCoefficients () : li(N)
00029         {
00030           fill_default();
00031         }
00032 
00034         Pk2DLocalCoefficients (int variant) : li(N)
00035         {
00036           fill_default();
00037           bool flip[3];
00038           for (int i = 0; i < 3; ++i)
00039               flip[i] = variant & (1<<i);
00040           for (int i=0; i<N; i++)
00041                 if (li[i].codim()==1 && flip[li[i].subEntity()])
00042                   li[i].index(k-2-li[i].index());
00043         }
00044 
00054     template<class VertexMap>
00055     explicit Pk2DLocalCoefficients(const VertexMap &vertexmap) : li(N)
00056         {
00057           fill_default();
00058           bool flip[3];
00059           flip[0] = vertexmap[0] > vertexmap[1];
00060           flip[1] = vertexmap[0] > vertexmap[2];
00061           flip[2] = vertexmap[1] > vertexmap[2];
00062           for (std::size_t i=0; i<N; i++)
00063                 if (li[i].codim()==1 && flip[li[i].subEntity()])
00064                   li[i].index(k-2-li[i].index());
00065         }
00066 
00068         std::size_t size () const
00069         {
00070           return N;
00071         }
00072 
00074         const LocalKey& localKey (std::size_t i) const
00075         {
00076           return li[i];
00077         } 
00078 
00079   private:
00080         std::vector<LocalKey> li;
00081 
00082         void fill_default ()
00083         {
00084           if (k==0)
00085                 {
00086                   li[0] = LocalKey(0,0,0);
00087                   return;
00088                 }
00089           int n=0;
00090           int c=0;
00091           for (unsigned int j=0; j<=k; j++)
00092                 for (unsigned int i=0; i<=k-j; i++)
00093                   {
00094                         if (i==0 && j==0)
00095                           {
00096                                 li[n++] = LocalKey(0,2,0);
00097                                 continue;
00098                           }
00099                         if (i==k && j==0)
00100                           {
00101                                 li[n++] = LocalKey(1,2,0);
00102                                 continue;
00103                           }
00104                         if (i==0 && j==k)
00105                           {
00106                                 li[n++] = LocalKey(2,2,0);
00107                                 continue;
00108                           }
00109                         if (j==0)
00110                           {
00111                                 li[n++] = LocalKey(0,1,i-1);
00112                                 continue;
00113                           }
00114                         if (i==0)
00115                           {
00116                                 li[n++] = LocalKey(1,1,j-1);
00117                                 continue;
00118                           }
00119                         if (i+j==k)
00120                           {
00121                                 li[n++] = LocalKey(2,1,j-1);
00122                                 continue;
00123                           }
00124                         li[n++] = LocalKey(0,0,c++);
00125                   }
00126         }
00127   };
00128 
00129 }
00130 
00131 #endif