$treeview $search $mathjax
|
Palabos
Version 1.1
$projectbrief
|
$projectbrief
|
$searchbox |
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
1.6.3
1.6.3