refinedp1localbasis.hh

Go to the documentation of this file.
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

Generated on Fri Apr 29 2011 with Doxygen (ver 1.7.1) [doxygen-log,error-log].