Palabos  Version 1.0
dataField2D.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_2D_H
00031 #define DATA_FIELD_2D_H
00032 
00033 #include "core/globalDefs.h"
00034 #include "core/plbDebug.h"
00035 #include "core/dataFieldBase2D.h"
00036 #include "atomicBlock/atomicBlock2D.h"
00037 
00038 namespace plb {
00039 
00040 template<typename T> class ScalarField2D;
00041 
00042 template<typename T>
00043 class ScalarFieldDataTransfer2D : public BlockDataTransfer2D {
00044 public:
00045     ScalarFieldDataTransfer2D(ScalarField2D<T>& field_);
00046     virtual plint staticCellSize() const;
00048     virtual void send(Box2D domain, std::vector<char>& buffer, modif::ModifT kind) const;
00050     virtual void receive(Box2D domain, std::vector<char> const& buffer, modif::ModifT kind);
00051     virtual void receive( Box2D domain, std::vector<char> const& buffer, modif::ModifT kind,
00052                           std::map<int,std::string> const& foreignIds )
00053     {
00054         receive(domain, buffer, kind);
00055     }
00057     virtual void attribute(Box2D toDomain, plint deltaX, plint deltaY,
00058                            AtomicBlock2D const& from, modif::ModifT kind);
00059 private:
00060     ScalarField2D<T>& field;
00061 };
00062 
00063 template<typename T>
00064 class ScalarField2D : public ScalarFieldBase2D<T>, public AtomicBlock2D {
00065 public:
00066     ScalarField2D(plint nx_, plint ny_, T iniVal = T());
00067     ~ScalarField2D();
00068     ScalarField2D(ScalarField2D<T> const& rhs);
00069     ScalarField2D<T>& operator=(ScalarField2D<T> const& rhs);
00070     void swap(ScalarField2D<T>& rhs);
00071 public:
00072     virtual void reset();
00073     virtual pluint getSize() const { return (pluint)this->getNx()*(pluint)this->getNy(); }
00074     virtual T& get(plint iX, plint iY) {
00075         PLB_PRECONDITION(iX>=0 && iX<this->getNx());
00076         PLB_PRECONDITION(iY>=0 && iY<this->getNy());
00077         return field[iX][iY];
00078     }
00079     virtual T const& get(plint iX, plint iY) const {
00080         PLB_PRECONDITION(iX>=0 && iX<this->getNx());
00081         PLB_PRECONDITION(iY>=0 && iY<this->getNy());
00082         return field[iX][iY];
00083     }
00084     T& operator[] (plint ind) {
00085         PLB_PRECONDITION(ind>=0 && ind<this->getNx()*this->getNy());
00086         return rawData[ind];
00087     }
00088     T const& operator[] (plint ind) const {
00089         PLB_PRECONDITION(ind>=0 && ind<this->getNx()*this->getNy());
00090         return rawData[ind];
00091     }
00093     virtual ScalarFieldDataTransfer2D<T>& getDataTransfer();
00095     virtual ScalarFieldDataTransfer2D<T> const& getDataTransfer() const;
00096 private:
00097     void allocateMemory();
00098     void releaseMemory();
00099 private:
00100     T   *rawData;
00101     T   **field;
00102     ScalarFieldDataTransfer2D<T> dataTransfer;
00103 };
00104 
00105 
00106 
00107 template<typename T, int nDim> class TensorField2D;
00108 
00109 template<typename T, int nDim>
00110 class TensorFieldDataTransfer2D : public BlockDataTransfer2D {
00111 public:
00112     TensorFieldDataTransfer2D(TensorField2D<T,nDim>& field_);
00113     virtual plint staticCellSize() const;
00115     virtual void send(Box2D domain, std::vector<char>& buffer, modif::ModifT kind) const;
00117     virtual void receive(Box2D domain, std::vector<char> const& buffer, modif::ModifT kind);
00118     virtual void receive( Box2D domain, std::vector<char> const& buffer, modif::ModifT kind,
00119                           std::map<int,std::string> const& foreignIds )
00120     {
00121         return receive(domain, buffer, kind);
00122     }
00124     virtual void attribute(Box2D toDomain, plint deltaX, plint deltaY,
00125                            AtomicBlock2D const& from, modif::ModifT kind);
00126 private:
00127     TensorField2D<T,nDim>& field;
00128 };
00129 
00130 template<typename T, int nDim>
00131 class TensorField2D : public TensorFieldBase2D<T,nDim>, public AtomicBlock2D {
00132 public:
00133     TensorField2D(plint nx_, plint ny_);
00134     TensorField2D(plint nx_, plint ny_, Array<T,nDim> const& iniVal);
00135     ~TensorField2D();
00136     TensorField2D(TensorField2D<T,nDim> const& rhs);
00137     TensorField2D<T,nDim>& operator=(TensorField2D<T,nDim> const& rhs);
00138     void swap(TensorField2D<T,nDim>& rhs);
00139 public:
00140     virtual void reset();
00141     virtual Array<T,nDim>& get(plint iX, plint iY) {
00142         PLB_PRECONDITION(iX>=0 && iX<this->getNx());
00143         PLB_PRECONDITION(iY>=0 && iY<this->getNy());
00144         return field[iX][iY];
00145     }
00146     virtual Array<T,nDim> const& get(plint iX, plint iY) const {
00147         PLB_PRECONDITION(iX>=0 && iX<this->getNx());
00148         PLB_PRECONDITION(iY>=0 && iY<this->getNy());
00149         return field[iX][iY];
00150     }
00151     Array<T,nDim>& operator[] (plint ind) {
00152         PLB_PRECONDITION(ind>=0 && ind<this->getNx()*this->getNy());
00153         return rawData[ind];
00154     }
00155     Array<T,nDim> const& operator[] (plint ind) const {
00156         PLB_PRECONDITION(ind>=0 && ind<this->getNx()*this->getNy());
00157         return rawData[ind];
00158     }
00160     virtual TensorFieldDataTransfer2D<T,nDim>& getDataTransfer();
00162     virtual TensorFieldDataTransfer2D<T,nDim> const& getDataTransfer() const;
00163 private:
00164     void allocateMemory();
00165     void releaseMemory();
00166 private:
00167     Array<T,nDim> *rawData;
00168     Array<T,nDim> **field;
00169     TensorFieldDataTransfer2D<T,nDim> dataTransfer;
00170 };
00171 
00172 template<typename T> class NTensorField2D;
00173 
00174 template<typename T>
00175 class NTensorFieldDataTransfer2D : public BlockDataTransfer2D {
00176 public:
00177     NTensorFieldDataTransfer2D(NTensorField2D<T>& field_);
00178     virtual plint staticCellSize() const;
00180     virtual void send(Box2D domain, std::vector<char>& buffer, modif::ModifT kind) const;
00182     virtual void receive(Box2D domain, std::vector<char> const& buffer, modif::ModifT kind);
00183     virtual void receive(Box2D domain, std::vector<char> const& buffer,
00184                          modif::ModifT kind, std::map<int,std::string> const& foreignIds )
00185     {
00186         receive(domain, buffer, kind);
00187     }
00189     virtual void attribute(Box2D toDomain, plint deltaX, plint deltaY,
00190                            AtomicBlock2D const& from, modif::ModifT kind);
00191 private:
00192     NTensorField2D<T>& field;
00193 };
00194 
00195 template<typename T>
00196 class NTensorField2D : public NTensorFieldBase2D<T>, public AtomicBlock2D {
00197 public:
00198     NTensorField2D(plint nx_, plint ny_, plint ndim_);
00199     NTensorField2D(plint nx_, plint ny_, plint ndim_, T const* iniVal);
00200     ~NTensorField2D();
00201     NTensorField2D(NTensorField2D<T> const& rhs);
00202     NTensorField2D<T>& operator=(NTensorField2D<T> const& rhs);
00203     void swap(NTensorField2D<T>& rhs);
00204 public:
00205     virtual void reset();
00206     virtual T* get(plint iX, plint iY) {
00207         PLB_PRECONDITION(iX>=0 && iX<this->getNx());
00208         PLB_PRECONDITION(iY>=0 && iY<this->getNy());
00209         return field[iX][iY];
00210     }
00211     virtual T const* get(plint iX, plint iY) const {
00212         PLB_PRECONDITION(iX>=0 && iX<this->getNx());
00213         PLB_PRECONDITION(iY>=0 && iY<this->getNy());
00214         return field[iX][iY];
00215     }
00216     T& operator[] (plint ind) {
00217         PLB_PRECONDITION(ind>=0 && ind<this->getNx()*this->getNy()*this->getNdim());
00218         return rawData[ind];
00219     }
00220     T const& operator[] (plint ind) const {
00221         PLB_PRECONDITION(ind>=0 && ind<this->getNx()*this->getNy()*this->getNdim());
00222         return rawData[ind];
00223     }
00225     virtual NTensorFieldDataTransfer2D<T>& getDataTransfer();
00227     virtual NTensorFieldDataTransfer2D<T> const& getDataTransfer() const;
00228 private:
00229     void allocateMemory();
00230     void releaseMemory();
00231 private:
00232     T *rawData;
00233     T ***field;
00234     NTensorFieldDataTransfer2D<T> dataTransfer;
00235 };
00236 
00237 }  // namespace plb
00238 
00239 #endif  // DATA_FIELD_2D_H