|
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_PROCESSING_FUNCTIONAL_2D_H 00029 #define 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 class BoxProcessingFunctional2D { 00055 public: 00056 BoxProcessingFunctional2D(); 00057 virtual ~BoxProcessingFunctional2D() { } 00058 virtual void processGenericBlocks(Box2D domain, 00059 std::vector<AtomicBlock2D*> atomicBlocks) =0; 00060 virtual BlockDomain::DomainT appliesTo() const; 00062 virtual void rescale(double dxScale, double dtScale); 00063 virtual void setscale(int dxScale_, int dtScale_); 00065 virtual void getModificationPattern(std::vector<bool>& isWritten) const; 00066 virtual void getTypeOfModification(std::vector<modif::ModifT>& modified) const =0; 00067 virtual BoxProcessingFunctional2D* clone() const =0; 00068 int getDxScale() const; 00069 int getDtScale() const; 00070 virtual void serialize(std::string& data) const; 00071 virtual void unserialize(std::string& data); 00072 virtual int getStaticId() const; 00073 private: 00074 int dxScale, dtScale; 00075 }; 00076 00078 class BoxProcessor2D : public DataProcessor2D { 00079 public: 00080 BoxProcessor2D(BoxProcessingFunctional2D* functional_, 00081 Box2D domain_, std::vector<AtomicBlock2D*> atomicBlocks_); 00082 BoxProcessor2D(BoxProcessor2D const& rhs); 00083 BoxProcessor2D& operator=(BoxProcessor2D const& rhs); 00084 ~BoxProcessor2D(); 00085 Box2D getDomain() const; 00086 virtual void process(); 00087 virtual BoxProcessor2D* clone() const; 00088 virtual int getStaticId() const; 00089 private: 00090 BoxProcessingFunctional2D* functional; 00091 Box2D domain; 00092 std::vector<AtomicBlock2D*> atomicBlocks; 00093 }; 00094 00096 class BoxProcessorGenerator2D : public BoxedDataProcessorGenerator2D { 00097 public: 00098 BoxProcessorGenerator2D(BoxProcessingFunctional2D* functional_, Box2D domain); 00099 ~BoxProcessorGenerator2D(); 00100 BoxProcessorGenerator2D(BoxProcessorGenerator2D const& rhs); 00101 BoxProcessorGenerator2D& operator=(BoxProcessorGenerator2D const& rhs); 00102 virtual BlockDomain::DomainT appliesTo() const; 00104 virtual void rescale(double dxScale, double dtScale); 00105 virtual void setscale(int dxScale_, int dtScale_); 00106 virtual void getModificationPattern(std::vector<bool>& isWritten) const; 00107 virtual void getTypeOfModification(std::vector<modif::ModifT>& modified) const; 00108 virtual DataProcessor2D* generate(std::vector<AtomicBlock2D*> atomicBlocks) const; 00109 virtual BoxProcessorGenerator2D* clone() const; 00110 virtual void serialize(Box2D& domain, std::string& data) const; 00111 virtual int getStaticId() const; 00112 private: 00113 BoxProcessingFunctional2D* functional; 00114 }; 00115 00116 00118 template<typename T, template<typename U> class Descriptor> 00119 struct BoxProcessingFunctional2D_L : public BoxProcessingFunctional2D { 00120 virtual void process(Box2D domain, BlockLattice2D<T,Descriptor>& lattice) =0; 00122 virtual void processGenericBlocks(Box2D domain, std::vector<AtomicBlock2D*> atomicBlocks); 00123 }; 00124 00126 template<typename T, template<typename U> class Descriptor> 00127 struct MaskedBoxProcessingFunctional2D_L : public BoxProcessingFunctional2D { 00128 virtual void process(Box2D domain, 00129 BlockLattice2D<T,Descriptor>& lattice, 00130 NTensorField2D<int>& mask) =0; 00132 virtual void processGenericBlocks(Box2D domain, std::vector<AtomicBlock2D*> atomicBlocks); 00133 }; 00134 00136 template<typename T> 00137 struct BoxProcessingFunctional2D_S : public BoxProcessingFunctional2D { 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 BoxProcessingFunctional2D_T : public BoxProcessingFunctional2D { 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 BoxProcessingFunctional2D_N : public BoxProcessingFunctional2D { 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 MaskedBoxProcessingFunctional2D_N : public BoxProcessingFunctional2D { 00162 virtual void process(Box2D domain, NTensorField2D<T>& field, NTensorField2D<int>& mask) =0; 00164 virtual void processGenericBlocks(Box2D domain, std::vector<AtomicBlock2D*> atomicBlocks); 00165 }; 00166 00168 template<typename T1, template<typename U1> class Descriptor1, 00169 typename T2, template<typename U2> class Descriptor2> 00170 struct BoxProcessingFunctional2D_LL : public BoxProcessingFunctional2D { 00171 virtual void process(Box2D domain, BlockLattice2D<T1,Descriptor1>& lattice1, 00172 BlockLattice2D<T2,Descriptor2>& lattice2) =0; 00174 virtual void processGenericBlocks(Box2D domain, std::vector<AtomicBlock2D*> atomicBlocks); 00175 }; 00176 00178 template<typename T1, typename T2> 00179 struct BoxProcessingFunctional2D_SS : public BoxProcessingFunctional2D { 00180 virtual void process(Box2D domain, ScalarField2D<T1>& field1, 00181 ScalarField2D<T2>& field2) =0; 00183 virtual void processGenericBlocks(Box2D domain, std::vector<AtomicBlock2D*> atomicBlocks); 00184 }; 00185 00187 template<typename T1, int nDim1, 00188 typename T2, int nDim2> 00189 struct BoxProcessingFunctional2D_TT : public BoxProcessingFunctional2D { 00190 virtual void process(Box2D domain, TensorField2D<T1,nDim1>& field1, 00191 TensorField2D<T2,nDim2>& field2) =0; 00193 virtual void processGenericBlocks(Box2D domain, std::vector<AtomicBlock2D*> atomicBlocks); 00194 }; 00195 00197 template<typename T1, typename T2, int nDim> 00198 struct BoxProcessingFunctional2D_ST : public BoxProcessingFunctional2D { 00199 virtual void process(Box2D domain, ScalarField2D<T1>& field1, 00200 TensorField2D<T2,nDim>& field2) =0; 00202 virtual void processGenericBlocks(Box2D domain, std::vector<AtomicBlock2D*> atomicBlocks); 00203 }; 00204 00206 template<typename T1, typename T2> 00207 struct BoxProcessingFunctional2D_NN : public BoxProcessingFunctional2D { 00208 virtual void process(Box2D domain, NTensorField2D<T1>& field1, 00209 NTensorField2D<T2>& field2) =0; 00211 virtual void processGenericBlocks(Box2D domain, std::vector<AtomicBlock2D*> atomicBlocks); 00212 }; 00213 00215 template<typename T1, typename T2> 00216 struct MaskedBoxProcessingFunctional2D_NN : public BoxProcessingFunctional2D { 00217 virtual void process(Box2D domain, NTensorField2D<T1>& field1, 00218 NTensorField2D<T2>& field2, 00219 NTensorField2D<int>& mask) =0; 00221 virtual void processGenericBlocks(Box2D domain, std::vector<AtomicBlock2D*> atomicBlocks); 00222 }; 00223 00225 template<typename T1, typename T2> 00226 struct BoxProcessingFunctional2D_SN : public BoxProcessingFunctional2D { 00227 virtual void process(Box2D domain, ScalarField2D<T1>& field1, 00228 NTensorField2D<T2>& field2) =0; 00230 virtual void processGenericBlocks(Box2D domain, std::vector<AtomicBlock2D*> atomicBlocks); 00231 }; 00232 00234 template<typename T1, template<typename U> class Descriptor, typename T2> 00235 struct BoxProcessingFunctional2D_LS : public BoxProcessingFunctional2D { 00236 virtual void process(Box2D domain, BlockLattice2D<T1,Descriptor>& lattice, 00237 ScalarField2D<T2>& field) =0; 00239 virtual void processGenericBlocks(Box2D domain, std::vector<AtomicBlock2D*> atomicBlocks); 00240 }; 00241 00243 template<typename T1, template<typename U> class Descriptor, 00244 typename T2, int nDim> 00245 struct BoxProcessingFunctional2D_LT : public BoxProcessingFunctional2D { 00246 virtual void process(Box2D domain, BlockLattice2D<T1,Descriptor>& lattice, 00247 TensorField2D<T2,nDim>& field) =0; 00249 virtual void processGenericBlocks(Box2D domain, std::vector<AtomicBlock2D*> atomicBlocks); 00250 }; 00251 00253 template<typename T1, template<typename U> class Descriptor, typename T2> 00254 struct BoxProcessingFunctional2D_LN : public BoxProcessingFunctional2D { 00255 virtual void process(Box2D domain, BlockLattice2D<T1,Descriptor>& lattice, 00256 NTensorField2D<T2>& field) =0; 00258 virtual void processGenericBlocks(Box2D domain, std::vector<AtomicBlock2D*> atomicBlocks); 00259 }; 00260 00262 template<typename T1, template<typename U> class Descriptor, typename T2> 00263 struct MaskedBoxProcessingFunctional2D_LN : public BoxProcessingFunctional2D { 00264 virtual void process(Box2D domain, BlockLattice2D<T1,Descriptor>& lattice, 00265 NTensorField2D<T2>& field, 00266 NTensorField2D<int>& mask) =0; 00268 virtual void processGenericBlocks(Box2D domain, std::vector<AtomicBlock2D*> atomicBlocks); 00269 }; 00270 00272 template<typename T, template<typename U> class Descriptor> 00273 struct LatticeBoxProcessingFunctional2D : public BoxProcessingFunctional2D { 00274 virtual void process(Box2D domain, std::vector<BlockLattice2D<T,Descriptor>*> lattices) =0; 00276 virtual void processGenericBlocks(Box2D domain, std::vector<AtomicBlock2D*> atomicBlocks); 00277 }; 00278 00280 template<typename T> 00281 struct ScalarFieldBoxProcessingFunctional2D : public BoxProcessingFunctional2D { 00282 virtual void process(Box2D domain, std::vector<ScalarField2D<T>*> scalarFields) =0; 00284 virtual void processGenericBlocks( Box2D domain, 00285 std::vector<AtomicBlock2D*> atomicBlocks ); 00286 }; 00287 00289 template<typename T, int nDim> 00290 struct TensorFieldBoxProcessingFunctional2D : public BoxProcessingFunctional2D { 00291 virtual void process(Box2D domain, std::vector<TensorField2D<T,nDim>*> tensorFields) =0; 00293 virtual void processGenericBlocks( Box2D domain, 00294 std::vector<AtomicBlock2D*> atomicBlocks ); 00295 }; 00296 00298 template<typename T> 00299 struct NTensorFieldBoxProcessingFunctional2D : public BoxProcessingFunctional2D { 00300 virtual void process(Box2D domain, std::vector<NTensorField2D<T>*> tensorFields) =0; 00302 virtual void processGenericBlocks( Box2D domain, 00303 std::vector<AtomicBlock2D*> atomicBlocks ); 00304 }; 00305 00307 template<typename T> 00308 struct MaskedNTensorFieldBoxProcessingFunctional2D : public BoxProcessingFunctional2D { 00309 virtual void process( Box2D domain, 00310 std::vector<NTensorField2D<T>*> tensorFields, 00311 NTensorField2D<int>& mask ) =0; 00313 virtual void processGenericBlocks( Box2D domain, 00314 std::vector<AtomicBlock2D*> atomicBlocks ); 00315 }; 00316 00317 00318 /* *************** All flavors of Dot processing functionals ********* */ 00319 00321 struct DotProcessingFunctional2D { 00322 virtual ~DotProcessingFunctional2D() { } 00323 virtual void processGenericBlocks( DotList2D const& dotList, 00324 std::vector<AtomicBlock2D*> atomicBlocks ) =0; 00325 virtual BlockDomain::DomainT appliesTo() const; 00327 virtual void rescale(double dxScale, double dtScale); 00328 virtual void setscale(int dxScale, int dtScale); 00330 virtual void getModificationPattern(std::vector<bool>& isWritten) const; 00331 virtual void getTypeOfModification(std::vector<modif::ModifT>& modified) const =0; 00332 virtual DotProcessingFunctional2D* clone() const =0; 00333 }; 00334 00336 class DotProcessor2D : public DataProcessor2D { 00337 public: 00338 DotProcessor2D(DotProcessingFunctional2D* functional_, 00339 DotList2D const& dotList_, std::vector<AtomicBlock2D*> atomicBlocks_); 00340 DotProcessor2D(DotProcessor2D const& rhs); 00341 DotProcessor2D& operator=(DotProcessor2D const& rhs); 00342 ~DotProcessor2D(); 00343 virtual void process(); 00344 virtual DotProcessor2D* clone() const; 00345 DotList2D const& getDotList() const; 00346 private: 00347 DotProcessingFunctional2D* functional; 00348 DotList2D dotList; 00349 std::vector<AtomicBlock2D*> atomicBlocks; 00350 }; 00351 00353 class DotProcessorGenerator2D : public DottedDataProcessorGenerator2D { 00354 public: 00355 DotProcessorGenerator2D(DotProcessingFunctional2D* functional_, 00356 DotList2D const& dotList); 00357 ~DotProcessorGenerator2D(); 00358 DotProcessorGenerator2D(DotProcessorGenerator2D const& rhs); 00359 DotProcessorGenerator2D& operator=(DotProcessorGenerator2D const& rhs); 00360 virtual BlockDomain::DomainT appliesTo() const; 00362 virtual void rescale(double dxScale, double dtScale); 00363 virtual void setscale(int dxScale, int dtScale); 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) const; 00367 virtual DotProcessorGenerator2D* clone() const; 00368 private: 00369 DotProcessingFunctional2D* functional; 00370 }; 00371 00373 template<typename T, template<typename U> class Descriptor> 00374 struct DotProcessingFunctional2D_L : public DotProcessingFunctional2D { 00375 virtual void process(DotList2D const& dotList, BlockLattice2D<T,Descriptor>& lattice) =0; 00377 virtual void processGenericBlocks(DotList2D const& dotList, std::vector<AtomicBlock2D*> atomicBlocks); 00378 }; 00379 00381 template<typename T> 00382 struct DotProcessingFunctional2D_S : public DotProcessingFunctional2D { 00383 virtual void process(DotList2D const& dotList, ScalarField2D<T>& field) =0; 00385 virtual void processGenericBlocks( DotList2D const& dotList, 00386 std::vector<AtomicBlock2D*> atomicBlocks ); 00387 }; 00388 00390 template<typename T, int nDim> 00391 struct DotProcessingFunctional2D_T : public DotProcessingFunctional2D { 00392 virtual void process(DotList2D const& dotList, TensorField2D<T,nDim>& field) =0; 00394 virtual void processGenericBlocks( DotList2D const& dotList, 00395 std::vector<AtomicBlock2D*> atomicBlocks ); 00396 }; 00397 00399 template<typename T> 00400 struct DotProcessingFunctional2D_N : public DotProcessingFunctional2D { 00401 virtual void process(DotList2D const& dotList, NTensorField2D<T>& field) =0; 00403 virtual void processGenericBlocks( DotList2D const& dotList, 00404 std::vector<AtomicBlock2D*> atomicBlocks ); 00405 }; 00406 00408 template<typename T1, template<typename U1> class Descriptor1, 00409 typename T2, template<typename U2> class Descriptor2> 00410 struct DotProcessingFunctional2D_LL : public DotProcessingFunctional2D { 00411 virtual void process(DotList2D const& dotList, 00412 BlockLattice2D<T1,Descriptor1>& lattice1, 00413 BlockLattice2D<T2,Descriptor2>& lattice2) =0; 00415 virtual void processGenericBlocks( DotList2D const& dotList, 00416 std::vector<AtomicBlock2D*> atomicBlocks ); 00417 }; 00418 00420 template<typename T1, typename T2> 00421 struct DotProcessingFunctional2D_SS : public DotProcessingFunctional2D { 00422 virtual void process(DotList2D const& dotList, ScalarField2D<T1>& field1, 00423 ScalarField2D<T2>& field2) =0; 00425 virtual void processGenericBlocks( DotList2D const& dotList, 00426 std::vector<AtomicBlock2D*> atomicBlocks ); 00427 }; 00428 00430 template<typename T1, int nDim1, typename T2, int nDim2> 00431 struct DotProcessingFunctional2D_TT : public DotProcessingFunctional2D { 00432 virtual void process(DotList2D const& dotList, 00433 TensorField2D<T1,nDim1>& field1, 00434 TensorField2D<T2,nDim2>& field2) =0; 00436 virtual void processGenericBlocks( DotList2D const& dotList, 00437 std::vector<AtomicBlock2D*> atomicBlocks ); 00438 }; 00439 00441 template<typename T1, typename T2, int nDim> 00442 struct DotProcessingFunctional2D_ST : public DotProcessingFunctional2D { 00443 virtual void process(DotList2D const& dotList, 00444 ScalarField2D<T1>& field1, 00445 TensorField2D<T2,nDim>& field2) =0; 00447 virtual void processGenericBlocks( DotList2D const& dotList, 00448 std::vector<AtomicBlock2D*> atomicBlocks ); 00449 }; 00450 00452 template<typename T1, typename T2> 00453 struct DotProcessingFunctional2D_NN : public DotProcessingFunctional2D { 00454 virtual void process(DotList2D const& dotList, 00455 NTensorField2D<T1>& field1, 00456 NTensorField2D<T2>& field2) =0; 00458 virtual void processGenericBlocks( DotList2D const& dotList, 00459 std::vector<AtomicBlock2D*> atomicBlocks ); 00460 }; 00461 00463 template<typename T1, typename T2> 00464 struct DotProcessingFunctional2D_SN : public DotProcessingFunctional2D { 00465 virtual void process(DotList2D const& dotList, 00466 ScalarField2D<T1>& field1, 00467 NTensorField2D<T2>& field2) =0; 00469 virtual void processGenericBlocks( DotList2D const& dotList, 00470 std::vector<AtomicBlock2D*> atomicBlocks ); 00471 }; 00472 00474 template<typename T1, template<typename U> class Descriptor, typename T2> 00475 struct DotProcessingFunctional2D_LS : public DotProcessingFunctional2D { 00476 virtual void process(DotList2D const& dotList, 00477 BlockLattice2D<T1,Descriptor>& lattice, 00478 ScalarField2D<T2>& field) =0; 00480 virtual void processGenericBlocks( DotList2D const& dotList, 00481 std::vector<AtomicBlock2D*> atomicBlocks ); 00482 }; 00483 00485 template<typename T1, template<typename U> class Descriptor, 00486 typename T2, int nDim> 00487 struct DotProcessingFunctional2D_LT : public DotProcessingFunctional2D { 00488 virtual void process(DotList2D const& dotList, 00489 BlockLattice2D<T1,Descriptor>& lattice, 00490 TensorField2D<T2,nDim>& field) =0; 00492 virtual void processGenericBlocks( DotList2D const& dotList, 00493 std::vector<AtomicBlock2D*> atomicBlocks ); 00494 }; 00495 00497 template<typename T1, template<typename U> class Descriptor, typename T2> 00498 struct DotProcessingFunctional2D_LN : public DotProcessingFunctional2D { 00499 virtual void process(DotList2D const& dotList, 00500 BlockLattice2D<T1,Descriptor>& lattice, 00501 NTensorField2D<T2>& field) =0; 00503 virtual void processGenericBlocks( DotList2D const& dotList, 00504 std::vector<AtomicBlock2D*> atomicBlocks ); 00505 }; 00506 00508 template<typename T, template<typename U> class Descriptor> 00509 struct LatticeDotProcessingFunctional2D : public DotProcessingFunctional2D { 00510 virtual void process(DotList2D const& dotList, std::vector<BlockLattice2D<T,Descriptor>*> lattices) =0; 00512 virtual void processGenericBlocks( DotList2D const& dotList, 00513 std::vector<AtomicBlock2D*> atomicBlocks ); 00514 }; 00515 00517 template<typename T> 00518 struct ScalarFieldDotProcessingFunctional2D : public DotProcessingFunctional2D { 00519 virtual void process(DotList2D const& dotList, std::vector<ScalarField2D<T>*> scalarFields) =0; 00521 virtual void processGenericBlocks( DotList2D const& dotList, 00522 std::vector<AtomicBlock2D*> atomicBlocks ); 00523 }; 00524 00526 template<typename T, int nDim> 00527 struct TensorFieldDotProcessingFunctional2D : public DotProcessingFunctional2D { 00528 virtual void process(DotList2D const& dotList, std::vector<TensorField2D<T,nDim>*> tensorFields) =0; 00530 virtual void processGenericBlocks( DotList2D const& dotList, 00531 std::vector<AtomicBlock2D*> atomicBlocks ); 00532 }; 00533 00535 template<typename T> 00536 struct NTensorFieldDotProcessingFunctional2D : public DotProcessingFunctional2D { 00537 virtual void process(DotList2D const& dotList, std::vector<NTensorField2D<T>*> tensorFields) =0; 00539 virtual void processGenericBlocks( DotList2D const& dotList, 00540 std::vector<AtomicBlock2D*> atomicBlocks ); 00541 }; 00542 00543 00544 /* *************** All flavors of Bounded Box processing functionals ********* */ 00545 00547 class BoundedBoxProcessingFunctional2D { 00548 public: 00549 BoundedBoxProcessingFunctional2D(); 00550 virtual ~BoundedBoxProcessingFunctional2D() { } 00551 virtual void processBulkGeneric(Box2D domain, std::vector<AtomicBlock2D*> atomicBlocks) =0; 00552 virtual void processEdgeGeneric( int direction, int orientation, Box2D domain, 00553 std::vector<AtomicBlock2D*> atomicBlocks ) =0; 00554 virtual void processCornerGeneric( int normalX, int normalY, Box2D domain, 00555 std::vector<AtomicBlock2D*> atomicBlocks ) =0; 00556 virtual BlockDomain::DomainT appliesTo() const; 00558 virtual void rescale(double dxScale, double dtScale); 00559 virtual void setscale(int dxScale_, int dtScale_); 00561 virtual void getModificationPattern(std::vector<bool>& isWritten) const; 00562 virtual void getTypeOfModification(std::vector<modif::ModifT>& modified) const =0; 00563 virtual BoundedBoxProcessingFunctional2D* clone() const =0; 00564 BoxProcessingFunctional2D* getBulkProcessor() const; 00565 BoxProcessingFunctional2D* getEdgeProcessor(int direction, int orientation) const; 00566 BoxProcessingFunctional2D* getCornerProcessor(int normalX, int normalY) const; 00567 void getGenerators ( 00568 Box2D const& fullDomain, plint boundaryWidth_, 00569 std::vector<BoxProcessorGenerator2D*>& generators ); 00570 int getDxScale() const; 00571 int getDtScale() const; 00572 private: 00573 int dxScale, dtScale; 00574 public: 00575 class BulkWrapperFunctional : public BoxProcessingFunctional2D { 00576 public: 00577 BulkWrapperFunctional(BoundedBoxProcessingFunctional2D* boundedFunctional_); 00578 BulkWrapperFunctional(BulkWrapperFunctional const& rhs); 00579 ~BulkWrapperFunctional(); 00580 BulkWrapperFunctional& operator=(BulkWrapperFunctional const& rhs); 00581 virtual void processGenericBlocks(Box2D domain, 00582 std::vector<AtomicBlock2D*> atomicBlocks); 00583 virtual BlockDomain::DomainT appliesTo() const; 00585 virtual void rescale(double dxScale, double dtScale); 00586 virtual void setscale(int dxScale_, int dtScale_); 00587 virtual void getModificationPattern(std::vector<bool>& isWritten) const; 00588 virtual void getTypeOfModification(std::vector<modif::ModifT>& modified) const; 00589 virtual BulkWrapperFunctional* clone() const; 00590 private: 00591 BoundedBoxProcessingFunctional2D* boundedFunctional; 00592 }; 00593 class EdgeWrapperFunctional : public BoxProcessingFunctional2D { 00594 public: 00595 EdgeWrapperFunctional(BoundedBoxProcessingFunctional2D* boundedFunctional_, 00596 int direction_, int orientation_); 00597 EdgeWrapperFunctional(EdgeWrapperFunctional const& rhs); 00598 ~EdgeWrapperFunctional(); 00599 EdgeWrapperFunctional& operator=(EdgeWrapperFunctional const& rhs); 00600 virtual void processGenericBlocks(Box2D domain, 00601 std::vector<AtomicBlock2D*> atomicBlocks); 00602 virtual BlockDomain::DomainT appliesTo() const; 00604 virtual void rescale(double dxScale, double dtScale); 00605 virtual void setscale(int dxScale_, int dtScale_); 00606 virtual void getModificationPattern(std::vector<bool>& isWritten) const; 00607 virtual void getTypeOfModification(std::vector<modif::ModifT>& modified) const; 00608 virtual EdgeWrapperFunctional* clone() const; 00609 private: 00610 BoundedBoxProcessingFunctional2D* boundedFunctional; 00611 int direction, orientation; 00612 }; 00613 class CornerWrapperFunctional : public BoxProcessingFunctional2D { 00614 public: 00615 CornerWrapperFunctional(BoundedBoxProcessingFunctional2D* boundedFunctional_, 00616 int normalX_, int normalY_); 00617 CornerWrapperFunctional(CornerWrapperFunctional const& rhs); 00618 ~CornerWrapperFunctional(); 00619 CornerWrapperFunctional& operator=(CornerWrapperFunctional const& rhs); 00620 virtual void processGenericBlocks(Box2D domain, 00621 std::vector<AtomicBlock2D*> atomicBlocks); 00622 virtual BlockDomain::DomainT appliesTo() const; 00624 virtual void rescale(double dxScale, double dtScale); 00625 virtual void setscale(int dxScale_, int dtScale_); 00626 virtual void getModificationPattern(std::vector<bool>& isWritten) const; 00627 virtual void getTypeOfModification(std::vector<modif::ModifT>& modified) const; 00628 virtual CornerWrapperFunctional* clone() const; 00629 private: 00630 BoundedBoxProcessingFunctional2D* boundedFunctional; 00631 int normalX, normalY; 00632 }; 00633 }; 00634 00636 template<typename T, template<typename U> class Descriptor> 00637 struct BoundedBoxProcessingFunctional2D_L : public BoundedBoxProcessingFunctional2D { 00638 virtual void processBulkGeneric(Box2D domain, 00639 std::vector<AtomicBlock2D*> atomicBlocks); 00640 virtual void processEdgeGeneric( int direction, int orientation, Box2D domain, 00641 std::vector<AtomicBlock2D*> atomicBlocks ); 00642 virtual void processCornerGeneric( int normalX, int normalY, Box2D domain, 00643 std::vector<AtomicBlock2D*> atomicBlocks ); 00644 00645 virtual void processBulk(Box2D domain, BlockLattice2D<T,Descriptor>& lattice) =0; 00646 virtual void processEdge( int direction, int orientation, Box2D domain, 00647 BlockLattice2D<T,Descriptor>& lattice ) =0; 00648 virtual void processCorner( int normalX, int normalY, Box2D domain, 00649 BlockLattice2D<T,Descriptor>& lattice ) =0; 00650 }; 00651 00653 template<typename T> 00654 struct BoundedBoxProcessingFunctional2D_S : public BoundedBoxProcessingFunctional2D { 00655 virtual void processBulkGeneric(Box2D domain, 00656 std::vector<AtomicBlock2D*> atomicBlocks); 00657 virtual void processEdgeGeneric( int direction, int orientation, Box2D domain, 00658 std::vector<AtomicBlock2D*> atomicBlocks ); 00659 virtual void processCornerGeneric( int normalX, int normalY, Box2D domain, 00660 std::vector<AtomicBlock2D*> atomicBlocks ); 00661 00662 virtual void processBulk(Box2D domain, ScalarField2D<T>& field) =0; 00663 virtual void processEdge( int direction, int orientation, Box2D domain, 00664 ScalarField2D<T>& field ) =0; 00665 virtual void processCorner( int normalX, int normalY, Box2D domain, 00666 ScalarField2D<T>& field ) =0; 00667 }; 00668 00670 template<typename T, int nDim> 00671 struct BoundedBoxProcessingFunctional2D_T : public BoundedBoxProcessingFunctional2D { 00672 virtual void processBulkGeneric(Box2D domain, 00673 std::vector<AtomicBlock2D*> atomicBlocks); 00674 virtual void processEdgeGeneric( int direction, int orientation, Box2D domain, 00675 std::vector<AtomicBlock2D*> atomicBlocks ); 00676 virtual void processCornerGeneric( int normalX, int normalY, Box2D domain, 00677 std::vector<AtomicBlock2D*> atomicBlocks ); 00678 00679 virtual void processBulk(Box2D domain, TensorField2D<T,nDim>& lattice) =0; 00680 virtual void processEdge( int direction, int orientation, Box2D domain, 00681 TensorField2D<T,nDim>& lattice ) =0; 00682 virtual void processCorner( int normalX, int normalY, Box2D domain, 00683 TensorField2D<T,nDim>& lattice ) =0; 00684 }; 00685 00687 template<typename T> 00688 struct BoundedBoxProcessingFunctional2D_N : public BoundedBoxProcessingFunctional2D { 00689 virtual void processBulkGeneric(Box2D domain, 00690 std::vector<AtomicBlock2D*> atomicBlocks); 00691 virtual void processEdgeGeneric( int direction, int orientation, Box2D domain, 00692 std::vector<AtomicBlock2D*> atomicBlocks ); 00693 virtual void processCornerGeneric( int normalX, int normalY, Box2D domain, 00694 std::vector<AtomicBlock2D*> atomicBlocks ); 00695 00696 virtual void processBulk(Box2D domain, NTensorField2D<T>& lattice) =0; 00697 virtual void processEdge( int direction, int orientation, Box2D domain, 00698 NTensorField2D<T>& lattice ) =0; 00699 virtual void processCorner( int normalX, int normalY, Box2D domain, 00700 NTensorField2D<T>& lattice ) =0; 00701 }; 00702 00704 template<typename T> 00705 struct BoundedMaskedBoxProcessingFunctional2D_N : public BoundedBoxProcessingFunctional2D { 00706 virtual void processBulkGeneric(Box2D domain, 00707 std::vector<AtomicBlock2D*> atomicBlocks); 00708 virtual void processEdgeGeneric( int direction, int orientation, Box2D domain, 00709 std::vector<AtomicBlock2D*> atomicBlocks ); 00710 virtual void processCornerGeneric( int normalX, int normalY, Box2D domain, 00711 std::vector<AtomicBlock2D*> atomicBlocks ); 00712 00713 virtual void processBulk(Box2D domain, NTensorField2D<T>& lattice, NTensorField2D<int>& mask) =0; 00714 virtual void processEdge( int direction, int orientation, Box2D domain, 00715 NTensorField2D<T>& lattice, NTensorField2D<int>& mask ) =0; 00716 virtual void processCorner( int normalX, int normalY, Box2D domain, 00717 NTensorField2D<T>& lattice, NTensorField2D<int>& mask ) =0; 00718 }; 00719 00721 template<typename T1, template<typename U1> class Descriptor1, 00722 typename T2, template<typename U2> class Descriptor2> 00723 struct BoundedBoxProcessingFunctional2D_LL : public BoundedBoxProcessingFunctional2D { 00724 virtual void processBulkGeneric(Box2D domain, std::vector<AtomicBlock2D*> atomicBlocks); 00725 virtual void processEdgeGeneric( int direction, int orientation, Box2D domain, 00726 std::vector<AtomicBlock2D*> atomicBlocks ); 00727 virtual void processCornerGeneric( int normalX, int normalY, Box2D domain, 00728 std::vector<AtomicBlock2D*> atomicBlocks ); 00729 00730 virtual void processBulk( Box2D domain, BlockLattice2D<T1,Descriptor1>& lattice1, 00731 BlockLattice2D<T2,Descriptor2>& lattice2 ) =0; 00732 virtual void processEdge( int direction, int orientation, Box2D domain, 00733 BlockLattice2D<T1,Descriptor1>& lattice1, 00734 BlockLattice2D<T2,Descriptor2>& lattice2 ) =0; 00735 virtual void processCorner( int normalX, int normalY, Box2D domain, 00736 BlockLattice2D<T1,Descriptor1>& lattice1, 00737 BlockLattice2D<T2,Descriptor2>& lattice2 ) =0; 00738 }; 00739 00742 template<typename T1, typename T2> 00743 struct BoundedBoxProcessingFunctional2D_SS : public BoundedBoxProcessingFunctional2D { 00744 virtual void processBulkGeneric( Box2D domain, 00745 std::vector<AtomicBlock2D*> atomicBlocks ); 00746 virtual void processEdgeGeneric( int direction, int orientation, Box2D domain, 00747 std::vector<AtomicBlock2D*> atomicBlocks ); 00748 virtual void processCornerGeneric( int normalX, int normalY, Box2D domain, 00749 std::vector<AtomicBlock2D*> atomicBlocks ); 00750 00751 virtual void processBulk( Box2D domain, ScalarField2D<T1>& field1, 00752 ScalarField2D<T2>& field2 ) =0; 00753 virtual void processEdge( int direction, int orientation, Box2D domain, 00754 ScalarField2D<T1>& field1, 00755 ScalarField2D<T2>& field2 ) =0; 00756 virtual void processCorner( int normalX, int normalY, Box2D domain, 00757 ScalarField2D<T1>& field1, 00758 ScalarField2D<T2>& field2 ) =0; 00759 }; 00760 00763 template<typename T1, int nDim1, typename T2, int nDim2> 00764 struct BoundedBoxProcessingFunctional2D_TT : public BoundedBoxProcessingFunctional2D { 00765 virtual void processBulkGeneric(Box2D domain, 00766 std::vector<AtomicBlock2D*> atomicBlocks); 00767 virtual void processEdgeGeneric( int direction, int orientation, Box2D domain, 00768 std::vector<AtomicBlock2D*> atomicBlocks ); 00769 virtual void processCornerGeneric( int normalX, int normalY, Box2D domain, 00770 std::vector<AtomicBlock2D*> atomicBlocks ); 00771 00772 virtual void processBulk( Box2D domain, TensorField2D<T1,nDim1>& field1, 00773 TensorField2D<T2,nDim2>& field2 ) =0; 00774 virtual void processEdge( int direction, int orientation, Box2D domain, 00775 TensorField2D<T1,nDim1>& field1, 00776 TensorField2D<T2,nDim2>& field2 ) =0; 00777 virtual void processCorner( int normalX, int normalY, Box2D domain, 00778 TensorField2D<T1,nDim1>& field1, 00779 TensorField2D<T2,nDim2>& field2 ) =0; 00780 }; 00781 00784 template<typename T1, typename T2, int nDim> 00785 struct BoundedBoxProcessingFunctional2D_ST : public BoundedBoxProcessingFunctional2D { 00786 virtual void processBulkGeneric( Box2D domain, 00787 std::vector<AtomicBlock2D*> atomicBlocks ); 00788 virtual void processEdgeGeneric( int direction, int orientation, Box2D domain, 00789 std::vector<AtomicBlock2D*> atomicBlocks ); 00790 virtual void processCornerGeneric( int normalX, int normalY, Box2D domain, 00791 std::vector<AtomicBlock2D*> atomicBlocks ); 00792 00793 virtual void processBulk( Box2D domain, ScalarField2D<T1>& field1, 00794 TensorField2D<T2,nDim>& field2 ) =0; 00795 virtual void processEdge( int direction, int orientation, Box2D domain, 00796 ScalarField2D<T1>& field1, 00797 TensorField2D<T2,nDim>& field2 ) =0; 00798 virtual void processCorner( int normalX, int normalY, Box2D domain, 00799 ScalarField2D<T1>& field1, 00800 TensorField2D<T2,nDim>& field2 ) =0; 00801 }; 00802 00805 template<typename T1, typename T2> 00806 struct BoundedBoxProcessingFunctional2D_NN : public BoundedBoxProcessingFunctional2D { 00807 virtual void processBulkGeneric(Box2D domain, 00808 std::vector<AtomicBlock2D*> atomicBlocks); 00809 virtual void processEdgeGeneric( int direction, int orientation, Box2D domain, 00810 std::vector<AtomicBlock2D*> atomicBlocks ); 00811 virtual void processCornerGeneric( int normalX, int normalY, Box2D domain, 00812 std::vector<AtomicBlock2D*> atomicBlocks ); 00813 00814 virtual void processBulk( Box2D domain, NTensorField2D<T1>& field1, 00815 NTensorField2D<T2>& field2 ) =0; 00816 virtual void processEdge( int direction, int orientation, Box2D domain, 00817 NTensorField2D<T1>& field1, 00818 NTensorField2D<T2>& field2 ) =0; 00819 virtual void processCorner( int normalX, int normalY, Box2D domain, 00820 NTensorField2D<T1>& field1, 00821 NTensorField2D<T2>& field2 ) =0; 00822 }; 00823 00826 template<typename T1, typename T2> 00827 struct BoundedMaskedBoxProcessingFunctional2D_NN : public BoundedBoxProcessingFunctional2D { 00828 virtual void processBulkGeneric(Box2D domain, 00829 std::vector<AtomicBlock2D*> atomicBlocks); 00830 virtual void processEdgeGeneric( int direction, int orientation, Box2D domain, 00831 std::vector<AtomicBlock2D*> atomicBlocks ); 00832 virtual void processCornerGeneric( int normalX, int normalY, Box2D domain, 00833 std::vector<AtomicBlock2D*> atomicBlocks ); 00834 00835 virtual void processBulk( Box2D domain, NTensorField2D<T1>& field1, 00836 NTensorField2D<T2>& field2, 00837 NTensorField2D<int>& mask) =0; 00838 virtual void processEdge( int direction, int orientation, Box2D domain, 00839 NTensorField2D<T1>& field1, 00840 NTensorField2D<T2>& field2, 00841 NTensorField2D<int>& mask) =0; 00842 virtual void processCorner( int normalX, int normalY, Box2D domain, 00843 NTensorField2D<T1>& field1, 00844 NTensorField2D<T2>& field2, 00845 NTensorField2D<int>& mask) =0; 00846 }; 00847 00850 template<typename T1, typename T2> 00851 struct BoundedBoxProcessingFunctional2D_SN : public BoundedBoxProcessingFunctional2D { 00852 virtual void processBulkGeneric( Box2D domain, 00853 std::vector<AtomicBlock2D*> atomicBlocks ); 00854 virtual void processEdgeGeneric( int direction, int orientation, Box2D domain, 00855 std::vector<AtomicBlock2D*> atomicBlocks ); 00856 virtual void processCornerGeneric( int normalX, int normalY, Box2D domain, 00857 std::vector<AtomicBlock2D*> atomicBlocks ); 00858 00859 virtual void processBulk( Box2D domain, ScalarField2D<T1>& field1, 00860 NTensorField2D<T2>& field2 ) =0; 00861 virtual void processEdge( int direction, int orientation, Box2D domain, 00862 ScalarField2D<T1>& field1, 00863 NTensorField2D<T2>& field2 ) =0; 00864 virtual void processCorner( int normalX, int normalY, Box2D domain, 00865 ScalarField2D<T1>& field1, 00866 NTensorField2D<T2>& field2 ) =0; 00867 }; 00868 00870 template<typename T1, template<typename U> class Descriptor, typename T2> 00871 struct BoundedBoxProcessingFunctional2D_LS : public BoundedBoxProcessingFunctional2D { 00872 virtual void processBulkGeneric(Box2D domain, std::vector<AtomicBlock2D*> atomicBlocks); 00873 virtual void processEdgeGeneric( int direction, int orientation, Box2D domain, 00874 std::vector<AtomicBlock2D*> atomicBlocks ); 00875 virtual void processCornerGeneric( int normalX, int normalY, Box2D domain, 00876 std::vector<AtomicBlock2D*> atomicBlocks ); 00877 00878 virtual void processBulk( Box2D domain, BlockLattice2D<T1,Descriptor>& lattice, 00879 ScalarField2D<T2>& field ) =0; 00880 virtual void processEdge( int direction, int orientation, Box2D domain, 00881 BlockLattice2D<T1,Descriptor>& lattice, 00882 ScalarField2D<T2>& field ) =0; 00883 virtual void processCorner( int normalX, int normalY, Box2D domain, 00884 BlockLattice2D<T1,Descriptor>& lattice, 00885 ScalarField2D<T2>& field ) =0; 00886 }; 00887 00889 template<typename T1, template<typename U> class Descriptor, 00890 typename T2, int nDim> 00891 struct BoundedBoxProcessingFunctional2D_LT : public BoundedBoxProcessingFunctional2D { 00892 virtual void processBulkGeneric( Box2D domain, 00893 std::vector<AtomicBlock2D*> atomicBlocks ); 00894 virtual void processEdgeGeneric( int direction, int orientation, Box2D domain, 00895 std::vector<AtomicBlock2D*> atomicBlocks ); 00896 virtual void processCornerGeneric( int normalX, int normalY, Box2D domain, 00897 std::vector<AtomicBlock2D*> atomicBlocks ); 00898 00899 virtual void processBulk( Box2D domain, BlockLattice2D<T1,Descriptor>& lattice, 00900 TensorField2D<T2,nDim>& field ) =0; 00901 virtual void processEdge( int direction, int orientation, Box2D domain, 00902 BlockLattice2D<T1,Descriptor>& lattice, 00903 TensorField2D<T2,nDim>& field ) =0; 00904 virtual void processCorner( int normalX, int normalY, Box2D domain, 00905 BlockLattice2D<T1,Descriptor>& lattice, 00906 TensorField2D<T2,nDim>& field ) =0; 00907 }; 00908 00910 template<typename T1, template<typename U> class Descriptor, typename T2> 00911 struct BoundedBoxProcessingFunctional2D_LN : public BoundedBoxProcessingFunctional2D { 00912 virtual void processBulkGeneric( Box2D domain, 00913 std::vector<AtomicBlock2D*> atomicBlocks ); 00914 virtual void processEdgeGeneric( int direction, int orientation, Box2D domain, 00915 std::vector<AtomicBlock2D*> atomicBlocks ); 00916 virtual void processCornerGeneric( int normalX, int normalY, Box2D domain, 00917 std::vector<AtomicBlock2D*> atomicBlocks ); 00918 00919 virtual void processBulk( Box2D domain, BlockLattice2D<T1,Descriptor>& lattice, 00920 NTensorField2D<T2>& field ) =0; 00921 virtual void processEdge( int direction, int orientation, Box2D domain, 00922 BlockLattice2D<T1,Descriptor>& lattice, 00923 NTensorField2D<T2>& field ) =0; 00924 virtual void processCorner( int normalX, int normalY, Box2D domain, 00925 BlockLattice2D<T1,Descriptor>& lattice, 00926 NTensorField2D<T2>& field ) =0; 00927 }; 00928 00930 template<typename T1, template<typename U> class Descriptor, typename T2> 00931 struct BoundedMaskedBoxProcessingFunctional2D_LN : public BoundedBoxProcessingFunctional2D { 00932 virtual void processBulkGeneric( Box2D domain, 00933 std::vector<AtomicBlock2D*> atomicBlocks ); 00934 virtual void processEdgeGeneric( int direction, int orientation, Box2D domain, 00935 std::vector<AtomicBlock2D*> atomicBlocks ); 00936 virtual void processCornerGeneric( int normalX, int normalY, Box2D domain, 00937 std::vector<AtomicBlock2D*> atomicBlocks ); 00938 00939 virtual void processBulk( Box2D domain, BlockLattice2D<T1,Descriptor>& lattice, 00940 NTensorField2D<T2>& field, 00941 NTensorField2D<int>& mask) =0; 00942 virtual void processEdge( int direction, int orientation, Box2D domain, 00943 BlockLattice2D<T1,Descriptor>& lattice, 00944 NTensorField2D<T2>& field, 00945 NTensorField2D<int>& mask) =0; 00946 virtual void processCorner( int normalX, int normalY, Box2D domain, 00947 BlockLattice2D<T1,Descriptor>& lattice, 00948 NTensorField2D<T2>& field, 00949 NTensorField2D<int>& mask) =0; 00950 }; 00951 00953 template<typename T, template<typename U> class Descriptor> 00954 struct BoundedLatticeBoxProcessingFunctional2D 00955 : public BoundedBoxProcessingFunctional2D 00956 { 00957 virtual void processBulkGeneric( Box2D domain, 00958 std::vector<AtomicBlock2D*> atomicBlocks ); 00959 virtual void processEdgeGeneric( int direction, int orientation, Box2D domain, 00960 std::vector<AtomicBlock2D*> atomicBlocks ); 00961 virtual void processCornerGeneric( int normalX, int normalY, Box2D domain, 00962 std::vector<AtomicBlock2D*> atomicBlocks ); 00963 00964 virtual void processBulk( Box2D domain, 00965 std::vector<BlockLattice2D<T,Descriptor>*> lattices ) =0; 00966 virtual void processEdge( int direction, int orientation, Box2D domain, 00967 std::vector<BlockLattice2D<T,Descriptor>*> lattices ) =0; 00968 virtual void processCorner( int normalX, int normalY, Box2D domain, 00969 std::vector<BlockLattice2D<T,Descriptor>*> lattices ) =0; 00970 }; 00971 00973 template<typename T> 00974 struct BoundedScalarFieldBoxProcessingFunctional2D 00975 : public BoundedBoxProcessingFunctional2D 00976 { 00977 virtual void processBulkGeneric( Box2D domain, 00978 std::vector<AtomicBlock2D*> atomicBlocks ); 00979 virtual void processEdgeGeneric( int direction, int orientation, Box2D domain, 00980 std::vector<AtomicBlock2D*> atomicBlocks ); 00981 virtual void processCornerGeneric( int normalX, int normalY, Box2D domain, 00982 std::vector<AtomicBlock2D*> atomicBlocks ); 00983 00984 virtual void processBulk(Box2D domain, std::vector<ScalarField2D<T>*> field) =0; 00985 virtual void processEdge( int direction, int orientation, Box2D domain, 00986 std::vector<ScalarField2D<T>*> field ) =0; 00987 virtual void processCorner( int normalX, int normalY, Box2D domain, 00988 std::vector<ScalarField2D<T>*> field ) =0; 00989 }; 00990 00992 template<typename T, int nDim> 00993 struct BoundedTensorFieldBoxProcessingFunctional2D 00994 : public BoundedBoxProcessingFunctional2D 00995 { 00996 virtual void processBulkGeneric( Box2D domain, 00997 std::vector<AtomicBlock2D*> atomicBlocks ); 00998 virtual void processEdgeGeneric( int direction, int orientation, Box2D domain, 00999 std::vector<AtomicBlock2D*> atomicBlocks ); 01000 virtual void processCornerGeneric( int normalX, int normalY, Box2D domain, 01001 std::vector<AtomicBlock2D*> atomicBlocks ); 01002 01003 virtual void processBulk(Box2D domain, std::vector<TensorField2D<T,nDim>*> field) =0; 01004 virtual void processEdge( int direction, int orientation, Box2D domain, 01005 std::vector<TensorField2D<T,nDim>*> field ) =0; 01006 virtual void processCorner( int normalX, int normalY, Box2D domain, 01007 std::vector<TensorField2D<T,nDim>*> field ) =0; 01008 }; 01009 01011 template<typename T> 01012 struct BoundedNTensorFieldBoxProcessingFunctional2D 01013 : public BoundedBoxProcessingFunctional2D 01014 { 01015 virtual void processBulkGeneric( Box2D domain, 01016 std::vector<AtomicBlock2D*> atomicBlocks ); 01017 virtual void processEdgeGeneric( int direction, int orientation, Box2D domain, 01018 std::vector<AtomicBlock2D*> atomicBlocks ); 01019 virtual void processCornerGeneric( int normalX, int normalY, Box2D domain, 01020 std::vector<AtomicBlock2D*> atomicBlocks ); 01021 01022 virtual void processBulk(Box2D domain, std::vector<NTensorField2D<T>*> field) =0; 01023 virtual void processEdge( int direction, int orientation, Box2D domain, 01024 std::vector<NTensorField2D<T>*> field ) =0; 01025 virtual void processCorner( int normalX, int normalY, Box2D domain, 01026 std::vector<NTensorField2D<T>*> field ) =0; 01027 }; 01028 01029 } // namespace plb 01030 01031 #endif // DATA_PROCESSING_FUNCTIONAL_2D_H