$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 GRID_REFINEMENT_PROCESSORS_3D_H 00033 #define GRID_REFINEMENT_PROCESSORS_3D_H 00034 00035 #include "core/globalDefs.h" 00036 #include "atomicBlock/blockLattice3D.h" 00037 #include "atomicBlock/dataProcessorWrapper3D.h" 00038 #include "multiBlock/multiBlockLattice3D.h" 00039 #include "multiGrid/gridRefinement.h" 00040 #include "multiGrid/gridRefinementDynamics.h" 00041 #include <vector> 00042 00043 namespace plb { 00044 00047 template<typename T, template<typename U> class Descriptor1, template<typename U> class Descriptor2> 00048 class InterpolateCoarseToFineDynamics3D : public BoxProcessingFunctional3D_LL<T,Descriptor1,T,Descriptor2> 00049 { 00050 public: 00051 InterpolateCoarseToFineDynamics3D ( 00052 RescaleEngine<T,Descriptor1>* rescaleEngine_, 00053 InterpolationEngine2D<T,Descriptor1>* interpolationEngine_, plint direction_, const Dot3D delta_[2] ); 00054 virtual ~InterpolateCoarseToFineDynamics3D(); 00055 InterpolateCoarseToFineDynamics3D(InterpolateCoarseToFineDynamics3D<T,Descriptor1,Descriptor2> const& rhs); 00056 InterpolateCoarseToFineDynamics3D<T,Descriptor1,Descriptor2>& operator= ( 00057 InterpolateCoarseToFineDynamics3D<T,Descriptor1,Descriptor2> const& rhs ); 00058 virtual void process( Box3D coarseDomain, 00059 BlockLattice3D<T,Descriptor1>& coarseLattice, 00060 BlockLattice3D<T,Descriptor2>& fineLattice ); 00061 virtual InterpolateCoarseToFineDynamics3D<T,Descriptor1,Descriptor2>* clone() const; 00062 virtual BlockDomain::DomainT appliesTo() const { 00063 return BlockDomain::bulkAndEnvelope; 00064 } 00065 virtual void getTypeOfModification(std::vector<modif::ModifT>& modified) const { 00066 modified[0] = modif::nothing; 00067 modified[1] = modif::staticVariables; 00068 } 00069 private: 00070 RescaleEngine<T,Descriptor1>* rescaleEngine; 00071 InterpolationEngine2D<T,Descriptor1>* interpolationEngine; 00072 plint direction; 00073 std::vector<Dot3D> delta; 00074 }; 00075 00077 template<typename T, template<typename U> class Descriptor1, template<typename U> class Descriptor2> 00078 class InterpolateCoarseToFineBoundaryDynamics3D : public BoxProcessingFunctional3D_LL<T,Descriptor1,T,Descriptor2> 00079 { 00080 public: 00081 InterpolateCoarseToFineBoundaryDynamics3D ( 00082 RescaleEngine<T,Descriptor1>* rescaleEngine_, 00083 InterpolationEngine2D<T,Descriptor1>* interpolationEngine_, 00084 const Dot3D delta_[2] ); 00085 virtual ~InterpolateCoarseToFineBoundaryDynamics3D(); 00086 InterpolateCoarseToFineBoundaryDynamics3D ( 00087 InterpolateCoarseToFineBoundaryDynamics3D<T,Descriptor1,Descriptor2> const& rhs ); 00088 InterpolateCoarseToFineBoundaryDynamics3D<T,Descriptor1,Descriptor2>& operator= ( 00089 InterpolateCoarseToFineBoundaryDynamics3D<T,Descriptor1,Descriptor2> const& rhs ); 00090 virtual void process( Box3D domain, 00091 BlockLattice3D<T,Descriptor1>& coarseLattice, 00092 BlockLattice3D<T,Descriptor2>& fineLattice ); 00093 virtual InterpolateCoarseToFineBoundaryDynamics3D<T,Descriptor1,Descriptor2>* clone() const; 00094 virtual BlockDomain::DomainT appliesTo() const { 00095 return BlockDomain::bulkAndEnvelope; 00096 } 00097 virtual void getTypeOfModification(std::vector<modif::ModifT>& modified) const { 00098 modified[0] = modif::nothing; 00099 modified[1] = modif::staticVariables; 00100 } 00101 private: 00102 RescaleEngine<T,Descriptor1>* rescaleEngine; 00103 InterpolationEngine2D<T,Descriptor1>* interpolationEngine; 00104 std::vector<Dot3D> delta; 00105 }; 00106 00107 template<typename T, template<typename U> class Descriptor1, template<typename U> class Descriptor2> 00108 class InterpolateCoarseToFineCornerDynamics3D : public BoxProcessingFunctional3D_LL<T,Descriptor1,T,Descriptor2> 00109 { 00110 public: 00111 InterpolateCoarseToFineCornerDynamics3D ( 00112 RescaleEngine<T,Descriptor1>* rescaleEngine_, 00113 InterpolationEngine2D<T,Descriptor1>* interpolationEngine_, 00114 const Dot3D delta_[2] ); 00115 virtual ~InterpolateCoarseToFineCornerDynamics3D(); 00116 InterpolateCoarseToFineCornerDynamics3D ( 00117 InterpolateCoarseToFineCornerDynamics3D<T,Descriptor1,Descriptor2> const& rhs ); 00118 InterpolateCoarseToFineCornerDynamics3D<T,Descriptor1,Descriptor2>& operator= ( 00119 InterpolateCoarseToFineCornerDynamics3D<T,Descriptor1,Descriptor2> const& rhs ); 00120 virtual void process( Box3D domain, 00121 BlockLattice3D<T,Descriptor1>& coarseLattice, 00122 BlockLattice3D<T,Descriptor2>& fineLattice ); 00123 virtual InterpolateCoarseToFineCornerDynamics3D<T,Descriptor1,Descriptor2>* clone() const; 00124 virtual BlockDomain::DomainT appliesTo() const { 00125 return BlockDomain::bulkAndEnvelope; 00126 } 00127 virtual void getTypeOfModification(std::vector<modif::ModifT>& modified) const { 00128 modified[0] = modif::nothing; 00129 modified[1] = modif::staticVariables; 00130 } 00131 private: 00132 RescaleEngine<T,Descriptor1>* rescaleEngine; 00133 InterpolationEngine2D<T,Descriptor1>* interpolationEngine; 00134 std::vector<Dot3D> delta; 00135 }; 00136 00137 00138 00140 template<typename T, template<typename U> class Descriptor> 00141 class Copy_t1_to_t0_3D: public BoxProcessingFunctional3D_L<T,Descriptor> 00142 { 00143 public: 00144 Copy_t1_to_t0_3D(plint numTimeSteps_, plint executionTime_); 00145 virtual void process(Box3D domain, BlockLattice3D<T,Descriptor>& fineLattice); 00146 virtual Copy_t1_to_t0_3D<T,Descriptor>* clone() const; 00147 virtual BlockDomain::DomainT appliesTo() const { 00148 return BlockDomain::bulkAndEnvelope; 00149 } 00150 virtual void getTypeOfModification(std::vector<modif::ModifT>& modified) const { 00151 modified[0] = modif::staticVariables; 00152 } 00153 private: 00154 plint numTimeSteps; 00155 plint executionTime; 00156 }; 00157 00159 template<typename T, template<typename U> class Descriptor1, template<typename U> class Descriptor2> 00160 class CopyFineToCoarse3D : public BoxProcessingFunctional3D_LL<T,Descriptor1,T,Descriptor2> 00161 { 00162 public: 00163 CopyFineToCoarse3D( RescaleEngine<T,Descriptor1>* rescaleEngine_, 00164 plint numTimeSteps_, plint executionTime_ ); 00165 virtual ~CopyFineToCoarse3D(); 00166 CopyFineToCoarse3D(CopyFineToCoarse3D<T,Descriptor1,Descriptor2> const& rhs); 00167 CopyFineToCoarse3D<T,Descriptor1,Descriptor2>& operator=(CopyFineToCoarse3D<T,Descriptor1,Descriptor2> const& rhs); 00168 virtual void process( Box3D domain, 00169 BlockLattice3D<T,Descriptor1>& fineLattice, 00170 BlockLattice3D<T,Descriptor2>& coarseLattice ); 00171 virtual CopyFineToCoarse3D<T,Descriptor1,Descriptor2>* clone() const; 00172 virtual BlockDomain::DomainT appliesTo() const { 00173 return BlockDomain::bulk; 00174 } 00175 virtual void getTypeOfModification(std::vector<modif::ModifT>& modified) const { 00176 modified[0] = modif::nothing; 00177 modified[1] = modif::staticVariables; 00178 } 00179 private: 00180 RescaleEngine<T,Descriptor1>* rescaleEngine; 00181 plint numTimeSteps; 00182 plint executionTime; 00183 }; 00184 00187 template<typename T, template<typename U> class Descriptor> 00188 class CoarseToFineConverter3D { 00189 public: 00190 CoarseToFineConverter3D( BlockLattice3D<T,Descriptor> const& coarseLattice, 00191 BlockLattice3D<T,Descriptor>& fineLattice_ ) 00192 : fineLattice(fineLattice_), 00193 coarseLocation(coarseLattice.getLocation()), 00194 fineLocation(fineLattice.getLocation()) 00195 { } 00197 plint fineX(plint coarseX) const { 00198 return (coarseX+coarseLocation.x)*2 - fineLocation.x; 00199 } 00201 plint fineY(plint coarseY) const { 00202 return (coarseY+coarseLocation.y)*2 - fineLocation.y; 00203 } 00205 plint fineZ(plint coarseZ) const { 00206 return (coarseZ+coarseLocation.z)*2 - fineLocation.z; 00207 } 00208 00211 FineGridBoundaryDynamics<T,Descriptor>& fineDynamics ( 00212 Dot3D coarsePos, Dot3D delta ) 00213 { 00214 return dynamic_cast<FineGridBoundaryDynamics<T,Descriptor>&> ( 00215 fineLattice.get( fineX(coarsePos.x) + delta.x, 00216 fineY(coarsePos.y) + delta.y, 00217 fineZ(coarsePos.z) + delta.z ).getDynamics() ); 00218 } 00219 00220 FineGridBoundaryDynamics<T,Descriptor>& fineDynamics ( 00221 plint x, plint y, plint z, plint deltaX, plint deltaY, plint deltaZ ){ 00222 return fineDynamics(Dot3D(x,y,z),Dot3D(deltaX,deltaY,deltaZ)); 00223 } 00224 00225 private: 00226 BlockLattice3D<T,Descriptor> &fineLattice; 00227 Dot3D coarseLocation, fineLocation; 00228 }; 00229 00230 00231 } // namespace plb 00232 00233 #endif // GRID_REFINEMENT_PROCESSORS_3D_H
1.6.3
1.6.3