dune-localfunctions
2.2.0
|
00001 // -*- tab-width: 4; indent-tabs-mode: nil -*- 00002 #ifndef DUNE_P2_3DLOCALBASIS_HH 00003 #define DUNE_P2_3DLOCALBASIS_HH 00004 00005 #include <dune/common/fmatrix.hh> 00006 00007 #include <dune/localfunctions/common/localbasis.hh> 00008 00009 namespace Dune 00010 { 00021 template<class D, class R> 00022 class P23DLocalBasis 00023 { 00024 public: 00026 typedef LocalBasisTraits<D,3,Dune::FieldVector<D,3>,R,1,Dune::FieldVector<R,1>, 00027 Dune::FieldMatrix<R,1,3> > Traits; 00028 00030 unsigned int size () const 00031 { 00032 return 10; 00033 } 00034 00036 inline void evaluateFunction (const typename Traits::DomainType& in, 00037 std::vector<typename Traits::RangeType>& out) const 00038 { 00039 out.resize(10); 00040 00041 int coeff; 00042 R a[2], b[3], c[3]; 00043 00044 // case 0: 00045 coeff=2; 00046 a[0]=1.0; 00047 a[1]=0.5; 00048 b[0]=-1.0; 00049 b[1]=-1.0; 00050 b[2]=-1.0; 00051 c[0]=-1.0; 00052 c[1]=-1.0; 00053 c[2]=-1.0; 00054 00055 out[0] = coeff * (a[0] + b[0]*in[0] + b[1]*in[1] + b[2]*in[2]) * (a[1] + c[0]*in[0] + c[1]*in[1] + c[2]*in[2]); 00056 00057 // case 1: 00058 coeff=2; 00059 a[0]=0.0; 00060 a[1]=-0.5; 00061 b[0]=1.0; 00062 b[1]=0.0; 00063 b[2]=0.0; 00064 c[0]=1.0; 00065 c[1]=0.0; 00066 c[2]=0.0; 00067 00068 out[1] = coeff * (a[0] + b[0]*in[0] + b[1]*in[1] + b[2]*in[2]) * (a[1] + c[0]*in[0] + c[1]*in[1] + c[2]*in[2]); 00069 00070 // case 2: 00071 coeff=2; 00072 a[0]=0.0; 00073 a[1]=-0.5; 00074 b[0]=0.0; 00075 b[1]=1.0; 00076 b[2]=0.0; 00077 c[0]=0.0; 00078 c[1]=1.0; 00079 c[2]=0.0; 00080 00081 out[2] = coeff * (a[0] + b[0]*in[0] + b[1]*in[1] + b[2]*in[2]) * (a[1] + c[0]*in[0] + c[1]*in[1] + c[2]*in[2]); 00082 00083 // case 3: 00084 coeff=2; 00085 a[0]=0.0; 00086 a[1]=-0.5; 00087 b[0]=0.0; 00088 b[1]=0.0; 00089 b[2]=1.0; 00090 c[0]=0.0; 00091 c[1]=0.0; 00092 c[2]=1.0; 00093 00094 out[3] = coeff * (a[0] + b[0]*in[0] + b[1]*in[1] + b[2]*in[2]) * (a[1] + c[0]*in[0] + c[1]*in[1] + c[2]*in[2]); 00095 00096 // case 4: 00097 coeff=4; 00098 a[0]=0.0; 00099 a[1]=1.0; 00100 b[0]=1.0; 00101 b[1]=0.0; 00102 b[2]=0.0; 00103 c[0]=-1.0; 00104 c[1]=-1.0; 00105 c[2]=-1.0; 00106 00107 out[4] = coeff * (a[0] + b[0]*in[0] + b[1]*in[1] + b[2]*in[2]) * (a[1] + c[0]*in[0] + c[1]*in[1] + c[2]*in[2]); 00108 00109 // case 5: 00110 coeff=4; 00111 a[0]=0.0; 00112 a[1]=0.0; 00113 b[0]=1.0; 00114 b[1]=0.0; 00115 b[2]=0.0; 00116 c[0]=0.0; 00117 c[1]=1.0; 00118 c[2]=0.0; 00119 00120 out[5] = coeff * (a[0] + b[0]*in[0] + b[1]*in[1] + b[2]*in[2]) * (a[1] + c[0]*in[0] + c[1]*in[1] + c[2]*in[2]); 00121 00122 // case 6: 00123 coeff=4; 00124 a[0]=0.0; 00125 a[1]=1.0; 00126 b[0]=0.0; 00127 b[1]=1.0; 00128 b[2]=0.0; 00129 c[0]=-1.0; 00130 c[1]=-1.0; 00131 c[2]=-1.0; 00132 00133 out[6] = coeff * (a[0] + b[0]*in[0] + b[1]*in[1] + b[2]*in[2]) * (a[1] + c[0]*in[0] + c[1]*in[1] + c[2]*in[2]); 00134 00135 // case 7: 00136 coeff=4; 00137 a[0]=0.0; 00138 a[1]=1.0; 00139 b[0]=0.0; 00140 b[1]=0.0; 00141 b[2]=1.0; 00142 c[0]=-1.0; 00143 c[1]=-1.0; 00144 c[2]=-1.0; 00145 00146 out[7] = coeff * (a[0] + b[0]*in[0] + b[1]*in[1] + b[2]*in[2]) * (a[1] + c[0]*in[0] + c[1]*in[1] + c[2]*in[2]); 00147 00148 // case 8: 00149 coeff=4; 00150 a[0]=0.0; 00151 a[1]=0.0; 00152 b[0]=1.0; 00153 b[1]=0.0; 00154 b[2]=0.0; 00155 c[0]=0.0; 00156 c[1]=0.0; 00157 c[2]=1.0; 00158 00159 out[8] = coeff * (a[0] + b[0]*in[0] + b[1]*in[1] + b[2]*in[2]) * (a[1] + c[0]*in[0] + c[1]*in[1] + c[2]*in[2]); 00160 00161 // case 9: 00162 coeff=4; 00163 a[0]=0.0; 00164 a[1]=0.0; 00165 b[0]=0.0; 00166 b[1]=1.0; 00167 b[2]=0.0; 00168 c[0]=0.0; 00169 c[1]=0.0; 00170 c[2]=1.0; 00171 00172 out[9] = coeff * (a[0] + b[0]*in[0] + b[1]*in[1] + b[2]*in[2]) * (a[1] + c[0]*in[0] + c[1]*in[1] + c[2]*in[2]); 00173 00174 } 00175 00177 inline void 00178 evaluateJacobian (const typename Traits::DomainType& in, // position 00179 std::vector<typename Traits::JacobianType>& out) const // return value 00180 { 00181 out.resize(10); 00182 00183 R aa[3][3], bb[3][3]; 00184 // case 0: 00185 //x derivative 00186 aa[0][0]=-3.0; 00187 bb[0][0]=4.0; 00188 bb[1][0]=4.0; 00189 bb[2][0]=4.0; 00190 //y derivative 00191 aa[0][1]=-3.0; 00192 bb[0][1]=4.0; 00193 bb[1][1]=4.0; 00194 bb[2][1]=4.0; 00195 // z derivative 00196 aa[0][2]=-3.0; 00197 bb[0][2]=4.0; 00198 bb[1][2]=4.0; 00199 bb[2][2]=4.0; 00200 00201 out[0][0][0] = aa[0][0] + bb[0][0]*in[0] + bb[1][0]*in[1] + bb[2][0]*in[2]; 00202 out[0][0][1] = aa[0][1] + bb[0][1]*in[0] + bb[1][1]*in[1] + bb[2][1]*in[2]; 00203 out[0][0][2] = aa[0][2] + bb[0][2]*in[0] + bb[1][2]*in[1] + bb[2][2]*in[2]; 00204 00205 //case 1: 00206 //x derivative 00207 aa[0][0]=-1.0; 00208 bb[0][0]=4.0; 00209 bb[1][0]=0.0; 00210 bb[2][0]=0.0; 00211 //y derivative 00212 aa[0][1]=0.0; 00213 bb[0][1]=0.0; 00214 bb[1][1]=0.0; 00215 bb[2][1]=0.0; 00216 // z derivative 00217 aa[0][2]=0.0; 00218 bb[0][2]=0.0; 00219 bb[1][2]=0.0; 00220 bb[2][2]=0.0; 00221 00222 out[1][0][0] = aa[0][0] + bb[0][0]*in[0] + bb[1][0]*in[1] + bb[2][0]*in[2]; 00223 out[1][0][1] = aa[0][1] + bb[0][1]*in[0] + bb[1][1]*in[1] + bb[2][1]*in[2]; 00224 out[1][0][2] = aa[0][2] + bb[0][2]*in[0] + bb[1][2]*in[1] + bb[2][2]*in[2]; 00225 00226 // case 2: 00227 //x derivative 00228 aa[0][0]=0.0; 00229 bb[0][0]=0.0; 00230 bb[1][0]=0.0; 00231 bb[2][0]=0.0; 00232 //y derivative 00233 aa[0][1]=-1.0; 00234 bb[0][1]=0.0; 00235 bb[1][1]=4.0; 00236 bb[2][1]=0.0; 00237 // z derivative 00238 aa[0][2]=0.0; 00239 bb[0][2]=0.0; 00240 bb[1][2]=0.0; 00241 bb[2][2]=0.0; 00242 00243 out[2][0][0] = aa[0][0] + bb[0][0]*in[0] + bb[1][0]*in[1] + bb[2][0]*in[2]; 00244 out[2][0][1] = aa[0][1] + bb[0][1]*in[0] + bb[1][1]*in[1] + bb[2][1]*in[2]; 00245 out[2][0][2] = aa[0][2] + bb[0][2]*in[0] + bb[1][2]*in[1] + bb[2][2]*in[2]; 00246 00247 // case 3: 00248 //x derivative 00249 aa[0][0]=0.0; 00250 bb[0][0]=0.0; 00251 bb[1][0]=0.0; 00252 bb[2][0]=0.0; 00253 //y derivative 00254 aa[0][1]=0.0; 00255 bb[0][1]=0.0; 00256 bb[1][1]=0.0; 00257 bb[2][1]=0.0; 00258 // z derivative 00259 aa[0][2]=-1.0; 00260 bb[0][2]=0.0; 00261 bb[1][2]=0.0; 00262 bb[2][2]=4.0; 00263 00264 out[3][0][0] = aa[0][0] + bb[0][0]*in[0] + bb[1][0]*in[1] + bb[2][0]*in[2]; 00265 out[3][0][1] = aa[0][1] + bb[0][1]*in[0] + bb[1][1]*in[1] + bb[2][1]*in[2]; 00266 out[3][0][2] = aa[0][2] + bb[0][2]*in[0] + bb[1][2]*in[1] + bb[2][2]*in[2]; 00267 00268 // case 4: 00269 //x derivative 00270 aa[0][0]=4.0; 00271 bb[0][0]=-8.0; 00272 bb[1][0]=-4.0; 00273 bb[2][0]=-4.0; 00274 //y derivative 00275 aa[0][1]=0.0; 00276 bb[0][1]=-4.0; 00277 bb[1][1]=0.0; 00278 bb[2][1]=0.0; 00279 // z derivative 00280 aa[0][2]=0.0; 00281 bb[0][2]=-4.0; 00282 bb[1][2]=0.0; 00283 bb[2][2]=0.0; 00284 00285 out[4][0][0] = aa[0][0] + bb[0][0]*in[0] + bb[1][0]*in[1] + bb[2][0]*in[2]; 00286 out[4][0][1] = aa[0][1] + bb[0][1]*in[0] + bb[1][1]*in[1] + bb[2][1]*in[2]; 00287 out[4][0][2] = aa[0][2] + bb[0][2]*in[0] + bb[1][2]*in[1] + bb[2][2]*in[2]; 00288 00289 // case 5: 00290 //x derivative 00291 aa[0][0]=0.0; 00292 bb[0][0]=0.0; 00293 bb[1][0]=4.0; 00294 bb[2][0]=0.0; 00295 //y derivative 00296 aa[0][1]=0.0; 00297 bb[0][1]=4.0; 00298 bb[1][1]=0.0; 00299 bb[2][1]=0.0; 00300 // z derivative 00301 aa[0][2]=0.0; 00302 bb[0][2]=0.0; 00303 bb[1][2]=0.0; 00304 bb[2][2]=0.0; 00305 00306 out[5][0][0] = aa[0][0] + bb[0][0]*in[0] + bb[1][0]*in[1] + bb[2][0]*in[2]; 00307 out[5][0][1] = aa[0][1] + bb[0][1]*in[0] + bb[1][1]*in[1] + bb[2][1]*in[2]; 00308 out[5][0][2] = aa[0][2] + bb[0][2]*in[0] + bb[1][2]*in[1] + bb[2][2]*in[2]; 00309 00310 // case 6: 00311 //x derivative 00312 aa[0][0]=0.0; 00313 bb[0][0]=0.0; 00314 bb[1][0]=-4.0; 00315 bb[2][0]=0.0; 00316 //y derivative 00317 aa[0][1]=4.0; 00318 bb[0][1]=-4.0; 00319 bb[1][1]=-8.0; 00320 bb[2][1]=-4.0; 00321 // z derivative 00322 aa[0][2]=0.0; 00323 bb[0][2]=0.0; 00324 bb[1][2]=-4.0; 00325 bb[2][2]=0.0; 00326 00327 out[6][0][0] = aa[0][0] + bb[0][0]*in[0] + bb[1][0]*in[1] + bb[2][0]*in[2]; 00328 out[6][0][1] = aa[0][1] + bb[0][1]*in[0] + bb[1][1]*in[1] + bb[2][1]*in[2]; 00329 out[6][0][2] = aa[0][2] + bb[0][2]*in[0] + bb[1][2]*in[1] + bb[2][2]*in[2]; 00330 00331 // case 7: 00332 //x derivative 00333 aa[0][0]=0.0; 00334 bb[0][0]=0.0; 00335 bb[1][0]=0.0; 00336 bb[2][0]=-4.0; 00337 //y derivative 00338 aa[0][1]=0.0; 00339 bb[0][1]=0.0; 00340 bb[1][1]=0.0; 00341 bb[2][1]=-4.0; 00342 // z derivative 00343 aa[0][2]=4.0; 00344 bb[0][2]=-4.0; 00345 bb[1][2]=-4.0; 00346 bb[2][2]=-8.0; 00347 00348 out[7][0][0] = aa[0][0] + bb[0][0]*in[0] + bb[1][0]*in[1] + bb[2][0]*in[2]; 00349 out[7][0][1] = aa[0][1] + bb[0][1]*in[0] + bb[1][1]*in[1] + bb[2][1]*in[2]; 00350 out[7][0][2] = aa[0][2] + bb[0][2]*in[0] + bb[1][2]*in[1] + bb[2][2]*in[2]; 00351 00352 //case 8: 00353 //x derivative 00354 aa[0][0]=0.0; 00355 bb[0][0]=0.0; 00356 bb[1][0]=0.0; 00357 bb[2][0]=4.0; 00358 //y derivative 00359 aa[0][1]=0.0; 00360 bb[0][1]=0.0; 00361 bb[1][1]=0.0; 00362 bb[2][1]=0.0; 00363 // z derivative 00364 aa[0][2]=0.0; 00365 bb[0][2]=4.0; 00366 bb[1][2]=0.0; 00367 bb[2][2]=0.0; 00368 00369 out[8][0][0] = aa[0][0] + bb[0][0]*in[0] + bb[1][0]*in[1] + bb[2][0]*in[2]; 00370 out[8][0][1] = aa[0][1] + bb[0][1]*in[0] + bb[1][1]*in[1] + bb[2][1]*in[2]; 00371 out[8][0][2] = aa[0][2] + bb[0][2]*in[0] + bb[1][2]*in[1] + bb[2][2]*in[2]; 00372 00373 // case 9: 00374 //x derivative 00375 aa[0][0]=0.0; 00376 bb[0][0]=0.0; 00377 bb[1][0]=0.0; 00378 bb[2][0]=0.0; 00379 //y derivative 00380 aa[0][1]=0.0; 00381 bb[0][1]=0.0; 00382 bb[1][1]=0.0; 00383 bb[2][1]=4.0; 00384 // z derivative 00385 aa[0][2]=0.0; 00386 bb[0][2]=0.0; 00387 bb[1][2]=4.0; 00388 bb[2][2]=0.0; 00389 00390 out[9][0][0] = aa[0][0] + bb[0][0]*in[0] + bb[1][0]*in[1] + bb[2][0]*in[2]; 00391 out[9][0][1] = aa[0][1] + bb[0][1]*in[0] + bb[1][1]*in[1] + bb[2][1]*in[2]; 00392 out[9][0][2] = aa[0][2] + bb[0][2]*in[0] + bb[1][2]*in[1] + bb[2][2]*in[2]; 00393 00394 } 00395 00397 unsigned int order () const 00398 { 00399 return 2; 00400 } 00401 }; 00402 } 00403 #endif