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_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