• Main Page
  • Namespaces
  • Data Structures
  • Files
  • File List

/export/development/ViennaFEM/viennafem/bases/tetrahedron.hpp

Go to the documentation of this file.
00001 #ifndef VIENNAFEM_BASES_TETRAHEDRON_HPP
00002 #define VIENNAFEM_BASES_TETRAHEDRON_HPP
00003 
00004 /* =========================================================================
00005    Copyright (c) 2012, Institute for Microelectronics,
00006                        Institute for Analysis and Scientific Computing,
00007                        TU Wien.
00008                              -----------------
00009                ViennaFEM - The Vienna Finite Element Method Library
00010                              -----------------
00011 
00012    Author:     Karl Rupp                          rupp@iue.tuwien.ac.at
00013 
00014    License:    MIT (X11), see file LICENSE in the ViennaFEM base directory
00015 ============================================================================ */
00016 
00017 #include <vector>
00018 #include "viennagrid/topology/triangle.hpp"
00019 #include "viennagrid/topology/tetrahedron.hpp"
00020 #include "viennagrid/forwards.h"
00021 #include "viennamath/expression.hpp"
00022 #include "viennafem/forwards.h"
00023 
00028 namespace viennafem
00029 {
00030   
00031  
00032   //
00033   // Lagrange family on tetrahedra
00034   //
00035   
00036   
00037   // Vertex basis:
00039   template <typename InterfaceType, std::size_t order>
00040   struct local_basis <InterfaceType,
00041                       viennafem::lagrange_tag<order>,
00042                       unit_tetrahedron,
00043                       0,   // vertex level
00044                       0>   // vertex (0,0,0)
00045   {
00046     typedef viennamath::rt_expr<InterfaceType>   expression_type;
00047     
00048     typedef viennamath::ct_binary_expr< viennamath::ct_binary_expr< viennamath::ct_constant<1>,
00049                                                                     viennamath::op_minus<viennafem::numeric_type>,
00050                                                                     viennamath::ct_variable<0> >,
00051                                         viennamath::op_minus<viennafem::numeric_type>,
00052                                         viennamath::ct_binary_expr< viennamath::ct_variable<1>,
00053                                                                     viennamath::op_plus<viennafem::numeric_type>,
00054                                                                     viennamath::ct_variable<2> >
00055                                       >                 type;
00056                                  
00057     static expression_type get() { return expression_type(type()); }
00058   };
00059 
00061   template <typename InterfaceType, std::size_t order>
00062   struct local_basis <InterfaceType,
00063                       viennafem::lagrange_tag<order>,
00064                       unit_tetrahedron,
00065                       0,   //vertex level
00066                       1>   //vertex (1,0,0)
00067   {
00068     typedef viennamath::rt_expr<InterfaceType>   expression_type;
00069     
00070     typedef viennamath::ct_variable<0>           type;
00071     
00072     static expression_type get() { return expression_type(type()); }
00073   };
00074 
00075   
00077   template <typename InterfaceType, std::size_t order>
00078   struct local_basis <InterfaceType,
00079                       viennafem::lagrange_tag<order>,
00080                       unit_tetrahedron,
00081                       0,   //vertex level
00082                       2>   //vertex (0,1,0)
00083   {
00084     typedef viennamath::rt_expr<InterfaceType>   expression_type;
00085     
00086     typedef viennamath::ct_variable<1>           type;
00087     
00088     static expression_type get() { return expression_type(type()); }
00089   };
00090   
00092   template <typename InterfaceType, std::size_t order>
00093   struct local_basis <InterfaceType,
00094                       viennafem::lagrange_tag<order>,
00095                       unit_tetrahedron,
00096                       0,   //vertex level
00097                       3>   //vertex (0,0,1)
00098   {
00099     typedef viennamath::rt_expr<InterfaceType>   expression_type;
00100     
00101     typedef viennamath::ct_variable<2>           type;
00102     
00103     static expression_type get() { return expression_type(type()); }
00104   };
00105   
00106   
00107   //
00108   // quadratic
00109   //
00111   template <typename InterfaceType>
00112   struct local_basis <InterfaceType,
00113                       viennafem::lagrange_tag<2>,
00114                       unit_tetrahedron,
00115                       1,   //edge level
00116                       0>
00117   {
00118     typedef viennamath::rt_expr<InterfaceType>   expression_type;
00119     typedef typename InterfaceType::numeric_type NumericT;
00120     
00121     typedef typename local_basis <InterfaceType,
00122                                   viennafem::lagrange_tag<2>,
00123                                   unit_tetrahedron,
00124                                   0,
00125                                   0>::type       phi_0;
00126 
00127     typedef typename local_basis <InterfaceType,
00128                                   viennafem::lagrange_tag<2>,
00129                                   unit_tetrahedron,
00130                                   0,
00131                                   1>::type       phi_1;
00132                          
00133     //x * (1-x)
00134     typedef viennamath::ct_binary_expr<phi_0,
00135                                        viennamath::op_mult<NumericT>,
00136                                        phi_1
00137                                       > type;
00138     
00139     static expression_type get() { return expression_type(type()); }
00140   };
00141 
00143   template <typename InterfaceType>
00144   struct local_basis <InterfaceType,
00145                       viennafem::lagrange_tag<2>,
00146                       unit_tetrahedron,
00147                       1,   //edge level
00148                       1>
00149   {
00150     typedef viennamath::rt_expr<InterfaceType>   expression_type;
00151     typedef typename InterfaceType::numeric_type NumericT;
00152     
00153     typedef typename local_basis <InterfaceType,
00154                                   viennafem::lagrange_tag<2>,
00155                                   unit_tetrahedron,
00156                                   0,
00157                                   0>::type       phi_0;
00158 
00159     typedef typename local_basis <InterfaceType,
00160                                   viennafem::lagrange_tag<2>,
00161                                   unit_tetrahedron,
00162                                   0,
00163                                   2>::type       phi_1;
00164                          
00165     //x * (1-x)
00166     typedef viennamath::ct_binary_expr<phi_0,
00167                                        viennamath::op_mult<NumericT>,
00168                                        phi_1
00169                                       > type;
00170     
00171     static expression_type get() { return expression_type(type()); }
00172   };
00173   
00175   template <typename InterfaceType>
00176   struct local_basis <InterfaceType,
00177                       viennafem::lagrange_tag<2>,
00178                       unit_tetrahedron,
00179                       1,   //edge level
00180                       2>
00181   {
00182     typedef viennamath::rt_expr<InterfaceType>   expression_type;
00183     typedef typename InterfaceType::numeric_type NumericT;
00184     
00185     typedef typename local_basis <InterfaceType,
00186                                   viennafem::lagrange_tag<2>,
00187                                   unit_tetrahedron,
00188                                   0,
00189                                   0>::type       phi_0;
00190 
00191     typedef typename local_basis <InterfaceType,
00192                                   viennafem::lagrange_tag<2>,
00193                                   unit_tetrahedron,
00194                                   0,
00195                                   3>::type       phi_1;
00196                          
00197     //x * (1-x)
00198     typedef viennamath::ct_binary_expr<phi_0,
00199                                        viennamath::op_mult<NumericT>,
00200                                        phi_1
00201                                       > type;
00202     
00203     static expression_type get() { return expression_type(type()); }
00204   };
00205   
00207   template <typename InterfaceType>
00208   struct local_basis <InterfaceType,
00209                       viennafem::lagrange_tag<2>,
00210                       unit_tetrahedron,
00211                       1,   //edge level
00212                       3>
00213   {
00214     typedef viennamath::rt_expr<InterfaceType>   expression_type;
00215     typedef typename InterfaceType::numeric_type NumericT;
00216     
00217     typedef typename local_basis <InterfaceType,
00218                                   viennafem::lagrange_tag<2>,
00219                                   unit_tetrahedron,
00220                                   0,
00221                                   1>::type       phi_0;
00222 
00223     typedef typename local_basis <InterfaceType,
00224                                   viennafem::lagrange_tag<2>,
00225                                   unit_tetrahedron,
00226                                   0,
00227                                   2>::type       phi_1;
00228                          
00229     //x * (1-x)
00230     typedef viennamath::ct_binary_expr<phi_0,
00231                                        viennamath::op_mult<NumericT>,
00232                                        phi_1
00233                                       > type;
00234     
00235     static expression_type get() { return expression_type(type()); }
00236   };
00237   
00239   template <typename InterfaceType>
00240   struct local_basis <InterfaceType,
00241                       viennafem::lagrange_tag<2>,
00242                       unit_tetrahedron,
00243                       1,   //edge level
00244                       4>
00245   {
00246     typedef viennamath::rt_expr<InterfaceType>   expression_type;
00247     typedef typename InterfaceType::numeric_type NumericT;
00248     
00249     typedef typename local_basis <InterfaceType,
00250                                   viennafem::lagrange_tag<2>,
00251                                   unit_tetrahedron,
00252                                   0,
00253                                   1>::type       phi_0;
00254 
00255     typedef typename local_basis <InterfaceType,
00256                                   viennafem::lagrange_tag<2>,
00257                                   unit_tetrahedron,
00258                                   0,
00259                                   3>::type       phi_1;
00260                          
00261     //x * (1-x)
00262     typedef viennamath::ct_binary_expr<phi_0,
00263                                        viennamath::op_mult<NumericT>,
00264                                        phi_1
00265                                       > type;
00266     
00267     static expression_type get() { return expression_type(type()); }
00268   };
00269   
00271   template <typename InterfaceType>
00272   struct local_basis <InterfaceType,
00273                       viennafem::lagrange_tag<2>,
00274                       unit_tetrahedron,
00275                       1,   //edge level
00276                       5>
00277   {
00278     typedef viennamath::rt_expr<InterfaceType>   expression_type;
00279     typedef typename InterfaceType::numeric_type NumericT;
00280     
00281     typedef typename local_basis <InterfaceType,
00282                                   viennafem::lagrange_tag<2>,
00283                                   unit_tetrahedron,
00284                                   0,
00285                                   2>::type       phi_0;
00286 
00287     typedef typename local_basis <InterfaceType,
00288                                   viennafem::lagrange_tag<2>,
00289                                   unit_tetrahedron,
00290                                   0,
00291                                   3>::type       phi_1;
00292                          
00293     //x * (1-x)
00294     typedef viennamath::ct_binary_expr<phi_0,
00295                                        viennamath::op_mult<NumericT>,
00296                                        phi_1
00297                                       > type;
00298     
00299     static expression_type get() { return expression_type(type()); }
00300   };
00301   
00302 }
00303 
00304 #endif

Generated on Wed Feb 29 2012 21:51:05 for ViennaFEM - The Vienna Finite Element Method Library by  doxygen 1.7.1