$treeview $search $mathjax
Palabos  Version 1.1
$projectbrief
$projectbrief
$searchbox

generalizedBoundaryCondition3D.hh

Go to the documentation of this file.
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