00001
00002 #ifndef DUNE_REFINED_P1_LOCALBASIS_HH
00003 #define DUNE_REFINED_P1_LOCALBASIS_HH
00004
00009 #include <dune/common/fmatrix.hh>
00010
00011 #include <dune/localfunctions/refined/common/refinedsimplexlocalbasis.hh>
00012
00013 namespace Dune
00014 {
00015 template<class D, class R, int dim>
00016 class RefinedP1LocalBasis
00017 : public RefinedSimplexLocalBasis<D,dim>
00018 {
00019 public:
00020 RefinedP1LocalBasis()
00021 {
00022 DUNE_THROW(Dune::NotImplemented,"RefinedP1LocalBasis not implemented for dim > 3.");
00023 }
00024 };
00025
00049 template<class D, class R>
00050 class RefinedP1LocalBasis<D,R,1>
00051 : public RefinedSimplexLocalBasis<D,1>
00052 {
00053 public:
00055 typedef LocalBasisTraits<D,1,Dune::FieldVector<D,1>,R,1,Dune::FieldVector<R,1>,
00056 Dune::FieldMatrix<R,1,1> > Traits;
00057
00059 unsigned int size () const
00060 {
00061 return 3;
00062 }
00063
00065 inline void evaluateFunction (const typename Traits::DomainType& in,
00066 std::vector<typename Traits::RangeType>& out) const
00067 {
00068 out.resize(3);
00069
00070 int subElement;
00071 typename Traits::DomainType local;
00072 getSubElement(in, subElement, local);
00073
00074 switch (subElement) {
00075 case 0:
00076
00077 out[0] = 1 - local[0];
00078 out[1] = 0;
00079 out[2] = local[0];
00080 break;
00081
00082 case 1:
00083
00084 out[0] = 0;
00085 out[1] = local[0];
00086 out[2] = 1 - local[0];
00087 break;
00088
00089 }
00090
00091 }
00092
00094 inline void
00095 evaluateJacobian (const typename Traits::DomainType& in,
00096 std::vector<typename Traits::JacobianType>& out) const
00097 {
00098 out.resize(3);
00099
00100 int subElement;
00101 typename Traits::DomainType local;
00102 getSubElement(in, subElement, local);
00103
00104 switch (subElement) {
00105 case 0:
00106
00107 out[0][0][0] = -2;
00108 out[1][0][0] = 0;
00109 out[2][0][0] = 2;
00110 break;
00111
00112 case 1:
00113
00114 out[0][0][0] = 0;
00115 out[1][0][0] = 2;
00116 out[2][0][0] = -2;
00117 break;
00118
00119 }
00120
00121 }
00122
00126 unsigned int order () const
00127 {
00128 return 1;
00129 }
00130
00131 };
00132
00157 template<class D, class R>
00158 class RefinedP1LocalBasis<D,R,2>
00159 : public RefinedSimplexLocalBasis<D,2>
00160 {
00161 public:
00163 typedef LocalBasisTraits<D,2,Dune::FieldVector<D,2>,R,1,Dune::FieldVector<R,1>,
00164 Dune::FieldMatrix<R,1,2> > Traits;
00165
00167 unsigned int size () const
00168 {
00169 return 6;
00170 }
00171
00173 inline void evaluateFunction (const typename Traits::DomainType& in,
00174 std::vector<typename Traits::RangeType>& out) const
00175 {
00176 out.resize(6);
00177
00178 int subElement;
00179 typename Traits::DomainType local;
00180 getSubElement(in, subElement, local);
00181
00182 switch (subElement) {
00183 case 0:
00184
00185 out[0] = 1 - local[0] - local[1];
00186 out[1] = local[0];
00187 out[2] = 0;
00188 out[3] = local[1];
00189 out[4] = 0;
00190 out[5] = 0;
00191 break;
00192
00193 case 1:
00194
00195 out[0] = 0;
00196 out[1] = 1 - local[0] - local[1];
00197 out[2] = local[0];
00198 out[3] = 0;
00199 out[4] = local[1];
00200 out[5] = 0;
00201 break;
00202
00203 case 2:
00204
00205 out[0] = 0;
00206 out[1] = 0;
00207 out[2] = 0;
00208 out[3] = 1 - local[0] - local[1];
00209 out[4] = local[0];
00210 out[5] = local[1];
00211 break;
00212 case 3:
00213
00214 out[0] = 0;
00215 out[1] = local[1];
00216 out[2] = 0;
00217 out[3] = local[0];
00218 out[4] = 1 - local[0] - local[1];
00219 out[5] = 0;
00220 }
00221
00222 }
00223
00225 inline void
00226 evaluateJacobian (const typename Traits::DomainType& in,
00227 std::vector<typename Traits::JacobianType>& out) const
00228 {
00229 out.resize(6);
00230
00231 int subElement;
00232 typename Traits::DomainType local;
00233 getSubElement(in, subElement, local);
00234
00235 switch (subElement) {
00236 case 0:
00237
00238 out[0][0][0] = -2; out[0][0][1] = -2;
00239 out[1][0][0] = 2; out[1][0][1] = 0;
00240 out[2][0][0] = 0; out[2][0][1] = 0;
00241 out[3][0][0] = 0; out[3][0][1] = 2;
00242 out[4][0][0] = 0; out[4][0][1] = 0;
00243 out[5][0][0] = 0; out[5][0][1] = 0;
00244 break;
00245
00246 case 1:
00247
00248 out[0][0][0] = 0; out[0][0][1] = 0;
00249 out[1][0][0] = -2; out[1][0][1] = -2;
00250 out[2][0][0] = 2; out[2][0][1] = 0;
00251 out[3][0][0] = 0; out[3][0][1] = 0;
00252 out[4][0][0] = 0; out[4][0][1] = 2;
00253 out[5][0][0] = 0; out[5][0][1] = 0;
00254 break;
00255
00256 case 2:
00257
00258 out[0][0][0] = 0; out[0][0][1] = 0;
00259 out[1][0][0] = 0; out[1][0][1] = 0;
00260 out[2][0][0] = 0; out[2][0][1] = 0;
00261 out[3][0][0] = -2; out[3][0][1] = -2;
00262 out[4][0][0] = 2; out[4][0][1] = 0;
00263 out[5][0][0] = 0; out[5][0][1] = 2;
00264 break;
00265 case 3:
00266
00267 out[0][0][0] = 0; out[0][0][1] = 0;
00268 out[1][0][0] = 0; out[1][0][1] = -2;
00269 out[2][0][0] = 0; out[2][0][1] = 0;
00270 out[3][0][0] = -2; out[3][0][1] = 0;
00271 out[4][0][0] = 2; out[4][0][1] = 2;
00272 out[5][0][0] = 0; out[5][0][1] = 0;
00273 }
00274
00275 }
00276
00280 unsigned int order () const
00281 {
00282 return 1;
00283 }
00284
00285 };
00286
00315 template<class D, class R>
00316 class RefinedP1LocalBasis<D,R,3>
00317 : public RefinedSimplexLocalBasis<D,3>
00318 {
00319 public:
00321 typedef LocalBasisTraits<D,3,Dune::FieldVector<D,3>,R,1,Dune::FieldVector<R,1>,
00322 Dune::FieldMatrix<R,1,3> > Traits;
00323
00325 unsigned int size () const
00326 {
00327 return 10;
00328 }
00329
00331 inline void evaluateFunction (const typename Traits::DomainType& in,
00332 std::vector<typename Traits::RangeType>& out) const
00333 {
00334 out.resize(10);
00335
00336 int subElement;
00337 typename Traits::DomainType local;
00338 getSubElement(in, subElement, local);
00339
00340 switch (subElement) {
00341 case 0:
00342
00343 out[0] = 1 - local[0] - local[1] - local[2];
00344 out[1] = local[0];
00345 out[2] = 0;
00346 out[3] = local[1];
00347 out[4] = 0;
00348 out[5] = 0;
00349 out[6] = local[2];
00350 out[7] = 0;
00351 out[8] = 0;
00352 out[9] = 0;
00353 break;
00354
00355 case 1:
00356
00357 out[0] = 0;
00358 out[1] = 1 - local[0] - local[1] -local[2];
00359 out[2] = local[0];
00360 out[3] = 0;
00361 out[4] = local[1];
00362 out[5] = 0;
00363 out[6] = 0;
00364 out[7] = local[2];
00365 out[8] = 0;
00366 out[9] = 0;
00367 break;
00368
00369 case 2:
00370
00371 out[0] = 0;
00372 out[1] = 0;
00373 out[2] = 0;
00374 out[3] = 1 - local[0] - local[1] -local[2];
00375 out[4] = local[0];
00376 out[5] = local[1];
00377 out[6] = 0;
00378 out[7] = 0;
00379 out[8] = local[2];
00380 out[9] = 0;
00381 break;
00382
00383 case 3:
00384
00385 out[0] = 0;
00386 out[1] = 0;
00387 out[2] = 0;
00388 out[3] = 0;
00389 out[4] = 0;
00390 out[5] = 0;
00391 out[6] = 1 - local[0] - local[1] -local[2];
00392 out[7] = local[0];
00393 out[8] = local[1];
00394 out[9] = local[2];
00395 break;
00396
00397 case 4:
00398
00399 out[0] = 0;
00400 out[1] = 1 - local[0] - local[1] -local[2];
00401 out[2] = 0;
00402 out[3] = local[0];
00403 out[4] = 0;
00404 out[5] = 0;
00405 out[6] = local[1];
00406 out[7] = local[2];
00407 out[8] = 0;
00408 out[9] = 0;
00409 break;
00410
00411 case 5:
00412
00413 out[0] = 0;
00414 out[1] = local[1];
00415 out[2] = 0;
00416 out[3] = local[0];
00417 out[4] = 1 - local[0] - local[1] -local[2];
00418 out[5] = 0;
00419 out[6] = 0;
00420 out[7] = local[2];
00421 out[8] = 0;
00422 out[9] = 0;
00423 break;
00424
00425 case 6:
00426
00427 out[0] = 0;
00428 out[1] = 0;
00429 out[2] = 0;
00430 out[3] = 1 - local[0] - local[1] -local[2];
00431 out[4] = 0;
00432 out[5] = 0;
00433 out[6] = local[0];
00434 out[7] = local[1];
00435 out[8] = local[2];
00436 out[9] = 0;
00437 break;
00438
00439 case 7:
00440
00441 out[0] = 0;
00442 out[1] = 0;
00443 out[2] = 0;
00444 out[3] = 1 - local[0] - local[1] -local[2];
00445 out[4] = local[2];
00446 out[5] = 0;
00447 out[6] = 0;
00448 out[7] = local[1];
00449 out[8] = local[0];
00450 out[9] = 0;
00451 break;
00452 }
00453
00454 }
00455
00457 inline void
00458 evaluateJacobian (const typename Traits::DomainType& in,
00459 std::vector<typename Traits::JacobianType>& out) const
00460 {
00461 out.resize(10);
00462
00463 int subElement;
00464 typename Traits::DomainType local;
00465 getSubElement(in, subElement, local);
00466
00467 switch (subElement) {
00468 case 0:
00469
00470 out[0][0][0] = -2; out[0][0][1] = -2; out[0][0][2] = -2;
00471 out[1][0][0] = 2; out[1][0][1] = 0; out[1][0][2] = 0;
00472 out[2][0][0] = 0; out[2][0][1] = 0; out[2][0][2] = 0;
00473 out[3][0][0] = 0; out[3][0][1] = 2; out[3][0][2] = 0;
00474 out[4][0][0] = 0; out[4][0][1] = 0; out[4][0][2] = 0;
00475 out[5][0][0] = 0; out[5][0][1] = 0; out[5][0][2] = 0;
00476 out[6][0][0] = 0; out[6][0][1] = 0; out[6][0][2] = 2;
00477 out[7][0][0] = 0; out[7][0][1] = 0; out[7][0][2] = 0;
00478 out[8][0][0] = 0; out[8][0][1] = 0; out[8][0][2] = 0;
00479 out[9][0][0] = 0; out[9][0][1] = 0; out[9][0][2] = 0;
00480 break;
00481
00482 case 1:
00483
00484 out[0][0][0] = 0; out[0][0][1] = 0; out[0][0][2] = 0;
00485 out[1][0][0] = -2; out[1][0][1] = -2; out[1][0][2] = -2;
00486 out[2][0][0] = 2; out[2][0][1] = 0; out[2][0][2] = 0;
00487 out[3][0][0] = 0; out[3][0][1] = 0; out[3][0][2] = 0;
00488 out[4][0][0] = 0; out[4][0][1] = 2; out[4][0][2] = 0;
00489 out[5][0][0] = 0; out[5][0][1] = 0; out[5][0][2] = 0;
00490 out[6][0][0] = 0; out[6][0][1] = 0; out[6][0][2] = 0;
00491 out[7][0][0] = 0; out[7][0][1] = 0; out[7][0][2] = 2;
00492 out[8][0][0] = 0; out[8][0][1] = 0; out[8][0][2] = 0;
00493 out[9][0][0] = 0; out[9][0][1] = 0; out[9][0][2] = 0;
00494 break;
00495
00496 case 2:
00497
00498 out[0][0][0] = 0; out[0][0][1] = 0; out[0][0][2] = 0;
00499 out[1][0][0] = 0; out[1][0][1] = 0; out[1][0][2] = 0;
00500 out[2][0][0] = 0; out[2][0][1] = 0; out[2][0][2] = 0;
00501 out[3][0][0] = -2; out[3][0][1] = -2; out[3][0][2] = -2;
00502 out[4][0][0] = 2; out[4][0][1] = 0; out[4][0][2] = 0;
00503 out[5][0][0] = 0; out[5][0][1] = 2; out[5][0][2] = 0;
00504 out[6][0][0] = 0; out[6][0][1] = 0; out[6][0][2] = 0;
00505 out[7][0][0] = 0; out[7][0][1] = 0; out[7][0][2] = 0;
00506 out[8][0][0] = 0; out[8][0][1] = 0; out[8][0][2] = 2;
00507 out[9][0][0] = 0; out[9][0][1] = 0; out[9][0][2] = 0;
00508 break;
00509
00510 case 3:
00511
00512 out[0][0][0] = 0; out[0][0][1] = 0; out[0][0][2] = 0;
00513 out[1][0][0] = 0; out[1][0][1] = 0; out[1][0][2] = 0;
00514 out[2][0][0] = 0; out[2][0][1] = 0; out[2][0][2] = 0;
00515 out[3][0][0] = 0; out[3][0][1] = 0; out[3][0][2] = 0;
00516 out[4][0][0] = 0; out[4][0][1] = 0; out[4][0][2] = 0;
00517 out[5][0][0] = 0; out[5][0][1] = 0; out[5][0][2] = 0;
00518 out[6][0][0] = -2; out[6][0][1] = -2; out[6][0][2] = -2;
00519 out[7][0][0] = 2; out[7][0][1] = 0; out[7][0][2] = 0;
00520 out[8][0][0] = 0; out[8][0][1] = 2; out[8][0][2] = 0;
00521 out[9][0][0] = 0; out[9][0][1] = 0; out[9][0][2] = 2;
00522 break;
00523
00524 case 4:
00525
00526 out[0][0][0] = 0; out[0][0][1] = 0; out[0][0][2] = 0;
00527 out[1][0][0] = 0; out[1][0][1] = -2; out[1][0][2] = -2;
00528 out[2][0][0] = 0; out[2][0][1] = 0; out[2][0][2] = 0;
00529 out[3][0][0] = 0; out[3][0][1] = 2; out[3][0][2] = 0;
00530 out[4][0][0] = 0; out[4][0][1] = 0; out[4][0][2] = 0;
00531 out[5][0][0] = 0; out[5][0][1] = 0; out[5][0][2] = 0;
00532 out[6][0][0] = -2; out[6][0][1] = -2; out[6][0][2] = 0;
00533 out[7][0][0] = 2; out[7][0][1] = 2; out[7][0][2] = 2;
00534 out[8][0][0] = 0; out[8][0][1] = 0; out[8][0][2] = 0;
00535 out[9][0][0] = 0; out[9][0][1] = 0; out[9][0][2] = 0;
00536 break;
00537
00538 case 5:
00539
00540 out[0][0][0] = 0; out[0][0][1] = 0; out[0][0][2] = 0;
00541 out[1][0][0] = 0; out[1][0][1] = -2; out[1][0][2] = -2;
00542 out[2][0][0] = 0; out[2][0][1] = 0; out[2][0][2] = 0;
00543 out[3][0][0] = -2; out[3][0][1] = 0; out[3][0][2] = 0;
00544 out[4][0][0] = 2; out[4][0][1] = 2; out[4][0][2] = 0;
00545 out[5][0][0] = 0; out[5][0][1] = 0; out[5][0][2] = 0;
00546 out[6][0][0] = 0; out[6][0][1] = 0; out[6][0][2] = 0;
00547 out[7][0][0] = 0; out[7][0][1] = 0; out[7][0][2] = 2;
00548 out[8][0][0] = 0; out[8][0][1] = 0; out[8][0][2] = 0;
00549 out[9][0][0] = 0; out[9][0][1] = 0; out[9][0][2] = 0;
00550 break;
00551
00552 case 6:
00553
00554 out[0][0][0] = 0; out[0][0][1] = 0; out[0][0][2] = 0;
00555 out[1][0][0] = 0; out[1][0][1] = 0; out[1][0][2] = 0;
00556 out[2][0][0] = 0; out[2][0][1] = 0; out[2][0][2] = 0;
00557 out[3][0][0] = 0; out[3][0][1] = 0; out[3][0][2] = -2;
00558 out[4][0][0] = 0; out[4][0][1] = 0; out[4][0][2] = 0;
00559 out[5][0][0] = 0; out[5][0][1] = 0; out[5][0][2] = 0;
00560 out[6][0][0] = -2; out[6][0][1] = -2; out[6][0][2] = 0;
00561 out[7][0][0] = 2; out[7][0][1] = 0; out[7][0][2] = 0;
00562 out[8][0][0] = 0; out[8][0][1] = 2; out[8][0][2] = 2;
00563 out[9][0][0] = 0; out[9][0][1] = 0; out[9][0][2] = 0;
00564 break;
00565
00566 case 7:
00567
00568 out[0][0][0] = 0; out[0][0][1] = 0; out[0][0][2] = 0;
00569 out[1][0][0] = 0; out[1][0][1] = 0; out[1][0][2] = 0;
00570 out[2][0][0] = 0; out[2][0][1] = 0; out[2][0][2] = 0;
00571 out[3][0][0] = -2; out[3][0][1] = -2; out[3][0][2] = -2;
00572 out[4][0][0] = 2; out[4][0][1] = 2; out[4][0][2] = 0;
00573 out[5][0][0] = 0; out[5][0][1] = 0; out[5][0][2] = 0;
00574 out[6][0][0] = 0; out[6][0][1] = 0; out[6][0][2] = 0;
00575 out[7][0][0] = 0; out[7][0][1] = -2; out[7][0][2] = 0;
00576 out[8][0][0] = 0; out[8][0][1] = 2; out[8][0][2] = 2;
00577 out[9][0][0] = 0; out[9][0][1] = 0; out[9][0][2] = 0;
00578 break;
00579 }
00580 }
00581
00582
00586 unsigned int order () const
00587 {
00588 return 1;
00589 }
00590
00591 };
00592 }
00593 #endif