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

multiBlock3D.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 
00028 #ifndef MULTI_BLOCK_3D_H
00029 #define MULTI_BLOCK_3D_H
00030 
00031 #include "core/globalDefs.h"
00032 #include "core/geometry3D.h"
00033 #include "core/array.h"
00034 #include "core/util.h"
00035 #include "multiBlock/multiBlockManagement3D.h"
00036 #include "multiBlock/blockCommunicator3D.h"
00037 #include "multiBlock/combinedStatistics.h"
00038 #include "atomicBlock/dataProcessor3D.h"
00039 #include "core/block3D.h"
00040 #include "core/blockStatistics.h"
00041 #include <utility>
00042 #include <string>
00043 #include <vector>
00044 
00045 namespace plb {
00046 
00047 class AtomicBlock3D;
00048 class MultiBlock3D;
00049 class MultiBlockRegistration3D;
00050 template <typename T> class TypedAtomicBlock3D;
00051 template <typename T> class EulerianAtomicBlock3D;
00052 
00054 class MultiStatSubscriber3D : public StatSubscriber {
00055 public:
00056     MultiStatSubscriber3D(MultiBlock3D& multiBlock_);
00058     virtual plint subscribeAverage();
00060     virtual plint subscribeSum();
00062     virtual plint subscribeMax();
00064     virtual plint subscribeIntSum();
00065 private:
00066     MultiBlock3D& multiBlock;
00067 };
00068 
00069 class PeriodicitySwitch3D {
00070 public:
00072     PeriodicitySwitch3D(MultiBlock3D& block_);
00073     PeriodicitySwitch3D(MultiBlock3D& block_, PeriodicitySwitch3D const& rhs);
00074     PeriodicitySwitch3D& operator=(PeriodicitySwitch3D const& rhs);
00075 
00077     void toggle(plint direction, bool periodic);
00079     void toggleAll(bool periodic);
00081     bool get(plint direction) const;
00083     bool get(plint normalX, plint normalY, plint normalZ) const;
00085     Box3D getPeriodicEnvelope(Box3D const& bulk, plint envelopeWidth) const;
00086 private:
00087     Array<bool,3> periodicity;
00088     MultiBlock3D& block;
00089 };
00090 
00091 class MultiBlock3D : public Block3D {
00092 public: 
00093     typedef std::pair<MultiBlock3D*, modif::ModifT> BlockAndModif;
00094 public:
00095     class ProcessorStorage3D {
00096     public:
00097         ProcessorStorage3D(DataProcessorGenerator3D const& generator_,
00098                            std::vector<MultiBlock3D*> const& multiBlocks_,
00099                            plint level_);
00100         ~ProcessorStorage3D();
00101         ProcessorStorage3D(ProcessorStorage3D const& rhs);
00102         ProcessorStorage3D& operator=(ProcessorStorage3D const& rhs);
00103         void swap(ProcessorStorage3D& rhs);
00104         ProcessorStorage3D* clone() const;
00105         DataProcessorGenerator3D const& getGenerator() const;
00106         std::vector<id_t> const& getMultiBlockIds() const;
00107         std::vector<MultiBlock3D*> getMultiBlocks() const;
00108         plint getLevel() const;
00109         void replace(id_t oldBlock, id_t newBlock);
00110     private:
00111         DataProcessorGenerator3D* generator;
00112         std::vector<id_t> multiBlockIds;
00113         plint level;
00114     };
00115 public:
00116     MultiBlock3D( MultiBlockManagement3D const& multiBlockManagement_,
00117                   BlockCommunicator3D* blockCommunicator_,
00118                   CombinedStatistics* combinedStatistics_ );
00119     MultiBlock3D( plint nx, plint ny, plint nz, plint envelopeWidth );
00120     MultiBlock3D( MultiBlock3D const& rhs );
00121     MultiBlock3D( MultiBlock3D const& rhs, Box3D subDomain, bool crop );
00122     void swap(MultiBlock3D& rhs);
00123     virtual ~MultiBlock3D();
00124     id_t getId() const;
00125     virtual int getStaticId() const =0;
00126     virtual MultiBlock3D* clone() const =0;
00127     virtual MultiBlock3D* clone(MultiBlockManagement3D const& newManagement) const =0;
00129     void initialize();
00130 public:
00131     virtual Box3D getBoundingBox() const;
00133     plint getNx() const;
00135     plint getNy() const;
00137     plint getNz() const;
00139     void executeInternalProcessors();
00141     void executeInternalProcessors(plint level);
00144     void subscribeProcessor(plint level,
00145                             std::vector<MultiBlock3D*> modifiedBlocks,
00146                             std::vector<modif::ModifT> typeOfModification,
00147                             bool includesEnvelope);
00148     void storeProcessor(DataProcessorGenerator3D const& generator,
00149                         std::vector<MultiBlock3D*> multiBlocks, plint level);
00150     std::vector<ProcessorStorage3D> const& getStoredProcessors() const;
00151 public:
00152     MultiBlockManagement3D const& getMultiBlockManagement() const;
00153     void setCoProcessors(std::map<plint,int> const& coProcessors);
00154     LocalMultiBlockInfo3D const& getLocalInfo() const;
00155     SparseBlockStructure3D const& getSparseBlockStructure() const;
00158     BlockStatistics& getInternalStatistics();
00160     BlockStatistics const& getInternalStatistics() const;
00162     StatSubscriber& internalStatSubscription();
00164     void evaluateStatistics();
00165     CombinedStatistics const& getCombinedStatistics() const;
00166     void toggleInternalStatistics(bool statisticsOn_);
00167     bool isInternalStatisticsOn() const;
00168     PeriodicitySwitch3D const& periodicity() const;
00169     PeriodicitySwitch3D& periodicity();
00172     modif::ModifT getInternalTypeOfModification() const;
00175     void setInternalTypeOfModification(modif::ModifT internalModifT_);
00176     void setRefinementLevel(plint newLevel);
00177 public:
00178     virtual AtomicBlock3D& getComponent(plint blockId) =0;
00179     virtual AtomicBlock3D const& getComponent(plint blockId) const =0;
00180     virtual plint sizeOfCell() const =0;
00181     virtual plint getCellDim() const =0;
00182 private:
00183     void addModifiedBlocks(plint level,
00184                            std::vector<MultiBlock3D*> modifiedBlocks,
00185                            std::vector<modif::ModifT> typeOfModification,
00186                            std::vector<std::vector<BlockAndModif> >& multiBlockCollection,
00187                            bool includesEnvelope);
00188     void duplicateOverlapsInModifiedMultiBlocks(plint level);
00189     void duplicateOverlapsInModifiedMultiBlocks(std::vector<BlockAndModif>& multiBlocks);
00190     void duplicateOverlapsAtLevelZero(std::vector<BlockAndModif>& multiBlocks);
00191     void reduceStatistics();
00192 public:
00193     BlockCommunicator3D const& getBlockCommunicator() const;
00194     virtual void copyReceive (
00195                 MultiBlock3D const& fromBlock, Box3D const& fromDomain,
00196                 Box3D const& toDomain, modif::ModifT whichData=modif::dataStructure ) =0;
00197     void duplicateOverlaps(modif::ModifT whichData);
00198     void signalPeriodicity();
00199     virtual DataSerializer* getBlockSerializer (
00200             Box3D const& domain, IndexOrdering::OrderingT ordering ) const;
00201     virtual DataUnSerializer* getBlockUnSerializer (
00202             Box3D const& domain, IndexOrdering::OrderingT ordering );
00204     void resetFlags();
00206     virtual void getDynamicsDict(Box3D domain, std::map<std::string,int>& dict);
00208     virtual std::string getBlockName() const =0;
00211     virtual std::vector<std::string> getTypeInfo() const =0;
00212 private:
00213     MultiBlockManagement3D multiBlockManagement;
00216     std::vector<std::vector<BlockAndModif> > multiBlocksChangedByManualProcessors;
00219     std::vector<std::vector<BlockAndModif> > multiBlocksChangedByAutomaticProcessors;
00220     plint maxProcessorLevel;
00221     std::vector<ProcessorStorage3D> storedProcessors;
00222     BlockCommunicator3D* blockCommunicator;
00223     BlockStatistics internalStatistics;
00224     CombinedStatistics* combinedStatistics;
00225     MultiStatSubscriber3D statSubscriber;
00226     bool statisticsOn;
00227     PeriodicitySwitch3D periodicitySwitch;
00228     modif::ModifT internalModifT;
00229     id_t id;
00230 };
00231 
00232 class MultiBlockRegistration3D {
00233 public:
00234     id_t announce(MultiBlock3D& block);
00235     void release(MultiBlock3D& block);
00236     MultiBlock3D* find(id_t id);
00237 private:
00238     MultiBlockRegistration3D();
00239     MultiBlockRegistration3D(MultiBlockRegistration3D const& rhs);
00240     MultiBlockRegistration3D& operator=(MultiBlockRegistration3D const& rhs);
00241 private:
00242     util::UniqueId uniqueId;
00243     std::map<id_t,MultiBlock3D*> multiBlocks;
00244 friend MultiBlockRegistration3D& multiBlockRegistration3D();
00245 };
00246 
00247 MultiBlockRegistration3D& multiBlockRegistration3D();
00248 
00249 } // namespace plb
00250 
00251 #endif  // MULTI_BLOCK_3D_H