Palabos  Version 1.0
dataField3D.h
Go to the documentation of this file.
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