|
Palabos
Version 1.0
|
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 00030 #ifndef DATA_FIELD_3D_H 00031 #define DATA_FIELD_3D_H 00032 00033 #include "core/globalDefs.h" 00034 #include "core/plbDebug.h" 00035 #include "atomicBlock/dataField2D.h" 00036 #include "core/dataFieldBase2D.h" 00037 #include "core/dataFieldBase3D.h" 00038 #include "atomicBlock/atomicBlock3D.h" 00039 00040 namespace plb { 00041 00042 template<typename T> class ScalarField3D; 00043 00044 template<typename T> 00045 class ScalarFieldDataTransfer3D : public BlockDataTransfer3D { 00046 public: 00047 ScalarFieldDataTransfer3D(ScalarField3D<T>& field_); 00048 virtual plint staticCellSize() const; 00050 virtual void send(Box3D domain, std::vector<char>& buffer, modif::ModifT kind) const; 00052 virtual void receive(Box3D domain, std::vector<char> const& buffer, modif::ModifT kind ); 00053 virtual void receive(Box3D domain, std::vector<char> const& buffer, 00054 modif::ModifT kind, std::map<int,std::string> const& foreignIds ) 00055 { 00056 receive(domain, buffer, kind); 00057 } 00059 virtual void attribute(Box3D toDomain, plint deltaX, plint deltaY, plint deltaZ, 00060 AtomicBlock3D const& from, modif::ModifT kind); 00061 private: 00062 ScalarField3D<T>& field; 00063 }; 00064 00065 00066 template<typename T> 00067 class ScalarField3D : public ScalarFieldBase3D<T>, public AtomicBlock3D { 00068 public: 00069 ScalarField3D(plint nx_, plint ny_, plint nz_, T iniVal=T()); 00070 ~ScalarField3D(); 00071 ScalarField3D(ScalarField3D<T> const& rhs); 00072 ScalarField3D<T>& operator=(ScalarField3D<T> const& rhs); 00073 void swap(ScalarField3D<T>& rhs); 00074 public: 00075 virtual void reset(); 00076 virtual pluint getSize() const { return (pluint)this->getNx()*(pluint)this->getNy()*(pluint)this->getNz(); } 00077 virtual T& get(plint iX, plint iY, plint iZ) { 00078 PLB_PRECONDITION(iX>=0 && iX<this->getNx()); 00079 PLB_PRECONDITION(iY>=0 && iY<this->getNy()); 00080 PLB_PRECONDITION(iZ>=0 && iZ<this->getNz()); 00081 return field[iX][iY][iZ]; 00082 } 00083 virtual T const& get(plint iX, plint iY, plint iZ) const { 00084 PLB_PRECONDITION(iX>=0 && iX<this->getNx()); 00085 PLB_PRECONDITION(iY>=0 && iY<this->getNy()); 00086 PLB_PRECONDITION(iZ>=0 && iZ<this->getNz()); 00087 return field[iX][iY][iZ]; 00088 } 00089 T& operator[] (plint ind) { 00090 PLB_PRECONDITION(ind>=0 && ind<this->getNx()*this->getNy()*this->getNz()); 00091 return rawData[ind]; 00092 } 00093 T const& operator[] (plint ind) const { 00094 PLB_PRECONDITION(ind>=0 && ind<this->getNx()*this->getNy()*this->getNz()); 00095 return rawData[ind]; 00096 } 00098 virtual ScalarFieldDataTransfer3D<T>& getDataTransfer(); 00100 virtual ScalarFieldDataTransfer3D<T> const& getDataTransfer() const; 00101 private: 00102 void allocateMemory(); 00103 void releaseMemory(); 00104 private: 00105 T *rawData; 00106 T ***field; 00107 ScalarFieldDataTransfer3D<T> dataTransfer; 00108 }; 00109 00110 template<typename T, int nDim> class TensorField3D; 00111 00112 template<typename T, int nDim> 00113 class TensorFieldDataTransfer3D : public BlockDataTransfer3D { 00114 public: 00115 TensorFieldDataTransfer3D(TensorField3D<T,nDim>& field_); 00116 virtual plint staticCellSize() const; 00118 virtual void send(Box3D domain, std::vector<char>& buffer, modif::ModifT kind) const; 00120 virtual void receive(Box3D domain, std::vector<char> const& buffer, modif::ModifT kind); 00121 virtual void receive(Box3D domain, std::vector<char> const& buffer, 00122 modif::ModifT kind, std::map<int,std::string> const& foreignIds ) 00123 { 00124 receive(domain, buffer, kind); 00125 } 00127 virtual void attribute(Box3D toDomain, plint deltaX, plint deltaY, plint deltaZ, 00128 AtomicBlock3D const& from, modif::ModifT kind); 00129 private: 00130 TensorField3D<T,nDim>& field; 00131 }; 00132 00133 00134 template<typename T, int nDim> 00135 class TensorField3D : public TensorFieldBase3D<T,nDim>, public AtomicBlock3D { 00136 public: 00137 TensorField3D(plint nx_, plint ny_, plint nz_); 00138 TensorField3D(plint nx_, plint ny_, plint nz_, Array<T,nDim> const& iniVal); 00139 ~TensorField3D(); 00140 TensorField3D(TensorField3D<T,nDim> const& rhs); 00141 TensorField3D<T,nDim>& operator=(TensorField3D<T,nDim> const& rhs); 00142 void swap(TensorField3D<T,nDim>& rhs); 00143 public: 00144 virtual void reset(); 00145 virtual Array<T,nDim>& get(plint iX, plint iY, plint iZ) { 00146 PLB_PRECONDITION(iX>=0 && iX<this->getNx()); 00147 PLB_PRECONDITION(iY>=0 && iY<this->getNy()); 00148 PLB_PRECONDITION(iZ>=0 && iZ<this->getNz()); 00149 return field[iX][iY][iZ]; 00150 } 00151 virtual Array<T,nDim> const& get(plint iX, plint iY, plint iZ) const { 00152 PLB_PRECONDITION(iX>=0 && iX<this->getNx()); 00153 PLB_PRECONDITION(iY>=0 && iY<this->getNy()); 00154 PLB_PRECONDITION(iZ>=0 && iZ<this->getNz()); 00155 return field[iX][iY][iZ]; 00156 } 00157 Array<T,nDim>& operator[] (plint ind) { 00158 PLB_PRECONDITION(ind>=0 && ind<this->getNx()*this->getNy()*this->getNz()); 00159 return rawData[ind]; 00160 } 00161 Array<T,nDim> const& operator[] (plint ind) const { 00162 PLB_PRECONDITION(ind>=0 && ind<this->getNx()*this->getNy()*this->getNz()); 00163 return rawData[ind]; 00164 } 00166 virtual TensorFieldDataTransfer3D<T,nDim>& getDataTransfer(); 00168 virtual TensorFieldDataTransfer3D<T,nDim> const& getDataTransfer() const; 00169 private: 00170 void allocateMemory(); 00171 void releaseMemory(); 00172 private: 00173 Array<T,nDim> *rawData; 00174 Array<T,nDim> ***field; 00175 TensorFieldDataTransfer3D<T,nDim> dataTransfer; 00176 }; 00177 00178 00179 template<typename T> class NTensorField3D; 00180 00181 template<typename T> 00182 class NTensorFieldDataTransfer3D : public BlockDataTransfer3D { 00183 public: 00184 NTensorFieldDataTransfer3D(NTensorField3D<T>& field_); 00185 virtual plint staticCellSize() const; 00187 virtual void send(Box3D domain, std::vector<char>& buffer, modif::ModifT kind) const; 00189 virtual void receive(Box3D domain, std::vector<char> const& buffer, modif::ModifT kind); 00190 virtual void receive(Box3D domain, std::vector<char> const& buffer, 00191 modif::ModifT kind, std::map<int,std::string> const& foreignIds ) 00192 { 00193 receive(domain, buffer, kind); 00194 } 00196 virtual void attribute(Box3D toDomain, plint deltaX, plint deltaY, plint deltaZ, 00197 AtomicBlock3D const& from, modif::ModifT kind); 00198 private: 00199 NTensorField3D<T>& field; 00200 }; 00201 00202 template<typename T> 00203 class NTensorField3D : public NTensorFieldBase3D<T>, public AtomicBlock3D { 00204 public: 00205 NTensorField3D(plint nx_, plint ny_, plint nz_, plint ndim_); 00206 NTensorField3D(plint nx_, plint ny_, plint nz_, plint ndim_, T const* iniVal); 00207 ~NTensorField3D(); 00208 NTensorField3D(NTensorField3D<T> const& rhs); 00209 NTensorField3D<T>& operator=(NTensorField3D<T> const& rhs); 00210 void swap(NTensorField3D<T>& rhs); 00211 public: 00212 virtual void reset(); 00213 virtual T* get(plint iX, plint iY, plint iZ) { 00214 PLB_PRECONDITION(iX>=0 && iX<this->getNx()); 00215 PLB_PRECONDITION(iY>=0 && iY<this->getNy()); 00216 PLB_PRECONDITION(iZ>=0 && iZ<this->getNz()); 00217 return field[iX][iY][iZ]; 00218 } 00219 virtual T const* get(plint iX, plint iY, plint iZ) const { 00220 PLB_PRECONDITION(iX>=0 && iX<this->getNx()); 00221 PLB_PRECONDITION(iY>=0 && iY<this->getNy()); 00222 PLB_PRECONDITION(iZ>=0 && iZ<this->getNz()); 00223 return field[iX][iY][iZ]; 00224 } 00225 T& operator[] (plint ind) { 00226 PLB_PRECONDITION(ind>=0 && ind<this->getNx()*this->getNy()*this->getNz()*this->getNdim()); 00227 return rawData[ind]; 00228 } 00229 T const& operator[] (plint ind) const { 00230 PLB_PRECONDITION(ind>=0 && ind<this->getNx()*this->getNy()*this->getNz()*this->getNdim()); 00231 return rawData[ind]; 00232 } 00234 virtual NTensorFieldDataTransfer3D<T>& getDataTransfer(); 00236 virtual NTensorFieldDataTransfer3D<T> const& getDataTransfer() const; 00237 private: 00238 void allocateMemory(); 00239 void releaseMemory(); 00240 private: 00241 T *rawData; 00242 T ****field; 00243 NTensorFieldDataTransfer3D<T> dataTransfer; 00244 }; 00245 00246 } // namespace plb 00247 00248 00249 #endif // DATA_FIELD_3D_H