dune-localfunctions
2.1.1
|
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