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

Generated on Fri Apr 29 2011 with Doxygen (ver 1.7.1) [doxygen-log,error-log].