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

fineGridProcessors2D.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 /* Main author: Daniel Lagrava
00026  */
00027 
00032 #ifndef FINE_GRID_PROCESSORS_2D_H
00033 #define FINE_GRID_PROCESSORS_2D_H
00034 
00035 #include "core/globalDefs.h"
00036 #include "atomicBlock/blockLattice2D.h"
00037 #include "atomicBlock/dataProcessorWrapper2D.h"
00038 #include "multiBlock/multiBlockLattice2D.h"
00039 #include "multiGrid/gridRefinement.h"
00040 #include "multiGrid/gridRefinementDynamics.h"
00041 #include "finiteDifference/fdStencils1D.h"
00042 #include <vector>
00043 
00044 namespace plb {
00045 
00046    
00049 
00054 template<typename T, template<typename U> class Descriptor1, template<typename U> class Descriptor2>
00055 class CopyCoarseToFineLinearInterp2D : public BoxProcessingFunctional2D_LL<T,Descriptor1,T,Descriptor2>
00056 {
00057 public:
00058     CopyCoarseToFineLinearInterp2D (
00059             RescaleEngine<T,Descriptor1>* rescaleEngine_, plint direction_, plint orientation_ );
00060     virtual ~CopyCoarseToFineLinearInterp2D();
00061     CopyCoarseToFineLinearInterp2D(CopyCoarseToFineLinearInterp2D<T,Descriptor1,Descriptor2> const& rhs);
00062     CopyCoarseToFineLinearInterp2D<T,Descriptor1,Descriptor2>& operator= (
00063             CopyCoarseToFineLinearInterp2D<T,Descriptor1,Descriptor2> const& rhs );
00064     virtual void process( Box2D coarseDomain,
00065                           BlockLattice2D<T,Descriptor1>& coarseLattice,
00066                           BlockLattice2D<T,Descriptor2>& fineLattice );
00067     virtual CopyCoarseToFineLinearInterp2D<T,Descriptor1,Descriptor2>* clone() const;
00068     
00069     virtual void getTypeOfModification (std::vector<modif::ModifT>& modified) const
00070     {
00071         modified[0] = modif::nothing;
00072         modified[1] = modif::allVariables;
00073     }
00074     
00075 //     virtual BlockDomain::DomainT appliesTo() const {
00076 //         return BlockDomain::bulkAndEnvelope;
00077 //     }
00078     
00079 private:
00080     RescaleEngine<T,Descriptor1>* rescaleEngine;
00081     plint direction; // with respect to BC convention
00082     plint orientation; // with respect to BC convention
00083 };
00084 
00086 
00091 template<typename T, template<typename U> class Descriptor1, template<typename U> class Descriptor2>
00092 class CopyCoarseToFineBoundaryLinearInterp2D : public BoxProcessingFunctional2D_LL<T,Descriptor1,T,Descriptor2>
00093 {
00094 public:
00095     CopyCoarseToFineBoundaryLinearInterp2D (
00096             RescaleEngine<T,Descriptor1>* rescaleEngine_,
00097             plint direction_, plint orientation_, plint whereToInterpolate_);
00098     virtual ~CopyCoarseToFineBoundaryLinearInterp2D();
00099     CopyCoarseToFineBoundaryLinearInterp2D (
00100             CopyCoarseToFineBoundaryLinearInterp2D<T,Descriptor1,Descriptor2> const& rhs );
00101     CopyCoarseToFineBoundaryLinearInterp2D<T,Descriptor1,Descriptor2>& operator= (
00102             CopyCoarseToFineBoundaryLinearInterp2D<T,Descriptor1,Descriptor2> const& rhs );
00103     virtual void process( Box2D domain,
00104                           BlockLattice2D<T,Descriptor1>& coarseLattice,
00105                           BlockLattice2D<T,Descriptor2>& fineLattice );
00106     virtual CopyCoarseToFineBoundaryLinearInterp2D<T,Descriptor1,Descriptor2>* clone() const;
00107     
00108     virtual void getTypeOfModification (std::vector<modif::ModifT>& modified) const
00109     {
00110         modified[0] = modif::nothing;
00111         modified[1] = modif::allVariables;
00112     }
00113     
00114 private:
00115     RescaleEngine<T,Descriptor1>* rescaleEngine;
00116     plint direction, orientation, whereToInterpolate;
00117 };
00118 
00120 template<typename T, template<typename U> class Descriptor1, template<typename U> class Descriptor2>
00121 class CopyCoarseToFineCubicInterp2D : public BoxProcessingFunctional2D_LL<T,Descriptor1,T,Descriptor2>
00122 {
00123 public:
00124     CopyCoarseToFineCubicInterp2D (
00125             RescaleEngine<T,Descriptor1>* rescaleEngine_, plint direction_, plint orientation_ );
00126     virtual ~CopyCoarseToFineCubicInterp2D();
00127     CopyCoarseToFineCubicInterp2D(CopyCoarseToFineCubicInterp2D<T,Descriptor1,Descriptor2> const& rhs);
00128     CopyCoarseToFineCubicInterp2D<T,Descriptor1,Descriptor2>& operator= (
00129             CopyCoarseToFineCubicInterp2D<T,Descriptor1,Descriptor2> const& rhs );
00130     virtual void process( Box2D coarseDomain,
00131                           BlockLattice2D<T,Descriptor1>& coarseLattice,
00132                           BlockLattice2D<T,Descriptor2>& fineLattice );
00133     virtual CopyCoarseToFineCubicInterp2D<T,Descriptor1,Descriptor2>* clone() const;
00134     
00135     
00136     virtual void getTypeOfModification (std::vector<modif::ModifT>& modified) const
00137     {
00138         modified[0] = modif::nothing;
00139         modified[1] = modif::allVariables;
00140     }
00141     
00142 private:
00143     RescaleEngine<T,Descriptor1>* rescaleEngine;
00144     plint direction;
00145     plint orientation;
00146 };
00147 
00149 template<typename T, template<typename U> class Descriptor1, template<typename U> class Descriptor2>
00150 class CopyCoarseToFineCubicInterpWithDeconvolution2D : public BoxProcessingFunctional2D_LL<T,Descriptor1,T,Descriptor2>
00151 {
00152 public:
00153     CopyCoarseToFineCubicInterpWithDeconvolution2D (
00154             RescaleEngine<T,Descriptor1>* rescaleEngine_, plint direction_, plint orientation_ );
00155     virtual ~CopyCoarseToFineCubicInterpWithDeconvolution2D();
00156     CopyCoarseToFineCubicInterpWithDeconvolution2D(CopyCoarseToFineCubicInterpWithDeconvolution2D<T,Descriptor1,Descriptor2> const& rhs);
00157     CopyCoarseToFineCubicInterpWithDeconvolution2D<T,Descriptor1,Descriptor2>& operator= (
00158             CopyCoarseToFineCubicInterpWithDeconvolution2D<T,Descriptor1,Descriptor2> const& rhs );
00159     virtual void process( Box2D coarseDomain,
00160                           BlockLattice2D<T,Descriptor1>& coarseLattice,
00161                           BlockLattice2D<T,Descriptor2>& fineLattice );
00162     virtual CopyCoarseToFineCubicInterpWithDeconvolution2D<T,Descriptor1,Descriptor2>* clone() const;
00163     
00164     
00165     virtual void getTypeOfModification (std::vector<modif::ModifT>& modified) const
00166     {
00167         modified[0] = modif::nothing;
00168         modified[1] = modif::allVariables;
00169     }
00170 private: 
00171     std::vector<T> computeDeconvolutionExtrapolation(BlockLattice2D<T,Descriptor2>& fineLattice, 
00172                                                      plint iX, plint iY, plint dx, plint dy) const;
00173     
00174 private:
00175     RescaleEngine<T,Descriptor1>* rescaleEngine;
00176     plint direction; // 0 for x, 1 for y 
00177     plint orientation; // either +1 or -1
00178 };
00179 
00181 template<typename T, template<typename U> class Descriptor1, template<typename U> class Descriptor2>
00182 class CopyCoarseToFineBoundaryCubicInterp2D : public BoxProcessingFunctional2D_LL<T,Descriptor1,T,Descriptor2>
00183 {
00184 public:
00185     CopyCoarseToFineBoundaryCubicInterp2D (
00186             RescaleEngine<T,Descriptor1>* rescaleEngine_,
00187             plint direction_, plint orientation_, plint whereToInterpolate_);
00188     virtual ~CopyCoarseToFineBoundaryCubicInterp2D();
00189     CopyCoarseToFineBoundaryCubicInterp2D (
00190             CopyCoarseToFineBoundaryCubicInterp2D<T,Descriptor1,Descriptor2> const& rhs );
00191     CopyCoarseToFineBoundaryCubicInterp2D<T,Descriptor1,Descriptor2>& operator= (
00192             CopyCoarseToFineBoundaryCubicInterp2D<T,Descriptor1,Descriptor2> const& rhs );
00193     virtual void process( Box2D domain,
00194                           BlockLattice2D<T,Descriptor1>& coarseLattice,
00195                           BlockLattice2D<T,Descriptor2>& fineLattice );
00196     virtual CopyCoarseToFineBoundaryCubicInterp2D<T,Descriptor1,Descriptor2>* clone() const;
00197     
00198     virtual void getTypeOfModification (std::vector<modif::ModifT>& modified) const
00199     {
00200         modified[0] = modif::nothing;
00201         modified[1] = modif::allVariables;
00202     }
00203     
00204 private:
00205     RescaleEngine<T,Descriptor1>* rescaleEngine;
00206     plint direction;
00207     plint orientation;
00208     plint whereToInterpolate;
00209 };
00210 
00211 
00212 
00214 template<typename T, template<typename U> class Descriptor>
00215 class Copy_t1_to_t0_2D: public BoxProcessingFunctional2D_L<T,Descriptor>
00216 {
00217 public:
00218     Copy_t1_to_t0_2D(plint numTimeSteps_, plint executionTime_);
00219     virtual void process(Box2D domain, BlockLattice2D<T,Descriptor>& fineLattice);
00220     virtual Copy_t1_to_t0_2D<T,Descriptor>* clone() const;
00221     
00222     
00223     virtual void getTypeOfModification (std::vector<modif::ModifT>& modified) const
00224     {
00225         modified[0] = modif::allVariables;
00226     }
00227 
00228     
00229 private:
00230     plint numTimeSteps;
00231     plint executionTime;
00232 };
00233 
00236 template<typename T, template<typename U> class Descriptor1,template<typename U> class Descriptor2>
00237 class CoarseToFineConverter2D {
00238 public:
00239     CoarseToFineConverter2D( BlockLattice2D<T,Descriptor1> const& coarseLattice,
00240                              BlockLattice2D<T,Descriptor2>& fineLattice_ )
00241         : fineLattice(fineLattice_),
00242           coarseLocation(coarseLattice.getLocation()),
00243           fineLocation(fineLattice.getLocation())
00244     {}
00245     
00247     plint fineX(plint coarseX) const {
00248         return (coarseX+coarseLocation.x)*2 - fineLocation.x;
00249     }
00250     
00252     plint fineY(plint coarseY) const {
00253         return (coarseY+coarseLocation.y)*2 - fineLocation.y;
00254     }
00255     
00258     FineGridBoundaryDynamics<T,Descriptor2>& fineDynamics (
00259             plint coarseX, plint coarseY, plint deltaX, plint deltaY )
00260     {
00261         return dynamic_cast<FineGridBoundaryDynamics<T,Descriptor2>&> (
00262                    fineLattice.get( fineX(coarseX) + deltaX,
00263                                     fineY(coarseY) + deltaY ).getDynamics() );
00264     }
00265 private:
00266     BlockLattice2D<T,Descriptor2>& fineLattice;
00267     Dot2D coarseLocation, fineLocation;
00268 };
00269 
00270 
00271 
00272 
00273 }  // namespace plb
00274 
00275 #endif  // FINE_GRID_PROCESSORS_2D_H