dune-localfunctions
2.2.0
|
00001 #ifndef DUNE_LOCALFUNCTIONS_RAVIARTTHOMAS1Q2DLOCALBASIS_HH 00002 #define DUNE_LOCALFUNCTIONS_RAVIARTTHOMAS1Q2DLOCALBASIS_HH 00003 00004 #include <vector> 00005 00006 #include <dune/common/fmatrix.hh> 00007 00008 #include "../../common/localbasis.hh" 00009 00010 namespace Dune 00011 { 00021 template<class D, class R> 00022 class RT1Q2DLocalBasis 00023 { 00024 00025 public: 00026 typedef LocalBasisTraits<D,2,Dune::FieldVector<D,2>,R,2,Dune::FieldVector<R,2>, 00027 Dune::FieldMatrix<R,2,2> > Traits; 00028 00030 RT1Q2DLocalBasis () 00031 { 00032 sign0 = sign1 = sign2 = sign3 = 1.0; 00033 } 00034 00040 RT1Q2DLocalBasis (unsigned int s) 00041 { 00042 sign0 = sign1 = sign2 = sign3 = 1.0; 00043 if (s & 1) 00044 { 00045 sign0 = -1.0; 00046 } 00047 if (s & 2) 00048 { 00049 sign1 = -1.0; 00050 } 00051 if (s & 4) 00052 { 00053 sign2 = -1.0; 00054 } 00055 if (s & 8) 00056 { 00057 sign3 = -1.0; 00058 } 00059 } 00060 00062 unsigned int size () const 00063 { 00064 return 12; 00065 } 00066 00073 inline void evaluateFunction (const typename Traits::DomainType& in, 00074 std::vector<typename Traits::RangeType>& out) const 00075 { 00076 out.resize(12); 00077 00078 out[0][0] = sign0*(-1.0 + 4.0*in[0]-3*in[0]*in[0]); 00079 out[0][1] = 0.0; 00080 out[1][0] = 3.0 - 12.0*in[0] - 6.0*in[1] + 24.0*in[0]*in[1]+9*in[0]*in[0] - 18.0*in[0]*in[0]*in[1]; 00081 out[1][1] = 0.0; 00082 out[2][0] = sign1*(-2.0*in[0] + 3.0*in[0]*in[0]); 00083 out[2][1] = 0.0; 00084 out[3][0] = -6.0*in[0] + 12.0*in[0]*in[1] + 9.0*in[0]*in[0] - 18.0*in[0]*in[0]*in[1]; 00085 out[3][1] = 0.0; 00086 out[4][0] = 0.0; 00087 out[4][1] = sign2*(-1.0 + 4.0*in[1] - 3.0*in[1]*in[1]); 00088 out[5][0] = 0.0; 00089 out[5][1] = -3.0 + 6.0*in[0] + 12.0*in[1] - 24.0*in[0]*in[1] - 9.0*in[1]*in[1] + 18.0*in[0]*in[1]*in[1]; 00090 out[6][0] = 0.0; 00091 out[6][1] = sign3*(-2.0*in[1] + 3.0*in[1]*in[1]); 00092 out[7][0] = 0.0; 00093 out[7][1] = 6.0*in[1] - 12.0*in[0]*in[1] - 9.0*in[1]*in[1] + 18.0*in[0]*in[1]*in[1]; 00094 out[8][0] = 24.0*in[0] - 36.0*in[0]*in[1] - 24.0*in[0]*in[0] + 36.0*in[0]*in[0]*in[1]; 00095 out[8][1] = 0.0; 00096 out[9][0] = 0.0; 00097 out[9][1] = 24.0*in[1] - 36.0*in[0]*in[1] - 24.0*in[1]*in[1] + 36.0*in[0]*in[1]*in[1]; 00098 out[10][0] = -36.0*in[0] + 72.0*in[0]*in[1] + 36.0*in[0]*in[0] - 72.0*in[0]*in[0]*in[1]; 00099 out[10][1] = 0.0; 00100 out[11][0] = 0.0; 00101 out[11][1] = -36.0*in[1] + 72.0*in[0]*in[1] + 36*in[1]*in[1] - 72.0*in[0]*in[1]*in[1]; 00102 } 00103 00110 inline void evaluateJacobian (const typename Traits::DomainType& in, 00111 std::vector<typename Traits::JacobianType>& out) const 00112 { 00113 out.resize(12); 00114 00115 out[0][0][0] = sign0*(4.0 - 6.0*in[0]); 00116 out[0][0][1] = 0.0; 00117 out[0][1][0] = 0.0; 00118 out[0][1][1] = 0.0; 00119 00120 out[1][0][0] = -12.0 + 24.0*in[1] + 18.0*in[0] - 36.0*in[0]*in[1]; 00121 out[1][0][1] = -6 + 24.0*in[0] - 18.0*in[0]*in[0]; 00122 out[1][1][0] = 0.0; 00123 out[1][1][1] = 0.0; 00124 00125 out[2][0][0] = sign1*(-2.0 + 6.0*in[0]); 00126 out[2][0][1] = 0.0; 00127 out[2][1][0] = 0.0; 00128 out[2][1][1] = 0.0; 00129 00130 out[3][0][0] = -6.0 + 12.0*in[1] + 18.0*in[0] - 36.0*in[0]*in[1]; 00131 out[3][0][1] = 12.0*in[0] - 18.0*in[0]*in[0]; 00132 out[3][1][0] = 0.0; 00133 out[3][1][1] = 0.0; 00134 00135 out[4][0][0] = 0.0; 00136 out[4][0][1] = 0.0; 00137 out[4][1][0] = 0.0; 00138 out[4][1][1] = sign2*(4.0 - 6.0*in[1]); 00139 00140 out[5][0][0] = 0.0; 00141 out[5][0][1] = 0.0; 00142 out[5][1][0] = 6.0 - 24.0*in[1] + 18.0*in[1]*in[1]; 00143 out[5][1][1] = 12.0 - 24.0*in[0] - 18.0*in[1] + 36.0*in[0]*in[1]; 00144 00145 out[6][0][0] = 0.0; 00146 out[6][0][1] = 0.0; 00147 out[6][1][0] = 0.0; 00148 out[6][1][1] = sign3*(-2.0 + 6.0*in[1]); 00149 00150 out[7][0][0] = 0.0; 00151 out[7][0][1] = 0.0; 00152 out[7][1][0] = -12.0*in[1] + 18.0*in[1]*in[1]; 00153 out[7][1][1] = 6.0 - 12.0*in[0] - 18.0*in[1] + 36.0*in[1]*in[0]; 00154 00155 out[8][0][0] = 24.0 - 36.0*in[1] - 48.0*in[0] + 72.0*in[0]*in[1]; 00156 out[8][0][1] = -36.0*in[0] + 36.0*in[0]*in[0]; 00157 out[8][1][0] = 0.0; 00158 out[8][1][1] = 0.0; 00159 00160 out[9][0][0] = 0.0; 00161 out[9][0][1] = 0.0; 00162 out[9][1][0] = -36.0*in[1] + 36.0*in[1]*in[1]; 00163 out[9][1][1] = 24.0 - 36.0*in[0] - 48.0*in[1] + 72.0*in[0]*in[1]; 00164 00165 out[10][0][0] = -36.0 + 72.0*in[1] + 72.0*in[0] - 144.0*in[0]*in[1]; 00166 out[10][0][1] = 72.0*in[0] - 72.0*in[0]*in[0]; 00167 out[10][1][0] = 0.0; 00168 out[10][1][1] = 0.0; 00169 00170 out[11][0][0] = 0.0; 00171 out[11][0][1] = 0.0; 00172 out[11][1][0] = 72.0*in[1] - 72.0*in[1]*in[1]; 00173 out[11][1][1] = -36.0 + 72.0*in[0] + 72.0*in[1] - 144.0*in[0]*in[1]; 00174 } 00175 00177 unsigned int order () const 00178 { 00179 return 3; 00180 } 00181 00182 private: 00183 R sign0, sign1, sign2, sign3; 00184 }; 00185 } 00186 #endif // DUNE_LOCALFUNCTIONS_RAVIARTTHOMAS1Q2DLOCALBASIS_HH