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

gridConversion3D.h

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 
00025 #ifndef GRID_CONVERSION_3D_H
00026 #define GRID_CONVERSION_3D_H
00027 
00028 #include "core/globalDefs.h"
00029 #include "atomicBlock/dataProcessingFunctional3D.h"
00030 #include "atomicBlock/dataProcessorWrapper3D.h"
00031 #include "multiBlock/multiDataProcessorWrapper3D.h"
00032 #include "particles/multiParticleField3D.h"
00033 #include "core/util.h"
00034 #include "core/dynamics.h"
00035 
00036 namespace plb {
00037 
00038 Box3D scaleBox(Box3D box, plint nLevel);
00039 
00041 template<typename T>
00042 class ScalarCopyFineToCoarseZerothOrder3D : public BoxProcessingFunctional3D_SS<T,T>
00043 {
00044 public:
00045     ScalarCopyFineToCoarseZerothOrder3D(plint dimDx_, plint dimDt_, plint dxScale_, plint dtScale_);
00046     ScalarCopyFineToCoarseZerothOrder3D(ScalarCopyFineToCoarseZerothOrder3D<T> const& rhs);
00047     ScalarCopyFineToCoarseZerothOrder3D<T>& operator= (
00048             ScalarCopyFineToCoarseZerothOrder3D<T> const& rhs );
00049     virtual void process( Box3D fineDomain,
00050                           ScalarField3D<T>& fineField, ScalarField3D<T>& coarseField );
00051     virtual ScalarCopyFineToCoarseZerothOrder3D<T>* clone() const;
00052     virtual BlockDomain::DomainT appliesTo() const {
00053         return BlockDomain::bulk;
00054     }
00055     virtual void getTypeOfModification(std::vector<modif::ModifT>& modified) const {
00056         modified[0] = modif::nothing;
00057         modified[1] = modif::staticVariables;
00058     }
00059 private:
00060     plint dimDx, dimDt;
00061     plint dxScale, dtScale;
00062 };
00063 
00065 template<typename T, int nDim>
00066 class TensorCopyFineToCoarseZerothOrder3D : public BoxProcessingFunctional3D_TT<T,nDim,T,nDim>
00067 {
00068 public:
00069     TensorCopyFineToCoarseZerothOrder3D(plint dimDx_, plint dimDt_, plint dxScale_, plint dtScale_);
00070     TensorCopyFineToCoarseZerothOrder3D(TensorCopyFineToCoarseZerothOrder3D<T,nDim> const& rhs);
00071     TensorCopyFineToCoarseZerothOrder3D<T,nDim>& operator= (
00072             TensorCopyFineToCoarseZerothOrder3D<T,nDim> const& rhs );
00073     virtual void process( Box3D fineDomain,
00074                           TensorField3D<T,nDim>& fineField, TensorField3D<T,nDim>& coarseField );
00075     virtual TensorCopyFineToCoarseZerothOrder3D<T,nDim>* clone() const;
00076     virtual BlockDomain::DomainT appliesTo() const {
00077         return BlockDomain::bulk;
00078     }
00079     virtual void getTypeOfModification(std::vector<modif::ModifT>& modified) const {
00080         modified[0] = modif::nothing;
00081         modified[1] = modif::staticVariables;
00082     }
00083 private:
00084     plint dimDx, dimDt;
00085     plint dxScale, dtScale;
00086 };
00087 
00089 template<typename T, template<typename U> class Descriptor>
00090 class LatticeCopyFineToCoarseZerothOrder3D : public BoxProcessingFunctional3D_LL<T,Descriptor,T,Descriptor>
00091 {
00092 public:
00093     LatticeCopyFineToCoarseZerothOrder3D(plint dxScale_, plint dtScale_);
00094     LatticeCopyFineToCoarseZerothOrder3D(LatticeCopyFineToCoarseZerothOrder3D<T,Descriptor> const& rhs);
00095     LatticeCopyFineToCoarseZerothOrder3D<T,Descriptor>& operator= (
00096             LatticeCopyFineToCoarseZerothOrder3D<T,Descriptor> const& rhs );
00097     virtual void process( Box3D fineDomain,
00098                           BlockLattice3D<T,Descriptor>& fineLattice,
00099                           BlockLattice3D<T,Descriptor>& coarseLattice );
00100     virtual LatticeCopyFineToCoarseZerothOrder3D<T,Descriptor>* clone() const;
00101     virtual BlockDomain::DomainT appliesTo() const {
00102         return BlockDomain::bulk;
00103     }
00104     virtual void getTypeOfModification(std::vector<modif::ModifT>& modified) const {
00105         modified[0] = modif::nothing;
00106         modified[1] = modif::staticVariables;
00107     }
00108 private:
00109     plint dxScale, dtScale;
00110 };
00111 
00113 template<typename T, template<typename U> class Descriptor>
00114 class CopyRescaleParticles3D : public BoxProcessingFunctional3D
00115 {
00116 public:
00117     CopyRescaleParticles3D(plint dxScale_, plint dtScale_);
00118     virtual void processGenericBlocks (
00119             Box3D fineDomain, std::vector<AtomicBlock3D*> blocks );
00120     virtual CopyRescaleParticles3D<T,Descriptor>* clone() const;
00121     virtual BlockDomain::DomainT appliesTo() const {
00122         return BlockDomain::bulk;
00123     }
00124     virtual void getTypeOfModification(std::vector<modif::ModifT>& modified) const {
00125         modified[0] = modif::nothing;
00126         modified[1] = modif::staticVariables;
00127     }
00128 private:
00129     plint dxScale, dtScale;
00130 };
00131 
00132 
00134 template<typename T>
00135 class ScalarInterpolateCoarseToFine3D : public BoxProcessingFunctional3D_SS<T,T>
00136 {
00137 public:
00138     ScalarInterpolateCoarseToFine3D(plint dimDx_, plint dimDt_, plint dxScale_, plint dtScale_);
00139 
00140     ScalarInterpolateCoarseToFine3D(
00141             ScalarInterpolateCoarseToFine3D<T> const& rhs);
00142     ScalarInterpolateCoarseToFine3D<T>& operator= (
00143             ScalarInterpolateCoarseToFine3D<T> const& rhs );
00144     
00145     virtual void process( Box3D coarseDomain,
00146                           ScalarField3D<T>& coarseField,
00147                           ScalarField3D<T>& fineField );
00148 
00149     virtual ScalarInterpolateCoarseToFine3D<T>* clone() const;
00150     
00151     virtual BlockDomain::DomainT appliesTo() const {
00152         return BlockDomain::bulk;
00153     }
00154 
00155     virtual void getTypeOfModification(std::vector<modif::ModifT>& modified) const {
00156         modified[0] = modif::nothing;
00157         modified[1] = modif::staticVariables;
00158     }
00159 private:
00160     plint dimDx, dimDt;
00161     plint dxScale, dtScale;
00162 };
00163 
00165 template<typename T, int nDim>
00166 class TensorInterpolateCoarseToFine3D : public BoxProcessingFunctional3D_TT<T,nDim,T,nDim>
00167 {
00168 public:
00169     TensorInterpolateCoarseToFine3D(plint dimDx_, plint dimDt_, plint dxScale_, plint dtScale_);
00170 
00171     TensorInterpolateCoarseToFine3D(
00172             TensorInterpolateCoarseToFine3D<T,nDim> const& rhs);
00173     TensorInterpolateCoarseToFine3D<T,nDim>& operator= (
00174             TensorInterpolateCoarseToFine3D<T,nDim> const& rhs );
00175     
00176     virtual void process( Box3D coarseDomain,
00177                           TensorField3D<T,nDim>& coarseField,
00178                           TensorField3D<T,nDim>& fineField );
00179 
00180     virtual TensorInterpolateCoarseToFine3D<T,nDim>* clone() const;
00181     
00182     virtual BlockDomain::DomainT appliesTo() const {
00183         return BlockDomain::bulk;
00184     }
00185 
00186     virtual void getTypeOfModification(std::vector<modif::ModifT>& modified) const {
00187         modified[0] = modif::nothing;
00188         modified[1] = modif::staticVariables;
00189     }
00190 private:
00191     plint dimDx, dimDt;
00192     plint dxScale, dtScale;
00193 };
00194 
00195 
00197 template<typename T, template<typename U> class Descriptor>
00198 class LatticeInterpolateCoarseToFine3D : public BoxProcessingFunctional3D_LL<T,Descriptor,T,Descriptor>
00199 {
00200 public:
00201     LatticeInterpolateCoarseToFine3D(plint dxScale_, plint dtScale_);
00202 
00203     LatticeInterpolateCoarseToFine3D (
00204             LatticeInterpolateCoarseToFine3D<T,Descriptor> const& rhs );
00205     LatticeInterpolateCoarseToFine3D<T,Descriptor>& operator= (
00206             LatticeInterpolateCoarseToFine3D<T,Descriptor> const& rhs );
00207     
00208     virtual void process( Box3D coarseDomain,
00209                           BlockLattice3D<T,Descriptor>& coarseLattice,
00210                           BlockLattice3D<T,Descriptor>& fineLattice );
00211 
00212     virtual LatticeInterpolateCoarseToFine3D<T,Descriptor>* clone() const;
00213     
00214     virtual BlockDomain::DomainT appliesTo() const {
00215         return BlockDomain::bulk;
00216     }
00217 
00218     virtual void getTypeOfModification(std::vector<modif::ModifT>& modified) const {
00219         modified[0] = modif::nothing;
00220         modified[1] = modif::staticVariables;
00221     }
00222 private:
00223     plint dxScale, dtScale;
00224 };
00225 
00226 
00227 template <typename T>
00228 std::auto_ptr<MultiScalarField3D<T> > coarsen (
00229         MultiScalarField3D<T>& fineField,
00230         plint dimDx, plint dimDt, plint dxScale, plint dtScale );
00231 
00232 template <typename T>
00233 std::auto_ptr<MultiScalarField3D<T> > refine (
00234         MultiScalarField3D<T>& coarseField,
00235         plint dimDx, plint dimDt, plint dxScale, plint dtScale );
00236 
00237 
00238 template <typename T, int nDim>
00239 std::auto_ptr<MultiTensorField3D<T,nDim> > coarsen (
00240         MultiTensorField3D<T,nDim>& fineField,
00241         plint dimDx, plint dimDt, plint dxScale, plint dtScale );
00242 
00243 template <typename T, int nDim>
00244 std::auto_ptr<MultiTensorField3D<T,nDim> > refine (
00245         MultiTensorField3D<T,nDim>& coarseField,
00246         plint dimDx, plint dimDt, plint dxScale, plint dtScale );
00247 
00248 
00249 template<typename T, template<typename U> class Descriptor>
00250 std::auto_ptr<MultiBlockLattice3D<T,Descriptor> > coarsen (
00251         MultiBlockLattice3D<T,Descriptor>& fineLattice,
00252         plint dxScale, plint dtScale, Dynamics<T,Descriptor>* backgroundDynamics );
00253 
00254 template<typename T, template<typename U> class Descriptor>
00255 std::auto_ptr<MultiBlockLattice3D<T,Descriptor> > refine (
00256         MultiBlockLattice3D<T,Descriptor>& coarseLattice,
00257         plint dxScale, plint dtScale, Dynamics<T,Descriptor>* backgroundDynamics );
00258 
00259 
00260 template<typename T, template<typename U> class Descriptor>
00261 std::auto_ptr<MultiParticleField3D<DenseParticleField3D<T,Descriptor> > > refine (
00262         MultiParticleField3D<DenseParticleField3D<T,Descriptor> >& coarseField,
00263         plint dxScale, plint dtScale );
00264 
00265 template<typename T, template<typename U> class Descriptor>
00266 std::auto_ptr<MultiParticleField3D<DenseParticleField3D<T,Descriptor> > > coarsen (
00267         MultiParticleField3D<DenseParticleField3D<T,Descriptor> >& fineField,
00268         plint dxScale, plint dtScale );
00269 
00270 }  // namespace plb
00271 
00272 #endif  // GRID_CONVERSION_3D_H