dune-localfunctions  2.2.0
refinedsimplexlocalbasis.hh
Go to the documentation of this file.
00001 // -*- tab-width: 8; indent-tabs-mode: nil -*-
00002 // vi: set ts=8 sw=2 et sts=2:
00003 #ifndef DUNE_REFINED_SIMPLEX_LOCALBASIS_HH
00004 #define DUNE_REFINED_SIMPLEX_LOCALBASIS_HH
00005 
00010 #include <dune/common/fvector.hh>
00011 #include <dune/common/exceptions.hh>
00012 #include <dune/localfunctions/common/localbasis.hh>
00013 
00014 namespace Dune
00015 {
00016   template<class D, int dim>
00017   class RefinedSimplexLocalBasis
00018   {
00019   protected:
00020     RefinedSimplexLocalBasis()
00021     {
00022       DUNE_THROW(Dune::NotImplemented,"RefinedSimplexLocalBasis not implemented for dim > 3.");
00023     }
00024   };
00025 
00033   template<class D>
00034   class RefinedSimplexLocalBasis<D,1>
00035   {
00036   protected:
00037 
00039       RefinedSimplexLocalBasis() {}
00040 
00051       static int getSubElement(const FieldVector<D,2>& global)
00052       {
00053           if (global[0] <= 0.5)
00054               return 0;
00055           else if (global[0] <= 1.0)
00056               return 1;
00057 
00058           DUNE_THROW(InvalidStateException, "no subelement defined");
00059       }
00060 
00067       static void getSubElement(const FieldVector<D,1>& global, 
00068                                 int& subElement,
00069                                 FieldVector<D,1>& local)
00070       {
00071           if (global[0] <= 0.5) {
00072               subElement = 0;
00073               local[0] = 2.0 * global[0];
00074               return;
00075           }
00076 
00077           subElement = 1;
00078           local[0] = 2.0 * global[0] - 1.0;
00079       }
00080 
00081   };
00082 
00083 
00094   template<class D>
00095   class RefinedSimplexLocalBasis<D,2>
00096   {
00097   protected:
00098 
00100       RefinedSimplexLocalBasis() {}
00101 
00116       static int getSubElement(const FieldVector<D,2>& global)
00117       {
00118           if (global[0] + global[1] <= 0.5)
00119               return 0;
00120           else if (global[0] >= 0.5)
00121               return 1;
00122           else if (global[1] >= 0.5)
00123               return 2;
00124 
00125           return 3;
00126       }
00127 
00134       static void getSubElement(const FieldVector<D,2>& global, 
00135                                 int& subElement,
00136                                 FieldVector<D,2>& local)
00137       {
00138           if (global[0] + global[1] <= 0.5) {
00139               subElement = 0;
00140               local[0] = 2*global[0];
00141               local[1] = 2*global[1];
00142               return;
00143           } else if (global[0] >= 0.5) {
00144               subElement = 1;
00145               local[0] = 2*global[0]-1;
00146               local[1] = 2*global[1];
00147               return;
00148           } else if (global[1] >= 0.5) {
00149               subElement = 2;
00150               local[0] = 2*global[0];
00151               local[1] = 2*global[1]-1;
00152               return;
00153           }
00154 
00155           subElement = 3;
00156           local[0] = -2 * global[0] + 1;
00157           local[1] = -2 * global[1] + 1;
00158 
00159       }
00160 
00161 
00162   };
00163 
00174   template<class D>
00175   class RefinedSimplexLocalBasis<D,3>
00176   {
00177   protected:
00178 
00180       RefinedSimplexLocalBasis() {}
00181 
00212       static int getSubElement(const FieldVector<D,3>& global)
00213       {
00214           if (global[0] + global[1] + global[2] <= 0.5)
00215               return 0;
00216           else if (global[0] >= 0.5)
00217               return 1;
00218           else if (global[1] >= 0.5)
00219               return 2;
00220           else if (global[2] >= 0.5)
00221               return 3;
00222           else if ((global[0] + global[1] <= 0.5) and (global[1] + global[2] <= 0.5))
00223               return 4;
00224           else if ((global[0] + global[1] >= 0.5) and (global[1] + global[2] <= 0.5))
00225               return 5;
00226           else if ((global[0] + global[1] <= 0.5) and (global[1] + global[2] >= 0.5))
00227               return 6;
00228           else if ((global[0] + global[1] >= 0.5) and (global[1] + global[2] >= 0.5))
00229               return 7;
00230 
00231           DUNE_THROW(InvalidStateException, "no subelement defined");
00232 
00233       }
00240       static void getSubElement(const FieldVector<D,3>& global,
00241                                 int& subElement,
00242                                 FieldVector<D,3>& local)
00243       {
00244           if (global[0] + global[1] + global[2] <= 0.5) {
00245               subElement = 0;
00246               local = global;
00247               local *= 2.0;
00248               return;
00249           } else if (global[0] >= 0.5) {
00250               subElement = 1;
00251               local = global;
00252               local[0] -= 0.5;
00253               local *= 2.0;
00254               return;
00255           } else if (global[1] >= 0.5) {
00256               subElement = 2;
00257               local = global;
00258               local[1] -= 0.5;
00259               local *= 2.0;
00260               return;
00261           } else if (global[2] >= 0.5) {
00262               subElement = 3;
00263               local = global;
00264               local[2] -= 0.5;
00265               local *= 2.0;
00266               return;
00267           } else if ((global[0] + global[1] <= 0.5) and (global[1] + global[2] <= 0.5)) {
00268               subElement = 4;
00269               local[0] = 2.0 * global[1];
00270               local[1] = 2.0 * (0.5 - global[0] - global[1]);
00271               local[2] = 2.0 * (-0.5 + global[0] + global[1] + global[2]);
00272 //              Dune::FieldMatrix<double,3,3> A(0.0);
00273 //              A[0][1] =  2.0;
00274 //              A[1][0] = -2.0;
00275 //              A[1][1] = -2.0;
00276 //              A[2][0] =  2.0;
00277 //              A[2][1] =  2.0;
00278 //              A[2][2] =  2.0;
00279 //              A.mv(global,local);
00280 //              local[1] += 1.0;
00281 //              local[2] -= 1.0;
00282               return;
00283           } else if ((global[0] + global[1] >= 0.5) and (global[1] + global[2] <= 0.5)) {
00284               subElement = 5;
00285               local[0] = 2.0 * (0.5 - global[0]);
00286               local[1] = 2.0 * (0.5 - global[1] - global[2]);
00287               local[2] = 2.0 * global[2];
00288 //              Dune::FieldMatrix<double,3,3> A(0.0);
00289 //              A[0][0] = -2.0;
00290 //              A[1][1] = -2.0;
00291 //              A[1][2] = -2.0;
00292 //              A[2][2] =  2.0;
00293 //              A.mv(global,local);
00294 //              local[0] += 1.0;
00295 //              local[1] += 1.0;
00296               return;
00297           } else if ((global[0] + global[1] <= 0.5) and (global[1] + global[2] >= 0.5)) {
00298               subElement = 6;
00299               local[0] = 2.0 * (0.5 - global[0] - global[1]);
00300               local[1] = 2.0 * global[0];
00301               local[2] = 2.0 * (-0.5 + global[1] + global[2]);
00302 //              Dune::FieldMatrix<double,3,3> A(0.0);
00303 //              A[0][0] = -2.0;
00304 //              A[0][1] = -2.0;
00305 //              A[1][0] =  2.0;
00306 //              A[2][1] =  2.0;
00307 //              A[2][2] =  2.0;
00308 //              A.mv(global,local);
00309 //              local[0] += 1.0;
00310 //              local[2] -= 1.0;
00311               return;
00312           } else if ((global[0] + global[1] >= 0.5) and (global[1] + global[2] >= 0.5)) {
00313               subElement = 7;
00314               local[0] = 2.0 * (-0.5 + global[1] + global[2]);
00315               local[1] = 2.0 * (0.5 - global[1]);
00316               local[2] = 2.0 * (-0.5 + global[0] + global[1]);
00317 //              Dune::FieldMatrix<double,3,3> A(0.0);
00318 //              A[0][1] =  2.0;
00319 //              A[0][2] =  2.0;
00320 //              A[1][1] = -2.0;
00321 //              A[2][0] =  2.0;
00322 //              A[2][1] =  2.0;
00323 //              A.mv(global,local);
00324 //              local[0] -= 1.0;
00325 //              local[1] += 1.0;
00326 //              local[2] -= 1.0;
00327               return;
00328           }
00329 
00330           DUNE_THROW(InvalidStateException, "no subelement defined");
00331 
00332       }
00333 
00334   };
00335 
00336 
00337 }
00338 
00339 #endif