|
Palabos
Version 1.0
|
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 DATA_PROCESSOR_2D_H 00029 #define DATA_PROCESSOR_2D_H 00030 00031 #include "core/globalDefs.h" 00032 #include "core/geometry2D.h" 00033 #include "core/blockStatistics.h" 00034 #include <vector> 00035 #include <algorithm> 00036 00037 namespace plb { 00038 00039 // Forward declarations 00040 class AtomicBlock2D; 00041 00043 struct DataProcessor2D { 00044 virtual ~DataProcessor2D() { } 00046 virtual void process() =0; 00048 virtual DataProcessor2D* clone() const =0; 00050 virtual plint extent() const; 00052 virtual plint extent(int direction) const; 00055 virtual int getStaticId() const; 00056 }; 00057 00059 00065 struct DataProcessorGenerator2D { 00066 virtual ~DataProcessorGenerator2D(); 00068 virtual void shift(plint deltaX, plint deltaY) =0; 00070 virtual void multiply(plint scale) =0; 00072 virtual void divide(plint scale) =0; 00074 00076 virtual bool extract(Box2D subDomain) =0; 00078 virtual DataProcessor2D* generate ( 00079 std::vector<AtomicBlock2D*> atomicBlocks ) const =0; 00081 virtual DataProcessorGenerator2D* clone() const =0; 00083 virtual BlockDomain::DomainT appliesTo() const; 00085 virtual void rescale(double dxScale_, double dtScale_); 00087 virtual void setscale(int dxScale_, int dtScale_); 00089 00091 virtual void getModificationPattern(std::vector<bool>& isWritten) const; 00093 virtual void getTypeOfModification(std::vector<modif::ModifT>& modified) const =0; 00096 virtual int getStaticId() const; 00098 virtual void serialize(Box2D& domain, std::string& data) const; 00099 }; 00100 00101 class BoxedDataProcessorGenerator2D : public DataProcessorGenerator2D { 00102 public: 00103 BoxedDataProcessorGenerator2D(Box2D domain_); 00104 virtual void shift(plint deltaX, plint deltaY); 00105 virtual void multiply(plint scale); 00106 virtual void divide(plint scale); 00107 virtual bool extract(Box2D subDomain); 00108 Box2D getDomain() const; 00109 virtual void serialize(Box2D& domain, std::string& data) const; 00110 private: 00111 Box2D domain; 00112 }; 00113 00114 class DottedDataProcessorGenerator2D : public DataProcessorGenerator2D { 00115 public: 00116 DottedDataProcessorGenerator2D(DotList2D const& dots_); 00117 virtual void shift(plint deltaX, plint deltaY); 00118 virtual void multiply(plint scale); 00119 virtual void divide(plint scale); 00120 virtual bool extract(Box2D subDomain); 00121 DotList2D const& getDotList() const; 00122 private: 00123 DotList2D dots; 00124 }; 00125 00126 class ReductiveDataProcessorGenerator2D { 00127 public: 00128 ReductiveDataProcessorGenerator2D(); 00129 virtual ~ReductiveDataProcessorGenerator2D(); 00131 virtual void shift(plint deltaX, plint deltaY) =0; 00133 virtual void multiply(plint scale) =0; 00135 virtual void divide(plint scale) =0; 00137 00139 virtual bool extract(Box2D subDomain) =0; 00141 virtual DataProcessor2D* generate ( 00142 std::vector<AtomicBlock2D*> atomicBlocks ) =0; 00144 virtual ReductiveDataProcessorGenerator2D* clone() const =0; 00146 virtual BlockStatistics const& getStatistics() const =0; 00148 virtual BlockStatistics& getStatistics() =0; 00150 virtual BlockDomain::DomainT appliesTo() const; 00152 virtual void rescale(double dxScale, double dtScale); 00154 00156 virtual void getModificationPattern(std::vector<bool>& isWritten) const; 00158 virtual void getTypeOfModification(std::vector<modif::ModifT>& modified) const =0; 00160 void setscale(int dxScale_, int dtScale_); 00162 int getDxScale() const; 00164 int getDtScale() const; 00166 virtual void getDimensionsX(std::vector<int>& dimensions) const; 00168 virtual void getDimensionsT(std::vector<int>& dimensions) const; 00169 virtual void serialize(Box2D& domain, std::string& data) const; 00170 private: 00171 int dxScale, dtScale; 00172 }; 00173 00174 class BoxedReductiveDataProcessorGenerator2D : public ReductiveDataProcessorGenerator2D { 00175 public: 00176 BoxedReductiveDataProcessorGenerator2D(Box2D domain_); 00177 virtual void shift(plint deltaX, plint deltaY); 00178 virtual void multiply(plint scale); 00179 virtual void divide(plint scale); 00180 virtual bool extract(Box2D subDomain); 00181 Box2D getDomain() const; 00182 virtual void serialize(Box2D& domain, std::string& data) const; 00183 private: 00184 Box2D domain; 00185 }; 00186 00187 class DottedReductiveDataProcessorGenerator2D : public ReductiveDataProcessorGenerator2D { 00188 public: 00189 DottedReductiveDataProcessorGenerator2D(DotList2D const& dots_); 00190 virtual void shift(plint deltaX, plint deltaY); 00191 virtual void multiply(plint scale); 00192 virtual void divide(plint scale); 00193 virtual bool extract(Box2D subDomain); 00194 DotList2D const& getDotList() const; 00195 private: 00196 DotList2D dots; 00197 }; 00198 00199 } // namespace plb 00200 00201 #endif // DATA_PROCESSOR_2D_H