p23dlocalbasis.hh

Go to the documentation of this file.
00001 // -*- tab-width: 4; indent-tabs-mode: nil -*-
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         // case 0:
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         // case 1:
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         // case 2:
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         // case 3:
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         // case 4:
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         // case 5:
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         // case 6:
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         // case 7:
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         // case 8:
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         // case 9:
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,         // position
00179                       std::vector<typename Traits::JacobianType>& out) const      // return value
00180     {  
00181         out.resize(10);
00182 
00183         R aa[3][3], bb[3][3];
00184         // case 0:
00185         //x derivative
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         //y derivative
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         // z derivative
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         //case 1:
00206         //x derivative
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         //y derivative
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         // z derivative
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         // case 2:
00227         //x derivative
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         //y derivative
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         // z derivative
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         // case 3:
00248         //x derivative
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         //y derivative
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         // z derivative
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         // case 4:
00269         //x derivative
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         //y derivative
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         // z derivative
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         // case 5:
00290         //x derivative
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         //y derivative
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         // z derivative
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         // case 6:
00311         //x derivative
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         //y derivative
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         // z derivative
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         // case 7:
00332         //x derivative
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         //y derivative
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         // z derivative
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         //case 8:
00353         //x derivative
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         //y derivative
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         // z derivative
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         // case 9:
00374         //x derivative
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         //y derivative
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         // z derivative
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
Generated on Sat Apr 24 11:15:35 2010 for dune-localfunctions by  doxygen 1.6.3