⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 multiblocklattice2d.h

📁 open lattice boltzmann project www.openlb.org
💻 H
字号:
/*  This file is part of the OpenLB library * *  Copyright (C) 2007, 2008 Jonas Latt *  Address: Rue General Dufour 24,  1211 Geneva 4, Switzerland  *  E-mail: jonas.latt@gmail.com * *  This program is free software; you can redistribute it and/or *  modify it under the terms of the GNU General Public License *  as published by the Free Software Foundation; either version 2 *  of the License, or (at your option) any later version. * *  This program is distributed in the hope that it will be useful, *  but WITHOUT ANY WARRANTY; without even the implied warranty of *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the *  GNU General Public License for more details. * *  You should have received a copy of the GNU General Public  *  License along with this program; if not, write to the Free  *  Software Foundation, Inc., 51 Franklin Street, Fifth Floor, *  Boston, MA  02110-1301, USA.*//** \file * A 2D multiblock lattice -- header file. */#ifndef MULTI_BLOCK_LATTICE_2D_H#define MULTI_BLOCK_LATTICE_2D_H#include "core/blockLattice2D.h"#include "core/cell.h"#include "core/dynamics.h"#include "multiBlockStatistics.h"#include "multiBlockHandler2D.h"#include "multiSerializer2D.h"#include "core/dataAnalysisBase2D.h"#include <vector>namespace olb {template<typename T, template<typename U> class Lattice> class MultiDataAnalysis2D;template<typename T, template<typename U> class Lattice> class MultiBlockSerializerPolicy2D;template<typename T, template<typename U> class Lattice> class MultiBlockUnSerializerPolicy2D;/// A complex BlockStructure, itself decomposed into smaller components./** This extensible class can be used for example for cache-optimized * lattices, irregular domains (no memory allocation in areas exterior to * the domain) and parallel lattices. The actual behavior of the lattice * is parametrizable by a multiBlockHandler instance, which is given to * the constructor. * * The MultiBlockLattice does not itself possess PostProcessors. The Post- * Processors are delegated to the respective BlockStructures. */template<typename T, template<typename U> class Lattice>class MultiBlockLattice2D : public BlockStructure2D<T,Lattice> {public:    MultiBlockLattice2D(MultiDataDistribution2D const& dataDistribution_);    ~MultiBlockLattice2D();    MultiBlockLattice2D(MultiBlockLattice2D const& rhs);    MultiBlockLattice2D<T,Lattice>& operator=(MultiBlockLattice2D<T,Lattice> const& rhs);    void swap(MultiBlockLattice2D<T,Lattice>& rhs);    virtual int getNx() const { return multiBlockHandler->getNx(); }    virtual int getNy() const { return multiBlockHandler->getNy(); }    virtual Cell<T,Lattice>& get(int iX, int iY);    virtual Cell<T,Lattice> const& get(int iX, int iY) const;    virtual void initialize();    virtual void defineDynamics(int x0_, int x1_, int y0_, int y1_, Dynamics<T,Lattice>* dynamics);    virtual void defineDynamics(int iX, int iY, Dynamics<T,Lattice>* dynamics);    virtual void specifyStatisticsStatus(int x0_, int x1_, int y0_, int y1_, bool status);    virtual void collide(int x0_, int x1_, int y0_, int y1_);    virtual void collide();    virtual void staticCollide (int x0, int x1, int y0, int y1, TensorFieldBase2D<T,2> const& u);    virtual void staticCollide (TensorFieldBase2D<T,2> const& u);    virtual void stream(int x0_, int x1_, int y0_, int y1_);    virtual void stream(bool periodic=false);    virtual void collideAndStream(int x0_, int x1_, int y0_, int y1_);    virtual void collideAndStream(bool periodic=false);    virtual T computeAverageDensity(int x0_, int x1_, int y0_, int y1_) const;    virtual T computeAverageDensity() const;    virtual void stripeOffDensityOffset (            int x0_, int x1_, int y0_, int y1_, T offset );    virtual void stripeOffDensityOffset(T offset);    virtual void forAll(int x0_, int x1_, int y0_, int y1_,                        WriteCellFunctional<T,Lattice> const& application);    virtual void forAll(WriteCellFunctional<T,Lattice> const& application);    virtual void addPostProcessor (                PostProcessorGenerator2D<T,Lattice> const& ppGen );    virtual void resetPostProcessors();    virtual void postProcess(int x0_, int x1_, int y0_, int y1_);    virtual void postProcess();    virtual void addLatticeCoupling (                     LatticeCouplingGenerator2D<T,Lattice> const& lcGen,                     std::vector<SpatiallyExtendedObject2D*> partners );    virtual void executeCoupling(int x0_, int x1_, int y0_, int y1_);    virtual void executeCoupling();    virtual void subscribeReductions(Reductor<T>& reductor);    virtual LatticeStatistics<T>& getStatistics();    virtual LatticeStatistics<T> const& getStatistics() const;    virtual DataAnalysisBase2D<T,Lattice> const& getDataAnalysis() const;    virtual DataSerializer<T> const& getSerializer(IndexOrdering::OrderingT ordering) const;    virtual DataUnSerializer<T>& getUnSerializer(IndexOrdering::OrderingT ordering);    virtual DataSerializer<T> const& getSubSerializer (            int x0_, int x1_, int y0_, int y1_,            IndexOrdering::OrderingT ordering ) const;    virtual DataUnSerializer<T>& getSubUnSerializer (            int x0_, int x1_, int y0_, int y1_,            IndexOrdering::OrderingT ordering );    virtual MultiDataDistribution2D getDataDistribution() const;    virtual SpatiallyExtendedObject2D* getComponent(int iBlock);    virtual SpatiallyExtendedObject2D const* getComponent(int iBlock) const;    virtual multiPhysics::MultiPhysicsId getMultiPhysicsId() const;private:    std::vector<int> const& getRelevantBlocks() const;public:    void toggleInternalStatistics(bool statisticsOn_);    void togglePeriodicCommunication(bool periodicCommunicationOn_);    bool isInternalStatisticsOn() const;    bool isPeriodicCommunicationOn() const;public:    MultiDataDistribution2D const& getMultiData() const;    std::vector<BlockLattice2D<T,Lattice>*> getBlockLattices();    const std::vector<BlockLattice2D<T,Lattice>*> getBlockLattices() const;private:    void allocateBlocks();    void postProcessMultiBlock();    void reduceStatistics();    void eliminateStatisticsInEnvelope();private:    BlockParameters2D const& getParameters(int iParam) const;    Overlap2D const& getNormalOverlap(int iOverlap) const;    Overlap2D const& getPeriodicOverlap(int iOverlap) const;    int getNumRelevantBlocks() const;private:    mutable int locatedBlock; ///< for optimization, keep the last index found    MultiBlockHandler2D<T,Lattice>* multiBlockHandler;    std::vector<BlockLattice2D<T,Lattice>*> blockLattices;    LatticeStatistics<T>* statistics;    bool statisticsOn;    bool periodicCommunicationOn;    MultiBlockReductor<T> reductor;    NoDynamics<T,Lattice> dummyDynamics;    mutable std::vector<Cell<T,Lattice>*> returnCells;    mutable std::vector<Cell<T,Lattice> const*> constReturnCells;    mutable MultiSerializer2D<T>* serializer;    mutable MultiUnSerializer2D<T>* unSerializer;    MultiBlockSerializerPolicy2D<T,Lattice> serializerPolicy;    MultiBlockUnSerializerPolicy2D<T,Lattice> unSerializerPolicy;    MultiDataAnalysis2D<T,Lattice> *dataAnalysis;};template<typename T, template<typename U> class Lattice>class MultiBlockSerializerPolicy2D : public MultiSerializerPolicy2D<T> {public:    MultiBlockSerializerPolicy2D(MultiBlockLattice2D<T,Lattice> const& lattice_);    virtual int getElementSize() const;    virtual void serializeElement(int block, int localX, int localY, T* buffer) const;    virtual MultiDataDistribution2D const& getMultiData() const;    virtual bool isAllocated(int block) const;private:    MultiBlockLattice2D<T,Lattice> const& lattice;};template<typename T, template<typename U> class Lattice>class MultiBlockUnSerializerPolicy2D : public MultiUnSerializerPolicy2D<T> {public:    MultiBlockUnSerializerPolicy2D(MultiBlockLattice2D<T,Lattice>& lattice_);    virtual int getElementSize() const;    virtual void unSerializeElement(int block, int localX, int localY, T const* buffer);    virtual MultiDataDistribution2D const& getMultiData() const;    virtual bool isAllocated(int block) const;private:    MultiBlockLattice2D<T,Lattice>& lattice;};}  // namespace olb#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -