Palabos  Version 1.0
dataProcessingFunctional2D.h
Go to the documentation of this file.
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