p23dlocalbasis.hh
Go to the documentation of this file.00001
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
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
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
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
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
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
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
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
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
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
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,
00179 std::vector<typename Traits::JacobianType>& out) const
00180 {
00181 out.resize(10);
00182
00183 R aa[3][3], bb[3][3];
00184
00185
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
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
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
00206
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
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
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
00227
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
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
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
00248
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
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
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
00269
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
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
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
00290
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
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
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
00311
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
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
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
00332
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
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
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
00353
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
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
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
00374
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
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
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