$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 00029 #ifndef MULTI_DATA_FIELD_2D_H 00030 #define MULTI_DATA_FIELD_2D_H 00031 00032 #include "core/globalDefs.h" 00033 #include "core/plbDebug.h" 00034 #include "core/dataFieldBase2D.h" 00035 #include "core/dataFieldBase2D.h" 00036 #include "atomicBlock/dataField2D.h" 00037 #include "multiBlock/multiBlock2D.h" 00038 #include <vector> 00039 00040 namespace plb { 00041 00042 template<typename T> class MultiScalarField2D; 00043 00044 template<typename T> 00045 struct MultiScalarAccess2D { 00046 virtual ~MultiScalarAccess2D() { } 00047 virtual T& getDistributedScalar ( 00048 plint iX, plint iY, 00049 MultiBlockManagement2D const& multiBlockManagement, 00050 std::map<plint,ScalarField2D<T>*>& fields ) =0; 00051 virtual T const& getDistributedScalar ( 00052 plint iX, plint iY, 00053 MultiBlockManagement2D const& multiBlockManagement, 00054 std::map<plint,ScalarField2D<T>*> const& fields ) const =0; 00055 virtual MultiScalarAccess2D<T>* clone() const=0; 00056 }; 00057 00058 template<typename T> 00059 class MultiScalarField2D : public ScalarFieldBase2D<T>, public MultiBlock2D 00060 { 00061 public: 00062 typedef std::map<plint,ScalarField2D<T>*> BlockMap; 00063 public: 00064 MultiScalarField2D(MultiBlockManagement2D const& multiBlockManagement_, 00065 BlockCommunicator2D* blockCommunicator_, 00066 CombinedStatistics* combinedStatistics_, 00067 MultiScalarAccess2D<T>* multiScalarAccess_, T iniVal=T()); 00068 MultiScalarField2D(plint nx, plint ny, T iniVal=T()); 00069 ~MultiScalarField2D(); 00070 MultiScalarField2D(MultiScalarField2D<T> const& rhs); 00071 MultiScalarField2D(MultiBlock2D const& rhs); 00075 MultiScalarField2D(MultiBlock2D const& rhs, Box2D subDomain, bool crop=true); 00076 MultiScalarField2D<T>& operator=(MultiScalarField2D<T> const& rhs); 00077 MultiScalarField2D<T>* clone() const; 00078 MultiScalarField2D<T>* clone(MultiBlockManagement2D const& newMultiBlockManagement) const; 00079 void swap(MultiScalarField2D<T>& rhs); 00080 public: 00081 virtual void reset(); 00082 virtual T& get(plint iX, plint iY); 00083 virtual T const& get(plint iX, plint iY) const; 00084 public: 00085 virtual ScalarField2D<T>& getComponent(plint iBlock); 00086 virtual ScalarField2D<T> const& getComponent(plint iBlock) const; 00087 virtual plint sizeOfCell() const; 00088 virtual plint getCellDim() const; 00089 virtual int getStaticId() const; 00090 virtual void copyReceive ( 00091 MultiBlock2D const& fromBlock, Box2D const& fromDomain, 00092 Box2D const& toDomain, modif::ModifT whichData=modif::dataStructure ); 00093 std::string getBlockName() const; 00094 std::vector<std::string> getTypeInfo() const; 00095 static std::string blockName(); 00096 static std::string basicType(); 00097 private: 00098 void allocateFields(T iniVal=T()); 00099 void deAllocateFields(); 00100 private: 00101 BlockMap fields; 00102 MultiScalarAccess2D<T>* multiScalarAccess; 00103 static const int staticId; 00104 }; 00105 00106 00107 template<typename T, int nDim> class MultiTensorField2D; 00108 00109 template<typename T, int nDim> 00110 struct MultiTensorAccess2D { 00111 virtual ~MultiTensorAccess2D() { } 00112 virtual Array<T,nDim>& getDistributedTensor ( 00113 plint iX, plint iY, 00114 MultiBlockManagement2D const& multiBlockManagement, 00115 std::map<plint,TensorField2D<T,nDim>*>& fields ) =0; 00116 virtual Array<T,nDim> const& getDistributedTensor ( 00117 plint iX, plint iY, 00118 MultiBlockManagement2D const& multiBlockManagement, 00119 std::map<plint,TensorField2D<T,nDim>*> const& fields ) const =0; 00120 virtual MultiTensorAccess2D<T,nDim>* clone() const=0; 00121 }; 00122 00123 00124 template<typename T, int nDim> 00125 class MultiTensorField2D : public TensorFieldBase2D<T,nDim>, public MultiBlock2D 00126 { 00127 public: 00128 typedef std::map<plint,TensorField2D<T,nDim>*> BlockMap; 00129 public: 00130 MultiTensorField2D(MultiBlockManagement2D const& multiBlockManagement_, 00131 BlockCommunicator2D* blockCommunicator_, 00132 CombinedStatistics* combinedStatistics_, 00133 MultiTensorAccess2D<T,nDim>* multiTensorAccess_); 00134 MultiTensorField2D(MultiBlockManagement2D const& multiBlockManagement_, 00135 BlockCommunicator2D* blockCommunicator_, 00136 CombinedStatistics* combinedStatistics_, 00137 MultiTensorAccess2D<T,nDim>* multiTensorAccess_, 00138 Array<T,nDim> const& iniVal); 00139 MultiTensorField2D(plint nx, plint ny); 00140 MultiTensorField2D(plint nx, plint ny, Array<T,nDim> const& iniVal); 00141 ~MultiTensorField2D(); 00142 MultiTensorField2D(MultiTensorField2D<T,nDim> const& rhs); 00143 MultiTensorField2D(MultiBlock2D const& rhs); 00147 MultiTensorField2D(MultiBlock2D const& rhs, Box2D subDomain, bool crop=true); 00148 MultiTensorField2D<T,nDim>& operator=(MultiTensorField2D<T,nDim> const& rhs); 00149 MultiTensorField2D<T,nDim>* clone() const; 00150 MultiTensorField2D<T,nDim>* clone(MultiBlockManagement2D const& newMultiBlockManagement) const; 00151 void swap(MultiTensorField2D<T,nDim>& rhs); 00152 public: 00153 virtual void reset(); 00154 virtual Array<T,nDim>& get(plint iX, plint iY); 00155 virtual Array<T,nDim> const& get(plint iX, plint iY) const; 00156 public: 00157 virtual TensorField2D<T,nDim>& getComponent(plint iBlock); 00158 virtual TensorField2D<T,nDim> const& getComponent(plint iBlock) const; 00159 virtual plint sizeOfCell() const; 00160 virtual plint getCellDim() const; 00161 virtual int getStaticId() const; 00162 virtual void copyReceive ( 00163 MultiBlock2D const& fromBlock, Box2D const& fromDomain, 00164 Box2D const& toDomain, modif::ModifT whichData=modif::dataStructure ); 00165 std::string getBlockName() const; 00166 std::vector<std::string> getTypeInfo() const; 00167 static std::string blockName(); 00168 static std::string basicType(); 00169 private: 00170 void allocateFields(); 00171 void allocateFields(Array<T,nDim> const& iniVal); 00172 void deAllocateFields(); 00173 private: 00174 BlockMap fields; 00175 MultiTensorAccess2D<T,nDim>* multiTensorAccess; 00176 static const int staticId; 00177 }; 00178 00179 00180 template<typename T> class MultiNTensorField2D; 00181 00182 template<typename T> 00183 struct MultiNTensorAccess2D { 00184 virtual ~MultiNTensorAccess2D() { } 00185 virtual T* getDistributedNTensor ( 00186 plint iX, plint iY, 00187 MultiBlockManagement2D const& multiBlockManagement, 00188 std::map<plint,NTensorField2D<T>*>& fields ) =0; 00189 virtual T const* getDistributedNTensor ( 00190 plint iX, plint iY, 00191 MultiBlockManagement2D const& multiBlockManagement, 00192 std::map<plint,NTensorField2D<T>*> const& fields ) const =0; 00193 virtual MultiNTensorAccess2D<T>* clone() const=0; 00194 }; 00195 00196 00197 template<typename T> 00198 class MultiNTensorField2D : public NTensorFieldBase2D<T>, public MultiBlock2D 00199 { 00200 public: 00201 typedef std::map<plint,NTensorField2D<T>*> BlockMap; 00202 public: 00203 MultiNTensorField2D(plint ndim, 00204 MultiBlockManagement2D const& multiBlockManagement_, 00205 BlockCommunicator2D* blockCommunicator_, 00206 CombinedStatistics* combinedStatistics_, 00207 MultiNTensorAccess2D<T>* multiNTensorAccess_); 00208 MultiNTensorField2D(plint ndim, T const* iniVal, 00209 MultiBlockManagement2D const& multiBlockManagement_, 00210 BlockCommunicator2D* blockCommunicator_, 00211 CombinedStatistics* combinedStatistics_, 00212 MultiNTensorAccess2D<T>* multiNTensorAccess_); 00213 MultiNTensorField2D(plint nx, plint ny, plint ndim); 00214 MultiNTensorField2D(plint nx, plint ny, plint ndim, T const* iniVal); 00215 ~MultiNTensorField2D(); 00216 MultiNTensorField2D(MultiNTensorField2D<T> const& rhs); 00217 MultiNTensorField2D(plint ndim, MultiBlock2D const& rhs); 00221 MultiNTensorField2D(plint ndim, MultiBlock2D const& rhs, Box2D subDomain, bool crop=true); 00222 MultiNTensorField2D<T>& operator=(MultiNTensorField2D<T> const& rhs); 00223 MultiNTensorField2D<T>* clone() const; 00224 MultiNTensorField2D<T>* clone(MultiBlockManagement2D const& newMultiBlockManagement) const; 00225 void swap(MultiNTensorField2D<T>& rhs); 00226 public: 00227 virtual void reset(); 00228 virtual T* get(plint iX, plint iY); 00229 virtual T const* get(plint iX, plint iY) const; 00230 public: 00231 virtual NTensorField2D<T>& getComponent(plint iBlock); 00232 virtual NTensorField2D<T> const& getComponent(plint iBlock) const; 00233 virtual plint sizeOfCell() const; 00234 virtual plint getCellDim() const; 00235 virtual int getStaticId() const; 00236 virtual void copyReceive ( 00237 MultiBlock2D const& fromBlock, Box2D const& fromDomain, 00238 Box2D const& toDomain, modif::ModifT whichData=modif::dataStructure ); 00239 std::string getBlockName() const; 00240 std::vector<std::string> getTypeInfo() const; 00241 static std::string blockName(); 00242 static std::string basicType(); 00243 private: 00244 void allocateFields(); 00245 void allocateFields(T const* iniVal); 00246 void deAllocateFields(); 00247 private: 00248 BlockMap fields; 00249 MultiNTensorAccess2D<T>* multiNTensorAccess; 00250 static const int staticId; 00251 }; 00252 00253 } // namespace plb 00254 00255 #endif // MULTI_DATA_FIELD_2D_H
1.6.3
1.6.3