00001 #ifndef VIENNAFEM_BASES_TETRAHEDRON_HPP
00002 #define VIENNAFEM_BASES_TETRAHEDRON_HPP
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
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
00034
00035
00036
00037
00039 template <typename InterfaceType, std::size_t order>
00040 struct local_basis <InterfaceType,
00041 viennafem::lagrange_tag<order>,
00042 unit_tetrahedron,
00043 0,
00044 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,
00066 1>
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,
00082 2>
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,
00097 3>
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
00109
00111 template <typename InterfaceType>
00112 struct local_basis <InterfaceType,
00113 viennafem::lagrange_tag<2>,
00114 unit_tetrahedron,
00115 1,
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
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,
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
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,
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
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,
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
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,
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
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,
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
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