dune-localfunctions
2.1.1
|
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