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

gridConversion2D.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_2D_H
00026 #define GRID_CONVERSION_2D_H
00027 
00028 #include "core/globalDefs.h"
00029 #include "atomicBlock/dataProcessingFunctional2D.h"
00030 #include "atomicBlock/dataProcessorWrapper2D.h"
00031 #include "multiBlock/multiDataProcessorWrapper2D.h"
00032 #include "core/util.h"
00033 #include "core/dynamics.h"
00034 
00035 namespace plb {
00036 
00037 Box2D scaleBox(Box2D box, plint nLevel);
00038 
00040 template<typename T>
00041 class ScalarCopyFineToCoarseZerothOrder2D : public BoxProcessingFunctional2D_SS<T,T>
00042 {
00043 public:
00044     ScalarCopyFineToCoarseZerothOrder2D(plint dimDx_, plint dimDt_, plint dxScale_, plint dtScale_);
00045     ScalarCopyFineToCoarseZerothOrder2D(ScalarCopyFineToCoarseZerothOrder2D<T> const& rhs);
00046     ScalarCopyFineToCoarseZerothOrder2D<T>& operator= (
00047             ScalarCopyFineToCoarseZerothOrder2D<T> const& rhs );
00048     virtual void process( Box2D fineDomain,
00049                           ScalarField2D<T>& fineField, ScalarField2D<T>& coarseField );
00050     virtual ScalarCopyFineToCoarseZerothOrder2D<T>* clone() const;
00051     virtual BlockDomain::DomainT appliesTo() const {
00052         return BlockDomain::bulk;
00053     }
00054     virtual void getTypeOfModification(std::vector<modif::ModifT>& modified) const {
00055         modified[0] = modif::nothing;
00056         modified[1] = modif::staticVariables;
00057     }
00058 private:
00059     plint dimDx, dimDt;
00060     plint dxScale, dtScale;
00061 };
00062 
00064 template<typename T, int nDim>
00065 class TensorCopyFineToCoarseZerothOrder2D : public BoxProcessingFunctional2D_TT<T,nDim,T,nDim>
00066 {
00067 public:
00068     TensorCopyFineToCoarseZerothOrder2D(plint dimDx_, plint dimDt_, plint dxScale_, plint dtScale_);
00069     TensorCopyFineToCoarseZerothOrder2D(TensorCopyFineToCoarseZerothOrder2D<T,nDim> const& rhs);
00070     TensorCopyFineToCoarseZerothOrder2D<T,nDim>& operator= (
00071             TensorCopyFineToCoarseZerothOrder2D<T,nDim> const& rhs );
00072     virtual void process( Box2D fineDomain,
00073                           TensorField2D<T,nDim>& fineField, TensorField2D<T,nDim>& coarseField );
00074     virtual TensorCopyFineToCoarseZerothOrder2D<T,nDim>* clone() const;
00075     virtual BlockDomain::DomainT appliesTo() const {
00076         return BlockDomain::bulk;
00077     }
00078     virtual void getTypeOfModification(std::vector<modif::ModifT>& modified) const {
00079         modified[0] = modif::nothing;
00080         modified[1] = modif::staticVariables;
00081     }
00082 private:
00083     plint dimDx, dimDt;
00084     plint dxScale, dtScale;
00085 };
00086 
00088 template<typename T, template<typename U> class Descriptor>
00089 class LatticeCopyFineToCoarseZerothOrder2D : public BoxProcessingFunctional2D_LL<T,Descriptor,T,Descriptor>
00090 {
00091 public:
00092     LatticeCopyFineToCoarseZerothOrder2D(plint dxScale_, plint dtScale_);
00093     LatticeCopyFineToCoarseZerothOrder2D(LatticeCopyFineToCoarseZerothOrder2D<T,Descriptor> const& rhs);
00094     LatticeCopyFineToCoarseZerothOrder2D<T,Descriptor>& operator= (
00095             LatticeCopyFineToCoarseZerothOrder2D<T,Descriptor> const& rhs );
00096     virtual void process( Box2D fineDomain,
00097                           BlockLattice2D<T,Descriptor>& fineLattice,
00098                           BlockLattice2D<T,Descriptor>& coarseLattice );
00099     virtual LatticeCopyFineToCoarseZerothOrder2D<T,Descriptor>* clone() const;
00100     virtual BlockDomain::DomainT appliesTo() const {
00101         return BlockDomain::bulk;
00102     }
00103     virtual void getTypeOfModification(std::vector<modif::ModifT>& modified) const {
00104         modified[0] = modif::nothing;
00105         modified[1] = modif::staticVariables;
00106     }
00107 private:
00108     plint dxScale, dtScale;
00109 };
00110 
00112 template<typename T>
00113 class ScalarInterpolateCoarseToFine2D : public BoxProcessingFunctional2D_SS<T,T>
00114 {
00115 public:
00116     ScalarInterpolateCoarseToFine2D(plint dimDx_, plint dimDt_, plint dxScale_, plint dtScale_);
00117 
00118     ScalarInterpolateCoarseToFine2D(
00119             ScalarInterpolateCoarseToFine2D<T> const& rhs);
00120     ScalarInterpolateCoarseToFine2D<T>& operator= (
00121             ScalarInterpolateCoarseToFine2D<T> const& rhs );
00122     
00123     virtual void process( Box2D coarseDomain,
00124                           ScalarField2D<T>& coarseField,
00125                           ScalarField2D<T>& fineField );
00126 
00127     virtual ScalarInterpolateCoarseToFine2D<T>* clone() const;
00128     
00129     virtual BlockDomain::DomainT appliesTo() const {
00130         return BlockDomain::bulk;
00131     }
00132 
00133     virtual void getTypeOfModification(std::vector<modif::ModifT>& modified) const {
00134         modified[0] = modif::nothing;
00135         modified[1] = modif::staticVariables;
00136     }
00137 private:
00138     plint dimDx, dimDt;
00139     plint dxScale, dtScale;
00140 };
00141 
00143 template<typename T, int nDim>
00144 class TensorInterpolateCoarseToFine2D : public BoxProcessingFunctional2D_TT<T,nDim,T,nDim>
00145 {
00146 public:
00147     TensorInterpolateCoarseToFine2D(plint dimDx_, plint dimDt_, plint dxScale_, plint dtScale_);
00148 
00149     TensorInterpolateCoarseToFine2D(
00150             TensorInterpolateCoarseToFine2D<T,nDim> const& rhs);
00151     TensorInterpolateCoarseToFine2D<T,nDim>& operator= (
00152             TensorInterpolateCoarseToFine2D<T,nDim> const& rhs );
00153     
00154     virtual void process( Box2D coarseDomain,
00155                           TensorField2D<T,nDim>& coarseField,
00156                           TensorField2D<T,nDim>& fineField );
00157 
00158     virtual TensorInterpolateCoarseToFine2D<T,nDim>* clone() const;
00159     
00160     virtual BlockDomain::DomainT appliesTo() const {
00161         return BlockDomain::bulk;
00162     }
00163 
00164     virtual void getTypeOfModification(std::vector<modif::ModifT>& modified) const {
00165         modified[0] = modif::nothing;
00166         modified[1] = modif::staticVariables;
00167     }
00168 private:
00169     plint dimDx, dimDt;
00170     plint dxScale, dtScale;
00171 };
00172 
00173 
00175 template<typename T, template<typename U> class Descriptor>
00176 class LatticeInterpolateCoarseToFine2D : public BoxProcessingFunctional2D_LL<T,Descriptor,T,Descriptor>
00177 {
00178 public:
00179     LatticeInterpolateCoarseToFine2D(plint dxScale_, plint dtScale_);
00180 
00181     LatticeInterpolateCoarseToFine2D (
00182             LatticeInterpolateCoarseToFine2D<T,Descriptor> const& rhs );
00183     LatticeInterpolateCoarseToFine2D<T,Descriptor>& operator= (
00184             LatticeInterpolateCoarseToFine2D<T,Descriptor> const& rhs );
00185     
00186     virtual void process( Box2D coarseDomain,
00187                           BlockLattice2D<T,Descriptor>& coarseLattice,
00188                           BlockLattice2D<T,Descriptor>& fineLattice );
00189 
00190     virtual LatticeInterpolateCoarseToFine2D<T,Descriptor>* clone() const;
00191     
00192     virtual BlockDomain::DomainT appliesTo() const {
00193         return BlockDomain::bulk;
00194     }
00195 
00196     virtual void getTypeOfModification(std::vector<modif::ModifT>& modified) const {
00197         modified[0] = modif::nothing;
00198         modified[1] = modif::staticVariables;
00199     }
00200 private:
00201     plint dxScale, dtScale;
00202 };
00203 
00204 
00205 template <typename T>
00206 std::auto_ptr<MultiScalarField2D<T> > coarsen (
00207         MultiScalarField2D<T>& fineField,
00208         plint dimDx, plint dimDt, plint dxScale, plint dtScale );
00209 
00210 template <typename T>
00211 std::auto_ptr<MultiScalarField2D<T> > refine (
00212         MultiScalarField2D<T>& coarseField,
00213         plint dimDx, plint dimDt, plint dxScale, plint dtScale );
00214 
00215 template <typename T, int nDim>
00216 std::auto_ptr<MultiTensorField2D<T,nDim> > coarsen (
00217         MultiTensorField2D<T,nDim>& fineField,
00218         plint dimDx, plint dimDt, plint dxScale, plint dtScale );
00219 
00220 template <typename T, int nDim>
00221 std::auto_ptr<MultiTensorField2D<T,nDim> > refine (
00222         MultiTensorField2D<T,nDim>& coarseField,
00223         plint dimDx, plint dimDt, plint dxScale, plint dtScale );
00224 
00225 template<typename T, template<typename U> class Descriptor>
00226 std::auto_ptr<MultiBlockLattice2D<T,Descriptor> > coarsen (
00227         MultiBlockLattice2D<T,Descriptor>& fineLattice,
00228         plint dxScale, plint dtScale, Dynamics<T,Descriptor>* backgroundDynamics );
00229 
00230 template<typename T, template<typename U> class Descriptor>
00231 std::auto_ptr<MultiBlockLattice2D<T,Descriptor> > refine (
00232         MultiBlockLattice2D<T,Descriptor>& coarseLattice,
00233         plint dxScale, plint dtScale, Dynamics<T,Descriptor>* backgroundDynamics );
00234 
00235 }  // namespace plb
00236 
00237 #endif  // GRID_CONVERSION_2D_H