$treeview $search $mathjax
|
Palabos
Version 1.1
$projectbrief
|
$projectbrief
|
$searchbox |
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
1.6.3
1.6.3