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

boundaryCondition3D.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 BOUNDARY_CONDITION_3D_HH
00029 #define 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 "boundaryCondition/wrappedLocalBoundaryProcessor3D.h"
00036 #include "boundaryCondition/wrappedLocalBoundaryProcessor3D.h"
00037 #include "core/blockSurface3D.h"
00038 #include "core/plbDebug.h"
00039 
00040 namespace plb {
00041 
00042 // PART I: Atomic-block version.
00043 
00044 template<typename T, template<typename U> class Descriptor>
00045 void OnLatticeBoundaryCondition3D<T,Descriptor>::setVelocityConditionOnBlockBoundaries (
00046         BlockLattice3D<T,Descriptor>& lattice,
00047         boundary::BcType bcType )
00048 {
00049     setVelocityConditionOnBlockBoundaries (
00050             lattice, lattice.getBoundingBox(), bcType );
00051 }
00052 
00053 template<typename T, template<typename U> class Descriptor>
00054 void OnLatticeBoundaryCondition3D<T,Descriptor>::setVelocityConditionOnBlockBoundaries (
00055         BlockLattice3D<T,Descriptor>& lattice,
00056         Box3D applicationDomain,
00057         boundary::BcType bcType )
00058 {
00059     setVelocityConditionOnBlockBoundaries (
00060             lattice, lattice.getBoundingBox(), applicationDomain, bcType );
00061 }
00062 
00063 
00064 template<typename T, template<typename U> class Descriptor>
00065 void OnLatticeBoundaryCondition3D<T,Descriptor>::setVelocityConditionOnBlockBoundaries (
00066         BlockLattice3D<T,Descriptor>& lattice,
00067         Box3D block, Box3D applicationDomain,
00068         boundary::BcType bcType )
00069 {
00070     plint boundaryWidth = 1;
00071     BlockSurface3D surf(block, boundaryWidth);
00072     Box3D intersection;
00073     if (intersect(surf.surface0N(), applicationDomain, intersection)) {
00074         addVelocityBoundary0N(intersection, lattice, bcType);
00075     }
00076     if (intersect(surf.surface0P(), applicationDomain, intersection)) {
00077         addVelocityBoundary0P(intersection, lattice, bcType);
00078     }
00079     if (intersect(surf.surface1N(), applicationDomain, intersection)) {
00080         addVelocityBoundary1N(intersection, lattice, bcType);
00081     }
00082     if (intersect(surf.surface1P(), applicationDomain, intersection)) {
00083         addVelocityBoundary1P(intersection, lattice, bcType);
00084     }
00085     if (intersect(surf.surface2N(), applicationDomain, intersection)) {
00086         addVelocityBoundary2N(intersection, lattice, bcType);
00087     }
00088     if (intersect(surf.surface2P(), applicationDomain, intersection)) {
00089         addVelocityBoundary2P(intersection, lattice, bcType);
00090     }
00091 
00092     if (intersect(surf.edge0NN(), applicationDomain, intersection)) {
00093         addExternalVelocityEdge0NN(intersection, lattice, bcType);
00094     }
00095     if (intersect(surf.edge0NP(), applicationDomain, intersection)) {
00096         addExternalVelocityEdge0NP(intersection, lattice, bcType);
00097     }
00098     if (intersect(surf.edge0PN(), applicationDomain, intersection)) {
00099         addExternalVelocityEdge0PN(intersection, lattice, bcType);
00100     }
00101     if (intersect(surf.edge0PP(), applicationDomain, intersection)) {
00102         addExternalVelocityEdge0PP(intersection, lattice, bcType);
00103     }
00104 
00105     if (intersect(surf.edge1NN(), applicationDomain, intersection)) {
00106         addExternalVelocityEdge1NN(intersection, lattice, bcType);
00107     }
00108     if (intersect(surf.edge1NP(), applicationDomain, intersection)) {
00109         addExternalVelocityEdge1NP(intersection, lattice, bcType);
00110     }
00111     if (intersect(surf.edge1PN(), applicationDomain, intersection)) {
00112         addExternalVelocityEdge1PN(intersection, lattice, bcType);
00113     }
00114     if (intersect(surf.edge1PP(), applicationDomain, intersection)) {
00115         addExternalVelocityEdge1PP(intersection, lattice, bcType);
00116     }
00117 
00118     if (intersect(surf.edge2NN(), applicationDomain, intersection)) {
00119         addExternalVelocityEdge2NN(intersection, lattice, bcType);
00120     }
00121     if (intersect(surf.edge2NP(), applicationDomain, intersection)) {
00122         addExternalVelocityEdge2NP(intersection, lattice, bcType);
00123     }
00124     if (intersect(surf.edge2PN(), applicationDomain, intersection)) {
00125         addExternalVelocityEdge2PN(intersection, lattice, bcType);
00126     }
00127     if (intersect(surf.edge2PP(), applicationDomain, intersection)) {
00128         addExternalVelocityEdge2PP(intersection, lattice, bcType);
00129     }
00130 
00131     if (intersect(surf.cornerNNN(), applicationDomain, intersection)) {
00132         addExternalVelocityCornerNNN (
00133                 intersection.x0, intersection.y0, intersection.z0, lattice, bcType);
00134     }
00135     if (intersect(surf.cornerNNP(), applicationDomain, intersection)) {
00136         addExternalVelocityCornerNNP (
00137                 intersection.x0, intersection.y0, intersection.z0, lattice, bcType);
00138     }
00139     if (intersect(surf.cornerNPN(), applicationDomain, intersection)) {
00140         addExternalVelocityCornerNPN (
00141                 intersection.x0, intersection.y0, intersection.z0, lattice, bcType);
00142     }
00143     if (intersect(surf.cornerNPP(), applicationDomain, intersection)) {
00144         addExternalVelocityCornerNPP (
00145                 intersection.x0, intersection.y0, intersection.z0, lattice, bcType);
00146     }
00147     if (intersect(surf.cornerPNN(), applicationDomain, intersection)) {
00148         addExternalVelocityCornerPNN (
00149                 intersection.x0, intersection.y0, intersection.z0, lattice, bcType);
00150     }
00151     if (intersect(surf.cornerPNP(), applicationDomain, intersection)) {
00152         addExternalVelocityCornerPNP (
00153                 intersection.x0, intersection.y0, intersection.z0, lattice, bcType);
00154     }
00155     if (intersect(surf.cornerPPN(), applicationDomain, intersection)) {
00156         addExternalVelocityCornerPPN (
00157                 intersection.x0, intersection.y0, intersection.z0, lattice, bcType);
00158     }
00159     if (intersect(surf.cornerPPP(), applicationDomain, intersection)) {
00160         addExternalVelocityCornerPPP (
00161                 intersection.x0, intersection.y0, intersection.z0, lattice, bcType);
00162     }
00163 }
00164 
00165 template<typename T, template<typename U> class Descriptor>
00166 void OnLatticeBoundaryCondition3D<T,Descriptor>::setPressureConditionOnBlockBoundaries (
00167         BlockLattice3D<T,Descriptor>& lattice,
00168         boundary::BcType bcType )
00169 {
00170     setPressureConditionOnBlockBoundaries (
00171             lattice, lattice.getBoundingBox(), bcType );
00172 }
00173 
00174 template<typename T, template<typename U> class Descriptor>
00175 void OnLatticeBoundaryCondition3D<T,Descriptor>::setPressureConditionOnBlockBoundaries (
00176         BlockLattice3D<T,Descriptor>& lattice,
00177         Box3D applicationDomain,
00178         boundary::BcType bcType )
00179 {
00180     setPressureConditionOnBlockBoundaries (
00181             lattice, lattice.getBoundingBox(), applicationDomain, bcType );
00182 }
00183 
00184 
00185 template<typename T, template<typename U> class Descriptor>
00186 void OnLatticeBoundaryCondition3D<T,Descriptor>::setPressureConditionOnBlockBoundaries (
00187         BlockLattice3D<T,Descriptor>& lattice,
00188         Box3D block, Box3D applicationDomain,
00189         boundary::BcType bcType )
00190 {
00191     plint boundaryWidth = 1;
00192     BlockSurface3D surf(block, boundaryWidth);
00193     Box3D intersection;
00194     if (intersect(surf.surface0N(), applicationDomain, intersection)) {
00195         addPressureBoundary0N(intersection, lattice, bcType);
00196     }
00197     if (intersect(surf.surface0P(), applicationDomain, intersection)) {
00198         addPressureBoundary0P(intersection, lattice, bcType);
00199     }
00200     if (intersect(surf.surface1N(), applicationDomain, intersection)) {
00201         addPressureBoundary1N(intersection, lattice, bcType);
00202     }
00203     if (intersect(surf.surface1P(), applicationDomain, intersection)) {
00204         addPressureBoundary1P(intersection, lattice, bcType);
00205     }
00206     if (intersect(surf.surface2N(), applicationDomain, intersection)) {
00207         addPressureBoundary2N(intersection, lattice, bcType);
00208     }
00209     if (intersect(surf.surface2P(), applicationDomain, intersection)) {
00210         addPressureBoundary2P(intersection, lattice, bcType);
00211     }
00212 
00213     if (intersect(surf.edge0NN(), applicationDomain, intersection)) {
00214         PLB_ASSERT( false );
00215     }
00216     if (intersect(surf.edge0NP(), applicationDomain, intersection)) {
00217         PLB_ASSERT( false );
00218     }
00219     if (intersect(surf.edge0PN(), applicationDomain, intersection)) {
00220         PLB_ASSERT( false );
00221     }
00222     if (intersect(surf.edge0PP(), applicationDomain, intersection)) {
00223         PLB_ASSERT( false );
00224     }
00225 
00226     if (intersect(surf.edge1NN(), applicationDomain, intersection)) {
00227         PLB_ASSERT( false );
00228     }
00229     if (intersect(surf.edge1NP(), applicationDomain, intersection)) {
00230         PLB_ASSERT( false );
00231     }
00232     if (intersect(surf.edge1PN(), applicationDomain, intersection)) {
00233         PLB_ASSERT( false );
00234     }
00235     if (intersect(surf.edge1PP(), applicationDomain, intersection)) {
00236         PLB_ASSERT( false );
00237     }
00238 
00239     if (intersect(surf.edge2NN(), applicationDomain, intersection)) {
00240         PLB_ASSERT( false );
00241     }
00242     if (intersect(surf.edge2NP(), applicationDomain, intersection)) {
00243         PLB_ASSERT( false );
00244     }
00245     if (intersect(surf.edge2PN(), applicationDomain, intersection)) {
00246         PLB_ASSERT( false );
00247     }
00248     if (intersect(surf.edge2PP(), applicationDomain, intersection)) {
00249         PLB_ASSERT( false );
00250     }
00251 
00252     if (intersect(surf.cornerNNN(), applicationDomain, intersection)) {
00253         PLB_ASSERT( false );
00254     }
00255     if (intersect(surf.cornerNNP(), applicationDomain, intersection)) {
00256         PLB_ASSERT( false );
00257     }
00258     if (intersect(surf.cornerNPN(), applicationDomain, intersection)) {
00259         PLB_ASSERT( false );
00260     }
00261     if (intersect(surf.cornerNPP(), applicationDomain, intersection)) {
00262         PLB_ASSERT( false );
00263     }
00264     if (intersect(surf.cornerPNN(), applicationDomain, intersection)) {
00265         PLB_ASSERT( false );
00266     }
00267     if (intersect(surf.cornerPNP(), applicationDomain, intersection)) {
00268         PLB_ASSERT( false );
00269     }
00270     if (intersect(surf.cornerPPN(), applicationDomain, intersection)) {
00271         PLB_ASSERT( false );
00272     }
00273     if (intersect(surf.cornerPPP(), applicationDomain, intersection)) {
00274         PLB_ASSERT( false );
00275     }
00276 }
00277 
00278 // PART I: Multi-block version.
00279 
00280 template<typename T, template<typename U> class Descriptor>
00281 void OnLatticeBoundaryCondition3D<T,Descriptor>::setVelocityConditionOnBlockBoundaries (
00282         MultiBlockLattice3D<T,Descriptor>& lattice,
00283         boundary::BcType bcType )
00284 {
00285     setVelocityConditionOnBlockBoundaries (
00286             lattice, lattice.getBoundingBox(), bcType );
00287 }
00288 
00289 template<typename T, template<typename U> class Descriptor>
00290 void OnLatticeBoundaryCondition3D<T,Descriptor>::setVelocityConditionOnBlockBoundaries (
00291         MultiBlockLattice3D<T,Descriptor>& lattice,
00292         Box3D applicationDomain,
00293         boundary::BcType bcType )
00294 {
00295     setVelocityConditionOnBlockBoundaries (
00296             lattice, lattice.getBoundingBox(), applicationDomain, bcType );
00297 }
00298 
00299 
00300 template<typename T, template<typename U> class Descriptor>
00301 void OnLatticeBoundaryCondition3D<T,Descriptor>::setVelocityConditionOnBlockBoundaries (
00302         MultiBlockLattice3D<T,Descriptor>& lattice,
00303         Box3D block, Box3D applicationDomain,
00304         boundary::BcType bcType )
00305 {
00306     plint boundaryWidth = 1;
00307     BlockSurface3D surf(block, boundaryWidth);
00308     Box3D intersection;
00309     if (intersect(surf.surface0N(), applicationDomain, intersection)) {
00310         addVelocityBoundary0N(intersection, lattice, bcType);
00311     }
00312     if (intersect(surf.surface0P(), applicationDomain, intersection)) {
00313         addVelocityBoundary0P(intersection, lattice, bcType);
00314     }
00315     if (intersect(surf.surface1N(), applicationDomain, intersection)) {
00316         addVelocityBoundary1N(intersection, lattice, bcType);
00317     }
00318     if (intersect(surf.surface1P(), applicationDomain, intersection)) {
00319         addVelocityBoundary1P(intersection, lattice, bcType);
00320     }
00321     if (intersect(surf.surface2N(), applicationDomain, intersection)) {
00322         addVelocityBoundary2N(intersection, lattice, bcType);
00323     }
00324     if (intersect(surf.surface2P(), applicationDomain, intersection)) {
00325         addVelocityBoundary2P(intersection, lattice, bcType);
00326     }
00327 
00328     if (intersect(surf.edge0NN(), applicationDomain, intersection)) {
00329         addExternalVelocityEdge0NN(intersection, lattice, bcType);
00330     }
00331     if (intersect(surf.edge0NP(), applicationDomain, intersection)) {
00332         addExternalVelocityEdge0NP(intersection, lattice, bcType);
00333     }
00334     if (intersect(surf.edge0PN(), applicationDomain, intersection)) {
00335         addExternalVelocityEdge0PN(intersection, lattice, bcType);
00336     }
00337     if (intersect(surf.edge0PP(), applicationDomain, intersection)) {
00338         addExternalVelocityEdge0PP(intersection, lattice, bcType);
00339     }
00340 
00341     if (intersect(surf.edge1NN(), applicationDomain, intersection)) {
00342         addExternalVelocityEdge1NN(intersection, lattice, bcType);
00343     }
00344     if (intersect(surf.edge1NP(), applicationDomain, intersection)) {
00345         addExternalVelocityEdge1NP(intersection, lattice, bcType);
00346     }
00347     if (intersect(surf.edge1PN(), applicationDomain, intersection)) {
00348         addExternalVelocityEdge1PN(intersection, lattice, bcType);
00349     }
00350     if (intersect(surf.edge1PP(), applicationDomain, intersection)) {
00351         addExternalVelocityEdge1PP(intersection, lattice, bcType);
00352     }
00353 
00354     if (intersect(surf.edge2NN(), applicationDomain, intersection)) {
00355         addExternalVelocityEdge2NN(intersection, lattice, bcType);
00356     }
00357     if (intersect(surf.edge2NP(), applicationDomain, intersection)) {
00358         addExternalVelocityEdge2NP(intersection, lattice, bcType);
00359     }
00360     if (intersect(surf.edge2PN(), applicationDomain, intersection)) {
00361         addExternalVelocityEdge2PN(intersection, lattice, bcType);
00362     }
00363     if (intersect(surf.edge2PP(), applicationDomain, intersection)) {
00364         addExternalVelocityEdge2PP(intersection, lattice, bcType);
00365     }
00366 
00367     if (intersect(surf.cornerNNN(), applicationDomain, intersection)) {
00368         addExternalVelocityCornerNNN (
00369                 intersection.x0, intersection.y0, intersection.z0, lattice, bcType);
00370     }
00371     if (intersect(surf.cornerNNP(), applicationDomain, intersection)) {
00372         addExternalVelocityCornerNNP (
00373                 intersection.x0, intersection.y0, intersection.z0, lattice, bcType);
00374     }
00375     if (intersect(surf.cornerNPN(), applicationDomain, intersection)) {
00376         addExternalVelocityCornerNPN (
00377                 intersection.x0, intersection.y0, intersection.z0, lattice, bcType);
00378     }
00379     if (intersect(surf.cornerNPP(), applicationDomain, intersection)) {
00380         addExternalVelocityCornerNPP (
00381                 intersection.x0, intersection.y0, intersection.z0, lattice, bcType);
00382     }
00383     if (intersect(surf.cornerPNN(), applicationDomain, intersection)) {
00384         addExternalVelocityCornerPNN (
00385                 intersection.x0, intersection.y0, intersection.z0, lattice, bcType);
00386     }
00387     if (intersect(surf.cornerPNP(), applicationDomain, intersection)) {
00388         addExternalVelocityCornerPNP (
00389                 intersection.x0, intersection.y0, intersection.z0, lattice, bcType);
00390     }
00391     if (intersect(surf.cornerPPN(), applicationDomain, intersection)) {
00392         addExternalVelocityCornerPPN (
00393                 intersection.x0, intersection.y0, intersection.z0, lattice, bcType);
00394     }
00395     if (intersect(surf.cornerPPP(), applicationDomain, intersection)) {
00396         addExternalVelocityCornerPPP (
00397                 intersection.x0, intersection.y0, intersection.z0, lattice, bcType);
00398     }
00399 }
00400 
00401 template<typename T, template<typename U> class Descriptor>
00402 void OnLatticeBoundaryCondition3D<T,Descriptor>::setPressureConditionOnBlockBoundaries (
00403         MultiBlockLattice3D<T,Descriptor>& lattice,
00404         boundary::BcType bcType )
00405 {
00406     setPressureConditionOnBlockBoundaries (
00407             lattice, lattice.getBoundingBox(), bcType );
00408 }
00409 
00410 template<typename T, template<typename U> class Descriptor>
00411 void OnLatticeBoundaryCondition3D<T,Descriptor>::setPressureConditionOnBlockBoundaries (
00412         MultiBlockLattice3D<T,Descriptor>& lattice,
00413         Box3D applicationDomain,
00414         boundary::BcType bcType )
00415 {
00416     setPressureConditionOnBlockBoundaries (
00417             lattice, lattice.getBoundingBox(), applicationDomain, bcType );
00418 }
00419 
00420 
00421 template<typename T, template<typename U> class Descriptor>
00422 void OnLatticeBoundaryCondition3D<T,Descriptor>::setPressureConditionOnBlockBoundaries (
00423         MultiBlockLattice3D<T,Descriptor>& lattice,
00424         Box3D block, Box3D applicationDomain,
00425         boundary::BcType bcType )
00426 {
00427     plint boundaryWidth = 1;
00428     BlockSurface3D surf(block, boundaryWidth);
00429     Box3D intersection;
00430     if (intersect(surf.surface0N(), applicationDomain, intersection)) {
00431         addPressureBoundary0N(intersection, lattice, bcType);
00432     }
00433     if (intersect(surf.surface0P(), applicationDomain, intersection)) {
00434         addPressureBoundary0P(intersection, lattice, bcType);
00435     }
00436     if (intersect(surf.surface1N(), applicationDomain, intersection)) {
00437         addPressureBoundary1N(intersection, lattice, bcType);
00438     }
00439     if (intersect(surf.surface1P(), applicationDomain, intersection)) {
00440         addPressureBoundary1P(intersection, lattice, bcType);
00441     }
00442     if (intersect(surf.surface2N(), applicationDomain, intersection)) {
00443         addPressureBoundary2N(intersection, lattice, bcType);
00444     }
00445     if (intersect(surf.surface2P(), applicationDomain, intersection)) {
00446         addPressureBoundary2P(intersection, lattice, bcType);
00447     }
00448 
00449     /*
00450     if (intersect(surf.edge0NN(), applicationDomain, intersection)) {
00451         PLB_ASSERT( false );
00452     }
00453     if (intersect(surf.edge0NP(), applicationDomain, intersection)) {
00454         PLB_ASSERT( false );
00455     }
00456     if (intersect(surf.edge0PN(), applicationDomain, intersection)) {
00457         PLB_ASSERT( false );
00458     }
00459     if (intersect(surf.edge0PP(), applicationDomain, intersection)) {
00460         PLB_ASSERT( false );
00461     }
00462 
00463     if (intersect(surf.edge1NN(), applicationDomain, intersection)) {
00464         PLB_ASSERT( false );
00465     }
00466     if (intersect(surf.edge1NP(), applicationDomain, intersection)) {
00467         PLB_ASSERT( false );
00468     }
00469     if (intersect(surf.edge1PN(), applicationDomain, intersection)) {
00470         PLB_ASSERT( false );
00471     }
00472     if (intersect(surf.edge1PP(), applicationDomain, intersection)) {
00473         PLB_ASSERT( false );
00474     }
00475 
00476     if (intersect(surf.edge2NN(), applicationDomain, intersection)) {
00477         PLB_ASSERT( false );
00478     }
00479     if (intersect(surf.edge2NP(), applicationDomain, intersection)) {
00480         PLB_ASSERT( false );
00481     }
00482     if (intersect(surf.edge2PN(), applicationDomain, intersection)) {
00483         PLB_ASSERT( false );
00484     }
00485     if (intersect(surf.edge2PP(), applicationDomain, intersection)) {
00486         PLB_ASSERT( false );
00487     }
00488 
00489     if (intersect(surf.cornerNNN(), applicationDomain, intersection)) {
00490         PLB_ASSERT( false );
00491     }
00492     if (intersect(surf.cornerNNP(), applicationDomain, intersection)) {
00493         PLB_ASSERT( false );
00494     }
00495     if (intersect(surf.cornerNPN(), applicationDomain, intersection)) {
00496         PLB_ASSERT( false );
00497     }
00498     if (intersect(surf.cornerNPP(), applicationDomain, intersection)) {
00499         PLB_ASSERT( false );
00500     }
00501     if (intersect(surf.cornerPNN(), applicationDomain, intersection)) {
00502         PLB_ASSERT( false );
00503     }
00504     if (intersect(surf.cornerPNP(), applicationDomain, intersection)) {
00505         PLB_ASSERT( false );
00506     }
00507     if (intersect(surf.cornerPPN(), applicationDomain, intersection)) {
00508         PLB_ASSERT( false );
00509     }
00510     if (intersect(surf.cornerPPP(), applicationDomain, intersection)) {
00511         PLB_ASSERT( false );
00512     }
00513     */
00514 }
00515 
00516 template<typename T, template<typename U> class Descriptor>
00517 class RegularizedBoundaryManager3D {
00518 public:
00519     template<int direction, int orientation>
00520         static BoundaryCompositeDynamics<T,Descriptor>*
00521             getVelocityBoundaryDynamics(Dynamics<T,Descriptor>* baseDynamics);
00522 
00523     template<int direction, int orientation>
00524         static BoxProcessingFunctional3D_L<T,Descriptor>*
00525             getVelocityBoundaryFunctional();
00526 
00527     template<int direction, int orientation>
00528         static BoundaryCompositeDynamics<T,Descriptor>*
00529             getPressureBoundaryDynamics(Dynamics<T,Descriptor>* baseDynamics);
00530 
00531     template<int direction, int orientation>
00532         static BoxProcessingFunctional3D_L<T,Descriptor>*
00533             getPressureBoundaryFunctional();
00534 
00535     template<int plane, int normal1, int normal2>
00536         static BoundaryCompositeDynamics<T,Descriptor>*
00537             getExternalVelocityEdgeDynamics(Dynamics<T,Descriptor>* baseDynamics);
00538 
00539     template<int plane, int normal1, int normal2>
00540         static BoxProcessingFunctional3D_L<T,Descriptor>*
00541             getExternalVelocityEdgeFunctional();
00542 
00543     template<int plane, int normal1, int normal2>
00544         static BoundaryCompositeDynamics<T,Descriptor>*
00545             getInternalVelocityEdgeDynamics(Dynamics<T,Descriptor>* baseDynamics);
00546     template<int plane, int normal1, int normal2>
00547         static BoxProcessingFunctional3D_L<T,Descriptor>*
00548             getInternalVelocityEdgeFunctional();
00549 
00550     template<int xNormal, int yNormal, int zNormal>
00551         static BoundaryCompositeDynamics<T,Descriptor>*
00552             getExternalVelocityCornerDynamics(Dynamics<T,Descriptor>* baseDynamics);
00553     template<int xNormal, int yNormal, int zNormal>
00554         static BoxProcessingFunctional3D_L<T,Descriptor>*
00555             getExternalVelocityCornerFunctional();
00556 
00557     template<int xNormal, int yNormal, int zNormal>
00558         static BoundaryCompositeDynamics<T,Descriptor>*
00559             getInternalVelocityCornerDynamics(Dynamics<T,Descriptor>* baseDynamics);
00560     template<int xNormal, int yNormal, int zNormal>
00561         static BoxProcessingFunctional3D_L<T,Descriptor>*
00562             getInternalVelocityCornerFunctional();
00563 };
00564 
00565 template<typename T, template<typename U> class Descriptor>
00566 class WrappedRegularizedBoundaryManager3D {
00567 public:
00568     template<int direction, int orientation>
00569         static BoundaryCompositeDynamics<T,Descriptor>*
00570             getVelocityBoundaryDynamics(Dynamics<T,Descriptor>* baseDynamics);
00571 
00572     template<int direction, int orientation>
00573         static BoxProcessingFunctional3D_L<T,Descriptor>*
00574             getVelocityBoundaryFunctional();
00575 
00576     template<int direction, int orientation>
00577         static BoundaryCompositeDynamics<T,Descriptor>*
00578             getPressureBoundaryDynamics(Dynamics<T,Descriptor>* baseDynamics);
00579 
00580     template<int direction, int orientation>
00581         static BoxProcessingFunctional3D_L<T,Descriptor>*
00582             getPressureBoundaryFunctional();
00583 
00584     template<int plane, int normal1, int normal2>
00585         static BoundaryCompositeDynamics<T,Descriptor>*
00586             getExternalVelocityEdgeDynamics(Dynamics<T,Descriptor>* baseDynamics);
00587 
00588     template<int plane, int normal1, int normal2>
00589         static BoxProcessingFunctional3D_L<T,Descriptor>*
00590             getExternalVelocityEdgeFunctional();
00591 
00592     template<int plane, int normal1, int normal2>
00593         static BoundaryCompositeDynamics<T,Descriptor>*
00594             getInternalVelocityEdgeDynamics(Dynamics<T,Descriptor>* baseDynamics);
00595     template<int plane, int normal1, int normal2>
00596         static BoxProcessingFunctional3D_L<T,Descriptor>*
00597             getInternalVelocityEdgeFunctional();
00598 
00599     template<int xNormal, int yNormal, int zNormal>
00600         static BoundaryCompositeDynamics<T,Descriptor>*
00601             getExternalVelocityCornerDynamics(Dynamics<T,Descriptor>* baseDynamics);
00602     template<int xNormal, int yNormal, int zNormal>
00603         static BoxProcessingFunctional3D_L<T,Descriptor>*
00604             getExternalVelocityCornerFunctional();
00605 
00606     template<int xNormal, int yNormal, int zNormal>
00607         static BoundaryCompositeDynamics<T,Descriptor>*
00608             getInternalVelocityCornerDynamics(Dynamics<T,Descriptor>* baseDynamics);
00609     template<int xNormal, int yNormal, int zNormal>
00610         static BoxProcessingFunctional3D_L<T,Descriptor>*
00611             getInternalVelocityCornerFunctional();
00612 };
00613 
00614 template<typename T, template<typename U> class Descriptor>
00615 class EquilibriumBoundaryManager3D {
00616 public:
00617     template<int direction, int orientation>
00618         static BoundaryCompositeDynamics<T,Descriptor>*
00619             getVelocityBoundaryDynamics(Dynamics<T,Descriptor>* baseDynamics);
00620 
00621     template<int direction, int orientation>
00622         static BoxProcessingFunctional3D_L<T,Descriptor>*
00623             getVelocityBoundaryFunctional();
00624 
00625     template<int direction, int orientation>
00626         static BoundaryCompositeDynamics<T,Descriptor>*
00627             getPressureBoundaryDynamics(Dynamics<T,Descriptor>* baseDynamics);
00628 
00629     template<int direction, int orientation>
00630         static BoxProcessingFunctional3D_L<T,Descriptor>*
00631             getPressureBoundaryFunctional();
00632 
00633     template<int plane, int normal1, int normal2>
00634         static BoundaryCompositeDynamics<T,Descriptor>*
00635             getExternalVelocityEdgeDynamics(Dynamics<T,Descriptor>* baseDynamics);
00636 
00637     template<int plane, int normal1, int normal2>
00638         static BoxProcessingFunctional3D_L<T,Descriptor>*
00639             getExternalVelocityEdgeFunctional();
00640 
00641     template<int plane, int normal1, int normal2>
00642         static BoundaryCompositeDynamics<T,Descriptor>*
00643             getInternalVelocityEdgeDynamics(Dynamics<T,Descriptor>* baseDynamics);
00644     template<int plane, int normal1, int normal2>
00645         static BoxProcessingFunctional3D_L<T,Descriptor>*
00646             getInternalVelocityEdgeFunctional();
00647 
00648     template<int xNormal, int yNormal, int zNormal>
00649         static BoundaryCompositeDynamics<T,Descriptor>*
00650             getExternalVelocityCornerDynamics(Dynamics<T,Descriptor>* baseDynamics);
00651     template<int xNormal, int yNormal, int zNormal>
00652         static BoxProcessingFunctional3D_L<T,Descriptor>*
00653             getExternalVelocityCornerFunctional();
00654 
00655     template<int xNormal, int yNormal, int zNormal>
00656         static BoundaryCompositeDynamics<T,Descriptor>*
00657             getInternalVelocityCornerDynamics(Dynamics<T,Descriptor>* baseDynamics);
00658     template<int xNormal, int yNormal, int zNormal>
00659         static BoxProcessingFunctional3D_L<T,Descriptor>*
00660             getInternalVelocityCornerFunctional();
00661 };
00662 
00663 template<typename T, template<typename U> class Descriptor>
00664 class InterpolationBoundaryManager3D {
00665 public:
00666     template<int direction, int orientation>
00667         static BoundaryCompositeDynamics<T,Descriptor>*
00668             getVelocityBoundaryDynamics(Dynamics<T,Descriptor>* baseDynamics);
00669     template<int direction, int orientation>
00670         static BoxProcessingFunctional3D_L<T,Descriptor>*
00671             getVelocityBoundaryFunctional();
00672 
00673     template<int direction, int orientation>
00674         static BoundaryCompositeDynamics<T,Descriptor>*
00675             getPressureBoundaryDynamics(Dynamics<T,Descriptor>* baseDynamics);
00676     template<int direction, int orientation>
00677         static BoxProcessingFunctional3D_L<T,Descriptor>*
00678             getPressureBoundaryFunctional();
00679 
00680     template<int plane, int normal1, int normal2>
00681         static BoundaryCompositeDynamics<T,Descriptor>*
00682             getExternalVelocityEdgeDynamics(Dynamics<T,Descriptor>* baseDynamics);
00683     template<int plane, int normal1, int normal2>
00684         static BoxProcessingFunctional3D_L<T,Descriptor>*
00685             getExternalVelocityEdgeFunctional();
00686 
00687     template<int plane, int normal1, int normal2>
00688         static BoundaryCompositeDynamics<T,Descriptor>*
00689             getInternalVelocityEdgeDynamics(Dynamics<T,Descriptor>* baseDynamics);
00690     template<int plane, int normal1, int normal2>
00691         static BoxProcessingFunctional3D_L<T,Descriptor>*
00692             getInternalVelocityEdgeFunctional();
00693 
00694     template<int xNormal, int yNormal, int zNormal>
00695         static BoundaryCompositeDynamics<T,Descriptor>*
00696             getExternalVelocityCornerDynamics(Dynamics<T,Descriptor>* baseDynamics);
00697     template<int xNormal, int yNormal, int zNormal>
00698         static BoxProcessingFunctional3D_L<T,Descriptor>*
00699             getExternalVelocityCornerFunctional();
00700 
00701     template<int xNormal, int yNormal, int zNormal>
00702         static BoundaryCompositeDynamics<T,Descriptor>*
00703             getInternalVelocityCornerDynamics(Dynamics<T,Descriptor>* baseDynamics);
00704     template<int xNormal, int yNormal, int zNormal>
00705         static BoxProcessingFunctional3D_L<T,Descriptor>*
00706             getInternalVelocityCornerFunctional();
00707 };
00708 
00709 
00711 
00712 template<typename T, template<typename U> class Descriptor>
00713 template<int direction, int orientation>
00714 BoundaryCompositeDynamics<T,Descriptor>* RegularizedBoundaryManager3D<T,Descriptor>::
00715     getVelocityBoundaryDynamics(Dynamics<T,Descriptor>* baseDynamics)
00716 {
00717     return new RegularizedVelocityBoundaryDynamics
00718                    <T,Descriptor,direction,orientation>(baseDynamics);
00719 }
00720 
00721 template<typename T, template<typename U> class Descriptor>
00722 template<int direction, int orientation>
00723 BoxProcessingFunctional3D_L<T,Descriptor>*
00724     RegularizedBoundaryManager3D<T,Descriptor>::
00725         getVelocityBoundaryFunctional()
00726 {
00727     return 0;
00728 }
00729 
00730 template<typename T, template<typename U> class Descriptor>
00731 template<int direction, int orientation>
00732 BoundaryCompositeDynamics<T,Descriptor>* RegularizedBoundaryManager3D<T,Descriptor>::
00733     getPressureBoundaryDynamics(Dynamics<T,Descriptor>* baseDynamics)
00734 {
00735     return new RegularizedDensityBoundaryDynamics
00736                    <T,Descriptor,direction,orientation>(baseDynamics);
00737 }
00738 
00739 template<typename T, template<typename U> class Descriptor>
00740 template<int direction, int orientation>
00741 BoxProcessingFunctional3D_L<T,Descriptor>*
00742     RegularizedBoundaryManager3D<T,Descriptor>::
00743         getPressureBoundaryFunctional()
00744 {
00745     return 0;
00746 }
00747 
00748 template<typename T, template<typename U> class Descriptor>
00749 template<int plane, int normal1, int normal2>
00750 BoundaryCompositeDynamics<T,Descriptor>*
00751     RegularizedBoundaryManager3D<T,Descriptor>::
00752         getExternalVelocityEdgeDynamics(Dynamics<T,Descriptor>* baseDynamics)
00753 {
00754     return new StoreVelocityDynamics<T,Descriptor>(baseDynamics);
00755 }
00756 
00757 template<typename T, template<typename U> class Descriptor>
00758 template<int plane, int normal1, int normal2>
00759 BoxProcessingFunctional3D_L<T,Descriptor>*
00760     RegularizedBoundaryManager3D<T,Descriptor>::
00761         getExternalVelocityEdgeFunctional()
00762 {
00763     return new OuterVelocityEdgeFunctional3D<T,Descriptor, plane,normal1,normal2>();
00764 }
00765 
00766 template<typename T, template<typename U> class Descriptor>
00767 template<int plane, int normal1, int normal2>
00768 BoundaryCompositeDynamics<T,Descriptor>*
00769     RegularizedBoundaryManager3D<T,Descriptor>::
00770         getInternalVelocityEdgeDynamics(Dynamics<T,Descriptor>* baseDynamics)
00771 {
00772     return new RegularizedVelocityInnerEdgeDynamics3D<T,Descriptor,plane,normal1,normal2>(baseDynamics);
00773 }
00774 
00775 template<typename T, template<typename U> class Descriptor>
00776 template<int plane, int normal1, int normal2>
00777 BoxProcessingFunctional3D_L<T,Descriptor>*
00778     RegularizedBoundaryManager3D<T,Descriptor>::
00779         getInternalVelocityEdgeFunctional()
00780 {
00781     return 0;
00782 }
00783 
00784 template<typename T, template<typename U> class Descriptor>
00785 template<int xNormal, int yNormal, int zNormal>
00786 BoundaryCompositeDynamics<T,Descriptor>*
00787     RegularizedBoundaryManager3D<T,Descriptor>::
00788         getExternalVelocityCornerDynamics(Dynamics<T,Descriptor>* baseDynamics)
00789 {
00790     return new StoreVelocityDynamics<T,Descriptor>(baseDynamics);
00791 }
00792 
00793 template<typename T, template<typename U> class Descriptor>
00794 template<int xNormal, int yNormal, int zNormal>
00795 BoxProcessingFunctional3D_L<T,Descriptor>*
00796     RegularizedBoundaryManager3D<T,Descriptor>::
00797         getExternalVelocityCornerFunctional()
00798 {
00799     return new OuterVelocityCornerFunctional3D<T,Descriptor, xNormal,yNormal,zNormal>();
00800 }
00801 
00802 template<typename T, template<typename U> class Descriptor>
00803 template<int xNormal, int yNormal, int zNormal>
00804 BoundaryCompositeDynamics<T,Descriptor>*
00805     RegularizedBoundaryManager3D<T,Descriptor>::
00806         getInternalVelocityCornerDynamics(Dynamics<T,Descriptor>* baseDynamics)
00807 {
00808     return new RegularizedVelocityInnerCornerDynamics3D<T,Descriptor,xNormal,yNormal,zNormal>(baseDynamics);
00809 }
00810 
00811 template<typename T, template<typename U> class Descriptor>
00812 template<int xNormal, int yNormal, int zNormal>
00813 BoxProcessingFunctional3D_L<T,Descriptor>*
00814     RegularizedBoundaryManager3D<T,Descriptor>::
00815         getInternalVelocityCornerFunctional()
00816 {
00817     return 0;
00818 }
00819 
00820 
00822 
00823 template<typename T, template<typename U> class Descriptor>
00824 template<int direction, int orientation>
00825 BoundaryCompositeDynamics<T,Descriptor>* WrappedRegularizedBoundaryManager3D<T,Descriptor>::
00826     getVelocityBoundaryDynamics(Dynamics<T,Descriptor>* baseDynamics)
00827 {
00828     bool automaticPrepareCollision = false;
00829     return new RegularizedVelocityBoundaryDynamics
00830                    <T,Descriptor,direction,orientation>(baseDynamics, automaticPrepareCollision);
00831 }
00832 
00833 template<typename T, template<typename U> class Descriptor>
00834 template<int direction, int orientation>
00835 BoxProcessingFunctional3D_L<T,Descriptor>*
00836     WrappedRegularizedBoundaryManager3D<T,Descriptor>::
00837         getVelocityBoundaryFunctional()
00838 {
00839     return new WrappedLocalBoundaryFunctional3D<T,Descriptor>();
00840 }
00841 
00842 template<typename T, template<typename U> class Descriptor>
00843 template<int direction, int orientation>
00844 BoundaryCompositeDynamics<T,Descriptor>* WrappedRegularizedBoundaryManager3D<T,Descriptor>::
00845     getPressureBoundaryDynamics(Dynamics<T,Descriptor>* baseDynamics)
00846 {
00847     bool automaticPrepareCollision = false;
00848     return new RegularizedDensityBoundaryDynamics
00849                    <T,Descriptor,direction,orientation>(baseDynamics, automaticPrepareCollision);
00850 }
00851 
00852 template<typename T, template<typename U> class Descriptor>
00853 template<int direction, int orientation>
00854 BoxProcessingFunctional3D_L<T,Descriptor>*
00855     WrappedRegularizedBoundaryManager3D<T,Descriptor>::
00856         getPressureBoundaryFunctional()
00857 {
00858     return new WrappedLocalBoundaryFunctional3D<T,Descriptor>();
00859 }
00860 
00861 template<typename T, template<typename U> class Descriptor>
00862 template<int plane, int normal1, int normal2>
00863 BoundaryCompositeDynamics<T,Descriptor>*
00864     WrappedRegularizedBoundaryManager3D<T,Descriptor>::
00865         getExternalVelocityEdgeDynamics(Dynamics<T,Descriptor>* baseDynamics)
00866 {
00867     return new StoreVelocityDynamics<T,Descriptor>(baseDynamics);
00868 }
00869 
00870 template<typename T, template<typename U> class Descriptor>
00871 template<int plane, int normal1, int normal2>
00872 BoxProcessingFunctional3D_L<T,Descriptor>*
00873     WrappedRegularizedBoundaryManager3D<T,Descriptor>::
00874         getExternalVelocityEdgeFunctional()
00875 {
00876     return new OuterVelocityEdgeFunctional3D<T,Descriptor, plane,normal1,normal2>();
00877 }
00878 
00879 template<typename T, template<typename U> class Descriptor>
00880 template<int plane, int normal1, int normal2>
00881 BoundaryCompositeDynamics<T,Descriptor>*
00882     WrappedRegularizedBoundaryManager3D<T,Descriptor>::
00883         getInternalVelocityEdgeDynamics(Dynamics<T,Descriptor>* baseDynamics)
00884 {
00885     bool automaticPrepareCollision = false;
00886     return new RegularizedVelocityInnerEdgeDynamics3D<T,Descriptor,plane,normal1,normal2>
00887                    (baseDynamics, automaticPrepareCollision);
00888 }
00889 
00890 template<typename T, template<typename U> class Descriptor>
00891 template<int plane, int normal1, int normal2>
00892 BoxProcessingFunctional3D_L<T,Descriptor>*
00893     WrappedRegularizedBoundaryManager3D<T,Descriptor>::
00894         getInternalVelocityEdgeFunctional()
00895 {
00896     return new WrappedLocalBoundaryFunctional3D<T,Descriptor>();
00897 }
00898 
00899 template<typename T, template<typename U> class Descriptor>
00900 template<int xNormal, int yNormal, int zNormal>
00901 BoundaryCompositeDynamics<T,Descriptor>*
00902     WrappedRegularizedBoundaryManager3D<T,Descriptor>::
00903         getExternalVelocityCornerDynamics(Dynamics<T,Descriptor>* baseDynamics)
00904 {
00905     return new StoreVelocityDynamics<T,Descriptor>(baseDynamics);
00906 }
00907 
00908 template<typename T, template<typename U> class Descriptor>
00909 template<int xNormal, int yNormal, int zNormal>
00910 BoxProcessingFunctional3D_L<T,Descriptor>*
00911     WrappedRegularizedBoundaryManager3D<T,Descriptor>::
00912         getExternalVelocityCornerFunctional()
00913 {
00914     return new OuterVelocityCornerFunctional3D<T,Descriptor, xNormal,yNormal,zNormal> ();
00915 }
00916 
00917 template<typename T, template<typename U> class Descriptor>
00918 template<int xNormal, int yNormal, int zNormal>
00919 BoundaryCompositeDynamics<T,Descriptor>*
00920     WrappedRegularizedBoundaryManager3D<T,Descriptor>::
00921         getInternalVelocityCornerDynamics(Dynamics<T,Descriptor>* baseDynamics)
00922 {
00923     bool automaticPrepareCollision = false;
00924     return new RegularizedVelocityInnerCornerDynamics3D<T,Descriptor,xNormal,yNormal,zNormal>
00925                    (baseDynamics,automaticPrepareCollision);
00926 }
00927 
00928 template<typename T, template<typename U> class Descriptor>
00929 template<int xNormal, int yNormal, int zNormal>
00930 BoxProcessingFunctional3D_L<T,Descriptor>*
00931     WrappedRegularizedBoundaryManager3D<T,Descriptor>::
00932         getInternalVelocityCornerFunctional()
00933 {
00934     return new WrappedLocalBoundaryFunctional3D<T,Descriptor>();
00935 }
00936 
00937 
00939 
00940 template<typename T, template<typename U> class Descriptor>
00941 template<int direction, int orientation>
00942 BoundaryCompositeDynamics<T,Descriptor>* EquilibriumBoundaryManager3D<T,Descriptor>::
00943     getVelocityBoundaryDynamics(Dynamics<T,Descriptor>* baseDynamics)
00944 {
00945     return new RegularizedVelocityBoundaryDynamics
00946                    <T,Descriptor,direction,orientation>(baseDynamics);
00947 }
00948 
00949 template<typename T, template<typename U> class Descriptor>
00950 template<int direction, int orientation>
00951 BoxProcessingFunctional3D_L<T,Descriptor>*
00952     EquilibriumBoundaryManager3D<T,Descriptor>::
00953         getVelocityBoundaryFunctional()
00954 {
00955     return 0;
00956 }
00957 
00958 template<typename T, template<typename U> class Descriptor>
00959 template<int direction, int orientation>
00960 BoundaryCompositeDynamics<T,Descriptor>* EquilibriumBoundaryManager3D<T,Descriptor>::
00961     getPressureBoundaryDynamics(Dynamics<T,Descriptor>* baseDynamics)
00962 {
00963     return new RegularizedDensityBoundaryDynamics
00964                    <T,Descriptor,direction,orientation>(baseDynamics);
00965 }
00966 
00967 template<typename T, template<typename U> class Descriptor>
00968 template<int direction, int orientation>
00969 BoxProcessingFunctional3D_L<T,Descriptor>*
00970     EquilibriumBoundaryManager3D<T,Descriptor>::
00971         getPressureBoundaryFunctional()
00972 {
00973     return 0;
00974 }
00975 
00976 template<typename T, template<typename U> class Descriptor>
00977 template<int plane, int normal1, int normal2>
00978 BoundaryCompositeDynamics<T,Descriptor>*
00979     EquilibriumBoundaryManager3D<T,Descriptor>::
00980         getExternalVelocityEdgeDynamics(Dynamics<T,Descriptor>* baseDynamics)
00981 {
00982     return new StoreVelocityDynamics<T,Descriptor>(baseDynamics);
00983 }
00984 
00985 template<typename T, template<typename U> class Descriptor>
00986 template<int plane, int normal1, int normal2>
00987 BoxProcessingFunctional3D_L<T,Descriptor>*
00988     EquilibriumBoundaryManager3D<T,Descriptor>::
00989         getExternalVelocityEdgeFunctional()
00990 {
00991     return new OuterVelocityEdgeFunctional3D<T,Descriptor, plane,normal1,normal2>();
00992 }
00993 
00994 template<typename T, template<typename U> class Descriptor>
00995 template<int plane, int normal1, int normal2>
00996 BoundaryCompositeDynamics<T,Descriptor>*
00997     EquilibriumBoundaryManager3D<T,Descriptor>::
00998         getInternalVelocityEdgeDynamics(Dynamics<T,Descriptor>* baseDynamics)
00999 {
01000     return new RegularizedVelocityInnerEdgeDynamics3D<T,Descriptor,plane,normal1,normal2>(baseDynamics);
01001 }
01002 
01003 template<typename T, template<typename U> class Descriptor>
01004 template<int plane, int normal1, int normal2>
01005 BoxProcessingFunctional3D_L<T,Descriptor>*
01006     EquilibriumBoundaryManager3D<T,Descriptor>::
01007         getInternalVelocityEdgeFunctional()
01008 {
01009     return 0;
01010 }
01011 
01012 template<typename T, template<typename U> class Descriptor>
01013 template<int xNormal, int yNormal, int zNormal>
01014 BoundaryCompositeDynamics<T,Descriptor>*
01015     EquilibriumBoundaryManager3D<T,Descriptor>::
01016         getExternalVelocityCornerDynamics(Dynamics<T,Descriptor>* baseDynamics)
01017 {
01018     return new StoreVelocityDynamics<T,Descriptor>(baseDynamics);
01019 }
01020 
01021 template<typename T, template<typename U> class Descriptor>
01022 template<int xNormal, int yNormal, int zNormal>
01023 BoxProcessingFunctional3D_L<T,Descriptor>*
01024     EquilibriumBoundaryManager3D<T,Descriptor>::
01025         getExternalVelocityCornerFunctional()
01026 {
01027     return new OuterVelocityCornerFunctional3D<T,Descriptor, xNormal,yNormal,zNormal>();
01028 }
01029 
01030 template<typename T, template<typename U> class Descriptor>
01031 template<int xNormal, int yNormal, int zNormal>
01032 BoundaryCompositeDynamics<T,Descriptor>*
01033     EquilibriumBoundaryManager3D<T,Descriptor>::
01034         getInternalVelocityCornerDynamics(Dynamics<T,Descriptor>* baseDynamics)
01035 {
01036     return new RegularizedVelocityInnerCornerDynamics3D<T,Descriptor,xNormal,yNormal,zNormal>(baseDynamics);
01037 }
01038 
01039 template<typename T, template<typename U> class Descriptor>
01040 template<int xNormal, int yNormal, int zNormal>
01041 BoxProcessingFunctional3D_L<T,Descriptor>*
01042     EquilibriumBoundaryManager3D<T,Descriptor>::
01043         getInternalVelocityCornerFunctional()
01044 {
01045     return 0;
01046 }
01047 
01048 
01050 
01051 template<typename T, template<typename U> class Descriptor>
01052 template<int direction, int orientation>
01053 BoundaryCompositeDynamics<T,Descriptor>* InterpolationBoundaryManager3D<T,Descriptor>::
01054     getVelocityBoundaryDynamics(Dynamics<T,Descriptor>* baseDynamics)
01055 {
01056     return new VelocityDirichletBoundaryDynamics
01057                    <T,Descriptor,direction,orientation>(baseDynamics);
01058 }
01059 
01060 template<typename T, template<typename U> class Descriptor>
01061 template<int direction, int orientation>
01062 BoxProcessingFunctional3D_L<T,Descriptor>*
01063     InterpolationBoundaryManager3D<T,Descriptor>::
01064         getVelocityBoundaryFunctional()
01065 {
01066      return new PlaneFdBoundaryFunctional3D<T,Descriptor, direction,orientation>();
01067 }
01068 
01069 template<typename T, template<typename U> class Descriptor>
01070 template<int direction, int orientation>
01071 BoundaryCompositeDynamics<T,Descriptor>* InterpolationBoundaryManager3D<T,Descriptor>::
01072     getPressureBoundaryDynamics(Dynamics<T,Descriptor>* baseDynamics)
01073 {
01074     return new DensityDirichletBoundaryDynamics
01075                    <T,Descriptor,direction,orientation>(baseDynamics);
01076 }
01077 
01078 template<typename T, template<typename U> class Descriptor>
01079 template<int direction, int orientation>
01080 BoxProcessingFunctional3D_L<T,Descriptor>*
01081     InterpolationBoundaryManager3D<T,Descriptor>::
01082         getPressureBoundaryFunctional()
01083 {
01084     return new PlaneFdBoundaryFunctional3D<T,Descriptor, direction,orientation>();
01085 }
01086 
01087 template<typename T, template<typename U> class Descriptor>
01088 template<int plane, int normal1, int normal2>
01089 BoundaryCompositeDynamics<T,Descriptor>*
01090     InterpolationBoundaryManager3D<T,Descriptor>::
01091         getExternalVelocityEdgeDynamics(Dynamics<T,Descriptor>* baseDynamics)
01092 {
01093     return new StoreVelocityDynamics<T,Descriptor>(baseDynamics);
01094 }
01095 
01096 template<typename T, template<typename U> class Descriptor>
01097 template<int plane, int normal1, int normal2>
01098 BoxProcessingFunctional3D_L<T,Descriptor>*
01099     InterpolationBoundaryManager3D<T,Descriptor>::
01100         getExternalVelocityEdgeFunctional()
01101 {
01102     return new OuterVelocityEdgeFunctional3D<T,Descriptor, plane,normal1,normal2>();
01103 }
01104 
01105 template<typename T, template<typename U> class Descriptor>
01106 template<int plane, int normal1, int normal2>
01107 BoundaryCompositeDynamics<T,Descriptor>*
01108     InterpolationBoundaryManager3D<T,Descriptor>::
01109         getInternalVelocityEdgeDynamics(Dynamics<T,Descriptor>* baseDynamics)
01110 {
01111     return new RegularizedVelocityInnerEdgeDynamics3D<T,Descriptor,plane,normal1,normal2>(baseDynamics);
01112 }
01113 
01114 template<typename T, template<typename U> class Descriptor>
01115 template<int plane, int normal1, int normal2>
01116 BoxProcessingFunctional3D_L<T,Descriptor>*
01117     InterpolationBoundaryManager3D<T,Descriptor>::
01118         getInternalVelocityEdgeFunctional()
01119 {
01120     return 0;
01121 }
01122 
01123 template<typename T, template<typename U> class Descriptor>
01124 template<int xNormal, int yNormal, int zNormal>
01125 BoundaryCompositeDynamics<T,Descriptor>*
01126     InterpolationBoundaryManager3D<T,Descriptor>::
01127         getExternalVelocityCornerDynamics(Dynamics<T,Descriptor>* baseDynamics)
01128 {
01129     return new StoreVelocityDynamics<T,Descriptor>(baseDynamics);
01130 }
01131 
01132 template<typename T, template<typename U> class Descriptor>
01133 template<int xNormal, int yNormal, int zNormal>
01134 BoxProcessingFunctional3D_L<T,Descriptor>*
01135     InterpolationBoundaryManager3D<T,Descriptor>::
01136         getExternalVelocityCornerFunctional()
01137 {
01138     return new OuterVelocityCornerFunctional3D<T,Descriptor, xNormal,yNormal,zNormal>();
01139 }
01140 
01141 template<typename T, template<typename U> class Descriptor>
01142 template<int xNormal, int yNormal, int zNormal>
01143 BoundaryCompositeDynamics<T,Descriptor>*
01144     InterpolationBoundaryManager3D<T,Descriptor>::
01145         getInternalVelocityCornerDynamics(Dynamics<T,Descriptor>* baseDynamics)
01146 {
01147     return new RegularizedVelocityInnerCornerDynamics3D<T,Descriptor,xNormal,yNormal,zNormal>(baseDynamics);
01148 }
01149 
01150 template<typename T, template<typename U> class Descriptor>
01151 template<int xNormal, int yNormal, int zNormal>
01152 BoxProcessingFunctional3D_L<T,Descriptor>*
01153     InterpolationBoundaryManager3D<T,Descriptor>::
01154         getInternalVelocityCornerFunctional()
01155 {
01156     return 0;
01157 }
01158 
01159 
01161 
01162 template<typename T, template<typename U> class Descriptor>
01163 OnLatticeBoundaryCondition3D<T,Descriptor>* createLocalBoundaryCondition3D() {
01164     return new BoundaryConditionInstantiator3D <
01165                    T, Descriptor,
01166                    WrappedRegularizedBoundaryManager3D<T,Descriptor> > ();
01167 }
01168 
01169 template<typename T, template<typename U> class Descriptor>
01170 OnLatticeBoundaryCondition3D<T,Descriptor>* createDynamicsBasedLocalBoundaryCondition3D() {
01171     return new BoundaryConditionInstantiator3D <
01172                    T, Descriptor,
01173                    RegularizedBoundaryManager3D<T,Descriptor> > ();
01174 }
01175 
01176 template<typename T, template<typename U> class Descriptor>
01177 OnLatticeBoundaryCondition3D<T,Descriptor>* createEquilibriumBoundaryCondition3D() {
01178     return new BoundaryConditionInstantiator3D <
01179                    T, Descriptor,
01180                    EquilibriumBoundaryManager3D<T,Descriptor> > ();
01181 }
01182 
01183 template<typename T, template<typename U> class Descriptor>
01184 OnLatticeBoundaryCondition3D<T,Descriptor>* createInterpBoundaryCondition3D() {
01185     return new BoundaryConditionInstantiator3D <
01186                    T, Descriptor,
01187                    InterpolationBoundaryManager3D<T,Descriptor> > ();
01188 }
01189 
01190 }  // namespace plb
01191 
01192 #endif  // BOUNDARY_CONDITION_3D_HH