$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 REDUCTIVE_DATA_PROCESSING_FUNCTIONAL_2D_H 00029 #define REDUCTIVE_DATA_PROCESSING_FUNCTIONAL_2D_H 00030 00031 #include "core/globalDefs.h" 00032 #include "core/geometry2D.h" 00033 #include "core/blockSurface2D.h" 00034 #include "atomicBlock/dataProcessor2D.h" 00035 #include <vector> 00036 00037 namespace plb { 00038 00039 // Forward declarations. 00040 00041 template<typename T, template<typename U> class Descriptor> class BlockLatticeBase2D; 00042 template<typename T, template<typename U> class Descriptor> class BlockLattice2D; 00043 template<typename T> class ScalarFieldBase2D; 00044 template<typename T> class ScalarField2D; 00045 template<typename T, int nDim> class TensorFieldBase2D; 00046 template<typename T, int nDim> class TensorField2D; 00047 template<typename T> class NTensorFieldBase2D; 00048 template<typename T> class NTensorField2D; 00049 00050 00051 /* *************** All flavors of Box processing functionals ********* */ 00052 00054 struct ReductiveBoxProcessingFunctional2D { 00055 virtual ~ReductiveBoxProcessingFunctional2D() { } 00056 virtual void processGenericBlocks(Box2D domain, 00057 std::vector<AtomicBlock2D*> atomicBlocks) =0; 00058 virtual BlockDomain::DomainT appliesTo() const; 00059 virtual void rescale(double dxScale, double dtScale); 00060 virtual void getDimensionsX(std::vector<int>& dimensions) const; 00061 virtual void getDimensionsT(std::vector<int>& dimensions) const; 00063 virtual void getModificationPattern(std::vector<bool>& isWritten) const; 00064 virtual void getTypeOfModification(std::vector<modif::ModifT>& modified) const =0; 00065 virtual ReductiveBoxProcessingFunctional2D* clone() const =0; 00066 virtual BlockStatistics const& getStatistics() const =0; 00067 virtual BlockStatistics& getStatistics() =0; 00068 virtual void serialize(std::string& data) const; 00069 virtual void unserialize(std::string& data); 00070 virtual int getStaticId() const; 00071 }; 00072 00074 class PlainReductiveBoxProcessingFunctional2D : public ReductiveBoxProcessingFunctional2D { 00075 public: 00076 virtual BlockStatistics const& getStatistics() const; 00077 virtual BlockStatistics& getStatistics(); 00078 private: 00079 BlockStatistics statistics; 00080 }; 00081 00083 class ReductiveBoxProcessor2D : public DataProcessor2D { 00084 public: 00088 ReductiveBoxProcessor2D(ReductiveBoxProcessingFunctional2D* functional_, 00089 Box2D domain_, std::vector<AtomicBlock2D*> atomicBlocks_); 00090 Box2D getDomain() const; 00091 virtual void process(); 00092 virtual ReductiveBoxProcessor2D* clone() const; 00093 virtual int getStaticId() const; 00094 private: 00095 ReductiveBoxProcessingFunctional2D* functional; 00096 Box2D domain; 00097 std::vector<AtomicBlock2D*> atomicBlocks; 00098 }; 00099 00101 class ReductiveBoxProcessorGenerator2D : public BoxedReductiveDataProcessorGenerator2D { 00102 public: 00106 ReductiveBoxProcessorGenerator2D(ReductiveBoxProcessingFunctional2D* functional_, Box2D domain); 00107 ~ReductiveBoxProcessorGenerator2D(); 00108 ReductiveBoxProcessorGenerator2D(ReductiveBoxProcessorGenerator2D const& rhs); 00109 ReductiveBoxProcessorGenerator2D& operator=(ReductiveBoxProcessorGenerator2D const& rhs); 00110 virtual BlockDomain::DomainT appliesTo() const; 00111 virtual void rescale(double dxScale, double dtScale); 00112 virtual void getDimensionsX(std::vector<int>& dimensions) const; 00113 virtual void getDimensionsT(std::vector<int>& dimensions) const; 00114 virtual void getModificationPattern(std::vector<bool>& isWritten) const; 00115 virtual void getTypeOfModification(std::vector<modif::ModifT>& modified) const; 00116 virtual DataProcessor2D* generate(std::vector<AtomicBlock2D*> atomicBlocks); 00117 virtual ReductiveBoxProcessorGenerator2D* clone() const; 00118 virtual BlockStatistics const& getStatistics() const; 00119 virtual BlockStatistics& getStatistics(); 00120 ReductiveBoxProcessingFunctional2D const& getFunctional() const; 00121 virtual void serialize(Box2D& domain, std::string& data) const; 00122 virtual int getStaticId() const; 00123 private: 00124 ReductiveBoxProcessingFunctional2D* functional; 00125 }; 00126 00128 template<typename T, template<typename U> class Descriptor> 00129 struct ReductiveBoxProcessingFunctional2D_L : public PlainReductiveBoxProcessingFunctional2D { 00130 virtual void process(Box2D domain, BlockLattice2D<T,Descriptor>& lattice) =0; 00132 virtual void processGenericBlocks(Box2D domain, std::vector<AtomicBlock2D*> atomicBlocks); 00133 }; 00134 00136 template<typename T> 00137 struct ReductiveBoxProcessingFunctional2D_S : public PlainReductiveBoxProcessingFunctional2D { 00138 virtual void process(Box2D domain, ScalarField2D<T>& field) =0; 00140 virtual void processGenericBlocks(Box2D domain, std::vector<AtomicBlock2D*> atomicBlocks); 00141 }; 00142 00144 template<typename T, int nDim> 00145 struct ReductiveBoxProcessingFunctional2D_T : public PlainReductiveBoxProcessingFunctional2D { 00146 virtual void process(Box2D domain, TensorField2D<T,nDim>& field) =0; 00148 virtual void processGenericBlocks(Box2D domain, std::vector<AtomicBlock2D*> atomicBlocks); 00149 }; 00150 00152 template<typename T> 00153 struct ReductiveBoxProcessingFunctional2D_N : public PlainReductiveBoxProcessingFunctional2D { 00154 virtual void process(Box2D domain, NTensorField2D<T>& field) =0; 00156 virtual void processGenericBlocks(Box2D domain, std::vector<AtomicBlock2D*> atomicBlocks); 00157 }; 00158 00160 template<typename T> 00161 struct MaskedReductiveBoxProcessingFunctional2D_N : public PlainReductiveBoxProcessingFunctional2D { 00162 virtual void process(Box2D domain, 00163 NTensorField2D<T>& field, 00164 NTensorField2D<int>& mask) =0; 00166 virtual void processGenericBlocks(Box2D domain, std::vector<AtomicBlock2D*> atomicBlocks); 00167 }; 00168 00170 template<typename T1, template<typename U1> class Descriptor1, 00171 typename T2, template<typename U2> class Descriptor2> 00172 struct ReductiveBoxProcessingFunctional2D_LL : public PlainReductiveBoxProcessingFunctional2D { 00173 virtual void process(Box2D domain, BlockLattice2D<T1,Descriptor1>& lattice1, 00174 BlockLattice2D<T2,Descriptor2>& lattice2) =0; 00176 virtual void processGenericBlocks(Box2D domain, std::vector<AtomicBlock2D*> atomicBlocks); 00177 }; 00178 00180 template<typename T1, typename T2> 00181 struct ReductiveBoxProcessingFunctional2D_SS : public PlainReductiveBoxProcessingFunctional2D { 00182 virtual void process(Box2D domain, ScalarField2D<T1>& field1, 00183 ScalarField2D<T2>& field2) =0; 00185 virtual void processGenericBlocks(Box2D domain, std::vector<AtomicBlock2D*> atomicBlocks); 00186 }; 00187 00189 template<typename T1, int nDim1, 00190 typename T2, int nDim2> 00191 struct ReductiveBoxProcessingFunctional2D_TT : public PlainReductiveBoxProcessingFunctional2D { 00192 virtual void process(Box2D domain, TensorField2D<T1,nDim1>& field1, 00193 TensorField2D<T2,nDim2>& field2) =0; 00195 virtual void processGenericBlocks(Box2D domain, std::vector<AtomicBlock2D*> atomicBlocks); 00196 }; 00197 00199 template<typename T1, typename T2, int nDim> 00200 struct ReductiveBoxProcessingFunctional2D_ST : public PlainReductiveBoxProcessingFunctional2D { 00201 virtual void process(Box2D domain, ScalarField2D<T1>& field1, 00202 TensorField2D<T2,nDim>& field2) =0; 00204 virtual void processGenericBlocks(Box2D domain, std::vector<AtomicBlock2D*> atomicBlocks); 00205 }; 00206 00208 template<typename T1, typename T2> 00209 struct ReductiveBoxProcessingFunctional2D_NN : public PlainReductiveBoxProcessingFunctional2D { 00210 virtual void process(Box2D domain, NTensorField2D<T1>& field1, 00211 NTensorField2D<T2>& field2) =0; 00213 virtual void processGenericBlocks(Box2D domain, std::vector<AtomicBlock2D*> atomicBlocks); 00214 }; 00215 00217 template<typename T1, typename T2> 00218 struct MaskedReductiveBoxProcessingFunctional2D_NN : public PlainReductiveBoxProcessingFunctional2D { 00219 virtual void process(Box2D domain, NTensorField2D<T1>& field1, 00220 NTensorField2D<T2>& field2, 00221 NTensorField2D<int>& mask) =0; 00223 virtual void processGenericBlocks(Box2D domain, std::vector<AtomicBlock2D*> atomicBlocks); 00224 }; 00225 00227 template<typename T1, typename T2> 00228 struct ReductiveBoxProcessingFunctional2D_SN : public PlainReductiveBoxProcessingFunctional2D { 00229 virtual void process(Box2D domain, ScalarField2D<T1>& field1, 00230 NTensorField2D<T2>& field2) =0; 00232 virtual void processGenericBlocks(Box2D domain, std::vector<AtomicBlock2D*> atomicBlocks); 00233 }; 00234 00236 template<typename T1, template<typename U> class Descriptor, typename T2> 00237 struct ReductiveBoxProcessingFunctional2D_LS : public PlainReductiveBoxProcessingFunctional2D { 00238 virtual void process(Box2D domain, BlockLattice2D<T1,Descriptor>& lattice, 00239 ScalarField2D<T2>& field) =0; 00241 virtual void processGenericBlocks(Box2D domain, std::vector<AtomicBlock2D*> atomicBlocks); 00242 }; 00243 00245 template<typename T1, template<typename U> class Descriptor, typename T2, int nDim> 00246 struct ReductiveBoxProcessingFunctional2D_LT : public PlainReductiveBoxProcessingFunctional2D { 00247 virtual void process(Box2D domain, BlockLattice2D<T1,Descriptor>& lattice, 00248 TensorField2D<T2,nDim>& field) =0; 00250 virtual void processGenericBlocks(Box2D domain, std::vector<AtomicBlock2D*> atomicBlocks); 00251 }; 00252 00254 template<typename T1, template<typename U> class Descriptor, typename T2> 00255 struct ReductiveBoxProcessingFunctional2D_LN : public PlainReductiveBoxProcessingFunctional2D { 00256 virtual void process(Box2D domain, BlockLattice2D<T1,Descriptor>& lattice, 00257 NTensorField2D<T2>& field) =0; 00259 virtual void processGenericBlocks(Box2D domain, std::vector<AtomicBlock2D*> atomicBlocks); 00260 }; 00261 00263 template<typename T1, template<typename U> class Descriptor, typename T2> 00264 struct MaskedReductiveBoxProcessingFunctional2D_LN : public PlainReductiveBoxProcessingFunctional2D { 00265 virtual void process(Box2D domain, BlockLattice2D<T1,Descriptor>& lattice, 00266 NTensorField2D<T2>& field, 00267 NTensorField2D<int>& mask) =0; 00269 virtual void processGenericBlocks(Box2D domain, std::vector<AtomicBlock2D*> atomicBlocks); 00270 }; 00271 00273 template<typename T, template<typename U> class Descriptor> 00274 struct ReductiveLatticeBoxProcessingFunctional2D : public PlainReductiveBoxProcessingFunctional2D { 00275 virtual void process(Box2D domain, std::vector<BlockLattice2D<T,Descriptor>*> lattices) =0; 00277 virtual void processGenericBlocks(Box2D domain, std::vector<AtomicBlock2D*> atomicBlocks); 00278 }; 00279 00281 template<typename T> 00282 struct ReductiveScalarFieldBoxProcessingFunctional2D : public PlainReductiveBoxProcessingFunctional2D { 00283 virtual void process(Box2D domain, std::vector<ScalarField2D<T>*> scalarFields) =0; 00285 virtual void processGenericBlocks( Box2D domain, 00286 std::vector<AtomicBlock2D*> atomicBlocks ); 00287 }; 00288 00290 template<typename T, int nDim> 00291 struct ReductiveTensorFieldBoxProcessingFunctional2D : public PlainReductiveBoxProcessingFunctional2D { 00292 virtual void process(Box2D domain, std::vector<TensorField2D<T,nDim>*> tensorFields) =0; 00294 virtual void processGenericBlocks( Box2D domain, 00295 std::vector<AtomicBlock2D*> atomicBlocks ); 00296 }; 00297 00299 template<typename T> 00300 struct ReductiveNTensorFieldBoxProcessingFunctional2D : public PlainReductiveBoxProcessingFunctional2D { 00301 virtual void process(Box2D domain, std::vector<NTensorField2D<T>*> tensorFields) =0; 00303 virtual void processGenericBlocks( Box2D domain, 00304 std::vector<AtomicBlock2D*> atomicBlocks ); 00305 }; 00306 00307 00308 /* *************** All flavors of Dot processing functionals ********* */ 00309 00311 class ReductiveDotProcessingFunctional2D { 00312 public: 00313 virtual ~ReductiveDotProcessingFunctional2D() { } 00314 virtual void processGenericBlocks(DotList2D const& dotList, std::vector<AtomicBlock2D*> atomicBlocks) =0; 00315 virtual BlockDomain::DomainT appliesTo() const; 00316 virtual void rescale(double dxScale, double dtScale); 00317 virtual void getDimensionsX(std::vector<int>& dimensions) const; 00318 virtual void getDimensionsT(std::vector<int>& dimensions) const; 00319 virtual void getModificationPattern(std::vector<bool>& isWritten) const; 00320 virtual void getTypeOfModification(std::vector<modif::ModifT>& modified) const =0; 00321 virtual ReductiveDotProcessingFunctional2D* clone() const =0; 00322 virtual BlockStatistics const& getStatistics() const =0; 00323 virtual BlockStatistics& getStatistics() =0; 00324 }; 00325 00327 class PlainReductiveDotProcessingFunctional2D : public ReductiveDotProcessingFunctional2D { 00328 public: 00329 virtual BlockStatistics const& getStatistics() const; 00330 virtual BlockStatistics& getStatistics(); 00331 private: 00332 BlockStatistics statistics; 00333 }; 00334 00335 00337 class ReductiveDotProcessor2D : public DataProcessor2D { 00338 public: 00342 ReductiveDotProcessor2D(ReductiveDotProcessingFunctional2D* functional_, 00343 DotList2D const& dotList_, std::vector<AtomicBlock2D*> atomicBlocks_); 00344 DotList2D const& getDotList() const; 00345 virtual void process(); 00346 virtual ReductiveDotProcessor2D* clone() const; 00347 private: 00348 ReductiveDotProcessingFunctional2D* functional; 00349 DotList2D dotList; 00350 std::vector<AtomicBlock2D*> atomicBlocks; 00351 }; 00352 00354 class ReductiveDotProcessorGenerator2D : public DottedReductiveDataProcessorGenerator2D { 00355 public: 00356 ReductiveDotProcessorGenerator2D(ReductiveDotProcessingFunctional2D* functional_, DotList2D const& dotList); 00357 ~ReductiveDotProcessorGenerator2D(); 00358 ReductiveDotProcessorGenerator2D(ReductiveDotProcessorGenerator2D const& rhs); 00359 ReductiveDotProcessorGenerator2D& operator=(ReductiveDotProcessorGenerator2D const& rhs); 00360 virtual BlockDomain::DomainT appliesTo() const; 00361 virtual void rescale(double dxScale, double dtScale); 00362 virtual void getDimensionsX(std::vector<int>& dimensions) const; 00363 virtual void getDimensionsT(std::vector<int>& dimensions) const; 00364 virtual void getModificationPattern(std::vector<bool>& isWritten) const; 00365 virtual void getTypeOfModification(std::vector<modif::ModifT>& modified) const; 00366 virtual DataProcessor2D* generate(std::vector<AtomicBlock2D*> atomicBlocks); 00367 virtual ReductiveDotProcessorGenerator2D* clone() const; 00368 virtual BlockStatistics const& getStatistics() const; 00369 virtual BlockStatistics& getStatistics(); 00370 ReductiveDotProcessingFunctional2D const& getFunctional() const; 00371 private: 00372 ReductiveDotProcessingFunctional2D* functional; 00373 }; 00374 00376 template<typename T, template<typename U> class Descriptor> 00377 struct ReductiveDotProcessingFunctional2D_L : public PlainReductiveDotProcessingFunctional2D { 00378 virtual void process(DotList2D const& dotList, BlockLattice2D<T,Descriptor>& lattice) =0; 00380 virtual void processGenericBlocks(DotList2D const& dotList, std::vector<AtomicBlock2D*> atomicBlocks); 00381 }; 00382 00384 template<typename T> 00385 struct ReductiveDotProcessingFunctional2D_S : public PlainReductiveDotProcessingFunctional2D { 00386 virtual void process(DotList2D const& dotList, ScalarField2D<T>& field) =0; 00388 virtual void processGenericBlocks( DotList2D const& dotList, 00389 std::vector<AtomicBlock2D*> atomicBlocks ); 00390 }; 00391 00393 template<typename T, int nDim> 00394 struct ReductiveDotProcessingFunctional2D_T : public PlainReductiveDotProcessingFunctional2D { 00395 virtual void process(DotList2D const& dotList, TensorField2D<T,nDim>& field) =0; 00397 virtual void processGenericBlocks( DotList2D const& dotList, 00398 std::vector<AtomicBlock2D*> atomicBlocks ); 00399 }; 00400 00402 template<typename T> 00403 struct ReductiveDotProcessingFunctional2D_N : public PlainReductiveDotProcessingFunctional2D { 00404 virtual void process(DotList2D const& dotList, NTensorField2D<T>& field) =0; 00406 virtual void processGenericBlocks( DotList2D const& dotList, 00407 std::vector<AtomicBlock2D*> atomicBlocks ); 00408 }; 00409 00411 template<typename T1, template<typename U1> class Descriptor1, 00412 typename T2, template<typename U2> class Descriptor2> 00413 struct ReductiveDotProcessingFunctional2D_LL : public PlainReductiveDotProcessingFunctional2D { 00414 virtual void process(DotList2D const& dotList, 00415 BlockLattice2D<T1,Descriptor1>& lattice1, 00416 BlockLattice2D<T2,Descriptor2>& lattice2) =0; 00418 virtual void processGenericBlocks( DotList2D const& dotList, 00419 std::vector<AtomicBlock2D*> atomicBlocks ); 00420 }; 00421 00423 template<typename T1, typename T2> 00424 struct ReductiveDotProcessingFunctional2D_SS : public PlainReductiveDotProcessingFunctional2D { 00425 virtual void process(DotList2D const& dotList, ScalarField2D<T1>& field1, 00426 ScalarField2D<T2>& field2) =0; 00428 virtual void processGenericBlocks( DotList2D const& dotList, 00429 std::vector<AtomicBlock2D*> atomicBlocks ); 00430 }; 00431 00433 template<typename T1, int nDim1, typename T2, int nDim2> 00434 struct ReductiveDotProcessingFunctional2D_TT : public PlainReductiveDotProcessingFunctional2D { 00435 virtual void process(DotList2D const& dotList, 00436 TensorField2D<T1,nDim1>& field1, 00437 TensorField2D<T2,nDim2>& field2) =0; 00439 virtual void processGenericBlocks( DotList2D const& dotList, 00440 std::vector<AtomicBlock2D*> atomicBlocks ); 00441 }; 00442 00444 template<typename T1, typename T2, int nDim> 00445 struct ReductiveDotProcessingFunctional2D_ST : public PlainReductiveDotProcessingFunctional2D { 00446 virtual void process(DotList2D const& dotList, 00447 ScalarField2D<T1>& field1, 00448 TensorField2D<T2,nDim>& field2) =0; 00450 virtual void processGenericBlocks( DotList2D const& dotList, 00451 std::vector<AtomicBlock2D*> atomicBlocks ); 00452 }; 00453 00455 template<typename T1, typename T2> 00456 struct ReductiveDotProcessingFunctional2D_NN : public PlainReductiveDotProcessingFunctional2D { 00457 virtual void process(DotList2D const& dotList, 00458 NTensorField2D<T1>& field1, 00459 NTensorField2D<T2>& field2) =0; 00461 virtual void processGenericBlocks( DotList2D const& dotList, 00462 std::vector<AtomicBlock2D*> atomicBlocks ); 00463 }; 00464 00466 template<typename T1, typename T2> 00467 struct ReductiveDotProcessingFunctional2D_SN : public PlainReductiveDotProcessingFunctional2D { 00468 virtual void process(DotList2D const& dotList, 00469 ScalarField2D<T1>& field1, 00470 NTensorField2D<T2>& field2) =0; 00472 virtual void processGenericBlocks( DotList2D const& dotList, 00473 std::vector<AtomicBlock2D*> atomicBlocks ); 00474 }; 00475 00477 template<typename T1, template<typename U> class Descriptor, typename T2> 00478 struct ReductiveDotProcessingFunctional2D_LS : public PlainReductiveDotProcessingFunctional2D { 00479 virtual void process(DotList2D const& dotList, 00480 BlockLattice2D<T1,Descriptor>& lattice, 00481 ScalarField2D<T2>& field) =0; 00483 virtual void processGenericBlocks( DotList2D const& dotList, 00484 std::vector<AtomicBlock2D*> atomicBlocks ); 00485 }; 00486 00488 template<typename T1, template<typename U> class Descriptor, 00489 typename T2, int nDim> 00490 struct ReductiveDotProcessingFunctional2D_LT : public PlainReductiveDotProcessingFunctional2D { 00491 virtual void process(DotList2D const& dotList, 00492 BlockLattice2D<T1,Descriptor>& lattice, 00493 TensorField2D<T2,nDim>& field) =0; 00495 virtual void processGenericBlocks( DotList2D const& dotList, 00496 std::vector<AtomicBlock2D*> atomicBlocks ); 00497 }; 00498 00500 template<typename T1, template<typename U> class Descriptor, typename T2> 00501 struct ReductiveDotProcessingFunctional2D_LN : public PlainReductiveDotProcessingFunctional2D { 00502 virtual void process(DotList2D const& dotList, 00503 BlockLattice2D<T1,Descriptor>& lattice, 00504 NTensorField2D<T2>& field) =0; 00506 virtual void processGenericBlocks( DotList2D const& dotList, 00507 std::vector<AtomicBlock2D*> atomicBlocks ); 00508 }; 00509 00511 template<typename T, template<typename U> class Descriptor> 00512 struct ReductiveLatticeDotProcessingFunctional2D : public PlainReductiveDotProcessingFunctional2D { 00513 virtual void process(DotList2D const& dotList, std::vector<BlockLattice2D<T,Descriptor>*> lattices) =0; 00515 virtual void processGenericBlocks( DotList2D const& dotList, 00516 std::vector<AtomicBlock2D*> atomicBlocks ); 00517 }; 00518 00520 template<typename T> 00521 struct ReductiveScalarFieldDotProcessingFunctional2D : public PlainReductiveDotProcessingFunctional2D { 00522 virtual void process(DotList2D const& dotList, std::vector<ScalarField2D<T>*> scalarFields) =0; 00524 virtual void processGenericBlocks( DotList2D const& dotList, 00525 std::vector<AtomicBlock2D*> atomicBlocks ); 00526 }; 00527 00529 template<typename T, int nDim> 00530 struct ReductiveTensorFieldDotProcessingFunctional2D : public PlainReductiveDotProcessingFunctional2D { 00531 virtual void process(DotList2D const& dotList, std::vector<TensorField2D<T,nDim>*> tensorFields) =0; 00533 virtual void processGenericBlocks( DotList2D const& dotList, 00534 std::vector<AtomicBlock2D*> atomicBlocks ); 00535 }; 00536 00538 template<typename T> 00539 struct ReductiveNTensorFieldDotProcessingFunctional2D : public PlainReductiveDotProcessingFunctional2D { 00540 virtual void process(DotList2D const& dotList, std::vector<NTensorField2D<T>*> tensorFields) =0; 00542 virtual void processGenericBlocks( DotList2D const& dotList, 00543 std::vector<AtomicBlock2D*> atomicBlocks ); 00544 }; 00545 00546 00547 /* *************** All flavors of Bounded Box processing functionals ********* */ 00548 00550 class BoundedReductiveBoxProcessingFunctional2D { 00551 public: 00552 virtual ~BoundedReductiveBoxProcessingFunctional2D() { } 00553 virtual void processBulkGeneric(Box2D domain, std::vector<AtomicBlock2D*> atomicBlocks) =0; 00554 virtual void processEdgeGeneric( int direction, int orientation, Box2D domain, 00555 std::vector<AtomicBlock2D*> atomicBlocks ) =0; 00556 virtual void processCornerGeneric( int normalX, int normalY, Box2D domain, 00557 std::vector<AtomicBlock2D*> atomicBlocks ) =0; 00558 virtual BlockDomain::DomainT appliesTo() const; 00559 virtual void rescale(double dxScale, double dtScale); 00560 virtual void getDimensionsX(std::vector<int>& dimensions) const; 00561 virtual void getDimensionsT(std::vector<int>& dimensions) const; 00562 virtual void getModificationPattern(std::vector<bool>& isWritten) const; 00563 virtual void getTypeOfModification(std::vector<modif::ModifT>& modified) const =0; 00564 virtual BoundedReductiveBoxProcessingFunctional2D* clone() const =0; 00565 ReductiveBoxProcessingFunctional2D* getBulkProcessor() const; 00566 ReductiveBoxProcessingFunctional2D* getEdgeProcessor(int direction, int orientation) const; 00567 ReductiveBoxProcessingFunctional2D* getCornerProcessor(int normalX, int normalY) const; 00568 BlockStatistics const& getStatistics() const; 00569 BlockStatistics& getStatistics(); 00570 void getGenerators ( 00571 Box2D const& fullDomain, plint boundaryWidth_, 00572 std::vector<ReductiveBoxProcessorGenerator2D*>& generators ); 00573 private: 00574 BlockStatistics statistics; 00575 public: 00576 class BulkWrapperFunctional : public ReductiveBoxProcessingFunctional2D { 00577 public: 00578 BulkWrapperFunctional(BoundedReductiveBoxProcessingFunctional2D* boundedFunctional_); 00579 BulkWrapperFunctional(BulkWrapperFunctional const& rhs); 00580 ~BulkWrapperFunctional(); 00581 BulkWrapperFunctional& operator=(BulkWrapperFunctional const& rhs); 00582 virtual void processGenericBlocks(Box2D domain, 00583 std::vector<AtomicBlock2D*> atomicBlocks); 00584 virtual BlockDomain::DomainT appliesTo() const; 00585 virtual void rescale(double dxScale, double dtScale); 00586 virtual void getDimensionsX(std::vector<int>& dimensions) const; 00587 virtual void getDimensionsT(std::vector<int>& dimensions) const; 00588 virtual void getModificationPattern(std::vector<bool>& isWritten) const; 00589 virtual void getTypeOfModification(std::vector<modif::ModifT>& modified) const; 00590 virtual BulkWrapperFunctional* clone() const; 00591 virtual BlockStatistics const& getStatistics() const; 00592 virtual BlockStatistics& getStatistics(); 00593 private: 00594 BoundedReductiveBoxProcessingFunctional2D* boundedFunctional; 00595 }; 00596 class EdgeWrapperFunctional : public ReductiveBoxProcessingFunctional2D { 00597 public: 00598 EdgeWrapperFunctional(BoundedReductiveBoxProcessingFunctional2D* boundedFunctional_, 00599 int direction_, int orientation_); 00600 EdgeWrapperFunctional(EdgeWrapperFunctional const& rhs); 00601 ~EdgeWrapperFunctional(); 00602 EdgeWrapperFunctional& operator=(EdgeWrapperFunctional const& rhs); 00603 virtual void processGenericBlocks(Box2D domain, 00604 std::vector<AtomicBlock2D*> atomicBlocks); 00605 virtual BlockDomain::DomainT appliesTo() const; 00606 virtual void rescale(double dxScale, double dtScale); 00607 virtual void getDimensionsX(std::vector<int>& dimensions) const; 00608 virtual void getDimensionsT(std::vector<int>& dimensions) const; 00609 virtual void getModificationPattern(std::vector<bool>& isWritten) const; 00610 virtual void getTypeOfModification(std::vector<modif::ModifT>& modified) const; 00611 virtual EdgeWrapperFunctional* clone() const; 00612 virtual BlockStatistics const& getStatistics() const; 00613 virtual BlockStatistics& getStatistics(); 00614 private: 00615 BoundedReductiveBoxProcessingFunctional2D* boundedFunctional; 00616 int direction, orientation; 00617 }; 00618 class CornerWrapperFunctional : public ReductiveBoxProcessingFunctional2D { 00619 public: 00620 CornerWrapperFunctional(BoundedReductiveBoxProcessingFunctional2D* boundedFunctional_, 00621 int normalX_, int normalY_); 00622 CornerWrapperFunctional(CornerWrapperFunctional const& rhs); 00623 ~CornerWrapperFunctional(); 00624 CornerWrapperFunctional& operator=(CornerWrapperFunctional const& rhs); 00625 virtual void processGenericBlocks(Box2D domain, 00626 std::vector<AtomicBlock2D*> atomicBlocks); 00627 virtual BlockDomain::DomainT appliesTo() const; 00628 virtual void rescale(double dxScale, double dtScale); 00629 virtual void getDimensionsX(std::vector<int>& dimensions) const; 00630 virtual void getDimensionsT(std::vector<int>& dimensions) const; 00631 virtual void getModificationPattern(std::vector<bool>& isWritten) const; 00632 virtual void getTypeOfModification(std::vector<modif::ModifT>& modified) const; 00633 virtual CornerWrapperFunctional* clone() const; 00634 virtual BlockStatistics const& getStatistics() const; 00635 virtual BlockStatistics& getStatistics(); 00636 private: 00637 BoundedReductiveBoxProcessingFunctional2D* boundedFunctional; 00638 int normalX, normalY; 00639 }; 00640 }; 00641 00643 template<typename T, template<typename U> class Descriptor> 00644 struct BoundedReductiveBoxProcessingFunctional2D_L : public BoundedReductiveBoxProcessingFunctional2D { 00645 virtual void processBulkGeneric(Box2D domain, 00646 std::vector<AtomicBlock2D*> atomicBlocks); 00647 virtual void processEdgeGeneric( int direction, int orientation, Box2D domain, 00648 std::vector<AtomicBlock2D*> atomicBlocks ); 00649 virtual void processCornerGeneric( int normalX, int normalY, Box2D domain, 00650 std::vector<AtomicBlock2D*> atomicBlocks ); 00651 00652 virtual void processBulk(Box2D domain, BlockLattice2D<T,Descriptor>& lattice) =0; 00653 virtual void processEdge( int direction, int orientation, Box2D domain, 00654 BlockLattice2D<T,Descriptor>& lattice ) =0; 00655 virtual void processCorner( int normalX, int normalY, Box2D domain, 00656 BlockLattice2D<T,Descriptor>& lattice ) =0; 00657 }; 00658 00660 template<typename T> 00661 struct BoundedReductiveBoxProcessingFunctional2D_S : public BoundedReductiveBoxProcessingFunctional2D { 00662 virtual void processBulkGeneric(Box2D domain, 00663 std::vector<AtomicBlock2D*> atomicBlocks); 00664 virtual void processEdgeGeneric( int direction, int orientation, Box2D domain, 00665 std::vector<AtomicBlock2D*> atomicBlocks ); 00666 virtual void processCornerGeneric( int normalX, int normalY, Box2D domain, 00667 std::vector<AtomicBlock2D*> atomicBlocks ); 00668 00669 virtual void processBulk(Box2D domain, ScalarField2D<T>& field) =0; 00670 virtual void processEdge( int direction, int orientation, Box2D domain, 00671 ScalarField2D<T>& field ) =0; 00672 virtual void processCorner( int normalX, int normalY, Box2D domain, 00673 ScalarField2D<T>& field ) =0; 00674 }; 00675 00677 template<typename T, int nDim> 00678 struct BoundedReductiveBoxProcessingFunctional2D_T : public BoundedReductiveBoxProcessingFunctional2D { 00679 virtual void processBulkGeneric(Box2D domain, 00680 std::vector<AtomicBlock2D*> atomicBlocks); 00681 virtual void processEdgeGeneric( int direction, int orientation, Box2D domain, 00682 std::vector<AtomicBlock2D*> atomicBlocks ); 00683 virtual void processCornerGeneric( int normalX, int normalY, Box2D domain, 00684 std::vector<AtomicBlock2D*> atomicBlocks ); 00685 00686 virtual void processBulk(Box2D domain, TensorField2D<T,nDim>& field) =0; 00687 virtual void processEdge( int direction, int orientation, Box2D domain, 00688 TensorField2D<T,nDim>& field ) =0; 00689 virtual void processCorner( int normalX, int normalY, Box2D domain, 00690 TensorField2D<T,nDim>& field ) =0; 00691 }; 00692 00694 template<typename T> 00695 struct BoundedReductiveBoxProcessingFunctional2D_N : public BoundedReductiveBoxProcessingFunctional2D { 00696 virtual void processBulkGeneric(Box2D domain, 00697 std::vector<AtomicBlock2D*> atomicBlocks); 00698 virtual void processEdgeGeneric( int direction, int orientation, Box2D domain, 00699 std::vector<AtomicBlock2D*> atomicBlocks ); 00700 virtual void processCornerGeneric( int normalX, int normalY, Box2D domain, 00701 std::vector<AtomicBlock2D*> atomicBlocks ); 00702 00703 virtual void processBulk(Box2D domain, NTensorField2D<T>& field) =0; 00704 virtual void processEdge( int direction, int orientation, Box2D domain, 00705 NTensorField2D<T>& field ) =0; 00706 virtual void processCorner( int normalX, int normalY, Box2D domain, 00707 NTensorField2D<T>& field ) =0; 00708 }; 00709 00711 template<typename T> 00712 struct BoundedMaskedReductiveBoxProcessingFunctional2D_N : public BoundedReductiveBoxProcessingFunctional2D { 00713 virtual void processBulkGeneric(Box2D domain, 00714 std::vector<AtomicBlock2D*> atomicBlocks); 00715 virtual void processEdgeGeneric( int direction, int orientation, Box2D domain, 00716 std::vector<AtomicBlock2D*> atomicBlocks ); 00717 virtual void processCornerGeneric( int normalX, int normalY, Box2D domain, 00718 std::vector<AtomicBlock2D*> atomicBlocks ); 00719 00720 virtual void processBulk(Box2D domain, 00721 NTensorField2D<T>& field, 00722 NTensorField2D<int>& mask) =0; 00723 virtual void processEdge( int direction, int orientation, Box2D domain, 00724 NTensorField2D<T>& field, 00725 NTensorField2D<int>& mask) =0; 00726 virtual void processCorner( int normalX, int normalY, Box2D domain, 00727 NTensorField2D<T>& field, 00728 NTensorField2D<int>& mask) =0; 00729 }; 00730 00732 template<typename T1, template<typename U1> class Descriptor1, 00733 typename T2, template<typename U2> class Descriptor2> 00734 struct BoundedReductiveBoxProcessingFunctional2D_LL : public BoundedReductiveBoxProcessingFunctional2D { 00735 virtual void processBulkGeneric(Box2D domain, std::vector<AtomicBlock2D*> atomicBlocks); 00736 virtual void processEdgeGeneric( int direction, int orientation, Box2D domain, 00737 std::vector<AtomicBlock2D*> atomicBlocks ); 00738 virtual void processCornerGeneric( int normalX, int normalY, Box2D domain, 00739 std::vector<AtomicBlock2D*> atomicBlocks ); 00740 00741 virtual void processBulk( Box2D domain, BlockLattice2D<T1,Descriptor1>& lattice1, 00742 BlockLattice2D<T2,Descriptor2>& lattice2 ) =0; 00743 virtual void processEdge( int direction, int orientation, Box2D domain, 00744 BlockLattice2D<T1,Descriptor1>& lattice1, 00745 BlockLattice2D<T2,Descriptor2>& lattice2 ) =0; 00746 virtual void processCorner( int normalX, int normalY, Box2D domain, 00747 BlockLattice2D<T1,Descriptor1>& lattice1, 00748 BlockLattice2D<T2,Descriptor2>& lattice2 ) =0; 00749 }; 00750 00753 template<typename T1, typename T2> 00754 struct BoundedReductiveBoxProcessingFunctional2D_SS : public BoundedReductiveBoxProcessingFunctional2D { 00755 virtual void processBulkGeneric( Box2D domain, 00756 std::vector<AtomicBlock2D*> atomicBlocks ); 00757 virtual void processEdgeGeneric( int direction, int orientation, Box2D domain, 00758 std::vector<AtomicBlock2D*> atomicBlocks ); 00759 virtual void processCornerGeneric( int normalX, int normalY, Box2D domain, 00760 std::vector<AtomicBlock2D*> atomicBlocks ); 00761 00762 virtual void processBulk( Box2D domain, ScalarField2D<T1>& field1, 00763 ScalarField2D<T2>& field2 ) =0; 00764 virtual void processEdge( int direction, int orientation, Box2D domain, 00765 ScalarField2D<T1>& field1, 00766 ScalarField2D<T2>& field2 ) =0; 00767 virtual void processCorner( int normalX, int normalY, Box2D domain, 00768 ScalarField2D<T1>& field1, 00769 ScalarField2D<T2>& field2 ) =0; 00770 }; 00771 00774 template<typename T1, int nDim1, typename T2, int nDim2> 00775 struct BoundedReductiveBoxProcessingFunctional2D_TT : public BoundedReductiveBoxProcessingFunctional2D { 00776 virtual void processBulkGeneric(Box2D domain, 00777 std::vector<AtomicBlock2D*> atomicBlocks); 00778 virtual void processEdgeGeneric( int direction, int orientation, Box2D domain, 00779 std::vector<AtomicBlock2D*> atomicBlocks ); 00780 virtual void processCornerGeneric( int normalX, int normalY, Box2D domain, 00781 std::vector<AtomicBlock2D*> atomicBlocks ); 00782 00783 virtual void processBulk( Box2D domain, TensorField2D<T1,nDim1>& field1, 00784 TensorField2D<T2,nDim2>& field2 ) =0; 00785 virtual void processEdge( int direction, int orientation, Box2D domain, 00786 TensorField2D<T1,nDim1>& field1, 00787 TensorField2D<T2,nDim2>& field2 ) =0; 00788 virtual void processCorner( int normalX, int normalY, Box2D domain, 00789 TensorField2D<T1,nDim1>& field1, 00790 TensorField2D<T2,nDim2>& field2 ) =0; 00791 }; 00792 00795 template<typename T1, typename T2, int nDim> 00796 struct BoundedReductiveBoxProcessingFunctional2D_ST : public BoundedReductiveBoxProcessingFunctional2D { 00797 virtual void processBulkGeneric( Box2D domain, 00798 std::vector<AtomicBlock2D*> atomicBlocks ); 00799 virtual void processEdgeGeneric( int direction, int orientation, Box2D domain, 00800 std::vector<AtomicBlock2D*> atomicBlocks ); 00801 virtual void processCornerGeneric( int normalX, int normalY, Box2D domain, 00802 std::vector<AtomicBlock2D*> atomicBlocks ); 00803 00804 virtual void processBulk( Box2D domain, ScalarField2D<T1>& field1, 00805 TensorField2D<T2,nDim>& field2 ) =0; 00806 virtual void processEdge( int direction, int orientation, Box2D domain, 00807 ScalarField2D<T1>& field1, 00808 TensorField2D<T2,nDim>& field2 ) =0; 00809 virtual void processCorner( int normalX, int normalY, Box2D domain, 00810 ScalarField2D<T1>& field1, 00811 TensorField2D<T2,nDim>& field2 ) =0; 00812 }; 00813 00816 template<typename T1, typename T2> 00817 struct BoundedReductiveBoxProcessingFunctional2D_NN : public BoundedReductiveBoxProcessingFunctional2D { 00818 virtual void processBulkGeneric(Box2D domain, 00819 std::vector<AtomicBlock2D*> atomicBlocks); 00820 virtual void processEdgeGeneric( int direction, int orientation, Box2D domain, 00821 std::vector<AtomicBlock2D*> atomicBlocks ); 00822 virtual void processCornerGeneric( int normalX, int normalY, Box2D domain, 00823 std::vector<AtomicBlock2D*> atomicBlocks ); 00824 00825 virtual void processBulk( Box2D domain, NTensorField2D<T1>& field1, 00826 NTensorField2D<T2>& field2 ) =0; 00827 virtual void processEdge( int direction, int orientation, Box2D domain, 00828 NTensorField2D<T1>& field1, 00829 NTensorField2D<T2>& field2 ) =0; 00830 virtual void processCorner( int normalX, int normalY, Box2D domain, 00831 NTensorField2D<T1>& field1, 00832 NTensorField2D<T2>& field2 ) =0; 00833 }; 00834 00837 template<typename T1, typename T2> 00838 struct BoundedMaskedReductiveBoxProcessingFunctional2D_NN : public BoundedReductiveBoxProcessingFunctional2D { 00839 virtual void processBulkGeneric(Box2D domain, 00840 std::vector<AtomicBlock2D*> atomicBlocks); 00841 virtual void processEdgeGeneric( int direction, int orientation, Box2D domain, 00842 std::vector<AtomicBlock2D*> atomicBlocks ); 00843 virtual void processCornerGeneric( int normalX, int normalY, Box2D domain, 00844 std::vector<AtomicBlock2D*> atomicBlocks ); 00845 00846 virtual void processBulk( Box2D domain, NTensorField2D<T1>& field1, 00847 NTensorField2D<T2>& field2, 00848 NTensorField2D<int>& mask) =0; 00849 virtual void processEdge( int direction, int orientation, Box2D domain, 00850 NTensorField2D<T1>& field1, 00851 NTensorField2D<T2>& field2, 00852 NTensorField2D<int>& mask) =0; 00853 virtual void processCorner( int normalX, int normalY, Box2D domain, 00854 NTensorField2D<T1>& field1, 00855 NTensorField2D<T2>& field2, 00856 NTensorField2D<int>& mask) =0; 00857 }; 00858 00861 template<typename T1, typename T2> 00862 struct BoundedReductiveBoxProcessingFunctional2D_SN : public BoundedReductiveBoxProcessingFunctional2D { 00863 virtual void processBulkGeneric( Box2D domain, 00864 std::vector<AtomicBlock2D*> atomicBlocks ); 00865 virtual void processEdgeGeneric( int direction, int orientation, Box2D domain, 00866 std::vector<AtomicBlock2D*> atomicBlocks ); 00867 virtual void processCornerGeneric( int normalX, int normalY, Box2D domain, 00868 std::vector<AtomicBlock2D*> atomicBlocks ); 00869 00870 virtual void processBulk( Box2D domain, ScalarField2D<T1>& field1, 00871 NTensorField2D<T2>& field2 ) =0; 00872 virtual void processEdge( int direction, int orientation, Box2D domain, 00873 ScalarField2D<T1>& field1, 00874 NTensorField2D<T2>& field2 ) =0; 00875 virtual void processCorner( int normalX, int normalY, Box2D domain, 00876 ScalarField2D<T1>& field1, 00877 NTensorField2D<T2>& field2 ) =0; 00878 }; 00879 00881 template<typename T1, template<typename U> class Descriptor, typename T2> 00882 struct BoundedReductiveBoxProcessingFunctional2D_LS : public BoundedReductiveBoxProcessingFunctional2D { 00883 virtual void processBulkGeneric(Box2D domain, std::vector<AtomicBlock2D*> atomicBlocks); 00884 virtual void processEdgeGeneric( int direction, int orientation, Box2D domain, 00885 std::vector<AtomicBlock2D*> atomicBlocks ); 00886 virtual void processCornerGeneric( int normalX, int normalY, Box2D domain, 00887 std::vector<AtomicBlock2D*> atomicBlocks ); 00888 00889 virtual void processBulk( Box2D domain, BlockLattice2D<T1,Descriptor>& lattice, 00890 ScalarField2D<T2>& field ) =0; 00891 virtual void processEdge( int direction, int orientation, Box2D domain, 00892 BlockLattice2D<T1,Descriptor>& lattice, 00893 ScalarField2D<T2>& field ) =0; 00894 virtual void processCorner( int normalX, int normalY, Box2D domain, 00895 BlockLattice2D<T1,Descriptor>& lattice, 00896 ScalarField2D<T2>& field ) =0; 00897 }; 00898 00900 template<typename T1, template<typename U> class Descriptor, 00901 typename T2, int nDim> 00902 struct BoundedReductiveBoxProcessingFunctional2D_LT : public BoundedReductiveBoxProcessingFunctional2D { 00903 virtual void processBulkGeneric( Box2D domain, 00904 std::vector<AtomicBlock2D*> atomicBlocks ); 00905 virtual void processEdgeGeneric( int direction, int orientation, Box2D domain, 00906 std::vector<AtomicBlock2D*> atomicBlocks ); 00907 virtual void processCornerGeneric( int normalX, int normalY, Box2D domain, 00908 std::vector<AtomicBlock2D*> atomicBlocks ); 00909 00910 virtual void processBulk( Box2D domain, BlockLattice2D<T1,Descriptor>& lattice, 00911 TensorField2D<T2,nDim>& field ) =0; 00912 virtual void processEdge( int direction, int orientation, Box2D domain, 00913 BlockLattice2D<T1,Descriptor>& lattice, 00914 TensorField2D<T2,nDim>& field ) =0; 00915 virtual void processCorner( int normalX, int normalY, Box2D domain, 00916 BlockLattice2D<T1,Descriptor>& lattice, 00917 TensorField2D<T2,nDim>& field ) =0; 00918 }; 00919 00921 template<typename T1, template<typename U> class Descriptor, typename T2> 00922 struct BoundedReductiveBoxProcessingFunctional2D_LN : public BoundedReductiveBoxProcessingFunctional2D { 00923 virtual void processBulkGeneric( Box2D domain, 00924 std::vector<AtomicBlock2D*> atomicBlocks ); 00925 virtual void processEdgeGeneric( int direction, int orientation, Box2D domain, 00926 std::vector<AtomicBlock2D*> atomicBlocks ); 00927 virtual void processCornerGeneric( int normalX, int normalY, Box2D domain, 00928 std::vector<AtomicBlock2D*> atomicBlocks ); 00929 00930 virtual void processBulk( Box2D domain, BlockLattice2D<T1,Descriptor>& lattice, 00931 NTensorField2D<T2>& field ) =0; 00932 virtual void processEdge( int direction, int orientation, Box2D domain, 00933 BlockLattice2D<T1,Descriptor>& lattice, 00934 NTensorField2D<T2>& field ) =0; 00935 virtual void processCorner( int normalX, int normalY, Box2D domain, 00936 BlockLattice2D<T1,Descriptor>& lattice, 00937 NTensorField2D<T2>& field ) =0; 00938 }; 00939 00941 template<typename T1, template<typename U> class Descriptor, typename T2> 00942 struct BoundedMaskedReductiveBoxProcessingFunctional2D_LN : public BoundedReductiveBoxProcessingFunctional2D { 00943 virtual void processBulkGeneric( Box2D domain, 00944 std::vector<AtomicBlock2D*> atomicBlocks ); 00945 virtual void processEdgeGeneric( int direction, int orientation, Box2D domain, 00946 std::vector<AtomicBlock2D*> atomicBlocks ); 00947 virtual void processCornerGeneric( int normalX, int normalY, Box2D domain, 00948 std::vector<AtomicBlock2D*> atomicBlocks ); 00949 00950 virtual void processBulk( Box2D domain, BlockLattice2D<T1,Descriptor>& lattice, 00951 NTensorField2D<T2>& field, 00952 NTensorField2D<int>& mask ) =0; 00953 virtual void processEdge( int direction, int orientation, Box2D domain, 00954 BlockLattice2D<T1,Descriptor>& lattice, 00955 NTensorField2D<T2>& field, 00956 NTensorField2D<int>& mask ) =0; 00957 virtual void processCorner( int normalX, int normalY, Box2D domain, 00958 BlockLattice2D<T1,Descriptor>& lattice, 00959 NTensorField2D<T2>& field, 00960 NTensorField2D<int>& mask ) =0; 00961 }; 00962 00964 template<typename T, template<typename U> class Descriptor> 00965 struct BoundedReductiveLatticeBoxProcessingFunctional2D 00966 : public BoundedReductiveBoxProcessingFunctional2D 00967 { 00968 virtual void processBulkGeneric( Box2D domain, 00969 std::vector<AtomicBlock2D*> atomicBlocks ); 00970 virtual void processEdgeGeneric( int direction, int orientation, Box2D domain, 00971 std::vector<AtomicBlock2D*> atomicBlocks ); 00972 virtual void processCornerGeneric( int normalX, int normalY, Box2D domain, 00973 std::vector<AtomicBlock2D*> atomicBlocks ); 00974 00975 virtual void processBulk( Box2D domain, 00976 std::vector<BlockLattice2D<T,Descriptor>*> lattices ) =0; 00977 virtual void processEdge( int direction, int orientation, Box2D domain, 00978 std::vector<BlockLattice2D<T,Descriptor>*> lattices ) =0; 00979 virtual void processCorner( int normalX, int normalY, Box2D domain, 00980 std::vector<BlockLattice2D<T,Descriptor>*> lattices ) =0; 00981 }; 00982 00984 template<typename T> 00985 struct BoundedReductiveScalarFieldBoxProcessingFunctional2D 00986 : public BoundedReductiveBoxProcessingFunctional2D 00987 { 00988 virtual void processBulkGeneric( Box2D domain, 00989 std::vector<AtomicBlock2D*> atomicBlocks ); 00990 virtual void processEdgeGeneric( int direction, int orientation, Box2D domain, 00991 std::vector<AtomicBlock2D*> atomicBlocks ); 00992 virtual void processCornerGeneric( int normalX, int normalY, Box2D domain, 00993 std::vector<AtomicBlock2D*> atomicBlocks ); 00994 00995 virtual void processBulk(Box2D domain, std::vector<ScalarField2D<T>*> field) =0; 00996 virtual void processEdge( int direction, int orientation, Box2D domain, 00997 std::vector<ScalarField2D<T>*> field ) =0; 00998 virtual void processCorner( int normalX, int normalY, Box2D domain, 00999 std::vector<ScalarField2D<T>*> field ) =0; 01000 }; 01001 01003 template<typename T, int nDim> 01004 struct BoundedReductiveTensorFieldBoxProcessingFunctional2D 01005 : public BoundedReductiveBoxProcessingFunctional2D 01006 { 01007 virtual void processBulkGeneric( Box2D domain, 01008 std::vector<AtomicBlock2D*> atomicBlocks ); 01009 virtual void processEdgeGeneric( int direction, int orientation, Box2D domain, 01010 std::vector<AtomicBlock2D*> atomicBlocks ); 01011 virtual void processCornerGeneric( int normalX, int normalY, Box2D domain, 01012 std::vector<AtomicBlock2D*> atomicBlocks ); 01013 01014 virtual void processBulk(Box2D domain, std::vector<TensorField2D<T,nDim>*> field) =0; 01015 virtual void processEdge( int direction, int orientation, Box2D domain, 01016 std::vector<TensorField2D<T,nDim>*> field ) =0; 01017 virtual void processCorner( int normalX, int normalY, Box2D domain, 01018 std::vector<TensorField2D<T,nDim>*> field ) =0; 01019 }; 01020 01022 template<typename T> 01023 struct BoundedReductiveNTensorFieldBoxProcessingFunctional2D 01024 : public BoundedReductiveBoxProcessingFunctional2D 01025 { 01026 virtual void processBulkGeneric( Box2D domain, 01027 std::vector<AtomicBlock2D*> atomicBlocks ); 01028 virtual void processEdgeGeneric( int direction, int orientation, Box2D domain, 01029 std::vector<AtomicBlock2D*> atomicBlocks ); 01030 virtual void processCornerGeneric( int normalX, int normalY, Box2D domain, 01031 std::vector<AtomicBlock2D*> atomicBlocks ); 01032 01033 virtual void processBulk(Box2D domain, std::vector<NTensorField2D<T>*> field) =0; 01034 virtual void processEdge( int direction, int orientation, Box2D domain, 01035 std::vector<NTensorField2D<T>*> field ) =0; 01036 virtual void processCorner( int normalX, int normalY, Box2D domain, 01037 std::vector<NTensorField2D<T>*> field ) =0; 01038 }; 01039 01040 } // namespace plb 01041 01042 #endif // REDUCTIVE_DATA_PROCESSING_FUNCTIONAL_2D_H
1.6.3
1.6.3