dune-localfunctions
2.1.1
|
00001 // -*- tab-width: 4; indent-tabs-mode: nil -*- 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, // position 00096 std::vector<typename Traits::JacobianType>& out) const // return value 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, // position 00227 std::vector<typename Traits::JacobianType>& out) const // return value 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, // position 00459 std::vector<typename Traits::JacobianType>& out) const // return value 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