pk2dlocalcoefficients.hh

Go to the documentation of this file.
00001 #ifndef DUNE_PK2DLOCALCOEFFICIENTS_HH
00002 #define DUNE_PK2DLOCALCOEFFICIENTS_HH
00003 
00004 #include <cstddef>
00005 #include <iostream>
00006 #include <vector>
00007 
00008 #include <dune/localfunctions/common/localkey.hh>
00009 
00010 namespace Dune 
00011 {
00012 
00019   template<unsigned int k>
00020   class Pk2DLocalCoefficients 
00021   {
00022         enum {N = (k+1)*(k+2)/2};
00023 
00024   public:
00026         Pk2DLocalCoefficients () : li(N)
00027         {
00028           fill_default();
00029         }
00030 
00032         Pk2DLocalCoefficients (int variant) : li(N)
00033         {
00034           fill_default();
00035           bool flip[3];
00036           for (int i = 0; i < 3; ++i)
00037               flip[i] = variant & (1<<i);
00038           for (int i=0; i<N; i++)
00039                 if (li[i].codim()==1 && flip[li[i].subEntity()])
00040                   li[i].index(k-2-li[i].index());
00041         }
00042 
00049         Pk2DLocalCoefficients (const unsigned int vertexmap[3]) : li(N)
00050         {
00051           fill_default();
00052           bool flip[3];
00053           flip[0] = vertexmap[0] > vertexmap[1];
00054           flip[1] = vertexmap[0] > vertexmap[2];
00055           flip[2] = vertexmap[1] > vertexmap[2];
00056           for (std::size_t i=0; i<N; i++)
00057                 if (li[i].codim()==1 && flip[li[i].subEntity()])
00058                   li[i].index(k-2-li[i].index());
00059         }
00060 
00062         std::size_t size () const
00063         {
00064           return N;
00065         }
00066 
00068         const LocalKey& localKey (std::size_t i) const
00069         {
00070           return li[i];
00071         } 
00072 
00073   private:
00074         std::vector<LocalKey> li;
00075 
00076         void fill_default ()
00077         {
00078           if (k==0)
00079                 {
00080                   li[0] = LocalKey(0,0,0);
00081                   return;
00082                 }
00083           int n=0;
00084           int c=0;
00085           for (unsigned int j=0; j<=k; j++)
00086                 for (unsigned int i=0; i<=k-j; i++)
00087                   {
00088                         if (i==0 && j==0)
00089                           {
00090                                 li[n++] = LocalKey(0,2,0);
00091                                 continue;
00092                           }
00093                         if (i==k && j==0)
00094                           {
00095                                 li[n++] = LocalKey(1,2,0);
00096                                 continue;
00097                           }
00098                         if (i==0 && j==k)
00099                           {
00100                                 li[n++] = LocalKey(2,2,0);
00101                                 continue;
00102                           }
00103                         if (j==0)
00104                           {
00105                                 li[n++] = LocalKey(0,1,i-1);
00106                                 continue;
00107                           }
00108                         if (i==0)
00109                           {
00110                                 li[n++] = LocalKey(1,1,j-1);
00111                                 continue;
00112                           }
00113                         if (i+j==k)
00114                           {
00115                                 li[n++] = LocalKey(2,1,j-1);
00116                                 continue;
00117                           }
00118                         li[n++] = LocalKey(0,0,c++);
00119                   }
00120         }
00121   };
00122 
00123 }
00124 
00125 #endif
Generated on Sat Apr 24 11:15:35 2010 for dune-localfunctions by  doxygen 1.6.3