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