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

generalizedBoundaryCondition2D.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_2D_HH
00029 #define GENERALIZED_BOUNDARY_CONDITION_2D_HH
00030 
00031 #include "boundaryCondition/boundaryCondition2D.h"
00032 #include "boundaryCondition/boundaryCondition2D.hh"
00033 #include "generalizedBoundaryDynamics.h"
00034 #include "boundaryCondition/generalizedBoundaryCondition2D.h"
00035 #include "boundaryCondition/boundaryInstantiator2D.h"
00036 #include "atomicBlock/blockLattice2D.h"
00037 #include "multiBlock/multiBlockLattice2D.h"
00038 #include "core/blockSurface2D.h"
00039 #include "core/plbDebug.h"
00040 
00041 namespace plb {
00042     
00044 
00045 template<typename T, template<typename U> class Descriptor>
00046 class GeneralizedBoundaryManager2D {
00047 public:
00048     template<int direction, int orientation>
00049         static BoundaryCompositeDynamics<T,Descriptor>*
00050             getVelocityBoundaryDynamics(Dynamics<T,Descriptor>* baseDynamics);
00051     template<int direction, int orientation>
00052         static BoxProcessingFunctional2D_L<T,Descriptor>*
00053             getVelocityBoundaryFunctional();
00054 
00055     template<int direction, int orientation>
00056         static BoundaryCompositeDynamics<T,Descriptor>*
00057             getPressureBoundaryDynamics(Dynamics<T,Descriptor>* baseDynamics);
00058     template<int direction, int orientation>
00059         static BoxProcessingFunctional2D_L<T,Descriptor>*
00060             getPressureBoundaryFunctional();
00061 
00062     template<int xNormal, int yNormal>
00063         static BoundaryCompositeDynamics<T,Descriptor>*
00064             getExternalVelocityCornerDynamics(Dynamics<T,Descriptor>* baseDynamics);
00065     template<int xNormal, int yNormal>
00066         static BoxProcessingFunctional2D_L<T,Descriptor>*
00067             getExternalVelocityCornerFunctional();
00068 
00069     template<int xNormal, int yNormal>
00070         static BoundaryCompositeDynamics<T,Descriptor>*
00071             getInternalVelocityCornerDynamics(Dynamics<T,Descriptor>* baseDynamics);
00072     template<int xNormal, int yNormal>
00073         static BoxProcessingFunctional2D_L<T,Descriptor>*
00074             getInternalVelocityCornerFunctional();
00075 };
00076 
00077 
00078 template<typename T, template<typename U> class Descriptor>
00079 class WrappedGeneralizedBoundaryManager2D {
00080 public:
00081     template<int direction, int orientation>
00082         static BoundaryCompositeDynamics<T,Descriptor>*
00083             getVelocityBoundaryDynamics(Dynamics<T,Descriptor>* baseDynamics);
00084     template<int direction, int orientation>
00085         static BoxProcessingFunctional2D_L<T,Descriptor>*
00086             getVelocityBoundaryFunctional();
00087 
00088     template<int direction, int orientation>
00089         static BoundaryCompositeDynamics<T,Descriptor>*
00090             getPressureBoundaryDynamics(Dynamics<T,Descriptor>* baseDynamics);
00091     template<int direction, int orientation>
00092         static BoxProcessingFunctional2D_L<T,Descriptor>*
00093             getPressureBoundaryFunctional();
00094 
00095     template<int xNormal, int yNormal>
00096         static BoundaryCompositeDynamics<T,Descriptor>*
00097             getExternalVelocityCornerDynamics(Dynamics<T,Descriptor>* baseDynamics);
00098     template<int xNormal, int yNormal>
00099         static BoxProcessingFunctional2D_L<T,Descriptor>*
00100             getExternalVelocityCornerFunctional();
00101 
00102     template<int xNormal, int yNormal>
00103         static BoundaryCompositeDynamics<T,Descriptor>*
00104             getInternalVelocityCornerDynamics(Dynamics<T,Descriptor>* baseDynamics);
00105     template<int xNormal, int yNormal>
00106         static BoxProcessingFunctional2D_L<T,Descriptor>*
00107             getInternalVelocityCornerFunctional();
00108 };
00109 
00111 
00112 template<typename T, template<typename U> class Descriptor>
00113 class MassConservingGeneralizedBoundaryManager2D {
00114 public:
00115     template<int direction, int orientation>
00116         static BoundaryCompositeDynamics<T,Descriptor>*
00117             getVelocityBoundaryDynamics(Dynamics<T,Descriptor>* baseDynamics);
00118     template<int direction, int orientation>
00119         static BoxProcessingFunctional2D_L<T,Descriptor>*
00120             getVelocityBoundaryFunctional();
00121 
00122     template<int direction, int orientation>
00123         static BoundaryCompositeDynamics<T,Descriptor>*
00124             getPressureBoundaryDynamics(Dynamics<T,Descriptor>* baseDynamics);
00125     template<int direction, int orientation>
00126         static BoxProcessingFunctional2D_L<T,Descriptor>*
00127             getPressureBoundaryFunctional();
00128 
00129     template<int xNormal, int yNormal>
00130         static BoundaryCompositeDynamics<T,Descriptor>*
00131             getExternalVelocityCornerDynamics(Dynamics<T,Descriptor>* baseDynamics);
00132     template<int xNormal, int yNormal>
00133         static BoxProcessingFunctional2D_L<T,Descriptor>*
00134             getExternalVelocityCornerFunctional();
00135 
00136     template<int xNormal, int yNormal>
00137         static BoundaryCompositeDynamics<T,Descriptor>*
00138             getInternalVelocityCornerDynamics(Dynamics<T,Descriptor>* baseDynamics);
00139     template<int xNormal, int yNormal>
00140         static BoxProcessingFunctional2D_L<T,Descriptor>*
00141             getInternalVelocityCornerFunctional();
00142 };
00143 
00144 
00145 template<typename T, template<typename U> class Descriptor>
00146 class WrappedMassConservingGeneralizedBoundaryManager2D {
00147 public:
00148     template<int direction, int orientation>
00149         static BoundaryCompositeDynamics<T,Descriptor>*
00150             getVelocityBoundaryDynamics(Dynamics<T,Descriptor>* baseDynamics);
00151     template<int direction, int orientation>
00152         static BoxProcessingFunctional2D_L<T,Descriptor>*
00153             getVelocityBoundaryFunctional();
00154 
00155     template<int direction, int orientation>
00156         static BoundaryCompositeDynamics<T,Descriptor>*
00157             getPressureBoundaryDynamics(Dynamics<T,Descriptor>* baseDynamics);
00158     template<int direction, int orientation>
00159         static BoxProcessingFunctional2D_L<T,Descriptor>*
00160             getPressureBoundaryFunctional();
00161 
00162     template<int xNormal, int yNormal>
00163         static BoundaryCompositeDynamics<T,Descriptor>*
00164             getExternalVelocityCornerDynamics(Dynamics<T,Descriptor>* baseDynamics);
00165     template<int xNormal, int yNormal>
00166         static BoxProcessingFunctional2D_L<T,Descriptor>*
00167             getExternalVelocityCornerFunctional();
00168 
00169     template<int xNormal, int yNormal>
00170         static BoundaryCompositeDynamics<T,Descriptor>*
00171             getInternalVelocityCornerDynamics(Dynamics<T,Descriptor>* baseDynamics);
00172     template<int xNormal, int yNormal>
00173         static BoxProcessingFunctional2D_L<T,Descriptor>*
00174             getInternalVelocityCornerFunctional();
00175 };
00176 
00177 
00179 
00180 template<typename T, template<typename U> class Descriptor>
00181 template<int direction, int orientation>
00182 BoundaryCompositeDynamics<T,Descriptor>*
00183     GeneralizedBoundaryManager2D<T,Descriptor>::
00184         getVelocityBoundaryDynamics(Dynamics<T,Descriptor>* baseDynamics)
00185 {
00186     std::vector<plint> const& missingIndices = 
00187         indexTemplates::subIndexOutgoing<Descriptor<T>,direction,orientation>();
00188     return new GeneralizedVelocityBoundaryDynamics<T,Descriptor>(baseDynamics,missingIndices);
00189 }
00190 
00191 template<typename T, template<typename U> class Descriptor>
00192 template<int direction, int orientation>
00193 BoxProcessingFunctional2D_L<T,Descriptor>*
00194     GeneralizedBoundaryManager2D<T,Descriptor>::
00195         getVelocityBoundaryFunctional()
00196 {
00197     return 0;
00198 }
00199 
00200 template<typename T, template<typename U> class Descriptor>
00201 template<int direction, int orientation>
00202 BoundaryCompositeDynamics<T,Descriptor>*
00203     GeneralizedBoundaryManager2D<T,Descriptor>::
00204         getPressureBoundaryDynamics(Dynamics<T,Descriptor>* baseDynamics)
00205 {
00206     std::vector<plint> const& missingIndices = 
00207         indexTemplates::subIndexOutgoing<Descriptor<T>,direction,orientation>();
00208     return new GeneralizedDensityBoundaryDynamics<T,Descriptor,direction,orientation>(baseDynamics,missingIndices);
00209 }
00210 
00211 template<typename T, template<typename U> class Descriptor>
00212 template<int direction, int orientation>
00213 BoxProcessingFunctional2D_L<T,Descriptor>*
00214     GeneralizedBoundaryManager2D<T,Descriptor>::
00215         getPressureBoundaryFunctional()
00216 {
00217     return 0;
00218 }
00219 
00220 template<typename T, template<typename U> class Descriptor>
00221 template<int xNormal, int yNormal>
00222 BoundaryCompositeDynamics<T,Descriptor>* GeneralizedBoundaryManager2D<T,Descriptor>::
00223     getExternalVelocityCornerDynamics(Dynamics<T,Descriptor>* baseDynamics)
00224 {
00225     std::vector<plint> const& missingIndices = 
00226         indexTemplates::subIndexOutgoingCorner2D<Descriptor<T>,xNormal,yNormal>();
00227         
00228     return new GeneralizedVelocityBoundaryDynamics<T,Descriptor>(baseDynamics,missingIndices);
00229 }
00230 
00231 template<typename T, template<typename U> class Descriptor>
00232 template<int xNormal, int yNormal>
00233 BoxProcessingFunctional2D_L<T,Descriptor>*
00234     GeneralizedBoundaryManager2D<T,Descriptor>::
00235         getExternalVelocityCornerFunctional()
00236 {
00237     return 0;
00238 }
00239 
00240 template<typename T, template<typename U> class Descriptor>
00241 template<int xNormal, int yNormal>
00242 BoundaryCompositeDynamics<T,Descriptor>*
00243     GeneralizedBoundaryManager2D<T,Descriptor>::
00244         getInternalVelocityCornerDynamics(Dynamics<T,Descriptor>* baseDynamics)
00245 {
00246     std::vector<plint> const& missingIndices =   
00247         indexTemplates::subIndexOutgoingInternalCorner2D<Descriptor<T>,xNormal,yNormal>();
00248     
00249     return new GeneralizedVelocityBoundaryDynamics<T,Descriptor>(baseDynamics,missingIndices);
00250 }
00251 
00252 template<typename T, template<typename U> class Descriptor>
00253 template<int xNormal, int yNormal>
00254 BoxProcessingFunctional2D_L<T,Descriptor>*
00255     GeneralizedBoundaryManager2D<T,Descriptor>::getInternalVelocityCornerFunctional()
00256 {
00257     return 0;
00258 }
00259 
00260 
00261 
00263 
00264 template<typename T, template<typename U> class Descriptor>
00265 template<int direction, int orientation>
00266 BoundaryCompositeDynamics<T,Descriptor>*
00267     WrappedGeneralizedBoundaryManager2D<T,Descriptor>::
00268         getVelocityBoundaryDynamics(Dynamics<T,Descriptor>* baseDynamics)
00269 {
00270     std::vector<plint> const& missingIndices = 
00271         indexTemplates::subIndexOutgoing<Descriptor<T>,direction,orientation>();
00272     bool automaticPrepareCollision = false;
00273     return new GeneralizedVelocityBoundaryDynamics<T,Descriptor>
00274                    (baseDynamics,missingIndices,automaticPrepareCollision);
00275 }
00276 
00277 template<typename T, template<typename U> class Descriptor>
00278 template<int direction, int orientation>
00279 BoxProcessingFunctional2D_L<T,Descriptor>*
00280     WrappedGeneralizedBoundaryManager2D<T,Descriptor>::
00281         getVelocityBoundaryFunctional()
00282 {
00283     return new WrappedLocalBoundaryFunctional2D<T,Descriptor>();
00284 }
00285 
00286 template<typename T, template<typename U> class Descriptor>
00287 template<int direction, int orientation>
00288 BoundaryCompositeDynamics<T,Descriptor>*
00289     WrappedGeneralizedBoundaryManager2D<T,Descriptor>::
00290         getPressureBoundaryDynamics(Dynamics<T,Descriptor>* baseDynamics)
00291 {
00292     std::vector<plint> const& missingIndices = 
00293         indexTemplates::subIndexOutgoing<Descriptor<T>,direction,orientation>();
00294     bool automaticPrepareCollision = false;
00295     return new GeneralizedDensityBoundaryDynamics<T,Descriptor,direction,orientation>
00296                    (baseDynamics,missingIndices,automaticPrepareCollision);
00297 }
00298 
00299 template<typename T, template<typename U> class Descriptor>
00300 template<int direction, int orientation>
00301 BoxProcessingFunctional2D_L<T,Descriptor>*
00302     WrappedGeneralizedBoundaryManager2D<T,Descriptor>::
00303         getPressureBoundaryFunctional()
00304 {
00305     return new WrappedLocalBoundaryFunctional2D<T,Descriptor>();
00306 }
00307 
00308 template<typename T, template<typename U> class Descriptor>
00309 template<int xNormal, int yNormal>
00310 BoundaryCompositeDynamics<T,Descriptor>* WrappedGeneralizedBoundaryManager2D<T,Descriptor>::
00311     getExternalVelocityCornerDynamics(Dynamics<T,Descriptor>* baseDynamics)
00312 {
00313     std::vector<plint> const& missingIndices = 
00314         indexTemplates::subIndexOutgoingCorner2D<Descriptor<T>,xNormal,yNormal>();
00315     bool automaticPrepareCollision = false;
00316     return new GeneralizedVelocityBoundaryDynamics<T,Descriptor>(baseDynamics,missingIndices,automaticPrepareCollision);
00317 }
00318 
00319 template<typename T, template<typename U> class Descriptor>
00320 template<int xNormal, int yNormal>
00321 BoxProcessingFunctional2D_L<T,Descriptor>*
00322     WrappedGeneralizedBoundaryManager2D<T,Descriptor>::
00323         getExternalVelocityCornerFunctional()
00324 {
00325     return new WrappedLocalBoundaryFunctional2D<T,Descriptor>();
00326 }
00327 
00328 template<typename T, template<typename U> class Descriptor>
00329 template<int xNormal, int yNormal>
00330 BoundaryCompositeDynamics<T,Descriptor>*
00331     WrappedGeneralizedBoundaryManager2D<T,Descriptor>::
00332         getInternalVelocityCornerDynamics(Dynamics<T,Descriptor>* baseDynamics)
00333 {
00334     std::vector<plint> const& missingIndices =   
00335         indexTemplates::subIndexOutgoingInternalCorner2D<Descriptor<T>,xNormal,yNormal>();
00336     bool automaticPrepareCollision = false;
00337     
00338     return new GeneralizedVelocityBoundaryDynamics<T,Descriptor>(baseDynamics,missingIndices,automaticPrepareCollision);
00339 }
00340 
00341 template<typename T, template<typename U> class Descriptor>
00342 template<int xNormal, int yNormal>
00343 BoxProcessingFunctional2D_L<T,Descriptor>*
00344     WrappedGeneralizedBoundaryManager2D<T,Descriptor>::getInternalVelocityCornerFunctional()
00345 {
00346     return new WrappedLocalBoundaryFunctional2D<T,Descriptor>();
00347 }
00348 
00349 
00351 
00352 template<typename T, template<typename U> class Descriptor>
00353 template<int direction, int orientation>
00354 BoundaryCompositeDynamics<T,Descriptor>*
00355     MassConservingGeneralizedBoundaryManager2D<T,Descriptor>::
00356         getVelocityBoundaryDynamics(Dynamics<T,Descriptor>* baseDynamics)
00357 {
00358     std::vector<plint> const& missingIndices = 
00359         indexTemplates::subIndexOutgoing<Descriptor<T>,direction,orientation>();
00360         
00361     std::vector<plint> const& knownIndices = 
00362         indexTemplates::opposite<Descriptor<T> >(missingIndices);
00363 //         indexTemplates::remainingIndexes<Descriptor<T> >(missingIndices);
00364         
00365     return new GeneralizedMassConservingVelocityBoundaryDynamics<T,Descriptor>(
00366                     baseDynamics,knownIndices,missingIndices,missingIndices);
00367 }
00368 
00369 template<typename T, template<typename U> class Descriptor>
00370 template<int direction, int orientation>
00371 BoxProcessingFunctional2D_L<T,Descriptor>*
00372     MassConservingGeneralizedBoundaryManager2D<T,Descriptor>::
00373         getVelocityBoundaryFunctional()
00374 {
00375     return 0;
00376 }
00377 
00378 template<typename T, template<typename U> class Descriptor>
00379 template<int direction, int orientation>
00380 BoundaryCompositeDynamics<T,Descriptor>*
00381     MassConservingGeneralizedBoundaryManager2D<T,Descriptor>::
00382         getPressureBoundaryDynamics(Dynamics<T,Descriptor>* baseDynamics)
00383 {
00384     std::vector<plint> const& missingIndices = 
00385         indexTemplates::subIndexOutgoing<Descriptor<T>,direction,orientation>();
00386         
00387     return new GeneralizedDensityBoundaryDynamics<T,Descriptor,direction,orientation>(baseDynamics,missingIndices);
00388 }
00389 
00390 template<typename T, template<typename U> class Descriptor>
00391 template<int direction, int orientation>
00392 BoxProcessingFunctional2D_L<T,Descriptor>*
00393     MassConservingGeneralizedBoundaryManager2D<T,Descriptor>::
00394         getPressureBoundaryFunctional()
00395 {
00396     return 0;
00397 }
00398 
00399 template<typename T, template<typename U> class Descriptor>
00400 template<int xNormal, int yNormal>
00401 BoundaryCompositeDynamics<T,Descriptor>* MassConservingGeneralizedBoundaryManager2D<T,Descriptor>::
00402     getExternalVelocityCornerDynamics(Dynamics<T,Descriptor>* baseDynamics)
00403 {
00404     std::vector<plint> const& missingIndices = 
00405         indexTemplates::subIndexOutgoingCorner2D<Descriptor<T>,xNormal,yNormal>();
00406     std::vector<plint> const& knownIndices = 
00407         indexTemplates::opposite<Descriptor<T> >(indexTemplates::subIndexIngoingCorner2D<Descriptor<T>,xNormal,yNormal>());
00408     
00409     std::vector<plint> inGoingIndices;
00410     inGoingIndices.push_back(indexTemplates::findVelocity<Descriptor<T> >(Array<plint,2>(-xNormal,-yNormal)));
00411         
00412     return new GeneralizedMassConservingVelocityBoundaryDynamics<T,Descriptor>(
00413                     baseDynamics,missingIndices,knownIndices,inGoingIndices);
00414 }
00415 
00416 template<typename T, template<typename U> class Descriptor>
00417 template<int xNormal, int yNormal>
00418 BoxProcessingFunctional2D_L<T,Descriptor>*
00419     MassConservingGeneralizedBoundaryManager2D<T,Descriptor>::
00420         getExternalVelocityCornerFunctional()
00421 {
00422     return 0;
00423 }
00424 
00425 template<typename T, template<typename U> class Descriptor>
00426 template<int xNormal, int yNormal>
00427 BoundaryCompositeDynamics<T,Descriptor>*
00428     MassConservingGeneralizedBoundaryManager2D<T,Descriptor>::
00429         getInternalVelocityCornerDynamics(Dynamics<T,Descriptor>* baseDynamics)
00430 {
00431     std::vector<plint> const& missingIndices =   
00432         indexTemplates::subIndexOutgoingInternalCorner2D<Descriptor<T>,xNormal,yNormal>();
00433     
00434     return new GeneralizedMassConservingVelocityBoundaryDynamics<T,Descriptor>(
00435                     baseDynamics,missingIndices,missingIndices);
00436 }
00437 
00438 template<typename T, template<typename U> class Descriptor>
00439 template<int xNormal, int yNormal>
00440 BoxProcessingFunctional2D_L<T,Descriptor>*
00441     MassConservingGeneralizedBoundaryManager2D<T,Descriptor>::getInternalVelocityCornerFunctional()
00442 {
00443     return 0;
00444 }
00445 
00446 
00447 
00449 
00450 template<typename T, template<typename U> class Descriptor>
00451 template<int direction, int orientation>
00452 BoundaryCompositeDynamics<T,Descriptor>*
00453     WrappedMassConservingGeneralizedBoundaryManager2D<T,Descriptor>::
00454         getVelocityBoundaryDynamics(Dynamics<T,Descriptor>* baseDynamics)
00455 {
00456     std::vector<plint> const& missingIndices = 
00457         indexTemplates::subIndexOutgoing<Descriptor<T>,direction,orientation>();
00458         
00459     std::vector<plint> const& knownIndices = 
00460         indexTemplates::opposite<Descriptor<T> >(missingIndices);
00461 //         indexTemplates::remainingIndexes<Descriptor<T> >(missingIndices);
00462     bool automaticPrepareCollision = false;
00463     
00464     return new GeneralizedMassConservingVelocityBoundaryDynamics<T,Descriptor>
00465         (baseDynamics,missingIndices,knownIndices,missingIndices,automaticPrepareCollision);
00466 }
00467 
00468 template<typename T, template<typename U> class Descriptor>
00469 template<int direction, int orientation>
00470 BoxProcessingFunctional2D_L<T,Descriptor>*
00471     WrappedMassConservingGeneralizedBoundaryManager2D<T,Descriptor>::
00472         getVelocityBoundaryFunctional()
00473 {
00474     return new WrappedLocalBoundaryFunctional2D<T,Descriptor>();
00475 }
00476 
00477 template<typename T, template<typename U> class Descriptor>
00478 template<int direction, int orientation>
00479 BoundaryCompositeDynamics<T,Descriptor>*
00480     WrappedMassConservingGeneralizedBoundaryManager2D<T,Descriptor>::
00481         getPressureBoundaryDynamics(Dynamics<T,Descriptor>* baseDynamics)
00482 {
00483     std::vector<plint> const& missingIndices = 
00484         indexTemplates::subIndexOutgoing<Descriptor<T>,direction,orientation>();
00485     bool automaticPrepareCollision = false;
00486     return new GeneralizedDensityBoundaryDynamics<T,Descriptor,direction,orientation>
00487                    (baseDynamics,missingIndices,automaticPrepareCollision);
00488 }
00489 
00490 template<typename T, template<typename U> class Descriptor>
00491 template<int direction, int orientation>
00492 BoxProcessingFunctional2D_L<T,Descriptor>*
00493     WrappedMassConservingGeneralizedBoundaryManager2D<T,Descriptor>::
00494         getPressureBoundaryFunctional()
00495 {
00496     return new WrappedLocalBoundaryFunctional2D<T,Descriptor>();
00497 }
00498 
00499 template<typename T, template<typename U> class Descriptor>
00500 template<int xNormal, int yNormal>
00501 BoundaryCompositeDynamics<T,Descriptor>* WrappedMassConservingGeneralizedBoundaryManager2D<T,Descriptor>::
00502     getExternalVelocityCornerDynamics(Dynamics<T,Descriptor>* baseDynamics)
00503 {
00504     std::vector<plint> const& missingIndices = 
00505         indexTemplates::subIndexOutgoingCorner2D<Descriptor<T>,xNormal,yNormal>();
00506         
00507     std::vector<plint> const& knownIndices = 
00508         indexTemplates::opposite<Descriptor<T> >(indexTemplates::subIndexIngoingCorner2D<Descriptor<T>,xNormal,yNormal>());
00509     
00510     std::vector<plint> inGoingIndices;
00511     inGoingIndices.push_back(indexTemplates::findVelocity<Descriptor<T> >(Array<plint,2>(-xNormal,-yNormal)));
00512         
00513     bool automaticPrepareCollision = false;
00514     return new GeneralizedMassConservingVelocityBoundaryDynamics<T,Descriptor>(
00515             baseDynamics,missingIndices,knownIndices,inGoingIndices,automaticPrepareCollision);
00516 }
00517 
00518 template<typename T, template<typename U> class Descriptor>
00519 template<int xNormal, int yNormal>
00520 BoxProcessingFunctional2D_L<T,Descriptor>*
00521     WrappedMassConservingGeneralizedBoundaryManager2D<T,Descriptor>::
00522         getExternalVelocityCornerFunctional()
00523 {
00524     return new WrappedLocalBoundaryFunctional2D<T,Descriptor>();
00525 }
00526 
00527 template<typename T, template<typename U> class Descriptor>
00528 template<int xNormal, int yNormal>
00529 BoundaryCompositeDynamics<T,Descriptor>*
00530     WrappedMassConservingGeneralizedBoundaryManager2D<T,Descriptor>::
00531         getInternalVelocityCornerDynamics(Dynamics<T,Descriptor>* baseDynamics)
00532 {
00533     std::vector<plint> const& missingIndices =   
00534         indexTemplates::subIndexOutgoingInternalCorner2D<Descriptor<T>,xNormal,yNormal>();
00535         
00536     std::vector<plint> const& knownIndices = 
00537         indexTemplates::opposite<Descriptor<T> >(missingIndices);
00538         
00539     bool automaticPrepareCollision = false;
00540     
00541     return new GeneralizedMassConservingVelocityBoundaryDynamics<T,Descriptor>(
00542             baseDynamics,missingIndices,knownIndices,missingIndices,automaticPrepareCollision);
00543 }
00544 
00545 template<typename T, template<typename U> class Descriptor>
00546 template<int xNormal, int yNormal>
00547 BoxProcessingFunctional2D_L<T,Descriptor>*
00548     WrappedMassConservingGeneralizedBoundaryManager2D<T,Descriptor>::getInternalVelocityCornerFunctional()
00549 {
00550     return new WrappedLocalBoundaryFunctional2D<T,Descriptor>();
00551 }
00552 
00554 
00555 template<typename T, template<typename U> class Descriptor>
00556 OnLatticeBoundaryCondition2D<T,Descriptor>* createGeneralizedBoundaryCondition2D() {
00557     return new BoundaryConditionInstantiator2D <
00558                    T, Descriptor,
00559                    WrappedGeneralizedBoundaryManager2D<T,Descriptor> >;
00560 }
00561 
00562 template<typename T, template<typename U> class Descriptor>
00563 OnLatticeBoundaryCondition2D<T,Descriptor>* createDynamicsBasedGeneralizedBoundaryCondition2D() {
00564     return new BoundaryConditionInstantiator2D <
00565                    T, Descriptor,
00566                    GeneralizedBoundaryManager2D<T,Descriptor> >;
00567 }
00568 
00569 template<typename T, template<typename U> class Descriptor>
00570 OnLatticeBoundaryCondition2D<T,Descriptor>* createGeneralizedMassConservingBoundaryCondition2D() {
00571     return new BoundaryConditionInstantiator2D <
00572                    T, Descriptor,
00573                    WrappedMassConservingGeneralizedBoundaryManager2D<T,Descriptor> >;
00574 }
00575 
00576 template<typename T, template<typename U> class Descriptor>
00577 OnLatticeBoundaryCondition2D<T,Descriptor>* createDynamicsBasedMassConservingGeneralizedBoundaryCondition2D() {
00578     return new BoundaryConditionInstantiator2D <
00579                    T, Descriptor,
00580                    MassConservingGeneralizedBoundaryManager2D<T,Descriptor> >;
00581 }
00582 
00583 }  // namespace plb
00584 
00585 #endif  // GENERALIZED_BOUNDARY_CONDITION_2D_HH