$treeview $search $mathjax
|
Palabos
Version 1.1
$projectbrief
|
$projectbrief
|
$searchbox |
00001 /* This file is part of the Palabos library. 00002 * 00003 * Copyright (C) 2011 FlowKit Sarl 00004 * Avenue de Chailly 23 00005 * 1012 Lausanne, Switzerland 00006 * E-mail contact: contact@flowkit.com 00007 * 00008 * The most recent release of Palabos can be downloaded at 00009 * <http://www.palabos.org/> 00010 * 00011 * The library Palabos is free software: you can redistribute it and/or 00012 * modify it under the terms of the GNU Affero General Public License as 00013 * published by the Free Software Foundation, either version 3 of the 00014 * License, or (at your option) any later version. 00015 * 00016 * The library is distributed in the hope that it will be useful, 00017 * but WITHOUT ANY WARRANTY; without even the implied warranty of 00018 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 00019 * GNU Affero General Public License for more details. 00020 * 00021 * You should have received a copy of the GNU Affero General Public License 00022 * along with this program. If not, see <http://www.gnu.org/licenses/>. 00023 */ 00024 00028 #ifndef GENERALIZED_BOUNDARY_CONDITION_3D_HH 00029 #define GENERALIZED_BOUNDARY_CONDITION_3D_HH 00030 00031 #include "boundaryCondition/boundaryCondition3D.h" 00032 #include "boundaryCondition/regularizedBoundaryDynamics3D.h" 00033 #include "boundaryCondition/equilibriumBoundaryDynamics.h" 00034 #include "boundaryCondition/boundaryInstantiator3D.h" 00035 #include "core/blockSurface3D.h" 00036 #include "core/plbDebug.h" 00037 00038 namespace plb { 00039 00040 00041 template<typename T, template<typename U> class Descriptor> 00042 class GeneralizedBoundaryManager3D { 00043 public: 00044 template<int direction, int orientation> 00045 static BoundaryCompositeDynamics<T,Descriptor>* 00046 getVelocityBoundaryDynamics(Dynamics<T,Descriptor>* baseDynamics); 00047 00048 template<int direction, int orientation> 00049 static BoxProcessingFunctional3D_L<T,Descriptor>* 00050 getVelocityBoundaryFunctional(); 00051 00052 template<int direction, int orientation> 00053 static BoundaryCompositeDynamics<T,Descriptor>* 00054 getPressureBoundaryDynamics(Dynamics<T,Descriptor>* baseDynamics); 00055 00056 template<int direction, int orientation> 00057 static BoxProcessingFunctional3D_L<T,Descriptor>* 00058 getPressureBoundaryFunctional(); 00059 00060 template<int plane, int normal1, int normal2> 00061 static BoundaryCompositeDynamics<T,Descriptor>* 00062 getExternalVelocityEdgeDynamics(Dynamics<T,Descriptor>* baseDynamics); 00063 00064 template<int plane, int normal1, int normal2> 00065 static BoxProcessingFunctional3D_L<T,Descriptor>* 00066 getExternalVelocityEdgeFunctional(); 00067 00068 template<int plane, int normal1, int normal2> 00069 static BoundaryCompositeDynamics<T,Descriptor>* 00070 getInternalVelocityEdgeDynamics(Dynamics<T,Descriptor>* baseDynamics); 00071 template<int plane, int normal1, int normal2> 00072 static BoxProcessingFunctional3D_L<T,Descriptor>* 00073 getInternalVelocityEdgeFunctional(); 00074 00075 template<int xNormal, int yNormal, int zNormal> 00076 static BoundaryCompositeDynamics<T,Descriptor>* 00077 getExternalVelocityCornerDynamics(Dynamics<T,Descriptor>* baseDynamics); 00078 template<int xNormal, int yNormal, int zNormal> 00079 static BoxProcessingFunctional3D_L<T,Descriptor>* 00080 getExternalVelocityCornerFunctional(); 00081 00082 template<int xNormal, int yNormal, int zNormal> 00083 static BoundaryCompositeDynamics<T,Descriptor>* 00084 getInternalVelocityCornerDynamics(Dynamics<T,Descriptor>* baseDynamics); 00085 template<int xNormal, int yNormal, int zNormal> 00086 static BoxProcessingFunctional3D_L<T,Descriptor>* 00087 getInternalVelocityCornerFunctional(); 00088 }; 00089 00090 00091 template<typename T, template<typename U> class Descriptor> 00092 class WrappedGeneralizedBoundaryManager3D { 00093 public: 00094 template<int direction, int orientation> 00095 static BoundaryCompositeDynamics<T,Descriptor>* 00096 getVelocityBoundaryDynamics(Dynamics<T,Descriptor>* baseDynamics); 00097 00098 template<int direction, int orientation> 00099 static BoxProcessingFunctional3D_L<T,Descriptor>* 00100 getVelocityBoundaryFunctional(); 00101 00102 template<int direction, int orientation> 00103 static BoundaryCompositeDynamics<T,Descriptor>* 00104 getPressureBoundaryDynamics(Dynamics<T,Descriptor>* baseDynamics); 00105 00106 template<int direction, int orientation> 00107 static BoxProcessingFunctional3D_L<T,Descriptor>* 00108 getPressureBoundaryFunctional(); 00109 00110 template<int plane, int normal1, int normal2> 00111 static BoundaryCompositeDynamics<T,Descriptor>* 00112 getExternalVelocityEdgeDynamics(Dynamics<T,Descriptor>* baseDynamics); 00113 00114 template<int plane, int normal1, int normal2> 00115 static BoxProcessingFunctional3D_L<T,Descriptor>* 00116 getExternalVelocityEdgeFunctional(); 00117 00118 template<int plane, int normal1, int normal2> 00119 static BoundaryCompositeDynamics<T,Descriptor>* 00120 getInternalVelocityEdgeDynamics(Dynamics<T,Descriptor>* baseDynamics); 00121 template<int plane, int normal1, int normal2> 00122 static BoxProcessingFunctional3D_L<T,Descriptor>* 00123 getInternalVelocityEdgeFunctional(); 00124 00125 template<int xNormal, int yNormal, int zNormal> 00126 static BoundaryCompositeDynamics<T,Descriptor>* 00127 getExternalVelocityCornerDynamics(Dynamics<T,Descriptor>* baseDynamics); 00128 template<int xNormal, int yNormal, int zNormal> 00129 static BoxProcessingFunctional3D_L<T,Descriptor>* 00130 getExternalVelocityCornerFunctional(); 00131 00132 template<int xNormal, int yNormal, int zNormal> 00133 static BoundaryCompositeDynamics<T,Descriptor>* 00134 getInternalVelocityCornerDynamics(Dynamics<T,Descriptor>* baseDynamics); 00135 template<int xNormal, int yNormal, int zNormal> 00136 static BoxProcessingFunctional3D_L<T,Descriptor>* 00137 getInternalVelocityCornerFunctional(); 00138 }; 00139 00140 00142 00143 template<typename T, template<typename U> class Descriptor> 00144 template<int direction, int orientation> 00145 BoundaryCompositeDynamics<T,Descriptor>* GeneralizedBoundaryManager3D<T,Descriptor>:: 00146 getVelocityBoundaryDynamics(Dynamics<T,Descriptor>* baseDynamics) 00147 { 00148 std::vector<plint> const& missingIndices = 00149 indexTemplates::subIndexOutgoing<Descriptor<T>,direction,orientation>(); 00150 00151 return new GeneralizedVelocityBoundaryDynamics<T,Descriptor>(baseDynamics,missingIndices); 00152 } 00153 00154 template<typename T, template<typename U> class Descriptor> 00155 template<int direction, int orientation> 00156 BoxProcessingFunctional3D_L<T,Descriptor>* 00157 GeneralizedBoundaryManager3D<T,Descriptor>:: 00158 getVelocityBoundaryFunctional() 00159 { 00160 return 0; 00161 } 00162 00163 template<typename T, template<typename U> class Descriptor> 00164 template<int direction, int orientation> 00165 BoundaryCompositeDynamics<T,Descriptor>* GeneralizedBoundaryManager3D<T,Descriptor>:: 00166 getPressureBoundaryDynamics(Dynamics<T,Descriptor>* baseDynamics) 00167 { 00168 // TODO implement pressure BC 00169 PLB_ASSERT(false); 00170 return 0; 00171 } 00172 00173 template<typename T, template<typename U> class Descriptor> 00174 template<int direction, int orientation> 00175 BoxProcessingFunctional3D_L<T,Descriptor>* 00176 GeneralizedBoundaryManager3D<T,Descriptor>:: 00177 getPressureBoundaryFunctional() 00178 { 00179 return 0; 00180 } 00181 00182 template<typename T, template<typename U> class Descriptor> 00183 template<int plane, int normal1, int normal2> 00184 BoundaryCompositeDynamics<T,Descriptor>* 00185 GeneralizedBoundaryManager3D<T,Descriptor>:: 00186 getExternalVelocityEdgeDynamics(Dynamics<T,Descriptor>* baseDynamics) 00187 { 00188 std::vector<plint> const& missingIndices = 00189 indexTemplates::subIndexOutgoingExternalEdge3D<Descriptor<T>,plane,normal1,normal2>(); 00190 return new GeneralizedVelocityBoundaryDynamics<T,Descriptor>(baseDynamics,missingIndices);; 00191 } 00192 00193 template<typename T, template<typename U> class Descriptor> 00194 template<int plane, int normal1, int normal2> 00195 BoxProcessingFunctional3D_L<T,Descriptor>* 00196 GeneralizedBoundaryManager3D<T,Descriptor>:: 00197 getExternalVelocityEdgeFunctional() 00198 { 00199 return 0; 00200 } 00201 00202 template<typename T, template<typename U> class Descriptor> 00203 template<int plane, int normal1, int normal2> 00204 BoundaryCompositeDynamics<T,Descriptor>* 00205 GeneralizedBoundaryManager3D<T,Descriptor>:: 00206 getInternalVelocityEdgeDynamics(Dynamics<T,Descriptor>* baseDynamics) 00207 { 00208 std::vector<plint> const& missingIndices = 00209 indexTemplates::subIndexOutgoingInternalEdge3D<Descriptor<T>,plane,normal1,normal2>(); 00210 return new GeneralizedVelocityBoundaryDynamics<T,Descriptor>(baseDynamics,missingIndices); 00211 } 00212 00213 template<typename T, template<typename U> class Descriptor> 00214 template<int plane, int normal1, int normal2> 00215 BoxProcessingFunctional3D_L<T,Descriptor>* 00216 GeneralizedBoundaryManager3D<T,Descriptor>:: 00217 getInternalVelocityEdgeFunctional() 00218 { 00219 return 0; 00220 } 00221 00222 template<typename T, template<typename U> class Descriptor> 00223 template<int xNormal, int yNormal, int zNormal> 00224 BoundaryCompositeDynamics<T,Descriptor>* 00225 GeneralizedBoundaryManager3D<T,Descriptor>:: 00226 getExternalVelocityCornerDynamics(Dynamics<T,Descriptor>* baseDynamics) 00227 { 00228 std::vector<plint> const& missingIndices = 00229 indexTemplates::subIndexOutgoingExternalCorner3D<Descriptor<T>,xNormal,yNormal,zNormal>(); 00230 00231 return new GeneralizedVelocityBoundaryDynamics<T,Descriptor>(baseDynamics,missingIndices); 00232 } 00233 00234 template<typename T, template<typename U> class Descriptor> 00235 template<int xNormal, int yNormal, int zNormal> 00236 BoxProcessingFunctional3D_L<T,Descriptor>* 00237 GeneralizedBoundaryManager3D<T,Descriptor>:: 00238 getExternalVelocityCornerFunctional() 00239 { 00240 return 0; 00241 } 00242 00243 template<typename T, template<typename U> class Descriptor> 00244 template<int xNormal, int yNormal, int zNormal> 00245 BoundaryCompositeDynamics<T,Descriptor>* 00246 GeneralizedBoundaryManager3D<T,Descriptor>:: 00247 getInternalVelocityCornerDynamics(Dynamics<T,Descriptor>* baseDynamics) 00248 { 00249 std::vector<plint> const& missingIndices = 00250 indexTemplates::subIndexOutgoingInternalCorner3D<Descriptor<T>,xNormal,yNormal,zNormal>(); 00251 return new GeneralizedVelocityBoundaryDynamics<T,Descriptor>(baseDynamics,missingIndices); 00252 } 00253 00254 template<typename T, template<typename U> class Descriptor> 00255 template<int xNormal, int yNormal, int zNormal> 00256 BoxProcessingFunctional3D_L<T,Descriptor>* 00257 GeneralizedBoundaryManager3D<T,Descriptor>:: 00258 getInternalVelocityCornerFunctional() 00259 { 00260 return 0; 00261 } 00262 00263 00265 00266 template<typename T, template<typename U> class Descriptor> 00267 template<int direction, int orientation> 00268 BoundaryCompositeDynamics<T,Descriptor>* WrappedGeneralizedBoundaryManager3D<T,Descriptor>:: 00269 getVelocityBoundaryDynamics(Dynamics<T,Descriptor>* baseDynamics) 00270 { 00271 std::vector<plint> const& missingIndices = 00272 indexTemplates::subIndexOutgoing<Descriptor<T>,direction,orientation>(); 00273 bool automaticPrepareCollision = false; 00274 00275 return new GeneralizedVelocityBoundaryDynamics<T,Descriptor>(baseDynamics,missingIndices,automaticPrepareCollision); 00276 } 00277 00278 template<typename T, template<typename U> class Descriptor> 00279 template<int direction, int orientation> 00280 BoxProcessingFunctional3D_L<T,Descriptor>* 00281 WrappedGeneralizedBoundaryManager3D<T,Descriptor>:: 00282 getVelocityBoundaryFunctional() 00283 { 00284 return new WrappedLocalBoundaryFunctional3D<T,Descriptor>(); 00285 } 00286 00287 template<typename T, template<typename U> class Descriptor> 00288 template<int direction, int orientation> 00289 BoundaryCompositeDynamics<T,Descriptor>* WrappedGeneralizedBoundaryManager3D<T,Descriptor>:: 00290 getPressureBoundaryDynamics(Dynamics<T,Descriptor>* baseDynamics) 00291 { 00292 // TODO implement pressure BC 00293 PLB_ASSERT(false); 00294 return 0; 00295 } 00296 00297 template<typename T, template<typename U> class Descriptor> 00298 template<int direction, int orientation> 00299 BoxProcessingFunctional3D_L<T,Descriptor>* 00300 WrappedGeneralizedBoundaryManager3D<T,Descriptor>:: 00301 getPressureBoundaryFunctional() 00302 { 00303 return 0; 00304 } 00305 00306 template<typename T, template<typename U> class Descriptor> 00307 template<int plane, int normal1, int normal2> 00308 BoundaryCompositeDynamics<T,Descriptor>* 00309 WrappedGeneralizedBoundaryManager3D<T,Descriptor>:: 00310 getExternalVelocityEdgeDynamics(Dynamics<T,Descriptor>* baseDynamics) 00311 { 00312 std::vector<plint> const& missingIndices = 00313 indexTemplates::subIndexOutgoingExternalEdge3D<Descriptor<T>,plane,normal1,normal2>(); 00314 bool automaticPrepareCollision = false; 00315 return new GeneralizedVelocityBoundaryDynamics<T,Descriptor>(baseDynamics,missingIndices,automaticPrepareCollision); 00316 } 00317 00318 template<typename T, template<typename U> class Descriptor> 00319 template<int plane, int normal1, int normal2> 00320 BoxProcessingFunctional3D_L<T,Descriptor>* 00321 WrappedGeneralizedBoundaryManager3D<T,Descriptor>:: 00322 getExternalVelocityEdgeFunctional() 00323 { 00324 return new WrappedLocalBoundaryFunctional3D<T,Descriptor>(); 00325 } 00326 00327 template<typename T, template<typename U> class Descriptor> 00328 template<int plane, int normal1, int normal2> 00329 BoundaryCompositeDynamics<T,Descriptor>* 00330 WrappedGeneralizedBoundaryManager3D<T,Descriptor>:: 00331 getInternalVelocityEdgeDynamics(Dynamics<T,Descriptor>* baseDynamics) 00332 { 00333 std::vector<plint> const& missingIndices = 00334 indexTemplates::subIndexOutgoingInternalEdge3D<Descriptor<T>,plane,normal1,normal2>(); 00335 bool automaticPrepareCollision = false; 00336 return new GeneralizedVelocityBoundaryDynamics<T,Descriptor>(baseDynamics,missingIndices,automaticPrepareCollision); 00337 } 00338 00339 template<typename T, template<typename U> class Descriptor> 00340 template<int plane, int normal1, int normal2> 00341 BoxProcessingFunctional3D_L<T,Descriptor>* 00342 WrappedGeneralizedBoundaryManager3D<T,Descriptor>:: 00343 getInternalVelocityEdgeFunctional() 00344 { 00345 return new WrappedLocalBoundaryFunctional3D<T,Descriptor>(); 00346 } 00347 00348 template<typename T, template<typename U> class Descriptor> 00349 template<int xNormal, int yNormal, int zNormal> 00350 BoundaryCompositeDynamics<T,Descriptor>* 00351 WrappedGeneralizedBoundaryManager3D<T,Descriptor>:: 00352 getExternalVelocityCornerDynamics(Dynamics<T,Descriptor>* baseDynamics) 00353 { 00354 std::vector<plint> const& missingIndices = 00355 indexTemplates::subIndexOutgoingExternalCorner3D<Descriptor<T>,xNormal,yNormal,zNormal>(); 00356 bool automaticPrepareCollision = false; 00357 00358 return new GeneralizedVelocityBoundaryDynamics<T,Descriptor>(baseDynamics,missingIndices,automaticPrepareCollision); 00359 } 00360 00361 template<typename T, template<typename U> class Descriptor> 00362 template<int xNormal, int yNormal, int zNormal> 00363 BoxProcessingFunctional3D_L<T,Descriptor>* 00364 WrappedGeneralizedBoundaryManager3D<T,Descriptor>:: 00365 getExternalVelocityCornerFunctional() 00366 { 00367 return new WrappedLocalBoundaryFunctional3D<T,Descriptor>(); 00368 } 00369 00370 template<typename T, template<typename U> class Descriptor> 00371 template<int xNormal, int yNormal, int zNormal> 00372 BoundaryCompositeDynamics<T,Descriptor>* 00373 WrappedGeneralizedBoundaryManager3D<T,Descriptor>:: 00374 getInternalVelocityCornerDynamics(Dynamics<T,Descriptor>* baseDynamics) 00375 { 00376 std::vector<plint> const& missingIndices = 00377 indexTemplates::subIndexOutgoingInternalCorner3D<Descriptor<T>,xNormal,yNormal,zNormal>(); 00378 bool automaticPrepareCollision = false; 00379 return new GeneralizedVelocityBoundaryDynamics<T,Descriptor>(baseDynamics,missingIndices,automaticPrepareCollision); 00380 } 00381 00382 template<typename T, template<typename U> class Descriptor> 00383 template<int xNormal, int yNormal, int zNormal> 00384 BoxProcessingFunctional3D_L<T,Descriptor>* 00385 WrappedGeneralizedBoundaryManager3D<T,Descriptor>:: 00386 getInternalVelocityCornerFunctional() 00387 { 00388 return new WrappedLocalBoundaryFunctional3D<T,Descriptor>(); 00389 } 00390 00391 00393 00394 template<typename T, template<typename U> class Descriptor> 00395 OnLatticeBoundaryCondition3D<T,Descriptor>* createGeneralizedBoundaryCondition3D() { 00396 return new BoundaryConditionInstantiator3D < 00397 T, Descriptor, 00398 WrappedGeneralizedBoundaryManager3D<T,Descriptor> > (); 00399 } 00400 00401 template<typename T, template<typename U> class Descriptor> 00402 OnLatticeBoundaryCondition3D<T,Descriptor>* createDynamicsBasedGeneralizedBoundaryCondition3D() { 00403 return new BoundaryConditionInstantiator3D < 00404 T, Descriptor, 00405 GeneralizedBoundaryManager3D<T,Descriptor> > (); 00406 } 00407 00408 } // namespace plb 00409 00410 #endif // GENERALIZED_BOUNDARY_CONDITION_3D_HH
1.6.3
1.6.3