$treeview $search $mathjax
Palabos  Version 1.1
$projectbrief
$projectbrief
$searchbox

multiDataField2D.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 
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